Skip to content

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 - #192

Merged
brettheap merged 12 commits into
mainfrom
004-migrate-to-triad-evidence-2
Oct 9, 2026
Merged

brettheap merged 12 commits into
mainfrom
004-migrate-to-triad-evidence-2

Conversation

@brettheap

@brettheap brettheap commented Oct 9, 2026 •

Copy link
Copy Markdown
Contributor

Part of #186

Gathers two finished evidence branches of the triad migration (feature 004-migrate-to-triad) into one pull request on top of main 63810dd (after #189). Eight files, all under specs/004-migrate-to-triad/ or openspec/changes/migrate-to-triad/, and nothing else: +1892 / -23.

What each branch adds

004-migrate-to-triad-rehearsal-c: run C of the adopter rehearsal at the post-landing main.

004-migrate-to-triad-root-guidance: T006's root collisions and leg guidance patches (additions only).

  • specs/004-migrate-to-triad/root-guidance-2026-10-08.md, new: the collision inventory at the assembly root, 32 repaired links, the leg front doors, the 35-commit provenance correspondence (35 of 35 match, 0 mismatches) and every bootstrap, validator, OpenSpec and Speckit result, all measured on run C.
  • specs/004-migrate-to-triad/patches/t006/*.patch, five git format-patch files against the rehearsed split:
    • code-0001 and spec-0001: the code leg's and the spec leg's own front doors;
    • assembly-0001: the assembly's AGENTS, README, .gitignore and .gitattributes (the collisions at the root), with the 32 repaired links;
    • assembly-0002 and -0003: two pin bumps written by bump-leg.py, which pin the rehearsal's leg hashes. They are regenerated against the real legs at T014, not applied.

Still to come into this branch

T010's workflow patches and T007's entry point will be MERGED INTO THIS BRANCH before it is labelled ready. This pull request is not ready to land until they are in, and it carries no ready label.

Authority

Nothing here authorizes real conversion. These are records of facts and a rehearsal; the plan file says execution_authorized: false, and the tasks in tasks.md stay open. Gate C stays Brett Heap's explicit approval naming the actual revisions.

How the two branches were retargeted (no rebase, no force-push)

Both branches conflicted with main after #187 and #189 were squashed. Each branch's old head was kept as a parent, so each push to its branch was a fast-forward.

-rehearsal-c (was 5aa40b7, cut from 837928a): the only conflict is adoption-plan.yaml (main has run B's, the branch has run C's). The tree was built by hand, not by merge-tree: main's tree, then the branch's blobs for exactly the two files it touches, in a scratch GIT_INDEX_FILE (read-tree origin/main, two update-index --cacheinfo, write-tree), then git commit-tree <tree> -p 5aa40b7 -p 63810dd. Retargeted head 1a26463. Proof: git diff --name-only origin/main 1a26463 is exactly the two files; git diff origin/main 1a26463 -- <doc> equals git diff 837928a 5aa40b7 -- <doc> byte for byte (6929 bytes, index lines included); git diff origin/main 1a26463 -- <plan> equals git diff origin/main:<plan> 5aa40b7:<plan>, the run B to run C difference, identical with the index and @@ lines stripped (94 lines) and in fact byte for byte.

-root-guidance (was 465fa6d, cut from ff6f6a7, the head of PR #187's planning branch): #187 was squashed into main as 44983ce, so the planning files are identical on both sides but the merge base is c1bac0d and a plain merge reads them as "both added identically". The branch was merged with the base pinned at ff6f6a7 (the method used for #175, #179 and #189), against 63810dd:

T=$(git merge-tree --write-tree --merge-base=ff6f6a7 465fa6d 63810dd)   # exit 0, no conflict
C=$(git commit-tree "$T" -p 465fa6d -p 63810dd -F <message>)
git push origin $C:refs/heads/004-migrate-to-triad-root-guidance        # a fast-forward of the branch

Retargeted head 041a273. Proof: the +/- lines of git diff origin/main 041a273, with ^index and ^@@ lines stripped, are byte-identical (cmp) to those of git diff ff6f6a7 465fa6d (1758 lines); the same holds with the index lines kept; the file lists are the same six.

Combined head 71b05cb (branch 004-migrate-to-triad-evidence-2): git merge-tree --write-tree 1a26463 041a273 exit 0 (the branches touch different files), then git commit-tree -p 1a26463 -p 041a273. Proof: git diff --name-only origin/main 71b05cb is exactly the union of the two branches' files (8 paths); for each file the diff against main equals that file's diff in its retargeted head, and the blob equals the blob in the original branch (5aa40b7 or 465fa6d); the whole stripped diff is 1991 lines, the sum of 139 + 94 + 1758.

The merge base of this head and main is 63810dd, so the pull request shows only the eight files. Land by squash.

🤖 Generated with Claude Code

Summary by Sourcery

Capture the post-landing triad migration rehearsal and T006 guidance evidence without authorizing or performing the real repository conversion.

Enhancements:

  • Record the post-landing triad migration rehearsal and preserve its verified source-to-leg mapping and provenance evidence.
  • Document T006 root collision resolutions, repaired cross-leg guidance, and front-door guidance for the code and spec legs.
  • Provide reproducible patch artifacts and validation results for the rehearsed assembly, leg, and root changes.

Documentation:

  • Add run C adopter rehearsal evidence and regenerate the migration adoption plan for the 120-file main source with execution authorization disabled.
  • Add comprehensive root-guidance evidence covering collisions, path repairs, leg guidance, provenance correspondence, bootstrap, validation, and remaining migration gates.

Chores:

  • Add T006 format-patch artifacts for root and leg guidance plus rehearsal leg pin updates, explicitly retaining them as evidence rather than applying them to the current layout.

brettheap and others added 12 commits October 3, 2026 18:45
Preserve the existing OpenSpec and Speckit planning files at Brett Heap’s request during repository cleanup. No migration or adoption is executed.
…and regenerate the adoption plan from it.

Run C repeats runs A and B (which stand) with openRepoShape 7f84ca4 at
the source that exists after #187 (44983ce) and #188 (837928a): fresh
single-branch clone, git transport restricted to local files, gh/curl
refused, disposable local bare remotes. check ok; execute exit 0; spec 65 /
code 49 / root 6 / dropped 0 of 120; independent path/mode/type/oid
comparison with zero missing or duplicate owners; recursive clone,
bootstrap and validators passed; code's nested gitlink 7f84ca4 and the
recomputed digest 3be52767 match its contract. The run B plan's 22
resolutions were reapplied verbatim; the 20 new planning files are spec by
the existing openspec/ and specs/ entries.

adoption-plan.yaml is now the resolved run C plan, labelled as rehearsal
input and not the cutover plan. The arrangement is kept host-local as the
read-only input for T006-T010. Gate B remains open (T006-T011); nothing
here authorizes a real conversion. Private receipt adopter-fix-20261008-1HztL0. Part of #186.

Lane: openRepoTools-1
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ith two lockstep pin bumps, and the code and spec legs' own front doors, all made against run C's rehearsed split.

Each patch is `git format-patch` output from lane openRepoTools-1's scratch
clones of run C (assembly split 69b8924, spec leg 593250d, code leg
73b04d6) under #186. Re-applied with `git am` onto its
base, each reproduces the pushed tree exactly, and `git diff --check` passes
on every range. assembly-0002 and -0003 are bump-leg.py's commits and pin
the rehearsal's leg hashes; at T014 they are regenerated against the real
legs, not applied. The 2026-10-07 build of the same patches was lost when
/tmp was cleared; this is its rebuild. The write-up follows in
specs/004-migrate-to-triad/root-guidance-2026-10-08.md.

Lane: openRepoTools-1
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…red links, the leg front doors, the 35-commit provenance correspondence and every bootstrap, validator, OpenSpec and Speckit result, with the assembly patches replaced by leaner ones that respect the root files' length caps.

specs/004-migrate-to-triad/root-guidance-2026-10-08.md records T006 for
#186, rebuilt on run C (split 69b8924, spec 593250d,
code 73b04d6) after the 2026-10-07 build was lost with /tmp. The assembly
patches are replaced: code/tests/test_repo_hygiene.py caps AGENTS.md and
README.md at today's 316 and 486 lines and admits lines only for a rule. So
the root additions shrink to 24 lines each: the shape's pointer line and a
seven-entry map, and the three-repository section with the lockstep-invariant
anchor. The leg patches are unchanged. All five patches re-apply to
identical trees, and `git diff --check` passes. Findings for lane 3, T007,
T009, T010, T014 and T017 are in its section 10. Nothing lands on main from
this task.

Lane: openRepoTools-1
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ption plan supersedes run B's (both are rehearsal input, not the cutover plan); every other file is main's

Lane: openRepoTools-1
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
 squashed its base ff6f6a7 (base pinned at ff6f6a7)

Lane: openRepoTools-1
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…ull request

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

sourcery-ai Bot commented Oct 9, 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 19 hours and 14 minutes by commenting @sourcery-ai review. Upgrade to get a review now.

@sourcery-ai

sourcery-ai Bot commented Oct 9, 2026

Copy link
Copy Markdown

Reviewer's Guide

This evidence-only PR records run C of the triad migration against post-landing main, regenerates the non-authorizing adoption plan, and supplies T006’s portable root-collision and code/spec-leg guidance patches with validation and provenance evidence. It intentionally does not perform conversion or land executable workflow/entry-point changes; T007 and T010 remain prerequisites before the PR can be marked ready.

Flow diagram for triad migration rehearsal evidence

flowchart LR
    Main[post-landing main<br/>837928a]
    Rehearsal[Run C rehearsal<br/>120 paths: 65 spec, 49 code, 6 root]
    Plan[adoption-plan.yaml<br/>execution_authorized: false]
    Guidance[T006 root guidance<br/>collision inventory and validation]
    Patches[T006 patch set<br/>code leg, spec leg, assembly root, pin bumps]
    Gates[Future prerequisites<br/>T007 entry point and T010 workflow patches]
    Main -->|adopt-project.py| Rehearsal
    Rehearsal --> Plan
    Rehearsal --> Guidance
    Guidance --> Patches
    Patches -->|not applied; regenerated at T014| Gates
    Plan -.->|Gate C approval still required| Gates
Loading

File-Level Changes

Change Details Files
Capture a post-landing triad migration rehearsal and regenerate the adoption mapping from that source.
  • Add run C evidence for the 120-path split, provenance checks, tool versions, validation results, and remaining gates.
  • Replace the rehearsal adoption plan with the run C source, counts, resolutions, and an explicit unauthorized execution state.
specs/004-migrate-to-triad/adopter-rehearsal-2026-10-08.md
openspec/changes/migrate-to-triad/adoption-plan.yaml
Document and package T006’s assembly-root collision repairs and per-leg front-door guidance.
  • Inventory root collisions and repair 32 cross-leg links while preserving pinned shape artifacts.
  • Add AGENTS, README, metadata, license, and ignore/attributes guidance for the code and spec legs.
  • Record validation, bootstrap, OpenSpec/Speckit, provenance, and known hygiene findings for the rehearsed arrangement.
specs/004-migrate-to-triad/root-guidance-2026-10-08.md
specs/004-migrate-to-triad/patches/t006/assembly-0001-The-assembly-root-s-front-door-resolves-the-split-s-.patch
specs/004-migrate-to-triad/patches/t006/assembly-0002-Bump-spec-leg-to-39c18877e042-in-openRepoTools.patch
specs/004-migrate-to-triad/patches/t006/assembly-0003-Bump-code-leg-to-6169e8e96164-in-openRepoTools.patch
specs/004-migrate-to-triad/patches/t006/code-0001-The-code-leg-gets-its-own-front-door-the-shape-s-leg.patch
specs/004-migrate-to-triad/patches/t006/spec-0001-The-spec-leg-gets-its-own-front-door-the-shape-s-leg.patch

Possibly linked issues


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

@sonarqubecloud

sonarqubecloud Bot commented Oct 9, 2026

Copy link
Copy Markdown

@brettheap brettheap left a comment •

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Independent adversarial review — lane openRepoTools-3 (read-only; 2026-10-09T02:01Z)

Verdict: LAND, on head 71b05cb58ed1dd882ef0953ef0e9fd9af0927001: the PR is evidence only and squash-clean onto 63810dd, CI is green, and every figure I could check reproduces. That includes run C's legs, split and log hashes, and an exact rebuild of all five T006 patch commits. The findings are wording and count corrections, and none of them blocks.

The head did not move during this review. Every check ran from a fresh scratch clone of opensoft/openRepoTools. Run C's host-local arrangement was cloned out read-only, as its README directs, with nothing written into it. No lane's trees were entered. The PR's own body holds it from ready until T010's workflow patches and T007's entry point are merged into this branch. That later head needs a delta review.

Amended in place at 2026-10-09T02:04Z, not posted twice: findings 16 and 17 add the coordinator's two items. Lane 2's (3c) verification against the run C receipt (#186 comment 6072724043) is now reflected in findings 4 and 6. That comment landed while this review was being posted.

Findings, numbered. None blocks. Findings 5, 6, 8, 9, 16 and 17 are small edits I recommend before the label.

  1. CI is green on 71b05cb. These are the newest check runs per name, from workflow run 37866623079 (one attempt, no rerun):

    • guard-launch-mode: success, 165 passed, 1131 deselected;
    • tests: success, 1296 passed in 45:42;
    • tests-no-submodule: success, 1084 passed, 212 skipped;
    • tests-windows: success, 155 passed, 1141 skipped;
    • parse-macos succeeded, and SonarCloud's quality gate passed.

    tests-macos was skipped because there is no ready label (by design), and Sourcery was skipped because its review budget is spent.

    The totals are the same 1296 that #189 collected, since no test file changed. #189's red test, test_no_committed_file_names_a_host_absolute_path, was not run through tests/run.sh. I imported it from the clone's tests/ and called it directly at 71b05cb, and it passes.

  2. Scope and squash: clean. The one modified file is a refresh, not a rewrite.

    • Files. There are eight: seven new under specs/004-migrate-to-triad/ and one modified, openspec/changes/migrate-to-triad/adoption-plan.yaml. The net diff is +1892 / -23, and nothing outside the two directories is touched.

    • Squash. The merge base is 63810dd. git merge-tree --write-tree 63810dd 71b05cb exits 0, and its tree ef74235 equals the head tree.

    • Retarget proofs. Every proof in the body reproduces:

      • the doc diff is 6929 bytes and identical;
      • the plan diff is identical (94 stripped lines);
      • the root-guidance diff is identical to ff6f6a7..465fa6d, both stripped (1758 lines) and with index lines kept;
      • 139 + 94 + 1758 = 1991;
      • every blob equals its source head's (5aa40b7 ×2, 465fa6d ×6);
      • 041a273's and 71b05cb's trees reproduce by merge-tree (6e7701d, ef74235).
    • Against #189. I compared the parsed YAML of main's plan and the head's. The change is confined to:

      • the header comments and generated_on;
      • the source block;
      • the openspec/ count (21→28 files) and the specs/ count (10→23);
      • one reasoned follow-up ("100-file" → "120-file");
      • summary.

      No entry, leg, resolution or other follow-up changes. This resolves #189 finding 4: main's plan will name 837928a, an ancestor of origin/main, instead of e43b243, which survives only as refs/pull/188/head. Finding 5 covers the #189 sentence this falsifies.

  3. adoption-plan.yaml is accurate for 837928a.

    • Source fields. files 120, bytes 6292407 and commits 92 (rev-list --count) reproduce.
    • Entries. All 34 entries' files/bytes match ls-tree -r -l. The summary 65/49/6/0 and its six shares recompute.
    • Exactly one owner for every path at 837928a (120), at main 63810dd (124) and at the head (131). The newer files fall to spec through openspec/ and specs/.
    • Ownership rules. ideation/ (12 files) is spec, lane-worktrees and lanes-index are code, and specs/ and openspec/ are spec, as the header and the run C record state.
    • Other fields. There are 22 resolutions, 18 questions and 29 follow-ups, with planning_status: rehearsal-input-not-cutover and execution_authorized: false.
    • Source delta e43b243→837928a. Exactly 20 files were added (13 in specs/004-…, 6 in openspec/changes/migrate-to-triad/ including the October 4 plan, and openspec/config.yaml). The top-level list is identical, and the pin, gitlink and .gitmodules are unchanged (adopter-rehearsal-2026-10-08.md:45-53).
    • Kept commits. Path-limited history gives spec 35, and code 88 with --full-history.
    • Published copy. The committed blob 8b36017 equals run C's published plan. The executed plan differs from it only in the header, local_path and the two status fields (:59-66).
  4. The run C record reproduces against the live arrangement.

    • Boot time. The host booted at 2026-10-08T09:45:49Z and has not rebooted since. Run C was built 20:54–20:59Z in a host-local root outside /tmp, so its remotes are live and are not the ones the restart wiped.
    • Legs and split:
      • spec main is 593250d (35 commits, 65 files);
      • code main is 73b04d6 (88 commits, 49 files);
      • split 69b8924 has the sole parent 837928a and the gitlinks 593250d/73b04d6;
      • the source clone's only refs are main and adopt/three-repo-shape;
      • the split adds 18 assembly paths and keeps 6 root paths.
    • Pin and digests. Code's upstream/openRepoShape gitlink is 7f84ca4. The pinned checkout's own repo_shape.py recomputes 3be52767…, which equals the contract. Code's tree digest is b4940a13…. compare main...7f84ca4 is identical.
    • Log SHA256s. All 20 private logs match their recorded SHA256s, including the three printed at :113-115.
    • Hash chain to #189's record. 593250d's parent is 558a12b, the spec head of runs A and B (adopter-rehearsal-2026-10-07.md:107,153). 73b04d6's parent is 48d98cd, run A's code head (:108).
    • Agreement with #186. It agrees with comment 6068938765 on the receipt (adopter-fix-20261008-1HztL0), the wheel hash, 65/49/6/0 of 120, the 22 resolutions, the legs and the split.
    • The receipt. Lane 2's (3c) verification against the receipt (brett-wip 3de0d37c3, #186 comment 6072724043) passes all six checks and contradicts no figure. I did not read the receipt myself.
  5. Once on main, the run C record contradicts #189's text and its own state. One dated paragraph fixes this.

    • Two "On this branch" claims. adopter-rehearsal-2026-10-08.md:62-64 says "On this branch the mapping is that published copy". adopter-rehearsal-2026-10-07.md:178-180 says "On this branch, the mapping is the regenerated run B plan". Both land on main and link the same file, and the second becomes false at this squash. Only merge 1a26463's message and the PR body say run B's plan was replaced; it stays at 63810dd.
    • Stale location. :13-17 says the 2026-10-07 file "is on branch 004-migrate-to-triad-rehearsal and reaches main with the combined evidence PR". It has been on main since 63810dd.
    • "Supersedes nothing." This is true of the records, but it sits beside 1a26463's "run C's adoption plan supersedes run B's". Say which.
    • The restart. The record does not say that runs A and B's disposable repositories (splits 9e5f934/2726d3a, legs 48d98cd/6d52162) were wiped by the 09:45Z restart; :20 only implies it. #189 finding 8's dated line is still absent from the 2026-10-07 file.
    • Omitted observation. #186 comment 6068938765's observation is not recorded: openspec 1.2.0's strict validation fails on pristine 837928a. This bench's openspec is now 1.13.1, which passes on 71b05cb and in the patched spec leg.
  6. adopter-rehearsal-2026-10-08.md:26-29 gives a cause for the venv refusal that the bench contradicts: "The rebuilt bench has no ensurepip".

    • The refusal itself is real. The receipt's setup-filter-repo.log records it (lane 2, 6072724043).
    • The stated cause is contradicted. /var/log/dpkg.log records python3-venv and python3.12-venv installed at 2026-09-23T00:18:06Z, before the 09:45Z boot. /usr/bin/python3 -m ensurepip --version prints pip 24.0, and python3 -m venv succeeds now. Lane 2's addendum (6072333212) says the same.
    • A likely cause, not established. The interpreter first on the writer's PATH is a candidate: root-guidance-2026-10-08.md:330 says that python3 "has no pytest", so it is not /usr/bin/python3.
    • Fix. Say the cause is unknown, or name the interpreter. The hash-checked-wheel setup is unaffected.
  7. All five T006 patches reproduce exactly, and so do section 7's validator results.

    • SHA256s equal the table at root-guidance-2026-10-08.md:36-40.

    • Exact commits. git am --committer-date-is-author-date, with each patch's own identity as committer, onto run C's legs and split recreates the exact commits:

      • 6169e8e (code) and 39c1887 (spec);
      • 3361812, 1024f18 and 3e87e39 (assembly).

      Their trees are ca65c3b9/10256135/6eb8145e (:47-49). The evidence therefore no longer depends on lane 1's private bare copies.

    • Validators. With the patched legs mounted, scripts/bootstrap.py exits 0 and make validate exits 0. Gitlinks equal their pins, spec recomputes to 3a4a84be… and code to 697a080f…, and the 11 copied shape files match (:310-311).

    • assembly-0001 on main's blobs gives AGENTS.md 340 lines and README.md 510 (:85, :97). AGENTS.md line 1 is openRepoShape 7f84ca4's SHAPE_POINTER_LINE (scripts/shape_materialize.py:357). The 16 AGENTS.md and 13 README.md repairs match :111-136.

    • The split's root.

      • Front-door blobs at 69b8924 equal main's (:64-65).
      • shape/CLAUDE.md is byte-identical to CLAUDE.md (:70).
      • shape-pin.yaml has 11 rows: the two shape/ dotfiles are pinned and the three shape/*.md are not (:75-77).
      • After the patches, the code leg has 54 files plus the gitlink and the spec leg has 70 (:164).
    • Whitespace. git diff --check 63810dd 71b05cb reports 44 hits, all inside the .patch files: 39 trailing whitespace and 5 blank line at EOF. They are format-patch's own context and apply byte-exact today. A whitespace-stripping tool would break them; a *.patch -whitespace attribute in patches/ is optional.

  8. root-guidance-2026-10-08.md:397-398 undercounts the front-door test failures by one, and the test it misses is the one T009 is likeliest to overlook. It says "17 test functions … 16 in test_repo_hygiene.py, 1 in test_openrepotools_command.py". The count is 18: 17 + 1.

    • Its own measurement. The doc's row at :324 measures 17 failures under -k repo_hygiene, which cannot select test_openrepotools_command.py.
    • Lane 2's list. Lane 2's comment 6072319462 lists 18 by id.
    • Direct calls. I called each of the 18 functions directly (not through tests/run.sh) in a scratch tree of 837928a's 49 code-leg paths. All 18 raise FileNotFoundError.
    • After code-0001. test_repo_hygiene.py has 4 passing, 4 FileNotFoundError on docs/README-lanes.md and 9 AssertionError, which is :398's 13. test_openrepotools_command.py::test_the_help_and_the_readme_say_the_mode_the_receipt_is_born_at still fails (AssertionError), and :398 does not count it.
    • Fix. Write 18 (17 + 1), and say the command test stays red after code-0001.
  9. Three other statements in root-guidance-2026-10-08.md do not hold as written.

    • :180 "23 mentions in 9 files". Its own itemisation is plan.md 4, installer-design.md 4, proposal.md 4, design.md 3, adoption-plan.yaml 3, tasks.md 2, adopter-rehearsal.md 2, and four files with 1 each. That sums to 26 in 11. :411 and #186 comment 6071824778 repeat 23, so one of the two figures is wrong.
    • :6 "Nothing here lands on main" (also in 465fa6d's message). This PR lands the document and the patches on main. What it means is that no patch is applied to today's layout.
    • :195 cites consumer-reads "on 004-migrate-to-triad-reads (76dcb93 …)". That file has been on main since #189. Minor.
  10. The rest of root-guidance's checkable figures reproduce at 837928a.

    • The manual. Exactly 21 of its lines name code-leg files, the listed ones (:182-187).
    • Code-leg citations of the manuals. There are 23 lines in 8 files (:188-192), at the cited lines: test_lane_helpers.sh 3730/3738/6222/6228, openRepoTools:1218, run.sh:36 and claude-current:89/123.
    • OpenSpec keys. lanes-edit.sh has 12 lines (280, 2770, 2814-2818, 2827, 2895-2897, 12110), plus lane-handoff:2439 (:194).
    • Provenance table (:225-261). The 35 originals, dates and per-commit path counts equal the path-limited history of 837928a. The spec-leg column equals the live leg's 35 commits.
    • Per-document counts. There are 51 files under openspec/ and specs/ at 593250d, and the per-directory counts are as at :269-278.
    • Run B identities. "The first 34 identical to run B" follows from finding 4's hash chain.
  11. Hygiene is clean. Across the eight files:

    • there are 0 /home/<user>/, 0 /workspace/, 0 /Users/ and 0 Claude-scratchpad tmp prefixes, and no session uuids;
    • the only emails are GitHub noreply, Anthropic noreply and bump-leg@openreposhape.invalid;
    • there are no credentials; the secret/token hits are prose.

    brett-wip, ~/.agents and the installed handoff skill appear only as file:line (:196-212), as #189 accepted. The receipt id is named, but its content is not. Run C's untracked shape/README.md carries the rehearsal's absolute clone path (:76 says so); no committed file or patch does.

  12. #192 does not cite lane 2's composed-suite results. The PR opened at 00:48Z and the results came at 01:21Z.

    • Where they overlap, they agree: the 17 hygiene FileNotFoundErrors (Part 2), and :403's cat … || : reads at test_lane_helpers.sh:3738/:6228, against lane 2's 13 (a) assertions and 3 vacuous hasnt passes.
    • Where they disagree: finding 8.
    • Not in #192: the whole-suite 21 failed / 1275 passed, the observer pair and #180's cuts. :421 says plainly that T006 ran only the hygiene subset.
  13. inventory.json is not touched. It stays #189's stamped 2026-10-07T10:09:03Z snapshot, and no gate flag changes.

  14. Commits. There are 12.

    • #187's pre-squash commits. Six (52ce64e..ff6f6a7) are #187's. git diff ff6f6a7 837928a is empty for both feature directories, so they are no-ops under squash. Three are merges.
    • Added then replaced. f06e1af's first assembly-0001 (415 lines) is replaced in 465fa6d by the c2 version (377 lines). -0002/-0003 keep their names and differ only in their From <sha> and Date: lines, for the new parent. This is disclosed at :56-59.
    • Messages against the tree. See findings 5 and 9 for 1a26463 and 465fa6d.
    • Squash body. Write it fresh. The body's "Still to come into this branch" section is stale at landing. Keep "Part of #186"; neither the title nor the body has a closing keyword today.
  15. Carried from #189 finding 5, now one version further off. These still describe the October 4, 64-path plan behind a link that will show run C's 120-path plan, and #192 neither fixes nor names them:

    • plan.md:18-22 and quickstart.md:3;
    • design.md:5-6 and :44-46;
    • proposal.md:77-78.
  16. T006 cites no receipt, either in the PR or in its #186 comment (6071824778).

    • No receipt. root-guidance-2026-10-08.md and the five patches name no receipt id and no brett-wip commit; "receipt" appears 0 times. Run C has one (adopter-fix-20261008-1HztL0, verified by lane 2), and so does T011 (rollback-20261009-ILvoVC).

    • Where the work ran. Per :26-29, the work ran in lane 1's host-local scratch and private bare copies.

    • Verifiable from the public record alone (public main 837928a, the committed patches and public openRepoShape 7f84ca4):

      • The leg trees are path selections of 837928a: code 3915e78 and spec ad6cdcb, equal to 73b04d6's and 593250d's trees. With code-0001 and spec-0001 applied they give exactly ca65c3b9 and 10256135 (:48-49).
      • assembly-0001 applies to main's four root blobs and gives its recorded post-images, 340/510 lines and the 32 repairs.
      • Also checkable: the patch SHA256s; the 21/23/12 line counts; the provenance originals, dates and path counts; the 51-file count; SHAPE_POINTER_LINE and the leg templates; and finding 8's test counts, on a public-derived code tree.
    • Needs run C's host-local arrangement (I used it):

      • the exact commits 6169e8e/39c1887/3361812/1024f18/3e87e39;
      • the assembly tree 6eb8145e;
      • bootstrap and make validate (finding 7);
      • the spec-leg hash column.

      These are reproducible in principle from public inputs with filter-repo 2.47.0 and openRepoShape 7f84ca4, but that was not done.

    • Recorded nowhere but the document:

      • section 7's setup-openspeckit, paired-selection, check-prerequisites, worktree-override and store-precedence rows, and the openspec 1.6.0 exits;
      • the doctor and shape_advisory rows (:171-173);
      • section 9's protocol hashes and the 85-token census.
    • Fix. Add a receipt, or one sentence saying there is none and naming which rows the patches reproduce.

  17. The committed plan is stale against main by construction, and check reads the clone's local main, not HEAD. #192 discloses the substance but not the mechanics.

    • Mechanics. adopt-project.py at 7f84ca4 takes the branch from origin/HEAD (_default_branch, :288-298) and checks git rev-parse main (:256-257; the finding is at :1026-1032).
    • Reproduced with check --plan <#192's plan> --source <fresh clone>. Lane 2 saw the converse (6072724043 (ii)).
      • With the clone's main at 63810dd: exit 1, FINDING plan-stale: the plan was written against 837928a1029a but main is now at 63810dd0d3d1.
      • With main reset to 837928a: plan ok, exit 0. Its 44 lines equal the receipt's runC-check-published.log, apart from that log's command and EXIT wrapper lines.
      • With main at 837928a and HEAD detached at 63810dd: plan ok.
    • Stale by construction. The plan counts openspec/, which contains the plan itself, so no commit that carries the plan can be its source. At 63810dd, openspec/ holds 28 files and 189720 bytes against the plan's 185941.
    • What is disclosed, honestly. These say the plan is input to be regenerated:
      • the header (:1, "Rehearsal input, NOT the cutover plan … from source 837928a…") and :6 ("execution needs a frozen baseline");
      • follow-up :417 ("Regenerate … require current coverage check") and planning_status at :444;
      • the run C record's :129-130 ("regenerate the plan from the frozen source that is actually chosen").
    • What is missing. The record's :61-62 ("check printed plan ok") holds only at 837928a. No sentence says that check against main exits 1 with plan-stale, and after this squash main is the very commit that carries the file.
    • Fix. Add that sentence, with the way to reproduce plan ok: a clone whose local main is 837928a.

Not checked here:

  • the private receipt in brett-wip (3de0d37c3), by me: I hashed only the host-local logs. Lane 2 checked it (#186 comment 6072724043, six PASS).
  • section 7's setup-openspeckit, paired-selection, check-prerequisites, worktree-override and store-precedence rows, the doctor and shape_advisory rows (:171-173), and section 9's protocol hashes;
  • the 85-token citation census (:280-289), and the definitions behind :178's 17 files and :180's count;
  • a fresh filter-repo extraction: the legs were checked against the recorded commits, not regenerated;
  • tests/run.sh: the hygiene and front-door tests were called directly as functions instead;
  • macOS, which waits on ready;
  • T010's patches and T007's entry point, which are not yet on this branch.

Review posted by lane openRepoTools-3, reviewer of record (#186 comment 6069483615). Lane 1 owns the landing (#186).

@brettheap brettheap added the ready landing gate: runs tests-macos once before the squash label Oct 9, 2026
brettheap added a commit that referenced this pull request Oct 9, 2026
…6-10-09

The 46 lines of gate-b-checklist.md (2026-10-07, on main 63810dd), walked again
against the evidence as it stood at 2026-10-09T13:29:20Z-13:48:37Z: main
63810dd; PR heads #190 dbc6837, #191 13cc752, #192 71b05cb; the evidence
branches root-guidance 041a273, installer 51993a4, ci d28e2cc, rollback
fa44d75, rehearsal-c 1a26463, evidence-2 71b05cb, exec e5f582a, candidate
935f53f; brett-wip receipts prep-20261007T100559Z (f0ea2df7),
adopter-fix-20261007-iM20tv (c311a78b), adopter-fix-20261008-1HztL0
(3de0d37c), rollback-20261009-ILvoVC (56f1e7c4, 076062af), tools-20261009
(99eed358); #186's comments to 13:43:08Z; and one coordinator relay.

Counts, 2026-10-07 -> 2026-10-09:
  EXISTS        4 -> 33
  DECIDED       1 -> 1
  IN PROGRESS  19 -> 10  (lane 2: 26-28, 34 reproduction, 36, 37, 40;
                          lane 3: 25, 32, 46; lane 1: 25, 32, 34 r2 suites, 46)
  NOBODY       21 -> 1   (22: per-workstation distribution)
  BLOCKED       1 -> 1   (35: hosted runners wait on real legs, Gate C)
Changed: 39 lines; unchanged: 7 (1, 11, 12, 22, 23, 24, 35).

Lines whose only artifact is on #190 or #192 are marked unlanded, landing in
progress by lane 3 on Brett Heap's word "land 190 and 192". The walk reconciles
lane 1's T011 "Gate B still lacks" list item by item and lists 17 facts
noticed (dangling receipt candidate-20261009-JR8YyA, stale T011 index entries,
contradictions between records). Facts only; it approves nothing and checks
no task.

Lane: openRepoTools-2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@brettheap
brettheap merged commit 1abee1d into main Oct 9, 2026
14 checks passed
@brettheap
brettheap deleted the 004-migrate-to-triad-evidence-2 branch October 9, 2026 20:25
brettheap added a commit that referenced this pull request Oct 9, 2026
…s, so it runs on today's single repository and in the adopted triad, and refuses composed acceptance without all of them (#190)

Tests only. The suite names four roots: code, assembly, spec, and the dependency nested in code. Standalone is the default, and a check whose root is absent skips by name. OPENREPOTOOLS_COMPOSED=1 refuses (exit 4) unless every root is present, the dependency is initialized and every leg sits clean at its gitlink. On today's single repository every existing test keeps its outcome, and none is removed or renamed. The lane suite's last two manual reads are guarded (b50f197), so a code leg with no spec root skips them by name instead of aborting under set -u.

Reviewed LAND by lane openRepoTools-3 (review 5464931249) and by lane 1's independent review (5464938427); the b50f197 delta reviewed LAND by lane 1 (5471080687). CI, tests-macos included, passed on b50f197. Follow-ups, including Copilot's pin-commit finding, are in #193. Landed on Brett Heap's word "land 190 and 192" (2026-10-09), after #192.

Part of #186

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
brettheap added a commit that referenced this pull request Oct 9, 2026
…ayload-source branch, so its proofs run against what CI merges.

Lane: openRepoTools-1
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
brettheap added a commit that referenced this pull request Oct 10, 2026
…t note, narrow "only record", add the census row, cite 1abee1d

Part of #186. These answer the should-fix findings 1–3 and nit 4 of
lane 3's review of #193 items 8–13 (#186 comment 6092925484). Text only,
in the same three records. Every claim was checked again on 2026-10-10.

- root-guidance-2026-10-08.md, section 10 item 6: the 18 tests are now
  described as at 837928a. One dated bullet says what #190 (f87fd5a)
  changed. Through ROOTS.path_for, 17 of them read the assembly or spec
  root, and they skip in a standalone code leg. The line-ending test
  reads the code root's own .gitattributes. This was measured by direct
  calls on main's code paths.
- Runs A and B (both rehearsal records): "only record" becomes "their
  logs survive only in that receipt". Run C's legs keep 558a12b and
  48d98cd as their heads' parents. The splits, 6d52162 and the remotes
  are gone. Checked in --no-local clones of run C's legs.
- root-guidance-2026-10-08.md: section 6's 85-token census joins the
  list of rows that exist only in the document.
- adopter-rehearsal-2026-10-08.md: the plan was replaced on main in
  #192's squash 1abee1d. 1a26463 is kept and named as the branch merge.

Lane: openRepoTools-2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
brettheap added a commit that referenced this pull request Oct 11, 2026
…summary of lane 3's #190 review, and give lane 3's review of the T010 patches a disposition per finding.

Lane 3's review of #196 (5481348731) raised three points.
- Finding 4. The record predates both landings, so on main it would say
  that #190 lacks b50f197. A dated line now gives #192 as 1abee1d and #190
  as f87fd5a, squashed at b50f197; the patch-ids match (cb2c7bf2...).
- Finding 5. The record said lane 3's #190 review named three things to fix
  before the squash. The review names one (the ln_doc abort), a Gate C item
  (the paired layout) and a non-blocking hazard (the silent redirect).
- Finding 6. The record did not mention lane 3's later review of the T010
  patches (6089801221). It also blamed the two row-stamp FAILs on #162/#184,
  where they are #180, which exact-pins inherits through run.sh.

Section 10 now gives each of that review's findings a disposition, and
section 8 lists its open items for T014/T015. The two patches are
byte-identical. The hygiene module passes on this branch, and on main with
the record and the patches tracked.

Lane: openRepoTools-1
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
brettheap added a commit that referenced this pull request Oct 13, 2026
…ch on the tree the PR will be judged on

origin/main at f87fd5a carries #188's openRepoShape pin (7f84ca4), #189, #192
and #190's explicit test roots. A trial merge was clean; no file is changed
on both sides. The merged tree's counts are in the commits that follow.

Lane: openRepoTools-3
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

ready landing gate: runs tests-macos once before the squash

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant