Skip to content

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

Merged
brettheap merged 14 commits into
mainfrom
004-migrate-to-triad-final-reconciliation
Oct 27, 2026

Conversation

@brettheap

@brettheap brettheap commented Oct 27, 2026 •

Copy link
Copy Markdown
Contributor

This is the final spec reconciliation batch of the cutover of opensoft/openRepoTools#186, which adopted opensoft/openRepoTools in place as the assembly of this spec leg, opensoft/openRepoTools-spec, and the code leg, opensoft/openRepoTools-code. T015 of specs/004-migrate-to-triad/tasks.md asks for it: "Complete one final spec reconciliation batch with net tested effects, every amendment disposition, dated departures/as-built record, archived approval provenance, deferred issues and actual landed code/evidence." This pull request lives in a different repository from the cutover's issue, so every issue is named here in full: a bare issue number would link to this repository's own numbers.

It carries fourteen commits, in this order, on top of this repository's main at S10's spec merge, 3c3816210b912759b350f77c2128e39f628edc39. They change documents only, under specs/004-migrate-to-triad/ and openspec/changes/migrate-to-triad/. Where a record is out of date, a dated note says so and its original text stays as written, as history. Each text names the ruling it carries: Brett Heap's, given in lane 1's session, by round and time (UTC). Where the wording is lane 1's own, the item says so.

The plan the cutover executed

  1. S4's published copy of FP, byte for byte, as specs/004-migrate-to-triad/adoption-plan-cutover-2026-10-26.yaml (485 lines, sha256 538e2521eaaeff8f99e4de7c3af26e016488cb53f1169aacab934a3062e5f66a). It is FP's bytes but for its local_path line, under a seven-line header and with two closing lines that S4 adds, and FP is the plan whose sha256, 94af9924ebbf58aad5b916528e3e2f76e6f588acd0d65cff5efe534fdadaf2d9, the Gate C sentence names. Its place in this batch, beside the migration's records, is lane 1's DRAFT CHOICE (the runbook's S4, "Where the published copy lands"); round 20 (2) puts S10a's texts here. Being byte for byte, its comment lines keep the issue numbers as FP wrote them.

Brett Heap's ruled plan texts (S10a)

  1. Ask 7(a), round 3, 2026-10-22T13:05:08Z, "Replace spec.md lines 45–48": the installation requirement of openspec/changes/migrate-to-triad/specs/repository-triad-migration/spec.md puts its SHALL first, "The migration SHALL keep the existing one-line installation, …", and the rest of the requirement is unchanged.
  2. Ask 7(c), round 2, 2026-10-22T13:01:48Z, "Full amendment (Recommended)": plan.md's Target placement row for the code leg gains "its own .gitattributes, added after extraction", and a paragraph after the table says that each leg's own front-door files are added after extraction, so the adoption mapping does not change.
  3. Ask 7(d), round 3, "Approve that wording (Recommended)": T010's platform clause (tasks.md:78–79), openspec/changes/migrate-to-triad/design.md:121–126 and plan.md:127–129 and :251 are restated for a Linux-only CI in lane 3's wording, "the Linux-only policy and serialized tests/run.sh locking, the bash 3.2 parse living in release.yml's macOS install leg".
  4. Ask 6, round 4, 2026-10-22T13:07:16Z, "Option 1: move to T015 (Recommended)": T010 gains "Hosted-runner checks that need the real leg repositories run at T015 against the real exact assembled head."
  5. Card 16, round 7, 2026-10-22T14:53:08Z, "Option A (Recommended)": plan.md:89–90, the rows for Crash-consistent lane worktree recovery: a lane now says WHERE its session stopped — RUNNING → SWAPPING → SWAPPED with a generation/operation fence, a machine-readable worktree inventory taken at every handoff, and a resume reconciliation that reports and resets nothing openRepoTools#97 and for feature 005-supervised-legacy-ctx with Keep supervised manual ctx as legacy compatibility and refuse managed lanes openRepoTools#121, are named as overridden, in a dated note: 005's bookkeeping closes as a spec-only change after the cutover, and the 8 open tasks of Crash-consistent lane worktree recovery: a lane now says WHERE its session stopped — RUNNING → SWAPPING → SWAPPED with a generation/operation fence, a machine-readable worktree inventory taken at every handoff, and a resume reconciliation that reports and resets nothing openRepoTools#97 wait for a later numbered feature.
  6. Round 20 (1), 2026-10-23T12:24:37Z, "Met by receipts; translate after (Recommended)": plan.md:186–188 and tasks.md:165–167, which prepare the continued-feature translations before the final batch, are named as overridden, as card 16 did for plan.md:89–90.

The dated notes that the Gate B walk at rehearsal D owes these documents (its section 5, items 1 to 6; the walk is gate-b-status-2026-10-22.md on the evidence branch 004-migrate-to-triad-rehearsal-d of opensoft/openRepoTools, at b0eb112). Round 20 (2), "Inside the final batch (Recommended)", puts them here. Their wording, and where each goes, is lane 1's.

  1. Item 1, the notes of checklist lines 23, 24 and 29: installer-design.md gets a dated refresh of its counts at 33ce26d and a dated note on its platform row, and the old Gate B walk, gate-b-status-2026-10-09.md, gets a dated block that names the walk at rehearsal D as superseding it, with line 29's refresh as its first entry.
  2. Item 2, lane 3's NITs 1, 2 and 4 on T010's assembly exact-pin job runs on ubuntu-24.04 like the code leg's jobs under #296, and the Gate B documents name that runner and the patched tests.yml's job lines as #296 leaves them (part of #186) openRepoTools#299 (comment 6317075196): gate-b-checklist.md:202 reworded as lane 3 suggested, a dated sentence for step 14 in candidate-2026-10-09.md, and the third difference of the exact-pin job's runner comment in the old walk's block. NIT 3 owes no edit.
  3. Item 3: the old walk's line 186 is named as stale. 66 conditional skips fire on ubuntu-24.04, and Brett Heap's ruling on Ask 5 (round 4) installs zsh in composed.yml, so that 6 remain.
  4. Item 4: the 18 pointers to tests/run.sh: a long run root truncates the row stamp so test_lane_helpers.sh's clause (c) TAIL case fails locally while CI's plain pytest passes openRepoTools#180 in four records point on to tests/test_lane_helpers.sh: the repoA-1 and repoCase-1 row-stamp cases fail once run.sh's TMPDIR reaches 70 characters, which T010's exact-pins job can hit (the cases #215 left; part of #186) openRepoTools#304, which holds the row-stamp cases that Read the clause (c) TAIL case on a checkout at a short fixed path, and drive lane-start's row stamp at three checkout lengths, so the case no longer answers by the length of the run root (#180) openRepoTools#215 left. Their fix is the code leg's 1e6f2d1, merged by The code leg gets its own front door, its standalone checkout context in tests.yml, the assembly root's two length caps and a lane-start row-stamp test that no longer depends on the length of TMPDIR (part of opensoft/openRepoTools#186) openRepoTools-code#1.
  5. Item 5: the old walk's stale cells and lines, each with its update: lines 2, 12, 17, 25, 33 and 46; the "not on main" remarks of lines 36, 39 and 40; line 40's patch count; section 4(d)'s basis, restated without the removed macOS and Windows jobs; and the API-call count, 6 per install on the T007 v3 patch.

The as-built record

  1. specs/004-migrate-to-triad/cutover-as-built-2026-10-26.md (S15 item 8; T015). It sets the design's preliminary baseline (daed209, 64 paths, 28 follow-ups, openRepoShape 39d5c98) against the cutover's (33ce26d, 200 paths, 42 follow-ups, openRepoShape 190133d, v1.1.0), and records what the cutover did through S12, and S14 at S12's head: the net tested effects, the twelve follow-up rows and their commits, the landed code, every amendment disposition, the approval provenance, the dated departures and the deferred issues. It says that it cannot record T015's items 1 to 6, this batch's own merge, the approved bump push, the root-split merge or Gate D, which come after it lands. Dated notes in design.md (two) and plan.md (one) point from the preliminary baseline to it. Its wording, file name and place are lane 1's.
  2. Item 6 of the walk's section 5, the candidate record: candidate-2026-10-09.md is not refreshed in its sections 2 to 5 form. A dated note points to rehearsal D's candidate in D's record and to the as-built record instead. That choice is lane 1's.

Not in this batch. Ask 13's note, that the curl one-liner needs api.github.com and jq after the cutover (round 4, "Accept and document it"), goes beside the one-liner in the root's README.md after the root-split merge (round 20 (2)). Ask 7(b)'s sentence was approved as written (round 3), so it needs no edit.

The spec leg has no workflow of its own. In the cutover of opensoft/openRepoTools#186, Brett Heap ruled that a pull request with no check runs and no statuses on its head counts as green.

Brett Heap ruled (round 20 (2)) that these texts land inside T015's final reconciliation batch, one more spec-leg pull request, reviewed and merged by merge commit when green under his standing word, and pinned by S15's approved bump push. Merge this one by merge commit, not by squash or rebase, so that every commit keeps its id, author and committer, one commit for each reviewed patch.

🤖 Generated with Claude Code

Summary by Sourcery

Complete the final specification reconciliation for the tri-repository cutover by publishing its executed plan, as-built evidence, and updated historical records.

New Features:

  • Add the cutover’s published adoption plan and a dated as-built record documenting the final tri-repository migration state.

Bug Fixes:

  • Correct historical references and reconciliation notes to reflect the landed cutover evidence, updated issue ownership, and completed row-stamp fixes.

Enhancements:

  • Reconcile migration specifications, planning records, CI expectations, installation counts, gate evidence, amendment dispositions, approval provenance, departures, and deferred work with the executed cutover.
  • Clarify the Linux-only CI policy, hosted-runner timing, leg-specific front-door files, and superseded planning decisions while preserving prior text as history.

Documentation:

  • Record the final adoption mapping, cutover baseline, landed commits, tested effects, and remaining post-cutover work across the migration documentation.

brettheap and others added 14 commits October 27, 2026 15:40
… S4's published copy of the final plan, byte for byte

The first part of T015's final spec reconciliation batch for
opensoft/openRepoTools#186, which round 20 (2) of Brett Heap's rulings
puts in one spec-leg PR, "Inside the final batch (Recommended)".

specs/004-migrate-to-triad/adoption-plan-cutover-2026-10-26.yaml is the
cutover runbook's S4 output, the published copy of FP, the final plan:
FP's bytes (sha256
94af9924ebbf58aad5b916528e3e2f76e6f588acd0d65cff5efe534fdadaf2d9,
generated 2026-10-22 from main 33ce26dffc5286e68f1d29ab5c6458edef0330c0
with openRepoShape adopt-project.py at
190133d5e704e380c430f87ca9c4e31746de0012, v1.1.0) but for its local_path,
which is ".", under a seven-line header that names FP's sha256 and Gate
C's approval, and with two closing lines, planning_status:
cutover-record-not-an-approval and execution_authorized: false.

