Skip to content

Fix/rollup neutral skipped pass - #125

Merged
hyperpolymath merged 7 commits into
mainfrom
fix/rollup-neutral-skipped-pass
Oct 3, 2026
Merged

hyperpolymath merged 7 commits into
mainfrom
fix/rollup-neutral-skipped-pass

Conversation

@hyperpolymath

Copy link
Copy Markdown
Owner

Summary

Changes

RSR Quality Checklist

Required

  • Tests pass (just test or equivalent)
  • Code is formatted (just fmt or equivalent)
  • Linter is clean (no new warnings or errors)
  • No banned language patterns (no TypeScript, no npm/bun, no Go/Python)
  • No unsafe blocks without // SAFETY: comments
  • No banned functions (believe_me, unsafeCoerce, Obj.magic, Admitted, sorry)
  • SPDX license headers present on all new/modified source files
  • No secrets, credentials, or .env files included

As Applicable

  • .machine_readable/descriptiles/STATE.a2ml updated (if project state changed)
  • .machine_readable/descriptiles/ECOSYSTEM.a2ml updated (if integrations changed)
  • .machine_readable/descriptiles/META.a2ml updated (if architectural decisions changed)
  • Documentation updated for user-facing changes
  • TOPOLOGY.md updated (if architecture changed)
  • CHANGELOG or release notes updated
  • New dependencies reviewed for license compatibility (MPL-2.0 / MPL-2.0)
  • ABI/FFI changes validated (src/interface/abi/ and src/interface/ffi/ consistent)

Testing

Screenshots

hyperpolymath and others added 6 commits September 30, 2026 11:41
parse_rollup mapped SKIPPED and NEUTRAL conclusions to Failed, so a
required check GitHub's ruleset treats as met was reported as a failing
gate. Owner ruling 2026-09-30: model it as a distinct CheckRun::Skipped
that satisfies the ruleset but carries no evidence.

- gate.rs: new Skipped variant; is_satisfied accepts Passed | Skipped;
  Gate::evidence_free() lists the satisfied-without-evidence checks.
- fetch.rs: SKIPPED | NEUTRAL => Skipped.
- spark/gate_machine: mirrored via Satisfies(); gnatprove --level=2
  proves 10/10. Mutant (body reverted to `/= Passed`) fails the loop
  invariant; Rust mutant (is_satisfied = Passed only) fails
  a_skipped_check_satisfies_but_is_listed_as_evidence_free.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0136eszqrQ53Kj7aBH1D4rXK
