The row
- Ask does SYS-REQ-501 still match the stored approval fingerprint
- Stamp approvals_current is green, the shall did not move, the second stamp has no motivation
- Why fingerprint match never asks why the approval moved
Topic · approval motivation present
Gist
Approval motivation present is whether a re-approval cites the CHG or DEFECT that moved the shall, or an unchanged rationale of at least 32 characters. Proof runs proof audit --check approval_motivation_present. Jama still authors.
proof audit --check approval_motivation_present
Keep GitHub if it already owns the PR comment. Keep Jama if it already authors the shall. Neither one asks why this approval moved after the first stamp.
01 · The silent re-approval
Fingerprint match is not this hop. This hop is whether the latest re-approval names the change that moved the spec, or says unchanged with a rationale the audit can count.
The check is approval_motivation_present. Stage spec. Default-on. Severity error. It walks every active requirement whose current review status is approved and whose reviewer is set. A pending, in-review, or rejected row has no approval to motivate and is skipped. An approved row with an empty reviewer is skipped here; other hops own that integrity gap.
The fingerprint hop lives on
approvals current.
That page's command is proof audit --check approvals_current: the stored hash still matches the authored shall. A re-approval that did not edit the shall stays green there. The motivation block can still be missing. That is the hole this hop closes.
proof approve SYS-REQ-501 --role system_owner \
--comment "re-approved"
# approvals_current stays green: the shall did not move
# approval_motivation_present fails: no motivation.kind
Detection of a re-approval is the requirement's own change_history. More than one transition whose to is approved, or any entry whose from is already approved, means the latest stamp is not the creation-time approval. The initial stamp is exempt. A motivation present on that first stamp is still validated: a malformed initial block is the same authoring mistake.
Three kinds. chg: ref must resolve to a real record under proof/changes/. defect: ref must resolve to a real record under proof/problem-reports/. unchanged: rationale must be at least 32 characters after trim. A bulk "nothing changed" of twelve characters is refused. The friction is the point.
proof approve SYS-REQ-501 --role system_owner \
--motivation-kind chg --motivation-ref CHG-12
proof approve SYS-REQ-501 --role system_owner \
--motivation-kind defect --motivation-ref DEFECT-4
proof approve SYS-REQ-501 --role system_owner \
--motivation-kind unchanged \
--motivation-rationale "Re-render after formatter migration; obligations unchanged"
proof audit --check approval_motivation_present --verbose
Re-approvals whose reviewed_at parses as RFC3339 and is strictly before 2026-06-30 17:50:13 UTC are grandfathered. That instant is the contract's own change record, not calendar midnight. An empty or unparseable timestamp does not grandfather. The date is what proves the stamp predates the contract.
02 · The exhibit
Approved twice, shall unchanged, no motivation block. Click the tabs.
The row
This hop
Nobody asked whether the re-approval cites a CHG, a DEFECT, or an unchanged rationale. The finding kind is this hop.
Motivation unreadThe row
Keep the GitHub review. Keep the Jama field. That is not this hop.
Keep the recordProof
Same SYS-REQ-501. Silent re-approval, or this hop. Click the tabs.
| Surface | What they do | What Proof does | What we lose |
|---|---|---|---|
| GitHub PR review | A comment thread on the diff. | A typed motivation on the requirement's latest approval. | Not the PR. See pull request review. |
| approvals_current | Whether the stored fingerprint still matches the shall. | Whether the re-approval names the change that moved it. | Not the fingerprint. That hop stays on approvals current. |
| change_record_lands | Whether a CHG or DEFECT with an affects: list is cited back. |
Whether this requirement's re-approval cites a real CHG or DEFECT. | Not the inverse hop. That check is a warning; this one is an error. |
| requirement review | The brief. It does not move status. | The stamp after a human re-approves with a kind. | Not the brief. See requirement review. |
| Jama field | The authoring programme. Attributes if you put them there. | A YAML motivation the audit can name next to the requirement. | Not Jama's V&V. Jama still authors. We have not run a frozen Jama pack. |
The teaching graph is still one re-approved shall next to one missing motivation. Cite the CHG, or the hop names the gap.
proof approve SYS-REQ-501 --role system_owner \
--motivation-kind chg --motivation-ref CHG-12
proof audit --check approval_motivation_present
A dangling ref fails. Create the missing record (proof change new / proof problem-report new) or correct the id. Partial coverage is not a thing here: the motivation is on the requirement, not per-link.
Fingerprint match stays on approvals current. The write of the first stamp stays on requirement review. Do not treat a wiki of "re-approved, nothing changed" as this cell. Jama still authors. Proof vs Jama.
03 · The honest loss
A quiet proof audit --check approval_motivation_present can still mean every approved row is still the first stamp. Jama still authors.
The hop does not call proof approve. It does not move status. It does not hash the shall. Initial creation-time approvals are exempt. Grandfathered re-approvals before 2026-06-30 17:50:13 UTC are exempt. Pending and rejected rows are skipped. An empty reviewer is skipped. A pass of "all N approved requirement(s) carry valid motivation (or are initial-creation exemptions)" can be N first stamps and zero re-approvals. The hop does not prove the Go. We have not scored this floor against a frozen Jama pack. The loss is named, not scored.
The fingerprint hop stays on approvals current. The engagement stays on software correctness audit. Jama still authors.
04 · Nearby questions
What is approval motivation present? Same question. Same URL.
Is this approvals current? No. That hop is whether the stored fingerprint still matches the shall. This hop is why the re-approval moved. See approvals current.
Is this a GitHub PR approval? No. GitHub still owns the comment thread. See pull request review.
Is this requirement review? No. That command is the brief. It does not move status. See requirement review.
Does an initial approval fail? No. The first stamp is exempt. A malformed motivation on that first stamp still fails structural validation.
Does unchanged need a CHG? No. Kind unchanged needs a rationale of at least 32 characters after trim. A dangling CHG or DEFECT ref fails.
Does a green hop prove the Go? No. The hop does not execute the function. It does not prove the shall.
Is Proof a Jama alternative for the shall? No. Jama still authors. Proof vs Jama.