Skip to content

FEAT-071 (REQ-021): scry's scope as DATA, from one source - #174

Merged
avrabe merged 1 commit into
mainfrom
feat-071-scope-manifest
Aug 27, 2026
Merged

FEAT-071 (REQ-021): scry's scope as DATA, from one source#174
avrabe merged 1 commit into
mainfrom
feat-071-scope-manifest

Conversation

@avrabe

@avrabe avrabe commented Aug 27, 2026

Copy link
Copy Markdown
Contributor

Reopens #171, auto-closed when I deleted its base branch during the #170 merge.
Branch unchanged apart from a rebase onto main (it no longer needs stacking — #170's
12-entry required-checks.txt is now on main). #171 has the discussion.

The drift this replaces is measured

The dashboard stated scope in hand-written prose, and render_scope ignored its
AnalysisResult
(the parameter was _r) — it said the same thing about every module.
Its "what scry does NOT prove" list named only provenance limits and none of the
dominant practical ones:

measured on a real module share in the block?
unmodeled-control-flow — an if/else havocs its region 15.6% no
unsupported-op — scrubs the whole function 5.9% no
proven-safe rate 0.6% no

An agent reading it forms a materially more optimistic picture than the numbers support.

Single source, so page and feed can't drift

Both render from SCOPE_EVIDENCE / SCOPE_NOT_PROVEN; the oracle requires every
not-proven item in both surfaces. Mutation-checked: emitting empty strings in the
feed while the page still lists them kills it with not-proven item missing from the FEED.

Red first: the feed must carry a scope manifest, not leave scope to the page.

Human legibility not traded away — the pre-existing hero_and_scope_copy_finalized
gate passes unchanged, because each kind renders its human phrasing and machine tag.

Schema 5 → 6. Three sibling tests pinned the version by equality and broke at once on
an unrelated bump; they now assert a lower bound parsed from the document.

🤖 Generated with Claude Code

https://claude.ai/code/session_01KkNzkNYzPh7366DkNijeNc

The dashboard stated scope in hand-written prose, and `render_scope` ignored its
AnalysisResult entirely (the parameter was `_r`), so it said the same thing about
every module. An agent deciding whether to trust a verdict got paragraphs.

THE DRIFT THIS REPLACES IS MEASURED, not hypothetical. The old not-proven list
named only PROVENANCE limits -- WasmCert not imported, the memory-content model,
not a qualified tool -- and NONE of the dominant practical ones. Measured on a
real module: unmodeled-control-flow 15.6% of advisories and unsupported-op 5.9%,
against a proven-safe rate of 0.6%. A reader would have formed a materially more
optimistic picture than the numbers support. The enumerated list now names the
if/else region havoc, the unsupported-op function scrub, and the disequality
limit that makes a correct div-by-zero fix invisible (#165).

SINGLE SOURCE: the page and the feed are both rendered from SCOPE_EVIDENCE and
SCOPE_NOT_PROVEN, so a limitation cannot be stated on one and omitted from the
other. The oracle requires every not-proven item in BOTH surfaces, and is
mutation-checked: emitting empty strings in the FEED while the page still lists
them (asserted a single matching line before applying) kills it with
"not-proven item missing from the FEED".

Red-first: "the feed must carry a scope manifest, not leave scope to the page",
after the non-vacuity assertion on the constants had passed.

Human legibility is NOT traded away: `hero_and_scope_copy_finalized` still passes
unchanged, because each kind renders its human phrasing AND its machine tag. A
manifest a human cannot read is a different failure from prose a machine cannot
read, not a fix for it.

Schema 5 -> 6. Three sibling tests pinned the version by EQUALITY and broke at
once on a bump unrelated to the field each guarded; they now assert a LOWER BOUND
parsed from the document, which still fails if a field ships without a bump.
Mutation-checked: regressing the constant to 4 kills exactly those three.

tests=0 clippy=0 fmt=0 rivet=0 claim-check=0 gate-coverage=0.

Refs: FEAT-071

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: #174 Base SHA: 8b53ec21

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 (158 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 (158 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 262 262
full stats — head
Artifact summary:
  academic-reference               24
  competitive-analysis             11
  design-decision                  22
  feature                          92
  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                           262

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), 158 warning(s), 25 info(s)

Diff (base → head)

~ FEAT-071
  field changed: acceptance-criteria

0 added, 0 removed, 1 modified, 261 unchanged

AADL model — head

spar/scry.aadl: OK

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

@avrabe
avrabe merged commit 09b2c11 into main Aug 27, 2026
13 checks passed
@avrabe
avrabe deleted the feat-071-scope-manifest branch August 27, 2026 07:44
avrabe added a commit that referenced this pull request Aug 27, 2026
#174 landed FEAT-071 with 13/13 green, so it belongs in this pass rather than a
follow-up. Its oracle re-run on main just now: the scope manifest reaches the
feed as data, and the anti-drift property (every not-proven item present in BOTH
the page and the feed) holds. That property was mutation-checked when it landed
-- emitting empty strings in the feed while the page kept them kills the test.

Folded in here rather than opened separately because #176 had not started CI, so
it costs nothing; had it been mid-run the trade would have gone the other way.

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

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

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
avrabe added a commit that referenced this pull request Aug 27, 2026
#174 landed FEAT-071 with 13/13 green, so it belongs in this pass rather than a
follow-up. Its oracle re-run on main just now: the scope manifest reaches the
feed as data, and the anti-drift property (every not-proven item present in BOTH
the page and the feed) holds. That property was mutation-checked when it landed
-- emitting empty strings in the feed while the page kept them kills the test.

Folded in here rather than opened separately because #176 had not started CI, so
it costs nothing; had it been mid-run the trade would have gone the other way.

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

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

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
avrabe added a commit that referenced this pull request Aug 27, 2026
…→4 (#176)

* Promote FEAT-091 / FEAT-092 to accepted — v3.4.0 not-ready 7 -> 5

Both shipped and CI-verified; leaving them proposed understates the release the
same way promoting them early would overstate it.

  FEAT-091 (#167, 13/13 green) -- commit traceability. Its gate's --self-test
    PASSES and the real check PASSES on main against HEAD~1..HEAD, and the job
    runs in CI as a REQUIRED check.
  FEAT-092 (#172, 13/13 green) -- one operator, one name. Its oracle re-run on
    main just now; the naming-only claim was measured, not argued (every
    advisory-code count identical on a real module, leaks 2,800 -> 71).

NOT promoted, and the reason matters:
  FEAT-093 -- merged in #167 and green, but #175 is OPEN and adds ACs to it.
    Promoting now would produce an `accepted` artifact that immediately gains
    unmet criteria. It goes accepted after #175 lands, not before.
  FEAT-089 -- filed, not built; its AC#1 demands a test still red by design.
  FEAT-057 / FEAT-065 / REQ-021 -- unbuilt.
  FEAT-064 -- AC1 still falsified, so REQ-020 stays blocked.

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

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

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

* Also promote FEAT-071 — v3.3.0 not-ready 6 -> 5

#174 landed FEAT-071 with 13/13 green, so it belongs in this pass rather than a
follow-up. Its oracle re-run on main just now: the scope manifest reaches the
feed as data, and the anti-drift property (every not-proven item present in BOTH
the page and the feed) holds. That property was mutation-checked when it landed
-- emitting empty strings in the feed while the page kept them kills the test.

Folded in here rather than opened separately because #176 had not started CI, so
it costs nothing; had it been mid-run the trade would have gone the other way.

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

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

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

* Also promote FEAT-093 — its refinement landed, so its criteria are complete

FEAT-093 was deliberately held back from the earlier promotion because #175 was
OPEN and adding acceptance criteria to it; promoting then would have produced an
`accepted` artifact that immediately acquired unmet criteria. #175 has now
merged, so the criteria are complete AND met.

Evidence re-run on main: the gate's 7-case --self-test passes, file mode passes,
and live mode passes with `file agrees: True` -- the ruleset, the checked-in
file and the CI jobs are all in agreement.

Folded in here rather than opened separately because #176 still had not started
CI. Same trade as FEAT-071 a moment ago, and the same reason.

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

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

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

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
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