agentic-mermaid 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (340) hide show
  1. package/AGENT_NATIVE.md +155 -91
  2. package/CHANGELOG.md +163 -4
  3. package/Instructions_for_agents.md +10 -10
  4. package/LICENSES/Apache-2.0.txt +202 -0
  5. package/README.md +31 -38
  6. package/THIRD_PARTY_NOTICES.md +29 -0
  7. package/assets/hero.png +0 -0
  8. package/dist/agent-core.d.ts +463 -0
  9. package/dist/agent-core.js +397 -0
  10. package/dist/agent.d.ts +73 -1868
  11. package/dist/agent.js +336 -37325
  12. package/dist/agentic-mermaid-mcp.js +7 -38399
  13. package/dist/am.js +33626 -40446
  14. package/dist/chunk-2P5FKUQC.js +3485 -0
  15. package/dist/chunk-2S3VSS6I.js +149 -0
  16. package/dist/chunk-2SILJDW2.js +37 -0
  17. package/dist/chunk-BJYMBT4I.js +61963 -0
  18. package/dist/chunk-FDM43XU7.js +615 -0
  19. package/dist/chunk-MYPDVZCO.js +4702 -0
  20. package/dist/index-DWPa2MJs.d.ts +6780 -0
  21. package/dist/index.d.ts +1 -1
  22. package/dist/index.js +310 -33014
  23. package/dist/mcp-cli-5J47WEY3.js +17 -0
  24. package/docs/README.md +39 -31
  25. package/docs/agent-api-cookbook.md +44 -35
  26. package/docs/agent-mutation-policy.md +1 -1
  27. package/docs/agent-workflow-examples.md +2 -2
  28. package/docs/api.md +284 -77
  29. package/docs/ascii.md +26 -16
  30. package/docs/code-mode-impact.md +214 -0
  31. package/docs/comparison.md +23 -11
  32. package/docs/computational-aesthetics-prototype-plan.md +252 -0
  33. package/docs/config.md +26 -10
  34. package/docs/custom-fonts.md +265 -0
  35. package/docs/custom-style-cookbook.md +130 -9
  36. package/docs/diagram-families.md +48 -23
  37. package/docs/features.md +59 -52
  38. package/docs/fork-differences.md +6 -3
  39. package/docs/getting-started.md +23 -16
  40. package/docs/issue-derived-test-cases.md +29 -22
  41. package/docs/mcp-code-mode-rationale.md +13 -6
  42. package/docs/mcp-http-transport.md +20 -13
  43. package/docs/mermaid-layout-complaints.md +66 -52
  44. package/docs/mutation-testing.md +145 -66
  45. package/docs/quality.md +23 -14
  46. package/docs/react.md +2 -2
  47. package/docs/schemas/style-spec.schema.json +1221 -30
  48. package/docs/style-authoring.md +241 -38
  49. package/docs/svg-semantic-contract.md +49 -0
  50. package/docs/testing-strategy.md +166 -58
  51. package/docs/theming.md +19 -32
  52. package/examples/styles/catalog.json +54 -0
  53. package/examples/styles/cloudflare-workers-inspired-prototype.mmd +9 -0
  54. package/examples/styles/cloudflare-workers-inspired-prototype.style.json +110 -0
  55. package/examples/styles/cupertino-prototype.mmd +10 -0
  56. package/examples/styles/cupertino-prototype.style.json +63 -0
  57. package/examples/styles/mid-century-report.style.json +2 -2
  58. package/examples/styles/star-chart-atlas.style.json +2 -1
  59. package/examples/styles/transit-route-map.style.json +2 -2
  60. package/examples/styles/vercel-inspired-prototype.mmd +6 -0
  61. package/examples/styles/vercel-inspired-prototype.style.json +87 -0
  62. package/package.json +85 -45
  63. package/server.json +2 -2
  64. package/skills/agentic-mermaid-diagram-workflow/SKILL.md +17 -36
  65. package/skills/agentic-mermaid-diagram-workflow/references/cli.md +4 -5
  66. package/skills/agentic-mermaid-diagram-workflow/references/code-mode.md +15 -31
  67. package/skills/agentic-mermaid-diagram-workflow/references/sequence.md +10 -14
  68. package/skills/agentic-mermaid-live-editor/SKILL.md +100 -206
  69. package/TODO.md +0 -684
  70. package/dist/index-wjRjbsP-.d.ts +0 -1102
  71. package/docs/assets/improvements/box-start-connector.png +0 -0
  72. package/docs/assets/improvements/comment-dropped-lint.png +0 -0
  73. package/docs/assets/improvements/er-content-loss.png +0 -0
  74. package/docs/assets/improvements/fan-in-trunks.png +0 -0
  75. package/docs/assets/improvements/gantt-family.png +0 -0
  76. package/docs/assets/improvements/gantt-milestone-clamp.png +0 -0
  77. package/docs/assets/improvements/gantt-verify-seam.png +0 -0
  78. package/docs/assets/improvements/subgraph-container-edges.png +0 -0
  79. package/docs/assets/improvements/wrapper-frontmatter.png +0 -0
  80. package/docs/assets/improvements/wrapper-init-directive.png +0 -0
  81. package/docs/assets/improvements/wrapper-leading-comment.png +0 -0
  82. package/docs/assets/style-cookbook/mid-century-report.png +0 -0
  83. package/docs/assets/style-cookbook/star-chart-atlas.png +0 -0
  84. package/docs/assets/style-cookbook/transit-route-map.png +0 -0
  85. package/docs/contributing/adding-diagram-types.md +0 -144
  86. package/docs/contributing/diagram-family-citizenship.matrix.json +0 -2127
  87. package/docs/contributing/diagram-family-citizenship.md +0 -82
  88. package/docs/contributing/harvesting-upstream-tests.md +0 -126
  89. package/docs/contributing/lessons-learned.md +0 -276
  90. package/docs/contributing/releasing.md +0 -82
  91. package/docs/contributing/visual-review-evidence.md +0 -53
  92. package/docs/design/families/README.md +0 -26
  93. package/docs/design/families/architecture-beta.md +0 -48
  94. package/docs/design/families/flowchart-parser-conformance.md +0 -22
  95. package/docs/design/families/gantt-research.md +0 -137
  96. package/docs/design/families/gantt.md +0 -329
  97. package/docs/design/families/journey-agentic-cards-before.png +0 -0
  98. package/docs/design/families/journey-experience-curve-implementation.png +0 -0
  99. package/docs/design/families/journey-mermaid-classic-implementation.png +0 -0
  100. package/docs/design/families/journey-mermaid-classic-prototype.png +0 -0
  101. package/docs/design/families/journey-mermaid-classic-prototype.svg +0 -163
  102. package/docs/design/families/journey-mermaid-classic-prototype.svg.png +0 -0
  103. package/docs/design/families/journey-migration-parity.md +0 -439
  104. package/docs/design/families/journey-section-overlap-after.png +0 -0
  105. package/docs/design/families/journey-section-overlap-before.png +0 -0
  106. package/docs/design/families/journey-usage-research.md +0 -423
  107. package/docs/design/families/journey.md +0 -153
  108. package/docs/design/families/xychart.md +0 -85
  109. package/docs/design/system/README.md +0 -45
  110. package/docs/design/system/abstraction-audit.md +0 -224
  111. package/docs/design/system/abstraction-recommendations.md +0 -655
  112. package/docs/design/system/architecture.mmd +0 -29
  113. package/docs/design/system/architecture.svg +0 -137
  114. package/docs/design/system/layout-guarantees-and-robustness.md +0 -351
  115. package/docs/design/system/layout-rubric.md +0 -138
  116. package/docs/design/system/route-contracts.md +0 -848
  117. package/docs/design/system/source-preservation-ladder.md +0 -52
  118. package/docs/design/system/styles-rollout.md +0 -216
  119. package/docs/design/system/ugly-layouts.md +0 -119
  120. package/docs/layout-characterization/README.md +0 -245
  121. package/docs/layout-characterization/contact-sheet-families.md +0 -498
  122. package/docs/layout-characterization/contact-sheet.md +0 -638
  123. package/docs/layout-characterization/properties.md +0 -281
  124. package/docs/layout-characterization/visual-quality.md +0 -160
  125. package/docs/layout-characterization/visual-snapshots/architecture.svg +0 -79
  126. package/docs/layout-characterization/visual-snapshots/class.svg +0 -60
  127. package/docs/layout-characterization/visual-snapshots/er.svg +0 -61
  128. package/docs/layout-characterization/visual-snapshots/flowchart.svg +0 -58
  129. package/docs/layout-characterization/visual-snapshots/gantt.svg +0 -52
  130. package/docs/layout-characterization/visual-snapshots/journey.svg +0 -98
  131. package/docs/layout-characterization/visual-snapshots/pie.svg +0 -36
  132. package/docs/layout-characterization/visual-snapshots/quadrant.svg +0 -47
  133. package/docs/layout-characterization/visual-snapshots/sequence.svg +0 -59
  134. package/docs/layout-characterization/visual-snapshots/state.svg +0 -52
  135. package/docs/layout-characterization/visual-snapshots/timeline.svg +0 -64
  136. package/docs/layout-characterization/visual-snapshots/xychart.svg +0 -97
  137. package/docs/project/divergences.md +0 -98
  138. package/docs/project/dogfooding-docs-strategy.md +0 -66
  139. package/docs/project/hosted-mcp-cloudflare-plan.md +0 -338
  140. package/docs/project/lessons-learned.md +0 -1019
  141. package/docs/project/remove-role-styling-plan.md +0 -176
  142. package/examples/agent-improve-auth-flow.ts +0 -206
  143. package/examples/agent-loop.ts +0 -53
  144. package/examples/mcp-vs-cli-complex-diagrams.ts +0 -133
  145. package/llms.txt +0 -104
  146. package/skill-evals/README.md +0 -77
  147. package/skill-evals/fixtures/architecture-cache/input.mmd +0 -5
  148. package/skill-evals/fixtures/class-payment/input.mmd +0 -4
  149. package/skill-evals/fixtures/er-orders/input.mmd +0 -10
  150. package/skill-evals/fixtures/flowchart-cache/input.mmd +0 -3
  151. package/skill-evals/fixtures/gantt-release/input.mmd +0 -7
  152. package/skill-evals/fixtures/journey-checkout/input.mmd +0 -6
  153. package/skill-evals/fixtures/pie-exports/input.mmd +0 -5
  154. package/skill-evals/fixtures/quadrant-priorities/input.mmd +0 -11
  155. package/skill-evals/fixtures/sequence-retry/input.mmd +0 -8
  156. package/skill-evals/fixtures/state-lifecycle/input.mmd +0 -5
  157. package/skill-evals/fixtures/timeline-release/input.mmd +0 -6
  158. package/skill-evals/fixtures/xychart-growth/input.mmd +0 -5
  159. package/skill-evals/shared-benchmark.json +0 -510
  160. package/src/agent/analyze.ts +0 -157
  161. package/src/agent/apply.ts +0 -146
  162. package/src/agent/architecture-body.ts +0 -458
  163. package/src/agent/certificates.ts +0 -110
  164. package/src/agent/class-body.ts +0 -319
  165. package/src/agent/core.ts +0 -207
  166. package/src/agent/create.ts +0 -106
  167. package/src/agent/describe.ts +0 -368
  168. package/src/agent/er-body.ts +0 -224
  169. package/src/agent/facts.ts +0 -360
  170. package/src/agent/families-builtin.ts +0 -920
  171. package/src/agent/families.ts +0 -232
  172. package/src/agent/family-layouts.ts +0 -832
  173. package/src/agent/flowchart-body.ts +0 -372
  174. package/src/agent/flowchart-unsupported.ts +0 -243
  175. package/src/agent/font-coverage.ts +0 -288
  176. package/src/agent/gantt-body.ts +0 -495
  177. package/src/agent/index.ts +0 -10
  178. package/src/agent/journey-body.ts +0 -374
  179. package/src/agent/label-metrics.ts +0 -28
  180. package/src/agent/layout-to-rendered.ts +0 -63
  181. package/src/agent/mutate.ts +0 -97
  182. package/src/agent/mutation-ops.ts +0 -51
  183. package/src/agent/op-schema.ts +0 -443
  184. package/src/agent/parse.ts +0 -223
  185. package/src/agent/pie-body.ts +0 -270
  186. package/src/agent/png.ts +0 -171
  187. package/src/agent/quadrant-body.ts +0 -336
  188. package/src/agent/quality.ts +0 -363
  189. package/src/agent/readability-audit.ts +0 -92
  190. package/src/agent/rendered-route-audit.ts +0 -61
  191. package/src/agent/sequence-body.ts +0 -345
  192. package/src/agent/serialize.ts +0 -214
  193. package/src/agent/state-body.ts +0 -589
  194. package/src/agent/structural-count.ts +0 -150
  195. package/src/agent/timeline-body.ts +0 -280
  196. package/src/agent/trace-log.ts +0 -43
  197. package/src/agent/types.ts +0 -995
  198. package/src/agent/verify.ts +0 -603
  199. package/src/agent/xychart-body.ts +0 -472
  200. package/src/architecture/config.ts +0 -282
  201. package/src/architecture/layout.ts +0 -496
  202. package/src/architecture/parser.ts +0 -375
  203. package/src/architecture/renderer.ts +0 -611
  204. package/src/architecture/types.ts +0 -113
  205. package/src/ascii/ansi.ts +0 -423
  206. package/src/ascii/architecture.ts +0 -210
  207. package/src/ascii/canvas.ts +0 -443
  208. package/src/ascii/class-diagram.ts +0 -697
  209. package/src/ascii/converter.ts +0 -475
  210. package/src/ascii/draw.ts +0 -1693
  211. package/src/ascii/edge-bundling.ts +0 -328
  212. package/src/ascii/edge-routing.ts +0 -330
  213. package/src/ascii/er-diagram.ts +0 -439
  214. package/src/ascii/gantt.ts +0 -276
  215. package/src/ascii/grid.ts +0 -747
  216. package/src/ascii/index.ts +0 -196
  217. package/src/ascii/journey.ts +0 -169
  218. package/src/ascii/meta.ts +0 -244
  219. package/src/ascii/multiline-utils.ts +0 -80
  220. package/src/ascii/pathfinder.ts +0 -301
  221. package/src/ascii/pie.ts +0 -67
  222. package/src/ascii/quadrant.ts +0 -158
  223. package/src/ascii/reverse.ts +0 -216
  224. package/src/ascii/sequence.ts +0 -499
  225. package/src/ascii/shapes/circle.ts +0 -27
  226. package/src/ascii/shapes/corners.ts +0 -143
  227. package/src/ascii/shapes/diamond.ts +0 -27
  228. package/src/ascii/shapes/hexagon.ts +0 -27
  229. package/src/ascii/shapes/index.ts +0 -106
  230. package/src/ascii/shapes/rectangle.ts +0 -168
  231. package/src/ascii/shapes/rounded.ts +0 -27
  232. package/src/ascii/shapes/special.ts +0 -332
  233. package/src/ascii/shapes/stadium.ts +0 -110
  234. package/src/ascii/shapes/state.ts +0 -192
  235. package/src/ascii/shapes/types.ts +0 -73
  236. package/src/ascii/timeline.ts +0 -141
  237. package/src/ascii/types.ts +0 -312
  238. package/src/ascii/validate.ts +0 -120
  239. package/src/ascii/width.ts +0 -81
  240. package/src/ascii/wrap.ts +0 -131
  241. package/src/ascii/xychart.ts +0 -919
  242. package/src/browser.ts +0 -29
  243. package/src/class/layout.ts +0 -240
  244. package/src/class/parser.ts +0 -332
  245. package/src/class/renderer.ts +0 -638
  246. package/src/class/types.ts +0 -129
  247. package/src/cli/agent-instructions.ts +0 -1
  248. package/src/cli/am-bin.ts +0 -6
  249. package/src/cli/exit-codes.ts +0 -18
  250. package/src/cli/index.ts +0 -1132
  251. package/src/cli/init-agent.ts +0 -147
  252. package/src/cli/run-entrypoint.ts +0 -10
  253. package/src/color-resolver.ts +0 -152
  254. package/src/elk-instance.ts +0 -114
  255. package/src/er/layout.ts +0 -187
  256. package/src/er/parser.ts +0 -226
  257. package/src/er/renderer.ts +0 -792
  258. package/src/er/types.ts +0 -99
  259. package/src/family-rubric.ts +0 -425
  260. package/src/font-manifest.ts +0 -31
  261. package/src/gantt/layout.ts +0 -365
  262. package/src/gantt/parser.ts +0 -282
  263. package/src/gantt/pipeline.ts +0 -27
  264. package/src/gantt/renderer.ts +0 -414
  265. package/src/gantt/schedule.ts +0 -513
  266. package/src/gantt/types.ts +0 -255
  267. package/src/index.ts +0 -368
  268. package/src/journey/layout.ts +0 -554
  269. package/src/journey/parse-core.ts +0 -251
  270. package/src/journey/parser.ts +0 -101
  271. package/src/journey/renderer.ts +0 -917
  272. package/src/journey/types.ts +0 -144
  273. package/src/layout/geometry.ts +0 -182
  274. package/src/layout/pass.ts +0 -142
  275. package/src/layout/passes/index.ts +0 -3916
  276. package/src/layout-engine.ts +0 -1565
  277. package/src/layout-rubric.ts +0 -659
  278. package/src/mcp/artifacts.ts +0 -137
  279. package/src/mcp/dynamic-harness.ts +0 -31
  280. package/src/mcp/dynamic-modules.d.ts +0 -7
  281. package/src/mcp/facade.ts +0 -608
  282. package/src/mcp/harness-runtime.ts +0 -203
  283. package/src/mcp/hosted-server.ts +0 -468
  284. package/src/mcp/mcp-bin.ts +0 -3
  285. package/src/mcp/mcp-cli.ts +0 -82
  286. package/src/mcp/protocol.ts +0 -13
  287. package/src/mcp/sandbox.ts +0 -195
  288. package/src/mcp/sdk-decl.ts +0 -391
  289. package/src/mcp/server.ts +0 -362
  290. package/src/mcp/tool-surface.ts +0 -146
  291. package/src/mermaid-source.ts +0 -655
  292. package/src/multiline-utils.ts +0 -228
  293. package/src/parser.ts +0 -1031
  294. package/src/pie/layout.ts +0 -168
  295. package/src/pie/parser.ts +0 -136
  296. package/src/pie/renderer.ts +0 -234
  297. package/src/pie/types.ts +0 -82
  298. package/src/quadrant/layout.ts +0 -191
  299. package/src/quadrant/parser.ts +0 -183
  300. package/src/quadrant/renderer.ts +0 -322
  301. package/src/quadrant/types.ts +0 -113
  302. package/src/render-family-hooks.ts +0 -244
  303. package/src/renderer.ts +0 -1099
  304. package/src/route-contracts.ts +0 -2723
  305. package/src/scene/backend.ts +0 -76
  306. package/src/scene/fidelity.ts +0 -183
  307. package/src/scene/hybrid-backend.ts +0 -174
  308. package/src/scene/ir.ts +0 -181
  309. package/src/scene/marks.ts +0 -127
  310. package/src/scene/rough-backend.ts +0 -378
  311. package/src/scene/seed.ts +0 -46
  312. package/src/scene/style-registry.ts +0 -556
  313. package/src/sequence/layout.ts +0 -456
  314. package/src/sequence/parser.ts +0 -255
  315. package/src/sequence/renderer.ts +0 -604
  316. package/src/sequence/types.ts +0 -154
  317. package/src/shape-clipping.ts +0 -351
  318. package/src/shared/accessibility-directives.ts +0 -22
  319. package/src/shared/batched.ts +0 -61
  320. package/src/shared/color-math.ts +0 -93
  321. package/src/shared/svg-a11y.ts +0 -29
  322. package/src/shared/syntax-error.ts +0 -17
  323. package/src/shared/unicode-ranges.ts +0 -135
  324. package/src/styles.ts +0 -318
  325. package/src/svg-paths.ts +0 -28
  326. package/src/text-metrics.ts +0 -248
  327. package/src/theme.ts +0 -710
  328. package/src/timeline/layout.ts +0 -381
  329. package/src/timeline/parser.ts +0 -215
  330. package/src/timeline/renderer.ts +0 -538
  331. package/src/timeline/types.ts +0 -105
  332. package/src/types.ts +0 -462
  333. package/src/website-worker-modules.d.ts +0 -18
  334. package/src/xychart/axis-utils.ts +0 -109
  335. package/src/xychart/colors.ts +0 -124
  336. package/src/xychart/config.ts +0 -88
  337. package/src/xychart/layout.ts +0 -656
  338. package/src/xychart/parser.ts +0 -504
  339. package/src/xychart/renderer.ts +0 -640
  340. package/src/xychart/types.ts +0 -282
@@ -10,6 +10,27 @@ For the *definition* of "good looking" and the determinism guarantees, see
10
10
  [`quality.md`](./quality.md). For mutation specifics, see
11
11
  [`mutation-testing.md`](./mutation-testing.md). For the layout/visual
12
12
  contracts, see [`layout-characterization/README.md`](./layout-characterization/README.md).
13
+ The current measured complexity-aware and registry-derived interaction
14
+ portfolio is specified in
15
+ [`project/complexity-aware-test-portfolio-plan.md`](./project/complexity-aware-test-portfolio-plan.md);
16
+ its immutable before and content-addressed candidate reports live under
17
+ `eval/test-portfolio/`.
18
+
19
+ ## Local CI parity
20
+
21
+ Run `bun run quality:check` to execute the complete GitHub **Quality gates**
22
+ job locally. The command installs the frozen dependency graph and then runs
23
+ the dependency audit, font and website regeneration checks, evidence
24
+ freshness, sketch and whole-corpus audits, lint, repository-wide typechecking,
25
+ hero freshness, and the golden-drift guard. The workflow calls this same
26
+ entry point, so the local list and CI list cannot diverge.
27
+
28
+ Run `bun run evidence:check` for the narrower generated-evidence audit. It
29
+ executes every receipt-backed gallery plus palette-performance provenance,
30
+ continues after failures, and reports all stale artifacts together. Evidence
31
+ receipts hash their exact local source/fixture graph and the transitive Bun
32
+ lockfile closure of packages imported by that graph. Unrelated tools that are
33
+ present elsewhere in `bun.lock` do not invalidate visual evidence.
13
34
 
14
35
  ## The central problem: this is a partly non-testable program
15
36
 
@@ -40,7 +61,7 @@ audit-clean").
40
61
  | **Derived (golden)** | Output matches a previously-blessed artifact | ASCII goldens, SVG snapshots, contact sheets, screenshot baselines |
41
62
  | **Derived (differential)** | Our output agrees with an external reference corpus | mermaid-docs corpus, MermaidSeqBench, upstream-suite bench |
42
63
  | **Metamorphic** | Related inputs produce related outputs (no ground truth needed) | round-trip idempotence, cross-process/cross-runtime determinism |
43
- | **Pseudo / adequacy** | The *tests themselves* are strong enough | Stryker mutation lanes, sabotage suite |
64
+ | **Pseudo / fault sensitivity** | Selected seeded faults make the intended tests fail | incremental Stryker gate, sabotage suite |
44
65
  | **Heuristic / perceptual** | Geometry falls inside human-plausible bounds | `measureQuality`/`checkQuality`, ugly-detector, layout rubric, heuristic-tracker |
45
66
  | **Human / model** | Subjective quality on the axis nothing else covers | LLM-as-judge (periodic), manual visual review |
46
67
 
@@ -60,7 +81,7 @@ citizenship matrix. For an agent-native product the docs, schemas, CLI
60
81
  help, and `llms.txt` *are* runtime surface (Loop 14), so they are tested
