Repository navigation
Open
Description
Follow-ups deferred at the landing of #190 and #192, which lane 3 landed on Brett Heap's word in its window, "land 190 and 192" (2026-10-09): #192 as 1abee1d, then #190 as f87fd5a at b50f197. Part of #186. Each item names where it was found; none of them is in either PR as landed, except item 1, which #190 carries.
From #190 (explicit test roots)
- RESOLVED by Give the test suite explicit code, assembly, spec and dependency roots, so it runs on today's single repository and in the adopted triad, and refuses composed acceptance without all of them #190's landing. Lane 1 folded
b50f197into Give the test suite explicit code, assembly, spec and dependency roots, so it runs on today's single repository and in the adopted triad, and refuses composed acceptance without all of them #190 before the squash (its delta review 5471080687; CI, tests-macos included, green on that head), and Give the test suite explicit code, assembly, spec and dependency roots, so it runs on today's single repository and in the adopted triad, and refuses composed acceptance without all of them #190 landed atb50f197. The record as filed: The lane suite aborts in a code leg with no spec root.tests/test_lane_helpers.sh:6601-6602read$ln_docoutside its$LANE_MANUALguard, so underset -ua standalone code-leg run stops onln_doc: unbound variableinstead of skipping. The fix exists onfeat/test-roots-manual-guard@b50f197, a fast-forward onto Give the test suite explicit code, assembly, spec and dependency roots, so it runs on today's single repository and in the adopted triad, and refuses composed acceptance without all of them #190's head. Lane 1 may fold it into Give the test suite explicit code, assembly, spec and dependency roots, so it runs on today's single repository and in the adopted triad, and refuses composed acceptance without all of them #190 before the squash (its handoff plans that; the window is in lane 3's landing notice on Triad migration (feature 004-migrate-to-triad): execution tracking under Brett Heap's word of 2026-10-07 #186, and Give the test suite explicit code, assembly, spec and dependency roots, so it runs on today's single repository and in the adopted triad, and refuses composed acceptance without all of them #190's gate then re-runs); if Give the test suite explicit code, assembly, spec and dependency roots, so it runs on today's single repository and in the adopted triad, and refuses composed acceptance without all of them #190 lands atdbc6837instead,b50f197needs its own PR onto main and this item stays open. Found by lane 3's review (5464931249) and confirmed by lane 1 on Triad migration (feature 004-migrate-to-triad): execution tracking under Brett Heap's word of 2026-10-07 #186. - Mixed tests and the four roots in AGENTS.md.
feat/test-roots-followups@7144eef(6e63083,2064390, withb50f197merged in): each mixed test asserts its code-only half before its first document read, and AGENTS.md documents the four roots (cap 316 → 323; 340 → 347 at an assembly root). Note from lane 3's candidate review on Triad migration (feature 004-migrate-to-triad): execution tracking under Brett Heap's word of 2026-10-07 #186:7144eefdoes not compose with T006'sassembly-0001, which rewrites the assembly's AGENTS.md. - A behaviour test for the missing-manual branch (only its text is checked today).
- Composed validation never reads
contracts/{role}-pin.yaml'scommit:(Copilot round 2, High; thread ontests/conftest.py:270). With the pin moved off the gitlink,ROOTS.refusal()returnsNonewhilescripts/validate-pins.pyexits 1 (pin-gitlink-mismatch). The exact-pin CI job runs the validator first, so only a hand-made composed run is exposed. Refuse a pin whosecommit:differs from the gitlink. Also (Medium): root markers must be regular files, not any existing path. - The paired layout is not discovered.
discover_assembly(tests/conftest.py:159-172) returns nothing for<assembly>/worktrees/<feature>/code, so after Gate C every document test would skip in a feature worktree. - The root variables redirect the suite silently.
OPENREPOTOOLS_CODE_ROOTre-pointsREPOandUPSTREAM;OPENREPOTOOLS_ASSEMBLY_ROOTaccepts any directory with two empty marker files and loosens the caps to 340/510. The only trace is the report header, which-qhides. Show the roots a run used where-qcannot hide them. - Nits.
Roots.owner_ofgivesLICENSEand.gitignoreto code;abs_rootturns a quoted~/xinto$PWD/~/x; a staleGIT_ENVcomment.
From #192 (run C evidence and T006 patches; lane 3's review 5464893559)
- Two records now contradict each other on main.
adopter-rehearsal-2026-10-08.md:62-64and the 2026-10-07 file at:178-180both say "On this branch, the mapping is…" about the sameadoption-plan.yaml, so the run B sentence is false since this squash;:13-17still calls the 2026-10-07 file a branch file. One dated paragraph fixes it. - T006 undercounts the front-door failures.
root-guidance-2026-10-08.md:397-398says 17; the measured count is 18 (test_openrepotools_command.py::test_the_help_and_the_readme_say_the_mode_the_receipt_is_born_atis uncounted).:180's "23 mentions in 9 files" adds up to 26 in 11 by its own list. - Say that
adopt-project.py checkreads the clone's localmain, not HEAD, so it reportsplan-stale(exit 1) against any main newer than837928a; the plan's header andplanning_statusimply it but do not say it. - T006's evidence cites no receipt; its
setup-openspeckit, store-precedence, doctor andshape_advisoryrows exist only in the document. - "The rebuilt bench has no ensurepip" is contradicted (the venv packages were installed on 2026-09-23); the refusal is real, its cause is unestablished.
- The review's remaining recommended edits: findings 5, 6, 8, 9, 16 and 17 of review 5464893559.
From lane 3's review of the composed candidate (#186)
test_repo_hygiene.py::test_agents_md_names_the_pin_rulesfails in the composed candidate. T006'sassembly-0001rewrites the two AGENTS.md lines it checks (code/upstream/openRepoShape,git -C code submodule update …), so 2 of its 4 assertions miss. Decide which side gives before the composed run is the record.
From lane 2's refusal-case runs on an r2-equivalent build (#186, 6087267593)
- The exit-4 refusal misnames a root that was NAMED. When
OPENREPOTOOLS_SPEC_ROOTorOPENREPOTOOLS_ASSEMBLY_ROOTis set to a directory that is not a root, the composed refusal still says the variable "is unset", or that there is "no OPENREPOTOOLS_ASSEMBLY_ROOT". It should name the value it rejected and why. The refusal itself holds; only its words are wrong. Found by lane 2, which ran the five refusal cases on its own r2-equivalent build, one flock per case; lane 1's r2 logs do not show it.
From lane 3's review of #195 at fb77bed (5481360555), not blocking it
- A root refused for a bad marker names both markers. When one marker is a directory, or only one is missing, the composed refusal still says the root "carries no" both (
tests/conftest.py:433-434and:444-445atfb77bed). Lane 2 noticed the directory case first (Triad migration (feature 004-migrate-to-triad): execution tracking under Brett Heap's word of 2026-10-07 #186, 6103529172). It should name the marker that failed, and how. - The restated installer-source hygiene rule still accepts some fetch shapes: a payload variable set by
read -rorprintf -v; a one-linepin_scalar() { …; }reader; asource_repository)line that reads another pin (the docstring says only the code pin's line counts); andgit cloneor an unquotedgh api, which main's rule never read either. None of them occurs in the installer today: the rule finds 0 offences on main's 7 fetching lines and on Install from the code an adopted assembly pins, resolved to one commit, and keep a single repository's install on today's reads, words and network needs. #191's 16 at8246983. Copilot's two rounds on Follow up #190's test roots: name a refused root's value, check the pin's commit, find paired feature worktrees, show redirected roots under -q, run the lane manual sections, and restate the installer-source test #195 are spent, so these come here.
Lane 1 (openRepoTools-1) owns the migration order (#186); these are its to schedule.
Metadata
Metadata
Assignees
Labels
No labels
Activity
Triad migration evidence of 2026-10-08: run C of the adopter rehearsa…
Give the test suite explicit code, assembly, spec and dependency root…
Name the value a refused root was named by in the composed refusal, i…
Refuse a composed run whose leg pin names another commit than the git…
Find the assembly from a paired feature worktree, <assembly>/worktree…
Say the roots a redirected run used at its foot, where -q keeps them,…
Run the lane suite's manual sections with a missing, an absent and a …
Read a quoted ~ in a root variable as the home directory in tests/run…
Move the four-roots paragraph to the foot of AGENTS.md's testing sect…
Record the r2 candidate's three suite runs and classify every failure…
Lane 3's follow-ups on 096de93: name 837928a and #190 in the T006 tes…
Hold AGENTS.md's pin rules to the path that works from where the file…
brettheap commentedon Oct 11, 2026
Lane openRepoTools-1, 2026-10-11: #195 status, and the new follow-ups from lane 3's LAND review (5481360555).
#195 (
feat/test-roots-followups@e378871) answers:code/prefix, and T006'sassembly-0001is unchanged;These are still open, none of them blocking #195:
A rejected root is reported twice in the composed refusal: once as the problem and once as the absent root (review finding 2).
A marker refusal should name the marker that failed, and say whether it is missing or not a regular file. Today it names both markers (finding 3).
~user/…diverges.tests/run.shmakes it$PWD/~user/…, while conftest'sexpanduserexpands it (finding 7).The restated installer-source rule still accepts six shapes (finding 8):
read -randprintf -vassignments to a payload variable;pin_scalar() { …; };source_repository)arm of a pin other thancontracts/code-pin.yaml;git clone https://github.com/$OTHER.git;gh api repos/$OTHER/….None of these shapes is in main's installer or in Install from the code an adopted assembly pins, resolved to one commit, and keep a single repository's install on today's reads, words and network needs. #191's
8246983.Carried from lane 3's
01ccc86review (finding 14):test_openrepotools_command.py's receipt test asserts nothing from--helpbefore its README read can skip;docs/, whileSPEC_TREESholds four trees.brettheap commentedon Oct 11, 2026
Lane openRepoTools-1, 2026-10-11T16:4xZ: two more deferred items, from lane 3's review of the T010 patches (#186 6089801221). The T010 record on
004-migrate-to-triad-ci@22bdb2e(section 10) gives every finding of that review a disposition, and these two have no other home:Both are for T014/T015. Lane 1 schedules them.
brettheap commentedon Oct 11, 2026
Lane openRepoTools-1, 2026-10-11T16:4xZ: 18. #195's
code_mount()test always uses a pin withsubmodule_path: code(tests/test_test_roots.py:77), so a hard-codedcodewould also pass. Add a case whose pin mounts the leg at another path, such asimpl, so CI holds the derivation. From lane 1's delta review of #195 (5484079561, point 4). Not a landing condition.Gate B walk: lines 20, 29 and 31 are PARTLY by the walk's own legend,…
Close W22's findings 2-4 on 83bcec7 in the T011 record: date the sect…
Correct the installer record for lane 3's DO NOT LAND on #196's insta…
brettheap commentedon Oct 13, 2026
Lane openRepoTools-1, 2026-10-13T18:35Z: three more deferred items, from lane 3's review of the installer record (#196 review 5481368376) and lane 2's #186 6090038382. The installer record on
004-migrate-to-triad-installer@7428e78(specs/004-migrate-to-triad/installer-2026-10-08.md, section "Lane 2's open items on #191") gives each of these a disposition and proposes it here:73b04d6). The root then runs that older installer, which reads the assembly root as a single repository: a refusal in its words with the cause unnamed, or, with synthetic decoys at the root, their install.fetch_at … openRepoTools, refuse unless the fetched implementation carries the adopted resolver (a declared marker line, orpayload_resolve_remote()), naming the pin as older than T007.contracts/code-pin.yamlis taken as a pin:probe_pathtakes anyghsuccess or curl 200 as present (openRepoTools:656-658,:668ata74c7fc). The listing at the resolved commit then shows no pin, and the run refuses at:761-764with "the ref moved between the two reads". Main never asks for that file, so it installs. Like a 502 on the same file (lane 2's item 3), this is a refusal where main installs. Unlike that case, Install from the code an adopted assembly pins, resolved to one commit, and keep a single repository's install on today's reads, words and network needs. #191's body does not disclose it: it says "anything but a 404 (offline, 5xx, 401/403, a portal)" refuses "naming what answered", but a 200 that is not GitHub's, a portal's page among them, names nothing and blames a moved ref.test_r07_a_branch_that_moves_right_after_the_layout_question_is_read_at_one_commit[single]asserts.a74c7fc), so the words need their own small change toopenRepoTools.fdc5f18the walk accepts only<root>/<submodule_path>and<root>/worktrees/<NNN>/<submodule_path>, where the pin names this directory. A foreign pin that names exactly this directory as its leg still matches:outer/productrefuses; an installed copy in$HOME/binunder a$HOMEpin withsubmodule_path: binrefuses to reinstall, where main installs.originis the pin'ssource_repository, or its HEAD is the pinned commit.~/.local/bincarriescontracts/(lane 3, Install from the code an adopted assembly pins, resolved to one commit, and keep a single repository's install on today's reads, words and network needs. #191 review 5471121210, delta 4). It needs a decision on what identity an installed copy, which has no git checkout, can show.All three are for T014/T015 or a follow-up to #191. Lane 1 schedules them.
Edited 2026-10-13: item 20 corrected after lane 2's check (lane 2's register note of 2026-10-13T18:22:15Z). It is a refusal where main installs, not wording only. The record reference moved from
7668c51to7428e78.🤖 Generated with Claude Code
brettheap commentedon Oct 13, 2026
Lane openRepoTools-1, 2026-10-13T18:5xZ: one more deferred item, found during #196's refold.
/workspace/paths are on main, and the hygiene rule does not catch them.specs/004-migrate-to-triad/consumer-reads-2026-10-07.mdis lane 2's consumer-side reads, landed in Triad migration evidence of 2026-10-07: Gate A refresh, the Gate B rehearsal with the merged adopter fix, the regenerated adoption plan, consumer-side reads and the Gate B checklist #189 (63810dd). It has 86 lines that name/workspace/…paths. They are in its "Exact commands" listing and in table and prose rows, across six roots: workBenches, brett-wip,.lane-state, xFactory, the openRepoTools checkout andopenRepoTools-worktrees.ideation/brainstorm/supervised-context-restart-durable-intent.md:31has one illustrativedirectory: /workspace/projects/openRepoTools.tests/test_repo_hygiene.pydoes not match/workspace/, so these lines have been checked by hand only./workspace/, with an explicit allowance for quoted search patterns.consumer-reads-2026-10-07.md.brettheap commentedon Oct 17, 2026
Lane openRepoTools-1, 2026-10-17T21:0xZ: item numbering map, and item 23 (from lane 3's #196 review 5560058266).
Lane 3's finding 9 on #196: #193's item numbers repeat across its body and its comments, and #196's records cite the repeated ones in two senses. This comment maps every number to the comment that defines it and says what each of #196's citations means. Nothing is renumbered or edited.
Map. Item number → where it is defined:
Repeated numbers: 16 and 17 (body, 6103860685, 6111225631), 18 (6103860685, 6111250692), 19 and 20 (6103860685, 6152519565). Numbers 1–15, 21, 22 and 23 occur once. From now on cite an item as "#193 item ", and the body's as "#193 body item ". Numbers 1–23 are used, so new items start at 24.
What the repeated numbers are:
~user/…diverges betweentests/run.shand conftest; 6111250692, Follow up #190's test roots: name a refused root's value, check the pin's commit, find paired feature worktrees, show redirected roots under -q, run the lane manual sections, and restate the installer-source test #195'scode_mount()test always usessubmodule_path: code.01ccc86review (reorders without a planted proof, the receipt test's--helphalf, the AGENTS.md paragraph naming onlydocs/); 6152519565, a 200-garbage answer to the code-pin probe.What each of #196's citations means (line numbers at
b50c83c):test-roots-and-ci-2026-10-08.md:449–451, "Triad migration: follow-ups deferred at the landing of #190 and #192 #193 item 20" (three rows): 6103860685 item 20.installer-2026-10-08.md:221, "Triad migration: follow-ups deferred at the landing of #190 and #192 #193 (item 20)": 6152519565 item 20.installer-2026-10-08.md:239, "(item 7) … (item 4) … (item 1)": these are lane 2's item numbers from the table in Triad migration (feature 004-migrate-to-triad): execution tracking under Brett Heap's word of 2026-10-07 #186 6090038382, not Triad migration: follow-ups deferred at the landing of #190 and #192 #193's items 7, 4 and 1. In the same order they are 6152519565 items 19, 20 and 21.Lane 3's finding 11.
test-roots-and-ci-2026-10-08.md:447("7 (i) … not yet filed") and:450("that the proof checks only the outcome is not yet filed") were filed 40 seconds after22bdb2e: they are 6111225631 items 16 and 17.aaa7bc8, 2026-10-15) made CI Linux-only..github/workflows/tests.ymlon main now hasguard-launch-mode,testsandtests-no-submodule;tests-windows,parse-macosandtests-macosare gone, and its own header says no job parses the repository's bash under Apple's bash 3.2 any more.patches/t010-code-leg-tests-workflow.patchhas basee27bc64, main'stests.ymlup toa74c7fc. Against main'stests.yml(blob3c7caa4),git apply --checkfails at line 21. Re-measured today; againsta74c7fc's file it still applies.test-roots-and-ci-2026-10-08.md:354(the landing tooling readstests-macosby name),gate-b-status-2026-10-09.md:172(line 33, platform policies and bash 3.2) andinstaller-2026-10-08.md:236("parse-macoscovers the implementation only") describe jobs that no longer exist.tests.ymlat the cutover, and restate the bash 3.2 point: say whether the code leg or the assembly'scomposed.ymlneeds a 3.2 parse of the root entry point (whichinstaller-2026-10-08.md:236already saysparse-macosdid not cover), or that the check is gone by decision.Lane 3's note 15, no new item. openRepoShape v1.0.0 is tagged (2026-10-14T23:17Z; v1.0.1 at 2026-10-15T14:20Z). By the order the hold gives after the tag (#186 6152410188: the pin-bump PR, a fresh rehearsal and plan at v1.0.0, then the cutover), the next composed run is on a candidate rebuilt after the pin bump, not on the
7f84ca4candidate. The candidate record's "still owed: the full composed suite on this candidate" is read that way, and the next record says so.🤖 Generated with Claude Code
Follow up #190's test roots: name a refused root's value, check the p…
brettheap commentedon Oct 17, 2026
Lane openRepoTools-1, 2026-10-17T22:2xZ: item 24, from the independent review of #229 (5560316525). Numbering follows the map in 6241015109: new items start at 24.
/workspace/host-path rule (Hygiene rule refuses bench-root host paths, with an allowance for quoted grep patterns; replace them in the consumer reads and the durable-intent sample #229) has gaps and edge cases, deferred. Findings 1 and 2 of that review are being folded into Hygiene rule refuses bench-root host paths, with an allowance for quoted grep patterns; replace them in the consumer reads and the durable-intent sample #229 itself. These four remain:/workspacewith no trailing slash appears on 12 lines at Hygiene rule refuses bench-root host paths, with an allowance for quoted grep patterns; replace them in the consumer reads and the durable-intent sample #229's head: 3 incident comments in shipped bash, and 9 fake-cwd lines intests/test_lane_helpers.sh.workspace.yaml, but it is the lookbehind that excludes it.-x '…'pair after the pattern. Add the tests that kill them."$X"/workspace/…and$(…)/workspace/…are flagged. None exists today, and${X}avoids it. Document this, or exempt it narrowly.consumer-reads-2026-10-07.md:217, "~/projects→$PROJECTS", is now true by definition. Lane 2 may reword it in its review of Hygiene rule refuses bench-root host paths, with an allowance for quoted grep patterns; replace them in the consumer reads and the durable-intent sample #229.Why deferred: none blocks. The review's verdict is LAND, and the rule already catches every host path main carries (87 lines).
Hygiene rule: -f names a pattern file, and a path glued onto a scrubb…
Triad migration evidence of 2026-10-08 and 2026-10-09: test roots and…
brettheap commentedon Oct 17, 2026
Lane openRepoTools-1, 2026-10-17T22:5xZ: item 25. Numbering continues from 6241015109 and 6241963987.
LANES_REPOandLANES_WORKSPACE_ROOT.LANES_*variables andTMUX. The wip-init tests'wip_envdoes not clear them.test_wip_init_and_the_lane_helpers_read_one_pointer_file_the_same_wayfailed 5 ways, and itslanes-edit.shfetched the real per-lane register clone. Nothing was written.LANES_*variable, andTMUX, in the suite's env helpers or with an autouse conftest fixture. Add a test that sets each to a sentinel path and proves no read reaches it.consumer-reads-2026-10-07.md: give $READS and $ORTW the file's own wo…
brettheap commentedon Oct 17, 2026
Lane openRepoTools-1, 2026-10-17T23:23Z: item 26, from the independent review of #233 (5560570028). Numbering continues from 6241015109 and 6242560775.
The review's findings 1 and 2 are filed as #235 and #236. The items below are its notes 3, 5 and 6, which do not block. None is caused by #233.
Coverage the suite cannot see, three parts.
Four assertions that cannot see what they guard (
tests/test_park_resume_commands.py, line numbers at main2732d59). At openRepoShape190133deach passes for the right reason, but none would go red if upstream moved the thing it couples to. I re-measured each with the suite's own builders, with everyLANES_*andTMUX*variable unset.:1247-1248."(b) the layout"and"holder TestFam"each appear 2 times in the fresh-machineresumeoutput. Once ismake siblings' own tee'd output, and once isresume's step (5) reprint. A heading change upstream would send step (5) (resume:1420,grep -q '^(b) the layout$') to its fallback,(no layout table …)(resume:1435), and these asserts would stay green. Fix: assert.count(...) == 2, or assert"(no layout table" not in result.stdout.:1981.BOOTSTRAP-{name} ranappears 2 times per sibling: the holder's own bootstrap also runs each pinned member'smake bootstrap. So it does not prove that the sibling's own bootstrap ran. Fix: assertcount == 2.:1826-1840(test_the_real_bootstrap_would_have_moved_that_leg). It never checks the bootstrap's exit code. At190133dthat code is 0,bootstrap ok, and step (a) printedon main at … (branch tip == pin). Fix: assertproc.returncode == 0.:1843-1851(test_a_leg_detached_at_the_pin_is_not_a_refusal). It asserts neitherresume's exit code nor the absence of "make bootstrapdid not exit 0". Fix: assert both.family Makefile:
siblings,parkandresumerefuse by name whenscripts/siblings.pyis absent, and update-shape.py says the Makefile it copies calls it, so a holder updated without--addno longer fails oncan't open file(#489) openRepoShape#503's$(error)path is unobserved. A family holder withoutscripts/siblings.pynow stops on make's$(error), exit 2, namingupdate-shape.py checkandapply --add. Underpark --allit is still counted asrefused (exit 2), as the oldcan't open filewas, sopark's classification does not change. No test here builds such a holder:seed_holderalways copiessiblings.py. Low priority; a test would pin the classification.The
--installdocstring citation is right, but nothing checks it.tests/test_install_payload_source.py:917-922citesopenRepoShape:547 at 190133d. That line equals7f84ca4's line 280 bycmp. But:Fix: a standalone hygiene assertion that reads that line out of
upstream/openRepoShapeand compares it with the test's literal, so the next pin bump that moves it goes red. No other openRepoShape line citation exists intests/.Lane: openRepoTools-1
🤖 Generated with Claude Code
Hygiene rule refuses bench-root host paths, with an allowance for quo…