Skip to content

T017: carry rehearsal D's evidence (D's record, the Gate B walk at rehearsal D and Plan-D) into the spec leg as their final bytes at b0eb112, the spec-only continuation the leg's own pointers promise (part of opensoft/openRepoTools#186) - #6

Draft
brettheap wants to merge 2 commits into
mainfrom
t017-rehearsal-d-evidence

Conversation

@brettheap

@brettheap brettheap commented Oct 31, 2026 •

Copy link
Copy Markdown
Contributor

Lane: openRepoTools-1
Claim: opensoft/openRepoTools#186 (comment 6035563646)

What this carries, and from where

Rehearsal D's three evidence files, as their final bytes at
b0eb112,
the tip of the evidence branch EB, 004-migrate-to-triad-rehearsal-d of opensoft/openRepoTools.
EB stayed off that repository's main until the root split. This is the spec-only continuation,
under T017 of specs/004-migrate-to-triad/tasks.md, that carries it into this leg (part of
opensoft/openRepoTools#186).

The decision it carries out: lane 1's disposition of row 27 (ort-rehearsal-d), approved by
Brett Heap (round 16, item 15), and lane 1's ruling 85 of 2026-10-31: one spec-leg PR carries
EB's three files at b0eb112 as their final bytes, with an old-to-new receipt for its 11
commits. S18's hand-over records that decision on opensoft/openRepoTools#186
(comment 6548291952).
The review question that ruling left open is now answered (below), and Plan-D sits beside run
C's plan, not in its place.

Path On this leg's main before After this PR
specs/004-migrate-to-triad/adopter-rehearsal-2026-10-21.md, D's record absent added, 1249 lines
specs/004-migrate-to-triad/gate-b-status-2026-10-22.md, the Gate B walk at rehearsal D absent added, 416 lines
openspec/changes/migrate-to-triad/adoption-plan.yaml, the plan path run C's plan, blob 8b360179 unchanged: run C's plan, blob 8b360179
openspec/changes/migrate-to-triad/adoption-plan-rehearsal-d-2026-10-21.yaml, the sibling absent added: Plan-D, D's published plan, 486 lines, blob d27187bc

This leg already says the files are coming. Patches 0008, 0013 and 0014 of the cutover's final
reconciliation batch (#3: b7800e6, 81a59ed and 0f46935) wrote at
gate-b-status-2026-10-09.md:77,
cutover-as-built-2026-10-26.md:191
and
candidate-2026-10-09.md:60
that they stay on EB "until a spec-only continuation (T017) carries it into this leg". This PR
leaves those lines as written.

The files are carried unchanged, so they still speak from EB as they were written there: their
bare issue numbers name opensoft/openRepoTools issues, as in this leg's other pre-split records,
and the walk's refs table gives EB's head as of its third pass. Their relative links all resolve
in this leg, and Plan-D's header comment,
../../../specs/004-migrate-to-triad/adopter-rehearsal-2026-10-21.md, resolves from the sibling
to D's record.

The review question: answered no

Should Plan-D replace run C's plan at the plan path? Answered: no. Lane 2's independent
review (opensoft/openRepoTools#186, comment 6548557156) answers no, and lane 1's ruling 86 adopts
that answer. Run C's plan stays at openspec/changes/migrate-to-triad/adoption-plan.yaml, and
the second commit carries Plan-D at
openspec/changes/migrate-to-triad/adoption-plan-rehearsal-d-2026-10-21.yaml.

Lane 2's reasons, in brief:

  1. T015's final reconciliation already fixed what the path means (The migration's final spec reconciliation batch: Brett Heap's ruled plan texts, the dated notes that the Gate B walk at rehearsal D lists, the plan the cutover executed and the cutover's as-built record (part of opensoft/openRepoTools#186) #3,
    81a59ed): run C's rehearsal input. The plan the cutover executed is
    specs/004-migrate-to-triad/adoption-plan-cutover-2026-10-26.yaml.
  2. The workflow protocol allows no quiet overwrite. Its final reconciliation section says
    "Preserve archived approval history; record later changes through a new linked change or
    reconciliation record", and its amendment rule says "do not silently rewrite history".
  3. Runs B and C set a precedent that no longer applies. They replaced the path before Gate C,
    while it was the mapping under review. After the cutover the path is history. Plan-D is a
    superseded rehearsal input, and it equals the executed cutover plan except for its header
    comment, generated_on and planning_status, so nobody loses the executed mapping.
  4. "No" keeps everything on main true, and D's record with it: at lines 124 to 128 it says
    the mapping on main "stays run C's plan", and at lines 979 and 980, like the walk's Plan-D
    row, it speaks of the plan on the evidence branch.
  5. "Yes" needs edits that cannot go in 67c2eca without ending "final bytes and nothing
    else". As a second commit they would amend another change's artifacts and three of T015's
    texts: a reconciliation that needs its own review.

What "yes" would have made false, on record, all on main at 9f8b21a.

  • MUST 1: three present-tense statements, all written by T015's patch 0013 (81a59ed):
    • specs/004-migrate-to-triad/plan.md:33: "The adoption mapping linked above is now run C's
      rehearsal input, as its own header says."
    • openspec/changes/migrate-to-triad/design.md:61: "adoption-plan.yaml linked above is now
      run C's rehearsal input, as its own header says."
    • specs/004-migrate-to-triad/cutover-as-built-2026-10-26.md:44-46: "is now run C's rehearsal
      input (source 837928a, 120 paths, 29 follow-ups, openRepoShape 7f84ca4), as its own header
      says. It is not the cutover's plan."
  • MUST 2: citations of run C's lines through the unpinned path:
    • openspec/changes/release-tags-pypi/: 14 line ranges, on 10 lines in 3 files, each right for
      run C's plan and wrong for Plan-D:
      • clarifications.md:69 (183-184) and :72 (393-401);
      • design.md:55-56 (79-80, 87-88, 129-130, 137-138, 183-184 and 381-382);
      • proposal.md:175 (381-382), :654 (87-88), :657 (183-184), :659 (129-130),
        :671 (414) and :675 (137-138).
    • specs/004-migrate-to-triad/gate-ab-evidence-2026-10-09.md:529-530, which says that line
      numbers in run C's plan are on main since Triad migration evidence of 2026-10-08: run C of the adopter rehearsal at the post-landing main, and T006's root collisions and leg guidance patches openRepoTools#192; its rows 545 to 550
      then cite about 22 of run C's lines, with no commit pinned.
    • specs/004-migrate-to-triad/adopter-rehearsal-2026-10-08.md:33-34, a dated note: "On main
      that link opens run C's plan".

Old to new: two commits

Commit What it holds Proof
67c2eca EB's three files, as their final bytes at b0eb112, at EB's own paths each blob id equals EB's; its patch-id, 795ae7c8…, equals that of EB's net diff 33ce26d..b0eb112
b0a3059 run C's plan restored at the plan path (8b360179), and Plan-D at the sibling (d27187bc), byte for byte 2 files, +586 -141

The PR's net diff against main is 3 files, +2151 -0. It is therefore no longer EB's patch: its
patch-id is 6453c121…. 67c2eca keeps the proof, and a merge commit keeps 67c2eca.

EB's 11 commits above the freeze 33ce26d are not replayed: the split rewrote this leg's history,
so they have no counterparts here, and one of them is a WIP checkpoint that never went to review.
"Final" means the commit's own version of the file is the version carried; "superseded" means a
later EB commit changed it again.

# EB commit What it did Carried here
1 3845c53 D's record, first version; Plan-D at the plan path Plan-D: final, by 67c2eca, then at the sibling by b0a3059. The record: superseded
2 2f07c53 D's record: lane 2's and lane 3's reviews superseded
3 d2bc30a D's record, third touch superseded
4 167564c D's record, fourth touch superseded
5 555bab1 D's record, fifth touch superseded
6 b460606 D's record, sixth touch superseded
7 94f8a3c D's record, seventh touch; the walk's first version the record: final. The walk: superseded
8 611a15c WIP checkpoint of the walk's second pass, "not for review" superseded; a WIP checkpoint that never went to review
9 4c92f49 the walk, second version superseded
10 2e3b11b the walk: both re-reviews' fixes superseded
11 b0eb112 the walk: the touch after G9 the walk: final
File Path here at b0a3059 Blob at b0eb112 Blob here sha256
D's record the same as on EB d53c885b0104c7901ccc07b886adb0ee44a185b9 d53c885b0104c7901ccc07b886adb0ee44a185b9 1ff76a75…
the walk the same as on EB 131eaf16a9206437c95f6a7aaa3351fb9c964397 131eaf16a9206437c95f6a7aaa3351fb9c964397 92fd058c…
Plan-D the sibling, adoption-plan-rehearsal-d-2026-10-21.yaml d27187bcac58bd85ab9fc4ea88aa59ea6a610458 d27187bcac58bd85ab9fc4ea88aa59ea6a610458 45b0ec8d…
run C's plan the plan path, adoption-plan.yaml not carried; the same blob as on main 8b3601790bd9fb67a66f28650da54d6ca911551c 5321b736…

Landing

Only on Brett Heap's word, and by merge commit, as every spec-leg landing since the split has
been (#1, #3, #4
and #5). A merge commit keeps 67c2eca byte-exact: its sha, its
trailers and its patch-id. Its body carries the receipt above, so the receipt lands in git. A
squash would lose this: its net diff is not EB's patch, and this repository's squash defaults can
append GitHub's own co-author block.

Checks

Run in a clone of this leg, on main at 9f8b21a and on this branch at b0a3059. The openspec
results depend on its version; under each version, main and this branch agree.

Command openspec main This branch
openspec validate migrate-to-triad --strict 1.2.0 valid valid
openspec validate migrate-to-triad --strict 1.6.0 valid valid
openspec validate --all --strict 1.2.0 4 passed, 2 failed 4 passed, 2 failed: the same two
openspec validate --all --strict 1.6.0 6 passed, 0 failed 6 passed, 0 failed
openspec validate --all --strict, by lane 2's reviewer 1.13.1 6 passed, 0 failed 6 passed, 0 failed
git diff --check origin/main HEAD n/a n/a clean

Under 1.2.0 the two failures are interactive-lane-name-repair and release-tags-pypi, whose
requirements lack SHALL or MUST; this PR touches neither. The blob ids above were checked against
EB's and main's, and the leg has no CI workflow of its own.

Outside this PR

Lane 2's NIT 6, a follow-up: at least these texts cite line numbers of the October 4 mapping
(593250d's 375-line version) through the unpinned path, and are wrong under either answer
(lane 2's re-review added seven lines to the first list):

  • docs/triad-lane-tooling-analysis.md, at lines 34, 98, 99, 150, 425 and 441;
  • specs/004-migrate-to-triad/consumer-reads-2026-10-07.md, at lines 49, 226, 238, 257 and 372;
  • specs/004-migrate-to-triad/gate-b-checklist.md, at lines 131, 133, 166, 167, 169 and 221.

EB stays as the archived original

EB's tree and its branch, 004-migrate-to-triad-rehearsal-d of opensoft/openRepoTools at
b0eb112, stay as they are, as the archived original (Gate C status v4, "EB"). This PR changed
nothing there.

🤖 Generated with Claude Code

…ntinuation: D's record, the Gate B walk at rehearsal D and Plan-D, as their final bytes at b0eb112 of opensoft/openRepoTools

Rehearsal D's three evidence files stayed on the evidence branch EB,
004-migrate-to-triad-rehearsal-d of opensoft/openRepoTools, off main
until the root split. Lane 1's disposition row 27, approved by Brett
Heap's round 16 (item 15), and lane 1's ruling 85 of 2026-10-31 send
them into this leg in one spec-only continuation (T017 of
specs/004-migrate-to-triad/tasks.md), as their final bytes at
b0eb112, with an old-to-new receipt for EB's 11 commits above the
freeze 33ce26d (part of opensoft/openRepoTools#186).

This commit holds those final bytes and nothing else. The paths are
the monorepo's, unchanged:

- specs/004-migrate-to-triad/adopter-rehearsal-2026-10-21.md, D's
  record: new here; blob d53c885,
  sha256 1ff76a75..., last changed on EB in 94f8a3c.
- specs/004-migrate-to-triad/gate-b-status-2026-10-22.md, the Gate B
  walk at rehearsal D: new here; blob
  131eaf1, sha256 92fd058c..., last
  changed on EB in b0eb112.
- openspec/changes/migrate-to-triad/adoption-plan.yaml, Plan-D, D's
  published plan: blob d27187b,
  sha256 45b0ec8d..., last changed on EB in 3845c53. It replaces run
  C's plan at that path (blob 8b36017,
  sha256 5321b736...), as it did on EB. Whether it should is a
  question for this change's review; the alternative is Plan-D at a
  sibling path, with run C's plan left where it is.

Each blob id equals EB's at b0eb112. EB's commits are not replayed:
this leg's history was rewritten by the split, so they have no
counterparts here, and one of the 11, 611a15c, is a WIP checkpoint
that never went to review.

This leg already points at the files. Patches 0008, 0013 and 0014 of
the cutover's final reconciliation batch (b7800e6, 81a59ed and
0f46935 here) wrote, at gate-b-status-2026-10-09.md:77,
cutover-as-built-2026-10-26.md:191 and candidate-2026-10-09.md:60,
that they stay on EB "until a spec-only continuation (T017) carries
it into this leg". Those lines are left as written. EB's tree and
branch stay as the archived original.

Lane: openRepoTools-1
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…D beside it, as adoption-plan-rehearsal-d-2026-10-21.yaml, by lane 2's review and lane 1's ruling 86 (T017, part of opensoft/openRepoTools#186)

The review question of #6, whether Plan-D
should replace run C's plan at
openspec/changes/migrate-to-triad/adoption-plan.yaml, is answered no.
Lane 2's independent review (opensoft/openRepoTools#186, comment
6548557156) answers it so, and lane 1's ruling 86 adopts that answer.

This commit follows 67c2eca and leaves it as it is. It:

- restores run C's plan at the plan path, blob
  8b36017, so that the path is as it
  is on this leg's main;
- carries Plan-D, D's published plan, byte for byte at the sibling path
  openspec/changes/migrate-to-triad/adoption-plan-rehearsal-d-2026-10-21.yaml,
  blob d27187b (d27187b, sha256
  45b0ec8d...).

Why: T015's final reconciliation fixed what the plan path means
(#3, 81a59ed). Its plan.md:33, design.md:61
and cutover-as-built-2026-10-26.md:44-46 say that the path is now run
C's rehearsal input, and the plan the cutover executed is kept as
specs/004-migrate-to-triad/adoption-plan-cutover-2026-10-26.yaml.
Other texts on this leg cite run C's plan by line number through the
unpinned path. Replacing the plan would make all of them false.

Plan-D's header comment names
../../../specs/004-migrate-to-triad/adopter-rehearsal-2026-10-21.md,
which resolves from the sibling path as it did from the plan path. D's
record, at lines 979-980, says the published plan is "the file on the
evidence branch under
`openspec/changes/migrate-to-triad/adoption-plan.yaml`". That speaks of
the evidence branch, 004-migrate-to-triad-rehearsal-d of
opensoft/openRepoTools, and stays true; the record's bytes are
unchanged.

67c2eca still holds EB's final bytes, and its patch-id equals that of
EB's net diff, 33ce26d..b0eb112. With this commit the pull request's
net diff is no longer EB's patch, so it is to land by a merge commit,
which keeps 67c2eca as it is.

Lane: openRepoTools-1
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant