agentic-mermaid 0.4.1 → 0.5.3

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 (253) hide show
  1. package/AGENT_NATIVE.md +94 -627
  2. package/CHANGELOG.md +651 -0
  3. package/Instructions_for_agents.md +44 -23
  4. package/LICENSES/Khroma-MIT.txt +21 -0
  5. package/LICENSES/Mermaid-MIT.txt +21 -0
  6. package/LICENSES/es-toolkit-MIT.txt +21 -0
  7. package/LICENSES/pele-MIT.txt +40 -0
  8. package/LICENSES/zenuml-core-MIT.txt +21 -0
  9. package/README.md +93 -50
  10. package/SECURITY.md +28 -12
  11. package/THIRD_PARTY_NOTICES.md +60 -0
  12. package/assets/hero.png +0 -0
  13. package/dist/agent-core.d.ts +478 -210
  14. package/dist/agent-core.js +1 -396
  15. package/dist/agent.d.ts +17 -8
  16. package/dist/agent.js +1 -408
  17. package/dist/agentic-mermaid-mcp.js +1 -11
  18. package/dist/am.js +1 -34562
  19. package/dist/browser-lazy/chunks/agentic-producer-core-CC6OOLDW.js +1 -0
  20. package/dist/browser-lazy/chunks/architecture-QUFVKYJR.js +13 -0
  21. package/dist/browser-lazy/chunks/block-6J3Q63BO.js +11 -0
  22. package/dist/browser-lazy/chunks/builtin-backends-7SOZZHPF.js +12 -0
  23. package/dist/browser-lazy/chunks/c4-SQVBZAKJ.js +10 -0
  24. package/dist/browser-lazy/chunks/chunk-2GPK4VFF.js +5 -0
  25. package/dist/browser-lazy/chunks/chunk-2I4UPL7Q.js +3 -0
  26. package/dist/browser-lazy/chunks/chunk-2SH76OTH.js +1 -0
  27. package/dist/browser-lazy/chunks/chunk-2UIA2IME.js +3 -0
  28. package/dist/browser-lazy/chunks/chunk-4LHYF3BS.js +1 -0
  29. package/dist/browser-lazy/chunks/chunk-5B2Z7575.js +1 -0
  30. package/dist/browser-lazy/chunks/chunk-5FQ534HP.js +1 -0
  31. package/dist/browser-lazy/chunks/chunk-5UVGUSD6.js +1 -0
  32. package/dist/browser-lazy/chunks/chunk-5X6MJX3H.js +1 -0
  33. package/dist/browser-lazy/chunks/chunk-AMJLVPUB.js +4 -0
  34. package/dist/browser-lazy/chunks/chunk-BU5LHXNJ.js +3 -0
  35. package/dist/browser-lazy/chunks/chunk-BY2CPG6B.js +1 -0
  36. package/dist/browser-lazy/chunks/chunk-CN7WTBWB.js +1 -0
  37. package/dist/browser-lazy/chunks/chunk-CQE4HQEW.js +1 -0
  38. package/dist/browser-lazy/chunks/chunk-CSFUKSU6.js +1 -0
  39. package/dist/browser-lazy/chunks/chunk-DF6765YX.js +17 -0
  40. package/dist/browser-lazy/chunks/chunk-E2WMJZNM.js +1 -0
  41. package/dist/browser-lazy/chunks/chunk-FAIMVOX5.js +6 -0
  42. package/dist/browser-lazy/chunks/chunk-GVOEAY52.js +1 -0
  43. package/dist/browser-lazy/chunks/chunk-HLWUNUCM.js +1 -0
  44. package/dist/browser-lazy/chunks/chunk-ICC7HBJX.js +1 -0
  45. package/dist/browser-lazy/chunks/chunk-J35HAQQF.js +20 -0
  46. package/dist/browser-lazy/chunks/chunk-J7FFAFQF.js +1 -0
  47. package/dist/browser-lazy/chunks/chunk-LH7HUDKW.js +1 -0
  48. package/dist/browser-lazy/chunks/chunk-N5ELX7LR.js +2 -0
  49. package/dist/browser-lazy/chunks/chunk-NMQQMRIR.js +1 -0
  50. package/dist/browser-lazy/chunks/chunk-NO7ZIVRU.js +1 -0
  51. package/dist/browser-lazy/chunks/chunk-OZ443IVJ.js +16 -0
  52. package/dist/browser-lazy/chunks/chunk-PQGPS2YV.js +7 -0
  53. package/dist/browser-lazy/chunks/chunk-QA6GJQ4X.js +1 -0
  54. package/dist/browser-lazy/chunks/chunk-RIVTHZAQ.js +1 -0
  55. package/dist/browser-lazy/chunks/chunk-SZELX2EJ.js +1 -0
  56. package/dist/browser-lazy/chunks/chunk-TYZOZXUJ.js +22 -0
  57. package/dist/browser-lazy/chunks/chunk-UL6NDWLL.js +1 -0
  58. package/dist/browser-lazy/chunks/chunk-VQYYGAXP.js +1 -0
  59. package/dist/browser-lazy/chunks/chunk-VWVZGQE2.js +1 -0
  60. package/dist/browser-lazy/chunks/chunk-X2UYKWKM.js +4 -0
  61. package/dist/browser-lazy/chunks/chunk-YCEICNM6.js +1 -0
  62. package/dist/browser-lazy/chunks/chunk-Z3FDIVLN.js +20 -0
  63. package/dist/browser-lazy/chunks/class-5QA4SCTS.js +13 -0
  64. package/dist/browser-lazy/chunks/decode-63UIZGD2.js +1 -0
  65. package/dist/browser-lazy/chunks/elk.bundled-L4CADV5W.js +24 -0
  66. package/dist/browser-lazy/chunks/er-7ZSKGN7Y.js +11 -0
  67. package/dist/browser-lazy/chunks/eventmodeling-2BPLHWRN.js +19 -0
  68. package/dist/browser-lazy/chunks/flowchart-NEIMZTB5.js +4 -0
  69. package/dist/browser-lazy/chunks/forest-implementation-AEP24AIP.js +1 -0
  70. package/dist/browser-lazy/chunks/gantt-RDPIFYAF.js +11 -0
  71. package/dist/browser-lazy/chunks/gitgraph-N4Y5RYB7.js +9 -0
  72. package/dist/browser-lazy/chunks/ishikawa-LD3YBDJN.js +6 -0
  73. package/dist/browser-lazy/chunks/journey-6YQR5DJX.js +16 -0
  74. package/dist/browser-lazy/chunks/kanban-PLMJ7NBW.js +20 -0
  75. package/dist/browser-lazy/chunks/mermaid-yaml-runtime-QVYX4EWK.js +136 -0
  76. package/dist/browser-lazy/chunks/mindmap-K2UBFO3Y.js +12 -0
  77. package/dist/browser-lazy/chunks/packet-CUW4QY6Y.js +7 -0
  78. package/dist/browser-lazy/chunks/pie-7F7UUCG3.js +15 -0
  79. package/dist/browser-lazy/chunks/quadrant-TOONO2WC.js +10 -0
  80. package/dist/browser-lazy/chunks/radar-J6JVWVAX.js +16 -0
  81. package/dist/browser-lazy/chunks/render-core-BZOM3K7D.js +3 -0
  82. package/dist/browser-lazy/chunks/requirement-CMAKDJPO.js +19 -0
  83. package/dist/browser-lazy/chunks/sankey-AWXQEP3F.js +13 -0
  84. package/dist/browser-lazy/chunks/sequence-Q2RJRB4L.js +5 -0
  85. package/dist/browser-lazy/chunks/state-WRBFQEDX.js +4 -0
  86. package/dist/browser-lazy/chunks/timeline-D2KILFXM.js +6 -0
  87. package/dist/browser-lazy/chunks/treemap-N3VYX5D4.js +6 -0
  88. package/dist/browser-lazy/chunks/xychart-G73OGK66.js +16 -0
  89. package/dist/browser-lazy/chunks/zenuml-H4BXNYXR.js +16 -0
  90. package/dist/browser-lazy/index.d.ts +544 -275
  91. package/dist/browser-lazy/index.js +1 -1
  92. package/dist/browser.global.js +802 -565
  93. package/dist/chunk-3LGLPG33.js +2 -0
  94. package/dist/chunk-7CRDX2QR.js +2 -0
  95. package/dist/chunk-7PPW2BMO.js +2 -0
  96. package/dist/chunk-DQDKA5ND.js +2 -0
  97. package/dist/chunk-EHCMJUMD.js +52 -0
  98. package/dist/chunk-GVCHLSHH.js +4 -0
  99. package/dist/chunk-H3NCS2XZ.js +19 -0
  100. package/dist/chunk-JZOJ4YGS.js +201 -0
  101. package/dist/chunk-MKE7GNYU.js +146 -0
  102. package/dist/chunk-NKNFOREZ.js +2 -0
  103. package/dist/chunk-O7H2UX5K.js +2 -0
  104. package/dist/chunk-OMY6NRQD.js +58 -0
  105. package/dist/chunk-UA234O4M.js +4 -0
  106. package/dist/chunk-VUFVLGTH.js +2 -0
  107. package/dist/chunk-XU5LPD2D.js +2 -0
  108. package/dist/cli-YGGTJZH7.js +226 -0
  109. package/dist/elk-constructor.js +2 -0
  110. package/dist/elk-constructor.node.js +11 -0
  111. package/dist/index-EeXqJXr5.d.ts +1223 -0
  112. package/dist/index.d.ts +4 -1
  113. package/dist/index.js +1 -334
  114. package/dist/jsonl-RPJY6YWO.js +2 -0
  115. package/dist/mcp-cli-63DYXTVD.js +2 -0
  116. package/dist/{index-BGA_-6LV.d.ts → paint-certification-6rwQjIv_.d.ts} +5283 -6173
  117. package/dist/server-5NEOHOFS.js +524 -0
  118. package/dist/svg-styles-BdnoM7AT.d.ts +724 -0
  119. package/dist/svg-styles.d.ts +1 -0
  120. package/dist/svg-styles.js +2 -0
  121. package/dist/svg.d.ts +13 -0
  122. package/dist/svg.js +2 -0
  123. package/dist/types-BcS52Mjt.d.ts +1360 -0
  124. package/dist/zenuml/chunks/appearance-UOQ5KA6O.js +1 -0
  125. package/dist/zenuml/chunks/builtin-backends-KDKE7YHO.js +12 -0
  126. package/dist/zenuml/chunks/chunk-42DXZ5C6.js +4 -0
  127. package/dist/zenuml/chunks/chunk-7TVYPTDW.js +1 -0
  128. package/dist/zenuml/chunks/chunk-EVPSMEKN.js +1 -0
  129. package/dist/zenuml/chunks/chunk-OXQWRSBM.js +20 -0
  130. package/dist/zenuml/chunks/chunk-QWX77U7G.js +2 -0
  131. package/dist/zenuml/chunks/chunk-RLJEI7YN.js +29 -0
  132. package/dist/zenuml/chunks/chunk-RZ6XK5CD.js +29 -0
  133. package/dist/zenuml/chunks/decode-BWERFDGK.js +1 -0
  134. package/dist/zenuml/chunks/mermaid-yaml-runtime-KZVU74WU.js +136 -0
  135. package/dist/zenuml/chunks/render-core-V5RQ737O.js +3 -0
  136. package/dist/zenuml/chunks/zenuml-EA2ZFRUX.js +20 -0
  137. package/dist/zenuml-frame.global.js +3626 -0
  138. package/dist/zenuml.d.ts +83 -0
  139. package/dist/zenuml.js +1 -0
  140. package/docs/MCP-DIRECTORY-LISTINGS.md +5 -1
  141. package/docs/README.md +59 -103
  142. package/docs/agent-api-cookbook.md +26 -16
  143. package/docs/agent-mutation-policy.md +86 -15
  144. package/docs/agent-workflow-examples.md +1 -1
  145. package/docs/api-advanced.md +385 -0
  146. package/docs/api.md +320 -366
  147. package/docs/ascii.md +40 -4
  148. package/docs/browser.md +46 -7
  149. package/docs/choosing-a-diagram.md +148 -0
  150. package/docs/code-mode-impact.md +1 -0
  151. package/docs/comparison.md +244 -28
  152. package/docs/computational-aesthetics-prototype-plan.md +10 -10
  153. package/docs/config.md +60 -2
  154. package/docs/custom-fonts.md +78 -21
  155. package/docs/diagram-families.md +160 -10
  156. package/docs/eventmodeling-and-zenuml.md +165 -0
  157. package/docs/features.md +21 -19
  158. package/docs/fork-differences.md +105 -32
  159. package/docs/getting-started.md +56 -51
  160. package/docs/layout-certification.md +126 -0
  161. package/docs/mcp-code-mode-rationale.md +20 -12
  162. package/docs/mcp-http-transport.md +14 -8
  163. package/docs/quality.md +145 -15
  164. package/docs/react.md +76 -31
  165. package/docs/style-authoring.md +23 -11
  166. package/docs/svg-semantic-contract.md +104 -4
  167. package/docs/testing-strategy.md +684 -126
  168. package/docs/theming.md +27 -8
  169. package/examples/styles/readme-hero.md +25 -0
  170. package/examples/styles/readme-hero.mmd +13 -0
  171. package/examples/styles/readme-hero.style.json +7 -0
  172. package/package.json +114 -57
  173. package/server.json +2 -2
  174. package/skills/agentic-mermaid-diagram-workflow/SKILL.md +26 -8
  175. package/skills/agentic-mermaid-diagram-workflow/references/cli.md +13 -3
  176. package/skills/agentic-mermaid-diagram-workflow/references/code-mode.md +2 -1
  177. package/skills/agentic-mermaid-diagram-workflow/references/flowchart.md +9 -6
  178. package/skills/agentic-mermaid-diagram-workflow/references/hosted-mcp.md +1 -0
  179. package/skills/agentic-mermaid-diagram-workflow/references/sequence.md +4 -3
  180. package/skills/agentic-mermaid-diagram-workflow/references/timeline.md +7 -6
  181. package/skills/agentic-mermaid-diagram-workflow/references/upstream/agentflow.md +574 -0
  182. package/skills/agentic-mermaid-diagram-workflow/references/upstream/architecture.md +10 -2
  183. package/skills/agentic-mermaid-diagram-workflow/references/upstream/c4.md +18 -0
  184. package/skills/agentic-mermaid-diagram-workflow/references/upstream/classDiagram.md +123 -0
  185. package/skills/agentic-mermaid-diagram-workflow/references/upstream/cynefin.md +6 -1
  186. package/skills/agentic-mermaid-diagram-workflow/references/upstream/entityRelationshipDiagram.md +129 -9
  187. package/skills/agentic-mermaid-diagram-workflow/references/upstream/eventmodeling.md +22 -0
  188. package/skills/agentic-mermaid-diagram-workflow/references/upstream/flowchart.md +188 -60
  189. package/skills/agentic-mermaid-diagram-workflow/references/upstream/gitgraph.md +13 -7
  190. package/skills/agentic-mermaid-diagram-workflow/references/upstream/mindmap.md +110 -1
  191. package/skills/agentic-mermaid-diagram-workflow/references/upstream/packet.md +38 -0
  192. package/skills/agentic-mermaid-diagram-workflow/references/upstream/requirementDiagram.md +115 -0
  193. package/skills/agentic-mermaid-diagram-workflow/references/upstream/sequenceDiagram.md +101 -0
  194. package/skills/agentic-mermaid-diagram-workflow/references/upstream/stateDiagram.md +87 -0
  195. package/skills/agentic-mermaid-diagram-workflow/references/upstream/swimlanes.md +105 -2
  196. package/skills/agentic-mermaid-diagram-workflow/references/upstream/timeline.md +12 -6
  197. package/skills/agentic-mermaid-diagram-workflow/references/upstream/usecase.md +953 -0
  198. package/skills/agentic-mermaid-diagram-workflow/references/upstream/venn.md +77 -0
  199. package/skills/agentic-mermaid-diagram-workflow/references/upstream/xyChart.md +1 -1
  200. package/dist/browser-lazy/chunks/architecture-KTHE2HX3.js +0 -31
  201. package/dist/browser-lazy/chunks/chunk-2XCPFAD5.js +0 -46
  202. package/dist/browser-lazy/chunks/chunk-3H4F7RBT.js +0 -1
  203. package/dist/browser-lazy/chunks/chunk-4EVLW2NJ.js +0 -1
  204. package/dist/browser-lazy/chunks/chunk-5Q4S74UO.js +0 -1
  205. package/dist/browser-lazy/chunks/chunk-6OAPWSDO.js +0 -1
  206. package/dist/browser-lazy/chunks/chunk-A7L4WWVW.js +0 -143
  207. package/dist/browser-lazy/chunks/chunk-C7FJO2I3.js +0 -4
  208. package/dist/browser-lazy/chunks/chunk-D3XXDKIO.js +0 -1
  209. package/dist/browser-lazy/chunks/chunk-DXA5WL7H.js +0 -4
  210. package/dist/browser-lazy/chunks/chunk-EPFMQPXX.js +0 -1
  211. package/dist/browser-lazy/chunks/chunk-FFOHLPDA.js +0 -2
  212. package/dist/browser-lazy/chunks/chunk-FLD63DXE.js +0 -2
  213. package/dist/browser-lazy/chunks/chunk-G6OLSHRG.js +0 -7
  214. package/dist/browser-lazy/chunks/chunk-GRXCKTHX.js +0 -0
  215. package/dist/browser-lazy/chunks/chunk-I6VE56S7.js +0 -1
  216. package/dist/browser-lazy/chunks/chunk-KJVNXJ5Y.js +0 -1
  217. package/dist/browser-lazy/chunks/chunk-L227EPFP.js +0 -11
  218. package/dist/browser-lazy/chunks/chunk-LNIHDJSF.js +0 -1
  219. package/dist/browser-lazy/chunks/chunk-M6BT2HIP.js +0 -1
  220. package/dist/browser-lazy/chunks/chunk-NZRUMODH.js +0 -1
  221. package/dist/browser-lazy/chunks/chunk-OFRMKQA6.js +0 -1
  222. package/dist/browser-lazy/chunks/chunk-P7HMSKHJ.js +0 -1
  223. package/dist/browser-lazy/chunks/chunk-PXKL3O6H.js +0 -1
  224. package/dist/browser-lazy/chunks/chunk-PZEWZT35.js +0 -1
  225. package/dist/browser-lazy/chunks/chunk-STQRDZ67.js +0 -1
  226. package/dist/browser-lazy/chunks/chunk-SUFMSWTX.js +0 -1
  227. package/dist/browser-lazy/chunks/chunk-T7IJ6V4B.js +0 -3
  228. package/dist/browser-lazy/chunks/chunk-UAEZO5VL.js +0 -1
  229. package/dist/browser-lazy/chunks/chunk-WEUWIFG3.js +0 -1
  230. package/dist/browser-lazy/chunks/chunk-X64T74C5.js +0 -24
  231. package/dist/browser-lazy/chunks/class-F7R6TJ73.js +0 -9
  232. package/dist/browser-lazy/chunks/er-BDK7CM5L.js +0 -9
  233. package/dist/browser-lazy/chunks/flowchart-KFU6XV7S.js +0 -4
  234. package/dist/browser-lazy/chunks/gantt-I64VVDSP.js +0 -28
  235. package/dist/browser-lazy/chunks/gitgraph-EDUVJ5IJ.js +0 -8
  236. package/dist/browser-lazy/chunks/journey-TLO2RNM3.js +0 -40
  237. package/dist/browser-lazy/chunks/mindmap-OJCNDYPM.js +0 -9
  238. package/dist/browser-lazy/chunks/pie-HVG6XO7K.js +0 -19
  239. package/dist/browser-lazy/chunks/quadrant-U6S2L4MJ.js +0 -24
  240. package/dist/browser-lazy/chunks/radar-ZDLOBTVG.js +0 -32
  241. package/dist/browser-lazy/chunks/render-core-Y2DFNMQG.js +0 -12
  242. package/dist/browser-lazy/chunks/sequence-Z4WFS3VB.js +0 -12
  243. package/dist/browser-lazy/chunks/state-2HV2YGN3.js +0 -4
  244. package/dist/browser-lazy/chunks/timeline-XM4UFPOC.js +0 -20
  245. package/dist/browser-lazy/chunks/xychart-7JDHWTQY.js +0 -36
  246. package/dist/chunk-GGXCNCNA.js +0 -4118
  247. package/dist/chunk-IVD4NXNE.js +0 -615
  248. package/dist/chunk-JDMRPUAG.js +0 -37
  249. package/dist/chunk-JWAAW3FH.js +0 -149
  250. package/dist/chunk-LCGBT32P.js +0 -62036
  251. package/dist/chunk-RWMZRUIC.js +0 -4715
  252. package/dist/mcp-cli-4MLKC3ZH.js +0 -17
  253. package/docs/mutation-testing.md +0 -285
