@afokapu/atdd-bun 0.10.30 → 0.10.32

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 (51) hide show
  1. package/README.md +2 -112
  2. package/conventions/atdd-bun.profiles/atdd-bun.profiles.presets.convention.yaml +2 -3
  3. package/conventions/planner.docs/planner.docs.area-index-required.convention.yaml +2 -2
  4. package/conventions/planner.docs/planner.docs.artifact-path-shape.convention.yaml +1 -1
  5. package/conventions/planner.docs/planner.docs.asciidoc-only.convention.yaml +0 -1
  6. package/conventions/planner.docs/planner.docs.identity-required.convention.yaml +1 -1
  7. package/conventions/planner.docs/planner.docs.undeclared-change.convention.yaml +1 -2
  8. package/detectors/bun_interlocking_coverage/_shared/interlocking.mjs +15 -1
  9. package/detectors/bun_interlocking_coverage/checks/interlocking_train_sequence.mjs +7 -5
  10. package/detectors/planner_docs_capability/README.md +1 -1
  11. package/integrity.json +22 -50
  12. package/package.json +1 -1
  13. package/relationships.yaml +0 -151
  14. package/src/agent.ts +2 -18
  15. package/src/cli.ts +0 -8
  16. package/src/docs-capability.ts +6 -24
  17. package/src/enforce.ts +1 -2
  18. package/src/hooks.ts +1 -5
  19. package/src/index.ts +0 -2
  20. package/src/integrity.ts +3 -9
  21. package/src/setup.ts +1 -3
  22. package/templates/agents/AGENTS.block.md +0 -2
  23. package/templates/github/atdd-bun.yml +0 -5
  24. package/conventions/delivery/delivery.approved-sha-resolves.convention.yaml +0 -33
  25. package/conventions/delivery/delivery.board.convention.yaml +0 -60
  26. package/conventions/delivery/delivery.config-schema.convention.yaml +0 -49
  27. package/conventions/delivery/delivery.evidence-schema.convention.yaml +0 -34
  28. package/conventions/delivery/delivery.findings-resolved.convention.yaml +0 -42
  29. package/conventions/delivery/delivery.merge-gate.convention.yaml +0 -46
  30. package/conventions/delivery/delivery.model-allowed.convention.yaml +0 -29
  31. package/conventions/delivery/delivery.operating-model.convention.yaml +0 -97
  32. package/conventions/delivery/delivery.review.convention.yaml +0 -42
  33. package/conventions/delivery/delivery.reviewer-independent.convention.yaml +0 -34
  34. package/conventions/delivery/delivery.stages-complete.convention.yaml +0 -33
  35. package/detectors/delivery_evidence/atdd.implementation.yaml +0 -33
  36. package/detectors/delivery_evidence/detect.mjs +0 -9
  37. package/detectors/delivery_evidence/fixtures/clean/atdd-bun.yaml +0 -8
  38. package/detectors/delivery_evidence/fixtures/clean/docs/delivery/tranches/api/evidence.yaml +0 -54
  39. package/detectors/delivery_evidence/fixtures/dirty/atdd-bun.yaml +0 -3
  40. package/detectors/delivery_evidence/fixtures/dirty/docs/delivery/tranches/api/evidence.yaml +0 -31
  41. package/detectors/delivery_evidence/fixtures/dirty/docs/delivery/tranches/data/evidence.yaml +0 -8
  42. package/detectors/delivery_evidence/fixtures/dirty/docs/delivery/tranches/orphan/README.md +0 -1
  43. package/detectors/delivery_evidence/fixtures/dirty/docs/delivery/tranches/ui/evidence.yaml +0 -5
  44. package/detectors/planner_docs_capability/fixtures/dirty_missing_index/docs/delivery/release.adoc +0 -10
  45. package/detectors/planner_docs_capability/fixtures/dirty_missing_index/docs/purpose/index.adoc +0 -5
  46. package/planner-schemas/delivery-config.schema.json +0 -95
  47. package/planner-schemas/delivery-evidence.schema.json +0 -103
  48. package/src/board-ui.ts +0 -91
  49. package/src/board.ts +0 -222
  50. package/src/delivery.ts +0 -567
  51. package/templates/agents/delivery/SKILL.md +0 -15
