Skip to content

FEAT-041 (v2.6): surface relational octagon invariants#77

Merged
avrabe merged 1 commit into
mainfrom
feat-041-surface-octagon
Jun 27, 2026
Merged

FEAT-041 (v2.6): surface relational octagon invariants#77
avrabe merged 1 commit into
mainfrom
feat-041-surface-octagon

Conversation

@avrabe

@avrabe avrabe commented Jun 27, 2026

Copy link
Copy Markdown
Contributor

Second feature of v2.6.0. Closes the v1.9 non-observability finding — the octagon's relational precision is now visible in the output.

What

  • scry-octagon: relations(o) -> Vec<Relation> extracts the cross-variable constraints (x_a − x_b ≤ c, x_a + x_b ≤ c) from the strong-closed DBM. γ-sweep test proves every surfaced relation is sound.
  • scry-analyze-core: ProgramPoint.relational: Vec<RelationalConstraint> (library-only) populated at each emitted point. fixture-11's i − n loop-invariant relation is now observable where before only the unary projection (i ≤ 10) showed.

Deliberately not unary-filtered: a relation that produced a unary bound (i − n ≤ 0i ≤ n) looks unary-implied once the octagon reduces it, yet it's exactly the relational fact to surface (that subtlety was a clean-room finding mid-implementation).

Soundness / posture

Library-only — WIT mirror carries only locals; frozen v1 JSON contract unchanged (contract test green). Each surfaced constraint is a sound invariant the octagon maintains. 45 core + 26 octagon + 6 contract tests; clippy + fmt clean.

Traces REQ-016. release: v2.6.0.

🤖 Generated with Claude Code

Closes the v1.9 non-observability finding: the octagon arc (v1.4-v1.9) computes
relational constraints (x_a - x_b <= c, x_a + x_b <= c) and strong-closes them,
but the output only projected the octagon to unary intervals, so the relational
precision was invisible to consumers (loom/synth/assessors).

- scry-octagon: new `relations(o) -> Vec<Relation>` (+ Relation/RelKind) reading
  the strong-closed DBM's cross-variable cells (Diff at m[2b][2a], Sum at
  m[2b+1][2a]); each is a sound invariant the octagon maintains. NOT unary-
  filtered — a relation that produced a unary bound (i - n <= 0 yielding i <= n)
  looks unary-implied once reduced, yet is exactly the fact worth surfacing.
  Tests: relations_surfaces_relational_and_is_sound (gamma-sweep soundness),
  relations_omits_unary_only.
- scry-analyze-core: ProgramPoint gains a library-only `relational:
  Vec<RelationalConstraint>` populated at every emitted point from ctx.octagon
  (snapshot_relational). WIT mirror carries only `locals` (frozen contract
  intact — contract test green).
- Tests: feat041_relational_invariants_surfaced (fixture-11's i-n relation now
  visible), feat041_no_relations_when_non_relational.

45 core + 26 octagon + 6 contract tests; clippy + fmt clean. FEAT-041 accepted
(release v2.6.0).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown

📐 rivet artifact delta

PR: #77 Base SHA: 7f780e74

Validation

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

Result: PASS (74 warnings)
Schemas: common@0.3.0 (embedded), dev@0.2.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-7 (sw-req, status: accepted) — missing: unit-verification, sw-integration-verification
  SR-8 (sw-req, status: accepted) — missing: unit-verification, sw-integration-verification
  SR-10 (sw-req, status: accepted) — missing: unit-verification, sw-integration-verification
  SYS-4 (system-req, status: accepted) — missing: sys-integration-verification
  SR-1 (sw-req, status: accepted) — missing: unit-verification, sw-integration-verification
  SR-2 (sw-req, status: accepted) — missing: unit-verification, sw-integration-verification
  SYS-1 (system-req, status: accepted) — missing: sys-integration-verification
  SR-12 (sw-req, status: accepted) — missing: unit-verification, sw-integration-verification
  SR-6 (sw-req, status: accepted) — missing: unit-verification, sw-integration-verification
  SR-9 (sw-req, status: accepted) — missing: unit-verification, sw-integration-verification
  SR-11 (sw-req, status: accepted) — missing: unit-verification, sw-integration-verification
  SYS-5 (system-req, status: accepted) — missing: sys-integration-verification
  SR-4 (sw-req, status: accepted) — missing: unit-verification, sw-integration-verification
  SR-5 (sw-req, status: accepted) — missing: unit-verification, sw-integration-verification
  SR-13 (sw-req, status: accepted) — missing: unit-verification, sw-integration-verification
  SYS-3 (system-req, status: accepted) — missing: sys-integration-verification
  → run `rivet validate --explain SR-3` to see which link type and source types satisfy a gap

Result: PASS (74 warnings)
Schemas: common@0.3.0 (embedded), dev@0.2.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 203 203
full stats — head
Artifact summary:
  academic-reference               24
  competitive-analysis             11
  design-decision                  17
  feature                          58
  market-finding                    7
  requirement                      17
  safety-context                    3
  safety-goal                       5
  safety-justification              3
  safety-solution                   6
  safety-strategy                   1
  stakeholder-req                   3
  sw-req                           13
  sw-verification                  13
  sys-verification                  5
  system-req                        5
  technology-evaluation            12
  TOTAL                           203

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

Diagnostics: 0 error(s), 74 warning(s), 16 info(s)

Diff (base → head)

~ FEAT-041
  status: - proposed -> + accepted

0 added, 0 removed, 1 modified, 202 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 065da6f into main Jun 27, 2026
10 checks passed
@avrabe avrabe deleted the feat-041-surface-octagon branch June 27, 2026 10:13
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