It records the plan execute read on 2026-10-26 and authorizes nothing.
Gate C is Brett Heap's sentence, approved 2026-10-23T11:01:55Z and relayed
in opensoft/openRepoTools#186 comment 6363430219, and execute ran on his
separate go word.

The file is S4's, byte for byte: 485 lines, 36754 bytes, sha256
538e2521eaaeff8f99e4de7c3af26e016488cb53f1169aacab934a3062e5f66a, git blob
6d36a59, the blob the step that merges
this batch finds in its tree. Its 200 source paths go spec 108, code 86
and root 6, none dropped, with 42 follow-ups.

Where it lives is lane 1's draft choice (the runbook's S4): beside the
rehearsal records under specs/004-migrate-to-triad/. The change's own
openspec/changes/migrate-to-triad/adoption-plan.yaml is left as it is: it
is run C's plan of 2026-10-08, a rehearsal input.

Lane: openRepoTools-1
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rst, so the requirement's first body line carries it, by Brett Heap's ruling on Ask 7(a)

Brett Heap's ruling on Ask 7(a), the validator, in round 3 of his rulings
of 2026-10-22 (answered 13:05:08Z; relayed in opensoft/openRepoTools#186
comment 6342293150). His answer, verbatim: "Replace spec.md lines 45–48".
The option he chose read: "Put SHALL first ("The migration SHALL keep the
existing one-line installation, …") and leave the rest unchanged. Both
CLIs then pass this change, and no requirement changes meaning. 1.2.0
still fails release-tags-pypi and interactive-lane-name-repair."

Lines 45 to 48 of
openspec/changes/migrate-to-triad/specs/repository-triad-migration/spec.md,
the first four body lines of "Installation retains the public interface
and one revision", are replaced by the four lines the old Gate B walk
proposed for it (gate-b-status-2026-10-09.md, section 4(a), option 1),
byte for byte. openspec 1.2.0 reads only a requirement's first non-blank
body line, and that line had no SHALL; 1.6.0 reads the whole body. No
requirement is added, removed or renamed, no scenario changes, and the
requirement's two last lines are unchanged.

Left outside this edit, as the ruling left them: the stray word where line
64 ends "its manifest/pins; product" and line 65 begins "Full proposals",
which needs its own word (the Gate B walk at rehearsal D, section 5, item
7). The file is the one at 33ce26d, unchanged since.

Lane: openRepoTools-1
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ributes, added after extraction, and that each leg's own front-door files are added after extraction, by Brett Heap's ruling on Ask 7(c)

