Skip to content

ISS-12135: fix(vibe): gate claimed PRD children on independent evidence - #314

Closed
shafty023 wants to merge 7 commits into
mainfrom
fix/vibe-claimed-child-evidence
Closed

shafty023 wants to merge 7 commits into
mainfrom
fix/vibe-claimed-child-evidence

Conversation

@shafty023

@shafty023 shafty023 commented Oct 20, 2026 •

Copy link
Copy Markdown
Collaborator

Purpose

Works the open "claimed children, acceptance evidence and rule provenance" lessons from the vibe lessons ledger into the plugin. The claimed-children lesson repeated across six PRs (symphony-alpha #8947, #8953, #8958, #8959, #8960, #8963) and PRD-729, where unbuilt children reached IN_REVIEW on the writer's own audit. The 1.0.58 rule ("require delivery evidence") is prose and does not say what counts as evidence or who produces it. This change turns it into a gate the ticket worker cannot skip, inside a step vibe already has:

  • live-ticket-check.mjs, which the ticket worker already runs in handoff step 8, gains --child-evidence <map>. A child moves to IN_REVIEW only when every acceptance criterion and work item is met with evidence the script verifies: an added line in the diff, a tracked file the branch changed, a merged PR whose merge commit is in history, or a report produced on the final commit. It refuses a writer-authored map, pending or running evidence, a gitignored ledger, a named evidence path nothing covers, "active elsewhere" without an open PR, a branch commit in the last 7 days or another owner's IN_PROGRESS, and a supersession that cites the session's own ticket, plan or table.
  • The ticket worker (not the writer) builds the map in its existing handoff dispatch and moves exactly children.inReview. No new script, reviewer pass or dispatch.
  • Prose the gate replaces is deleted: guardrails check 16 (PRD child reconciliation), the duplicated child-claiming text in the vibe skill, the ticket worker's repeated supersession and external-dependency sentences, and the plan-mode child paragraph. Requirements, quality-loop and guardrails provenance rules were added in compressed form.

Cost

  • Instruction length (all vibe agents/*.md and skills/**/*.md, excluding evals): 15,647 lines / 149,444 words on the base, 15,649 / 149,411 here: 2 more lines, 33 fewer words. Guardrails check 16, the duplicated child, supersession, active-elsewhere and external-dependency prose, and two quality-loop sentences repeating guardrails test rules are deleted.
  • Whole PR: +496 / -74 lines. About 230 of the additions are the gate code inside the existing live-ticket-check.mjs and about 95 its node tests; there is no new script, reviewer pass, dispatch or step.
  • Session wall time: unchanged for sessions without a source PRD. For PRD-sourced sessions the gate adds one git diff -U0 and ls-files (under a second) inside the existing ticket check, and the ticket worker builds the map while it already rereads each claimed child.

Ledger lines

Ledger lesson Encoding
#8947 delivered claims for 18 BACKLOG children without per-ticket evidence live-ticket-check.mjs --child-evidence (merged-pr needs a merge commit in history); ticket worker handoff mode
#8947 ISS-9393 claimed while design review and ledger pending per-item map built by the ticket worker; gate refuses unmet or pending items
#8953 11 children moved to IN_REVIEW with unbuilt items same gate; only inReview slugs move
#8958 ISS-9502 claimed with no spec in the diff diff evidence must be an added line of a changed file
#8959 ISS-9587 claimed without its named evidence paths namedEvidencePaths must each carry evidence
#8960 ISS-9369/9600 claimed with no prototype or verifier same gate
#8963 five children claimed with hosted URL, design review, device runs pending report evidence must be produced on the final commit
PRD-729 seven unbuilt children IN_REVIEW on self-written evidence gate rejects maps authored by vibe-change-worker; the ticket worker builds it
#8967 AC met with a gitignored local ledger tracked evidence must be tracked and changed by the branch
#8959 TODO/BLOCKED children called "active elsewhere" gate and requirements worker require an open PR, a 7-day branch commit or another owner's IN_PROGRESS
#8953 session narrowed PRD production targets in its own ticket requirements worker: never narrow targets; list unadopted with the source's words
#8962 "status icon plus title" built as a seam no adapter fills quality-loop criteria rule; adversarial attack 8
#8962 card fallback left live while adoption was claimed adversarial attack 8: live alternative render branches are findings
#8957, #8959, #8962, #8965 PRD closed-by-default flag clause ignored requirements worker quotes flag, rollout, rollback, parity, boundary and non-goal clauses as criteria
#8957 session-authored PLN ACs used as the source quality-loop "Text the session wrote is never a source"; guardrails check 15
#8956 plan AC strengthened ticket wording; shared helper rewritten quality-loop criteria rule; guardrails check 15 (strengthened criteria, shared-module edits list callers)
#8959 role=alert removed against DONE ISS-9490 citing own precedent quality-loop Precedent: a stated sibling requirement wins; guardrails check 15
#8963 display cap turned into server refusals guardrails check 15 refusal rules need the PRD clause
#8953 invented loading pulse and error ring; #8963 drop target, connector lines and Parent column without a source guardrails check 15: a new visual element or state presentation is held to the copy rule
#8967 invented analytics thresholds guardrails check 15 numeric limits
#8953 writer wired an ungated status write (drag between Status groups PATCHes status) to pass its own e2e; no source asked for it quality-loop "Tests: repair, don't author": a writer's own test expecting unsourced behavior is a wrong test, never a reason to build it; guardrails check 15 covers every new user-reachable capability (write path, action, control)

Affected files

  • New: plugins/vibe/skills/handoff/scripts/live-ticket-check-children.test.mjs, eval pm-claimed-child-moves-only-on-gate
  • Edited: skills/handoff/scripts/live-ticket-check.mjs, agents/vibe-adversarial-reviewer.md, vibe-guardrails-reviewer.md, vibe-requirements-worker.md, vibe-ticket-worker.md, skills/handoff/SKILL.md, skills/vibe/SKILL.md, skills/vibe/references/quality-loop.md, tools/python/test_vibe_1057_lessons_contract.py (pins moved from deleted prose to the gate, two new tests), evals/codex/test_run.py (case count 71), README.md, both manifests, CHANGELOG.md

Commands run

  • uv run ruff check .: clean
  • uv run pyright: 0 errors
  • uv run pytest plugins/vibe/tools/python plugins/vibe/evals/codex/test_run.py: 329 passed
  • node --test live-ticket-check and its children gate tests: 15 passed
  • tools/plugin-manifests: npm test 6 passed

Version

vibe 1.0.67 in both manifests, on top of main 1.0.65 after #312, #316 and #318 merged; #313 takes 1.0.66, #317 1.0.68 and the orchestration PR 1.0.69. The version may still need re-resolving at merge.

- 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
- 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
- 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
@shafty023

Copy link
Copy Markdown
Collaborator Author

Folded into #317.

@shafty023 shafty023 closed this Oct 20, 2026
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