risk-check status proves the detector ran, never that the blocking fire happened #205
Labels
No labels
already-shipped
bug
documentation
duplicate
enhancement
external-review
good first issue
help wanted
in progress
invalid
needs-decision
proposal
question
security
wontfix
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: crenshawdev/cadence-archived#205
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
The gap
risk-check statusproves a resolved commit range was READ and RECORDED. It doesnot prove the consequence happened.
workflows/execute.mdtells a cooperative coordinator exactly what to do: on anon-empty
matchesorinconclusive: true, write the diff, firerisk_surface,and treat it as blocking. But
statusreturnsok:trueon the strength of thedetector record alone. There is no requirement of a reviewer bracket, a settled
findings file, an adjudication outcome, or an explicit user override for a range
that matched.
So a coordinator can run the detector, skip the blocking fire, and still receive
a clean completion status. The prose is the only thing holding the sequence
together, and Cadence's own stated failure model is a fallible coordinator, not a
cooperative one.
Why this is the same species as the checks Cadence already builds
The tree repeatedly replaces "the prose says to" with "the seam refuses":
self-verifycheck 19 refuses an inline caller-derived-text site, the census testreddens on a pasted-back containment predicate,
risk-check statusitself existsbecause "a check whose answer never reached the record is a check the next reader
cannot see."
This finding is that same argument applied one step further out. A fire whose
answer never reached the record is a fire the next reader cannot see either, and
statusis the natural place to notice.The fix shape
statusrefuses - as it already does for an unrecorded check - when the recordshows a MATCHED or INCONCLUSIVE range with no corresponding outcome event for
that trigger under the same correlation id. The trace already carries
adjudicationandrearmoutcome events keyed by corr, so the join exists; whatis missing is
statusrequiring it.Open question worth settling in the same pass: an explicit user override is a
legitimate terminal state and currently leaves no outcome event of its own. It
would need one, or
statuswould refuse a range the user deliberately cleared.Related
Same family as #197 (the re-arm cap has no new-information valve) - both are
about the blocking path's terminal states being under-recorded.
Source: external strict re-review, 2026-08-16 (FLOW-01, Medium). Not
independently verified here beyond reading the workflow prose and the status
contract.