Requirement discharges
Derive requirements from acceptance criteria and settle obligations through explicit waiver, supersession or retraction.
AC-Derived Requirements and Suite Graduation
ac_derived records an AC-derived case. Nullable suite_id links future stable
suite membership: define AC, derive case, graduate a stable case to a suite.
The metadata itself is no passing result. Manual AC review credits methodless
verification requirements at their pinned item QA gate. A blocking post_deploy row
without an executable method has no such item-review credit path and
refuses as requirement_proof_required, naming its item and criterion. Attach
the executable plan case that proves it, or author a registered method case.
Simulation and explicit review kinds retain their domain-owned verdict paths.
qa.requirement.transfer moves an unexecuted direct requirement between open
items in the same project. Hold both claims and name the destination's stage:
yoke qa requirement transfer --requirement-id {requirement_id} --to-item PREFIX-N --workflow-transition {stage} --rationale "Destination owns this check"
The same row moves; both items retain an ownership receipt. A blocking case must retain its method or a destination with manual review credit. Executed, settled, plan-owned and admitted cases keep their original subject. A transfer records no pass.
Discharges: waiver, supersession, and retraction
Discharge is recorded and satisfies gates, while staying distinguishable from pass. An admitted case that still owes proof can be corrected, including one not yet run; a passed case refuses. Author the corrected case and execute:
yoke watch qa-plan -- --item PREFIX-N --stage {STAGE} --plan {CORRECTED_PLAN} --project {PROJECT} --replaces {CASE_KEY}={FAILED_REQUIREMENT_ID}
Materialization/declaration commit together; old failure remains history, only the selected corrected keys are admitted from the plan; other cases, including passed siblings, keep their frozen definitions. Every replaced key must exist in the selected plan. The corrected blocking case and pending siblings still need proof. Interrupted re-entry reuses declaration. Existing direct correction can be declared with qa.requirement.supersede --declare-replacement, then scoped plan execution without --plan. Predecessor leaves roster; successor still must pass.
Waiver: qa.requirement.waive stores waived_at/rationale/source; blocking
needs --force. Operator decides. Recording --source operator for item/member
needs its item claim, a covering steering seat (including document membership),
or the live driver of the run holding it. Steering can record the rationale while
worker keeps item custody; re-drive that run. Another run's driver or an unrelated
item grants nothing. Agent waivers keep normal QA subject-claim authority.
A retracted, superseded or replaced requirement no longer counts, so waiving it
refuses with requirement_not_live and names the live copy of the same case to
waive instead (or says none is left). A row whose successor link fails the
correction-graph check (replacement_graph_invalid) still counts, so it still
waives: that waiver is the graph error's named repair. Read
yoke qa requirement waive --help.
Supersession: corrected blocking case needs same run/stage/member/target (item: same item/transition/phase/target) and its own qualifying pass. A standing item source may instead name its own run-scoped passing copy: match its plan/case or direct admission identity, member item, method, phase, baseline and target environment; a frozen source digest must also match. Unrelated run passes refuse. The successor still needs a current qualified pass. History is untouched. Declared replacement via plan run/materialize --replaces records replacement_requirement_id after same-scope/acyclic validation. Predecessor immediately leaves grading/roster; only terminal successor answers, even pending or failing. Review bundle includes newly captured cases only. Independent pass (agent review or human approval) at the lineage head supersedes every unsettled predecessor through any number of replacement links in that verdict transaction; fail/ undetermined supersedes nothing. Content refresh declares correction automatically; qa.requirement.supersede can declare one explicitly.
Retraction: qa.item-plan.retract withdraws a mis-specified unexecuted item attachment at any phase; retain attachment/requirements as retracted history, not waiver or supersession. Item becomes unanswered. Done/member/freshness readers exclude withdrawn obligations; summaries keep RETIRED/retracted_at history. Admission and frozen selection skip withdrawn attachments; replacement plan owes proof. For older frozen copies, repeat with item/project/plan-id/transition release/ reason: retires remaining copies, preserves original withdrawal, refuses any copy with a recorded run or verdict. Re-drive scoped QA/run. Preserve recorded evidence and use waiver or supersession to settle executed cases.
Waiver/supersession answer every gate, including Dash verification/close-out. Supersession still needs current same-candidate pass within accepted revisions (including current reworked lane head); unfinished successor names owed evidence. Deployment acceptance and done honor admitted discharge and validated same-scope member supersession after stage acceptance. Full same-target, same-member discharge also answers a completed failed execution without creating aggregate acceptance or changing its FAIL, captures or artifacts. Existing settlement retries close the member only when shared-stage, run-wide and other member gates allow it. Partial discharge and unsettled failures keep done blocked.
Run-local supersession never retires its item source: an outstanding source would be admitted again. Receipts name admitted_from_requirement_id and next_admission_notice only while that source is outstanding; absent/discharged sources get neither. Retiring a directly admitted post_deploy item source is explicit:
yoke qa requirement add --item PREFIX-N --target-env {ENVIRONMENT} --method-id {METHOD_ID} --qa-phase post_deploy --blocking-mode blocking --workflow-transition {TRANSITION} --instructions-file {INSTRUCTIONS_FILE} --expected-outcome-file {EXPECTED_OUTCOME_FILE} --method-config '{METHOD_CONFIG_JSON}'
yoke qa requirement supersede --requirement-id {SOURCE_ID} --superseded-by-requirement-id {CORRECTED_ID} --rationale "corrected source definition"
Declare the corrected body through yoke qa requirement add --help for the
same item/transition/phase/resolved environment; snapshot digest may differ.
Neither source executes. While a run the item still belongs to holds an
admitted source copy, require one replaced or superseded through a chain whose
terminal case has a current config/target-qualified pass. Receipt names
run_replacement_requirement_id. That case still answers its run; corrected
source reads retired source's admitted copies at done. When no live membership
holds a copy (item removed with yoke deployment-runs remove-item, run failed
or cancelled, or never admitted), retirement records the link and the receipt's
proof_owed_notice says the corrected source owes its own next-release proof. Later
admissions skip superseded source and admit corrected one; source is never
rewritten. Control plane may record an authorized target it cannot execute
(prod recording stage); execution alone checks runtime observation authority.
A live execution keeps the roster it froze. When its owning session runs the
plan again after a supersession, replacement or new requirement changed that
roster, an execution that has run no case is aborted with
qa-roster-changed-before-start and a fresh one starts on the current
requirements. One that already ran cases refuses qa_roster_changed with the
exact yoke qa plan abort --execution-id ID --item PREFIX-N --reason TEXT
(or --deployment-run-id RUN); abort it, then run the plan again. Before each
case the runner's check-in refuses qa_case_superseded for a case that no
longer owes an attempt, with the same abort command, so a superseded case never
runs.
A correction reaches a live roster without an abort when the walk has not
reached the case: yoke qa plan rematerialize or a reachable admitted-copy
amendment rebuilds the entry after the cursor and moves the roster digest,
keeping every recorded result. The runner stops at its next check-in with
qa_roster_corrected; run the same yoke qa plan run command again to
resume. A changed case at or before the cursor refuses
qa_roster_case_reached with the abort command.
All blocking cases discharged โ subject reports discharged, accepted for gating
but distinct from accepted passing proof. A carried cross-project member owes
no item QA only when its own completion flow declares none and no explicit
plan/post-deploy requirement exists; report names that flow, records no answer
and closes with run. Same-project/QA-owning carried members still owe proof.
No cases otherwise means unanswered, except recorded no-post-deploy-obligation
or waiver-backed declaration. yoke qa post-deploy record-no-obligation is not
a waiver. Read yoke qa plan run --help.
The question is asked while the item is still in hand. yoke items get ITEM post_deploy_qa shows the answer status; filing and yoke direct-workflow worktree prepare report an unanswered one with both ways to answer; and
yoke merge item ITEM --check lists it as a landing blocker.