Brett Heap's ruling on Ask 7(c), in round 2 of his rulings of 2026-10-22
(answered 13:01:48Z; relayed in opensoft/openRepoTools#186 comment
6342293150). His answer, verbatim: "Full amendment (Recommended)". The
option he chose read: "Row 59 gains "its own .gitattributes, added after
extraction". A paragraph after the table says each leg's own front-door
files are added after extraction, so the adoption mapping doesn't change.
This is the walk's proposed text."

So specs/004-migrate-to-triad/plan.md, section "Target placement", takes
the old Gate B walk's proposed amendment (gate-b-status-2026-10-09.md,
section 4(c)), byte for byte:
- row 59, the code leg's, gains "its own `.gitattributes`, added after
  extraction" in its paths cell, and its reason cell says why: git never
  applies the assembly's `.gitattributes` inside a submodule;
- the paragraph after the table says that extraction gives each original
  front-door file one owner, the assembly, that T006's leg patches then add
  each leg's own front door, and that these are reviewed changes after byte
  accounting, not moved paths, so the adoption mapping does not change.

Row 57, the assembly's, is unchanged: the original files and their history
stay at the root. The cutover did as the text says: code-0001 and
spec-0001 added the legs' own files in their PRs, after execute.

Lane: openRepoTools-1
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ated for a Linux-only CI, in lane 3's wording, by Brett Heap's ruling on Ask 7(d)

Brett Heap's ruling on Ask 7(d), T010's platform clause, in round 3 of his
rulings of 2026-10-22 (answered 13:05:08Z; relayed in
opensoft/openRepoTools#186 comment 6342293150). The question asked whether
tasks.md:78–79, design.md:121–126 and plan.md:127–129 and :251 should "be
restated for Linux-only CI", with "Lane 3's example wording: "the
Linux-only policy and serialized tests/run.sh locking, the bash 3.2 parse
living in release.yml's macOS install leg"". His answer, verbatim:
"Approve that wording (Recommended)".

The four places, at 33ce26d's line numbers. In each, only the clause that
named the platform policies or the bash 3.2 floor changes, to lane 3's
wording as the old Gate B walk's line 33 gives it, with its code spans;
the rest of each sentence stands:
- specs/004-migrate-to-triad/tasks.md:78–79, T010: "preserve current
  Linux/macOS/Windows/WSL policies, Bash 3.2 parsing and serialized
  `tests/run.sh` locking" becomes "preserve the Linux-only policy and
  serialized `tests/run.sh` locking, the bash 3.2 parse living in
  `release.yml`'s macOS install leg";
- openspec/changes/migrate-to-triad/design.md:124–126, in the section
  "CI and exact-pin delivery" (121–126): "the canonical serialized
  `tests/run.sh`, Bash 3.2 parsing and current platform/fixture timing
  policies" becomes "the canonical `tests/run.sh` with the Linux-only
  policy and serialized `tests/run.sh` locking, the bash 3.2 parse living
  in `release.yml`'s macOS install leg, and current fixture timing
  policies";
- specs/004-migrate-to-triad/plan.md:127–129: "the Bash 3.2 floor"
  becomes lane 3's wording, before "the original no-submodule test
  behavior";
- plan.md:251: "Bash (macOS 3.2)" becomes "Bash", and the sentence gains
  lane 3's wording.

Why: opensoft/openRepoTools#227 (aaa7bc8), on Brett Heap's decision of
2026-10-15, removed tests-macos, tests-windows and parse-macos, so CI is
Linux only, and the one bash 3.2 parse is release.yml's macOS install leg
(gate-b-status-2026-10-09.md, line 33). The option he chose said: "Lane
3 says CI is enough for row 33 and proposes this doc-only update. With
it, the walk's line 33 can be met."

Lane: openRepoTools-1
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…at T015, against the real exact assembled head, by Brett Heap's ruling on Ask 6

Brett Heap's ruling on Ask 6, question (d), hosted CI before the real legs
exist, in round 4 of his rulings of 2026-10-22 (answered 13:07:16Z;
relayed in opensoft/openRepoTools#186 comment 6342293150). His answer,
verbatim: "Option 1: move to T015 (Recommended)". The option he chose
read: "Gate B doesn't wait for hosted runners. The hosted runs of the code
leg's tests.yml jobs and of composed.yml move to T015, before the root
adoption merge. Until then, the green code-side PR jobs and the local runs
stand in. No repository is created. The walk recommends this option."

The old Gate B walk's option 1 names the matching addition to T010
(gate-b-status-2026-10-09.md, section 4(d)), and T010 in
specs/004-migrate-to-triad/tasks.md gains it as its last sentence, word
for word: "Hosted-runner checks that need the real leg repositories run
at T015 against the real exact assembled head." Nothing else in T010
changes in this commit; its platform clause is the commit before.

Lane: openRepoTools-1
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…d as overridden, by Brett Heap's choice of option A on lane 1's card 16

Brett Heap's ruling on lane 1's card 16, the 005 and opensoft/openRepoTools#97
remainders, in round 7 of his rulings of 2026-10-22 (answered
14:53:08Z; relayed in opensoft/openRepoTools#186 comment 6343863633). His
answer, verbatim: "Option A (Recommended)". The option: no continuation;
feature 005's bookkeeping closes as a spec-only change after the cutover,
and the 8 open tasks of opensoft/openRepoTools#97's change wait for a later
numbered feature; plan.md's lines 89 and 90, which say otherwise, are
named as overridden, an edit that lands after the split.

In specs/004-migrate-to-triad/plan.md, the table of recommended active-work
dispositions (lines 89 and 90 at 33ce26d):
- the row for opensoft/openRepoTools#97 and the row for
  opensoft/openRepoTools#121 with feature 005-supervised-legacy-ctx each
  begin with "Overridden 2026-10-22: see the note after this table.", and
  keep their words;
- a dated note after the table names both rows as overridden, gives the
  ruling and its relay, and says that they stay as written, as history.

The note writes the two pull requests in full, as opensoft/openRepoTools#97
and opensoft/openRepoTools#121, because in this leg a bare number would
name the leg's own. The rest of the table is unchanged.

Lane: openRepoTools-1
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e translations before the final batch are named as overridden, by Brett Heap's round 20

Brett Heap's ruling on Gate D's first clause, in round 20 of his rulings
of 2026-10-23 (answered 12:24:37Z; relayed in opensoft/openRepoTools#186
comment 6364869132). His answer, verbatim: "Met by receipts; translate
after (Recommended)". The option he chose read: "Card 15, table v2.1 and
P8's disposable half of T018 meet Gate D's first clause. The translations
follow the root-split merge, and plan.md:186–188 and tasks.md:165–167 are
named as overridden, as card 16 did for plan.md:89–90. This keeps the
window with main frozen short."

So, at 33ce26d's line numbers, as the commit before did for card 16:
- specs/004-migrate-to-triad/plan.md:186–188, the sentence that has
  continued-feature translations and disposable workflow checks prepared
  in the candidate before the final migration batch, is followed by
  "(Overridden 2026-10-23: see the note after this paragraph.)", and a
  dated note after the paragraph names it as overridden, gives the ruling
  and its relay, and says that lane rebinding still waits for the reviewed
  cutover;
- specs/004-migrate-to-triad/tasks.md:165–167, the sentence that prepares
  the T016–T017 translations and T018's disposable workflow checks in the
  candidate before T015's final reconciliation, is followed by
  "(Overridden 2026-10-23: see the note below.)", and a dated note after
  the Dependencies paragraph does the same.

Both sentences keep their words, as history. Gate D's first clause itself,
plan.md:198–199, is not overridden: the ruling meets it by those receipts,
which the cutover's Gate D record reads.

Lane: openRepoTools-1
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… the checklist's lines 23, 24 and 29, which the walk at rehearsal D owes them

Item 1 of section 5 of the Gate B status walk at rehearsal D
(specs/004-migrate-to-triad/gate-b-status-2026-10-22.md on the evidence
branch 004-migrate-to-triad-rehearsal-d at b0eb112), "the dated notes of
rows 23, 24 and 29". These texts are lane 1's call, written here for the
cutover's final reconciliation batch (opensoft/openRepoTools#186, T015;
round 20 (2) of Brett Heap's rulings puts them in it).

- Line 23, specs/004-migrate-to-triad/installer-design.md:89: a dated note
  after the compatibility table says that its platform row predates
  opensoft/openRepoTools#227 (aaa7bc8), which made CI Linux only with the
  one bash 3.2 parse in release.yml's macOS install leg, and that
  opensoft/openRepoTools#237's hook gate and opensoft/openRepoTools#228's
  pipx link are in no part of the design.
- Line 24, installer-design.md:61–64: a dated refresh after the paragraph
  gives the counts at 33ce26d with line cites into openRepoTools, which is
  the code leg's file byte for byte (blob ca4fc44): 17 names in
  INSTALLABLES (:1292), three skills (:2280) and three command files
  (:2293) at two destinations each, 29 placed files and 29 receipt rows,
  and the two hook entries only once their path answers guard (:2384,
  :57–58). Rehearsal D's P4 measured "17 of 17 placed", 29 receipt rows,
  and both hook entries merged with the gate open and neither with it
  closed.
- Line 29, gate-b-status-2026-10-09.md:184: the old walk gets a dated
  block after its 2026-10-19 one, which names the walk at rehearsal D as
  superseding it for the 46 lines and lists what that walk's section 5
  owes this file. Its first entry is line 29's refresh against aa14de3:
  opensoft/openRepoTools#195 landed there, with lane 3's LAND at fb77bed
  and on the delta to e378871 (PR reviews 5481360555 and 5508055705). The
  next commits add the walk's items 2 to 5 to the same block.

The original text of both files stays as written, as history.

Lane: openRepoTools-1
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…of the runner-pin pull request, as dated notes

Item 2 of section 5 of the Gate B status walk at rehearsal D: lane 3's
review of opensoft/openRepoTools#299, comment 6317075196, left four NITs on
the dated notes, three of them edits to documents that are now this leg's.
The fourth, NIT 3, owes no edit: the squash body of 33ce26d already records
that the second look at the line numbers is done. The texts are lane 1's,
written for the cutover's final reconciliation batch
(opensoft/openRepoTools#186, T015).

- NIT 1, specs/004-migrate-to-triad/gate-b-checklist.md:202: the
  2026-10-21 note's sentence that began "Since" said that
  opensoft/openRepoTools#296 took the patched file to four jobs.
  opensoft/openRepoTools#227 did, and opensoft/openRepoTools#296 changed
  only the runners and moved the lines. The sentence now reads as lane 3 suggested, with each pull
  request in full ("As opensoft/openRepoTools#296 leaves it, the patched
  file holds four jobs (opensoft/openRepoTools#227 had removed the other
  three)"), and says when and for which NIT it was worded so.
- NIT 2, specs/004-migrate-to-triad/candidate-2026-10-09.md:104, with the
  paragraph at lines 110 to 116: the 2026-10-19 note names steps 11 and 13
  only. A dated sentence after it adds step 14: it applied the earlier
  t010-assembly-exact-pin-job.patch (6ee09f00…74670b), its result stands
  as recorded, and the file at that path is now the one regenerated on
  2026-10-21 (60245cb9…f0f653).
- NIT 4, specs/004-migrate-to-triad/gate-b-status-2026-10-09.md:187
  (checklist line 32): the old walk's 2026-10-26 block gains it. The
  regenerated assembly patch's runner comment differs from the tests.yml
  comment it follows in three places, not two: THIS for EVERY, no Python
  3.9 clause, and the inserted ", which this job's suite runs,". Read
  again for this commit, at the patch's lines 63 to 65 and tests.yml's
  lines 55 to 57 at 33ce26d.

Lane: openRepoTools-1
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s fire on ubuntu-24.04, and Brett Heap's ruling installs zsh so that 6 remain

Item 3 of section 5 of the Gate B status walk at rehearsal D: line 186
of specs/004-migrate-to-triad/gate-b-status-2026-10-09.md (checklist
line 31) says that about forty other conditional skips can still pass a
composed run and that none fires on ubuntu-24.04. Lane 2 counted 66
there: 60 zsh tests, 1 byte-count test and 5 wheel tests
(opensoft/openRepoTools#186 comment 6327803546).

The old walk's 2026-10-26 block gains a bullet that says so, and gives
Brett Heap's ruling on Ask 5 (2026-10-22, round 4, "Install zsh in
composed.yml"): the 60 zsh tests run and 6 skips remain, as in rehearsal
D's composed run on a bench that has zsh. The assembly root's
composed.yml carries that from the cutover's root follow-up row 6a
(9e5cca2). Line 31 itself is MET WITH NOTE at D on his round 10 ruling,
"Accept without job 5". The wording is lane 1's, for the cutover's final
reconciliation batch (opensoft/openRepoTools#186, T015). The cell stays
as written, as history.

Lane: openRepoTools-1
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…that was closed to the one that holds the cases it left

Item 4 of section 5 of the Gate B status walk at rehearsal D: the
pointers to opensoft/openRepoTools#180 that are now
opensoft/openRepoTools#304's. opensoft/openRepoTools#180 was closed with
opensoft/openRepoTools#215 (61a7378), which moved only repoA11b's tail
case. The row-stamp cases it left are opensoft/openRepoTools#304's:
repoA-1 and repoCase-1 (tests/test_lane_helpers.sh:1272 and :8552 at
33ce26d; rehearsal D's record, P3), and repoMIX-1 (:8645), which lane 3
found on 2026-10-22 (opensoft/openRepoTools#186 comment 6342130291).
Their fix is the code leg's 1e6f2d1, the cutover's code follow-up row
3a, merged by opensoft/openRepoTools-code#1 as 2a057a6d.

A git grep for that issue number under specs/ at 33ce26d finds 19 lines
in four files, 18 of them pointers of that kind (lane 3,
opensoft/openRepoTools#186 comment 6332521834). The spec leg's main
gives the same 19 lines. Each file gets one dated note, which names its
pointer lines at 33ce26d and says to read them as pointers to
opensoft/openRepoTools#304:

- candidate-2026-10-09.md: lines 261, 262, 282, 316 and 380, in a note
  before section 1. Line 404 is a list of the issues read with gh, and
  the note says that it stays as it is.
- gate-ab-evidence-2026-10-09.md: lines 436, 520 and 628, in a note
  before section 1.
- test-roots-and-ci-2026-10-08.md: lines 300, 305, 306, 369 and 477, in
  a note before section 1.
- gate-b-status-2026-10-09.md: lines 187, 189, 327, 511 and 640, as an
  entry of the old walk's 2026-10-26 block.

The pointer lines stay as written, as history. The notes' wording and
places are lane 1's, for the cutover's final reconciliation batch
(opensoft/openRepoTools#186, T015).

Lane: openRepoTools-1
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…of each, in its 2026-10-26 block

Item 5 of section 5 of the Gate B status walk at rehearsal D: the stale
cells of the old walk, specs/004-migrate-to-triad/gate-b-status-2026-10-09.md,
and the lines it still carries. The walk at rehearsal D gives each
line's update in its section 1. The old walk's 2026-10-26 block gains one
entry, which names each one with its line at 33ce26d:

- the cells of checklist lines 2, 12, 17, 25, 33 and 46 (:157, :167,
  :172, :180, :188 and :201), each with its update, and lines 23, 24, 29
  and 32 (:178, :179, :184 and :187), which the entries of items 1, 2
  and 4 cover;
- the "not on main" remarks in lines 36, 39 and 40 (:191, :194 and
  :195): opensoft/openRepoTools#196 landed those records as 983d8c7;
- line 40's count: the patches/ folder holds nine patch files, four at
  its top and five under patches/t006/ (lane 2's NIT 7,
  opensoft/openRepoTools#186 comment 6333755295);
- section 4(d) (:502, :504, :515 to 516 and :529), which names the jobs
  that opensoft/openRepoTools#227 removed: its basis restated without
  them, on Brett Heap's ruling on Ask 6 (2026-10-22, round 4, option 1);
- the API-call count at :531 and :611: 5 per install is the T007 v2
  patch's, and v3 makes 6, the root 2 and the implementation 4
  (installer-2026-10-08.md:234).

The cells stay as written, as history. The wording is lane 1's, for the
cutover's final reconciliation batch (opensoft/openRepoTools#186, T015).

Lane: openRepoTools-1
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…against the cutover's, and records what the cutover did through S12

T015 of specs/004-migrate-to-triad/tasks.md asks the final spec
reconciliation batch for "net tested effects, every amendment
disposition, dated departures/as-built record, archived approval
provenance, deferred issues and actual landed code/evidence"
(tasks.md:110-113), under opensoft/openRepoTools#186.

specs/004-migrate-to-triad/cutover-as-built-2026-10-26.md is that
record, beside the published copy of the plan the cutover executed. It
sets design.md's preliminary baseline (daed209, 64 paths, 28 follow-ups,
openRepoShape 39d5c98; openspec/changes/migrate-to-triad/design.md:5-7
and 44-45, and plan.md:18-24) against the cutover's (33ce26d, 200 paths,
42 follow-ups, openRepoShape 190133d, v1.1.0). It records, from the
cutover's own records and lane 1's relays on opensoft/openRepoTools#186:

- what each step from S1 to S12 did, and when;
- the net tested effects: execute's legs equal to rehearsal D's tips,
  S8's doctor, S9's accounting of all 200 source entries, the twelve
  follow-up rows with their commits, the code leg's S14 runs, and the
  root's checks at S12's head, which lane 2 repeated on its own;
- S14 at S12's head: the split PR's validate and composed runs
  passed, and S14 root-head read them green, with exact-pins's 6
  skips the wheel and byte-count cases that Ask 5 leaves;
- the landed code, every plan-text amendment and its disposition, the
  approval provenance, six dated departures and the deferred issues.

It says that it cannot record T015's items 1 to 6, this batch's own
merge, the approved bump push, the root-split merge or Gate D, which all
come after it lands. Dated notes in design.md (two) and plan.md (one)
point from the preliminary baseline to the record. The text and the
file's name and place are lane 1's, for the cutover's final
reconciliation batch.

Lane: openRepoTools-1
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…to the cutover's as-built record, instead of a refresh of its sections 2 to 5

Item 6 of section 5 of the Gate B status walk at rehearsal D:
specs/004-migrate-to-triad/candidate-2026-10-09.md is r2's record. The
Gate C ledger's P6 asks for it to be refreshed in its sections 2 to 5
form, and the Gate C status draft lists that as not done. D's record
carries D's candidate in its section "The candidate (stage 4, v0)", so
what a refresh adds is lane 1's call.

Lane 1's call, for the cutover's final reconciliation batch
(opensoft/openRepoTools#186, T015): no rewrite. A dated note before
section 1 says that this is r2's record, with r3's in section 9, and is
not refreshed; that the candidate of record at Gate C is rehearsal D's,
in D's record on the evidence branch 004-migrate-to-triad-rehearsal-d
at 94f8a3c until the spec-only continuation T017 carries it into this
leg; and that what the cutover built is in the as-built record beside
this file. The sections stay as written, as history.

Lane: openRepoTools-1
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@sourcery-ai

sourcery-ai Bot commented Oct 27, 2026

Copy link
Copy Markdown

Sorry @brettheap, you've used your own review budget of 250,000 diff characters for the last 7 days.

You can request another review in 4 days by commenting @sourcery-ai review. Upgrade to get a review now.

@brettheap
brettheap merged commit 64a1a98 into main Oct 27, 2026
1 check passed
@sourcery-ai

sourcery-ai Bot commented Oct 27, 2026

Copy link
Copy Markdown

Reviewer's Guide

This documentation-only batch completes T015's final migration-spec reconciliation by preserving historical records with dated corrections, publishing the exact approved adoption plan, and capturing the cutover's tested as-built state, provenance, landed follow-ups, departures, and deferred work.

Flow diagram for the final migration spec reconciliation

flowchart LR
    B[Preliminary migration baseline] --> P[Approved adoption plan]
    P --> C[Cutover execution]
    C --> R[Final reconciliation batch]
    R --> H[Dated historical corrections]
    R --> A[Cutover as-built record]
    R --> F[Deferred issues and landed follow-ups]
Loading

File-Level Changes

Change Details Files
Reconcile the migration design, requirements, plan, tasks, and historical Gate B records with the executed cutover and later rulings while preserving prior text as dated history.
  • Clarify the installation SHALL, front-door and code-leg file placement, Linux-only CI policy, hosted-check timing, and overridden work dispositions.
  • Add dated supersession, stale-count, issue-pointer, platform, runner, and API-call notes to historical evidence and candidate records.
  • Record the cutover baseline, execution timeline, tested effects, follow-up commits, amendment dispositions, approval provenance, departures, deferred work, and post-record limitations.
openspec/changes/migrate-to-triad/design.md
openspec/changes/migrate-to-triad/specs/repository-triad-migration/spec.md
openspec/changes/migrate-to-triad/plan.md
openspec/changes/migrate-to-triad/tasks.md
specs/004-migrate-to-triad/candidate-2026-10-09.md
specs/004-migrate-to-triad/gate-ab-evidence-2026-10-09.md
specs/004-migrate-to-triad/gate-b-checklist.md
specs/004-migrate-to-triad/gate-b-status-2026-10-09.md
specs/004-migrate-to-triad/installer-design.md
specs/004-migrate-to-triad/test-roots-and-ci-2026-10-08.md
Publish the exact cutover adoption plan and a comprehensive as-built record for T015 reconciliation.
  • Add the 485-line published plan copy with source, placement, resolutions, follow-ups, hashes, and execution status.
  • Document the cutover's preliminary and final baselines, S1–S14 activity, landed leg/root commits, test evidence, amendment dispositions, provenance, departures, and deferred issues.
  • Explicitly distinguish historical rehearsal evidence and work that occurs after this record.
specs/004-migrate-to-triad/adoption-plan-cutover-2026-10-26.yaml
specs/004-migrate-to-triad/cutover-as-built-2026-10-26.md

Possibly linked issues

  • #186: The PR explicitly fulfills T015 by adding the final reconciliation batch and as-built record, which the issue says lands as one PR and closes after merge.

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

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