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.
- package/AGENT_NATIVE.md +94 -627
- package/CHANGELOG.md +651 -0
- package/Instructions_for_agents.md +44 -23
- package/LICENSES/Khroma-MIT.txt +21 -0
- package/LICENSES/Mermaid-MIT.txt +21 -0
- package/LICENSES/es-toolkit-MIT.txt +21 -0
- package/LICENSES/pele-MIT.txt +40 -0
- package/LICENSES/zenuml-core-MIT.txt +21 -0
- package/README.md +93 -50
- package/SECURITY.md +28 -12
- package/THIRD_PARTY_NOTICES.md +60 -0
- package/assets/hero.png +0 -0
- package/dist/agent-core.d.ts +478 -210
- package/dist/agent-core.js +1 -396
- package/dist/agent.d.ts +17 -8
- package/dist/agent.js +1 -408
- package/dist/agentic-mermaid-mcp.js +1 -11
- package/dist/am.js +1 -34562
- package/dist/browser-lazy/chunks/agentic-producer-core-CC6OOLDW.js +1 -0
- package/dist/browser-lazy/chunks/architecture-QUFVKYJR.js +13 -0
- package/dist/browser-lazy/chunks/block-6J3Q63BO.js +11 -0
- package/dist/browser-lazy/chunks/builtin-backends-7SOZZHPF.js +12 -0
- package/dist/browser-lazy/chunks/c4-SQVBZAKJ.js +10 -0
- package/dist/browser-lazy/chunks/chunk-2GPK4VFF.js +5 -0
- package/dist/browser-lazy/chunks/chunk-2I4UPL7Q.js +3 -0
- package/dist/browser-lazy/chunks/chunk-2SH76OTH.js +1 -0
- package/dist/browser-lazy/chunks/chunk-2UIA2IME.js +3 -0
- package/dist/browser-lazy/chunks/chunk-4LHYF3BS.js +1 -0
- package/dist/browser-lazy/chunks/chunk-5B2Z7575.js +1 -0
- package/dist/browser-lazy/chunks/chunk-5FQ534HP.js +1 -0
- package/dist/browser-lazy/chunks/chunk-5UVGUSD6.js +1 -0
- package/dist/browser-lazy/chunks/chunk-5X6MJX3H.js +1 -0
- package/dist/browser-lazy/chunks/chunk-AMJLVPUB.js +4 -0
- package/dist/browser-lazy/chunks/chunk-BU5LHXNJ.js +3 -0
- package/dist/browser-lazy/chunks/chunk-BY2CPG6B.js +1 -0
- package/dist/browser-lazy/chunks/chunk-CN7WTBWB.js +1 -0
- package/dist/browser-lazy/chunks/chunk-CQE4HQEW.js +1 -0
- package/dist/browser-lazy/chunks/chunk-CSFUKSU6.js +1 -0
- package/dist/browser-lazy/chunks/chunk-DF6765YX.js +17 -0
- package/dist/browser-lazy/chunks/chunk-E2WMJZNM.js +1 -0
- package/dist/browser-lazy/chunks/chunk-FAIMVOX5.js +6 -0
- package/dist/browser-lazy/chunks/chunk-GVOEAY52.js +1 -0
- package/dist/browser-lazy/chunks/chunk-HLWUNUCM.js +1 -0
- package/dist/browser-lazy/chunks/chunk-ICC7HBJX.js +1 -0
- package/dist/browser-lazy/chunks/chunk-J35HAQQF.js +20 -0
- package/dist/browser-lazy/chunks/chunk-J7FFAFQF.js +1 -0
- package/dist/browser-lazy/chunks/chunk-LH7HUDKW.js +1 -0
- package/dist/browser-lazy/chunks/chunk-N5ELX7LR.js +2 -0
- package/dist/browser-lazy/chunks/chunk-NMQQMRIR.js +1 -0
- package/dist/browser-lazy/chunks/chunk-NO7ZIVRU.js +1 -0
- package/dist/browser-lazy/chunks/chunk-OZ443IVJ.js +16 -0
- package/dist/browser-lazy/chunks/chunk-PQGPS2YV.js +7 -0
- package/dist/browser-lazy/chunks/chunk-QA6GJQ4X.js +1 -0
- package/dist/browser-lazy/chunks/chunk-RIVTHZAQ.js +1 -0
- package/dist/browser-lazy/chunks/chunk-SZELX2EJ.js +1 -0
- package/dist/browser-lazy/chunks/chunk-TYZOZXUJ.js +22 -0
- package/dist/browser-lazy/chunks/chunk-UL6NDWLL.js +1 -0
- package/dist/browser-lazy/chunks/chunk-VQYYGAXP.js +1 -0
- package/dist/browser-lazy/chunks/chunk-VWVZGQE2.js +1 -0
- package/dist/browser-lazy/chunks/chunk-X2UYKWKM.js +4 -0
- package/dist/browser-lazy/chunks/chunk-YCEICNM6.js +1 -0
- package/dist/browser-lazy/chunks/chunk-Z3FDIVLN.js +20 -0
- package/dist/browser-lazy/chunks/class-5QA4SCTS.js +13 -0
- package/dist/browser-lazy/chunks/decode-63UIZGD2.js +1 -0
- package/dist/browser-lazy/chunks/elk.bundled-L4CADV5W.js +24 -0
- package/dist/browser-lazy/chunks/er-7ZSKGN7Y.js +11 -0
- package/dist/browser-lazy/chunks/eventmodeling-2BPLHWRN.js +19 -0
- package/dist/browser-lazy/chunks/flowchart-NEIMZTB5.js +4 -0
- package/dist/browser-lazy/chunks/forest-implementation-AEP24AIP.js +1 -0
- package/dist/browser-lazy/chunks/gantt-RDPIFYAF.js +11 -0
- package/dist/browser-lazy/chunks/gitgraph-N4Y5RYB7.js +9 -0
- package/dist/browser-lazy/chunks/ishikawa-LD3YBDJN.js +6 -0
- package/dist/browser-lazy/chunks/journey-6YQR5DJX.js +16 -0
- package/dist/browser-lazy/chunks/kanban-PLMJ7NBW.js +20 -0
- package/dist/browser-lazy/chunks/mermaid-yaml-runtime-QVYX4EWK.js +136 -0
- package/dist/browser-lazy/chunks/mindmap-K2UBFO3Y.js +12 -0
- package/dist/browser-lazy/chunks/packet-CUW4QY6Y.js +7 -0
- package/dist/browser-lazy/chunks/pie-7F7UUCG3.js +15 -0
- package/dist/browser-lazy/chunks/quadrant-TOONO2WC.js +10 -0
- package/dist/browser-lazy/chunks/radar-J6JVWVAX.js +16 -0
- package/dist/browser-lazy/chunks/render-core-BZOM3K7D.js +3 -0
- package/dist/browser-lazy/chunks/requirement-CMAKDJPO.js +19 -0
- package/dist/browser-lazy/chunks/sankey-AWXQEP3F.js +13 -0
- package/dist/browser-lazy/chunks/sequence-Q2RJRB4L.js +5 -0
- package/dist/browser-lazy/chunks/state-WRBFQEDX.js +4 -0
- package/dist/browser-lazy/chunks/timeline-D2KILFXM.js +6 -0
- package/dist/browser-lazy/chunks/treemap-N3VYX5D4.js +6 -0
- package/dist/browser-lazy/chunks/xychart-G73OGK66.js +16 -0
- package/dist/browser-lazy/chunks/zenuml-H4BXNYXR.js +16 -0
- package/dist/browser-lazy/index.d.ts +544 -275
- package/dist/browser-lazy/index.js +1 -1
- package/dist/browser.global.js +802 -565
- package/dist/chunk-3LGLPG33.js +2 -0
- package/dist/chunk-7CRDX2QR.js +2 -0
- package/dist/chunk-7PPW2BMO.js +2 -0
- package/dist/chunk-DQDKA5ND.js +2 -0
- package/dist/chunk-EHCMJUMD.js +52 -0
- package/dist/chunk-GVCHLSHH.js +4 -0
- package/dist/chunk-H3NCS2XZ.js +19 -0
- package/dist/chunk-JZOJ4YGS.js +201 -0
- package/dist/chunk-MKE7GNYU.js +146 -0
- package/dist/chunk-NKNFOREZ.js +2 -0
- package/dist/chunk-O7H2UX5K.js +2 -0
- package/dist/chunk-OMY6NRQD.js +58 -0
- package/dist/chunk-UA234O4M.js +4 -0
- package/dist/chunk-VUFVLGTH.js +2 -0
- package/dist/chunk-XU5LPD2D.js +2 -0
- package/dist/cli-YGGTJZH7.js +226 -0
- package/dist/elk-constructor.js +2 -0
- package/dist/elk-constructor.node.js +11 -0
- package/dist/index-EeXqJXr5.d.ts +1223 -0
- package/dist/index.d.ts +4 -1
- package/dist/index.js +1 -334
- package/dist/jsonl-RPJY6YWO.js +2 -0
- package/dist/mcp-cli-63DYXTVD.js +2 -0
- package/dist/{index-BGA_-6LV.d.ts → paint-certification-6rwQjIv_.d.ts} +5283 -6173
- package/dist/server-5NEOHOFS.js +524 -0
- package/dist/svg-styles-BdnoM7AT.d.ts +724 -0
- package/dist/svg-styles.d.ts +1 -0
- package/dist/svg-styles.js +2 -0
- package/dist/svg.d.ts +13 -0
- package/dist/svg.js +2 -0
- package/dist/types-BcS52Mjt.d.ts +1360 -0
- package/dist/zenuml/chunks/appearance-UOQ5KA6O.js +1 -0
- package/dist/zenuml/chunks/builtin-backends-KDKE7YHO.js +12 -0
- package/dist/zenuml/chunks/chunk-42DXZ5C6.js +4 -0
- package/dist/zenuml/chunks/chunk-7TVYPTDW.js +1 -0
- package/dist/zenuml/chunks/chunk-EVPSMEKN.js +1 -0
- package/dist/zenuml/chunks/chunk-OXQWRSBM.js +20 -0
- package/dist/zenuml/chunks/chunk-QWX77U7G.js +2 -0
- package/dist/zenuml/chunks/chunk-RLJEI7YN.js +29 -0
- package/dist/zenuml/chunks/chunk-RZ6XK5CD.js +29 -0
- package/dist/zenuml/chunks/decode-BWERFDGK.js +1 -0
- package/dist/zenuml/chunks/mermaid-yaml-runtime-KZVU74WU.js +136 -0
- package/dist/zenuml/chunks/render-core-V5RQ737O.js +3 -0
- package/dist/zenuml/chunks/zenuml-EA2ZFRUX.js +20 -0
- package/dist/zenuml-frame.global.js +3626 -0
- package/dist/zenuml.d.ts +83 -0
- package/dist/zenuml.js +1 -0
- package/docs/MCP-DIRECTORY-LISTINGS.md +5 -1
- package/docs/README.md +59 -103
- package/docs/agent-api-cookbook.md +26 -16
- package/docs/agent-mutation-policy.md +86 -15
- package/docs/agent-workflow-examples.md +1 -1
- package/docs/api-advanced.md +385 -0
- package/docs/api.md +320 -366
- package/docs/ascii.md +40 -4
- package/docs/browser.md +46 -7
- package/docs/choosing-a-diagram.md +148 -0
- package/docs/code-mode-impact.md +1 -0
- package/docs/comparison.md +244 -28
- package/docs/computational-aesthetics-prototype-plan.md +10 -10
- package/docs/config.md +60 -2
- package/docs/custom-fonts.md +78 -21
- package/docs/diagram-families.md +160 -10
- package/docs/eventmodeling-and-zenuml.md +165 -0
- package/docs/features.md +21 -19
- package/docs/fork-differences.md +105 -32
- package/docs/getting-started.md +56 -51
- package/docs/layout-certification.md +126 -0
- package/docs/mcp-code-mode-rationale.md +20 -12
- package/docs/mcp-http-transport.md +14 -8
- package/docs/quality.md +145 -15
- package/docs/react.md +76 -31
- package/docs/style-authoring.md +23 -11
- package/docs/svg-semantic-contract.md +104 -4
- package/docs/testing-strategy.md +684 -126
- package/docs/theming.md +27 -8
- package/examples/styles/readme-hero.md +25 -0
- package/examples/styles/readme-hero.mmd +13 -0
- package/examples/styles/readme-hero.style.json +7 -0
- package/package.json +114 -57
- package/server.json +2 -2
- package/skills/agentic-mermaid-diagram-workflow/SKILL.md +26 -8
- package/skills/agentic-mermaid-diagram-workflow/references/cli.md +13 -3
- package/skills/agentic-mermaid-diagram-workflow/references/code-mode.md +2 -1
- package/skills/agentic-mermaid-diagram-workflow/references/flowchart.md +9 -6
- package/skills/agentic-mermaid-diagram-workflow/references/hosted-mcp.md +1 -0
- package/skills/agentic-mermaid-diagram-workflow/references/sequence.md +4 -3
- package/skills/agentic-mermaid-diagram-workflow/references/timeline.md +7 -6
- package/skills/agentic-mermaid-diagram-workflow/references/upstream/agentflow.md +574 -0
- package/skills/agentic-mermaid-diagram-workflow/references/upstream/architecture.md +10 -2
- package/skills/agentic-mermaid-diagram-workflow/references/upstream/c4.md +18 -0
- package/skills/agentic-mermaid-diagram-workflow/references/upstream/classDiagram.md +123 -0
- package/skills/agentic-mermaid-diagram-workflow/references/upstream/cynefin.md +6 -1
- package/skills/agentic-mermaid-diagram-workflow/references/upstream/entityRelationshipDiagram.md +129 -9
- package/skills/agentic-mermaid-diagram-workflow/references/upstream/eventmodeling.md +22 -0
- package/skills/agentic-mermaid-diagram-workflow/references/upstream/flowchart.md +188 -60
- package/skills/agentic-mermaid-diagram-workflow/references/upstream/gitgraph.md +13 -7
- package/skills/agentic-mermaid-diagram-workflow/references/upstream/mindmap.md +110 -1
- package/skills/agentic-mermaid-diagram-workflow/references/upstream/packet.md +38 -0
- package/skills/agentic-mermaid-diagram-workflow/references/upstream/requirementDiagram.md +115 -0
- package/skills/agentic-mermaid-diagram-workflow/references/upstream/sequenceDiagram.md +101 -0
- package/skills/agentic-mermaid-diagram-workflow/references/upstream/stateDiagram.md +87 -0
- package/skills/agentic-mermaid-diagram-workflow/references/upstream/swimlanes.md +105 -2
- package/skills/agentic-mermaid-diagram-workflow/references/upstream/timeline.md +12 -6
- package/skills/agentic-mermaid-diagram-workflow/references/upstream/usecase.md +953 -0
- package/skills/agentic-mermaid-diagram-workflow/references/upstream/venn.md +77 -0
- package/skills/agentic-mermaid-diagram-workflow/references/upstream/xyChart.md +1 -1
- package/dist/browser-lazy/chunks/architecture-KTHE2HX3.js +0 -31
- package/dist/browser-lazy/chunks/chunk-2XCPFAD5.js +0 -46
- package/dist/browser-lazy/chunks/chunk-3H4F7RBT.js +0 -1
- package/dist/browser-lazy/chunks/chunk-4EVLW2NJ.js +0 -1
- package/dist/browser-lazy/chunks/chunk-5Q4S74UO.js +0 -1
- package/dist/browser-lazy/chunks/chunk-6OAPWSDO.js +0 -1
- package/dist/browser-lazy/chunks/chunk-A7L4WWVW.js +0 -143
- package/dist/browser-lazy/chunks/chunk-C7FJO2I3.js +0 -4
- package/dist/browser-lazy/chunks/chunk-D3XXDKIO.js +0 -1
- package/dist/browser-lazy/chunks/chunk-DXA5WL7H.js +0 -4
- package/dist/browser-lazy/chunks/chunk-EPFMQPXX.js +0 -1
- package/dist/browser-lazy/chunks/chunk-FFOHLPDA.js +0 -2
- package/dist/browser-lazy/chunks/chunk-FLD63DXE.js +0 -2
- package/dist/browser-lazy/chunks/chunk-G6OLSHRG.js +0 -7
- package/dist/browser-lazy/chunks/chunk-GRXCKTHX.js +0 -0
- package/dist/browser-lazy/chunks/chunk-I6VE56S7.js +0 -1
- package/dist/browser-lazy/chunks/chunk-KJVNXJ5Y.js +0 -1
- package/dist/browser-lazy/chunks/chunk-L227EPFP.js +0 -11
- package/dist/browser-lazy/chunks/chunk-LNIHDJSF.js +0 -1
- package/dist/browser-lazy/chunks/chunk-M6BT2HIP.js +0 -1
- package/dist/browser-lazy/chunks/chunk-NZRUMODH.js +0 -1
- package/dist/browser-lazy/chunks/chunk-OFRMKQA6.js +0 -1
- package/dist/browser-lazy/chunks/chunk-P7HMSKHJ.js +0 -1
- package/dist/browser-lazy/chunks/chunk-PXKL3O6H.js +0 -1
- package/dist/browser-lazy/chunks/chunk-PZEWZT35.js +0 -1
- package/dist/browser-lazy/chunks/chunk-STQRDZ67.js +0 -1
- package/dist/browser-lazy/chunks/chunk-SUFMSWTX.js +0 -1
- package/dist/browser-lazy/chunks/chunk-T7IJ6V4B.js +0 -3
- package/dist/browser-lazy/chunks/chunk-UAEZO5VL.js +0 -1
- package/dist/browser-lazy/chunks/chunk-WEUWIFG3.js +0 -1
- package/dist/browser-lazy/chunks/chunk-X64T74C5.js +0 -24
- package/dist/browser-lazy/chunks/class-F7R6TJ73.js +0 -9
- package/dist/browser-lazy/chunks/er-BDK7CM5L.js +0 -9
- package/dist/browser-lazy/chunks/flowchart-KFU6XV7S.js +0 -4
- package/dist/browser-lazy/chunks/gantt-I64VVDSP.js +0 -28
- package/dist/browser-lazy/chunks/gitgraph-EDUVJ5IJ.js +0 -8
- package/dist/browser-lazy/chunks/journey-TLO2RNM3.js +0 -40
- package/dist/browser-lazy/chunks/mindmap-OJCNDYPM.js +0 -9
- package/dist/browser-lazy/chunks/pie-HVG6XO7K.js +0 -19
- package/dist/browser-lazy/chunks/quadrant-U6S2L4MJ.js +0 -24
- package/dist/browser-lazy/chunks/radar-ZDLOBTVG.js +0 -32
- package/dist/browser-lazy/chunks/render-core-Y2DFNMQG.js +0 -12
- package/dist/browser-lazy/chunks/sequence-Z4WFS3VB.js +0 -12
- package/dist/browser-lazy/chunks/state-2HV2YGN3.js +0 -4
- package/dist/browser-lazy/chunks/timeline-XM4UFPOC.js +0 -20
- package/dist/browser-lazy/chunks/xychart-7JDHWTQY.js +0 -36
- package/dist/chunk-GGXCNCNA.js +0 -4118
- package/dist/chunk-IVD4NXNE.js +0 -615
- package/dist/chunk-JDMRPUAG.js +0 -37
- package/dist/chunk-JWAAW3FH.js +0 -149
- package/dist/chunk-LCGBT32P.js +0 -62036
- package/dist/chunk-RWMZRUIC.js +0 -4715
- package/dist/mcp-cli-4MLKC3ZH.js +0 -17
- package/docs/mutation-testing.md +0 -285
package/dist/mcp-cli-4MLKC3ZH.js
DELETED
|
@@ -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
|
package/docs/mutation-testing.md
DELETED
|
@@ -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%.
|