Skip to content

FEAT-064 AC3 closed by measurement; FEAT-089 files what it found - #164

Merged
avrabe merged 1 commit into
mainfrom
feat-089-ac3-nonzero
Aug 27, 2026
Merged

FEAT-064 AC3 closed by measurement; FEAT-089 files what it found#164
avrabe merged 1 commit into
mainfrom
feat-089-ac3-nonzero

Conversation

@avrabe

@avrabe avrabe commented Aug 27, 2026

Copy link
Copy Markdown
Contributor

FEAT-064's AC3 was explicitly OPEN, with a standing instruction attached:

whether a genuine FIX presents as a changed obligation at a surviving site …
must not be restated as a structural claim without a fixture that isolates it

This is that fixture. The answer splits in two, and only one half is about identity.

The fixture is a real fix

Not a deletion of the risky functionality. $r defaults to 0, so br_if out of an
already present block returns 0 when the divisor is zero. It opens no region and
adds no second i32.div_s, so the division site's region path and intra-region
ordinal are untouched.

(1) Identity survives perfectly

Same site_key, byte-identical obligation_ids across the fix. The structural
obstacle is removed for region-preserving fixes — identity is not what blocks
adjudication on this shape.

Mutation-checked: swapping the fix to an if/else guard opens a region, moves the
site, and turns the test red.

(2) …and the obligation set is unchanged anyway

div-by-zero still fires after a correct fix. The mechanism, read out of scry's own
source rather than inferred:

try_guard_brif maps (I32Eqz, BrIf)GuardOp::Eq with c = 0.

  • taken edge (divisor == 0) → refines to [0,0] — correct, and useless, because
    the division is on the other edge
  • fall-through edge licenses divisor != 0refine_interval returns the
    interval untouched, and says why in the code:
(GuardOp::Eq, false) | (GuardOp::Ne, true) => return iv, // ≠ c: no interval

A disequality is a hole in the middle of a range; an interval lattice cannot hold
one. The transfer is sound — it just carries nothing for exactly the fact the fix
establishes.

Why this matters beyond precision

REQ-021 gates an AI agent on scry's verdict over its own edit. Under this behaviour an
agent that fixes the bug correctly is told the obligation still stands. A gate that
punishes the correct repair is worse than a missing feature. Filed as FEAT-089.

Measured across five shapes

fix shape site identity fix visible?
br_if out of a pre-existing block survives (ids identical) no — disequality
select-based guard survives no — select is unsupported-op
if/else, folded (if (result i32) …) moves no — region havoc'd
if/else, statement form moves no — region havoc'd
divisor → constant survives not a fix — deletes the parameter's role

select is the constructive one: identity is already free there, so modelling it is a
separate bounded interpret_op slice (same shape as FEAT-084).

Scope

Not claimed: how common any of these shapes is in real fixes. Five hand-written
fixtures, zero observed repairs — this says which shapes behave how, not how often
each occurs.

FEAT-064 is NOT promoted. AC1 still stands as falsified-and-repaired-by-FEAT-077,
so REQ-020 stays blocked.

The test pins the identity half only. It deliberately does not assert that
div-by-zero still fires — that is the defect, and a test asserting a defect becomes a
barrier to fixing it. When FEAT-089 lands this test must pass unchanged, which is an
AC there.

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

⚠️ Per #130 this repo has no required status checks; verify gh pr checks by hand.

🤖 Generated with Claude Code

https://claude.ai/code/session_01KkNzkNYzPh7366DkNijeNc

AC3 was explicitly OPEN: "whether a genuine FIX presents as a changed obligation
at a surviving site", with the standing instruction that the 7-commit-pair
observation "must not be restated as a structural claim without a fixture that
isolates it." This is that fixture, and the answer splits in two.

The fix is GENUINE and semantics-preserving -- not a deletion of the risky
functionality. `$r` defaults to 0, so `br_if` out of an ALREADY PRESENT block
returns 0 when the divisor is zero. It opens no region and adds no second
`i32.div_s`, so the division site's path and ordinal are untouched.

(1) IDENTITY SURVIVES PERFECTLY -- same site_key, byte-identical obligation_ids.
The structural obstacle is REMOVED for region-preserving fixes. Mutation-checked:
swapping the fix to an `if/else` guard opens a region, moves the site, and turns
the test red.

(2) THE OBLIGATION SET IS UNCHANGED ANYWAY. div-by-zero still fires after a
correct fix. Mechanism, read out of scry's own source rather than inferred:
try_guard_brif maps (I32Eqz, BrIf) to GuardOp::Eq with c=0. The taken edge
refines to [0,0] -- correct and useless, since the division is on the OTHER
edge. The fall-through edge licenses `divisor != 0`, and refine_interval returns
the interval untouched, saying why in the code:
  (GuardOp::Eq, false) | (GuardOp::Ne, true) => return iv, // != c: no interval
A disequality is a hole in the middle of a range; an interval lattice cannot
hold it. The transfer is SOUND -- it just carries nothing for exactly the fact
the fix establishes.

So the open hypothesis is not resolved, it is REPLACED by a sharper obstacle
that is about precision, not identity. Filed as FEAT-089, which matters for
REQ-021: an agent gated on scry that fixes the bug CORRECTLY is told the
obligation still stands. A gate that punishes the correct repair is worse than
a missing feature.

The test pins the IDENTITY half only. It deliberately does not assert that
div-by-zero still fires: that is the defect, and a test asserting a defect
becomes a barrier to fixing it. When FEAT-089 lands, this test must pass
unchanged -- stated as an AC there.

Also fixes a YAML break I introduced in the same edit: the AC text carried
embedded double quotes inside a double-quoted scalar. rivet validate caught it.

NOT CLAIMED: how common any guard shape is in real fixes. Five hand-written
fixtures, zero observed repairs. This says which shapes behave how, not how
often each occurs. FEAT-064 is NOT promoted -- AC1 still stands as
falsified-and-repaired-by-FEAT-077, so REQ-020 stays blocked.

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

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

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
@avrabe
avrabe force-pushed the feat-089-ac3-nonzero branch from 526cc91 to b7c77f0 Compare August 27, 2026 03:24
@github-actions

Copy link
Copy Markdown

📐 rivet artifact delta

PR: #164 Base SHA: 265725ed

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 (148 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 (146 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 257 258
full stats — head
Artifact summary:
  academic-reference               24
  competitive-analysis             11
  design-decision                  22
  feature                          88
  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                           258

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), 148 warning(s), 21 info(s)

Diff (base → head)

+ FEAT-089  v3.4 — A div-by-zero fix must be VISIBLE: non-zero facts a disequality guard establishes
~ FEAT-064
  field changed: acceptance-criteria

1 added, 0 removed, 1 modified, 256 unchanged

~ NEW    WARN: [FEAT-089] prose mentions 'FEAT-064' but no typed link to it; add a link in `links:` or remove the mention
~ NEW    WARN: [FEAT-089] prose mentions 'FEAT-084' but no typed link to it; add a link in `links:` or remove the mention
0 new errors, 0 resolved errors, 2 new warnings, 0 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 fe1095d into main Aug 27, 2026
11 checks passed
@avrabe
avrabe deleted the feat-089-ac3-nonzero branch August 27, 2026 04:41
avrabe added a commit that referenced this pull request Aug 27, 2026
scry#130 was enforced on 2026-08-27 -- all ten ci.yml jobs are now required.
Verified in BOTH directions, which is what separates a gate from a setting:
every open PR flipped to mergeStateStatus=BLOCKED on apply, and #164 merged
CLEAN once its ten checks passed.

A setting that was wrong for months can be wrong again, and it would be
invisible -- CI still runs, PRs still go green, nothing announces that a job
stopped being enforced. Three ways it rots:

  1. a job is ADDED and never required -- scry#130 one job at a time, no symptom
  2. a job is RENAMED -- the stale context never reports, every PR deadlocks
  3. the ruleset is RESET -- it is named `temper-`, so something may regenerate
     it, and required_status_checks would simply vanish

THE DEADLOCK RULE is why this is not set-equality. A check may be required only
if it reports on EVERY PR. rivet-delta.yml is PATH-FILTERED, so `Rivet artifact
delta` never runs on a code-only PR and requiring it would block such PRs
forever. The gate fails if a path-filtered or `if:`-conditional job is ever
required, and carries that exclusion WITH its reason so it is auditable rather
than folklore.

NEW JOBS ARE NOT FAILURES. A job added in the current PR does not exist on main
and cannot be required yet. The gate reads ci.yml from BOTH origin/main and the
PR and reports such jobs as PENDING -- without which it would fail on the very
PR that introduces it. This PR introduces two and still exits 0.

MUTATION-CHECKED AGAINST THE LIVE RULESET, not a fixture: `Format` was removed
from the real required set (asserted 10 -> 9 before applying), the gate failed
naming exactly that job, and restoring returned 10 contexts and exit 0.

Also corrects ci.yml, which claimed "temper's branch protection expects Format,
Clippy, Test" while the ruleset required NOTHING -- the repo was documenting a
gate it did not have.

rivet=0 claim-check=0 fmt=0 drift-self-test=0 trailer-self-test=0.

Refs: FEAT-093

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
…eck drift gate (FEAT-093, #130) (#167)

* FEAT-091 (scry#161): connect the code side to the artifact side

rivet ships commit-to-artifact traceability and it shipped here unconfigured,
so `Broken refs` read 0 for want of any reference to check. That counter is
what would have caught PR #159 merging with a commit naming FEAT-086 before the
artifact existed (#160) -- found by grepping, not by a gate.

TWO MEASUREMENTS CORRECT #161's PREMISE, and both changed the design.

(1) #161 says "zero of 125 commits carry an artifact trailer". Configure a
`Verifies` mapping and rivet instead reports linked:4, broken_refs:4 AND
malformed_refs:4 -- the SAME four commits inflating three counters. None carry
a trailer. All four are the prose line

    Verified: bazel build //:scry green + wasm-tools validate ok.

which rivet's FUZZY trailer-key matcher reads as a malformed `Verifies:`. Five
commits in this history carry such a line. A/B measured: with `Verifies` mapped
the counters read 4/4/4; unmapped they read 0/0/0 and orphans rises 81 -> 85.

So `linked: 4` was never real, and the honest baseline is linked:0 orphans:85
broken_refs:0. The mapping is kept to `Refs: traces-to` ALONE -- a finding, not
laziness: a gate that fails on a normal English sentence gets switched off, and
"Verified:" is an entirely natural thing to write. Reported upstream.

(2) `rivet commits --strict` cannot BE the gate. It also promotes the repo-wide
unimplemented-artifacts warning -- `Artifact coverage: 1/257 (0.4%)` -- which no
pull request can satisfy. Measured: a range with one correctly-linked commit,
zero orphans and zero broken refs STILL exits 1 under --strict. A gate no PR can
pass is not a gate.

So tools/check-commit-trailers.py reads the JSON summary and fails on only the
three counters a PR owns -- orphans, broken_refs, malformed_refs -- ignoring
unimplemented and artifact_coverage. Forward-only by construction: scoped to
origin/main..HEAD, so the 85 pre-existing orphans never enter it and no history
rewrite is needed. Its own CI job, so a traceability failure is legible in the
checks list rather than buried behind artifact validation.

VERIFIED END-TO-END on the real repo, three directions:
  crates/ commit, no trailer        -> orphans=1,     exit 1
  same commit, `Refs: REQ-005`      -> linked=1,      exit 0
  `Refs: FEAT-99999` (the #160 bug) -> broken_refs=1, exit 1
Plus: parse the JSON even when rivet exits non-zero (bailing on the exit code
alone degraded an informative failure to "rivet exited 1"), and fail CLOSED when
rivet is absent. Self-test of 6 cases runs BEFORE the real check.

tests=0 fmt=0 rivet=0 claim-check=0 gate-coverage=0 trailers-self-test=0.

Refs: FEAT-091

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

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

* scry#130: the required-check comment was claiming a gate that did not exist

ci.yml said "Required-status-check names that temper's branch protection
expects: Format, Clippy, Test". The ruleset required NOTHING -- so the file
documented a gate the repo did not have, and every "merged green" rested on
whoever merged remembering to check by hand.

Now accurate: all ten CI jobs are required as of 2026-08-27, verified by every
open PR flipping to mergeStateStatus=BLOCKED.

Also records the constraint that decides which checks may be required at all:
`Rivet artifact delta` lives in the PATH-FILTERED rivet-delta.yml, so it never
reports on a code-only PR. Requiring it would block such PRs forever. Same trap
applies to any job added to this file -- require it only after its name exists
on every PR, i.e. after it has merged to main.

Refs: FEAT-091

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

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

* FEAT-093 (scry#130): the required-check set cannot silently rot back

scry#130 was enforced on 2026-08-27 -- all ten ci.yml jobs are now required.
Verified in BOTH directions, which is what separates a gate from a setting:
every open PR flipped to mergeStateStatus=BLOCKED on apply, and #164 merged
CLEAN once its ten checks passed.

A setting that was wrong for months can be wrong again, and it would be
invisible -- CI still runs, PRs still go green, nothing announces that a job
stopped being enforced. Three ways it rots:

  1. a job is ADDED and never required -- scry#130 one job at a time, no symptom
  2. a job is RENAMED -- the stale context never reports, every PR deadlocks
  3. the ruleset is RESET -- it is named `temper-`, so something may regenerate
     it, and required_status_checks would simply vanish

THE DEADLOCK RULE is why this is not set-equality. A check may be required only
if it reports on EVERY PR. rivet-delta.yml is PATH-FILTERED, so `Rivet artifact
delta` never runs on a code-only PR and requiring it would block such PRs
forever. The gate fails if a path-filtered or `if:`-conditional job is ever
required, and carries that exclusion WITH its reason so it is auditable rather
than folklore.

NEW JOBS ARE NOT FAILURES. A job added in the current PR does not exist on main
and cannot be required yet. The gate reads ci.yml from BOTH origin/main and the
PR and reports such jobs as PENDING -- without which it would fail on the very
PR that introduces it. This PR introduces two and still exits 0.

MUTATION-CHECKED AGAINST THE LIVE RULESET, not a fixture: `Format` was removed
from the real required set (asserted 10 -> 9 before applying), the gate failed
naming exactly that job, and restoring returned 10 contexts and exit 0.

Also corrects ci.yml, which claimed "temper's branch protection expects Format,
Clippy, Test" while the ruleset required NOTHING -- the repo was documenting a
gate it did not have.

rivet=0 claim-check=0 fmt=0 drift-self-test=0 trailer-self-test=0.

Refs: FEAT-093

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

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

* Fix the broken CI workflow: GITHUB_TOKEN cannot read rulesets

I broke CI on this branch. The required-checks drift gate ran the LIVE-ruleset
check in CI under `permissions: administration: read`. That is not a grantable
Actions scope, and a workflow requesting it is REJECTED WHOLESALE -- the run
completed as `failure` with ZERO jobs and no log, which reads like a queue
outage rather than a syntax error. It was caught only by noticing the PR showed
1 registered check instead of 12.

A workflow's GITHUB_TOKEN cannot read rulesets at all, so the original design
could never have worked in CI. Two modes now:

  --against-file  compares jobs to .github/required-checks.txt. No API, so CI
                  can run it. Catches the rot WE cause in our own PRs -- a job
                  added or renamed without updating the file.
  (default)       compares jobs to the LIVE ruleset AND cross-checks the file
                  against it, because CI gates on the file and a drifted file
                  means CI is gating on a fiction. Needs admin credentials.

MUTATION-CHECKED, and the two modes fail DIFFERENTLY, which is the point:
deleting `Clippy` from the file gives
  file mode: "job 'Clippy' exists on main and runs on every PR, but is NOT required"
  live mode: "'Clippy' is required LIVE but missing from .github/required-checks.txt"
Both exit 1; both restore to 0.

HONEST LIMIT, now in the artifact residual: a ruleset RESET is still not caught
by CI and cannot be, since no workflow can see the live setting. It is caught
the next time the live mode is run by hand. Closing that needs a PAT secret,
which is a repo-owner decision.

rivet=0 claim-check=0 gate-coverage=0 drift-self-test=0 drift-file=0
trailer-self-test=0 fmt=0.

Refs: FEAT-093

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>
avrabe added a commit that referenced this pull request Aug 27, 2026
… 7 -> 4

`implemented`/`proposed` count as NOT-yet-verified in the release gate, so a
shipped, green feature left there blocks its release indefinitely. These three
have shipped AND been verified, so leaving them proposed understates the release
just as promoting them early would overstate it.

Evidence for each, grounded rather than remembered:

  FEAT-087 (#162, 11/11 CI green) -- 3 oracles re-run on main just now:
    the tier-discrimination test, the tier-2 independence pin, and the
    module-scoped decision. Mutation-checked both directions when landed.
  FEAT-088 (#163, 11/11 CI green) -- the gate's --self-test PASSES and the
    real check PASSES on main, and it is wired into ci.yml (self-test before
    the real check). Mutation-checked against the real repo when landed.
  FEAT-090 (#166, 11/11 CI green) -- 5 oracles re-run on main just now,
    including the polarity test that dies only under the `&=` -> `|=` mutant.

NOT promoted, deliberately:
  FEAT-089 -- FILED, not built. The non-zero-fact work does not exist yet; its
    own AC#1 requires a red test that is still red by design.
  FEAT-064 -- AC3 closed by measurement in #164, but AC1 remains FALSIFIED
    (repaired by FEAT-077 only for uniquely-named functions). Closing one AC
    does not clear the artifact, and REQ-020 stays blocked behind it.
  FEAT-057, FEAT-065, REQ-021 -- unbuilt.

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

Refs: FEAT-087

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
… 7 -> 4

`implemented`/`proposed` count as NOT-yet-verified in the release gate, so a
shipped, green feature left there blocks its release indefinitely. These three
have shipped AND been verified, so leaving them proposed understates the release
just as promoting them early would overstate it.

Evidence for each, grounded rather than remembered:

  FEAT-087 (#162, 11/11 CI green) -- 3 oracles re-run on main just now:
    the tier-discrimination test, the tier-2 independence pin, and the
    module-scoped decision. Mutation-checked both directions when landed.
  FEAT-088 (#163, 11/11 CI green) -- the gate's --self-test PASSES and the
    real check PASSES on main, and it is wired into ci.yml (self-test before
    the real check). Mutation-checked against the real repo when landed.
  FEAT-090 (#166, 11/11 CI green) -- 5 oracles re-run on main just now,
    including the polarity test that dies only under the `&=` -> `|=` mutant.

NOT promoted, deliberately:
  FEAT-089 -- FILED, not built. The non-zero-fact work does not exist yet; its
    own AC#1 requires a red test that is still red by design.
  FEAT-064 -- AC3 closed by measurement in #164, but AC1 remains FALSIFIED
    (repaired by FEAT-077 only for uniquely-named functions). Closing one AC
    does not clear the artifact, and REQ-020 stays blocked behind it.
  FEAT-057, FEAT-065, REQ-021 -- unbuilt.

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

Refs: FEAT-087

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
… 7 -> 4

`implemented`/`proposed` count as NOT-yet-verified in the release gate, so a
shipped, green feature left there blocks its release indefinitely. These three
have shipped AND been verified, so leaving them proposed understates the release
just as promoting them early would overstate it.

Evidence for each, grounded rather than remembered:

  FEAT-087 (#162, 11/11 CI green) -- 3 oracles re-run on main just now:
    the tier-discrimination test, the tier-2 independence pin, and the
    module-scoped decision. Mutation-checked both directions when landed.
  FEAT-088 (#163, 11/11 CI green) -- the gate's --self-test PASSES and the
    real check PASSES on main, and it is wired into ci.yml (self-test before
    the real check). Mutation-checked against the real repo when landed.
  FEAT-090 (#166, 11/11 CI green) -- 5 oracles re-run on main just now,
    including the polarity test that dies only under the `&=` -> `|=` mutant.

NOT promoted, deliberately:
  FEAT-089 -- FILED, not built. The non-zero-fact work does not exist yet; its
    own AC#1 requires a red test that is still red by design.
  FEAT-064 -- AC3 closed by measurement in #164, but AC1 remains FALSIFIED
    (repaired by FEAT-077 only for uniquely-named functions). Closing one AC
    does not clear the artifact, and REQ-020 stays blocked behind it.
  FEAT-057, FEAT-065, REQ-021 -- unbuilt.

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

Refs: FEAT-087

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
… 7 -> 4 (#173)

`implemented`/`proposed` count as NOT-yet-verified in the release gate, so a
shipped, green feature left there blocks its release indefinitely. These three
have shipped AND been verified, so leaving them proposed understates the release
just as promoting them early would overstate it.

Evidence for each, grounded rather than remembered:

  FEAT-087 (#162, 11/11 CI green) -- 3 oracles re-run on main just now:
    the tier-discrimination test, the tier-2 independence pin, and the
    module-scoped decision. Mutation-checked both directions when landed.
  FEAT-088 (#163, 11/11 CI green) -- the gate's --self-test PASSES and the
    real check PASSES on main, and it is wired into ci.yml (self-test before
    the real check). Mutation-checked against the real repo when landed.
  FEAT-090 (#166, 11/11 CI green) -- 5 oracles re-run on main just now,
    including the polarity test that dies only under the `&=` -> `|=` mutant.

NOT promoted, deliberately:
  FEAT-089 -- FILED, not built. The non-zero-fact work does not exist yet; its
    own AC#1 requires a red test that is still red by design.
  FEAT-064 -- AC3 closed by measurement in #164, but AC1 remains FALSIFIED
    (repaired by FEAT-077 only for uniquely-named functions). Closing one AC
    does not clear the artifact, and REQ-020 stays blocked behind it.
  FEAT-057, FEAT-065, REQ-021 -- unbuilt.

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

Refs: FEAT-087

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

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