Skip to content

feat(recommend): expose production dispositions through a Verdicts seam - #47

Merged
agenticode merged 1 commit into
mainfrom
wave/s2-verdicts
Aug 26, 2026
Merged

feat(recommend): expose production dispositions through a Verdicts seam#47
agenticode merged 1 commit into
mainfrom
wave/s2-verdicts

Conversation

@agenticode

Copy link
Copy Markdown
Owner

Verdicts reports what the production recommender actually reached, without
running pkg/decision a second time — a second evaluation can diverge from the
answer production gave.

Disposition (recommended / never-observed / insufficient-history /
no-significant-change) sits on a separate axis from VerdictState (not-computed /
computed). decision.Verdict stays unexported so v.Decision.Action does not
compile and a dropped comma-ok yields an empty Action matching no real action.
On the wire verdictState is always emitted and the verdict object omitted;
UnmarshalJSON re-derives state from presence, so a forged computed still decodes
to not-computed. Nothing can set VerdictComputed today.

checkNoDisagreement enforces the full biconditional over 200 seeded scenarios in
both call orders, including the silent side, and fails if any disposition count
hits zero. The random corpus does not land on 29 samples, so
TestVerdictsAgreeAtEveryGateBoundary walks each gate across its exact threshold
plus a 101-step sweep through churn suppression. 8 of 8 mutations caught,
coverage 95.3%. recommend.go is unmodified.

Verdicts reports what the production recommender actually reached, without
running pkg/decision a second time — a second evaluation can diverge from the
answer production gave.

Disposition (recommended / never-observed / insufficient-history /
no-significant-change) sits on a separate axis from VerdictState (not-computed /
computed). decision.Verdict stays unexported so v.Decision.Action does not
compile and a dropped comma-ok yields an empty Action matching no real action.
On the wire verdictState is always emitted and the verdict object omitted;
UnmarshalJSON re-derives state from presence, so a forged computed still decodes
to not-computed. Nothing can set VerdictComputed today.

checkNoDisagreement enforces the full biconditional over 200 seeded scenarios in
both call orders, including the silent side, and fails if any disposition count
hits zero. The random corpus does not land on 29 samples, so
TestVerdictsAgreeAtEveryGateBoundary walks each gate across its exact threshold
plus a 101-step sweep through churn suppression. 8 of 8 mutations caught,
coverage 95.3%. recommend.go is unmodified.

Co-authored-by: kording <74226694+kording@users.noreply.github.com>
@agenticode
agenticode merged commit eef0faf into main Aug 26, 2026
2 checks passed
@agenticode
agenticode deleted the wave/s2-verdicts branch August 26, 2026 10:30
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