61
82
  like code, not treated as prose.
62
83
 
63
- **Runs:** every PR (`bun test src/__tests__/`).
84
+ **Runs:** every PR (`bun run test`, including the canonical 30-second per-test budget).
64
85
  **Does not prove:** that the diagram is *visually* good. `verify.ok` is
65
86
  structural only — stated repeatedly because it has burned us (the Auth
66
87
  Flow episode, Loop 15).
@@ -78,13 +99,51 @@ independent spec:
78
99
  golden never moves silently.
79
100
 
80
101
  **Runs:** ASCII/SVG goldens per PR. The browser/screenshot e2e suite also runs
81
- per PR — it is the `e2e` job in `ci.yml` (`needs: test`), which installs
82
- Chromium and runs `browser.test.ts` (screenshot diff), the CLI/security e2e,
83
- and the single-binary e2e. The broad contact sheets are not on the per-PR gate.
102
+ per PR — it is the five-lane `e2e` matrix in `ci.yml` (`needs: test`), including
103
+ an installed-tarball consumer run at the advertised Node 22 floor. Its
104
+ browser lane installs Chromium and runs `browser.test.ts` (screenshot diff)
105
+ plus the security contracts and the explicitly enabled theme/style/accessibility
106
+ browser suites. The browser lane builds the gitignored `website/public` tree once
107
+ before those contracts serve it (`browser.test.ts` builds only the separate root
108
+ `editor.html`). Each browser contract file then runs in its own Bun process so its
109
+ Chromium/server hooks cannot overlap and exhaust a constrained hosted runner. The
110
+ package and CI both invoke `e2e/run-browser-contracts.ts`, whose canonical file
111
+ list also fails if any contract executes zero positive tests, while independent
112
+ lanes run the CLI/single-binary, dist-artifact, and tarball-consumer suites.
113
+ Broad contact-sheet rendering is periodic/triggered rather than a per-PR sweep;
114
+ the committed citizenship manifest and pending review state remain cheap
115
+ per-PR contracts. Structured human review is recommended for visual releases
116
+ and remains hash-bound when recorded, but it is advisory rather than a package-publication gate.
84
117
  **Does not prove:** that a *changed* golden is an improvement — only that
85
118
  change was noticed. Judging the change still needs a human or the
86
119
  before/after harness (`eval/layout-compare`).
87
120
 
121
+ ## 2a. Registry-derived combinatorial conformance
122
+
123
+ `render-conformance-plan.test.ts` replaces the former exhaustive
124
+ family × Look × Palette docs-example matrix. The new family registry,
125
+ Style registries and mandatory family conformance profiles generate:
126
+
127
+ - exhaustive pure Look × Palette resolution;
128
+ - pairwise real-render coverage across family, Look, Palette, security,
129
+ background polarity and six complexity strata;
130
+ - higher-strength Look/Palette/background, family/backend/complexity,
131
+ palette-sensitive role, external-reference and contact-sheet obligations;
132
+ - a separate SVG/PNG/ASCII/Unicode portfolio with every-family Unicode stress.
133
+
134
+ An independently implemented tuple enumerator must report zero missing
135
+ obligations. Fake/removed-family, precedence, strict-reference, transparency,
136
+ seed and terminal sabotage probes guard fault sensitivity. A new `DiagramKind`
137
+ cannot compile without its minimal, representative, dense, text-stress,
138
+ family-risk and eval-corpus-outlier conformance material.
139
+
140
+ **Runs:** executable conformance and the bounded fault probes run per PR. The
141
+ larger citizenship/interaction/outlier contact sheets run when visual inputs
142
+ change, during periodic design review, or before release.
143
+ **Does not prove:** an unrendered three-way family/Look/Palette combination is
144
+ beautiful. The exact retained obligations are published by the candidate
145
+ report rather than implied by the word “exhaustive.”
146
+
88
147
  ## 3. Derived oracles — differential corpora
89
148
 
90
149
  The strongest defense against our own blind spots is testing against
