Repository navigation
fix(vibe): ship 1.0.78, one fleet home and the open 10-22 lessons - #340
Merged
Merged
Conversation
- The 1.0.77 changelog said about 930 words shorter; the merged change is about 830 shorter. The count was taken before the last commits. - instruction-words.mjs measures net Markdown words between two refs and, with --changelog, fails an entry whose stated number does not match; the lessons loop runs it at the final head. - vibe 1.0.78. Testing: instruction-words.test.mjs; the old 1.0.77 entry fails the check against the merged release; vibe contracts. Risks: None identified.
- One fleet home holds what every orchestrator chat reuses (config, standing rulings, lessons ledger, handover, current program) and each program's state under programs/<slug>/. fleet-home.mjs starts, closes, resumes, checks and migrates; work-dir.mjs resolves the home for every fleet and monitor script and derives the state dirs per program. - board.mjs status fails on state written outside the home, including a session fleet.sh did not start. A new chat once inherited only part of a program. - hooks/merge-guard.mjs refuses gh pr merge on another author's pull request until the operator approves it. - pre-pr-lanes.mjs requires e2e lanes the report names and reads lane lines with leading variables; --skip needs --skip-ruling. - fleet-orchestrator: review bots post under teammates' accounts; green watch splits a Sonnet watcher from an Opus fixer; full e2e on main before batches find the reds. Prose trimmed to stay under 1.0.77. Testing: fleet-home, board, fleet, merge-guard and pre-pr-lanes suites, each failing on the old code or with its check removed; all vibe node suites; vibe contracts; migration rehearsed on a copy of a live dir. Risks: gh pr merge on another author's PR now needs MERGE_AUTHOR_OK; a flat work dir that watches PRs fails board.mjs status until migrated.
- snapshot.sh discovery never adds a PR listed in prs-ignore.txt or in another program's prs.txt in the same fleet home. Discovery once put a PR another chat was shepherding in this fleet's watch set. - Green watch files another author's red only after that PR's ticket, PRD and design rulings show the change was not asked for. - Changelog word count at the head: about 5 words shorter than 1.0.77. Testing: snapshot.test.mjs, failing on the old snapshot.sh; all node suites; vibe contracts; instruction-words --changelog. Risks: None identified.
- The single review round holds only in a program's delivery phase. Once core work is done it is retired and every valid finding is fixed in its pull request, every round: shepherd.mjs --round-one-fixed-at, review-followup.mjs plan and a later result in review-threads.mjs need the single-review ruling in force. - snapshot.sh never reports a PR in prs-ignore.txt or another program's prs.txt, so another chat's PR is never STALE-PR here. - Green watch cites a requested change instead of filing it. - Prose trimmed; Markdown about 2 words shorter than 1.0.77. Testing: shepherd, review-followup, review-threads and snapshot suites, each failing on the previous scripts; all node suites; vibe contracts; instruction-words --changelog. Risks: deferring a later review round now needs the ruling named.
- tested-head.mjs: a run starts only at the intended HEAD with no modified tracked file. pre-pr-lanes.mjs run records a lane under the SHA it tested, record needs --head, and e2e-lock.mjs run needs --head; both fail when HEAD moves mid-run. A container once tested an old commit for an hour and passes were reported for an untested PR. - pr-preflight.mjs: the title with " (#n)" fits 72 characters and an identical or matching claim carries its measured count; the environment worker runs it before opening a PR. - The green-watch fixer is a vibe writer, attributing reds from gh; the guardrails reviewer blocks a changed literal left elsewhere in the repo and a widened, non-unique test locator. - Prose trimmed; Markdown about 7 words shorter than 1.0.77. Testing: pre-pr-lanes, e2e-lock and pr-preflight suites, each failing on the old scripts or with the check removed; all node suites; vibe contracts; instruction-words --changelog. Risks: e2e-lock run and pre-pr-lanes record now need --head and a clean tracked tree.
- The busy test's holder shared the run's worktree, so on Linux, where the temp dir is not a symlink, the run read as a duplicate (76), not busy (75). The test root is now resolved like the worktree, and the holder names its own worktree. Testing: e2e-lock.test.mjs, reproducing the CI failure locally first. Risks: None identified.
- Gate newly enabled controls and visual baseline elements on surface-specific requirement citations - Inventory rendered controls during guardrails review, handoff, verification, and green watch - Add regression coverage for the 8962 and 9188 failure shapes Testing: Node tests, pytest, Ruff, and Pyright Risks: Citation matching intentionally fails closed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Purpose
Ships vibe 1.0.78: the fleet runs from one fleet home, so a new orchestrator chat finds everything it should reuse in one place and a new program sees nothing of an earlier one's state, plus every open 2026-10-22 lesson that was not yet fixed. Each lesson gets the highest rung that can catch it, shown failing on the old code. The branch already held the 1.0.77 word-count fix and
instruction-words.mjs.Release metadata
plugins/vibe/tools/python/test_vibe_1078_lessons_contract.py.plugins/vibeis about 7 words shorter (2,451 added, 2,458 removed), measured at the head withinstruction-words.mjs --base 8f562ab --changelog CHANGELOG.md --version 1.0.78. Prose the new scripts enforce was trimmed; every phrase the contract tests pin is kept.Fleet home design
<fleetHome>(FLEET_HOME, default~/fleet-orchestrator): reusable files at the top (config.env,standing-rulings.md,lessons.md,handover.md,current), each program underprograms/<slug>/(resume log, program rulings, attention,prs.txt,sessions/,prompts/,findings/, board, monitor state, evidence).codex-fleet-monitor/scripts/work-dir.mjs, not a new argument on every script: each script that takes<orchDir>/<workDir>(fleet.sh, board, helpers, finding-brief, watch.sh, snapshot.sh, supervise, watcher, claude-usage) resolves a home to its active program and derivesLOCAL_STATE_DIR,REQUESTS_DIRand, withREMOTE_FLEET_HOME, the remote dirs per program. A flat dir still works, so the change is backward compatible; shells eval one generated snippet so there is one implementation.fleet-orchestrator/scripts/fleet-home.mjs:start(refuses while another program is current),close,resume(reading order,RELAUNCH <writer> <prompt>for Claude writers,WATCHER-LIVE <pid>for the lock handoff),check,migrate(in place, repoints symlinks beside and inside the dir, refuses while a watcher holds the lock).Prevention closeouts
A new orchestrator chat inherited only part of the program
Prevention
rg -n "config.env|<orchDir>|<workDir>" plugins/vibe/skills/{fleet-orchestrator,codex-fleet-monitor}/scriptsboard.mjs status(run with every monitor event) fails withFLAT,OUTSIDE,CONFIG,SHARED-REMOTE,UNMANAGED(asessions.txtsessionfleet.shdid not start; remote turns leave<name>.remote.json) andUNMANAGED-STATE; a contract test fails when any script taking a work dir does not resolve it throughwork-dir.mjs.board.mjs; the fleet.sh home test fails on the oldfleet.sh; the contract test fails on the oldwatch.sh.#9116 merged with Desktop E2E reds its pre-PR lanes skipped
Prevention
pre-pr-lanes.mjsskipped e2e lanes by default and could not read a lane line starting with the step's variables (DESKTOP_E2E_SPECS='...' pnpm ...), so the lane the report named was never required.vibe/scripts/pre-pr-lanes.mjs;--skipnow needs--skip-ruling(deadline mode).pre-pr-lanes.test.mjswith an env-prefixed desktop e2e line.pnpm test:lanesreport; that report is the repo's own (it already namesdesktop-e2e), so naming the web e2e lane there is a symphony-alpha follow-up, after which this check requires it with no plugin change.Another author's PR was enqueued under the operator's account
Prevention
hooks/merge-guard.mjs(shared command parsing moved tohooks/command-segments.mjs, also used by kill-guard).gh pr mergewhen the PR author is not the signed-in account, unlessMERGE_AUTHOR_OK=<author>).Watcher discovery picked up a PR another chat owned (#9058)
Prevention
codex-fleet-monitor/scripts/snapshot.sh: a PR inprs-ignore.txtor in another program'sprs.txtin the same fleet home is never added or reported, so neverSTALE-PR, even when listed by hand.snapshot.test.mjs. Proof: the new test fails on the oldsnapshot.shand on this PR's earlier add-only version.R-SINGLE-REVIEW retired once core work is done
Prevention
vibe/scripts/shepherd.mjs(--round-one-fixed-atneeds--single-review-ruling),vibe/scripts/review-followup.mjs(planneeds it),handoff/scripts/review-threads.mjs(alaterresult needssingleReviewRuling); fleet, vibe and handoff SKILL text.Review bots treated as human reviewers; green-watch model split; e2e before merge; intended change filed as a regression
Prevention
pre-pr-lanes.mjsnow requires.Green-watch fixes skipped the gates a vibe writer passes
Prevention
vibe/scripts/pr-preflight.mjs(title with(#n)at most 72; an identical/matches claim needs its measured count), run by the environment worker before a PR opens; newvibe/scripts/tested-head.mjs, used bypre-pr-lanes.mjs run|record --headande2e-lock.mjs run --head(refuse another HEAD or a modified tracked file, fail when HEAD moves mid-run); fleet green watch: the fixer is a vibe writer and attributes fromgh pr view --json author,headRefName; guardrails reviewer: a changed literal whose old value remains, and a widened non-unique locator.pr-preflight.test.mjscases; the newpre-pr-lanesande2e-lockhead tests fail on the previous scripts.e2e-slot.shwrapper should calle2e-lock.mjs run --headortested-head.mjs; it is not in this repo.A preservation phrase enabled and protected an unsourced control
Prevention
onSelectAllandshowSelectAllto Branches, PR #9116 moved the star column, and PR #9188 accepted the checkbox into the baseline; checked live ISS-12683, ISS-9324, ISS-9461, ISS-12918, and ISS-13007.diff-rules.mjsrequires a surface-specificControl:citation for newly enabled control props or mounts.visual-baseline-ledger.mjsandpr-preflight.mjsrequire a counted, sourcedBaseline element:ledger for every changed visual baseline.Migration for an existing flat work dir
Stop the watcher for that dir first (the command refuses while it holds
watch.lock), then:Then copy the rulings that bind every program into
standing-rulings.md(SPLIT-RULINGS), setFLEET_HOME, and runfleet-home.mjs check.Commands run
uv run pytest plugins/: 2475 passed, 3 skipped.uv run ruff check .anduv run pyright: clean.instruction-words.mjs --base 8f562ab --changelog CHANGELOG.md --version 1.0.78: net -7, passes.checkandresume).Risks
e2e-lock.mjs runandpre-pr-lanes.mjs recordnow need--headand a clean tracked tree.gh pr mergeon another author's PR needsMERGE_AUTHOR_OK=<author>in every Claude session with the plugin.board.mjs statuswithFLAT-LAYOUTuntil migrated.