feat(ten-lane-highway): ship lane_teardown.sh, the recovery path the skill only named (giwq) - #319
Conversation
…skill only named (giwq)
model_performance-giwq. The skill's own refusal message sent an operator,
mid-incident, to `.amplifier/evaluation/tools/lane_teardown.sh` -- a path in a
DIFFERENT repo, to a file untracked even there:
$ git -C ~/dev/openai-evals-team-ci ls-files --error-unmatch \
.amplifier/evaluation/tools/lane_teardown.sh
error: pathspec ... did not match any file(s) known to git
That is the ONLY lane-scoped teardown path. The alternative, `sweep`, is the
manager's batch-close verb that destroys EVERY lane's infrastructure. On
2026-09-05 six DTU containers were left running with open ledger rows after a
tmux-server restart killed three lanes; recovering them required exactly this
tool.
ADOPTED. lane_teardown.sh now ships beside its siblings in scripts/, carrying
ye80b's near-miss fix (PR #313's patch artifact, applied with `patch -p4`
clean): a lane name that ALMOST matches an owner exits 4 naming each candidate
owner and its open-row count, instead of printing success for a teardown that
would do nothing. On 2026-09-05 `lane_teardown.sh <batch> drbf teardown --yes`
printed "lane 'drbf' owns no open rows - nothing to do" and exited 0 while SIX
rows were open under `drbf-compaction-notice-ab`.
Callers now name a path that EXISTS: infra_ledger.sh's sweep refusal resolves
the sibling from BASH_SOURCE, SKILL.md uses <skill_directory>/scripts/..., and
highway_status.sh's orphan-row reclaim hint -- the same instruction for the same
incident -- prints a resolved, copy-pasteable path instead of a bare name.
Also: usage() derives its help from the file instead of the hardcoded '2,72p'
range, which had already drifted past the end of the header.
TESTS. tests/test_ten_lane_highway_lane_teardown.py, 14 tests: ye80b's
13-assertion shell harness converted (it already parameterised the script path
for exactly this), plus the adoption-safety proofs. Every "ran nothing" claim is
observable -- a state file that still exists or a `touch` sentinel that does not
-- because the buggy path PRINTS a success message and an exit code alone cannot
tell "refused" from "ran and failed". The subprocess env is built explicitly
(etuz, 569c9b8: an inherited env is green in CI and red inside every lane).
Adoption did not widen what teardown can destroy, proven: `sweep` is still not a
verb here, --all-owners/--all/--everything are still refused (and the string
appears 0 times in the script), 0rg's multi-owner sweep refusal still exits 3
with both sentinels absent, protected-untouched=4 still holds with a live lane
and a dead lane holding rows simultaneously, and reconcile still refuses a live
row.
FAIL-BEFORE: shell harness against the unpatched upstream copy reproduces
ye80b's "RESULT: FAIL - 3 expectation(s) unmet"; the new pytest against that
same copy fails those same 3 and no others; against the full pre-adoption state
(script absent, docs at origin/main) it is 12 failed, 2 passed.
Full suite: 1894 passed, 1 skipped, 13 deselected, 1 xfailed.
ONE implementation: the shipped copy is authoritative. This lane owns only
amplifier-app-cli, so the evals-repo side is stated rather than done --
docs/lanes/giwq-adopt-lane-teardown/PROPOSED-evals-lane-teardown-shim.sh must
replace (and be git-added over) the untracked copy there. A shim rather than a
deletion because live GOAL.md files already handed to running lanes spell the
old path; it never falls back to a local implementation, because a fallback is a
second implementation and a stale one reintroduces this very footgun.
Generated with Amplifier
Co-Authored-By: Amplifier <240397093+microsoft-amplifier@users.noreply.github.com>
Manager verification — all 4 gates re-run by me in a scratch clone. Merging.Head I read the lane's own
Adoption did not widen what teardown can destroy — proven, not assertedThis was the deliverable that could have been faked by making everything pass. Four independent tests carry it: no One implementation, and the boundary stated rather than fudgedThe shipped copy is authoritative. This lane cannot touch the evals repo, so it wrote the shim as an artifact and stated precisely what must happen there. That is the honest shape: the drift this item exists to end is now ended on the side that ships. Two things it reported that it did not have to
It also edited |
The defect
The shipped ten-lane-highway skill's own documented emergency recovery path
pointed at a file the skill does not ship.
infra_ledger.sh's refusal message named that cross-repo path;SKILL.mdnamedthe tool with no path at all. It is the only lane-scoped teardown path — the
alternative,
sweep, is the manager's batch-close verb that destroys everylane's infrastructure. On 2026-09-05 six DTU containers were left running with
open ledger rows after a tmux-server restart killed three lanes; recovering them
required exactly this tool.
What this does
lane_teardown.shintoamplifier_app_cli/data/skills/ten-lane-highway/scripts/, beside its siblings.patch -p4, clean):a lane name that almost matches an owner exits 4 naming each candidate
owner and its open-row count, instead of printing success for a teardown
that would do nothing. On 2026-09-05
lane_teardown.sh <batch> drbf teardown --yesprinted "lane 'drbf' owns noopen rows — nothing to do" and exited 0 while six rows were open under
drbf-compaction-notice-ab.infra_ledger.shresolves thesibling from
BASH_SOURCE;SKILL.mduses<skill_directory>/scripts/…andgains an instruments-table row;
highway_status.sh's orphan-row reclaim hint(the same instruction for the same incident) prints a resolved,
copy-pasteable path instead of a bare name.
usage()—sed -n '2,72p'was pinned to a header that hassince grown, silently truncating the help. Now derived from the file.
highway_watchdog.shis not touched (PR #306 is open against it).Tests —
tests/test_ten_lane_highway_lane_teardown.py, 14 testsye80b's 13-assertion shell harness converted (it already parameterised the script
path for exactly this), plus the adoption-safety proofs.
Two standards followed deliberately:
a
touchsentinel that does not. Never an exit code: the buggy path prints asuccess message, so an exit code alone cannot tell "refused" from "ran and
failed" (
test_ten_lane_highway_infra_ledger.py's standard).model_performance-etuzwas thissame mistake in this same directory: green in CI, red inside every lane
(
569c9b8).Platform guard
sys.platform != "linux"with the reason stated (flockisutil-linux;
chmod --referenceis a GNU flag with no BSD equivalent) — theprecedent that cleared #310 and #313.
Adoption did not widen what teardown can destroy
test_lane_teardown_has_no_sweep_verbsweeprejected as unknown command; sentinel absenttest_lane_teardown_offers_no_all_owners_escape_hatch--all-owners/--all/--everythingeach refused; sentinel absent; string appears 0 times in the scripttest_the_multi_owner_sweep_refusal_still_refusestest_a_live_lanes_rows_are_never_touchedprotected-untouched=4and the four live containers still exist — live lane + dead lane holding rows simultaneouslytest_reconcile_still_refuses_to_reclaim_a_live_rowtest_the_sweep_refusal_names_a_lane_teardown_path_that_actually_existsstat-ed and resolved — a string assertion would have passed against the original defectFail-before / pass-after
Shell harness vs the unpatched upstream copy — ye80b's shape, reproduced:
New pytest vs that same unpatched copy — the same three, and no others:
New pytest vs the full pre-adoption state (script absent, docs at
origin/main):12 failed, 2 passed.After: shell harness
RESULT: PASS — near-miss guard present, protection intact;pytest
14 passed.Full suite
Baseline on untouched
origin/main:1880 passed, 1 skipped, 13 deselected, 1 xfailed.Exactly one implementation
The shipped copy is authoritative. This lane owns only
amplifier-app-cli, sothe evals-repo side is stated, not done:
.amplifier/evaluation/tools/lane_teardown.shmust be replaced by (andgit add-ed over — it is currently untracked) the thin shim atdocs/lanes/giwq-adopt-lane-teardown/PROPOSED-evals-lane-teardown-shim.sh.A shim rather than a deletion, because live
GOAL.mdfiles already handed torunning lanes spell the old path — deleting it turns each into
No such file or directoryat exactly the moment an operator is mid-incident. It never fallsback to a local implementation: a fallback is a second implementation, and a
stale one reintroduces precisely this near-miss footgun. Not found ⇒ exit 127
naming the fix.
Lane note and transcripts:
docs/lanes/giwq-adopt-lane-teardown/.