Skip to content

FEAT-095: file the dominant precision limit, which nothing tracked - #193

Merged
avrabe merged 1 commit into
mainfrom
feat095-model-if-else-regions
Aug 28, 2026
Merged

FEAT-095: file the dominant precision limit, which nothing tracked#193
avrabe merged 1 commit into
mainfrom
feat095-model-if-else-regions

Conversation

@avrabe

@avrabe avrabe commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

Modelling if/else regions instead of havocking them is upstream of most of what scry
cannot prove — and it had no artifact and no issue. Grepping every artifact title and
every open issue returned two false positives and the consumer request (#114). Nothing
named the gap itself.

Measured on scry_mcdc.wasm

Of 8,162 unproven out-of-bounds obligations:

count share
in a degraded function (already carries a precision gap) 7,553 92.5%
in a cleanly-modelled function — reached the bounds question and failed 609 7.5%

Causes: unmodeled-control-flow 1,639 · unsupported-op 623 · unmodeled-branch 12.
636 of 766 functions with advisories (83%) are degraded.

The headline number points the wrong way

"0.67% proven" reads as a weak bounds domain and invites work there — which could
address at most 7.5%. The analyzer gives up on 83% of functions before the bounds
question is reached. It's a coverage problem upstream of the prover, not a precision
problem inside it.

havoc_region is honest — it records GapKind::UnmodeledControlFlow rather than
silently going ⊤ (REQ-017), which is the only reason this was measurable at all. It's also
the single biggest thing between scry and a useful proven rate.

AC3 is the one that matters: joining two arms that assign different values to one local
must over-approximate. A join that picks a branch is a false proof — FEAT-089's failure
mode one level up, and this feature makes scry emit PROVEN-SAFE where it currently doesn't.

And it made an existing finding enforceable

I wrote that v3.3.0 now had two ordering inversions, ran the check, and it reported one.
FEAT-064's dependency on FEAT-077/087 was recorded in prose inside an AC — so no tool
could see it. #187's finding was unenforceable by construction.

Both are now typed depends-on links, and the check reports:

FEAT-064 (v3.3.0) depends-on FEAT-077 (v3.4.0)
FEAT-064 (v3.3.0) depends-on FEAT-087 (v3.4.0)
FEAT-069 (v3.3.0) depends-on FEAT-095 (v3.5.0)

Two of v3.3.0's three remaining items are blocked on later releases. That strengthens
#187's recommendation rather than adding a new problem.

rivet=0 claim-check=0 fmt=0 drift-gate=0

🤖 Generated with Claude Code

https://claude.ai/code/session_01KkNzkNYzPh7366DkNijeNc

Modelling if/else regions instead of havocking them is upstream of most of what
scry cannot prove, and it had NO artifact and NO issue. Grepping every artifact
title and every open issue returned two false positives and the consumer request
(#114) -- nothing named the gap itself.

MEASURED on scry_mcdc.wasm. Of 8,162 unproven out-of-bounds obligations, 7,553
(92.5%) are in a function already carrying a precision gap -- unmodeled-control-
flow 1,639, unsupported-op 623, unmodeled-branch 12 -- and only 609 (7.5%) are in
a cleanly-modelled function where scry reached the bounds question and failed.
636 of 766 functions with advisories (83%) are degraded.

So the headline number points the wrong way. "0.67% proven" reads as a weak
bounds domain and invites work there, which could address at most the 7.5%. It is
a COVERAGE problem upstream of the prover, not a precision problem inside it.

`havoc_region` is HONEST -- it records GapKind::UnmodeledControlFlow rather than
silently going top (REQ-017), which is the only reason this was measurable. It is
also the single biggest thing between scry and a useful proven rate.

AC3 is the one that matters: joining two arms that assign different values to one
local must OVER-APPROXIMATE. A join that picks a branch is a false proof -- the
FEAT-089 failure mode one level up, and this feature makes scry emit PROVEN-SAFE
where it currently does not.

ALSO MADE AN EXISTING INVERSION MACHINE-VISIBLE. I wrote that v3.3.0 now has two
ordering inversions, then ran the check and it reported ONE. FEAT-064's
dependency on FEAT-077/FEAT-087 was recorded in PROSE (inside an AC), so no tool
could see it -- the #187 finding was unenforceable by construction. Both are now
typed `depends-on` links, and the check reports:

  FEAT-064 (v3.3.0) depends-on FEAT-077 (v3.4.0)
  FEAT-064 (v3.3.0) depends-on FEAT-087 (v3.4.0)
  FEAT-069 (v3.3.0) depends-on FEAT-095 (v3.5.0)

Two of v3.3.0's three remaining items are blocked on later releases. That
strengthens #187's recommendation rather than adding a new problem: the release,
as scoped, cannot be cut in sequence.

rivet=0 claim-check=0 fmt=0 drift-gate=0.

Claude-Session: https://claude.ai/code/session_01KkNzkNYzPh7366DkNijeNc

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown

📐 rivet artifact delta

PR: #193 Base SHA: ba9c3378

Validation

head — `rivet validate` result
  SR-11 (sw-req, status: accepted) — missing: sw-integration-verification, unit-verification
  SR-12 (sw-req, status: accepted) — missing: sw-integration-verification, unit-verification
  SR-13 (sw-req, status: accepted) — missing: sw-integration-verification, unit-verification
  SR-2 (sw-req, status: accepted) — missing: sw-integration-verification, unit-verification
  SR-3 (sw-req, status: accepted) — missing: sw-integration-verification, unit-verification
  SR-4 (sw-req, status: accepted) — missing: sw-integration-verification, unit-verification
  SR-5 (sw-req, status: accepted) — missing: sw-integration-verification, unit-verification
  SR-6 (sw-req, status: accepted) — missing: sw-integration-verification, unit-verification
  SR-7 (sw-req, status: accepted) — missing: sw-integration-verification, unit-verification
  SR-8 (sw-req, status: accepted) — missing: sw-integration-verification, unit-verification
  SR-9 (sw-req, status: accepted) — missing: sw-integration-verification, unit-verification
  SYS-1 (system-req, status: accepted) — missing: sys-integration-verification
  SYS-2 (system-req, status: accepted) — missing: sys-integration-verification
  SYS-3 (system-req, status: accepted) — missing: sys-integration-verification
  SYS-4 (system-req, status: accepted) — missing: sys-integration-verification
  SYS-5 (system-req, status: accepted) — missing: sys-integration-verification
  → run `rivet validate --explain SR-1` to see which link type and source types satisfy a gap

Result: PASS (176 warnings)
Schemas: common@0.3.0 (embedded), dev@0.3.0 (embedded), research@0.1.0 (embedded), research-ext@0.1.0 (on-disk), safety-case@0.1.0 (embedded), aspice@0.2.0 (embedded)
base — `rivet validate` result (for comparison)
  SR-11 (sw-req, status: accepted) — missing: sw-integration-verification, unit-verification
  SR-12 (sw-req, status: accepted) — missing: sw-integration-verification, unit-verification
  SR-13 (sw-req, status: accepted) — missing: sw-integration-verification, unit-verification
  SR-2 (sw-req, status: accepted) — missing: sw-integration-verification, unit-verification
  SR-3 (sw-req, status: accepted) — missing: sw-integration-verification, unit-verification
  SR-4 (sw-req, status: accepted) — missing: sw-integration-verification, unit-verification
  SR-5 (sw-req, status: accepted) — missing: sw-integration-verification, unit-verification
  SR-6 (sw-req, status: accepted) — missing: sw-integration-verification, unit-verification
  SR-7 (sw-req, status: accepted) — missing: sw-integration-verification, unit-verification
  SR-8 (sw-req, status: accepted) — missing: sw-integration-verification, unit-verification
  SR-9 (sw-req, status: accepted) — missing: sw-integration-verification, unit-verification
  SYS-1 (system-req, status: accepted) — missing: sys-integration-verification
  SYS-2 (system-req, status: accepted) — missing: sys-integration-verification
  SYS-3 (system-req, status: accepted) — missing: sys-integration-verification
  SYS-4 (system-req, status: accepted) — missing: sys-integration-verification
  SYS-5 (system-req, status: accepted) — missing: sys-integration-verification
  → run `rivet validate --explain SR-1` to see which link type and source types satisfy a gap

Result: PASS (174 warnings)
Schemas: common@0.3.0 (embedded), dev@0.3.0 (embedded), research@0.1.0 (embedded), research-ext@0.1.0 (on-disk), safety-case@0.1.0 (embedded), aspice@0.2.0 (embedded)

Artifact stats

base head
Total artifacts 264 265
full stats — head
Artifact summary:
  academic-reference               24
  competitive-analysis             11
  design-decision                  22
  feature                          95
  market-finding                    7
  requirement                      21
  safety-context                    3
  safety-goal                       5
  safety-justification              4
  safety-solution                   6
  safety-strategy                   1
  stakeholder-req                   3
  sw-req                           13
  sw-verification                  13
  sys-verification                  5
  system-req                        5
  technology-evaluation            12
  verification                     15
  TOTAL                           265

Orphan artifacts (no links): 12
  CA-001
  CA-002
  CA-003
  CA-004
  CA-005
  CA-006
  CA-007
  CA-008
  CA-009
  CA-010
  CA-011
  FEAT-078

Diagnostics: 0 error(s), 176 warning(s), 28 info(s)

Diff (base → head)

+ FEAT-095  v3.5 — Interpret `if`/`else` regions instead of havocking them
~ FEAT-064
  link: + depends-on -> FEAT-077
  link: + depends-on -> FEAT-087
~ FEAT-069
  link: + depends-on -> FEAT-095

1 added, 0 removed, 2 modified, 262 unchanged

~ NEW    WARN: [FEAT-095] prose mentions 'REQ-017' but no typed link to it; add a link in `links:` or remove the mention
~ NEW    WARN: [FEAT-095] prose mentions 'FEAT-016' but no typed link to it; add a link in `links:` or remove the mention
~ NEW    WARN: [FEAT-095] prose mentions 'FEAT-089' but no typed link to it; add a link in `links:` or remove the mention
~ NEW    WARN: [FEAT-095] prose mentions 'FEAT-069' but no typed link to it; add a link in `links:` or remove the mention
+ RESOLVED    WARN: [FEAT-064] prose mentions 'FEAT-077' but no typed link to it; add a link in `links:` or remove the mention
+ RESOLVED    WARN: [FEAT-064] prose mentions 'FEAT-087' but no typed link to it; add a link in `links:` or remove the mention
0 new errors, 0 resolved errors, 4 new warnings, 2 resolved warnings

AADL model — head

spar/scry.aadl: OK

Posted by the rivet-delta workflow. Informational only — does not gate the PR.

@avrabe
avrabe merged commit 33b2925 into main Aug 28, 2026
13 checks passed
@avrabe
avrabe deleted the feat095-model-if-else-regions branch August 28, 2026 03:22
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