Skip to content

ISS-12135: fix(vibe): encode the open vibe lessons ledger - #317

Merged
shafty023 merged 33 commits into
mainfrom
fix/vibe-review-gates
Oct 20, 2026
Merged

shafty023 merged 33 commits into
mainfrom
fix/vibe-review-gates

Conversation

@shafty023

@shafty023 shafty023 commented Oct 20, 2026 •

Copy link
Copy Markdown
Collaborator

Purpose

One release (vibe 1.0.66) for the open vibe lessons ledger, combining what was #313, #314, #317 and the unopened orchestration change, per the operator's rule that lessons go into one PR (each PR costs a full CI run). Every gate runs inside a step vibe already has, and the prose rules a gate enforces are deleted.

Lessons carried

Review gates (handoff-inventory diffRules): symphony-alpha #8958 withDb.tx partial commit, migration lock strategy and timestamp, raw writes bypassing activity capture (#8958, #8960), Desktop outbox lanes without synchronizing-susan and the shared give-up (#8960, #8965), ArtifactLink deletes beyond the replaced edge (#8960), flag-off output on shared paths (#8960, #8963, #8962 phone width, #8963 widths), dropped ticketed why-comments (#8948, #8962), Storybook placement and frozen v1.0 closure (#8947, #8962, #8963), story outcome flips as releases (#8959), lost story IDs, GridTableV2 parity and endpoint e2e specs as required runs (#8962, #8967), migration order after every main sync (#8965). One-line owner rules for #8956 to #8967 review findings (cache/precondition, id case, scope gates, composite ports, identity keys, focus from promises, void handlers, comparators, query shape, cursor bounds, throw-to-Result callers, skew tests, persisted snapshot shapes, in-row clipping, contrast, disclosure propagation, narrow selection and target size, sibling story removals, flag-on states per claimed surface).