@@ -94,10 +153,12 @@ sources we did not write:
94
153
  documentation; gates parse, verify, and round-trip.
95
154
  - **MermaidSeqBench** (132 IBM-curated sequence diagrams) — parse rate,
96
155
  structured-vs-opaque split, verify rate, round-trip stability.
97
- - **upstream-suite bench** (`eval/mermaid-upstream-suite-bench/`, 658
98
- imported cases from a *pinned* upstream commit) — with a **ratchet**
99
- (`ratchet.json`) that fails the build if coverage drops or per-family
100
- local-gap budgets grow.
156
+ - **upstream-suite bench** (`eval/mermaid-upstream-suite-bench/`, 736
157
+ executable cases / 746 imported blocks from pinned upstream commits) — with
158
+ a **ratchet** (`ratchet.json`) that fails the build if coverage drops or
159
+ per-family local-gap budgets grow. Mindmap/GitGraph use their declared
160
+ `f3dea583…` compatibility revision and account for all 26/69 official spec
161
+ blocks in a dedicated executable oracle.
101
162
 
102
163
  These exist because our hand-written fixtures encode what we already knew
103
164
  the parser modeled. Upstream examples are "adversarial in exactly the
@@ -125,7 +186,9 @@ must agree." This sidesteps the oracle problem without a human:
125
186
  suite).
126
187
  - **Determinism** — three separate processes produce byte-identical layout
127
188
  JSON; Bun and Node produce byte-identical JSON on the same source; ASCII
128
- and PNG output hash-stable across 10+ repeated runs.
189
+ and PNG output hash-stable across 10+ repeated runs. CI builds the Node bundle
190
+ before the unit shards so the Bun↔Node contracts cannot silently skip in a
191
+ clean checkout.
129
192
  - **Layout/faithfulness relations** — `property-layout-metamorphic.test.ts`
130
193
  formalizes relations that were previously implicit: determinism (same source
131
194
  ⇒ identical metrics), node-id **relabeling invariance** (ids carry no
@@ -148,14 +211,15 @@ default seed `20260702`). A red property in CI is therefore a real,
148
211
  reproducible counterexample — never a seed lottery. The 2026-07 audit caught
149
212
  three suites flaking on rolled seeds (the route-contracts certificate property
150
213
  at ~1 CI run in 7, issue #83; the parser Cartesian-product property; both now
151
- pin the exact seed that exposed their bug, scoped via save/restore so the
152
- global policy survives them).
214
+ pin the exact seed that exposed their bug through per-assert options, without
215
+ mutating process-global configuration).
153
216
 
154
217
  - Reproduce a specific roll: `AM_FC_SEED=<int> bun test <file>`.
155
- - Finder mode (deliberate randomness): `AM_FC_SEED=random bun test src/__tests__/`.
218
+ - Finder mode (deliberate randomness): `AM_FC_SEED=random bun run test`.
156
219
  - The policy is itself gated: `fc-seed-policy.test.ts` fails if the preload is
157
- unwired; `zzz-fc-seed-policy-epilogue.test.ts` (alphabetically last) fails if
158
- any suite wipes the pin instead of restoring it.
220
+ unwired and source-checks every test file so suite-specific seeds cannot use
221
+ process-global overrides in another shard; `zzz-fc-seed-policy-epilogue.test.ts`
222
+ also catches runtime drift within its own process.
159
223
 
160
224
  Pinning is for *holding* known ground; randomness is for *finding* new