…it 5 if not) (#119)

Adds `squabble verify-satisfied <owner>/<repo> <pr>`, one implementation
of "is this PR actually done?" for the D2 Stop hook and for humans. JSON
goes to stdout and a readable list to stderr. **Exit 5** means agent
work remains; 0/2/3/4 keep their existing meanings.

> ⚠ **Stacked on #114** (base `fix/rollup-neutral-skipped-pass`). When
#114 merges, retarget this PR to `main` before merging. Otherwise GitHub
closes it when the base branch is deleted.

## What counts as done

| # | Condition | Agent item when unmet |
|---|---|---|
| 1 | Not `CONFLICTING`; mergeability computed; not draft; not `BEHIND`
| resolve in-file / re-run / mark ready / update |
| 2 | No required context `Failed` or `Missing`. `Pending` is fine;
skipped/neutral satisfy but are listed as **evidence-free** | fix the
check or the ruleset |
| 2b | No **red non-required** check, unless a PR-body line names it
**with an issue link** (the 2026-09-15 ruling: a finding becomes an
issue, not a blocker, but someone must have looked). An acknowledged red
moves to notes and is still shown | fix it, or file an issue and name it
in the body |
| 3 | Zero unresolved review threads (outdated ones count); no
review-bot `CHANGES_REQUESTED`; no review bot still pending | act on or
resolve; wait for the bot |
| 4 | Code-scanning alerts the PR introduces | **not evaluated yet** and
said so in `notes` → #117 |
| 5+6 | Automerge armed with SQUASH wherever GitHub allows arming | arm
/ re-arm with squash |
| 7 | Every `[.rules[].type]` on the base, not just required checks.
`merge_queue` refuses rather than passing vacuously; unknown types go to
notes | — |

**Held by a human** (listed, not agent work): human approval, a required
deployment, and a CLEAN PR, which GitHub refuses to arm automerge on, so
it waits for a human merge. Change requests made only by review bots are
agent work, not human-held.

## Shared rules, so `fetch` and `verify-satisfied` can't disagree
- `CheckRun::from_github` maps rollup vocabulary. An unknown completed
conclusion is `Failed`.
- `CheckRun::for_context` decides a required context from **all**
same-named runs, and the worst run wins. Both readers used first-match
before, so a passing twin could mask a failing one depending on rollup
order.

## Evidence
- Tests: core 103, cli 44, forge 16, plus the rest, all green. Mutants
killed: first-match ordering (2 red), the non-required loop disabled
(1), the link requirement dropped (1), the context match dropped (1),
digit-after-`#` dropped (1), `ctx_done = true` in pagination (2).
- **Live control 1, both arms** (#114): with no acknowledgement it exits
**5** naming `rust-ci / Cargo check + clippy + fmt`. After a body line
citing #116 it exits **0**, and the acknowledged red is still shown in
notes.
- **Live control 3** (standards#1076): exit 5, correctly (Debt ratchet
red on main; `SonarCloud Code Analysis` required but never emitted →
standards#1081).
- **Live control 4** (hypatia#883, another session's PR, read only):
exit 5 with the same 5 unresolved threads an independent GraphQL count
finds.
- The "armed + required pending ⇒ exit 0" arm is **unit-tested only**; I
found no live PR in that state to exercise it.

## Not in this PR
- No SPARK mirror for D1. `done.rs` is a policy table over forge facts
with no state machine or invariant; the proof obligations live in
`gate_machine`, which #114 mirrors. (#115 tracks getting gnatprove into
CI at all.)
- Check 4 and inherited-vs-new red checks → #117. The positive control
is launch-scaffolder#46's `hardcoded_tmp` alert.
- `~/.claude/hooks/apps-ack-gate.sh` is a second implementation of this
question → #118.

## Inherited red
- `rust-ci / Cargo check + clippy + fmt` is red on `main` (b12657f):
unformatted `squabble-fight`, a `needless_lifetimes` in
`workflows.rs:628`, and a dead `run_with_greens`. Cured by #116; merge
order **#116 → #114 → this**. Checked locally with #116's fix applied
temporarily: this branch's own code passes `clippy -D warnings` and
`rustfmt --check`.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

https://claude.ai/code/session_0136eszqrQ53Kj7aBH1D4rXK

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Resolve crates/squabble-cli/src/main.rs as a union: main added
`board`/`inbox-sweep` (exit 6, #123/#124) where this branch added
`verify-satisfied` (exit 5, #119). Both modules, dispatch arms, usage
lines and exit-code docs are kept; codes listed in numeric order.

cargo fmt --check, clippy -D warnings and cargo test --workspace (279) pass.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01W5CoaksP2Bg21HpDCgFgwS
Hypatia expect_in_hot_path (code-scanning #74, #75) on PR #114. Both were
guarded by an invariant, so neither could panic. Bind owner/name from the
split already validated in argument parsing, and take the head PR out of
the Option the line above fills. Behaviour unchanged; 279 tests pass.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01W5CoaksP2Bg21HpDCgFgwS
@coderabbitai

coderabbitai Bot commented Oct 3, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

Navigate logical layers of code changes, visualize relationships, and explore their blast radius.

✨ Finishing Touches
📝 Generate docstrings
  • Commit to this branch
  • Create a new PR
  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Signed-off-by: Jonathan D.A. Jewell <6759885+hyperpolymath@users.noreply.github.com>
@hyperpolymath
hyperpolymath merged commit a4cd088 into main Oct 3, 2026
39 of 41 checks passed
@hyperpolymath
hyperpolymath deleted the fix/rollup-neutral-skipped-pass branch October 3, 2026 10:14
@sonarqubecloud

sonarqubecloud Bot commented Oct 3, 2026

Copy link
Copy Markdown

@coderabbitai

coderabbitai Bot commented Oct 3, 2026

Copy link
Copy Markdown
Contributor

Autopilot could not be updated. Open Coding to check access and billing.

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