Skip to content

devBenches/base-image: re-vendor openRepoTools at b1015f4 with all fifteen installables - #134

Merged
brettheap merged 2 commits into
mainfrom
chore/revendor-openrepotools-b1015f4
Oct 5, 2026
Merged

brettheap merged 2 commits into
mainfrom
chore/revendor-openrepotools-b1015f4

Conversation

@brettheap

@brettheap brettheap commented Oct 5, 2026 •

Copy link
Copy Markdown
Contributor

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, openRepoTools main's head when this was written. It contains daed2095 (opensoft/openRepoTools#134, merged 2026-10-04) and opensoft/openRepoTools#97.

Installables: fifteen. Counted from the vendored shim's own INSTALLABLES at 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, plus claude-current and claude-restart-check at the end. SKILLS (3) and COMMANDS (3) are unchanged, so --install now places twenty-nine artifacts: 15 bin files, 6 skill files, 6 command files, 2 hook entries.

Why it matters: ~/.local/bin lives on the container overlay, and at every start workbench-entrypoint runs estate-commands-start, which reruns --install from 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-check

7 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 3 SKILL.md and the 3 command files are cmp-identical to git show b1015f4:<path> in a separate clone of openRepoTools.

Files changed (15)

  • Vendored copies: devBenches/base-image/files/openrepotools/ (claude-current and claude-restart-check added; openRepoTools, lanes, lanes-edit.sh, lane-start, lane-end, lane, lane-handoff re-taken).
  • Pin rows: devBenches/base-image/upstream-pin.yaml (commit and sha256 rows, written by apply).
  • 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 disagrees refuses with "Nothing was installed"); header and inline counts re-derived.
  • devBenches/base-image/Dockerfile: COPY lines and the chmod 0755 block for the two new files; comments re-counted.
  • devcontainer.test/test-setup-estate-commands.sh: see below.
  • README.md and devBenches/base-image/files/estate/estate-commands-start: name lists and counts only (comments).

Two test changes that are not a pure count bump

  1. The shim now writes an install receipt (--install writes 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.
  2. New scenario (aa) reads the vendored shim's own INSTALLABLES and asserts the Layer 1a Dockerfile has one exact COPY line and one chmod word 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 the claude-current COPY, dropping claude-restart-check from the chmod block, dropping lane while keeping lane-* (prefix collision), and removing it from the script's TOOLS_FILES each fail the suite.

Gates

Run twice in a scrubbed environment (env -i, clean HOME), tree clean: at 0a43d6b (the re-vendor commit) and again at a7f970d (the same commit with main's 23719de, 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.yml has 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.
  • Docker jobs on the workflow's pinned images, at both heads: git-2-34-1 (ubuntu:22.04@sha256:2edbbc5d...) and bash-3-2 (bash:3.2@sha256:241dd7ed...): both GREEN.
  • bash -n and shellcheck -S error clean on both changed scripts; every COPY source in the Dockerfile exists.
  • NOT run: 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 build of the image (the rebuild is Brett's act).

Review

CI at a7f970d: CodeQL, Analyze (actions, javascript-typescript, python), and regression, git-2-34-1, bash-3-2 of OpenSpeckit Bash: all success. Copilot reviewed 0a43d6b and a7f970d ("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 and update-upstream.py check refuses it). Each is already tracked upstream and was answered on its thread and resolved:

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 or test-setup-estate-commands.sh. Two soft overlaps, neither a conflict: #114 edits README.md in a different paragraph (the pclaude one); #118 edits devcontainer.test/test-base-image-dockerfile.sh, whose stale "twenty-six" / "twelve" comments I therefore left alone.

Closes #132

🤖 Generated with Claude Code

…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>
Copilot AI balanced review requested due to automatic review settings October 5, 2026 18:24
…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>

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

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 Medium severity · 1 Low severity

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-current and claude-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.

Comment thread devBenches/base-image/files/openrepotools/claude-current
Comment thread devBenches/base-image/files/openrepotools/claude-restart-check
Comment thread devBenches/base-image/files/openrepotools/openRepoTools
Copilot AI balanced review requested due to automatic review settings October 5, 2026 18:28

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Copilot review overview

🟡 Changes recommended

The vendored revision contains unresolved resolver, restart detection, and lifecycle inventory correctness defects.

Review effort: Balanced
Findings: 1 High severity · 3 Medium severity · 1 Low severity

Open (5)

Comment thread devBenches/base-image/files/openrepotools/lanes-edit.sh
Comment thread devBenches/base-image/files/openrepotools/lane-handoff
@brettheap

Copy link
Copy Markdown
Contributor Author

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

@brettheap
brettheap marked this pull request as ready for review October 5, 2026 20:04
@brettheap
brettheap merged commit 70e4aa8 into main Oct 5, 2026
12 checks passed
@sourcery-ai

sourcery-ai Bot commented Oct 5, 2026

Copy link
Copy Markdown

Sorry @brettheap, your pull request is larger than the review limit of 150,000 diff characters

@brettheap

Copy link
Copy Markdown
Contributor Author

Lane: openxfactory-5 (openXfactory-5)

LANDED — lane openXfactory-5, session bbe4d255-02db-4578-840b-09924442e544@Eagle, 2026-10-05T20:04:47Z, PR #134 into opensoft/workBenches main → merge 70e4aa8; devBenches/base-image: re-vendor openRepoTools at b1015f4 with all fifteen installables

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.

Re-vendor openRepoTools at opensoft/openRepoTools#134's merge with all 15 tools, so a container start stops reinstalling the 2026-09-15 copy

2 participants