Repository navigation
fix(vibe): ship combined 1.0.74 lessons release - #334
Merged
Merged
Conversation
- A helpers.test.mjs run recorded pid 1 and stopped it; endProcesses counted EPERM as alive and sent kill(-1), which signals every process the user owns. It ended every app on the operator's machine twice. - helpers.mjs refuses to record a pid of 1 or lower. endProcesses never probes or signals one, nor its own or its parent's pid. It signals a whole group only for a pid recorded with --group whose pgid still equals the pid, and never signals a pid that EPERM says is not ours. It takes an injected kill, so its tests send no real signal. - Every other group signal (run-bounded, precedent-check, the vibe-workers ledger and Claude worker, two tests) checks the pid above 1 first; dist rebuilt. - test_vibe_signal_safety_contract.py fails when a plugin test signals 0, 1, a negative literal or its own pid, writes one into a pids ledger, or calls endProcesses without a fake kill, and when any source signals a group without checking the pid above 1. - The cli-worker fake Codex ends with process.abort() instead of signalling its own pid. Testing: node --test, pytest, ruff, pyright and the vibe-workers vitest and build on a second machine; each safety check shown failing with its fix removed. Risks: a helper started without --group now has only its own pid signalled, so children it spawned in another group need their own recorded pids.
- fleet-orchestrator: board.mjs keeps the fleet board, flags rows behind the pushed head, and tracks rulings and ready QA checkpoints until every writer and QA guide is told directly. qa-plan-check.mjs defaults to zero human checkpoints. helpers.mjs records and ends a helper's processes, lists orphans, and keeps a handed stack from QA reruns. - codex-fleet-monitor: watch.sh writes watcher.json and watcher.mjs reports a lapsed watcher; the supervisor template restarts with bootout then bootstrap and throttles 30 seconds. - vibe: push-cadence.mjs and pushDue on every commit, shepherd.mjs for the final stage, main-sync-push refuses out-of-order migrations, e2e-lock.mjs gives each run its own compose project, and precedent-check.mjs check refuses an answer no live look settled. - handoff: repo-declared path gates (.vibe/path-gates.json) become required runs on the published commit. - Skill prose points at each check; vibe 1.0.74 and its changelog. Testing: node --test, pytest, ruff, pyright and the vibe-workers vitest and build on a second machine. Risks: None identified; every new check is additive and a repo without .vibe/path-gates.json requires no gate.
- The fleet skill's generic test reads QA-001 as a ticket id; the check accepts any checkpoint id, so the fixtures use C1 to C8. Testing: qa-plan-check, board and generic tests on a second machine. Risks: None identified.
- A recorded pid can be handed to one of the user's own apps after the helper exits; probe() saw it as alive, and a launchd app leads its own group, so stopped would have killed it. - pid records each process's start time and command and refuses one it cannot read; endProcesses re-reads them before every signal and treats a mismatch, an unreadable value or an older record without identity as not ours. The ps reader is injected like groupOf. - run-bounded's group test waits, bounded, for the killed grandchild to be reaped before asserting it is gone. Testing: helpers and run-bounded tests on a second machine; making the identity check always pass fails all four identity tests. Risks: a process that execs into another command after it is recorded is no longer signalled by stopped; record the final process instead.
- turn-start on a RUNNING record whose thread is idle reconciles against the live thread before starting, instead of refusing. - handoff: criteria-audit.mjs (fresh-context MET audit on the final head, criteria x surface x input x flag matrix, flag-off parity) and rulings-check.mjs (every ruling on the ticket with what it amends); qa-merge-order.mjs --evidence needs each changed e2e spec passing at the head in its lane; diff rules for comparators without a tie test and new exports nothing uses. - precedent-check.mjs --behavior makes each disputed behavior a required checklist item. - fleet-orchestrator: finding-brief.mjs refuses findings without evidence and fleet.sh ships the screenshots with the prompt. - vibe 1.0.75 and its changelog. Testing: node --test and pytest over the plugins on a second machine. Risks: the unused-export rule blocks a handoff that adds an export nothing names until it is removed or recorded with Export:.
- The operator ruled that skipping pre-merge e2e was a deliberate trade for a deadline, not a standing plugin rule, so the check, its prose and its changelog line come out. Testing: qa-merge-order tests and the vibe contract tests on a second machine. Risks: None identified.
- story-play-verdict.mjs passes a play only when its completion was observed and no exception or error event fired; storyFinished's status reported success for a play that threw. The evidence gate needs playVerdicts, all PASS, on the storybook-plays run. - A changed UI component two or more hosts import requires every test and story covering it or a host, in both flag states when the change reads a flag, and blocks until the change log records the host the behavior is keyed on. - vibe 1.0.76 and its changelog. Testing: node --test (651 of 651) and pytest (2554) over the plugins on a second machine. Risks: a shared component change now needs every host's suites run before a pull request opens.
- status-audit.mjs reads a snapshot of each in-scope PRD's children: a merged pull request means DONE, an open one or an assigned writer means IN_PROGRESS or IN_REVIEW, and neither means UNOWNED. It fails until each mismatch is fixed or ruled out of scope with a reason. - The fleet skill runs it at every writer assignment and every merge. - vibe 1.0.77 and its changelog. Testing: node --test (654 of 654) and pytest (2555) over the plugins on a second machine. Risks: None identified; the audit reads a snapshot and changes nothing.
- storybook-rules.mjs reads .vibe/storybook-rules.json and blocks a story change with a missing or too-low Storybook release, a reused release version, new stories under a frozen root, an edit handler wired to a no-op, a hand-rolled table row or cell, a touched story with no controls decision, a lifecycle tag outside its roots, a computed options list, and a story-local copy of a deleted component. Every repo fact lives in the declaration. - The declaration's checks become required tests whenever a story changes, so the evidence gate needs a passing run of each. - An example declaration (symphony-alpha's), vibe 1.0.78 and its changelog. Testing: each rule flags the real diffs of symphony-alpha #8953, #8959, #8960, #8962, #8963 and #8980; removing any rule fails its unit test. Risks: a repo that adds the declaration blocks story changes that skip a release until it is cut or a ruling is recorded.
…iles
- story-computed-options counts an options value only in an argTypes
entry with a select, radio or check control. A prop named options
({ control: false }) and an options value under args no longer
match (symphony-alpha #9102).
- story-no-op-handler skips files under the frozen roots: a v1.0 file
restored to its earlier bytes keeps its handlers.
Testing: #9102's diff gives only its computed options finding and
#9104's gives none; each new condition fails a fixture when removed.
- Fold all lesson contracts and release notes into one release - Encode program rulings, attention, budget, VQA, and review IDs - Remove the deadline-only final-merge E2E exception Testing: focused vibe 1.0.74 and signal-safety contracts pass Risks: New orchestration guidance may surface more required fixes
- Preserve the single vibe 1.0.74 release entry - Include the judges removal and code 2.0.1 changes from main Testing: Full repository validation follows on the merged head Risks: Main removes the deprecated judges plugin as already shipped
- Keep confirmed findings on the same writer - Extend the rule to pre-existing findings on touched surfaces Testing: 17 focused handoff and combined-release contracts pass Risks: None identified
- State that confirmed findings on touched surfaces are fixed - Keep the change within the single vibe 1.0.74 entry Testing: 17 focused handoff and combined-release contracts pass Risks: None identified
- Check feasibility and sourced decisions before precedent - Use live Asana through the actor with the signed-in browser - Return unresolved browser work to the fleet orchestrator Testing: 29 product-question and combined-release contracts pass Risks: Product questions may wait when no signed-in browser is available
- Gate product questions, live precedent, VQA dispositions, rulings, and review IDs - Surface idle-worker questions and mirror program rulings to remote writers - Align docs and eval twins with the enforced contracts Testing: focused Node and Python contract suites; negative and mutation proofs Risks: workflow inputs now require explicit evidence and dispositions
- Avoid ticket-shaped values in fleet-orchestrator test fixtures - Preserve VQA disposition and remote rulings coverage Testing: generic guard and app-server recovery black-box tests Risks: None identified
- Keep the combined 1.0.74 entry aligned with its guard coverage Testing: generic guard and app-server recovery black-box tests Risks: None identified
Restore the settled-decision and narrow-layout instructions while keeping live Asana as the only precedent source. Testing: 54 focused Python contract tests Risks: None identified
Read catalog-backed generator versions from the target workspace and bind other owners to the installed package instead of plugin pins. Testing: 63 main-sync input-boundary tests; negative proof against old bundle; vibe-workers typecheck Risks: catalog changes now participate in producer input identity
This was referenced Oct 22, 2026
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
Ship Daniel's 2026-10-21/22 vibe lessons as one pull request and one vibe 1.0.74 release. This branch preserves the commits from #331, #332, #333, and #335, including the Storybook guard corrections at
87c61fc, and merges currentmainrather than rebasing.Folded pull requests
Release metadata
Prevention closeouts
Supervisor restart and throttle
Prevention
launchctl kickstart -kwhen restarting a supervised watcher, causing the caller to hang and the supervisor to remain absent for the full throttle interval.plugins/vibe/skills/codex-fleet-monitor/SKILL.md,scripts/watch.sh, andtemplates/codex-fleet-supervisor.plist.rg -n 'kickstart|ThrottleInterval|bootstrap|bootout' plugins/vibescripts/templates.test.mjs, with the restart recipe and 30-second throttle in the owned template.Live-product precedent
Prevention
agents/vibe-requirements-worker.md,skills/vibe/references/quality-loop.md,skills/vibe/scripts/precedent-check.mjs, README, and precedent eval twins.rg -n --glob '!**/history.jsonl' 'public help|help center|another app|--no-browser' plugins/vibeprecedent-check.mjs, which has no web-search tools or public fallback and rejects public-only reports.the answer is from public material; focused Node tests pass after restoration.Stopped helpers left app stacks
Prevention
helpers.mjs, its helper ledger, orphan reporting, and worker instructions.rg -n 'pids|endProcesses|ORPHAN|stopped' plugins/vibe/skills/fleet-orchestratorstoppedtransition cannot complete while a recorded owned process is alive.helpers.test.mjsrecreates live recorded children and requires termination before the stopped state.Containerized E2E collision
Prevention
skills/vibe/scripts/e2e-lock.mjs, environment/handoff instructions, and compose-project tests.rg -n 'COMPOSE_PROJECT_NAME|foreign-compose|e2e-lock|compose project' plugins/vibee2e-lock.test.mjsrecreates a foreign live project and concurrent lease and requires refusal/isolation.QA checkpoint delivery
Prevention
board.mjs,board.md, and the worker/QA guide delivery workflow.rg -n 'checkpoint|UNTOLD|told|guide' plugins/vibe/skills/fleet-orchestratorboard.test.mjsrecreates a ready checkpoint with an untold guide and the status command exits 1.Watcher lapse
Prevention
watch.sh,watcher.mjs, watcher state, and the orchestrator turn-end rule.rg -n 'watcher.json|watcher MISSING|lastTickAt|re-arm' plugins/vibe/skills/codex-fleet-monitor plugins/vibe/skills/fleet-orchestratorwatcher.mjs, which rejects missing, exited, dead, or stale watcher state.watcher.test.mjsrecreates each lapsed state and requiresMISSINGwith exit 1.UX ruling reached only one surface
Prevention
board.mjs, the shared reference delivery workflow, QA-plan requirements, and cross-writer prompt templates.rg -n 'kind ruling|reference|UNTOLD|QA plan|shared component' plugins/vibe/skills/fleet-orchestratorboard.test.mjsrecreates a three-recipient ruling and blocks until every writer and guide is told.Writers lacked fleet context
Prevention
board.mjs,references/templates.md, and writer launch/status steps.rg -n 'Fleet board|board.mjs|dependencies|app-server-orchestrator.*send|SendMessage' plugins/vibe/skills/fleet-orchestratorboard.test.mjsrecreates stale writer heads and untold dependencies and requires a failing status.Critical-path checkpoint stayed local
Prevention
skills/vibe/scripts/push-cadence.mjs, commit receipts, fleet rules, and worker prompts.rg -n 'pushDue|90 minutes|unpushed|checkpoint' plugins/vibepush-cadence.test.mjsrecreates an old unpushed diff and requirespushDue: true.Unsafe process-group signal
Prevention
helpers.mjs, bounded runners, worker ledgers/dist, and every signal-test twin.rg -n 'process\.kill\(-|kill -- -|endProcesses|process\.pid|ppid' plugins/vibe tools/vibe-workerstest_vibe_signal_safety_contract.pystatic scanning.Prototype catalog gate omission
Prevention
path-gates.mjs,diff-rules.mjs, verify-worker instructions, and path-gate tests.rg -n 'path-gates|check-catalog-imports|file-scanning gates' plugins/vibe.vibe/path-gates.jsonpath matching and required evidence on the published head.path-gates.test.mjsrecreates a matching changed path with no declared gate result and rejects it.Stale RUNNING app-server state
Prevention
skills/cl-sweep/scripts/native-app-server-orchestrator.mjsand its tests.rg -n 'reconcileSession|activeTurnId|RUNNING|threadStatus' plugins/vibe/skills/cl-sweepnative-app-server-orchestrator.test.mjsrecreates RUNNING plus idle/no active turn and requires turn-start to proceed.Independent criteria audit ran after merge
Prevention
criteria-audit.mjs, handoff ordering, and criteria audit tests.rg -n 'criteria-audit|MET|PARTIAL|MISSED|fresh-context' plugins/vibecriteria-audit.test.mjsrecreates missing, PARTIAL, MISSED and stale-head rows and rejects each.Criteria coverage matrix had empty cells
Prevention
criteria-audit.mjsmatrix validation and handoff evidence rules.rg -n 'matrixProblems|surface x input x flag|no test or QA evidence' plugins/vibecriteria-audit.test.mjsremoves one desktop-pointer cell and the check rejects it.Flag-off behavior drifted from base
Prevention
criteria-audit.mjs, PR facts, verify-worker evidence, and host parity test selection.rg -n 'flag-off|no behavior change:|flagStates|parity' plugins/vibe/skills/handoff plugins/vibe/agents/vibe-verify-worker.mdcriteria-audit.test.mjsrecreates an unsupportedlooks the sameflag-off claim and rejects it.Diff-level audit misses
Prevention
diff-rules.mjs,review-gap-rules.mjs, parity-test selection, and source-provenance checks.rg -n 'comparator-tie|unused-export|copy-provenance|gridParityTests|capability-removal' plugins/vibe/skills/handoff/scriptsdiff-rules.test.mjsrecreates missing tie fixtures, unused exports, uncited ARIA/copy and removed capabilities and rejects them.satisfieshost-object rule if a repository exposes a stable host registry; no new parser/toolchain was added here.Client/server capability parity
Prevention
rg -n 'surface-capability-parity|host-capability-parity|gridParityTests|surface x input x flag' plugins/vibehandoff-inventory.test.mjsrecreates a GridTableV2 change and requires all registered parity tests even when graph mapping omits them.Mid-work rulings missed ticket criteria
Prevention
rulings-check.mjs, ticket template, fleet ruling flow, and tests.rg -n 'rulings-check|Ruling <date>|amends:' plugins/viberulings-check.test.mjsrecreates a QA ruling absent from the ticket and rejects it.Remote writer received finding without evidence
Prevention
finding-brief.mjs,fleet.shevidence transport, and tests.rg -n 'finding-brief|screenshots|evidenceDir|prompt.evidence' plugins/vibe/skills/fleet-orchestratorfinding-brief.test.mjsrecreates missing route/viewport/evidence and refuses the prompt; the remote test proves the copied path exists.Precedent missed the disputed sub-question
Prevention
precedent-check.mjsbehavior checklist, saved checklist artifact, quality loop, and tests.rg -n 'behavior|checklist.json|does not settle B' plugins/vibe/skills/vibeprecedent-check.test.mjsrecreates a headline-only and screenshot-less result and rejects both.Storybook completion falsely reported success
Prevention
storyFinishedsuccess when a play function threw, causing false-green Storybook verdicts.story-play-verdict.mjs, PR facts, verify-worker instructions, and tests.rg -n 'storyFinished|playVerdictProblems|exception|completion' plugins/vibestory-play-verdict.test.mjsrecreates a throwing play followed bystoryFinished: successand requires FAIL.Shared-component fix regressed sibling hosts
Prevention
shared-consumers.mjs, diff rules, PR facts, verify-worker evidence, and tests.rg -n 'sharedComponentTests|every host|flagStates|shared-path' plugins/vibediff-rules.test.mjsrecreates a shared service/component change without every consumer suite and rejects it.Ticket statuses drifted from delivery evidence
Prevention
status-audit.mjs, writer-assignment/merge steps, and tests.rg -n 'status-audit|UNOWNED|IN_REVIEW|merged PR' plugins/vibe/skills/fleet-orchestratorstatus-audit.test.mjsrecreates merged-not-DONE, assigned-backlog, and unfinished-unowned rows and rejects them.Lessons were split into stacked PRs
Prevention
rg -n 'one open PR per repo|one PR per lesson|lessons PR' plugins/vibe/skills/fleet-orchestratorLong foreground work hid rulings
Prevention
rg -n 'more than a few minutes|inbox between steps|second unanswered' plugins/vibe/skills/fleet-orchestratortest_vibe_1074_lessons_contract.pyover every emitted worker preamble.test_long_commands_do_not_hide_orchestrator_messagesfail; restoring it passes.Storybook rule violations reached main
Prevention
storybook-rules.mjs,.vibe/storybook-rules.jsonexample contract, diff rules, verify worker, and fix(vibe): run a repo's Storybook rules as handoff diff rules #335 corrections.rg -n 'storybook-rules|frozenRoots|noOpHandler|handRolledCells|literalOptions|storySupportPaths' plugins/vibestorybook-rules.test.mjsrecreates all eight violation classes and rejects each; fix(vibe): run a repo's Storybook rules as handoff diff rules #335 narrows list controls without weakening frozen-file rules.Product questions skipped code feasibility
Prevention
session-questions.mjs,precedent-check.mjs, vibe quality loop/SKILL, requirements worker, README, and eval twins.rg -n 'code-evidence|Current code and data model|product question' plugins/vibesession-questions.mjs ask --product --code-evidence <file:line>and the same evidence requirement at precedent launch.session-questions.test.mjspins the rejection.Idle writers' requests were not read
Prevention
liveness.mjs,classify.sh, monitor instructions, and operator-away reporting.rg -n 'NEEDS-REPLY|assistantTail|IDLE|attention.md' plugins/vibe/skills/codex-fleet-monitor plugins/vibe/skills/fleet-orchestratorNEEDS-REPLYwith ordinaryLASTmade the focused liveness test fail; restoring it passes.In-scope VQA findings were deferred to an owner
Prevention
finding-brief.mjscloseout mode, and tests.rg -n 'touchedSurface|require-disposition|owner.s decision|already on main' plugins/vibefixed: <sha>orticket: <id>for touched findings.touchedSurfacealso fails.Program rulings were mixed into resume status
Prevention
references/state.md, worker/QA templates,fleet.sh, and therulings.mdlayout.rg -n 'rulings.md|Program rulings|resume-log' plugins/vibe/skills/fleet-orchestratorrulings.mdartifact automatically mirrored with every remote prompt.finding-brief.test.mjssends a remote prompt and requires the mirroredrulings.mdto exist beside it.rulings-check.mjspath.Program rulings were not reconciled before audit
Prevention
rulings-check.mjs --program.rg -n 'rulings-check.mjs --program|operator message|AskUserQuestion|Before an audit' plugins/vibeOperator-away attention was not maintained
Prevention
references/state.md, fleet reporting rules, and monitor idle-message output.rg -n 'attention.md|operator steps away|NEEDS-REPLY|lead with' plugins/vibe/skills/fleet-orchestrator plugins/vibe/skills/codex-fleet-monitorattention.md.NEEDS-REPLYis removed; the attention format is advisory and cannot prove recommendation quality.High Claude usage was handled only after limit
Prevention
MOVE_AT_PERCENTand the 1.0.74 contract.rg -n 'high Claude usage|polling Claude|MOVE_AT_PERCENT|push a checkpoint' plugins/vibe/skills/fleet-orchestratorFinding IDs collided across audits
Prevention
references/templates.md,references/state.md,review-page-check.mjs, and tests.rg -n 'D###|X###|N###|S###|R###|review-page-check' plugins/vibe/skills/fleet-orchestratorProduct-question research order was incomplete
Prevention
skills/vibe/references/quality-loop.md,agents/vibe-requirements-worker.md,skills/vibe/SKILL.md, fleet principle 1, precedent CLI, README, and eval twins.rg -n 'Current code and data model|product owner.s recorded direction|approved prototype|Live Asana|code-evidence' plugins/vibeRecovery owners pinned generator package versions
Prevention
NEEDS_CHANGE.main-sync-input-catalog.ts, the Next fixture, and rebuiltdist/main-sync.mjs.rg -n 'package: \\{[^}]*version|16\\.3\\.6|7\\.10\\.0|14\\.3\\.1' tools/vibe-workers/src/main-sync-input-catalog.ts plugins/vibe/skills/vibe/scripts/dist/main-sync.mjspnpm-workspace.yaml, and other owners bind the target checkout's installed package.Installed producer contract changed: next-api; after rebuilding from the shared resolver it passes and records 16.4.1.Validation
NEEDS-REPLYclassification and removing the long-command background/inbox instruction each made its owning guard test fail; both were restored and pass.Installed producer contract changed: next-api; the rebuilt bundle passes both catalog and installed-package 16.4.1 fixtures, and the complete input-boundary file passes 63/63.vibe-workersmonolith completed 737/751 under laptop load with 14 timeouts confined to three files; those complete files pass alone through the heavy slot (63/63, 24/24 and 7/7), typecheck passes and the rebuilt dist is clean.6c8f1b719191177898579ad25d3e6a9b5ad635a4.