package/README.md CHANGED
@@ -55,7 +55,6 @@ registerEnforcementTest({ root: import.meta.dir + "/..", profiles: ["traceabilit
55
55
  | `topology` | feature decomposition and the plan, source, test and E2E locations. Missing source, tests and E2E suites are reported only when a run also selects `coder` or `tester`, so a repository in the PLAN stage can enforce `planner` and `topology` before RED |
56
56
  | `planner` | schemas for every plan artifact, graph integrity, the scoped planner rules |
57
57
  | `telemetry` | the telemetry tracking plan: item shape, path-mirrored identity and versioning under `telemetry/`, wagon ownership of logical artifacts, the per-acceptance telemetry decision, metric label cardinality, source `Telemetry:` references, raw-string and forbidden-property emission, the vendor-SDK boundary around the TelemetryPort, and telemetry tests that bind the acceptance and item, assert the exact identity on a captured sink, cover every required item, and exercise declared timing semantics |
58
- | `delivery` | the review record of each tranche under `docs/delivery/tranches/`: allowed writer and reviewer models with recorded fallbacks, reviewer independence, every finding fixed, withdrawn after one dispute or ruled on by a human, every configured stage approved, and, at the gate, no change without a record and a merged head that contains exactly the approved commit. Inert until adopted |
59
58
  | `docs` | the documentation capability, including the generated journey view |
60
59
  | `coder`, `tester`, `security`, `architecture`, `metrics`, `runtime` | Bun source and test conventions |
61
60
  | `interlocking` | train/interlocking binding, infrastructure and route coverage |
@@ -85,7 +84,7 @@ the adoption that establishes the governed set, so a brownfield repository can d
85
84
  `profiles: [docs]` in an ordinary pull request. From then on, the integrity check reports, against
86
85
  the base branch, removing a profile from the list and removing the list itself. The second closes
87
86
  the two-step bypass `[docs, security]` → no list → `[docs]`. `init` writes a new `atdd-bun.yaml`
88
- with every profile listed except the opt-in `delivery`, so a greenfield repository is governed from its first commit; trim the
87
+ with every profile listed, so a greenfield repository is governed from its first commit; trim the
89
88
  list before that commit to adopt gradually.
90
89
 
91
90
  ## Configuration
@@ -109,114 +108,6 @@ worktrees: { enabled: false }
109
108
  release: { enabled: false }
110
109
  ```
111
110
 
112
- ### Delivery
113
-
114
- For programs delivered as tranches by a coordinator and persistent drivers, with headless writers
115
- and independent reviewers. Adopt it by naming `delivery` in `profiles:` (or, with no list, by adding
116
- a `delivery:` block); `agent init` then installs the delivery skill. The adopting pull request is
117
- itself governed: the skill and workflow it brings are outside the delivery root, so it carries its
118
- own tranche record, reviewed and `ready` like any other. A later change to `atdd-bun.yaml` alone
119
- needs no record: the integrity check reports any loosening for a human to approve.
120
-
121
- The policy names, for each lifecycle stage (plan, red, green, refactor, final), who may write it and
122
- who reviews it; either may be absent. By default two stages are reviewed: the plan, and the whole
123
- change at its head (final). Red, green and refactor are written and held by their gates. How the
124
- coordinator and drivers carry this out is the `delivery.operating-model` convention; what a reviewer
125
- checks is `delivery.review`; how agents talk, through a local ntfy board with one topic per program,
126
- tranche and review conversation (`atdd-bun chat`), is `delivery.board`, used only when `delivery.board` is
127
- set. The skill only points to them.
128
-
129
- The records live with the program's reasoning, in the docs profile's `docs/delivery/` area:
130
-
131
- ```text
132
- docs/delivery/index.adoc the program: why, scope, how it was split (docs profile)
133
- docs/delivery/tranches/<tranche>/evidence.yaml one tranche's review record (delivery profile)
134
- docs/delivery/tranches/<tranche>/*.json the retained raw reviewer reports
135
- ```
136
-
137
- Where delivery is adopted, the docs profile leaves the records folder's records and data files to
138
- the delivery profile: they are not authored documentation, and changing them needs no docs
139
- declaration. AsciiDoc there stays documentation. Where the docs profile is active, the first tranche
140
- also brings `docs/index.adoc` and `docs/delivery/index.adoc`, each with `:doc-id:` and `:status:`,
141
- since every docs area needs an index.
142
-
143
- Upgrading from 0.8.0: records under `delivery/` are reported until `delivery.root: delivery` is set
144
- (a reported root change, approved once) or they are moved. A data file in an old tranche that no
145
- record there names is reported on local runs, not at the merge gate; removing it is a gate change a
146
- human approves, or a new tranche's record can name it.
147
-
148
- Upgrading from 0.9.0: an `atdd-bun.yaml` field with the wrong type (a quoted number, `yes`/`no`, a
149
- non-string list item, `.inf`) is now reported, and on the base branch it blocks every pull request,
150
- since the policy cannot be compared. Correct such fields on the base branch before upgrading.
151
-
152
- Upgrading to 0.10: the policy names writers and reviewers per stage. The 0.9 stage names
153
- (`plan_review`, `test_review`, `code_review`, `final_review` with `authors` and `reviewers`) are still
154
- read, as `plan`, `red`, `refactor` and `final`, and 0.9 records that name review authors still count as
155
- recorded work. Independence now defaults to `different-model`: a repository that relied on the old
156
- `fresh-process` default sets it explicitly. A repository with no `stages:` gets the new default
157
- operating model, without the integrity check reporting the change.
158
-
159
- From 0.10.2 the pre-commit hook no longer counts uncommitted work: it refused exactly the small
160
- commits that reduce it. `max_uncommitted_files` is no longer read; commit size stays limited by
161
- `max_staged_files` and `max_staged_changed_lines`.
162
-
163
- From 0.10.3 each ready record is judged by the delivery policy in `atdd-bun.yaml` at its `approved_sha`:
164
- a later policy change (dropping or reordering a model, removing a review) never makes a merged record
165
- fail. Records in progress are judged by the current policy.
166
-
167
- From 0.10.4 a stage with nothing written (a plan-only or no-op tranche) records no work; a review
168
- whose range recorded none answers for the latest recorded work before it.
169
-
170
- From 0.10.5 only coordinators and drivers use the board: a writer or reviewer takes its task from its
171
- launch prompt and returns its answer as output, which the driver posts. `atdd-bun chat wait` takes several
172
- topics and `--skip heartbeat`; reviewers answer in JSON.
173
-
174
- From 0.10.7 only a browser spec (a `*.e2e.*` file, or a Playwright file bound by `// Train:`/`// Journey:` or a
175
- `test:train:`/`test:journey:` URN) is a journey spec. A `bun:test` file may carry the `Acceptance:` line
176
- traceability needs, including a test proving `acc:train:…` and the journey test `atdd-bun.topology.e2e-location` requires.
177
-
178
- Every key is optional; these are the defaults:
179
-
180
- ```yaml
181
- delivery:
182
- root: docs/delivery/tranches # one <tranche>/evidence.yaml per tranche, reports beside it
183
- require_record: true # at the gate, a change outside the root (other than atdd-bun.yaml alone) needs a tranche record
184
- multiplexer: herdr # the terminal multiplexer humans watch agents in; any command name
185
- # board: { url: http://127.0.0.1:2586 } # opt-in: agents talk through a local board; absent, there is none
186
- independence: different-model # a reviewer's model wrote none of the work it reviews; or fresh-process
187
- stages: # models in preference order: the first, then recorded fallbacks
188
- plan: { writer: [codex, claude-opus, kimi], reviewer: [glm, claude-opus, codex, kimi] }
189
- red: { writer: [glm, claude-sonnet, deepseek-flash, claude-opus, codex, kimi] }
190
- green: { writer: [glm, claude-sonnet, deepseek-flash, claude-opus, codex, kimi] }
191
- refactor: { writer: [glm, claude-sonnet, deepseek-flash, claude-opus, codex, kimi] }
192
- final: { reviewer: [codex, glm, claude-opus, kimi] }
193
- fallback: { after_failures: 3, within_minutes: 10, when_exhausted: block } # or wait
194
- commands: {} # per model: { author: "...", review: "..." } overriding delivery.operating-model's defaults
195
- ```
196
-
197
- The profile checks the record, never the running agents. The generated CI sets
198
- `ATDD_DELIVERY_GATE`: `merge` on pull requests and the merge queue, where every record the branch
199
- changes must be `ready`, the branch may differ from its approved SHA only under the delivery root,
200
- and a change outside the root needs a record unless it touches only `atdd-bun.yaml` (`require_record`, default true); `post-merge` on a
201
- push to a protected branch (the generated workflow's push branches follow `protected_branches`), where the pushed commit must contain every approved SHA it brings in. Merge tranches with a
202
- merge commit: a squash or rebase merge writes a commit no reviewer saw, and the post-merge check
203
- fails on it. Moving the root, dropping a stage, relaxing a stage from `different-model` to
204
- `fresh-process`, no longer reviewing a stage, adding a writer or reviewer, moving a fallback model earlier in a list, turning off
205
- `require_record`, making fallback easier, or adding or changing a model's `commands` loosens the policy and is reported by the integrity check.
206
-
207
- The record's model and run identifiers are the driver's claims. The profile checks that they are
208
- consistent and that a `ready` record retains every review's raw report (a record in progress may lag
209
- behind); it does not verify them
210
- cryptographically.
211
-
212
- The hooks enforce protected-branch blocking, micro-commit limits, mass-delete approval and
213
- validation of the affected area. Git can bypass them, so CI is the authority. The changed-line
214
- limit counts a moved file by the edits it carries, so relocating a directory is not measured as
215
- rewriting it; mass-delete and registry-removal approval still count a move in full.
216
- The journey view `atdd-bun docs journeys` generates is exempt from the size caps, since its index
217
- alone can exceed them, and never from the `docs` profile, which refuses a copy that is not exactly
218
- what the plan generates.
219
-
220
111
  ## Docs-site theme
221
112
 
222
113
  A repository that publishes its AsciiDoc docs as a site does not need its own theme.
@@ -237,8 +128,7 @@ To re-theme it, override its custom properties (`--paper`, `--ink`, `--accent`,
237
128
  The skill gives every coding agent the lifecycle PLAN → RED → GREEN → SMOKE → REFACTOR → TRACE and
238
129
  the profile that gates each stage. The block in `AGENTS.md` and `CLAUDE.md` adds the rules: never
239
130
  modify the toolkit itself, only the configuration it offers; turn profiles on or off in
240
- `profiles:` only when the user asks; and, where `delivery` is active, deliver tranches through the
241
- delivery skill.
131
+ `profiles:` only when the user asks.
242
132
 
243
133
  `atdd-bun integrity`, run by the generated test and first in CI on a clean install, fails when:
244
134
 
@@ -8,12 +8,11 @@ statement: >-
8
8
  terms:
9
9
  - term_id: presets
10
10
  text: >-
11
- Planning: planner (plus docs when the repository keeps documentation under docs/). Building, once RED starts: add coder, tester, traceability, security; add htmx and design for a web UI, and interlocking once trains have a runtime. Instrumenting: add telemetry. Delivering through reviewed tranches: add delivery.
11
+ Planning: planner (plus docs when the repository keeps documentation under docs/). Building, once RED starts: add coder, tester, traceability, security; add htmx and design for a web UI, and interlocking once trains have a runtime. Instrumenting: add telemetry.
12
12
  values:
13
13
  planning: [planner]
14
14
  building: [coder, tester, traceability, security]
15
15
  instrumenting: [telemetry]
16
- delivering: [delivery]
17
16
  content:
18
17
  summary: >-
19
18
  A goal is easier to name than a profile. The presets map what the user is doing to the profiles that judge it, in the order the work creates what they check.
@@ -22,7 +21,7 @@ content:
22
21
  security joins with the first code, not at release: a secret committed during GREEN stays in history.
23
22
  coder already bundles the architecture, metrics, runtime, design and responsive detectors, so those need no later preset.
24
23
  fix_hint: |
25
- At a stage whose preset is missing, ask what the user wants to do (planning, building, instrumenting, delivering), recommend that preset and say it can be adopted step by step, then write the chosen list to profiles: in atdd-bun.yaml.
24
+ At a stage whose preset is missing, ask what the user wants to do (planning, building, or instrumenting), recommend that preset and say it can be adopted step by step, then write the chosen list to profiles: in atdd-bun.yaml.
26
25
  exceptions:
27
26
  - >-
28
27
  A profile can always be run by name to see what it would report (atdd-bun coder); only profiles: decides what the repository is governed by.
@@ -5,7 +5,7 @@ status: active
5
5
  name: Each authored area carries an index.adoc
6
6
  statement: >-
7
7
  Each authored area of the canonical tree — `docs/`, `docs/purpose/`, `docs/architecture/`,
8
- `docs/architecture/decisions/`, `docs/delivery/`, `docs/archive/` — MUST contain an `index.adoc`.
8
+ `docs/architecture/decisions/`, `docs/archive/` — MUST contain an `index.adoc`.
9
9
  Other canonical filenames are defined when useful and are NOT instantiated merely to satisfy an
10
10
  empty taxonomy (spec 2 §4).
11
11
  terms:
@@ -21,7 +21,7 @@ terms:
21
21
  content:
22
22
  summary: >-
23
23
  An area without an index is an area the rendered site cannot navigate into and a reader cannot
24
- enter. The rule checks the six canonical areas only; it does not require an index in every
24
+ enter. The rule checks the five canonical areas only; it does not require an index in every
25
25
  subdirectory an author happens to create.
26
26
  normative_text: |
27
27
  The rule is scoped to the canonical areas DELIBERATELY, and the restraint is the point. Spec 2 §4
@@ -47,7 +47,7 @@ content:
47
47
  path: docs/archive/old-spec.adoc # ✓ archive lands in archive/
48
48
 
49
49
  An archived document keeps its content and gains `:status:`. It does not gain a place in
50
- `purpose/`, `architecture/` or `delivery/` — those are for documents that are accepted truth today.
50
+ `purpose/` or `architecture/` — those are for documents that are accepted truth today.
51
51
  exceptions:
52
52
  - >-
53
53
  `impact: none` declares no artifacts and is not checked by this rule. Core enforces that a
@@ -45,7 +45,6 @@ content:
45
45
  migration preserves history and never promotes it.
46
46
  exceptions:
47
47
  - Everything beneath `docs/dist/` is generated output and is never scanned.
48
- - Where the delivery profile is adopted, its records folder (delivery.root, by default `docs/delivery/tranches/`) holds tranche records and raw reviewer reports, not authored documentation; its record and data files are left to that profile, while AsciiDoc there stays documentation.
49
48
  - Markdown OUTSIDE `docs/` is untouched by this rule. `README.md`, `CONTRIBUTING.md` and the
50
49
  repository-root corpus are out of its scope; they are migrated by the adoption step, not
51
50
  rejected by this detector.
@@ -39,7 +39,7 @@ content:
39
39
  :doc-id: architecture.shared-control-root
40
40
  :status: current
41
41
 
42
- Choose the id from the area the document lives in (`architecture.`, `purpose.`, `delivery.`,
42
+ Choose the id from the area the document lives in (`architecture.`, `purpose.`,
43
43
  `archive.`) so that the id and the tree agree. Nothing enforces that agreement today; it is a
44
44
  convention that keeps ids readable, not a checked rule.
45
45
  exceptions:
@@ -42,7 +42,7 @@ content:
42
42
  impact: change
43
43
  artifacts:
44
44
  - action: modify
45
- path: docs/delivery/release.adoc
45
+ path: docs/purpose/release.adoc
46
46
 
47
47
  If the change is genuinely not a documentation change — a typo fix in a rendered artefact, a
48
48
  path you did not mean to touch — the fix is to not touch `docs/`, not to widen the declaration.
@@ -50,7 +50,6 @@ content:
50
50
  the honest correction.
51
51
  exceptions:
52
52
  - '`docs/dist/**` is generated output and is never required to be declared.'
53
- - Where the delivery profile is adopted, its records folder (delivery.root, by default `docs/delivery/tranches/`) changes with every tranche; its record and data files are governed by that profile's merge gate, not by a documentation declaration (AsciiDoc there is still documentation and still declared).
54
53
  - A repository with no documentation declaration recorded at all is core's concern (companion §4,
55
54
  check 1), not this rule's. This rule fires when a declaration exists and does not cover the diff.
56
55
  - >-
@@ -337,6 +337,7 @@ export function unbuiltWagons(croot, trainId) {
337
337
  let sourceRoot = "src/wagons";
338
338
  try { sourceRoot = Bun.YAML.parse(readText(join(croot, "atdd-bun.yaml")))?.topology?.source_root || sourceRoot; } catch { /* default layout */ }
339
339
  const hasSource = (wagon) => [...walkFiles(join(croot, sourceRoot, wagon), isTs)].some((f) => !/\.(test|spec)\.[cm]?[jt]sx?$/.test(f));
340
+ const produces = new Map();
340
341
  (function rec(dir) {
341
342
  let entries;
342
343
  try { entries = readdirSync(dir).sort(); } catch { return; }
@@ -348,6 +349,8 @@ export function unbuiltWagons(croot, trainId) {
348
349
  if (!/\.ya?ml$/.test(name)) continue;
349
350
  let doc;
350
351
  try { doc = Bun.YAML.parse(readText(full)); } catch { continue; }
352
+ if (doc && typeof doc.wagon === "string" && Array.isArray(doc.produce))
353
+ produces.set(doc.wagon.trim(), doc.produce.map((p) => p?.name).filter((name) => typeof name === "string" && name));
351
354
  if (!doc || typeof doc.train_id !== "string" || !Array.isArray(doc.sequence)) continue;
352
355
  const wagons = new Set(doc.sequence.flatMap((step) => [step?.from, step?.to]).filter((end) => typeof end === "string" && end.startsWith("wagon:")).map((end) => end.slice(6).trim()));
353
356
  byTrain.set(doc.train_id, [...wagons]);
@@ -355,7 +358,18 @@ export function unbuiltWagons(croot, trainId) {
355
358
  })(join(croot, PLAN_ROOT));
356
359
  // Only a repository that keeps wagon code under the source root can show a wagon as not built yet. Where no wagon has
357
360
  // source there (the code lives elsewhere, as in decision-os), nothing is pending and every route is judged.
358
- const built = new Map([...new Set([...byTrain.values()].flat())].map((wagon) => [wagon, hasSource(wagon)]));
361
+ // A wagon coded outside the source root is built all the same when Cargo-moving code names an artifact it produces:
362
+ // the wagon-contract rule's own evidence (C1 #lVuJXXe3mM9E). Comments are masked, tests are not read.
363
+ let cargoCode = null;
364
+ const named = (wagon) => {
365
+ const names = produces.get(wagon) ?? [];
366
+ if (!names.length) return false;
367
+ cargoCode ??= [...walkFiles(croot, isTs)].filter((f) => !/\.(test|spec)\.[cm]?[jt]sx?$/.test(f)).map((f) => readText(f) ?? "")
368
+ .filter((text) => /\bCargo\b|\bcargo\s*\.\s*(?:put|get)\s*\(/.test(text))
369
+ .map((text) => text.replace(/\/\*[\s\S]*?\*\//g, " ").replace(/(^|[^:\\])\/\/[^\n]*/g, "$1")).join("\n");
370
+ return names.some((name) => cargoCode.includes(name));
371
+ };
372
+ const built = new Map([...new Set([...byTrain.values()].flat())].map((wagon) => [wagon, hasSource(wagon) || named(wagon)]));
359
373
  const layoutInUse = [...built.values()].some(Boolean);
360
374
  for (const [trainId, wagons] of byTrain) byTrain.set(trainId, layoutInUse ? wagons.filter((wagon) => !built.get(wagon)) : []);
361
375
  pendingCache.set(croot, byTrain);
@@ -57,6 +57,7 @@ export function trainSequenceCovered(trainId, texts) {
57
57
  // reported "no test asserts the wagon SEQUENCE" about a sequence that does not exist,
58
58
  // and a route pointing at a missing train is the binding family's concern
59
59
  // (declared_route_not_runtime_resolvable), not this one.
60
+ // The plan document that declares `trainId`'s sequence, or null when none does.
60
61
  export function declaresASequence(croot, trainId) {
61
62
  const found = [];
62
63
  (function rec(dir) {
@@ -73,9 +74,9 @@ export function declaresASequence(croot, trainId) {
73
74
  for (const f of found) {
74
75
  const text = readText(f);
75
76
  if (!text.includes(trainId)) continue;
76
- if (/^\s*sequence:\s*$/m.test(text) || /^\s*sequence:\s*\[/m.test(text)) return true;
77
+ if (/^\s*sequence:\s*$/m.test(text) || /^\s*sequence:\s*\[/m.test(text)) return f;
77
78
  }
78
- return false;
79
+ return null;
79
80
  }
80
81
 
81
82
  export function scanExecution(scanRoot) {
@@ -85,13 +86,14 @@ export function scanExecution(scanRoot) {
85
86
  if (!records.length) continue;
86
87
  const files = e2eFiles(croot).map((f) => ({ file: f, text: readText(f) }));
87
88
  const texts = files.map((x) => x.text);
88
- const anchor = files.length ? rel(files[0].file, croot) : "e2e/";
89
89
  for (const trainId of [...trainsReachableFromRoutes(records)].sort()) {
90
- if (!declaresASequence(croot, trainId)) continue; // nothing declared to exercise
90
+ // The finding points at the train's own document, where the sequence a test must assert is declared (FWS #fqUGvWHn25mq).
91
+ const declared = declaresASequence(croot, trainId);
92
+ if (!declared) continue; // nothing declared to exercise
91
93
  if (unbuiltWagons(croot, trainId).length) continue; // pending: a wagon on it has no source yet
92
94
  if (trainSequenceCovered(trainId, texts)) continue;
93
95
  violations.push(
94
- mk(RULE_SEQUENCE, anchor, 1, 0,
96
+ mk(RULE_SEQUENCE, rel(declared, croot), 1, 0,
95
97
  `declared train "${trainId}" is selected by a route but no test asserts the wagon ` +
96
98
  `SEQUENCE it executes; reorder or empty its definition and the suite stays green`,
97
99
  ""),
@@ -21,7 +21,7 @@ Each `dirty_*` tree is `clean/` plus exactly one defect, so that
21
21
  | `dirty_identity` | a document with no attributes | `planner.docs.identity-required` |
22
22
  | `dirty_duplicate_id` | two documents claiming `purpose.worktrees` | `planner.docs.doc-id-unique` |
23
23
  | `dirty_unresolved_edge` | `:implements: purpose.wortrees` (a typo) | `planner.docs.graph-target-resolves` |
24
- | `dirty_missing_index` | `docs/delivery/` with its index removed | `planner.docs.area-index-required` |
24
+ | `dirty_missing_index` | `docs/purpose/` with its index removed | `planner.docs.area-index-required` |
25
25
  | `dirty_adr_registry` | ADR-20260906-002 absent from the registry | `planner.docs.adr-registry-derived` |
26
26
 
27
27
  `dirty_unresolved_edge` carries the **#1758 regression**: the test asserts the graph's
package/integrity.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
- "version": "0.10.30",
2
+ "version": "0.10.32",
3
3
  "files": {
4
4
  "HOOK_AUDIT.md": "5329d840db37671b1918f688ead26865473b87db73dbc75f7c8b2a8bbe8d6d43",
5
5
  "PLANNER_PORT.md": "fb5935bac8b7ac18994de21e43ace3a5ef8cd55f85b0e3349fca261280054f11",
6
- "README.md": "3200613045942da247f24bd54c01e6b651a0878f9b6244944e384a6731cef32e",
6
+ "README.md": "78a1acc1f18f84a567448051bec90f676e3cab7956d971abc97a6201c96fc409",
7
7
  "bunfig.toml": "b9fc65eca9014c5179380259d70e76385a6a80788fa9a2df5fb3eaa5554fd2fe",
8
8
  "conventions/atdd-bun.planner/atdd-bun.planner.acceptance-identity.convention.yaml": "81c5c773d5ee15e8d99a2c237aa9846b110b2533df45ebf407d0e3ec6ed3dd03",
9
9
  "conventions/atdd-bun.planner/atdd-bun.planner.identity-required.convention.yaml": "e96d7c1455d0c221072d82e7f2b55da1c4f9ceb17718eb6ed96affdeef37675b",
@@ -13,7 +13,7 @@
13
13
  "conventions/atdd-bun.planner/atdd-bun.planner.reference-resolves.convention.yaml": "b96927d269692c29c02fee38ecbeb999480791f8dc7486c4072a9ff30183d7d6",
14
14
  "conventions/atdd-bun.planner/atdd-bun.planner.schema.convention.yaml": "16d0a26451758b759e6ca1f5b4f38ae1feff129688306ffcc2f70f6d3974b591",
15
15
  "conventions/atdd-bun.planner/atdd-bun.planner.train-wagon-resolves.convention.yaml": "6410e248351e701dcba38c671c07c4d8f6d67927984ed4d18e567abd1eb1f3f0",
16
- "conventions/atdd-bun.profiles/atdd-bun.profiles.presets.convention.yaml": "0db36d84018fb8d799db246c6e324575c586a575f28d76d891ca5054d558e5cd",
16
+ "conventions/atdd-bun.profiles/atdd-bun.profiles.presets.convention.yaml": "a5885bfa387d0abbc4694ea2d0cf1f3639d5b45588707d4f70f2f2be4e12e847",
17
17
  "conventions/atdd-bun.topology/atdd-bun.topology.e2e-location.convention.yaml": "3a3b991bc851b86d597636200f5cb10a0defda3920348860cdca28955ab91f4c",
18
18
  "conventions/atdd-bun.topology/atdd-bun.topology.feature-source-coverage.convention.yaml": "2b64093f1e7f1fe0e2edcadf12e560fa80cecec19536abaa5bf09af362c6694e",
19
19
  "conventions/atdd-bun.topology/atdd-bun.topology.feature-test-coverage.convention.yaml": "279be57399c9b79a1bd758414076e3053d67b7d4a7fcbbb950ea12d1201effeb",
@@ -92,27 +92,16 @@
92
92
  "conventions/coder.htmx/coder.htmx.verb-endpoint-is-routed.convention.yaml": "d6aa58d35df4b7ebbcf675ca79f0177d64e56f095802b9a3eaae3e4befb5c270",
93
93
  "conventions/coder.htmx/coder.htmx.verb-endpoint-same-origin.convention.yaml": "2128d26153e2d1f19c65a1e1665d4f82c78395daedb336d6ef1256e82b74aedb",
94
94
  "conventions/coder.htmx/coder.htmx.verb-mutation-signals-progress.convention.yaml": "ae85c5ea01a09a3c41b939988088a8e5da91848d2710a1f0a1e0c86308638ac9",
95
- "conventions/delivery/delivery.approved-sha-resolves.convention.yaml": "68f2ecc10870e780abb05bb31d211b1923d47b56672df4b3950f437aa9cf8ca8",
96
- "conventions/delivery/delivery.board.convention.yaml": "fefc9f32f8ee85ee35b254cbc4aefec55a4b72eaa3a7b02b0ec21efb2074a013",
97
- "conventions/delivery/delivery.config-schema.convention.yaml": "b59a69b7789ad0c3d0b1ac9ea2b955fbbb5dfa07a9ee169a037b406a198813f0",
98
- "conventions/delivery/delivery.evidence-schema.convention.yaml": "9c6a22495dfb3e2fcbca700392866c3b5660084b1f5594230eb320b499d5e5cb",
99
- "conventions/delivery/delivery.findings-resolved.convention.yaml": "f6574e93a9a2d4bdd6d6f5645720b1a647fc0048d95f7675fe783d2ddb62c05b",
100
- "conventions/delivery/delivery.merge-gate.convention.yaml": "48745ec23625b68be9b8fe2c6dcdcba88b2b38924f6593abf6987391ff0ee243",
101
- "conventions/delivery/delivery.model-allowed.convention.yaml": "e9690e95f3604483f182b3032ae60eac20109eb458509f14651945ccf07692f2",
102
- "conventions/delivery/delivery.operating-model.convention.yaml": "1a86a1fe84695968a2fb719a899629af9a8baadcd90bdb8776f1f0208cebbbb4",
103
- "conventions/delivery/delivery.review.convention.yaml": "b033579c2d90fcb098d325dcc07c7b084e048cca43fbe8e28159ec08a412018a",
104
- "conventions/delivery/delivery.reviewer-independent.convention.yaml": "8c436d66ef5b1f6d6bc5dd55a235caca2490020e88665eecadb2ca41cd4149c5",
105
- "conventions/delivery/delivery.stages-complete.convention.yaml": "0e5dd8057ad51eff7906e3424a9686a81be1814447afb9a30acab43d39e49b4c",
106
95
  "conventions/planner.docs/planner.docs.adr-registry-derived.convention.yaml": "152cfb05c4a0e2053b09c05186d48ef330f4a94c5faddb8fbb322a81341a60a5",
107
- "conventions/planner.docs/planner.docs.area-index-required.convention.yaml": "fd931e9f225bfbb5e78436d0d8a2a89cc0f5114493579962c72dd971301becce",
108
- "conventions/planner.docs/planner.docs.artifact-path-shape.convention.yaml": "a9f6178d29abe9385342a46a2c57470a3631aaf5e26f01e3660b7088b042418e",
109
- "conventions/planner.docs/planner.docs.asciidoc-only.convention.yaml": "9e6fadbbe9aaf6015afc479f5b392e4c4324bfc47e1c59e315d26c2e5180a5f8",
96
+ "conventions/planner.docs/planner.docs.area-index-required.convention.yaml": "6b851168daf1913c24ecdb91ae1d81a9e4542e9a5354642b2c60c273c15d28e8",
97
+ "conventions/planner.docs/planner.docs.artifact-path-shape.convention.yaml": "436937a82f8e064833dc28adfeedcfa78fcdc46a74b28e956756000787b3e05e",
98
+ "conventions/planner.docs/planner.docs.asciidoc-only.convention.yaml": "6e7b5b16efd794bee677d0827adc71c2f66df8bcba0264dd74a25c67c19f3a3b",
110
99
  "conventions/planner.docs/planner.docs.doc-id-unique.convention.yaml": "558bc7d7001645f5443fcf19a5da67df17220b335d99811d103529bf22555311",
111
100
  "conventions/planner.docs/planner.docs.graph-target-resolves.convention.yaml": "657225233b92125b2667e2d72d65dc0ebc7cfc92b2c9e023d3d42449281683ea",
112
- "conventions/planner.docs/planner.docs.identity-required.convention.yaml": "86427664a497d7fefc8f77178cf64db66cb7ce328c1a3d2b94a0109ee7401e86",
101
+ "conventions/planner.docs/planner.docs.identity-required.convention.yaml": "afe23ea51fd53f305668a8ba97acc46125d0d2a1d818785b35ecd0457f65ac1c",
113
102
  "conventions/planner.docs/planner.docs.journey-view-current.convention.yaml": "5892d4213d72342dc568c37f13942139bbdce4c0d5716075de579dc8060fc969",
114
103
  "conventions/planner.docs/planner.docs.reference-integrity.convention.yaml": "34310088114ac7cc58bc74443a76366e3e644121aaa3ff39b6602a0d15e03293",
115
- "conventions/planner.docs/planner.docs.undeclared-change.convention.yaml": "eb0df8fbf343ed38fe4694f63a065ee3e0e060d819f57ca8ea2f151aef66a8d5",
104
+ "conventions/planner.docs/planner.docs.undeclared-change.convention.yaml": "b66655649bbf030ab58f29d0c474890b88cf8dbff8440c9b22cb44769d0bbb7e",
116
105
  "conventions/planner.telemetry/planner.telemetry.acceptance-decision.convention.yaml": "67dc840e0993c6940a431403b47439484ed557855a7dee82d75abd1479f3151e",
117
106
  "conventions/planner.telemetry/planner.telemetry.logical-ownership.convention.yaml": "6dd666a22fd7fd0cb6e5fe5505665c8889a504ee929fdebf3aee019df4aac2b4",
118
107
  "conventions/planner.telemetry/planner.telemetry.metric-cardinality.convention.yaml": "e61831f207ad4f09be983b300cbedc40f6ad08a4b2483612fc195e2343be93f6",
@@ -379,14 +368,14 @@
379
368
  "detectors/bun_interlocking_binding/fixtures/dirty_transcribed_runtime/server.ts": "d5bc34c5b1b2b0a511e0c4604ce6f9c77491dca9aee994be720540f3052babc1",
380
369
  "detectors/bun_interlocking_binding/fixtures/dirty_transcribed_runtime/src/trains/interlocking.ts": "9bcfdb4ecff6efd1f658b9fd587342615179924e25468c75daa07c2626d4d8ab",
381
370
  "detectors/bun_interlocking_binding/fixtures/dirty_transcribed_runtime/src/trains/runner.ts": "0e4b885e50f12cc2a8c8f6740bf83e7b2e7137a28e1e143586e9a8550ea5bd45",
382
- "detectors/bun_interlocking_coverage/_shared/interlocking.mjs": "99983d159528c7ef4e0a72f39f0dcc9977ffdcce728d52b83c4ef5bc70f2a3ec",
371
+ "detectors/bun_interlocking_coverage/_shared/interlocking.mjs": "448ba5f8561d225eef0e9fd8cc8c7a0bcfc755ad0214ff5758a7aefbbf35283c",
383
372
  "detectors/bun_interlocking_coverage/atdd.implementation.yaml": "f160517a8138ba3ca05e3d130e6fbfb796e643376f25743fdef4fc210196525b",
384
373
  "detectors/bun_interlocking_coverage/checks/_map.json": "0a218ea319cc6258af7bd721c2154cb9561fe67e80d80ef32d08fc77bc9403c3",
385
374
  "detectors/bun_interlocking_coverage/checks/interlocking_production_runner.mjs": "a1edd5aa15892564aa8d46a93dca2d17001901e90085cd660be192a2ec747c1f",
386
375
  "detectors/bun_interlocking_coverage/checks/interlocking_route_coverage.mjs": "2d73c401adf77b3147e11271653c528d02dfc50f4eebde8be35795707023fb6d",
387
376
  "detectors/bun_interlocking_coverage/checks/interlocking_smoke_coverage.mjs": "ad53b606c325f87b09ac89c848c75ba5618e7073223fe528cf048343147638ce",
388
377
  "detectors/bun_interlocking_coverage/checks/interlocking_trace_binds.mjs": "61dcb8a8d04e9764aab7920f346bd3684fc98e2c294aa5c58eefec555145a1d0",
389
- "detectors/bun_interlocking_coverage/checks/interlocking_train_sequence.mjs": "7a38ce0b8bd5b4342a7bae09776b9638dc3ed51635322055a4fb0f0e6940af77",
378
+ "detectors/bun_interlocking_coverage/checks/interlocking_train_sequence.mjs": "e16af2af51a07c80f7cf5f4016ebf3f18a8cfc6b0ca9ca9187992fac6c12aeaf",
390
379
  "detectors/bun_interlocking_coverage/detect.mjs": "a124418dc29aaf8fda9cd09427230d25768206b3f563d516774667e8cf75b66e",
391
380
  "detectors/bun_interlocking_coverage/fixtures/clean/interlocking_production_runner/e2e/interlockings/match-resolution/routes.test.ts": "ba6ea85b3fbe15e3c49332da3ad2921a0ff3436a6fe3b5a5035fb35fdc874720",
392
381
  "detectors/bun_interlocking_coverage/fixtures/clean/interlocking_production_runner/e2e/interlockings/match-resolution/trace.test.ts": "aee4ea93ceb8636846344e915cd7e66f7e8f99ba08596f83266590fa2b9ff58e",
@@ -674,15 +663,6 @@
674
663
  "detectors/bun_ts_metrics_detector/fixtures/dirty/orphan.ts": "0f7acd0dffe90902a0a43cc45771b8a473d079efc9693112b3b85645c191c23d",
675
664
  "detectors/bun_ts_metrics_detector/fixtures/dirty/typed.ts": "7c27ee1a674af7d5b2cce3a65bfec2111602d84a75817fd60f737c7d63fc9c83",
676
665
  "detectors/bun_ts_metrics_detector/ts_metrics.mjs": "d5da8c768dd7fe1717cc7f29b4115f8b2573c945cf9fb2e6d7c2d76adc186417",
677
- "detectors/delivery_evidence/atdd.implementation.yaml": "2f6fc30dc353bef97bcb32ea54e4317d3c87cbd7ae1443fcef2aefc46280dc09",
678
- "detectors/delivery_evidence/detect.mjs": "e98664dee8090a0b280cd285a54e9a6fb9ba3572af2666b4e3656ca5b0555509",
679
- "detectors/delivery_evidence/fixtures/clean/atdd-bun.yaml": "f701861e3530bb5a25a70d73e248549fb96642f48db1ff4d3e8e4546aaa825ee",
680
- "detectors/delivery_evidence/fixtures/clean/docs/delivery/tranches/api/evidence.yaml": "2cdbc4f628cf2d56627e6692b1f4e1a9b72316a3b7d09b47fffcd54c696a0fcb",
681
- "detectors/delivery_evidence/fixtures/dirty/atdd-bun.yaml": "85c572d65f27b11b7ff8f115883913b2d2f1978097c416d3341b9c9d0de373d4",
682
- "detectors/delivery_evidence/fixtures/dirty/docs/delivery/tranches/api/evidence.yaml": "05a6c7926603842dbccd820cf19326bcf7377012931b63501748ba30a196945b",
683
- "detectors/delivery_evidence/fixtures/dirty/docs/delivery/tranches/data/evidence.yaml": "165dd67ff64f14c30268de5b18bf0c9c6634fb9ca48439c660c1962cebe3e0cb",
684
- "detectors/delivery_evidence/fixtures/dirty/docs/delivery/tranches/orphan/README.md": "7d480b1fff6546615e55d866784bc2267d06d0221dfde8d0ba0353fa1ea0db9a",
685
- "detectors/delivery_evidence/fixtures/dirty/docs/delivery/tranches/ui/evidence.yaml": "777b4f7921e302dfce79cd764bba8b44091ac9c7ee04a00f5dbb663342ec68a0",
686
666
  "detectors/htmx_e2e_detector/atdd.implementation.yaml": "454bb123039d57c992d27d9274e20fa3452ac41a237eb55471be62a4bcfebf06",
687
667
  "detectors/htmx_e2e_detector/checks/_e2e.mjs": "efec6c8e3dc8b95bf3acd826397ecdedac64c06d367791a4017a272bc0660896",
688
668
  "detectors/htmx_e2e_detector/checks/_map.json": "94dec08ff4764cd6a3dba139f12a7c984292e95a9354b0cdaa0ce9d4180e2c89",
@@ -788,7 +768,7 @@
788
768
  "detectors/htmx_tester_detector/fixtures/dirty/panel.html": "840f263e83979c87b8a6dffdbef5df69883cfa2d5122be959092a4776f2f6457",
789
769
  "detectors/htmx_tester_detector/fixtures/dirty/statusonly.test.ts": "a2daf2874bf68c6221374ac05619642a42d56b5d1f76e30fa3d2a1826adaf51b",
790
770
  "detectors/htmx_tester_detector/test_header.mjs": "a22221fe9ef6d10297ec777c5d0c6e7b84010ccf41e90db30c036206790ea198",
791
- "detectors/planner_docs_capability/README.md": "1e1f8ee258242c05293447fcde124543447ba375306e8a7e5f665881b038bcd1",
771
+ "detectors/planner_docs_capability/README.md": "6e90339fae5a77154fc7bfda36d60b57e55acbd2884cbbc1d86f31f8aaf99960",
792
772
  "detectors/planner_docs_capability/atdd.implementation.yaml": "0bc4c27c61faa15147ad8ed55a866d7830875efb6222aa463d49f1163a8b6121",
793
773
  "detectors/planner_docs_capability/detect.mjs": "d10773fa5b2d8f65ce351804694171a6eb75e05eb4c80fa1edce4a5d56b72c5d",
794
774
  "detectors/planner_docs_capability/fixtures/clean/docs/architecture/decisions/adr-20260906-001-shared-control-root.adoc": "6d30e5545e7b051c80605c3dbee50286f71e344ab2e71a987db945941de42523",
@@ -899,10 +879,8 @@
899
879
  "detectors/planner_docs_capability/fixtures/dirty_missing_index/docs/architecture/state-store.adoc": "41141c225dad3fed39195313ad09a5cf3e3ba2f591bd6d8c7a9133dd79e52498",
900
880
  "detectors/planner_docs_capability/fixtures/dirty_missing_index/docs/archive/2025-control-root.adoc": "7c7aef22837f29891a90ce15b0b181aab4a79fbba97e4c7903cc5e56d9028983",
901
881
  "detectors/planner_docs_capability/fixtures/dirty_missing_index/docs/archive/index.adoc": "aa6d6eeea1a5692e800575c9579dc7b9e43ccab159f787baad560b3877d03ba0",
902
- "detectors/planner_docs_capability/fixtures/dirty_missing_index/docs/delivery/release.adoc": "cef338e694dae844496d0d4379cc0e84b9cc37ca5af38a91c4cea840cf39c67a",
903
882
  "detectors/planner_docs_capability/fixtures/dirty_missing_index/docs/dist/index.md": "eac4d8fe653f45c959731cc08218d898e5123d685a1017191c4cffb626777f13",
904
883
  "detectors/planner_docs_capability/fixtures/dirty_missing_index/docs/index.adoc": "8aabcd7a4ecfc6ef565a604c1172364f761bef7d3fc4f2c96c07dce4e0ebe19b",
905
- "detectors/planner_docs_capability/fixtures/dirty_missing_index/docs/purpose/index.adoc": "e10193ea48f3c77b67ca8ed7221c53f23ce699e63f651cc340cea9ef6b44cffb",
906
884
  "detectors/planner_docs_capability/fixtures/dirty_missing_index/docs/purpose/worktrees.adoc": "de957bd8aec411c930fa9785d793c3345c82f5d7cb7f28f40f73f1c53a436440",
907
885
  "detectors/planner_docs_capability/fixtures/dirty_unresolved_edge/docs/architecture/decisions/adr-20260906-001-shared-control-root.adoc": "6d30e5545e7b051c80605c3dbee50286f71e344ab2e71a987db945941de42523",
908
886
  "detectors/planner_docs_capability/fixtures/dirty_unresolved_edge/docs/architecture/decisions/index.adoc": "4a6cb87e249d587c85bb6389ff5fecae7a96194af8677b588eed0c791099123b",
@@ -1185,8 +1163,6 @@
1185
1163
  "planner-schemas/binding-lock.schema.json": "f2455606702f45fafa194549126d4a66e6c286ba1c4ba9e6bdcf932286a6d34d",
1186
1164
  "planner-schemas/component.schema.json": "d20d3502c155627a120cb10d5e9bdec4ba2c73af9c3e9a9d10e3c351f167c72a",
1187
1165
  "planner-schemas/contract-registry.schema.json": "b9dbaf6c87d4f4d676e3b4251344b9eada523b1c5e739c0423cabe267012c12e",
1188
- "planner-schemas/delivery-config.schema.json": "7cd9c15ea4345ad83195b9a1c7d09a0b66275e9a3fdf8b5d6905d96bbec579d3",
1189
- "planner-schemas/delivery-evidence.schema.json": "72ba1450abe5482c43f2069e9ee7d121398008a0ddef36c6b269d38a16872e0e",
1190
1166
  "planner-schemas/feature.schema.json": "eb4aa40d89067ae5c86a079bb3d8e4f45c8727f9e15db2b86c08dacf8e4ae56a",
1191
1167
  "planner-schemas/journey.schema.json": "1ff705bcf89a2823cf60c9e1597e254f97844e7a74dc58299d53192ad2c9f8c3",
1192
1168
  "planner-schemas/registry-index.schema.json": "ffd5643da662ced4052707eeb270eb02908f2e48365103ff0638ec7ba146f430",
@@ -1199,33 +1175,29 @@
1199
1175
  "planner-schemas/train.schema.json": "d6fbac9067c1bffeb84eb79a71228441055af6e6e7ba141dd4e0bcb079345ec0",
1200
1176
  "planner-schemas/wagon.schema.json": "57b98f1ade998d745538eb3d72fb3014a50042006870f90bce47028eea336eb4",
1201
1177
  "planner-schemas/wmbt.schema.json": "7a3a5693bfcf01340667c2be4a3c48e74f34b1af7e8dc13372c0de06b7f4fe12",
1202
- "relationships.yaml": "1cb713364aff54fb6e299e0737fe75a5d7b2e1dbd0a79b16b793aa1d269207b5",
1203
- "src/agent.ts": "65e4579adb5a54977f557f8c783aba0e2a2a1d5cf3cea9f017b67ffe598b2f65",
1204
- "src/board-ui.ts": "16a843705552f8f18e0e328e90e4a2a9148d771ca69f2708fe4a91302947dfad",
1205
- "src/board.ts": "4b9aa5b356d67c1b4ab4018796f9d09afba6d443dbebbb733b5d6c6a8d5a1c87",
1178
+ "relationships.yaml": "26dd50489d7cbd45400937a8949d6ff77cdd4400bfa828d6b7a17e90c64c879b",
1179
+ "src/agent.ts": "009d3170752ded12e9e3d4f7f07fd68d4bab821046714ad68cea428581343c67",
1206
1180
  "src/ci.ts": "67e54d2cbfc44a9e42837d5e750af526d6255c539d3c452a4d5fca3226c0d9ac",
1207
- "src/cli.ts": "e5ab4d2435fdcbebf462b4c2b67b495bd975d5deb668b088d8cba04a9d8b78a5",
1208
- "src/delivery.ts": "2eaaf4fd87aea26dce70b4c88a4e0a2f25b9de165bc2e38330fd7eb449587901",
1209
- "src/docs-capability.ts": "8a7a4360976773fe462b1860eaf26182b016bcb1fbcd6a6d5423bd81379dbe67",
1210
- "src/enforce.ts": "41a6f8c058a2a034996c817f224191403cc66ccc4ed4e04bbefc430014c783d8",
1211
- "src/hooks.ts": "2feeec2674c1462c94256de02ce59ccc6e3ff671ec4dca1bf9903c32888b600b",
1212
- "src/index.ts": "8ee4d7716794f6990ae8580e471b98256a0d0223dad063cd3b4542e598b6e744",
1213
- "src/integrity.ts": "ba3de29e12e62a1b3e0149e243183fdfbce33d88efc9d39605b54996c01426cd",
1181
+ "src/cli.ts": "09e6b4bdebef32ff482a12182e2efbc2e42424ff854e813a10efd3764e45d4fc",
1182
+ "src/docs-capability.ts": "bdeeb414649049b1cd4fa8008cada3a576318be51c43bec91bfa46a8e250c270",
1183
+ "src/enforce.ts": "45c473ffec9f565fba24df2a7db6564d76ee885cd4b0ab8b34bc14b7f2bcc7b2",
1184
+ "src/hooks.ts": "9779eb48f9d0cb6234c33f6616f98dde6583d2ee03ac3c19f3ace2d156af26d0",
1185
+ "src/index.ts": "b3cc97f9867bd605aefa95650a6b8b773e32e6e52e58792d0dbf6736dd3406be",
1186
+ "src/integrity.ts": "3a74cc03bbdebf83d607073a4a13ab4afd4a163c2307062ed137d7d21e38b988",
1214
1187
  "src/journey-docs.ts": "994d229376244c84212cff951032823068a76565dd2fd427b9d44e341bd14853",
1215
1188
  "src/planner-kernel.ts": "5d3f5305fb59becb2cc97d8a03aca6b104f385805d91cc0410856e289dd6fbb1",
1216
1189
  "src/planner-schema-validator.ts": "ce529c0936171075e93c7539b3655fe895a98dd2973ebda5775958e6ebc316d9",
1217
1190
  "src/planner-validators.ts": "99adeb65f579af923c11f21a8f55cfb9993b007fd8df59c5f764696b55379cfc",
1218
1191
  "src/register.ts": "6a2f1c6b8df0dc9c8f45df8ec9fac2be29044e048b08c8ffe423410e94dadedd",
1219
1192
  "src/release.ts": "7b0fe444ee81f476f53b9c21b6c347ef588ee616c60211419cf984132be768ba",
1220
- "src/setup.ts": "04fe6dc4618c14b93580f36d9775b7deca2082b8cc4efab7668795053b7d8dd0",
1193
+ "src/setup.ts": "2dbdddec898e9a3779889f3491eaa1423c4427c9ec63167663245b3ae4db1e6f",
1221
1194
  "src/telemetry-plan.ts": "cdb1e8bfff414f3ea81977388973da2cf6d89567d9e060dc9d5989a33600f153",
1222
1195
  "src/topology.ts": "9779ee48e1c453abb76363163d4ab363463fa14e359571139f6d1f1fcc51ae2c",
1223
- "templates/agents/AGENTS.block.md": "e3e49cb31294bff3d9fbfab9b0b600e690f80e11eccf96a1925e6b4ac21401ba",
1196
+ "templates/agents/AGENTS.block.md": "d7f6013ef7b1793f236b610f78f2898f6c10c60751f671ff2c4b72d49b4f6011",
1224
1197
  "templates/agents/atdd-bun.integrity.test.ts": "dec6f6e5f65a08d9512fc703b367c163f8c9da1f6aa7fd466835c1ec30348a41",
1225
1198
  "templates/agents/atdd/SKILL.md": "8f36d7d571aa17beb03df5e620ff837be73eb21a4e73dabd2c12188d2b378022",
1226
- "templates/agents/delivery/SKILL.md": "0c4fa25303ada52db9c6b67d51a4011c15039e92c4f2947994ec9cba4d0c5efa",
1227
1199
  "templates/docs/site.css": "482b3427e3a3cb02a85dc85cfbeac80592dfd53abf42fc92d6ea7071f22afc95",
1228
1200
  "templates/github/atdd-bun-release.yml": "d9547e9e6ef3ae010d53d55314f6a54567f88bd900f7e50d994cd308601d2684",
1229
- "templates/github/atdd-bun.yml": "bb42414f72f4b9a2fb1eb69530695e193f105a984542f4ca124c898a5f1489be"
1201
+ "templates/github/atdd-bun.yml": "404dc06b6ff4faf5eab909f9f77bac0ae58163d810c3928c4353b1f4b3529048"
1230
1202
  }
1231
1203
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@afokapu/atdd-bun",
3
- "version": "0.10.30",
3
+ "version": "0.10.32",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/afokapu/atdd-bun.git"