161
225
  counterexamples ("an invariant enforced by a random property is a lottery,
@@ -166,37 +230,38 @@ swept across 48/24/12 seeds (scaled by runtime; 1,368 suite-runs total) with
166
230
  zero failures — the pin does not freeze a known-bad ticket, and the sweep is
167
231
  repeatable from the same knob.
168
232
 
169
- ## 5. Pseudo-oracles — is the suite itself strong enough?
233
+ ## 5. Pseudo-oracles — do selected seeded faults make the suite fail?
170
234
 
171
- Tests can be green and still worthless. Two gates test the tests:
235
+ Tests can be green while missing faults. Two bounded gates challenge selected
236
+ behaviors:
172
237
 
173
- - **Mutation testing (Stryker)** — scoped to the high-value ASCII/route
174
- core, ~20 named lanes (`stryker.*.config.json`). A *survived* mutant is a
175
- test gap until classified. Documented baseline kill rates are 38–75%,
176
- with a written survivor catalog and explicit "accepted" classifications
177
- (performance guards, unreachable-by-convention). Mutation testing has
178
- earned its keep: it falsified an audit assumption and found dead code the
179
- unit tests couldn't.
238
+ - **Incremental mutation testing (Stryker)** — mutates the small, pure
239
+ faithfulness counter on every PR. A full run takes about one minute and its
240
+ measured floor is enforced. Broader ASCII, route, and family configs remain
241
+ available as opt-in survivor harvests, not scheduled gates. A *survived*
242
+ mutant is a test gap until classified; the historical catalogs record
243
+ reviewed performance guards and unreachable-by-convention cases. Mutation
244
+ testing has earned its keep when focused: it falsified an audit assumption
245
+ and found dead code the unit tests couldn't.
180
246
  - **Sabotage suite** (`eval/sabotage/route-regressions.ts`) — deliberately
181
247
  reverts a fixed bug in a detached worktree and asserts the suite goes
182
- **red**, proving the regression test actually bites.
183
-
184
- **Runs:** the broad route lanes are **scheduled nightly**
185
- (`nightly-route-mutation.yml`: routes, route-certificates, subgraph-routing,
186
- sabotage-routes — the ascii lane is manual-only), but every scheduled run since
187
- 2026-06-19 has been cancelled at the 90-minute cap before producing a score
188
- (the unsharded routes lane alone exceeds it; PR #63 carries the sharding fix) —
189
- until that lands, regenerate scores locally. A narrow module takes 5–15 minutes
190
- locally; the full routes lane substantially longer. A **fast
191
- incremental lane** (`stryker.incremental.config.json`, the `mutation-incremental`
192
- CI job) mutates only the small pure faithfulness counter
193
- (`src/agent/structural-count.ts`) with a sub-second unit runner, so it gates
194
- **per-PR** (~1 min, measured 96% kill / break-threshold 90).
195
- **Why this matters:** line coverage is reported per-PR but is a weak
248
+ **red**, proving five named route/link regression tests actually bite.
249
+
250
+ The broad scheduled mutation matrix was retired after 26 consecutive scheduled
251
+ runs produced no success and its final repair grew to 39 coverage workers (41
252
+ jobs total). The configs still
253
+ emit useful local scores and JSON reports, but have no break floors and carry no
254
+ acceptance authority. `docs/mutation-testing.md` records the commands, survivor
255
+ history, retained operational evidence, and re-enrollment criteria.
256
+
257
+ **Why this matters:** line coverage is reported per-PR as one merged LCOV
258
+ artifact assembled from the three unit shards, but it is a weak
196
259
  adequacy signal — coverage is not strongly correlated with fault detection
197
260
  once suite size is controlled (Inozemtseva & Holmes, ICSE 2014), whereas
198
261
  mutant detection *is* correlated with real-fault detection (Just et al.,
199
- FSE 2014). The mutation score is the truer number; today it comes from local runs (the nightly lane times out — see above).
262
+ FSE 2014). That supports focused mutation as one useful instrument, not mutation
263
+ score as a universal truth. Behavioral, property, differential, sabotage,
264
+ coverage, and mutation evidence answer different questions.
200
265
 
201
266
  ## 6. Heuristic / perceptual oracles — geometry inside human bounds
202
267
 
@@ -204,8 +269,8 @@ This is where we approximate aesthetics deterministically:
204
269
 
205
270
  - **`measureQuality` / `checkQuality`** — edge crossings, label
206
271
  legibility, whitespace balance, label-edge proximity, aspect ratio,
207
- gated by `QualityBounds`. Cheap and deterministic; covers all twelve
208
- renderable families via `RenderedLayout` adapters.
272
+ gated by `QualityBounds`. Cheap and deterministic; covers every registered
273
+ renderable family via `RenderedLayout` adapters.
209
274
  - **ugly-detector** (`eval/ugly-detector/`) — geometric defect detection:
210
275
  diagonal segments, floating endpoints, edges through nodes, hitches.
211
276
  - **layout rubric / visual-rubric** — hard violations (must be 0) plus soft
@@ -262,17 +327,51 @@ real judge run can.
262
327
  `ci.yml` is the source of truth for what gates each PR — read it rather than a
263
328
  table here, which would drift. In broad strokes:
264
329
 
265
- - **Per-PR (`ci.yml`):** the unit/property suite (`bun test src/__tests__/`) —
330
+ - **Per-PR (`ci.yml`):** the three-shard unit/property suite (`bun run test`) —
266
331
  Tier-1 verify, goldens, the differential + faithfulness + metamorphic gates,
267
- `measureQuality`/ugly-detector/layout-rubric, the heuristic-tracker ratchet,
268
- the corpus/seqbench/upstream benches — plus type check, the hero check, the
269
- golden-drift gate, the browser/CLI/binary e2e job, and the fast incremental
270
- mutation lane.
271
- - **Nightly (`nightly-route-mutation.yml`):** the broad Stryker route lanes
272
- and the sabotage suite (scheduled; currently cancelled at the timeout every
273
- run — see §5).
274
- - **Manual / periodic:** `layout-compare` before/after, the benchmark vs
275
- competitors, and the real LLM-as-judge run.
332
+ `measureQuality`/whole-corpus ugly-detector/layout-rubric, the heuristic-tracker ratchet,
333
+ the corpus/seqbench/upstream benches — plus the high/critical dependency audit,
334
+ type check, the hero check, the
335
+ golden-drift gate, the parallel browser/CLI/binary/fuzz e2e matrix, the fast
336
+ incremental mutation lane, and the independent focused sabotage lane. A final
337
+ `CI complete` job waits for the required test aggregate, every E2E matrix job,
338
+ and mutation, providing one protectable result that cannot turn green early.
339
+ - **Manual / periodic:** opt-in broad Stryker survivor harvests,
340
+ `layout-compare` before/after, the benchmark vs competitors, and the real
341
+ LLM-as-judge run.
342
+
343
+ ## Boundary-contract matrix — lessons applied from the 2026-07 agent audit
344
+
345
+ The PR #162 audit exposed a blind spot that family/layout coverage did not
346
+ address: a contract could be correct in one helper and false at another public
347
+ boundary. The review of
348
+ [`adewale/testing-best-practices`](https://github.com/adewale/testing-best-practices)
349
+ led to four concrete changes in how this suite treats those seams:
350
+
351
+ | Risk boundary | Previous false confidence | Required evidence now |
352
+ |---|---|---|
353
+ | JSON-RPC wire lexemes | hosted integer example only | one shared exact-id codec; property tests over unsafe integer, decimal, exponent, batch, nested-id, sentinel-collision, and malformed-text cases; real local HTTP and installed stdio-bin checks |
354
+ | CLI bootstrap/package | formatter helper unit test | walking-skeleton E2E against the real `am` and MCP source entrypoints in a copied checkout with Bun auto-install explicitly disabled |
355
+ | cache before dispatch | normalized-key examples | non-idempotent `execute` is uncacheable; remaining keys retain the complete raw argument object so a warm valid request cannot mask an invalid one; warm-cache regression tests inject the collision |
356
+ | docs/catalog claims | selected-subset presence checks | ordered exact equality against runtime registries, uniqueness, and existence of every catalog target; public `llms.txt` is checked after generation |
357
+ | sequence semantics | global message count | one shared branch-aware message-context model feeds describe, facts, verify/layout and typed edits; unsupported nested semantics must emit a warning |
358
+ | sockets/proxies/chunks | helper could return early | socket tests fail when bind/startup fails, proxy-origin SSE is read from the real stream, and split UTF-8 chunks are exercised at the byte boundary |
359
+
360
+ These follow the research's trust-boundary lens, walking-skeleton smoke tests,
361
+ property-based parser contracts, exact doc-sync, fault injection, and
362
+ correctness-by-construction guidance. Shared validators/codecs/context models
363
+ replace repeated per-layer checks; tests remain at the untyped HTTP/stdio/CLI
364
+ boundaries where TypeScript cannot enforce the wire contract.
365
+
366
+ The dated provenance and prevention analysis, including the reviews of PRs
367
+ #157 and #160, is recorded in
368
+ [`project/agent-interface-contract-audit-2026-07.md`](./project/agent-interface-contract-audit-2026-07.md).
369
+
370
+ The validation rule for future cross-surface changes is: enumerate every
371
+ public consumer first, then require at least one non-vacuous proof at the
372
+ lowest honest tier and one shipped-boundary proof where packaging, transport,
373
+ or generation can change the result. A test that silently returns because its
374
+ environment is unavailable is not evidence for a CI-required capability.
276
375
 
277
376
  ## Why the suite is shaped this way
278
377
 
@@ -300,23 +399,32 @@ gates rather than adding new machinery:
300
399
  admittedly rough. The CI LLM mock's readability/aesthetics axes remain
301
400
  metric-derived (only its faithfulness axis is now independent), so it
302
401
  cannot validate those metrics — only a real periodic judge run can.
303
- 2. The *broad* mutation lanes and sabotage are scheduled nightly but the
304
- schedule has never completed a run (timeout — see §5); a fast incremental
305
- lane gates the faithfulness counter per-PR, so most core modules' adequacy
306
- is currently measured only by local runs. Line coverage is no
307
- longer the per-PR headline (it is framed as a finder).
402
+ 2. Automatic mutation assurance is deliberately narrow: PR feedback uses the
403
+ fast incremental faithfulness-counter lane plus five focused sabotage probes.
404
+ Broad mutation configs are manual diagnostics because the retired scheduled
405
+ matrix did not justify its runner and maintenance cost. Line coverage is
406
+ framed as a finder, not a headline score.
308
407
  3. The benchmark is not on the PR gate (timing variance). Browser/screenshot
309
408
  e2e and the heuristic-tracker ratchet now are.
310
409
  4. Determinism is proven Bun↔Node on one architecture; cross-architecture
311
410
  byte equality is not asserted.
312
411
  5. `QualityBounds` thresholds are now provenance-tagged, but the `chosen`
313
412
  bands are still not validated against human-perception evidence.
314
- 6. The snapshot drift sentinel warns but does not block.
413
+ 6. Golden movement still needs human judgment, but the snapshot drift sentinel
414
+ blocks unless the change is committed with the explicit `[approve-goldens]`
415
+ review token; the token proves acknowledgment, not visual quality.
315
416
 
316
417
  The deepest gap is structural, and `project/lessons-learned.md` (Loop 13)
317
418
  names it: every quality signal here is self-generated. The portfolio above
318
419
  produces breadth and internal consistency; it cannot substitute for a real
319
- external consumer.
420
+ external consumer. One boundary is now an exception: the MCP transport is
421
+ exercised by the reference `@modelcontextprotocol/sdk` client
422
+ (`src/__tests__/mcp-client-interop.test.ts`, per
423
+ `project/mcp-client-interop-verification-plan.md`) — a consumer we did not
424
+ write — over a real socket (hosted) and a real subprocess (stdio). That
425
+ closes the self-generated loop for the one boundary where a canonical
426
+ external consumer exists off the shelf; every other signal above remains
427
+ self-generated.
320
428
 
321
429
  ## References
322
430
 
package/docs/theming.md CHANGED
@@ -1,9 +1,9 @@
1
- # Theming
1
+ # Palettes and theming
2
2
 
3
3
  Agentic Mermaid themes start from a two-color contract (`bg`, `fg`) and can be enriched with optional semantic slots. This keeps diagrams usable in live editors, documentation pages, and agent-generated artifacts without requiring a large design-token object.
4
4
 
5
- > **Themes are styles.** Every built-in theme also registers as a
6
- > palette-only *style*, so its name works anywhere a style is accepted and
5
+ > **Palette is the registry kind.** Every built-in theme registers as a
6
+ > palette-only *style*, so its stable input name works anywhere a style is accepted and
7
7
  > composes with full looks by stacking: `{ style: ['hand-drawn', 'dracula'] }`
8
8
  > renders hand-drawn geometry with the Dracula palette. See
9
9
  > [docs/style-authoring.md](./style-authoring.md) for the full model.
@@ -64,36 +64,16 @@ const svg = renderMermaidSVG(source, {
64
64
 
65
65
  Because the generated SVG references variables directly, host pages can switch light/dark themes without re-rendering the diagram.
66
66
 
67
- ## Built-in themes
68
-
69
- Agentic Mermaid ships **21 built-in themes**:
70
-
71
- - `paper`
72
- - `dusk`
73
- - `zinc-light`
74
- - `zinc-dark`
75
- - `tokyo-night`
76
- - `tokyo-night-storm`
77
- - `tokyo-night-light`
78
- - `catppuccin-mocha`
79
- - `catppuccin-latte`
80
- - `nord`
81
- - `nord-light`
82
- - `dracula`
83
- - `github-light`
84
- - `github-dark`
85
- - `solarized-light`
86
- - `solarized-dark`
87
- - `one-dark`
88
- - `salmon`
89
- - `salmon-dark`
90
- - `tufte`
91
- - `tufte-dark`
67
+ ## Built-in Palettes
68
+
69
+ `theme` is not a registry kind; discovery returns `kind: "palette"`.
70
+ Discover current Palette identities and stable input names with
71
+ `knownStyleDescriptors()` or `am styles`; this guide does not copy the registry.
92
72
 
93
73
  ```ts
94
- import { THEMES, renderMermaidSVG } from 'agentic-mermaid'
74
+ import { renderMermaidSVG } from 'agentic-mermaid'
95
75
 
96
- const svg = renderMermaidSVG(source, THEMES['tokyo-night'])
76
+ const svg = renderMermaidSVG(source, { style: 'tokyo-night' })
97
77
  ```
98
78
 
99
79
  ## Custom themes
@@ -122,7 +102,7 @@ renderMermaidSVG(source, myTheme)
122
102
 
123
103
  Turn a Shiki or VS Code theme into a diagram palette:
124
104
 
125
- ```ts
105
+ ```ts no-run
126
106
  import { fromShikiTheme, renderMermaidSVG } from 'agentic-mermaid'
127
107
  import githubDark from 'shiki/themes/github-dark.mjs'
128
108
 
@@ -147,7 +127,11 @@ For per-element emphasis, keep using Mermaid-native directives such as `classDef
147
127
 
148
128
  ## Security and fonts
149
129
 
150
- Default SVG output includes a Google Fonts `@import` for convenience. For offline, strict, or agent-generated artifacts, use either:
130
+ Default SVG output can include Google Fonts `@import` rules. The selected font
131
+ gets one only when it is a single plain family name; class and ER diagrams can
132
+ also import JetBrains Mono for monospace labels. CSS-variable references and
133
+ font stacks do not produce an import for the selected family. For offline,
134
+ strict, or agent-generated artifacts, use either:
151
135
 
152
136
  ```ts
153
137
  renderMermaidSVG(source, { embedFontImport: false })
@@ -160,3 +144,6 @@ renderMermaidSVG(source, { security: 'strict' })
160
144
  ```
161
145
 
162
146
  `security: 'strict'` disables external-fetch references and is the recommended default for untrusted diagrams.
147
+
148
+ For custom Style font selection, browser faces, PNG `fontDirs`, fallbacks, and
149
+ output-surface differences, see [Fonts in custom styles](./custom-fonts.md).
@@ -0,0 +1,54 @@
1
+ {
2
+ "version": 1,
3
+ "sample": "cupertino-prototype.mmd",
4
+ "examples": [
5
+ {
6
+ "id": "cupertino-prototype",
7
+ "style": "cupertino-prototype.style.json",
8
+ "screenshot": "cupertino-prototype.png",
9
+ "alt": "Documentation-only Cupertino-inspired public StyleSpec prototype",
10
+ "summary": "uses public role geometry, elevation, and inspect-only constraints to demonstrate concentric corner curves and rounded connector bends; it is not an Apple product, an endorsed implementation, or a built-in Agentic Mermaid Style.",
11
+ "docsOnly": true,
12
+ "renderOptions": { "shadow": true }
13
+ },
14
+ {
15
+ "id": "vercel-inspired-prototype",
16
+ "style": "vercel-inspired-prototype.style.json",
17
+ "sample": "vercel-inspired-prototype.mmd",
18
+ "screenshot": "vercel-inspired-prototype.png",
19
+ "alt": "Documentation-only Vercel-inspired public StyleSpec prototype",
20
+ "summary": "uses public role styles, XYChart category bindings, semantic slots, and inspect-only constraints; it is not a Vercel product, an endorsed implementation, or a built-in Agentic Mermaid Style.",
21
+ "docsOnly": true
22
+ },
23
+ {
24
+ "id": "cloudflare-workers-inspired-prototype",
25
+ "style": "cloudflare-workers-inspired-prototype.style.json",
26
+ "sample": "cloudflare-workers-inspired-prototype.mmd",
27
+ "screenshot": "cloudflare-workers-inspired-prototype.png",
28
+ "alt": "Documentation-only Cloudflare Workers-inspired public StyleSpec prototype",
29
+ "summary": "uses public role styles, Gantt section bindings, visible non-color cues, semantic slots, and inspect-only constraints; it is not a Cloudflare product, an endorsed implementation, or a built-in Agentic Mermaid Style.",
30
+ "docsOnly": true
31
+ },
32
+ {
33
+ "id": "transit-route-map",
34
+ "style": "transit-route-map.style.json",
35
+ "screenshot": "transit-route-map.png",
36
+ "alt": "Transit route map custom style",
37
+ "summary": "stresses thick connectors, rounded bends, compact station labels, and group labels."
38
+ },
39
+ {
40
+ "id": "mid-century-report",
41
+ "style": "mid-century-report.style.json",
42
+ "screenshot": "mid-century-report.png",
43
+ "alt": "Mid-century report custom style",
44
+ "summary": "uses palette, solid fills, typography, corners, and section bands without a custom renderer."
45
+ },
46
+ {
47
+ "id": "star-chart-atlas",
48
+ "style": "star-chart-atlas.style.json",
49
+ "screenshot": "star-chart-atlas.png",
50
+ "alt": "Star chart atlas custom style",
51
+ "summary": "tests dark-page tokens, grid backdrop, pale strokes, and serif labels."
52
+ }
53
+ ]
54
+ }
@@ -0,0 +1,9 @@
1
+ gantt
2
+ title Workers delivery
3
+ dateFormat YYYY-MM-DD
4
+ section Edge
5
+ Route request :done, route, 2026-01-05, 2d
6
+ Deploy isolate :crit, deploy, after route, 3d
7
+ section Runtime
8
+ Execute worker :run, after deploy, 4d
9
+ Observe release :milestone, observe, after run, 0d
@@ -0,0 +1,110 @@
1
+ {
2
+ "$schema": "https://agentic-mermaid.dev/schemas/style-spec.schema.json",
3
+ "formatVersion": 1,
4
+ "name": "look:cloudflare-workers-inspired-prototype",
5
+ "blurb": "Documentation-only Cloudflare Workers-inspired prototype exercising public role styles, Gantt category bindings, non-color cues, and inspect-only constraints; not built in or endorsed.",
6
+ "colors": {
7
+ "bg": "#f5f1eb",
8
+ "fg": "#521000",
9
+ "line": "#835446",
10
+ "accent": "#ff4801",
11
+ "muted": "#835446",
12
+ "surface": "#fffbf5",
13
+ "border": "#ebd5c1"
14
+ },
15
+ "font": "Inter",
16
+ "stroke": "crisp",
17
+ "strokeWidth": 1.25,
18
+ "intent": "premium",
19
+ "roles": {
20
+ "node": {
21
+ "fontSize": 13,
22
+ "fontWeight": 500,
23
+ "paddingX": 22,
24
+ "paddingY": 12,
25
+ "cornerRadius": 8,
26
+ "lineWidth": 1,
27
+ "fillColor": "#fffbf5",
28
+ "borderColor": "#ebd5c1",
29
+ "textColor": "#521000"
30
+ },
31
+ "edge": {
32
+ "fontSize": 11,
33
+ "fontWeight": 400,
34
+ "letterSpacing": 0.1,
35
+ "lineWidth": 1.25,
36
+ "bendRadius": 10,
37
+ "strokeColor": "#835446",
38
+ "textColor": "#835446"
39
+ },
40
+ "group": {
41
+ "fontFamily": "Share Tech Mono",
42
+ "fontSize": 11,
43
+ "fontWeight": 400,
44
+ "letterSpacing": 0.6,
45
+ "textTransform": "uppercase",
46
+ "paddingX": 18,
47
+ "paddingY": 18,
48
+ "cornerRadius": 12,
49
+ "lineWidth": 1,
50
+ "fillColor": "rgba(255,72,1,0.04)",
51
+ "headerFillColor": "rgba(255,72,1,0.08)",
52
+ "borderColor": "#ebd5c1",
53
+ "textColor": "#835446"
54
+ },
55
+ "label": {
56
+ "fontSize": 11,
57
+ "fontWeight": 400,
58
+ "letterSpacing": 0.1,
59
+ "textColor": "#835446"
60
+ },
61
+ "group-header": {
62
+ "fontFamily": "Share Tech Mono",
63
+ "fontSize": 11,
64
+ "fontWeight": 700,
65
+ "letterSpacing": 0.5,
66
+ "textTransform": "uppercase",
67
+ "textColor": "#521000",
68
+ "fillColor": "rgba(255,72,1,0.08)",
69
+ "borderColor": "#ebd5c1",
70
+ "lineWidth": 1
71
+ },
72
+ "task": {
73
+ "fillColor": "#fff0e8",
74
+ "borderColor": "#c2410c",
75
+ "lineWidth": 1.5,
76
+ "cue": "outline"
77
+ },
78
+ "milestone": {
79
+ "fillColor": "#ff4801",
80
+ "borderColor": "#8a2600",
81
+ "lineWidth": 2,
82
+ "cue": "pattern"
83
+ }
84
+ },
85
+ "semanticSlots": {
86
+ "edge-work": {
87
+ "fillColor": "#fff0e8",
88
+ "borderColor": "#c2410c",
89
+ "strokeColor": "#c2410c",
90
+ "lineWidth": 1.5,
91
+ "cue": "outline"
92
+ },
93
+ "runtime-work": {
94
+ "fillColor": "#ff4801",
95
+ "borderColor": "#8a2600",
96
+ "strokeColor": "#8a2600",
97
+ "lineWidth": 2,
98
+ "cue": "pattern"
99
+ }
100
+ },
101
+ "bindings": [
102
+ { "channel": "category", "value": "Edge", "slot": "edge-work", "role": "task" },
103
+ { "channel": "category", "value": "Runtime", "slot": "runtime-work", "role": "task" },
104
+ { "channel": "category", "value": "Runtime", "slot": "runtime-work", "role": "milestone" }
105
+ ],
106
+ "constraints": [
107
+ { "kind": "contrast", "action": "warn", "minimum": 4.5 },
108
+ { "kind": "accent-area", "action": "warn", "maxFraction": 0.35 }
109
+ ]
110
+ }
@@ -0,0 +1,10 @@
1
+ flowchart LR
2
+ subgraph Core["Routing core"]
3
+ Intake["Intake"] --> Validate{"Valid?"}
4
+ Validate -- yes --> Render["Render SVG"]
5
+ Validate -- no --> Repair["Repair source"]
6
+ Repair --> Validate
7
+ end
8
+ Render --> Export["Export PNG"]
9
+ Render --> Audit["Contrast audit"]
10
+ Audit --> Export