agentic-mermaid 0.1.1 → 0.1.2
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/CHANGELOG.md +144 -4
- package/LICENSES/Apache-2.0.txt +202 -0
- package/README.md +25 -32
- package/THIRD_PARTY_NOTICES.md +29 -0
- package/dist/agent-core.d.ts +463 -0
- package/dist/agent-core.js +397 -0
- package/dist/agent.d.ts +73 -1868
- package/dist/agent.js +336 -37325
- package/dist/agentic-mermaid-mcp.js +7 -38399
- package/dist/am.js +33632 -40445
- package/dist/chunk-4QECACIA.js +4702 -0
- package/dist/chunk-CDPKJ2BQ.js +37 -0
- package/dist/chunk-QKDLMOJJ.js +3487 -0
- package/dist/chunk-WI35L7IR.js +615 -0
- package/dist/chunk-WN3YDOBG.js +149 -0
- package/dist/chunk-ZYMMKQ3I.js +62637 -0
- package/dist/index-D54dqSdC.d.ts +6777 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +310 -33014
- package/dist/mcp-cli-SBQSTJFC.js +17 -0
- package/docs/README.md +14 -6
- package/docs/schemas/style-spec.schema.json +1221 -30
- package/examples/styles/catalog.json +54 -0
- package/examples/styles/cloudflare-workers-inspired-prototype.mmd +9 -0
- package/examples/styles/cloudflare-workers-inspired-prototype.style.json +110 -0
- package/examples/styles/cupertino-prototype.mmd +10 -0
- package/examples/styles/cupertino-prototype.style.json +63 -0
- package/examples/styles/mid-century-report.style.json +2 -2
- package/examples/styles/star-chart-atlas.style.json +2 -1
- package/examples/styles/transit-route-map.style.json +2 -2
- package/examples/styles/vercel-inspired-prototype.mmd +6 -0
- package/examples/styles/vercel-inspired-prototype.style.json +87 -0
- package/package.json +68 -43
- package/server.json +2 -2
- package/skills/agentic-mermaid-diagram-workflow/SKILL.md +17 -36
- package/skills/agentic-mermaid-diagram-workflow/references/cli.md +4 -5
- package/skills/agentic-mermaid-diagram-workflow/references/code-mode.md +15 -31
- package/skills/agentic-mermaid-diagram-workflow/references/sequence.md +10 -14
- package/skills/agentic-mermaid-live-editor/SKILL.md +100 -206
- package/AGENT_NATIVE.md +0 -607
- package/Instructions_for_agents.md +0 -89
- package/TODO.md +0 -684
- package/assets/hero.png +0 -0
- package/dist/index-wjRjbsP-.d.ts +0 -1102
- package/docs/agent-api-cookbook.md +0 -308
- package/docs/agent-mutation-policy.md +0 -104
- package/docs/agent-workflow-examples.md +0 -46
- package/docs/api.md +0 -211
- package/docs/ascii.md +0 -103
- package/docs/assets/improvements/box-start-connector.png +0 -0
- package/docs/assets/improvements/comment-dropped-lint.png +0 -0
- package/docs/assets/improvements/er-content-loss.png +0 -0
- package/docs/assets/improvements/fan-in-trunks.png +0 -0
- package/docs/assets/improvements/gantt-family.png +0 -0
- package/docs/assets/improvements/gantt-milestone-clamp.png +0 -0
- package/docs/assets/improvements/gantt-verify-seam.png +0 -0
- package/docs/assets/improvements/subgraph-container-edges.png +0 -0
- package/docs/assets/improvements/wrapper-frontmatter.png +0 -0
- package/docs/assets/improvements/wrapper-init-directive.png +0 -0
- package/docs/assets/improvements/wrapper-leading-comment.png +0 -0
- package/docs/assets/style-cookbook/mid-century-report.png +0 -0
- package/docs/assets/style-cookbook/star-chart-atlas.png +0 -0
- package/docs/assets/style-cookbook/transit-route-map.png +0 -0
- package/docs/comparison.md +0 -94
- package/docs/config.md +0 -105
- package/docs/contributing/adding-diagram-types.md +0 -144
- package/docs/contributing/diagram-family-citizenship.matrix.json +0 -2127
- package/docs/contributing/diagram-family-citizenship.md +0 -82
- package/docs/contributing/harvesting-upstream-tests.md +0 -126
- package/docs/contributing/lessons-learned.md +0 -276
- package/docs/contributing/releasing.md +0 -82
- package/docs/contributing/visual-review-evidence.md +0 -53
- package/docs/custom-style-cookbook.md +0 -154
- package/docs/design/families/README.md +0 -26
- package/docs/design/families/architecture-beta.md +0 -48
- package/docs/design/families/flowchart-parser-conformance.md +0 -22
- package/docs/design/families/gantt-research.md +0 -137
- package/docs/design/families/gantt.md +0 -329
- package/docs/design/families/journey-agentic-cards-before.png +0 -0
- package/docs/design/families/journey-experience-curve-implementation.png +0 -0
- package/docs/design/families/journey-mermaid-classic-implementation.png +0 -0
- package/docs/design/families/journey-mermaid-classic-prototype.png +0 -0
- package/docs/design/families/journey-mermaid-classic-prototype.svg +0 -163
- package/docs/design/families/journey-mermaid-classic-prototype.svg.png +0 -0
- package/docs/design/families/journey-migration-parity.md +0 -439
- package/docs/design/families/journey-section-overlap-after.png +0 -0
- package/docs/design/families/journey-section-overlap-before.png +0 -0
- package/docs/design/families/journey-usage-research.md +0 -423
- package/docs/design/families/journey.md +0 -153
- package/docs/design/families/xychart.md +0 -85
- package/docs/design/system/README.md +0 -45
- package/docs/design/system/abstraction-audit.md +0 -224
- package/docs/design/system/abstraction-recommendations.md +0 -655
- package/docs/design/system/architecture.mmd +0 -29
- package/docs/design/system/architecture.svg +0 -137
- package/docs/design/system/layout-guarantees-and-robustness.md +0 -351
- package/docs/design/system/layout-rubric.md +0 -138
- package/docs/design/system/route-contracts.md +0 -848
- package/docs/design/system/source-preservation-ladder.md +0 -52
- package/docs/design/system/styles-rollout.md +0 -216
- package/docs/design/system/ugly-layouts.md +0 -119
- package/docs/diagram-families.md +0 -193
- package/docs/features.md +0 -147
- package/docs/fork-differences.md +0 -130
- package/docs/getting-started.md +0 -175
- package/docs/issue-derived-test-cases.md +0 -156
- package/docs/layout-characterization/README.md +0 -245
- package/docs/layout-characterization/contact-sheet-families.md +0 -498
- package/docs/layout-characterization/contact-sheet.md +0 -638
- package/docs/layout-characterization/properties.md +0 -281
- package/docs/layout-characterization/visual-quality.md +0 -160
- package/docs/layout-characterization/visual-snapshots/architecture.svg +0 -79
- package/docs/layout-characterization/visual-snapshots/class.svg +0 -60
- package/docs/layout-characterization/visual-snapshots/er.svg +0 -61
- package/docs/layout-characterization/visual-snapshots/flowchart.svg +0 -58
- package/docs/layout-characterization/visual-snapshots/gantt.svg +0 -52
- package/docs/layout-characterization/visual-snapshots/journey.svg +0 -98
- package/docs/layout-characterization/visual-snapshots/pie.svg +0 -36
- package/docs/layout-characterization/visual-snapshots/quadrant.svg +0 -47
- package/docs/layout-characterization/visual-snapshots/sequence.svg +0 -59
- package/docs/layout-characterization/visual-snapshots/state.svg +0 -52
- package/docs/layout-characterization/visual-snapshots/timeline.svg +0 -64
- package/docs/layout-characterization/visual-snapshots/xychart.svg +0 -97
- package/docs/mcp-code-mode-rationale.md +0 -101
- package/docs/mcp-http-transport.md +0 -223
- package/docs/mermaid-layout-complaints.md +0 -837
- package/docs/mutation-testing.md +0 -206
- package/docs/project/divergences.md +0 -98
- package/docs/project/dogfooding-docs-strategy.md +0 -66
- package/docs/project/hosted-mcp-cloudflare-plan.md +0 -338
- package/docs/project/lessons-learned.md +0 -1019
- package/docs/project/remove-role-styling-plan.md +0 -176
- package/docs/quality.md +0 -215
- package/docs/react.md +0 -97
- package/docs/style-authoring.md +0 -133
- package/docs/testing-strategy.md +0 -335
- package/docs/theming.md +0 -162
- package/examples/agent-improve-auth-flow.ts +0 -206
- package/examples/agent-loop.ts +0 -53
- package/examples/mcp-vs-cli-complex-diagrams.ts +0 -133
- package/llms.txt +0 -104
- package/skill-evals/README.md +0 -77
- package/skill-evals/fixtures/architecture-cache/input.mmd +0 -5
- package/skill-evals/fixtures/class-payment/input.mmd +0 -4
- package/skill-evals/fixtures/er-orders/input.mmd +0 -10
- package/skill-evals/fixtures/flowchart-cache/input.mmd +0 -3
- package/skill-evals/fixtures/gantt-release/input.mmd +0 -7
- package/skill-evals/fixtures/journey-checkout/input.mmd +0 -6
- package/skill-evals/fixtures/pie-exports/input.mmd +0 -5
- package/skill-evals/fixtures/quadrant-priorities/input.mmd +0 -11
- package/skill-evals/fixtures/sequence-retry/input.mmd +0 -8
- package/skill-evals/fixtures/state-lifecycle/input.mmd +0 -5
- package/skill-evals/fixtures/timeline-release/input.mmd +0 -6
- package/skill-evals/fixtures/xychart-growth/input.mmd +0 -5
- package/skill-evals/shared-benchmark.json +0 -510
- package/src/agent/analyze.ts +0 -157
- package/src/agent/apply.ts +0 -146
- package/src/agent/architecture-body.ts +0 -458
- package/src/agent/certificates.ts +0 -110
- package/src/agent/class-body.ts +0 -319
- package/src/agent/core.ts +0 -207
- package/src/agent/create.ts +0 -106
- package/src/agent/describe.ts +0 -368
- package/src/agent/er-body.ts +0 -224
- package/src/agent/facts.ts +0 -360
- package/src/agent/families-builtin.ts +0 -920
- package/src/agent/families.ts +0 -232
- package/src/agent/family-layouts.ts +0 -832
- package/src/agent/flowchart-body.ts +0 -372
- package/src/agent/flowchart-unsupported.ts +0 -243
- package/src/agent/font-coverage.ts +0 -288
- package/src/agent/gantt-body.ts +0 -495
- package/src/agent/index.ts +0 -10
- package/src/agent/journey-body.ts +0 -374
- package/src/agent/label-metrics.ts +0 -28
- package/src/agent/layout-to-rendered.ts +0 -63
- package/src/agent/mutate.ts +0 -97
- package/src/agent/mutation-ops.ts +0 -51
- package/src/agent/op-schema.ts +0 -443
- package/src/agent/parse.ts +0 -223
- package/src/agent/pie-body.ts +0 -270
- package/src/agent/png.ts +0 -171
- package/src/agent/quadrant-body.ts +0 -336
- package/src/agent/quality.ts +0 -363
- package/src/agent/readability-audit.ts +0 -92
- package/src/agent/rendered-route-audit.ts +0 -61
- package/src/agent/sequence-body.ts +0 -345
- package/src/agent/serialize.ts +0 -214
- package/src/agent/state-body.ts +0 -589
- package/src/agent/structural-count.ts +0 -150
- package/src/agent/timeline-body.ts +0 -280
- package/src/agent/trace-log.ts +0 -43
- package/src/agent/types.ts +0 -995
- package/src/agent/verify.ts +0 -603
- package/src/agent/xychart-body.ts +0 -472
- package/src/architecture/config.ts +0 -282
- package/src/architecture/layout.ts +0 -496
- package/src/architecture/parser.ts +0 -375
- package/src/architecture/renderer.ts +0 -611
- package/src/architecture/types.ts +0 -113
- package/src/ascii/ansi.ts +0 -423
- package/src/ascii/architecture.ts +0 -210
- package/src/ascii/canvas.ts +0 -443
- package/src/ascii/class-diagram.ts +0 -697
- package/src/ascii/converter.ts +0 -475
- package/src/ascii/draw.ts +0 -1693
- package/src/ascii/edge-bundling.ts +0 -328
- package/src/ascii/edge-routing.ts +0 -330
- package/src/ascii/er-diagram.ts +0 -439
- package/src/ascii/gantt.ts +0 -276
- package/src/ascii/grid.ts +0 -747
- package/src/ascii/index.ts +0 -196
- package/src/ascii/journey.ts +0 -169
- package/src/ascii/meta.ts +0 -244
- package/src/ascii/multiline-utils.ts +0 -80
- package/src/ascii/pathfinder.ts +0 -301
- package/src/ascii/pie.ts +0 -67
- package/src/ascii/quadrant.ts +0 -158
- package/src/ascii/reverse.ts +0 -216
- package/src/ascii/sequence.ts +0 -499
- package/src/ascii/shapes/circle.ts +0 -27
- package/src/ascii/shapes/corners.ts +0 -143
- package/src/ascii/shapes/diamond.ts +0 -27
- package/src/ascii/shapes/hexagon.ts +0 -27
- package/src/ascii/shapes/index.ts +0 -106
- package/src/ascii/shapes/rectangle.ts +0 -168
- package/src/ascii/shapes/rounded.ts +0 -27
- package/src/ascii/shapes/special.ts +0 -332
- package/src/ascii/shapes/stadium.ts +0 -110
- package/src/ascii/shapes/state.ts +0 -192
- package/src/ascii/shapes/types.ts +0 -73
- package/src/ascii/timeline.ts +0 -141
- package/src/ascii/types.ts +0 -312
- package/src/ascii/validate.ts +0 -120
- package/src/ascii/width.ts +0 -81
- package/src/ascii/wrap.ts +0 -131
- package/src/ascii/xychart.ts +0 -919
- package/src/browser.ts +0 -29
- package/src/class/layout.ts +0 -240
- package/src/class/parser.ts +0 -332
- package/src/class/renderer.ts +0 -638
- package/src/class/types.ts +0 -129
- package/src/cli/agent-instructions.ts +0 -1
- package/src/cli/am-bin.ts +0 -6
- package/src/cli/exit-codes.ts +0 -18
- package/src/cli/index.ts +0 -1132
- package/src/cli/init-agent.ts +0 -147
- package/src/cli/run-entrypoint.ts +0 -10
- package/src/color-resolver.ts +0 -152
- package/src/elk-instance.ts +0 -114
- package/src/er/layout.ts +0 -187
- package/src/er/parser.ts +0 -226
- package/src/er/renderer.ts +0 -792
- package/src/er/types.ts +0 -99
- package/src/family-rubric.ts +0 -425
- package/src/font-manifest.ts +0 -31
- package/src/gantt/layout.ts +0 -365
- package/src/gantt/parser.ts +0 -282
- package/src/gantt/pipeline.ts +0 -27
- package/src/gantt/renderer.ts +0 -414
- package/src/gantt/schedule.ts +0 -513
- package/src/gantt/types.ts +0 -255
- package/src/index.ts +0 -368
- package/src/journey/layout.ts +0 -554
- package/src/journey/parse-core.ts +0 -251
- package/src/journey/parser.ts +0 -101
- package/src/journey/renderer.ts +0 -917
- package/src/journey/types.ts +0 -144
- package/src/layout/geometry.ts +0 -182
- package/src/layout/pass.ts +0 -142
- package/src/layout/passes/index.ts +0 -3916
- package/src/layout-engine.ts +0 -1565
- package/src/layout-rubric.ts +0 -659
- package/src/mcp/artifacts.ts +0 -137
- package/src/mcp/dynamic-harness.ts +0 -31
- package/src/mcp/dynamic-modules.d.ts +0 -7
- package/src/mcp/facade.ts +0 -608
- package/src/mcp/harness-runtime.ts +0 -203
- package/src/mcp/hosted-server.ts +0 -468
- package/src/mcp/mcp-bin.ts +0 -3
- package/src/mcp/mcp-cli.ts +0 -82
- package/src/mcp/protocol.ts +0 -13
- package/src/mcp/sandbox.ts +0 -195
- package/src/mcp/sdk-decl.ts +0 -391
- package/src/mcp/server.ts +0 -362
- package/src/mcp/tool-surface.ts +0 -146
- package/src/mermaid-source.ts +0 -655
- package/src/multiline-utils.ts +0 -228
- package/src/parser.ts +0 -1031
- package/src/pie/layout.ts +0 -168
- package/src/pie/parser.ts +0 -136
- package/src/pie/renderer.ts +0 -234
- package/src/pie/types.ts +0 -82
- package/src/quadrant/layout.ts +0 -191
- package/src/quadrant/parser.ts +0 -183
- package/src/quadrant/renderer.ts +0 -322
- package/src/quadrant/types.ts +0 -113
- package/src/render-family-hooks.ts +0 -244
- package/src/renderer.ts +0 -1099
- package/src/route-contracts.ts +0 -2723
- package/src/scene/backend.ts +0 -76
- package/src/scene/fidelity.ts +0 -183
- package/src/scene/hybrid-backend.ts +0 -174
- package/src/scene/ir.ts +0 -181
- package/src/scene/marks.ts +0 -127
- package/src/scene/rough-backend.ts +0 -378
- package/src/scene/seed.ts +0 -46
- package/src/scene/style-registry.ts +0 -556
- package/src/sequence/layout.ts +0 -456
- package/src/sequence/parser.ts +0 -255
- package/src/sequence/renderer.ts +0 -604
- package/src/sequence/types.ts +0 -154
- package/src/shape-clipping.ts +0 -351
- package/src/shared/accessibility-directives.ts +0 -22
- package/src/shared/batched.ts +0 -61
- package/src/shared/color-math.ts +0 -93
- package/src/shared/svg-a11y.ts +0 -29
- package/src/shared/syntax-error.ts +0 -17
- package/src/shared/unicode-ranges.ts +0 -135
- package/src/styles.ts +0 -318
- package/src/svg-paths.ts +0 -28
- package/src/text-metrics.ts +0 -248
- package/src/theme.ts +0 -710
- package/src/timeline/layout.ts +0 -381
- package/src/timeline/parser.ts +0 -215
- package/src/timeline/renderer.ts +0 -538
- package/src/timeline/types.ts +0 -105
- package/src/types.ts +0 -462
- package/src/website-worker-modules.d.ts +0 -18
- package/src/xychart/axis-utils.ts +0 -109
- package/src/xychart/colors.ts +0 -124
- package/src/xychart/config.ts +0 -88
- package/src/xychart/layout.ts +0 -656
- package/src/xychart/parser.ts +0 -504
- package/src/xychart/renderer.ts +0 -640
- package/src/xychart/types.ts +0 -282
package/docs/mutation-testing.md
DELETED
|
@@ -1,206 +0,0 @@
|
|
|
1
|
-
# Mutation testing (ASCII layout core)
|
|
2
|
-
|
|
3
|
-
Stryker mutation testing is scoped to the five ASCII 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 config is `stryker.ascii.config.json`; its command runner 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
|
-
npx stryker run stryker.ascii.config.json --mutate 'src/ascii/pathfinder.ts'
|
|
15
|
-
|
|
16
|
-
# All five (also available as `bun run mutation-test:ascii`):
|
|
17
|
-
npx stryker run stryker.ascii.config.json
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
(`stryker.families.config.json` / `bun run mutation-test:families` covers the
|
|
21
|
-
agent family parsers, and `stryker.routes.config.json` / `bun run
|
|
22
|
-
mutation-test:routes` covers the route-contracts module
|
|
23
|
-
(`docs/design/system/route-contracts.md`), all with the same policy.)
|
|
24
|
-
|
|
25
|
-
Narrow lanes for PR-scale survivor harvests:
|
|
26
|
-
|
|
27
|
-
```bash
|
|
28
|
-
bun run mutation-test:links # text-embedded link-length parsing
|
|
29
|
-
bun run mutation-test:routes:certs # route-certificate finality + stale-route audit
|
|
30
|
-
bun run mutation-test:routes:subgraph # subgraph endpoint/LCA routing
|
|
31
|
-
bun run sabotage:routes # one-line revert checks against committed HEAD; expects focused tests to fail
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
The JSON report lands in `reports/mutation/` (gitignored). Beyond the lanes
|
|
35
|
-
documented here, `stryker.*.config.json` also covers the per-family parsers
|
|
36
|
-
(state/sequence/timeline/class/er/journey/pie/quadrant/gantt via
|
|
37
|
-
`mutation-test:families`), characterization, and the link-grammar lane — see
|
|
38
|
-
`package.json` scripts for the full index. Broad route lanes
|
|
39
|
-
are intentionally not part of the PR gate, but `.github/workflows/nightly-route-mutation.yml`
|
|
40
|
-
runs `mutation-test:routes`, `mutation-test:routes:certs`,
|
|
41
|
-
`mutation-test:routes:subgraph`, and `sabotage:routes` nightly and on manual
|
|
42
|
-
`workflow_dispatch`, uploading reports as artifacts — though every scheduled
|
|
43
|
-
run to date has been cancelled at the 90-minute cap before uploading anything
|
|
44
|
-
(the unsharded routes lane exceeds it; PR #63 carries the sharding fix), so
|
|
45
|
-
current scores come from local runs. Run the narrow lane locally
|
|
46
|
-
when you touch ASCII/route core logic and want immediate proof the tests bite.
|
|
47
|
-
|
|
48
|
-
## Policy
|
|
49
|
-
|
|
50
|
-
A SURVIVED mutant is a test gap until shown otherwise. Either kill it with a
|
|
51
|
-
test (and sabotage-verify the test), or classify it below with a reason.
|
|
52
|
-
Don't chase 100%: performance-guard and unreachable-branch mutants are
|
|
53
|
-
documented, not killed with synthetic inputs.
|
|
54
|
-
|
|
55
|
-
## Baseline (June 2026, first scoped run)
|
|
56
|
-
|
|
57
|
-
| File | Score | Killed+timeout | Survived |
|
|
58
|
-
| --- | --- | --- | --- |
|
|
59
|
-
| pathfinder.ts | 60.3% → 70.8% after `ascii-pathfinder-units.test.ts` | 184 → 216 | 121 → 89 |
|
|
60
|
-
| edge-routing.ts | 55.1% | 163 | 133 |
|
|
61
|
-
| converter.ts | 38.4% | 94 | 151 |
|
|
62
|
-
| grid.ts | 70.1% | 421 | 180 |
|
|
63
|
-
| 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 |
|
|
64
|
-
| 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 purely on denominator growth (~3× since batch 3); a survivor-harvest batch is the documented next quality step. | 882 → 2740 | 50.69% (1381 killed) — survivor harvest pending |
|
|
65
|
-
|
|
66
|
-
(Numbers from the June 2026 runs; regenerate rather than trusting this
|
|
67
|
-
table — the report lands in `reports/mutation/`.)
|
|
68
|
-
|
|
69
|
-
## Survivor classification
|
|
70
|
-
|
|
71
|
-
**linkrank lane residual (124 at the 65.07% run)**, classified:
|
|
72
|
-
|
|
73
|
-
- **Real gap, next harvest**: the subgraph-scoped `separationUnit` branch (walk the
|
|
74
|
-
overlapped node's scope chain, push its outermost subgraph unit) never fires — the
|
|
75
|
-
degenerate repro set has no subgraphs. Killing these needs a subgraph + long-link
|
|
76
|
-
shove-overlap fixture.
|
|
77
|
-
- **Unexercised defensive fallbacks**: the `rungSource` feedback family and some
|
|
78
|
-
min-lane branches fire only on inputs the deterministic enumeration no longer
|
|
79
|
-
produces (0 residual signatures); every adopted route is still runtime-validated by
|
|
80
|
-
`routeClearOfNodes`, so a wrong fallback cannot ship a through-node route.
|
|
81
|
-
- **Equivalent on the real input domain**: exact-tie tiebreaks (`flowGap !== 0` id
|
|
82
|
-
fallback), the `pairKey` separator literal (any injective separator), the defensive
|
|
83
|
-
round cap (`nodes.length * 4` — forward-only motion terminates before it), and the
|
|
84
|
-
candidate-list `slice(0, 16)` caps (lists are shorter in practice).
|
|
85
|
-
|
|
86
|
-
**Killed by `src/__tests__/ascii-pathfinder-units.test.ts`** (32 mutants):
|
|
87
|
-
`buildMoveDirs` preferred-direction ordering (it only decides ties between
|
|
88
|
-
equal-cost A* paths, which the golden corpus never isolates; the unit tests
|
|
89
|
-
pin `path[1]` per direction), `heuristic` corner-penalty logic, and
|
|
90
|
-
`mergePath` straight-run detection (backtracks and mixed-delta steps must
|
|
91
|
-
be preserved).
|
|
92
|
-
|
|
93
|
-
**Accepted — performance guards, not behavior** (pathfinder): the #66
|
|
94
|
-
bounded-search mutants (`next.x > boundX || next.y > boundY` weakenings,
|
|
95
|
-
`maxIterations` arithmetic). They change how much work an unreachable-target
|
|
96
|
-
search does before returning null, not what any reachable search returns. A
|
|
97
|
-
test would need to time the search, which is flakier than the risk warrants.
|
|
98
|
-
|
|
99
|
-
**Accepted — unreachable via convention** (pathfinder): the `dy`-dominant
|
|
100
|
-
fallback in `buildMoveDirs` (lines ~157–159). All nine 3×3 `Direction`
|
|
101
|
-
constants either match an explicit cardinal branch or have `|dx| >= |dy|`,
|
|
102
|
-
so the branch only runs for synthetic Direction values. Candidate for
|
|
103
|
-
simplification, not for synthetic-input tests.
|
|
104
|
-
|
|
105
|
-
**Found dead code**: the first mutation run showed the audit-suggested sort
|
|
106
|
-
tie-breaks on the two `b.index - a.index` comparators in
|
|
107
|
-
`determineLabelLine` could never fire — segment `index` is unique by
|
|
108
|
-
construction — so they were reverted. Only the width-sort tie-break (where
|
|
109
|
-
ties are real) remains. Mutation testing earning its keep: it falsified an
|
|
110
|
-
audit assumption the test suite couldn't.
|
|
111
|
-
|
|
112
|
-
**Killed by `route-contracts.test.ts` survivor harvests** (170 mutants
|
|
113
|
-
across five passes): RL/BT axis orientation (reciprocal-pair regressions in
|
|
114
|
-
both reversed directions), every `directLaneBlockers` blocker kind at its
|
|
115
|
-
exact ±4px clearance boundary on both axes (non-square obstacles so a
|
|
116
|
-
swapped width/height changes the verdict), own-label lane capacity in
|
|
117
|
-
rendered-pill units, the same-edgeIndex self-exclusion, sub-epsilon
|
|
118
|
-
polyline simplification, the hitch deviation rounding, `findLabelSlot`
|
|
119
|
-
stagger and pill-boundary arithmetic, the primary-over-feedback exemption
|
|
120
|
-
asymmetry, the feedback path of `findRouteHitches`, shared-trunk detection
|
|
121
|
-
on both axes at its collinearity/pill-extent boundaries, the ±2px line
|
|
122
|
-
between the stale and shape-misanchor tripwires, container perimeter
|
|
123
|
-
tolerance, and the container repair's horizontal-gap axis selection.
|
|
124
|
-
|
|
125
|
-
**Accepted — equivalent on the real input domain** (route-contracts): the
|
|
126
|
-
collinearity cross-product variants in `simplifyPolyline` behave identically
|
|
127
|
-
for the orthogonal polylines ELK produces (several algebraic rearrangements
|
|
128
|
-
preserve the zero/non-zero verdict for axis-aligned triples), and the
|
|
129
|
-
`isMonotoneStaircase` diagonal/backward guards are defensive against passes
|
|
130
|
-
that do not currently exist — real extracted routes are orthogonal and the
|
|
131
|
-
backward case is already excluded by feedback classification upstream.
|
|
132
|
-
|
|
133
|
-
**Accepted — performance guards** (route-contracts): the `seen`-set and
|
|
134
|
-
stack mechanics inside `classifyRoutes`' DFS change traversal cost, not
|
|
135
|
-
reachability verdicts, on the small graphs flowcharts produce.
|
|
136
|
-
|
|
137
|
-
**Accepted — bounded-iteration guard** (route-contracts): the fixed-point
|
|
138
|
-
loop's `round < 4` weakenings only change how many re-prove rounds run;
|
|
139
|
-
the duplicate-edge regression pins one unblocking round, and constructing
|
|
140
|
-
a graph that needs three chained rounds would be a synthetic-input test.
|
|
141
|
-
|
|
142
|
-
**Open test gaps** (highest-value first):
|
|
143
|
-
- `directLaneBlockers` label-rect axis ternaries retain a few survivors on
|
|
144
|
-
rect width/height swaps for near-square pills; a multi-line (taller than
|
|
145
|
-
wide) label obstacle fixture would discriminate them.
|
|
146
|
-
- `findLabelSlot`'s rect-overlap conjunction retains sign-variant survivors
|
|
147
|
-
for rects that only graze on one axis; corner-touching fixtures would
|
|
148
|
-
pin them.
|
|
149
|
-
- The audit's pill-hit prefilter (`hitsPill`) retains inclusive-vs-strict
|
|
150
|
-
comparison survivors for segments that exactly graze the pill border;
|
|
151
|
-
they only widen the prefilter the collinearity check still gates.
|
|
152
|
-
- The container repair's reversed-order gaps (target above / left of
|
|
153
|
-
source) lack fixtures; the gap arithmetic is symmetric with the two
|
|
154
|
-
covered directions.
|
|
155
|
-
- `grid.ts` `ensureSubgraphSpacing` (~48 survivors): the overlap/min-spacing
|
|
156
|
-
resolution between root subgraphs is never triggered by the corpus —
|
|
157
|
-
placement upstream appears to avoid overlaps already. Needs either a
|
|
158
|
-
corpus sample that genuinely overlaps or a dead-code verdict.
|
|
159
|
-
- `converter.ts` entry/exit attachment roles and phantom still-used checks
|
|
160
|
-
(`resolveSubgraphEdges` area): rendered-output invariants tolerate several
|
|
161
|
-
mutants because other mechanisms compensate. Needs assertions on the
|
|
162
|
-
resolved edge structure, not just the rendered text.
|
|
163
|
-
- `edge-routing.ts` label segment filter (`width >= lenLabel && index > 1 &&
|
|
164
|
-
orientationMatches`): the labeled-fanout invariants pin the TD vertical-drop
|
|
165
|
-
case; LR orientation and the index>1 exclusion lack direct coverage.
|
|
166
|
-
|
|
167
|
-
## Incremental per-PR lane (`stryker.incremental.config.json`)
|
|
168
|
-
|
|
169
|
-
A fast lane gates the small, pure faithfulness counter on every PR (the
|
|
170
|
-
`mutation-incremental` CI job), separate from the broad nightly lanes. It
|
|
171
|
-
mutates `src/agent/structural-count.ts` (the counter + `faithfulnessWarning` +
|
|
172
|
-
`isDrop`), run by the sub-second `structural-count.test.ts` unit runner. A full
|
|
173
|
-
run is ~1 min, so it runs in full each PR.
|
|
174
|
-
|
|
175
|
-
Score is ~96% (regenerate to confirm; the report lands in `reports/mutation/`),
|
|
176
|
-
gated by `thresholds.break: 90`. The few survivors are all equivalent mutants,
|
|
177
|
-
accepted not chased:
|
|
178
|
-
|
|
179
|
-
- `structural-count.ts:96` (`case 'opaque': return null`) — two mutants
|
|
180
|
-
(the case label + its string). Equivalent: an opaque body returns `null`, and
|
|
181
|
-
the `default` branch *also* returns `null`, so mutating the `opaque` case
|
|
182
|
-
cannot change the result for any input.
|
|
183
|
-
- `structural-count.ts:98` (`default:` exhaustiveness branch) — two mutants
|
|
184
|
-
(the branch condition + its block). Unreachable by construction: all twelve
|
|
185
|
-
families are handled explicitly and the `const _never: never = body` assigns
|
|
186
|
-
compile-time exhaustiveness, so the branch never executes at runtime.
|
|
187
|
-
|
|
188
|
-
What earlier survivors taught us (now killed, kept as regression fixtures): the
|
|
189
|
-
recursive `edges += inner.edges` state accumulation needed a *doubly-nested*
|
|
190
|
-
composite-state fixture, and `nodes = services + junctions` needed an
|
|
191
|
-
architecture fixture that actually contains a junction.
|
|
192
|
-
|
|
193
|
-
### Why `verify.ts`'s faithfulness wrapper is NOT in the gated mutate set
|
|
194
|
-
|
|
195
|
-
Move 2 measured `roundtripFaithfulnessWarnings` (the I/O wrapper around the pure
|
|
196
|
-
`faithfulnessWarning`): **26.67% kill / 11 survivors**. The survivors are all on
|
|
197
|
-
the wrapper's defensive branches — `if (!reparsed.ok) …`, `if (!after) …`, and
|
|
198
|
-
the `catch` — which no *real* diagram exercises: a structured diagram's
|
|
199
|
-
serialization always re-parses, and re-parses structured (not opaque), and never
|
|
200
|
-
throws. Those branches are therefore unkillable through real `verifyMermaid`
|
|
201
|
-
inputs without a synthetic drop, and the *decision logic* they guard already
|
|
202
|
-
lives in `faithfulnessWarning`, which the incremental lane gates at 96%+. Adding
|
|
203
|
-
the wrapper to the gated `mutate` would crater the score to ~27% and force either
|
|
204
|
-
a meaningless break threshold or a pile of accepted survivors. So the wrapper
|
|
205
|
-
stays out of the gated set and is recorded here as I/O-glue equivalents; its
|
|
206
|
-
logic is covered where it actually lives.
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
# Divergences
|
|
2
|
-
|
|
3
|
-
Current implementation decisions that differ from, or materially narrow, the broader `AGENT_NATIVE.md` architecture. This file is **not** a backlog; active work lives only in `TODO.md`. Historical loop logs were removed because they had become process noise. Use Git history for archaeology.
|
|
4
|
-
|
|
5
|
-
## What still matters
|
|
6
|
-
|
|
7
|
-
### Determinism is structural, not seeded
|
|
8
|
-
|
|
9
|
-
- Removed the old `LayoutContext` / `SeededRNG` / `Clock` / `withSeededRandom` / font-metrics apparatus.
|
|
10
|
-
- `RenderedLayout` has no `seed` field.
|
|
11
|
-
- `VerifyOptions` is intentionally small: `{ suppress?, labelCharCap? }`.
|
|
12
|
-
- Claim scope: same-input structural layout determinism is tested for the supported runtime/version matrix. Cross-machine or cross-architecture float equality is **not** claimed.
|
|
13
|
-
|
|
14
|
-
### Package and compatibility choices
|
|
15
|
-
|
|
16
|
-
- Product/docs, npm package name, and repository path are **Agentic Mermaid** / `agentic-mermaid` / `adewale/agentic-mermaid`. The agent surface ships as the `./agent` subpath.
|
|
17
|
-
- `MermaidGraph` and `renderMermaidSVGAsync` remain for compatibility with existing renderer/tests/consumers.
|
|
18
|
-
- ~~`state` diagrams currently share the flowchart body (`body.kind: 'flowchart'`)…~~ **Superseded by BUILD-19.** State diagrams now own a dedicated `StateBody` IR (`body.kind: 'state'`) with state-shaped ops and a real `asState` narrower. `asFlowchart` returns `null` on a state diagram (a breaking change within the unreleased agent surface). Verify still gets full Tier 1 + Tier 2 geometric coverage: the `StateBody` projects to a `MermaidGraph` via the legacy parser (`stateBodyToGraph`) and runs the identical flowchart `verifyGraph`. The modeled subset is simple states/transitions/`[*]` pseudostates/composites/`direction`; unmodeled syntax (`<<fork>>`/`<<choice>>`/`<<join>>`, history, concurrency `--`, notes, `classDef`/`class`/`:::`) falls back to a lossless opaque body. Corpus round-trip for state jumped 5% → 100%.
|
|
19
|
-
|
|
20
|
-
### Mutation surface is intentionally narrower than Mermaid syntax
|
|
21
|
-
|
|
22
|
-
Structured mutation is exposed for every built-in renderable family, but only when that body's parser/IR/serializer/verifier can preserve the modeled semantics:
|
|
23
|
-
|
|
24
|
-
- flowchart/state;
|
|
25
|
-
- sequence (BUILD-18 — segment-preserving: participant/message ops stay live while Note/alt/loop/par/activate/autonumber/title ride along verbatim as opaque-block segments; only un-segmentable input such as an unbalanced `end` falls back to whole-body opaque);
|
|
26
|
-
- timeline;
|
|
27
|
-
- class;
|
|
28
|
-
- ER;
|
|
29
|
-
- journey (BUILD-15 pilot);
|
|
30
|
-
- architecture (BUILD-17 — the modeled subset of groups/services/junctions/edges);
|
|
31
|
-
- xychart (BUILD-16 — the modeled subset of title/axes/series);
|
|
32
|
-
- pie;
|
|
33
|
-
- quadrant;
|
|
34
|
-
- gantt.
|
|
35
|
-
|
|
36
|
-
Opaque/source-level bodies:
|
|
37
|
-
|
|
38
|
-
- any known-family diagram that falls back to opaque because it contains unmodeled syntax (e.g. architecture `{group}` boundary modifiers, accTitle/accDescr, malformed pie entries, out-of-range quadrant coordinates, or un-segmentable sequence/gantt syntax).
|
|
39
|
-
|
|
40
|
-
For source-level bodies, agents may render, verify, describe, and round-trip preserved source. They do **not** get typed mutation ops. `am mutate` returns `UNSUPPORTED_FAMILY` for those bodies.
|
|
41
|
-
|
|
42
|
-
### Structured-or-opaque is load-bearing
|
|
43
|
-
|
|
44
|
-
Known-family input must never be partially parsed and then re-emitted with unknown constructs dropped. If the structured parser cannot preserve a construct, the body stays opaque/source-preserved and serializes from `body.source`.
|
|
45
|
-
|
|
46
|
-
BUILD-18 refines "opaque/source-preserved" for sequence into a finer grain: a sequence body now interleaves structured statements with **opaque-block segments** holding unmodeled lines verbatim, so the structured ops survive instead of being forfeited at the first unmodeled line. The never-lossy invariant is unchanged — the segment lines are byte-for-byte preserved — and whole-body opaque is still the fallback for un-segmentable input. Class/ER/timeline can adopt the same segment-preserving body as follow-up work.
|
|
47
|
-
|
|
48
|
-
This applies even when the diagram renders successfully. Render support is not the same as structured editing support.
|
|
49
|
-
|
|
50
|
-
### Code Mode is local, synchronous, and lineage-checked
|
|
51
|
-
|
|
52
|
-
- The MCP server exposes a Code Mode-style `execute(code)` tool backed by local `node:vm`; it is not Cloudflare Codemode and not a container/OS security boundary.
|
|
53
|
-
- Code Mode is synchronous: no `async`/`await`, Promise jobs, dynamic import, finalizers, or blocking/realm-creating globals.
|
|
54
|
-
- SDK-returned diagrams are read-only. Structured edits must go through `mermaid.mutate(...)` and must use trusted diagram lineage from parse/mutate/narrower outputs.
|
|
55
|
-
|
|
56
|
-
### Runtime surfaces are part of the contract
|
|
57
|
-
|
|
58
|
-
Keep these in sync when changing agent behavior:
|
|
59
|
-
|
|
60
|
-
- `src/agent/*` public API;
|
|
61
|
-
- `am capabilities` and CLI help;
|
|
62
|
-
- MCP SDK declaration and server instructions;
|
|
63
|
-
- `Instructions_for_agents.md` / `am --agent-instructions`;
|
|
64
|
-
- `skills/agentic-mermaid-diagram-workflow/*`;
|
|
65
|
-
- `skills/agentic-mermaid-live-editor/SKILL.md`;
|
|
66
|
-
- `llms.txt`;
|
|
67
|
-
- `docs/agent-api-cookbook.md`.
|
|
68
|
-
|
|
69
|
-
Doc-sync tests exist because agents consume docs and capability JSON as runtime surface, not just prose.
|
|
70
|
-
|
|
71
|
-
## Important fixed issues worth remembering
|
|
72
|
-
|
|
73
|
-
These are retained only because they explain guardrails that may otherwise look excessive:
|
|
74
|
-
|
|
75
|
-
- **Opaque fidelity:** opaque bodies serialize from preserved `body.source`, not normalized `canonicalSource`, so indentation/comments/source text survive parse → serialize.
|
|
76
|
-
- **`am parse | am serialize`:** JSON payloads preserve flowchart styling maps and defensively normalize loose SDK-shaped subgraphs.
|
|
77
|
-
- **Subgraph payload hardening:** `synthesizeFromGraph` tolerates missing `children`, null entries, cyclic references, non-tuple map arrays, and non-integer linkStyle keys.
|
|
78
|
-
- **Timeline mutation:** timeline edits update `canonicalSource`, validate mutation text, allocate unique IDs, and fall back to opaque for header-suffix/lossy syntax.
|
|
79
|
-
- **Shared routing cleanup:** SVG, ASCII, and agent parsing use shared diagram-family detection from `src/mermaid-source.ts`; agent parsing adds only a loose known-family path so malformed known headers can round-trip as opaque.
|
|
80
|
-
- **Source-based `LABEL_OVERFLOW`:** verification checks labels for opaque/source-level families via family label extractors, so fallback does not mean "unverified."
|
|
81
|
-
|
|
82
|
-
## Evidence and limits
|
|
83
|
-
|
|
84
|
-
What the current suite demonstrates:
|
|
85
|
-
|
|
86
|
-
- typed mutation works for the exposed structured families;
|
|
87
|
-
- unsupported/opaque/source-level bodies refuse structured mutation instead of losing source;
|
|
88
|
-
- verify-before-serialize and Code Mode trace linting catch key agent anti-patterns;
|
|
89
|
-
- corpus gates cover Mermaid docs examples and MermaidSeqBench round-trip stability;
|
|
90
|
-
- docs/capabilities/CLI/MCP declarations are checked for consistency.
|
|
91
|
-
|
|
92
|
-
What it does **not** yet prove:
|
|
93
|
-
|
|
94
|
-
- market demand;
|
|
95
|
-
- that a real external consumer likes the API;
|
|
96
|
-
- that a selected release model follows the intended loop from docs alone.
|
|
97
|
-
|
|
98
|
-
Those validation items remain in `TODO.md`.
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
# Dogfooding our docs: render and pin our own documentation with our own tools
|
|
2
|
-
|
|
3
|
-
Status: strategy. Drafted 2026-06-20.
|
|
4
|
-
|
|
5
|
-
Agentic Mermaid is a deterministic diagram engine with a typed, verifiable agent surface. Our
|
|
6
|
-
documentation should meet the same bar as our output: **generated by the system it documents, and
|
|
7
|
-
pinned by a test so it cannot silently drift.** An architecture diagram that rots, or a "supported
|
|
8
|
-
families" list that lags the registry, is worse than no doc — it actively misleads.
|
|
9
|
-
|
|
10
|
-
## Principle
|
|
11
|
-
|
|
12
|
-
If a piece of documentation can be *derived* from the code, derive it — then add a test that
|
|
13
|
-
regenerates it from the source of truth and fails when the committed doc disagrees. This is the
|
|
14
|
-
documentation analogue of the determinism and round-trip guarantees the engine already enforces
|
|
15
|
-
([`AGENT_NATIVE.md`](../../AGENT_NATIVE.md) §1, §3): the same inputs must produce the same artifact,
|
|
16
|
-
and the artifact is checked, not trusted.
|
|
17
|
-
|
|
18
|
-
Two regeneration shapes, both gated by `UPDATE_GOLDEN=1 bun test <file>`:
|
|
19
|
-
|
|
20
|
-
| Shape | Source of truth | Artifact | Test asserts |
|
|
21
|
-
|---|---|---|---|
|
|
22
|
-
| **Rendered figure** | a committed `.mmd` | a committed `.svg`, rendered by `renderMermaidSVG` | deterministic re-render + byte-match (normalized) |
|
|
23
|
-
| **Projected table/list** | a code registry (e.g. `BUILTIN_FAMILY_METADATA`) | a marked region in a `.md` | rebuild from the registry + region match |
|
|
24
|
-
|
|
25
|
-
## Instances in the repo
|
|
26
|
-
|
|
27
|
-
1. **The architecture figure** — `docs/design/system/architecture.{mmd,svg}`, pinned by
|
|
28
|
-
`src/__tests__/docs-architecture-diagram.test.ts`. The three-stacks diagram is authored as
|
|
29
|
-
Mermaid and rendered by our own engine; the test asserts the render is deterministic across
|
|
30
|
-
calls and matches the committed SVG. Docs *about* the system, produced *by* the system.
|
|
31
|
-
2. **The family roster table** — the built-in-families table in
|
|
32
|
-
`docs/design/system/abstraction-audit.md` §2, pinned by `src/__tests__/audit-family-table.test.ts`.
|
|
33
|
-
It is generated from `BUILTIN_FAMILY_METADATA`; add or rename a family and the test fails until
|
|
34
|
-
the audit is regenerated.
|
|
35
|
-
|
|
36
|
-
These join the repo's existing doc-sync guarantees, which already follow the same philosophy:
|
|
37
|
-
|
|
38
|
-
- `Instructions_for_agents.md` is byte-identical to `am --agent-instructions` (doc-sync test).
|
|
39
|
-
- `package.json` keywords, `llms.txt`, editor examples, and CLI capabilities are all projected from
|
|
40
|
-
`BUILTIN_FAMILY_METADATA` and checked (`doc-sync.test.ts`, `diagram-family-citizenship.test.ts`).
|
|
41
|
-
- Every `LayoutWarning` code and `MutationOp` kind must appear in `AGENT_NATIVE.md` (doc-sync).
|
|
42
|
-
|
|
43
|
-
## How to add a dogfooded doc
|
|
44
|
-
|
|
45
|
-
**A rendered figure:**
|
|
46
|
-
1. Author the source as `docs/.../<name>.mmd`.
|
|
47
|
-
2. Add a snapshot test modeled on `docs-architecture-diagram.test.ts` that renders the `.mmd` with
|
|
48
|
-
`renderMermaidSVG` and compares to `<name>.svg`, with an `UPDATE_GOLDEN` write path.
|
|
49
|
-
3. Run `UPDATE_GOLDEN=1 bun test <test>` to materialize the artifact; commit both.
|
|
50
|
-
|
|
51
|
-
**A projected table/list:**
|
|
52
|
-
1. Wrap the region in the doc with `<!-- NAME:start -->` / `<!-- NAME:end -->` markers.
|
|
53
|
-
2. Add a test modeled on `audit-family-table.test.ts` that rebuilds the region from the code
|
|
54
|
-
registry and compares, with an `UPDATE_GOLDEN` write path.
|
|
55
|
-
3. Regenerate and commit.
|
|
56
|
-
|
|
57
|
-
## Boundaries
|
|
58
|
-
|
|
59
|
-
- **Pin what is *derivable*.** Prose judgement — the audit's analysis, the recommendations — is not
|
|
60
|
-
mechanically generated; it is reviewed like code. Only the derivable parts (the figure, the
|
|
61
|
-
roster) are auto-pinned.
|
|
62
|
-
- **Rendered-SVG snapshots carry the "within one ELK version" determinism assumption** of the
|
|
63
|
-
existing `*-svg-snapshot` goldens (`AGENT_NATIVE.md` §1). They guard drift within the CI
|
|
64
|
-
environment, not cross-version byte-equality.
|
|
65
|
-
- **Keep generated regions small and clearly marked** so a reader — and `git diff` — can see what
|
|
66
|
-
is machine-owned versus hand-written.
|