Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,10 @@ renumber and asserts no reference to the old canonical reference remains across
the full rewrite set. The area references the sibling agreement areas that own
overlapping literals (structure, cycle, packaging, renumber-sweep) by name and
re-asserts none of them. One line is added to `tests/mutation.sh`'s staged-copy
list so the opt-in whole-suite runs stay green.
list so the opt-in whole-suite runs stay green, and
`tests/checks/80-cycle-fixture.sh`'s AC13 whole-set `roadmap.md` assertion is
narrowed to exclude the one documented deliberate drift alias so the committed
migration guard stays green with the dual-spelling fixture present.

## Approach

Expand Down Expand Up @@ -155,6 +158,37 @@ into the scratch copy. Without it the opt-in whole-suite runs (steps 1–2) woul
fail once the check exists. The `tests/README.md` Checks row and the per-rule
mutation jobs remain `0005-guard-registration-sweep`'s responsibility.

### Reconciling the deliberate dual-spelling fixture with the committed AC13 guard

`tests/checks/80-cycle-fixture.sh` carries an AC13 **negative** assertion
(`80-cycle-fixture.sh:61-71`) that pins the `0012-roadmap-deprecation` migration:
`find tests/fixtures -name roadmap.md` must resolve to exactly the one retained
legacy alias `tests/fixtures/cyclic-roadmap/roadmap.md`, so a stray un-migrated
`roadmap.md` cannot hide behind the manifest-first resolver. The
`9203-spelling-both` node's deliberate second `roadmap.md` would otherwise break
that exact-equality and fail `bash tests/run.sh`.

This item owns the reconciliation. The assertion is **narrowed, not re-pinned**:
the stray-alias set is computed by excluding the single documented deliberate path
`tests/fixtures/recursive-integrity/items/9203-spelling-both/roadmap.md`
(`find … -name roadmap.md | grep -vxF <that path>`) and the remainder is still
compared for exact equality to the retained cyclic alias. The guard therefore still
fails on any *third* alias, and its intent — no *stray* alias survives migration —
is preserved: a *documented, deliberate* drift fixture is not a stray. The cycle
diagnostic itself (the `Children` parse and the `CYCLIC-DEP` contract assertions,
`80-cycle-fixture.sh:73-166`) is untouched, and the mutation job `job_8` is
unchanged. `89` references `80-cycle-fixture` by name for the migration guard and
re-asserts none of its literals (AC6). This is a scoped, intent-preserving
relaxation of the committed test suite, permitted by AC12 ("only the committed
test suite … are touched"); it edits no live surface.

The `80` edit is a focused single-item change, not one of the shared append-only
registries the four guards contend on, so it is **not** added to this item's
`conflicts-with` declaration. That declaration stays the parent cell's two
registries (`tests/README.md`, `tests/mutation.sh`, `manifest.md:126`), which
avoids a self-inflicted `DRIFT-FACT` and keeps the declared set semantically exact:
the two registries are where sibling plans actually collide.

## Alternatives considered

- **A prose-only agreement check (pin the recursive authority phrases, no fixture
Expand All @@ -163,15 +197,27 @@ mutation jobs remain `0005-guard-registration-sweep`'s responsibility.
levels, missed a nested graph fault, or treated a dual-spelling node as clean.
Rejected: the spec's decided open question requires an exercised fixture, and a
prose-only check is the exact gap this item closes.
- **Extend `80-cycle-fixture.sh` / `88-renumber-sweep.sh` in place.** Pros: fewer
files. Cons: breaches single-owner agreement areas and forces re-asserting
sibling literals, failing AC6/AC11; conflates the cycle diagnostic and the
renumber prose list with a new recursive-integrity concern. Rejected.
- **Host the new integrity/renumber assertions inside `80-cycle-fixture.sh` /
`88-renumber-sweep.sh` instead of a new area.** Pros: fewer files. Cons:
breaches single-owner agreement areas and forces re-asserting sibling literals,
failing AC6/AC11; conflates the cycle diagnostic and the renumber prose list
with a new recursive-integrity concern. Rejected. (This is distinct from the
accepted, narrowly scoped narrowing of `80`'s AC13 whole-set `roadmap.md`
assertion — that relaxes the migration guard's stray-alias set for the one
documented deliberate drift fixture, and hosts no new assertion.)
- **Renumber half re-pins the authority's prose lists (like `88`).** Pros: cheap.
Cons: `88-renumber-sweep.sh` already owns the prose rewrite lists; re-pinning is
duplication (AC9/AC11) and proves nothing about a *completed* renumber.
Rejected in favor of the completed-renumber fixture plus a single unowned
intermediate-manifest pin.
- **Move the deliberate drift alias out of the `tests/fixtures/**` find root (a
second fixture root, or a root outside `tests/fixtures/`) instead of narrowing
`80`'s AC13 assertion.** Pros: leaves the committed migration guard
byte-identical. Cons: breaks the single-`tests/fixtures/` fixture convention and
splits one fixture root across two locations; leaves the whole-set assertion with
a blind spot for the relocated root. Rejected in favor of the scoped narrowing,
which keeps the fixture in the canonical tree and the guard still sensitive to
any *third* alias.

## Interfaces and data model

Expand All @@ -181,21 +227,31 @@ mutation jobs remain `0005-guard-registration-sweep`'s responsibility.
- **New fixture root** `tests/fixtures/recursive-integrity/` — root-local
`92xx` entity ids; item references resolve inside `items/`, never against live
`work/`.
- **Changed file** `tests/mutation.sh` — one additive `cp -R` line in
`stage_copy()`; no job, no `JOB_COUNT` change.
- **Changed files** `tests/mutation.sh` — one additive `cp -R` line in
`stage_copy()`; no job, no `JOB_COUNT` change — and
`tests/checks/80-cycle-fixture.sh` — the AC13 whole-set `roadmap.md` assertion
narrowed to exclude the one documented deliberate drift alias; the cycle
diagnostic and `job_8` unchanged.
- **No production interface.** No `phase` value, state file, command, agent,
skill, or committed production checker is added or changed. The authority docs
and prompts are the pinned target, not the guarded artifact.

**Backward compatibility.** The change is purely additive: a new auto-sourced
check file, a new fixture root, and one staged-copy line. No existing area,
fixture, selector, or harness behavior changes, so `bash tests/run.sh` and the
existing area selections stay green with no migration.
**Backward compatibility.** The change is essentially additive — a new
auto-sourced check file, a new fixture root, and one staged-copy line — plus one
scoped, intent-preserving relaxation of `tests/checks/80-cycle-fixture.sh`'s AC13
whole-set `roadmap.md` assertion so the deliberate drift fixture is permitted while
any *stray* alias still fails (see "Reconciling the deliberate dual-spelling
fixture…"). No other area, fixture, selector, or harness behavior changes, so
`bash tests/run.sh` and the existing area selections stay green with no migration.

## Affected areas

- `tests/checks/89-integrity-guard.sh` (new).
- `tests/fixtures/recursive-integrity/**` (new).
- `tests/checks/80-cycle-fixture.sh` — the AC13 whole-set `roadmap.md` assertion
narrowed to exclude the one documented deliberate drift alias (see "Reconciling
the deliberate dual-spelling fixture…"); the cycle diagnostic and `job_8`
untouched.
- `tests/mutation.sh` (`stage_copy()` — one line).
- Explicitly **not** touched here: `tests/README.md` and the mutation jobs
(`0005-guard-registration-sweep`); `docs/**`, `AGENTS.md`, `template/**`,
Expand All @@ -207,7 +263,15 @@ existing area selections stay green with no migration.
declares `tests/README.md, tests/mutation.sh`; if this item's `design.md`
declaration differed, the read-only check would report drift. — Likelihood
medium / impact low / mitigation: declare the identical set in this design's
frontmatter (no self-reference, no duplicate).
frontmatter (no self-reference, no duplicate); the `80-cycle-fixture.sh` edit is
deliberately not declared because it is not a shared collision surface (see
"Reconciling the deliberate dual-spelling fixture…").
- **The AC13 migration guard is weakened by the relaxation.** — Likelihood low /
impact medium / mitigation: exclude only the one exact documented deliberate
path; the remainder must still equal the retained cyclic alias, so any third or
stray alias still fails. T1's `Verify:` reintroduces a scratch third alias under
`tests/fixtures/` and confirms `80` fails naming `unexpected roadmap.md fixture
set`.
- **Filename/prefix collision with a sibling guard authoring a check in
parallel.** — Likelihood medium / impact low / mitigation: the name
`89-integrity-guard.sh` is distinct; the two append-only registries are
Expand All @@ -221,7 +285,7 @@ existing area selections stay green with no migration.
literal scan over the whole fixture root; the constant lives only in the check.
- **Whole-suite runs fail because the fixture is not staged.** — Likelihood
high if forgotten / impact medium / mitigation: stage the root in
`tests/mutation.sh` (T7) and assert its presence (T6).
`tests/mutation.sh` (T8) and assert its presence (T7).
- **The renumber assertion proves nothing if the fixture is empty.** — Likelihood
low / impact medium / mitigation: assert new-reference presence in each
enumerated rewrite position alongside old-reference absence.
Expand All @@ -233,12 +297,12 @@ existing area selections stay green with no migration.
| AC1 | integration — fixture-existence fails on a missing fixture; read-only contract | `AC30 fixture-existence` / `AC30 read-only-contract` in the area; full-suite run |
| AC2 | integration — recursive analyzer over the depth-3 fixture | `AC30 per-node-eval` expected block |
| AC3 | integration — graph-fault fixture | `AC30 structural-graph` expected block |
| AC4 | integration — dual-spelling and phase-mismatch fixtures | `AC30 spelling-drift` expected block |
| AC4 | integration — dual-spelling and phase-mismatch fixtures; the `80` AC13 whole-set assertion is narrowed so the dual-spelling fixture is permitted | `AC30 spelling-drift` expected block; `FRAMEWORK_TEST_AREAS=80-cycle-fixture bash tests/run.sh` green |
| AC5 | integration — report-only contract pins + clean node | `AC30 report-only` |
| AC6 | unit — header references + forbidden-literal scan | `AC30 no-duplication` |
| AC7 | integration — completed-renumber fixture | `AC30 renumber-sweep` |
| AC8 | manual-in-scratch + registered mutation (0005) | reintroduce an old ref in a scratch copy; area fails naming `renumber-sweep` |
| AC9 | unit — authority/mirror intermediate-manifest pins | `AC30 renumber-sweep` |
| AC10 | unit — token/sub-area labels + staged-copy assertion | all `AC30` labels; `AC30 mutation-staging` |
| AC11 | integration — full suite + no-duplication | `bash tests/run.sh` green; `AC30 no-duplication` |
| AC11 | integration — full suite + no-duplication | `bash tests/run.sh` green; `AC30 no-duplication`; `FRAMEWORK_TEST_AREAS=80-cycle-fixture` still green after the relaxation |
| AC12 | manual — scope inspection of the diff | `git diff --name-only` limited to `tests/**` + this item |
Loading
Loading