@@ -1,17 +0,0 @@
1
- import {
2
- MCP_CLI_HELP,
3
- MCP_FLAG_SPECS,
4
- parseMcpCliOptions,
5
- runMcpCli
6
- } from "./chunk-GGXCNCNA.js";
7
- import "./chunk-JDMRPUAG.js";
8
- import "./chunk-IVD4NXNE.js";
9
- import "./chunk-RWMZRUIC.js";
10
- import "./chunk-LCGBT32P.js";
11
- export {
12
- MCP_CLI_HELP,
13
- MCP_FLAG_SPECS,
14
- parseMcpCliOptions,
15
- runMcpCli
16
- };
17
- //# sourceMappingURL=mcp-cli-4MLKC3ZH.js.map
@@ -1,285 +0,0 @@
1
- # Mutation testing
2
-
3
- The original ASCII Stryker lane is scoped to the five layout modules where a
4
- silent logic regression is most expensive: `src/ascii/pathfinder.ts`,
5
- `src/ascii/edge-routing.ts`, `src/ascii/converter.ts`, `src/ascii/grid.ts`,
6
- `src/ascii/draw.ts`.
7
- The `ascii` profile in the single `stryker.config.mjs` authority executes the
8
- ASCII test files (goldens, invariants, properties, unit tests) per mutant.
9
-
10
- ## Running
11
-
12
- ```bash
13
- # One module (preferred — a full module takes 5–15 minutes):
14
- bun run mutation-test -- ascii --mutate 'src/ascii/pathfinder.ts'
15
-
16
- # All five:
17
- bun run mutation-test -- ascii
18
-
19
- # Discover every available profile:
20
- bun run mutation-test -- --list
21
- ```
22
-
23
- (`bun run mutation-test -- families` covers the
24
- shared Architecture, XYChart, Mindmap, GitGraph, and Radar parser/layout/renderer
25
- cores plus Radar's structured editing body, and `bun run mutation-test -- routes` covers
26
- the route-contracts module
27
- (`docs/design/system/route-contracts.md`), all with the same policy.)
28
-
29
- Narrow lanes for PR-scale survivor harvests:
30
-
31
- ```bash
32
- bun run mutation-test -- links # text-embedded link-length parsing
33
- bun run mutation-test -- routes:certs # route-certificate finality + stale-route audit
34
- bun run mutation-test -- routes:subgraph # subgraph endpoint/LCA routing
35
- bun run sabotage:routes # one-line revert checks against committed HEAD; expects focused tests to fail
36
- ```
37
-
38
- JSON reports land in `reports/mutation/` (gitignored). The single executable
39
- config resolves route-certificate, subgraph-routing, and link-grammar ranges
40
- from source-adjacent markers; inserting code above the behavior cannot silently
41
- move those lanes onto unrelated lines.
42
-
43
- Beyond the lanes documented here, configs exist for every built-in renderable
44
- family through named profiles: flowchart uses `mutation-test -- routes`;
45
- XYChart, Architecture, and Radar share `mutation-test -- families`; State, Sequence,
46
- Timeline, Class, ER, Journey, Pie, Quadrant, Gantt, Mindmap, and GitGraph each
47
- have a focused command. These are **opt-in diagnostic survivor harvests**. They
48
- emit scores and JSON reports, but have no `thresholds.break` and are neither
49
- scheduled nor acceptance gates.
50
-
51
- Two bounded checks run automatically on each PR:
52
-
53
- - `mutation-test -- incremental` mutates one small, pure module in about one minute
54
- and enforces its measured score.
55
- - `sabotage:routes` injects five named one-line regressions and requires the
56
- focused behavioral tests to fail.
57
-
58
- This distinction is deliberate. Mutation testing is useful when it challenges
59
- a specific test or design assumption; family membership alone is not a reason
60
- to enroll code in an expensive recurring sweep. A local mutation score without
61
- a retained report is diagnostic evidence, not a repository acceptance claim.
62
-
63
- ## Why broad scheduled mutation was retired (2026-07-14)
64
-
65
- The nightly workflow, its sharder, mutant-set oracle, aggregate verifier, and
66
- orchestration tests were retired and deleted. The operational evidence did
67
- not support maintaining them:
68
-
69
- - all 26 scheduled runs from 19 June through 14 July failed or were cancelled;
70
- - the workflow expanded from four route checks to every family while it was
71
- still unable to produce a successful retained run;
72
- - the final repair grew to 39 coverage workers (41 jobs total), yet long lanes
73
- still timed out and hosted runners disappeared before producing reports; and
74
- - rerunning unchanged mutation-relevant code consumed runner-hours without
75
- adding information.
76
-
77
- The [last scheduled baseline](https://github.com/adewale/agentic-mermaid/actions/runs/29309167850),
78
- [calibration diagnostic](https://github.com/adewale/agentic-mermaid/actions/runs/29327418603),
79
- and [cancelled 41-job repair](https://github.com/adewale/agentic-mermaid/actions/runs/29340333016)
80
- are retained as historical evidence, not as acceptance authority. The focused
81
- configs, marker-based scopes, survivor classifications, incremental gate, and
82
- sabotage probes remain because they are independently useful.
83
-
84
- The causal record is in
85
- [`project/archive/mutation-infrastructure-postmortem-2026-07.md`](./project/archive/mutation-infrastructure-postmortem-2026-07.md).
86
- The durable stop rule is: after three consecutive scheduled failures, an owner
87
- must fix, narrow, disable, or delete the diagnostic before adding scope. Any new
88
- recurring lane also needs a demonstrated fault class, one complete retained
89
- baseline, a runner-minute budget, an owner, and a removal criterion. No single
90
- proxy—coverage, mutation score, assertion count, or matrix enrollment—is “the”
91
- adequacy signal.
92
-
93
- ## Focused Mindmap/GitGraph historical local measurement (2026-07-10)
94
-
95
- These figures came from local runs. Their JSON reports are gitignored and no
96
- immutable CI artifact URL is committed, so they are diagnostic history—not a
97
- PR acceptance gate or a current break floor.
98
-
99
- | Lane | Mutants | Killed | Survived | Score |
100
- |---|---:|---:|---:|---:|
101
- | `bun run mutation-test -- mindmap` (`src/agent/mindmap-body.ts`) | 405 | 400 | 5 | **98.77%** |
102
- | `bun run mutation-test -- gitgraph` (`src/agent/gitgraph-body.ts`) | 303 | 294 | 9 | **97.03%** |
103
-
104
- The operation suites exercise every happy path, validation branch, source-order
105
- rewrite, recursive/cycle guard, null-clearing path, and verification warning.
106
- Mindmap's five survivors are two correlated node-syntax tuple guards plus
107
- three exception-path mutations around the node/body stability probes (two
108
- empty `catch` forms remain falsy; one `false`→`true` mutation is retained as a
109
- non-gating test gap). GitGraph's nine
110
- survivors are canonical serialization equivalents (trimming an already
111
- canonical header, explicit `NORMAL`, and optional attribute whitespace),
112
- merge-field guards implied by the discriminated model, or widened
113
- statement-kind guards that serialize identically on valid replay state. Reports
114
- are generated at `reports/mutation/{mindmap,gitgraph}-mutation.json`
115
- (gitignored); the committed configs make the runs reproducible. The measured
116
- scores above are not acceptance evidence: any separately owned acceptance claim
117
- must cite retained CI artifacts or a content-addressed report.
118
-
119
- ## Policy
120
-
121
- A SURVIVED mutant is a test gap until shown otherwise. Either kill it with a
122
- test (and sabotage-verify the test), or classify it below with a reason.
123
- Don't chase 100%: performance-guard and unreachable-branch mutants are
124
- documented, not killed with synthetic inputs.
125
-
126
- ## Baseline (June 2026, first scoped run)
127
-
128
- | File | Score | Killed+timeout | Survived |
129
- | --- | --- | --- | --- |
130
- | pathfinder.ts | 60.3% → 70.8% after `ascii-pathfinder-units.test.ts` | 184 → 216 | 121 → 89 |
131
- | edge-routing.ts | 55.1% | 163 | 133 |
132
- | converter.ts | 38.4% | 94 | 151 |
133
- | grid.ts | 70.1% | 421 | 180 |
134
- | layout/passes/index.ts:931-1165 (linkrank packing repair) | 49.86% → 65.07% after the geometry-characterization harvest (355 mutants; killed 176 → 230+1 timeout). The +54 kills were the repair's candidate ORDERING / ahead-node selection / push-delta arithmetic — invisible to HARD-metric assertions (a mutant picking a different clear lane still yields zero violations), pinned instead by per-repro geometry snapshots in `linkrank-packing.test.ts` (layout determinism makes them stable). | 355 | 124 — see classification below |
135
- | route-contracts.ts | 58.1% → 72.3% → 75.6% → 73.1% across the first three batches; 54.31% at 0b43c90, then 50.69% at 526d9cf after the slanted-family batch (shapePorts generalization, convex-polygon geometry: 2659 → 2740 mutants — absolute kills 1444 → 1381). The percentage fell on denominator growth (~3× since batch 3); residuals from that run are classified below. | 882 → 2740 | 50.69% (1381 killed) — historical snapshot |
136
-
137
- (Numbers from the June 2026 runs; regenerate rather than trusting this
138
- table — the report lands in `reports/mutation/`.)
139
-
140
- ## Historical survivor classification
141
-
142
- This section explains the recorded run; it is not a secondary test backlog.
143
- Only root `TODO.md` can schedule a new fixture or survivor-harvest package.
144
-
145
- **linkrank lane residual (124 at the 65.07% run)**, classified:
146
-
147
- - **Unexercised branch in the recorded corpus**: the subgraph-scoped
148
- `separationUnit` branch (walk the overlapped node's scope chain, push its
149
- outermost subgraph unit) did not fire because the degenerate repro set had no
150
- subgraphs. A subgraph + long-link shove-overlap fixture was not part of that run.
151
- - **Unexercised defensive fallbacks**: the `rungSource` feedback family and some
152
- min-lane branches fire only on inputs the deterministic enumeration no longer
153
- produces (0 residual signatures); every adopted route is still runtime-validated by
154
- `routeClearOfNodes`, so a wrong fallback cannot ship a through-node route.
155
- - **Equivalent on the real input domain**: exact-tie tiebreaks (`flowGap !== 0` id
156
- fallback), the `pairKey` separator literal (any injective separator), the defensive
157
- round cap (`nodes.length * 4` — forward-only motion terminates before it), and the
158
- candidate-list `slice(0, 16)` caps (lists are shorter in practice).
159
-
160
- **Killed by `src/__tests__/ascii-pathfinder-units.test.ts`** (32 mutants):
161
- `buildMoveDirs` preferred-direction ordering (it only decides ties between
162
- equal-cost A* paths, which the golden corpus never isolates; the unit tests
163
- pin `path[1]` per direction), `heuristic` corner-penalty logic, and
164
- `mergePath` straight-run detection (backtracks and mixed-delta steps must
165
- be preserved).
166
-
167
- **Accepted — performance guards, not behavior** (pathfinder): the #66
168
- bounded-search mutants (`next.x > boundX || next.y > boundY` weakenings,
169
- `maxIterations` arithmetic). They change how much work an unreachable-target
170
- search does before returning null, not what any reachable search returns.
171
- Timing the search was judged less reliable than the risk warranted.
172
-
173
- **Accepted — unreachable via convention** (pathfinder): the `dy`-dominant
174
- fallback in `buildMoveDirs` (lines ~157–159). All nine 3×3 `Direction`
175
- constants either match an explicit cardinal branch or have `|dx| >= |dy|`,
176
- so the branch only runs for synthetic Direction values. Candidate for
177
- simplification, not for synthetic-input tests.
178
-
179
- **Found dead code**: the first mutation run showed the audit-suggested sort
180
- tie-breaks on the two `b.index - a.index` comparators in
181
- `determineLabelLine` could never fire — segment `index` is unique by
182
- construction — so they were reverted. Only the width-sort tie-break (where
183
- ties are real) remains. Mutation testing earning its keep: it falsified an
184
- audit assumption the test suite couldn't.
185
-
186
- **Killed by `route-contracts.test.ts` survivor harvests** (170 mutants
187
- across five passes): RL/BT axis orientation (reciprocal-pair regressions in
188
- both reversed directions), every `directLaneBlockers` blocker kind at its
189
- exact ±4px clearance boundary on both axes (non-square obstacles so a
190
- swapped width/height changes the verdict), own-label lane capacity in
191
- rendered-pill units, the same-edgeIndex self-exclusion, sub-epsilon
192
- polyline simplification, the hitch deviation rounding, `findLabelSlot`
193
- stagger and pill-boundary arithmetic, the primary-over-feedback exemption
194
- asymmetry, the feedback path of `findRouteHitches`, shared-trunk detection
195
- on both axes at its collinearity/pill-extent boundaries, the ±2px line
196
- between the stale and shape-misanchor tripwires, container perimeter
197
- tolerance, and the container repair's horizontal-gap axis selection.
198
-
199
- **Accepted — equivalent on the real input domain** (route-contracts): the
200
- collinearity cross-product variants in `simplifyPolyline` behave identically
201
- for the orthogonal polylines ELK produces (several algebraic rearrangements
202
- preserve the zero/non-zero verdict for axis-aligned triples), and the
203
- `isMonotoneStaircase` diagonal/backward guards are defensive against passes
204
- that do not currently exist — real extracted routes are orthogonal and the
205
- backward case is already excluded by feedback classification upstream.
206
-
207
- **Accepted — performance guards** (route-contracts): the `seen`-set and
208
- stack mechanics inside `classifyRoutes`' DFS change traversal cost, not
209
- reachability verdicts, on the small graphs flowcharts produce.
210
-
211
- **Accepted — bounded-iteration guard** (route-contracts): the fixed-point
212
- loop's `round < 4` weakenings only change how many re-prove rounds run;
213
- the duplicate-edge regression pins one unblocking round, while three chained
214
- rounds were outside the recorded real-input corpus.
215
-
216
- **Residual observations from that run** (not scheduled):
217
- - `directLaneBlockers` label-rect axis ternaries retain a few survivors on
218
- rect width/height swaps for near-square pills; the corpus lacked a multi-line
219
- (taller than wide) label obstacle.
220
- - `findLabelSlot`'s rect-overlap conjunction retains sign-variant survivors
221
- for rects that only graze on one axis; corner-touching fixtures were absent.
222
- - The audit's pill-hit prefilter (`hitsPill`) retains inclusive-vs-strict
223
- comparison survivors for segments that exactly graze the pill border;
224
- they only widen the prefilter the collinearity check still gates.
225
- - The container repair's reversed-order gaps (target above / left of source)
226
- were absent; the recorded classification relied on symmetry with the two
227
- covered directions.
228
- - `grid.ts` `ensureSubgraphSpacing` (~48 survivors): the overlap/min-spacing
229
- resolution between root subgraphs is never triggered by the corpus —
230
- placement upstream appeared to avoid overlaps, so the run could not
231
- distinguish reachable behavior from defensive dead code.
232
- - `converter.ts` entry/exit attachment roles and phantom still-used checks
233
- (`resolveSubgraphEdges` area): rendered-output invariants tolerate several
234
- mutants because other mechanisms compensate; the run asserted rendered text,
235
- not the intermediate resolved edge structure.
236
- - `edge-routing.ts` label segment filter (`width >= lenLabel && index > 1 &&
237
- orientationMatches`): the labeled-fanout invariants pin the TD vertical-drop
238
- case; LR orientation and the index>1 exclusion lack direct coverage.
239
-
240
- ## Incremental per-PR profile
241
-
242
- A fast lane gates the small, pure faithfulness counter on every PR (the
243
- `mutation-incremental` CI job), separate from the opt-in diagnostic configs. It
244
- mutates `src/agent/structural-count.ts` (the counter + `faithfulnessWarning` +
245
- `isDrop`), run by the sub-second `structural-count.test.ts` unit runner. A full
246
- run is ~1 min, so it runs in full each PR.
247
-
248
- The 2026-07-14 post-Radar run scored **97.01%** (130 killed / 134 valid; regenerate to
249
- confirm, with the report in `reports/mutation/`), gated by
250
- `thresholds.break: 90`. The retained floor deliberately remains below the
251
- measured score; this result for one small pure module is not a repository policy
252
- or a reason to expand mutation scope.
253
-
254
- The survivor review found real valid-domain gaps rather than accepting a score:
255
- the State counter needed both a doubly nested composite and concurrent-region
256
- fixtures; ER needed a semantic-subgraph fixture and the public empty body with
257
- its optional `groups` field absent; and `nodes = services + junctions` needed an
258
- Architecture fixture containing a junction. These cases remain because they
259
- pin real behavior, not because they improve a metric.
260
-
261
- Four survivors are classified rather than killed with invalid inputs or by
262
- weakening the code's forward-compatibility tripwire:
263
-
264
- - two mutations to `case 'opaque': return null` are equivalent because the
265
- exhaustive default also returns `null`; and
266
- - two mutations to the `default` branch are unreachable for the valid
267
- discriminated union. Its `const _never: never = body` assignment is retained
268
- so adding a family without a count remains a compile-time error.
269
-
270
- ### Why `verify.ts`'s faithfulness wrapper is NOT in the gated mutate set
271
-
272
- Move 2 measured `roundtripFaithfulnessWarnings` (the I/O wrapper around the pure
273
- `faithfulnessWarning`): **26.67% kill / 11 survivors**. The survivors are all on
274
- the wrapper's defensive branches — `if (!reparsed.ok) …`, `if (!after) …`, and
275
- the `catch` — which no *real* diagram exercises: a structured diagram's
276
- serialization always re-parses, and re-parses structured (not opaque), and never
277
- throws. Those branches are therefore unkillable through real `verifyMermaid`
278
- inputs without a synthetic drop, and the *decision logic* they guard already
279
- lives in `faithfulnessWarning`, which the incremental lane currently measures
280
- at 97.01%. Adding the wrapper to the gated `mutate` would crater the score to
281
- ~27% and force either
282
- a meaningless break threshold or a pile of accepted survivors. So the wrapper
283
- stays out of the gated set and is recorded here as I/O-glue equivalents; its
284
- logic is covered where it actually lives, where the current measured score is
285
- 97.01%.