Skip to content

v1.58.0.0 feat: diagram + multi-format document engine (mermaid, excalidraw, single-file HTML, DOCX)#1990

Merged
garrytan merged 25 commits into
mainfrom
garrytan/excalidraw-diagram-skills
Jun 12, 2026
Merged

v1.58.0.0 feat: diagram + multi-format document engine (mermaid, excalidraw, single-file HTML, DOCX)#1990
garrytan merged 25 commits into
mainfrom
garrytan/excalidraw-diagram-skills

Conversation

@garrytan

Copy link
Copy Markdown
Owner

Summary

Diagram engine (offline, vector, editable)

  • lib/diagram-render/: vendored mermaid 11.12.2 + excalidraw 0.18.0 bundle (9.2MB single-file page, deterministic build, sha256 + source fingerprint in BUILD_INFO, drift tests, THIRD-PARTY-LICENSES). Loaded via browse load-html; big payloads ship through browse eval <file> (one spawn any size, Windows-safe).
  • make-pdf pre-pass (diagram-prepass.ts): column-0 mermaid/excalidraw fences render to inline vector SVG with the source preserved base64 in data-gstack-source; render failures produce a loud red diagnostic block; render=false/title=/page= fence options; reset contract reloads the bundle page after any render error.
  • /diagram skill: English → triplet (.mmd source, editable .excalidraw, SVG + PNG), base64 transport, content-addressed staging, per-call --tab-id pinning.

Image policy

  • Local images inline as data URIs with byte-probed dimensions (pure-TS PNG/JPEG/GIF/WebP/SVG sniffing); never truncate (global img cap); oversized rasters downscale to 300dpi at inline time; per-path memoization; {width=}/{page=} directives via a marked extension.
  • Conservative auto-landscape: wide small-text diagram-like blocks get their own vertically centered landscape page (CSS named pages + computed margin-top; preferCSSPageSize flips only when promoted).
  • Offline posture enforced: remote images blocked with a visible placeholder (not warned-and-kept); out-of-tree reads (incl. symlink, via realpath) warn; --strict hard-fails missing/remote/out-of-tree/oversized/non-regular images; reads bounded before reading (statSync, 64MB cap); browse shell-outs get a 120s timeout.

Multi-format output

  • --to pdf|html|docx: HTML = one self-contained file (zero network refs, screen layer); DOCX = content fidelity via html-to-docx@1.8.0 with diagrams as 300dpi PNGs + alt text, watermark stripped, print-only flags warned. TOC anchors resolve in every format.

Typography & layout

  • 12pt body, 26pt h1, 56pt poster cover + 13pt meta, 12pt TOC, larger code/tables; hyphenation off (clean copy-paste); 42em screen measure.

Hardening (review army + red team + Codex adversarial/structured, all findings fixed)

  • $-pattern replace injection killed at every substitution seam; indented fences replay byte-for-byte (list structure preserved); staged-bundle hash verification incl. rename-failure rehash; Windows drive-letter paths; per-side margins honored under preferCSSPageSize (Codex P2); NUL-byte memo cleanup; decodeURIComponent crash-proofing.

