Repository navigation
fix(vibe): ship 1.0.81 fleet lessons - #343
Merged
Merged
Conversation
- Gate every lane pnpm test:lanes names and CI job shape repros - Refuse detached watchers, zsh set -- splitting, unpinned e2e-slot - Refuse hold messages until TaskStop; resolve evidenced bot threads - Close stopped or rejected writer turns; report CAP-HIT with a patch - Push env-less sessions; name pnpm vibe up for human QA Testing: node, vitest, pytest, ruff and pyright suites Risks: new evidence fields block older vibe-pr-evidence files
- Restore the verify worker's no-pattern stop line for Codex runs - Keep the resolve-after-check wording handoff tests pin - Give the evidence comment fixture its lane run - Drop a duplicated review step from the fleet skill Testing: pytest plugins/vibe, evidence comment node test Risks: None identified
- Drop the argument separator from the lane fixture command Testing: node --test pr-facts.test.mjs Risks: None identified
- Record e2e image build commits and refuse stale --no-build reuse - Run real-browser story tests for layout changes with plays - Make the SendMessage hold hook a TaskStop reminder, not a refusal Testing: node hooks, image-head, e2e-lock, handoff suites; pytest Risks: a --no-build run without a recorded build now builds first
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.81. It covers the 2026-10-23 and 2026-10-24 lessons in the orchestrator's lessons ledger that 1.0.79 (#341) and 1.0.80 (#342) did not already cover. Each rule sits at the highest rung it could reach: a hook or an evidence gate where one fits, launcher behavior for the writer queue, and prose only where nothing mechanical applies.
Already covered by #341 and #342, so not repeated here: credential improvisation, green-watch messaging, force pushing scratch refs, direct vibe worker launches, hyphenated ClosedLoop MCP names and parallel prep while the writer runs.
Lessons
pnpm test:lanesnamed; #9238 broke mainhandoff/scripts/pr-facts.mjsrequires a passingtestRunsentry withlanefor every lane match, by its printed command (a mention-only lane needsnotRunReason);vibe-verify-worker.mdpre-pr mode; fleetSKILL.mdand both worker templates no longer say "exactly the testscode_tests_formaps"vibe-change-worker.mdvibe-verify-worker.md: a story file with a play on a component whose layout, position or scrolling the diff changes also runs in the real-browser story test; handoffSKILL.mdkeeps it a PR opening gatehandoff/scripts/ci-job-shape.mjs(tier, fetch depth, env,ifper job);pr-facts.mjsciCheckProblemsrequiresciCheckReproswhen the diff touches a check, CI script or workflow;vibe-verify-worker.mdhandoff/scripts/review-threads.mjsresolves asource: botthread answeredreasonwithevidence; a human's reasoned answer stays open.vibe-environment-worker.mdmarks bot threads (Botauthor, self-described automated review, orgit config vibe.reviewBots); handoffSKILL.mdstep 3 (bots contradict themselves across PRs); fleetSKILL.md&inside a compound command, twicehooks/shell-safety-guard.mjsrefuseswatch.shunless it is its ownrun_in_backgroundcall;watch.sh's second-copy refusal now names the kill-guardownstep and the sleep tickhooks/pause-guard.mjsonSendMessageadds a TaskStop reminder to context and never refuses (patterns and tests below); fleetSKILL.mdset -- $stdoes not word-split in zshshell-safety-guard.mjsrefusesset -- $varand points toread -r a b <<< "$var"shell-safety-guard.mjsrefusese2e-slot.shwithout--head <sha>; the remotee2e-slot.shtakes--head(see "Live change on the second laptop");vibe-verify-worker.mdTier Cskills/vibe/scripts/image-head.mjsrecords, per compose project, the commit and worktree that built the images;e2e-lock.mjs runrefuses a--no-buildrun whose images do not match--headand that worktree, and records a passing build; the staged remotee2e-slot.sh.nextmakes the same check;vibe-verify-worker.mdTier C says to build fresh after a worktree switchtools/vibe-workers/src/ledger.ts: a new request supersedes a FAILED turn, and a Claude turn whose launcher process is gone is closed on the next claim.claude-worker.tscaps an over-long result instead of rejecting itclaude-worker.tsreportsCAP-HITwith the changed-file count, mid-merge flag and a patch saved in the git dir; nothing is committed or resetvibe-environment-worker.mdredeploy step 7: a session with nolastRequestIdstops after the normal pushhandoff/scripts/parallel-prep.mjslocal QA lane namespnpm vibe upand a readiness check past the org pickerSKILL.mdClaude workersNot included: the fleet watcher's STALLED-WRITER flag for a dirty or mid-merge worktree with no file change. The cap lesson suggested it as a second layer; only the launcher's CAP-HIT report ships here.
pause-guard trigger patterns
It never refuses: a match adds a TaskStop reminder to the sender's context and the message is sent. A message that already mentions TaskStop, or one that is not a string, gets nothing.
^\s*(?:HOLD|PAUSE)\b(case-sensitive)\b(?:pause|hold|freeze)\s+(?:all\s+)?(?:of\s+)?(?:your\s+)?(?:work|writers?|sessions?|everything|agents?|subagents?|turns?)\b(any case)\bstop\s+(?:all\s+)?(?:of\s+)?(?:your\s+)?(?:writers?|sessions?|everything|agents?|subagents?|all\s+work)\b(any case)\bstand\s+down\b(any case)hooks/pause-guard.test.mjspins the matches above, and checks that each of these gets nothing: "Push nothing more to the branch.", "Stop the investigation and report what you found.", "Hold off on pushing until CI is green", "Holding steady on #9230, ready for review", "Stop at the first failure and report it", "Fix the stop button label", "hold the PR open for review", and "HOLD: stopped with TaskStop; wait for the revert". It also checks that the hook output carriesadditionalContextand nopermissionDecision. That follows the code plugin's PreToolUse hook, which adds context the same way.Live change on the second laptop
~/vibe-remote/e2e-slot.shis not in this repo. On 2026-10-24 at 12:02 local I replaced it with a version that takes an optional--head <sha>and refuses to run unless HEAD is that commit, both when the run joins the queue and after it waits. Without--headit behaves as before. It was swapped in with an atomicmv(a run already in flight keeps the old file open), and the previous copy is~/vibe-remote/e2e-slot.sh.bak-20261024. To roll back:cd ~/vibe-remote && cp -p e2e-slot.sh.bak-20261024 e2e-slot.sh.new && mv e2e-slot.sh.new e2e-slot.sh.The image check and a warning when
--headis missing are staged, not deployed, as~/vibe-remote/e2e-slot.sh.next, because a slot run was in flight. It calls this PR'simage-head.mjsfrom the remote's~/Source/claude-pluginscheckout, so deploy it once #343 is merged and that checkout is on main. With no slot run holding/tmp/cl-e2e.lock, runcd ~/vibe-remote && cp -p e2e-slot.sh e2e-slot.sh.bak-$(date +%Y%m%d%H%M) && mv e2e-slot.sh.next e2e-slot.sh. Roll back the same way from that backup.Release metadata
test_vibe_1081_lessons_contract.py.plugins/vibeis 2 words shorter than 1.0.80, measured at the final head withinstruction-words.mjs --changelog CHANGELOG.md --version 1.0.81. Prose that the new hooks and gates now enforce was removed to pay for the new rules.Commands run
I ran the suites on the second laptop, because the first laptop was at load 185 and vitest timed out there. Each failure below was rerun on its own.
node --testover everyplugins/**/*.test.mjs) at the final head: 787 of 788 passed. The one failure wascl-sweep/scripts/core-client-process.test.mjs, asendInputtimeout at remote load 128 in code this PR does not touch. Alone it passes 4 of 4. Earlier, the evidence comment fixture failed because it had no lane run for the new gate to accept; the fixture was fixed.uv run pytest plugins/at the final head: 2,490 passed and 3 skipped. Earlier runs caught three prose contracts pinning lines I had trimmed: the verify worker's no-pattern stop line, handoff's resolve-after-check wording, and handoff's WebKit iPhone and Chromium Pixel names. All three were restored.uv run ruff check .anduv run pyright: clean.tools/vibe-workers: typecheck clean;npm run buildleaves the committed bundles unchanged. Full vitest: 762 of 763 passed. The one failure was a 30-secondmain-sync-report-admissioncase under remote load 131, in code this PR does not touch; it passes on rerun. An earlier full run had six similar load timeouts, and both affected files pass alone on this branch and on main. The last commit changes no vibe-workers source.tools/plugin-manifests: passed.instruction-words.mjs --base origin/main --changelog CHANGELOG.md --version 1.0.81: added 695, removed 697, net 2 shorter; the changelog claim matches.e2e-slot.sh, tried in a scratch repo: a--headnaming an older commit is refused, the current commit runs, no--headbehaves as before, and--head HEADis rejected. Stagede2e-slot.sh.next, tried in scratch repos against this branch'simage-head.mjs:--no-buildwith no recorded build is refused, a build records, reuse at the same head and worktree runs, and reuse from another worktree is refused.Risks
vibe-pr-evidence.jsonfiles written before this release lack lane runs and, for check or CI changes,ciCheckRepros, so the PR evidence gate refuses them until they are rerun. That is intended.--no-buildrun through vibe's e2e lock with no recorded build for its compose project is refused until a build runs. The first run after this release builds.