Skip to content

FEAT-093 refinement: close the window where main goes red (scry#130) - #175

Merged
avrabe merged 1 commit into
mainfrom
feat-093b-no-red-window
Aug 27, 2026
Merged

FEAT-093 refinement: close the window where main goes red (scry#130)#175
avrabe merged 1 commit into
mainfrom
feat-093b-no-red-window

Conversation

@avrabe

@avrabe avrabe commented Aug 27, 2026

Copy link
Copy Markdown
Contributor

Operating the drift gate exposed a hole in the procedure it enforces — and the fix is
structural rather than another comment.

The hole

Landing a job while its required-checks.txt entry arrives in a separate PR leaves
main and every open PR red until that follow-up merges.

#167 did exactly that. The moment it merged, main failed its own drift gate, and
#168/#169 went red on a file they had no way to fix — they were blocked on #170.

The fix

The gate now fails a PR that adds a requirable job which is not in
required-checks.txt
, so the job and its entry ship together and the window doesn't
exist.

Verified on the real repo, both directions:

probe result
job added, no file entry exit 1, naming it and quoting the instruction
same job with its entry exit 0 — pending the ruleset update only
restored exit 0

Plus two new self-test cases covering exactly those (7 total).

The procedure, now with no red window

  1. in the SAME PR: add the job and its required-checks.txt entry
  2. after it merges: add the context to the ruleset (instant, via the API)
  3. rebase every open PR

Steps 2 and 3 were each learned by getting them wrong.

★ The asymmetry that makes the ordering matter: a required context whose job doesn't
exist
deadlocks everything — the check can never report. A job whose context isn't
required
deadlocks nothing; it's merely unenforced. So the job must always lead and
the context must always follow, never the reverse.

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

🤖 Generated with Claude Code

https://claude.ai/code/session_01KkNzkNYzPh7366DkNijeNc

Operating the gate exposed a hole in the procedure it enforces. Landing a job
while its required-checks.txt entry arrives in a SEPARATE PR leaves main AND
every open PR red until that follow-up merges. #167 did exactly that: the moment
it merged, main failed its own drift gate and #168/#169 went red on a file they
could not fix.

The fix is structural, not another comment. The gate now FAILS a PR that adds a
requirable job which is not in required-checks.txt, so the job and its entry
ship together and the window does not exist.

VERIFIED ON THE REAL REPO, both directions:
  job added, no file entry -> exit 1, naming it and quoting the instruction
  same job WITH its entry   -> exit 0 (pending the ruleset update only)
  restored                  -> exit 0
Plus two new self-test cases covering exactly those, 7 in total.

The procedure in ci.yml is now three steps with no red window:
  1. in the SAME PR: add the job AND its required-checks.txt entry
  2. after merge: add the context to the ruleset (instant, via the API)
  3. rebase every open PR

Steps 2 and 3 were each learned by getting them wrong. A required context whose
job does not exist deadlocks everything; a job whose context does not exist
deadlocks nothing. The asymmetry is why the ordering matters.

drift-self-test=0 drift-file=0 gate-coverage=0 trailer-self-test=0
claim-check=0 rivet=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
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>
@github-actions

Copy link
Copy Markdown

📐 rivet artifact delta

PR: #175 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-093
  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 02f6c99 into main Aug 27, 2026
13 checks passed
@avrabe
avrabe deleted the feat-093b-no-red-window branch August 27, 2026 07:54
avrabe added a commit that referenced this pull request Aug 27, 2026
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>
avrabe added a commit that referenced this pull request Aug 27, 2026
…mplete

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