PR body facts (inventory prFacts, blocking.prBody / blocking.prEvidence): overlap from open PR file and import intersections (#8947, #8956, #8962, #8963, #8965), flipped and deleted assertions and changed contracts with file:line (#8947, #8948, #8953, #8956, #8957, #8959), new refusals under Breaking changes (#8963), ticket "say in the PR" asks (#8956), cited rulings resolve to approved artifacts (#8962), stacked bases state no CI ran (#8967), server-only sessions skip UI ceremony (#8948), pending device and play runs block creation, PostHog re-read before "(flag-pending)" (#8987), Roadmap dependencies and open PRs resolved before designing a write path (#8958, #8963).

Claimed children and provenance (live-ticket-check.mjs --child-evidence): children reach In Review only with per-item evidence from the ticket worker's map, never the writer's audit (#8947, #8953, #8958, #8959, #8960, #8963, #8967, PRD-729); "active elsewhere" needs real activity (#8959); PRD flag and boundary clauses are criteria (#8957, #8959, #8962, #8965); no PRD target narrowing (#8953); operator clauses met per surface and live fallbacks (#8962); the session's own text is never a source, criteria never strengthened, precedent after ticket scope, human threads and sibling requirements (#8956, #8957, #8959, orchestrator ruling); every new user-reachable capability, refusal rule, visual element and numeric limit needs a human source (#8953 status write built to pass its own e2e, #8963, #8967).

Orchestration, resume and PR follow-up: readiness ceremony cut (the pre-capture main-sync-inputs turn and its extra bootstrapped checkout are removed; a failing producer reports command, exit code, error and log; restated main-sync prose replaced by pointers), Codex-to-Claude harnessSwitch migration, review threads resolved only through review-threads.mjs resolve with an independent verified verdict (#8987, ISS-9488), human threads re-read on every later look, process and state rules (no unscoped kill, no temp-dir records, no Codex computer use, visual checks after push), dependencies never idle a session (PRD-728, #8960).

Operator rulings 2026-10-20: tests after any change, fix or main merge are exactly the code_tests_for set plus the inventory's required tests; fleet-orchestrator gains criteria fixed at plan time with a two-way criteria-to-diff QA trace, a specialist role table with fallbacks, and one batched lessons PR per repo.

Cost

  • Instruction length (vibe agents/*.md and skills/**/*.md, evals excluded): 16,195 lines / 156,483 words on main, 16,214 / 156,919 here (+19 lines, +436 words). About 14 of those lines are the requested fleet-orchestrator role table and QA rules; the four lesson sets were each flat or negative before combining.
  • Whole PR: 75 files, +2844 / -437, most of it gate code (diff-rules.mjs, pr-facts.mjs, review-threads.mjs, the children gate) and their tests.
  • Session wall time: publication runs input readiness once instead of twice (one pristine bootstrapped checkout fewer); server-only sessions skip Storybook, Desktop and visual QA; test runs are targeted. The inventory adds about 2 to 6 seconds on large diffs.

Commands run (combined head)

  • uv run pytest plugins/vibe: 361 passed
  • node --test handoff, fleet-orchestrator and precedent-check suites: 113 passed
  • uv run ruff check . clean; uv run pyright clean; tools/vibe-workers typecheck clean and npm run build reproduces the committed dist bundles
  • Full tools/vibe-workers vitest was not run locally (CPU-bound laptop); CI confirms it.

Version

vibe 1.0.66 in both manifests, the only bump in this PR, on top of main's 1.0.65.

- Add pr-facts.mjs: overlap by shared and imported files, assertion and
  contract changes, new refusals, ticket asks, server-only lanes and run
  evidence, with a check that refuses an incomplete or miscited body
- Build and refresh pull request bodies from those facts and block creation
  while required runs are pending
- Run the same overlap at requirements time, including named dependencies
- Add node tests, contract tests and two shared eval cases
- Add child-evidence.mjs: a claimed child moves to In Review only when the
  adversarial reviewer's map evidences every criterion and work item on the
  final diff, a tracked file, a merged commit or a final-commit report
- Require real activity for "active elsewhere" and a human ruling outside
  the session's own ticket and plan for any supersession
- Quote PRD flag, rollout and boundary clauses as criteria, never narrow PRD
  targets, and never treat session-written text as provenance
- Add node tests, a contract test module and two shared eval cases
Add diff-rules.mjs, run by the writer before DONE and by handoff step 3, to
block out-of-order or unprecedented migrations, uncaptured artifact field
writes, errors returned inside a transaction after a write, Desktop sync lanes
without the shared give-up, backoff and a synchronizing-susan pass, unscoped
artifact link deletes, dropped ticketed comments, unrecorded shared service
changes, story assertion changes without a release, and new story entries
beside a current one. It also lists the parity tests and e2e specs the graph
does not map.

Document the script rules and the judgment rules in review-gates.md and wire
them into the backend worker, adversarial and guardrails reviewers, verify
worker and Storybook decomposer.

Testing: node tests for diff-rules, vibe contract tests, two shared eval
cases, ruff, pyright, plugin manifest tests.
Move a Codex writer stopped by its usage limit to Claude through a ledger
harness switch, resolve review threads only after independent verification,
read open pull request threads on every later look, stop only processes the
session started, keep state out of temp folders, and use no computer use in
Codex.
- Fold the child evidence gate into live-ticket-check.mjs behind
  --child-evidence, so it runs in the ticket worker's step 8 check with no
  new script or dispatch
- The ticket worker builds the map; drop the adversarial reviewer pass
- Remove guardrails check 16 and the duplicated child, supersession and
  external dependency prose the gate replaces; compress the provenance rules
- Drop the provenance eval and the separate contract module; pin the gate
  and provenance rules in the existing lesson contract test
- Compress the gate tests and remove the requirements sentence the gate
  now enforces
- Report the facts from handoff-inventory.mjs and gate the body and run
  evidence as pull-request phase options, through an imported module with
  no CLI of its own
- Delete the prose the gate replaces and the separate lanes step
- Re-evaluate PostHog before marking a flag key pending
- Keep one eval case and pin the wiring in the existing handoff contract test
Move the review gates into handoff-inventory.mjs, which the writer and
handoff already run, as `diffRules` with a `diffRulesClear` blocking entry,
so no worker runs another command. Replace prose the gates now enforce: the
frozen story closure procedure, the stale story ID searches, the sort-order
test rule and a duplicated backend paragraph. Add gates for a change in a
frozen story's import closure and for lost story IDs, drop the migration
order rule the repo's own gate now covers, and batch base reads and importer
searches so a typical diff costs a few seconds.

Fold the judgment rules into their owners as one line each, drop
review-gates.md, a contract module and an eval, and cover new ledger lessons
on flag-off captures, narrow selection and targets, disclosure propagation,
flag-on story states, sibling story removals and ancestor baselines.
# Conflicts:
#	CHANGELOG.md
#	plugins/vibe/.claude-plugin/plugin.json
#	plugins/vibe/.codex-plugin/plugin.json
@shafty023 shafty023 changed the title ISS-12135: fix(vibe): gate repeated review lessons with diff rules ISS-12135: fix(vibe): gate repeated review lessons in the inventory Oct 20, 2026
Capture now checks only tracked parity and unknown outputs, so source input
readiness runs once, after the committed merge, and a failing producer names
its cause. Review threads are resolved only by a script that verifies each fix
in the same run. Restated main-sync prose is reduced to pointers so the
instructions do not grow.
- Define the existing affected tests once in guardrails as the code_tests_for
  set for the touched files plus the inventory's required tests
- Drop the verify worker's full-suite mode and the broad affected and lane
  runs; backend handoffs use the same checks mode
…n-lessons

# Conflicts:
#	CHANGELOG.md
#	plugins/vibe/.claude-plugin/plugin.json
#	plugins/vibe/.codex-plugin/plugin.json
- A writer's own test that expects behavior no ticket, PRD or request names
  is a wrong test, not a reason to build it
- Guardrails rule provenance covers every new user-reachable capability
- Remove two quality-loop sentences that repeat guardrails test rules
…d-evidence

# Conflicts:
#	CHANGELOG.md
#	plugins/vibe/.claude-plugin/plugin.json
#	plugins/vibe/.codex-plugin/plugin.json
#	plugins/vibe/README.md
#	plugins/vibe/agents/vibe-guardrails-reviewer.md
#	plugins/vibe/skills/handoff/scripts/live-ticket-check.mjs
# Conflicts:
#	CHANGELOG.md
#	plugins/vibe/.claude-plugin/plugin.json
#	plugins/vibe/.codex-plugin/plugin.json
#	plugins/vibe/README.md
#	plugins/vibe/agents/vibe-environment-worker.md
# Conflicts:
#	CHANGELOG.md
#	plugins/vibe/.claude-plugin/plugin.json
#	plugins/vibe/.codex-plugin/plugin.json
#	plugins/vibe/README.md
#	plugins/vibe/agents/vibe-verify-worker.md
#	plugins/vibe/skills/handoff/SKILL.md
#	plugins/vibe/skills/vibe/references/closedloop-graph.md
#	plugins/vibe/tools/python/test_handoff_skill_contract.py
#	plugins/vibe/tools/python/test_vibe_design_pass_contract.py
…/vibe-review-gates

# Conflicts:
#	CHANGELOG.md
#	plugins/vibe/.claude-plugin/plugin.json
#	plugins/vibe/.codex-plugin/plugin.json
#	plugins/vibe/README.md
#	plugins/vibe/agents/vibe-verify-worker.md
#	plugins/vibe/skills/handoff/SKILL.md
#	plugins/vibe/skills/handoff/scripts/handoff-inventory.mjs
… into fix/vibe-review-gates

# Conflicts:
#	CHANGELOG.md
#	plugins/vibe/.claude-plugin/plugin.json
#	plugins/vibe/.codex-plugin/plugin.json
#	plugins/vibe/README.md
…into fix/vibe-review-gates

# Conflicts:
#	CHANGELOG.md
#	plugins/vibe/README.md
#	plugins/vibe/evals/codex/test_run.py
#	plugins/vibe/skills/handoff/SKILL.md
#	plugins/vibe/tools/python/test_handoff_skill_contract.py
@shafty023 shafty023 changed the title ISS-12135: fix(vibe): gate repeated review lessons in the inventory ISS-12135: fix(vibe): encode the open vibe lessons ledger Oct 20, 2026
…olvable Desktop bundles

- Flag-off parity renders the exact shipped story or route against main's
  render of the same one
- Play counts come only from real-browser runs; Desktop launches need the
  main bundle's workspace imports to resolve
- Fleet orchestrators never write rows reserved for human attestation
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.

1 participant