Infrastructure & tests

  • 68 new free-tier gates (fence extraction, image policy + negative landscape fixtures, format zip/no-network contracts, bundle drift incl. srcSha + font-stack guards); paid gate-tier /diagram triplet test + periodic authoring-quality judge wired into E2E_TIERS + coverage matrix; make-pdf-gate CI covers lib/diagram-render/** + drift test; bundle pinned to LF.
  • Fixed pre-existing operational-learning E2E failure (fixture missing lib/jsonl-store.ts beside bin scripts; reproduced on main at a5833c4).

Docs

  • README rows for /make-pdf + /diagram, make-pdf skill doc (fences/images/formats/strict), docs/howto-diagrams-and-formats.md, post-ship /document-release drift audit with cross-model doc review.

Test Coverage

Ship coverage audit: ~85% of traced branches/flows before gap-fill; the 2 HIGH + 3 MEDIUM gaps were filled on-branch (live downscale + chunked transport, D6.2 reset contract proven end-to-end, excalidraw fence through the binary, WebP probing, bundle path resolution). Tests: 189 free make-pdf tests (121 before, +68), 4 drift guards, 2 paid /diagram tests.

Coverage gate: PASS (85% ≥ 80% target, gaps filled after audit).

Pre-Landing Review

39 findings (9 critical) from 6 specialists + red team; ALL fixed on-branch (commits 9db479a3, f2a03d43, 91ba3753, 1d130e24, 26a7cab2). Highlights: indented-fence list corruption (red-team conf 9), String.replace $-pattern injection, offline-posture fetch-at-print hole, symlink confinement bypass, Windows argv/drive-letter issues, drift-test CI hole. One posture decision (out-of-tree image reads) resolved by user: warn by default, fatal under --strict.

PR Quality Score at finding time: 0/10 (9 criticals open) → all resolved; final suite green.

Design Review

Design Review (lite): 5 findings — 5 fixed (typography stragglers, stale comments, screen measure, doc-vs-code drift). AI Slop: clean.

Eval Results

Diff-based selection: diagram-triplet (gate) PASS ($0.17, 58s, valid triplet), diagram-authoring-quality (periodic) PASS (judge 9/10 after rubric fix). Full-suite run was SIGTERMed by the harness ~50min in with one failure: operational-learning — root-caused to a broken fixture (not model behavior), reproduced on main, FIXED on this branch (now passes). Codex structured review GATE: PASS (one P2, fixed). CI gate tier runs on this PR.

Scope Drift

Scope Check: CLEAN — delivered exactly the approved Approach B wedge; explicit deferrals honored (auto-architecture diagrams, infographic engine, render cache → TODOS).

Plan Completion

28 DONE / 1 CHANGED / 0 NOT DONE (29 items). The one CHANGED: step 7's excalidraw.com round-trip verified as a deterministic schema-validity gate instead of a manual browser check. Plan: eng-reviewed (11 findings folded, 0 unresolved), Codex outside voice absorbed (6 adoptions).

Verification Results

Plan verification: PASS — executed live in-session (free gates green; PDF/HTML/DOCX manually inspected with rasterized evidence; mixed-orientation pdfinfo checks; 29-page README dogfood at 4.4s).

TODOS

No pre-existing TODO items completed. Two new entries added: P3 content-hash diagram render cache, P3 e2e gate-harness dedup (deferred D8.2).

Documentation

Post-ship doc audit (/document-release) verified every doc claim against the final shipped behavior and ran a cross-model Codex doc review. Two commits: 8c7e0451, b2318467.

  • make-pdf skill doc: remote images documented as BLOCKED with placeholder; --strict lists all five fatal classes; page=portrait fence option; column-0 fence requirement; troubleshooting names [remote image blocked].
  • docs/howto-diagrams-and-formats.md: image-policy corrections; base64 data-gstack-source preservation; --to html zero-network claim qualified for --allow-network.
  • README: how-to guide linked from the Docs table; /diagram hand-drawn claim scoped to the .excalidraw artifact. Same scoping in docs/skills.md + diagram skill description.
  • CHANGELOG v1.58.0.0 wording polish; lib/diagram-render/README.md gains __downscaleRaster.

Documentation debt (tracked): dead #make-pdf/#diagram anchors in docs/skills.md (pre-existing pattern, /document-generate job); make-pdf/src/commands.ts registry omits --to/--strict (code-side); no tutorials yet for either skill.

Test plan

  • Full free suite passes (exit 0, zero failures — browse + root + make-pdf, 189 make-pdf tests)
  • Drift guards pass (dist hash, src fingerprint, font-stack parity, reproducible rebuild)
  • Paid gate: diagram-triplet PASS; periodic judge PASS (9/10); operational-learning fixed and passing
  • Live dogfood: README → 29-page PDF (vector diagram, racetrack layout), single-file HTML (zero network refs), DOCX (content intact)

🤖 Generated with Claude Code

garrytan and others added 25 commits June 11, 2026 23:26
Deferred from the diagram-engine eng review (Codex outside-voice D7):
repeat make-pdf runs re-render every fence; cache keyed on fence source +
bundle version once multi-diagram docs make it worth building.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…owse

Single self-contained page (dist/diagram-render.html, 9.2MB, committed per
eng-review D2) exposing __renderMermaid / __mermaidToExcalidraw /
__excalidrawToSvg / __rasterize / __probeImage through browse load-html +
js --out. Render contract per D3: securityLevel strict, per-fence ids,
print-css font lock, htmlLabels off (canvas-taint-safe). Deterministic
build (same sha twice); drift test pins dist == BUILD_INFO == package.json
pins and rebuild-reproducibility when toolchain matches. Spike-proven
offline: flowchart + sequence SVG, editable .excalidraw scene, 300dpi PNG.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…rmalization

Data-URI rasters re-encode in their own format (JPEG stays JPEG at q0.9 —
PNG-encoding photos bloats them) at an explicit target pixel width. Used by
make-pdf's pre-pass for the 300dpi content-box ceiling (eng-review D4).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…s vector SVG; local images inline as data URIs

```mermaid / ```excalidraw fences extract to placeholder tokens, render in
one diagram-render bundle tab per run (reset contract: bundle page reloads
after any render error), and substitute back as accessible <figure> blocks
with the raw source preserved in a comment. Render failures produce a loud
red diagnostic block, never silent raw code. render=false keeps a fence as
code; title="..." becomes the aria-label and caption.

Local images now actually render: page.setContent loads at about:blank
(tab-session.ts:194), so relative paths silently 404'd before. The pre-pass
resolves them against the markdown's directory, inlines as data URIs, probes
intrinsic dimensions from the bytes (pure-TS PNG/JPEG/GIF/WebP/SVG sniffing),
and downscales rasters wider than 2x the content box at 300dpi. Remote URLs
warn (offline posture, --allow-network exempts); missing files get a visible
placeholder; --strict hard-fails both for CI pipelines.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
34 unit tests (fence extraction incl. nested/tilde/unclosed/render=false,
info-string parsing, slot substitution, diagnostic/figure escaping + SVG
script strip, byte-level dimension probing across 5 formats, content-box
math, image inlining incl. strict/remote/missing/data-URI paths). E2E gate
proves through the compiled binary: both fences render as vector text
(id-collision check), raw mermaid ships only via render=false, broken fence
yields the diagnostic block, and the relative fixture image rasterizes to
colored pixels (CRITICAL regression for the about:blank image fix).
--strict exits non-zero on a missing image.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…S named pages

`![a](x.png){width=full|<pct>|<dim>}` and `{page=landscape|portrait}`
suffixes translate to data-gstack-* attrs in render() (before the sanitizer,
which keeps data- attributes; unrecognized brace groups stay visible text).
Default width rule needs no code: intrinsic CSS-px capped at the content box,
never upscaled — figure img max-width owns it.

Auto-landscape promotes a block to `@page wide { size: <pagesize> landscape }`
only when aspect >= 1.8 AND intrinsic width > 2.5x the content box (~1600px on
letter) AND diagram provenance (rendered fences) or a whole-word alt token
(diagram|architecture|flowchart|chart|graph) for plain images. {page=...}
forces or vetoes; fence info strings accept page=... too. preferCSSPageSize
is passed to Chromium only when a promotion exists, so every other document
prints exactly as before. False negatives are cheap; false positives feel
broken (eng-review P4, Codex challenge accepted).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ative fixtures

24 unit tests weighted toward the false-positive guards: wide screenshot
without an alt hint stays portrait, sub-threshold and tall images stay
portrait, deterministic 1560/1561px boundary, whole-word alt matching
('photographic' must not match 'graph'), page=portrait veto beats every
heuristic, diagnostic blocks never promote. E2E gate asserts pdfinfo
per-page boxes through the compiled binary: exactly 3 of 5 fixture blocks
get landscape pages (alt-hinted image, directive-forced image, wide sequence
diagram) while the unhinted screenshot and the veto'd diagram stay portrait —
plus the --toc combo proving TOC and named-page landscape coexist.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
--to html writes the assembled self-contained document directly (no print
round-trip): inline vector diagrams, data-URI images, zero network
references, plus an @media screen layer for browser reading. --to docx is
the content-fidelity export (eng-review P8): html-to-docx@1.8.0 (exact pin;
pure JS, bun-compile-verified) maps headings/tables/code/lists; diagrams and
SVG images rasterize at 300dpi of the content-box width via the render tab;
diagnostic figures convert to plain p/pre so the converter can't silently
drop an error. --format keeps its page-size-alias meaning; --to is the
output format, and the CLI says so when confused.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… checks

HTML: zero src/href network refs, no script/link tags, inline SVG diagrams,
data-URI images, screen layer, diagnostic survives. DOCX: valid OOXML zip
(document.xml + Content_Types), >=2 PNG media (diagram raster + fixture
image), headings + render=false source + diagnostic text in document.xml,
no leaked mermaid source from rendered fences. Plus --to validation UX.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
New skill: agent authors mermaid from the user's description and renders the
triplet through the offline diagram-render bundle in the browse daemon —
.mmd source (the single source of truth), editable .excalidraw (opens at
excalidraw.com, round-trips back through re-render), and SVG + PNG. Flowcharts
convert to fully editable scenes; other mermaid types render with an explicit
upstream-converter limitation note. Never ships an unrendered source file;
offline is the contract (no CDN fallback). Inventory rows in AGENTS.md +
docs/skills.md; generated SKILL.md + llms.txt via gen:skill-docs.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ring judge

diagram-triplet (gate, deterministic functional): a fresh claude -p agent
following the skill extract must emit a parseable triplet — graph LR/TD in
.mmd, excalidraw scene with >3 elements, SVG markup, PNG magic bytes.
Verified live: pass, $0.17, 58s. diagram-authoring-quality (periodic,
LLM-judged): faithfulness/labels/size rubric with a diagnostic-path cap,
floor 6/10. Verified live: pass at exactly 6 with substantive critique.
Touchfiles select both on diagram/** and lib/diagram-render/** changes;
tier split per E2E_TIERS rules (eng-review D5).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Gate: triplet contract + structural floor; periodic: authoring-quality judge.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… vertical centering

Dogfooding round on the repo README surfaced four output-quality bugs:

- Type was too small everywhere: body 11→12pt, h1 22→26pt, h2 15→18pt,
  cover title 32→56pt with poster spacing, cover meta 10→13pt, TOC 11→12pt
  with tighter leading, code 9.5→10.5pt, tables 10→11pt.
- Zero image truncation, ever: the max-width cap was figure-scoped, but
  markdown images render as <p><img> — a 1850px GitHub screenshot ran off
  the page edge. Global img { max-width: 100%; height: auto; } cap.
- hyphens: auto put real 'dif-\nferent' breaks into the PDF text layer the
  moment 12pt made lines wrap (combined-gate caught it). Clean copy-paste
  is the product contract; left-aligned rag doesn't need hyphenation →
  hyphens: manual.
- Promoted landscape blocks now vertically center. CSS flex/min-height
  centering fragments into phantom empty landscape pages in Chromium
  (bisected: min-height at ANY value; 3 promotions printed 5 pages), so
  image-policy computes an inline margin-top from each block's known
  aspect ratio against the landscape content box instead — fragmentation
  handles margins fine. .page-wide also drops its explicit break-before/
  after (the page-name change already breaks on both sides).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ering math

Global img cap pinned as a regex invariant (the figure-scoped-cap regression
class); typography floor (12pt body, 56pt cover, 12pt TOC); .page-wide must
NOT carry min-height/flex (the phantom-landscape-page regression class);
centering margin math verified both ways (2400×1000 image → 1.38in,
2050×600 viewBox diagram → 1.93in, page-filling directive block → no margin).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ill, and how-to guide

README gains /make-pdf (Publisher) and /diagram (Diagram Maker) rows in the
sprint table. make-pdf's skill doc — the agent-facing contract — gains Core
patterns for mermaid/excalidraw fences (title/render=false/page= options),
the image policy ({width=}/{page=} directives, zero-truncation, conservative
auto-landscape), --to html|docx, and --strict, plus the --to vs --format
disambiguation in Common flags. New docs/howto-diagrams-and-formats.md is
the user-facing walkthrough: fences, directives, formats, /diagram triplet,
the mermaid racetrack trick, troubleshooting.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ract, excalidraw fence, WebP

Ship coverage audit found 9 gaps (85%); this fills the 2 HIGH + 3 MEDIUM and
most LOW. diagram-gate fixture gains a 4200px incompressible photo (the only
live coverage of __downscaleRaster AND the 64KB chunked jsViaBuffer eval
transport — asserted via the downscale stderr warning), an ```excalidraw
scene fence rendered through exportToSvg (vector labels + caption in
pdftotext, no leaked scene JSON), and the broken fence MOVED BETWEEN the two
mermaid fences so the second diagram rendering proves the D6.2 reset
contract end-to-end. New coverage-gaps.test.ts (16 tests): mock-tab reset
contract (exactly one reload, post-failure fence renders), excalidraw
fail-fast diagnostic without a bundle call, rasterize error fallbacks
(figure/tag kept, never silent), WebP VP8/VP8L/VP8X byte parsers,
landscapeContentBox a4/asymmetric margins, bare-token slot fallback,
resolveBundlePath env override + error shape, screenCss media scoping.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…rdening, Windows paths, transport rework

Review army (6 specialists + red team) findings, all fixed:

- Indented fences replay byte-for-byte and indented diagram fences are NOT
  extracted (red-team conf-9: the pre-pass reconstructed fences at column 0,
  splitting any list containing fenced code — every ordinary document).
- String.replace $-pattern injection killed at every seam: substituteSlots,
  mergeStyle, img/src rewrites all use function replacements (a diagram label
  containing $' duplicated the document tail).
- Big-expression transport reworked: browse `eval <file>` (one spawn, any
  size, Windows-safe) replaces the 64KB chunked window-buffer eval — fixes
  the per-chunk spawn cost, the char-vs-byte argv units, AND the Windows
  32,767-char command-line ceiling in one move.
- Staged-bundle trust: content verified by hash even when the file exists,
  and the rename-failure path re-hashes the survivor (sticky-bit /tmp EPERM
  would otherwise ride a pre-planted file past the check).
- Windows drive-letter img srcs (C:/x.png) reach the local-path branch
  instead of being swallowed as unknown URL schemes.
- DOCX rasterize-failure now embeds the decoded source as visible text —
  returning the figure made diagrams vanish silently (converter drops svg).
- Fence source preserved as base64 data-gstack-source attribute (the comment
  encoding corrupted every '-->' arrow); decodeFigureSource() round-trips.
- inlineLocalImages memoizes per path; file:// uses fileURLToPath; preview
  prints a divergence note for fences/local images; --to docx strips the
  watermark div and warns about print-only flags; TOC links resolve in
  html/docx (heading ids assigned); waitForExpression sleeps instead of
  busy-spinning; escapeHtml/svg-dims deduped to single definitions;
  typography stragglers (blockquote 12pt, footnotes 10pt, 42em screen
  measure); bundle BUILD_INFO gains srcSha256 for no-node_modules drift
  detection; MAX_TARGET_PX shared guard.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
make-pdf-gate.yml paths gain lib/diagram-render/** and the drift test (a
bundle-only PR previously skipped every render gate AND no CI lane ran the
drift check at all). .gitattributes pins dist html/json to LF so Windows
autocrlf can't break the hash-pinned bundle.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… hardening

Tests: indented-fence byte-for-byte replay + no-extraction-in-lists,
drive-letter local-path routing, $-pattern slot immunity, base64 source
round-trip ('A --> B' exact), existing-style merge preservation, DOCX
rasterize-failure surfaces source, srcSha256 + font-stack drift guards,
landscape veto asserted as some-portrait/no-landscape (layout-order-proof),
judge rubric cap lowered to 5 so it actually fails, vacuous error-shape test
removed honestly, tmpdir cleanup.

/diagram skill: base64 transport (template literals corrupted backticks/${
in sources), content-addressed staging with hash verification, and --tab-id
pinned on every browse call so a concurrent /qa session can't be clobbered.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…al (D8.1)

Local CLI semantics stay (absolute paths and ../ still inline, like pandoc),
but never silently: an agent PDF-ing untrusted markdown can't quietly embed a
file from outside the input directory into a shareable document without a
visible warning, and --strict pipelines hard-fail. Two unit tests. Also:
TODOS.md gains the deferred e2e-harness dedup entry (D8.2).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Root cause was the fixture, not model behavior: gstack-learnings-log gained
an import of lib/jsonl-store.ts in the v1.57.5.0 injection-sanitization wave,
but the test copies only bin/ scripts into its sandbox — the inline bun
import failed and the script exited 1 before writing, on every run, on main
too (reproduced at a5833c4). Fixture now stages lib/jsonl-store.ts beside
bin/; verified deterministically (script exits 0, learning written) and via
the paid test (1 pass).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…mlink-aware confinement, bounded reads

Codex adversarial + structured review findings:

- Remote images are now BLOCKED with a visible placeholder instead of
  warn-and-keep — leaving the tag meant Chromium fetched the URL at print
  time anyway, so the offline posture was a lie (tracking pixels and
  internal-URL probes ran without --allow-network).
- The out-of-tree read check compares REAL paths: a symlink inside the input
  dir pointing at ~/.ssh/... passed the string-prefix check, including under
  --strict. Ordered after the existence check (realpath of a missing file
  false-positives on macOS /var → /private/var).
- Image reads are bounded BEFORE reading: statSync first, non-regular files
  (fifo/device/dir) and >64MB files degrade to placeholders instead of
  hanging or exhausting memory; malformed percent-encoding (foo%zz.png)
  degrades to missing-image instead of crashing decodeURIComponent.
- browse shell-outs get a 120s timeout — a wedged daemon or hostile mermaid
  source fails the run instead of hanging it.
- TOC entries link to the heading's ACTUAL id (pre-id'd raw-HTML headings
  previously got dead #toc-N links); per-side margins compose into the CSS
  @page shorthand so a landscape promotion flipping preferCSSPageSize no
  longer silently reverts --margin-left/right to defaults (Codex P2).
- The image memo is a typed object — literal NUL-byte separators had made
  diagram-prepass.ts register as binary to text tooling.

Codex structured review GATE: PASS (no P1).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
….58.0.0)

The docs wave (8759442) predated the final review-wave commits, so two
docs drifted from shipped behavior:

- make-pdf/SKILL.md.tmpl + generated SKILL.md: remote images are BLOCKED
  with a visible placeholder (not warned-and-kept); out-of-tree reads
  (including via symlink) warn and --strict makes them fatal; --strict
  also covers oversized (>64MB) and non-regular files; troubleshooting
  entry now names the actual "[remote image blocked]" symptom.
- docs/howto-diagrams-and-formats.md: same corrections in the image
  section, CI section, and troubleshooting.
- README.md: docs/howto-diagrams-and-formats.md added to the Docs table
  (was unreachable from any entry-point doc).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Cross-model doc review (Codex, read-only) checked the v1.58.0.0 docs
against the shipped code. Fixes:

- howto + make-pdf SKILL: diagram source is preserved base64 in a
  data-gstack-source attribute, not an HTML comment (-- in mermaid
  arrows would corrupt a comment); fences must start at column 0;
  fence options example gains page=portrait; --to html "zero network
  refs" qualified (--allow-network deliberately keeps remote tags).
- /diagram description, README + docs/skills.md rows: the hand-drawn
  aesthetic belongs to the .excalidraw artifact; rendered SVG/PNG use
  mermaid's clean neutral theme (lib/diagram-render entry.ts pins
  theme: "neutral").
- CHANGELOG v1.58.0.0 wording: --strict coverage lists all five fatal
  classes (missing/remote/out-of-tree/oversized/non-regular); fences
  are vector SVG in pdf+html, 300dpi PNG in docx; hand-drawn claim
  scoped to the .excalidraw file.
- lib/diagram-render/README: Page API table gains __downscaleRaster.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@trunk-io

trunk-io Bot commented Jun 12, 2026

Copy link
Copy Markdown

Merging to main in this repository is managed by Trunk.

  • To merge this pull request, check the box to the left or comment /trunk merge below.

After your PR is submitted to the merge queue, this comment will be automatically updated with its status. If the PR fails, failure details will also be posted here

@github-actions

Copy link
Copy Markdown

E2E Evals: ❌ FAIL

70/75 tests passed | $12.62 total cost | 12 parallel runners

Suite Result Status Cost
e2e-browse 7/7 $0.38
e2e-deploy 6/6 $1.37
e2e-design 4/4 $0.71
e2e-plan 8/8 $2.81
e2e-qa-workflow 3/3 $1.25
e2e-review 6/6 $1.88
e2e-workflow 4/4 $0.83
llm-judge 24/29 $0.58
e2e-plan 8/8 $2.81

12x ubicloud-standard-8 (Docker: pre-baked toolchain + deps) | wall clock ≈ slowest suite

Failures

  • ❌ document-release/SKILL.md workflow: unknown
  • ❌ plan-ceo-review/SKILL.md modes: unknown
  • ❌ document-release/SKILL.md workflow: unknown
  • ❌ document-release/SKILL.md workflow: unknown
  • ❌ plan-ceo-review/SKILL.md modes: unknown

@garrytan garrytan merged commit 14fc086 into main Jun 12, 2026
23 of 24 checks passed
@immy2good

Copy link
Copy Markdown

I was working on this for myself and before you know it , gstack got a better version. Thank G

atlonxp added a commit to atlonxp/hstack that referenced this pull request Jun 13, 2026
…rmat document engine

Cherry-picked gstack 14fc086 (garrytan#1990): adds the /diagram skill +
lib/diagram-render offline Chromium bundle, and upgrades /make-pdf
(mermaid + excalidraw rendering, --to html / --to docx). Shared
catalog/release files resolved keeping hstack content; generated files
regenerated; html-to-docx dep added. No hstack hat skill touched.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants