Repository navigation
devBenches/base-image: re-vendor openRepoTools at b1015f4 with all fifteen installables - #134
Conversation
…fteen installables, so a bench start stops reinstalling the 2026-09-15 copy The openrepotools source pin moves from a7d1257 (openRepoTools#135) to b1015f4672f9c107d939803c39846f8dbd3d78f3, openRepoTools main's head at the time, which contains daed2095 (#134, "Launch current Claude Code and report stale running sessions") and #97 (crash-consistent lane worktree recovery). The installable set changed, not just the bytes. The vendored shim's own INSTALLABLES is now fifteen names: the thirteen it had, plus `claude-current` and `claude-restart-check`, listed last (#119's two Claude Code launch commands). SKILLS (three) and COMMANDS (three) are unchanged, so `--install` places twenty-nine artifacts: fifteen bin files, six skill files, six command files, two hook entries. `update-upstream.py apply --source openrepotools --at b1015f46... --yes --add claude-current --add claude-restart-check` took the set: seven re-taken (openRepoTools, lanes, lanes-edit.sh, lane-start, lane-end, lane, lane-handoff), two added, twelve unchanged byte for byte. `update-upstream.py check`: 23 vendored copies match. Every one of the fifteen bin files, the three SKILL.md and the three command files is also `cmp`-identical to `git show b1015f4:<path>` in an independent clone of openRepoTools. Every place that lists or counts the set moves with it: - scripts/setup-estate-commands.sh: TOOLS_FILES carries the fifteen, which is what check_shim_list compares with the shim's own INSTALLABLES (a shim that grew past it refuses with "Nothing was installed"); the counts in its header and inline comments are re-derived (fifteen bin files, twenty-one pinned openrepotools paths, twenty-nine artifacts). - devBenches/base-image/Dockerfile: COPY lines and the chmod block for claude-current and claude-restart-check beside the thirteen; the comments are re-counted. - devcontainer.test/test-setup-estate-commands.sh: TOOLS_FILES carries the fifteen; the `15 of 15 placed` lines; the D4 read-only scenario also asserts the two new files were not placed. The shim now writes an install receipt (openRepoTools#103, ~/.local/share/openRepoTools/installed.tsv) and rewrites it on every run, so scenario (r)'s "a second start writes nothing" manifest leaves it out and the receipt is checked separately (same rows, only the UTC stamp may move). New scenario (aa) reads the shim's own INSTALLABLES and asserts the Layer 1a Dockerfile has one COPY line and one chmod word per name: nothing compared the two lists before, which is how the image kept baking thirteen after the shim grew. - README.md and devBenches/base-image/files/estate/estate-commands-start: the name lists and counts. The image rebuild afterwards is Brett Heap's act, not this commit's. Lane: openxfactory-5 (openXfactory-5) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…otools-b1015f4 No conflicts; main's side touches none of the re-vendored paths. Lane: openxfactory-5 (openXfactory-5) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
Copilot review overview
🟡 Changes recommended
The vendored resolver has two known functional defects that require upstream fixes and re-vendoring.
Review effort: Balanced
Findings: 2
Open (3)
What changed in this PR
Re-vendors openRepoTools at b1015f4, expanding the image and host installer to all fifteen commands.
Changes:
- Adds
claude-currentandclaude-restart-check. - Synchronizes installer, Dockerfile, pin, documentation, and artifact counts.
- Adds receipt and Dockerfile inventory regression coverage.
| File | Description |
|---|---|
README.md |
Documents fifteen installed commands. |
scripts/setup-estate-commands.sh |
Validates and installs all fifteen tools. |
devcontainer.test/test-setup-estate-commands.sh |
Tests receipts and Dockerfile inventory. |
devBenches/base-image/upstream-pin.yaml |
Pins openRepoTools at b1015f4. |
devBenches/base-image/Dockerfile |
Installs both new commands. |
devBenches/base-image/files/estate/estate-commands-start |
Updates image command count. |
devBenches/base-image/files/openrepotools/openRepoTools |
Updates installer and receipt handling. |
devBenches/base-image/files/openrepotools/claude-current |
Adds Claude executable resolution and updates. |
devBenches/base-image/files/openrepotools/claude-restart-check |
Adds stale-session detection. |
devBenches/base-image/files/openrepotools/lanes |
Adds closed-lane visibility and actions. |
devBenches/base-image/files/openrepotools/lanes-edit.sh |
Adds upstream lane lifecycle operations. |
devBenches/base-image/files/openrepotools/lane-start |
Adds handoff, resolver, and recovery behavior. |
devBenches/base-image/files/openrepotools/lane-end |
Adds dormant-lane and ownership handling. |
devBenches/base-image/files/openrepotools/lane |
Adds handoff and safer live attachment. |
devBenches/base-image/files/openrepotools/lane-handoff |
Adds crash-consistent lifecycle recording. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
There was a problem hiding this comment.
Copilot review overview
🟡 Changes recommended
The vendored revision contains unresolved resolver, restart detection, and lifecycle inventory correctness defects.
Review effort: Balanced
Findings: 1
Open (5)
Verify repository identity before marking checkout healthy · New Report successful inventory writes separately from polled trees · New Custom native directory detection suppresses version replacement notices Native resolver drops to no result instead of trying older versions Stale artifact and receipt counts after adding resolver commands
|
Lane: openxfactory-5 (openXfactory-5) LANDING — lane openXfactory-5, session bbe4d255-02db-4578-840b-09924442e544@Eagle, 2026-10-05T20:04:20Z, PR #134 into opensoft/workBenches main |
|
Sorry @brettheap, your pull request is larger than the review limit of 150,000 diff characters |



Lane: openxfactory-5 (openXfactory-5)
Brett Heap's word, given in session on 2026-09-30, verbatim: "file and fix both". This is the second of the two; it is ruled on the lane register against workBenches#132, and lane openXfactory-5 holds the claim.
What this does
Re-vendors openRepoTools at
b1015f4672f9c107d939803c39846f8dbd3d78f3, openRepoToolsmain's head when this was written. It containsdaed2095(opensoft/openRepoTools#134, merged 2026-10-04) and opensoft/openRepoTools#97.Installables: fifteen. Counted from the vendored shim's own
INSTALLABLESat that sha, not from the issue text:openRepoTools park resume status lane lanes lane-handoff lane-rename lanes-edit.sh lane-start lane-end link-estates repos.tsv claude-current claude-restart-check. The thirteen already vendored, plusclaude-currentandclaude-restart-checkat the end.SKILLS(3) andCOMMANDS(3) are unchanged, so--installnow places twenty-nine artifacts: 15 bin files, 6 skill files, 6 command files, 2 hook entries.Why it matters:
~/.local/binlives on the container overlay, and at every startworkbench-entrypointrunsestate-commands-start, which reruns--installfrom the copy baked into the image under/usr/local/share/openrepotools. Until the image carries this pin, a bench start or recreate puts the 2026-09-15 bytes back over a newer install.The image rebuild after this lands is Brett's act, not part of this PR. Nothing here was built, pushed or deployed.
Procedure, as the repo has it
python3 devBenches/base-image/update-upstream.py apply --source openrepotools --at b1015f4672f9c107d939803c39846f8dbd3d78f3 --yes --add claude-current --add claude-restart-check7 re-taken (
openRepoTools,lanes,lanes-edit.sh,lane-start,lane-end,lane,lane-handoff), 2 added, 12 unchanged byte for byte.update-upstream.py check: 23 vendored copies match (21 openrepotools + 2 openreposhape). Independently, all 15 bin files, the 3SKILL.mdand the 3 command files arecmp-identical togit show b1015f4:<path>in a separate clone of openRepoTools.Files changed (15)
devBenches/base-image/files/openrepotools/(claude-currentandclaude-restart-checkadded;openRepoTools,lanes,lanes-edit.sh,lane-start,lane-end,lane,lane-handoffre-taken).devBenches/base-image/upstream-pin.yaml(commit and sha256 rows, written byapply).scripts/setup-estate-commands.sh:TOOLS_FILEScarries the fifteen, which is whatcheck_shim_listcompares with the shim's ownINSTALLABLES(a shim that disagrees refuses with "Nothing was installed"); header and inline counts re-derived.devBenches/base-image/Dockerfile:COPYlines and thechmod 0755block for the two new files; comments re-counted.devcontainer.test/test-setup-estate-commands.sh: see below.README.mdanddevBenches/base-image/files/estate/estate-commands-start: name lists and counts only (comments).Two test changes that are not a pure count bump
--installwrites a receipt of the files it placed, and a retirement reads that before it reads a header substring openRepoTools#103,~/.local/share/openRepoTools/installed.tsv) and rewrites it on every run, "already installed" files included. Scenario (r), "a second start writes nothing", therefore failed at the new pin. Its manifest now leaves the receipt out, and the receipt is checked separately: the same name, destination and digest rows after a second start, only the UTC stamp may move.INSTALLABLESand asserts the Layer 1a Dockerfile has one exactCOPYline and onechmodword per name. Nothing compared the Dockerfile's per-file list with the shim before, which is how the image kept baking thirteen. Mutation-tested on a throwaway copy: dropping theclaude-currentCOPY, droppingclaude-restart-checkfrom the chmod block, droppinglanewhile keepinglane-*(prefix collision), and removing it from the script'sTOOLS_FILESeach fail the suite.Gates
Run twice in a scrubbed environment (
env -i, cleanHOME), tree clean: at0a43d6b(the re-vendor commit) and again ata7f970d(the same commit with main's23719de, the archive PR-B of #124, merged in; no conflicts, none of its paths overlap). Both runs identical and green. Only.github/workflows/speckit-git-bash.ymlhas a path filter this diff matches (all 15 changed paths hit it); the other five workflows match none.update-upstream.py check: 23 copies match, rc 0.test-setup-estate-commands.sh: GREEN, 469 PASS, 0 FAIL.test-setup-workspace-repo.sh,test-base-image-dockerfile.sh,test-claude-profile-name-guard-hook.sh(59 assertions),test-claude-profile-binary-selection.sh(122, with the workflow's env block),test-claude-profile-skill-install.sh(142),test-claude-profile-amendment-11.sh(467), bootstrap, feature, compat and ct-launcher suites: all rc 0.git-2-34-1(ubuntu:22.04@sha256:2edbbc5d...) andbash-3-2(bash:3.2@sha256:241dd7ed...): both GREEN.bash -nandshellcheck -S errorclean on both changed scripts; everyCOPYsource in the Dockerfile exists.devBenches/scripts/test-helper-safety.sh(its workflow's path filter does not match this diff, and it writes the real shared MCP registry, so it never runs on this host);docker buildof the image (the rebuild is Brett's act).Review
CI at
a7f970d: CodeQL, Analyze (actions, javascript-typescript, python), andregression,git-2-34-1,bash-3-2of OpenSpeckit Bash: all success. Copilot reviewed0a43d6banda7f970d("Changes recommended"); its 5 inline findings are all about the pinned upstream bytes, not this PR's own lines, so none is fixed here (an edit to a vendored copy is drift andupdate-upstream.py checkrefuses it). Each is already tracked upstream and was answered on its thread and resolved:claude-current:445, claude-current: fall back from a broken newest native executable openRepoTools#154: the native resolver drops the newest candidate when its version probe fails instead of trying older ones.claude-restart-check:206, claude-restart-check: recognize processes from custom native directories openRepoTools#155: detection honors only the default native directory.openRepoTools:355, Refresh installer artifact and receipt count contracts after Claude resolver installation openRepoTools#148: the upstream comment's artifact and receipt counts are stale (27/25; they are 29/27 with the two new commands).lanes-edit.sh:11820,tree_id_foris not injective and the recordedcheckoutis never compared with git's, so two trees can share one sidecar and a replaced repository reads as ok openRepoTools#116: the sidecar's recorded checkout is never compared with git's.lane-handoff:1265, The handoff's READY line counts polled trees as recorded, and a stale registration is suppressed whenever a sidecar names the same path openRepoTools#117: the READY line counts polled trees as recorded.The first two are functional defects in the two commands this re-vendor newly installs; a later re-vendor takes their fixes.
Sibling search
Open workBenches PRs at the time: #114, #115, #116, #118 (#133, archive PR-B of #124, landed during this work and is merged in; it touches none of these paths). None touches the pin,
files/openrepotools/,setup-estate-commands.sh, the Dockerfile's estate block ortest-setup-estate-commands.sh. Two soft overlaps, neither a conflict: #114 editsREADME.mdin a different paragraph (thepclaudeone); #118 editsdevcontainer.test/test-base-image-dockerfile.sh, whose stale "twenty-six" / "twelve" comments I therefore left alone.Closes #132
🤖 Generated with Claude Code