Skip to content

Coderabbit/changes/233fc4bc - #109

Merged
hyperpolymath merged 6 commits into
mainfrom
coderabbit/changes/233fc4bc
Sep 26, 2026
Merged

hyperpolymath merged 6 commits into
mainfrom
coderabbit/changes/233fc4bc

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 5 commits September 22, 2026 12:30
CI in this repository has been silently dead: `.github/workflows/actions.lock`
drifted from the workflow YAML, and GitHub refuses such a run at startup —
zero jobs are created and the run reports only "This run likely failed because
of a workflow file issue."

Three changes:

* `actions.lock` regenerated with
  `gh actions-lock --no-migrate-local-actions --no-narrow --no-interactive`,
  which repaired the step-level ref `step-security/harden-runner`.
  `--no-migrate-local-actions` is mandatory: fix mode otherwise rewrites
  `uses: ./…` to the invalid `uses: $/…`, which itself causes startup death.

* Six job-level reusable-workflow refs added to `actions.lock` by hand.
  `gh actions-lock` v0.1.6 cannot see a job-level `uses:` (upstream #129), so
  it can neither report nor repair these.

* `scripts/check-lock-sync.sh` + `.github/workflows/lock-sync-gate.yml` close
  the recurrence. Dependabot rewrites `uses:` refs and cannot touch the
  lockfile, so a grouped actions update re-breaks the repository on its next
  run. The gate fails such a pull request before it merges. It carries no
  `uses:` of its own — it checks out via git in a `run:` step — so it cannot be
  killed by the very desync it detects, and it has no `paths:` filter, so it
  cannot deadlock a ruleset that requires it.

Verified before commit: all three mutants killed (a deleted step-level entry, a
deleted job-level entry, an injected `$/` rewrite), positive control clean,
`gh actions-lock --verify-local` clean, and only these three files modified.

Refs: hyperpolymath/standards#968

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X3hgXxWm6umMgZkjYyHnnm
Listing a ref under `workflows:` without a matching record under
`dependencies:` produces an UNRESOLVABLE lockfile, and GitHub rejects the run at
startup exactly as a desync does.

Measured on this pull request: `hypatia-scan`, `rust-ci` and `secret-scanner`
were green on `main` on 2026-09-21 and went `startup_failure` with jobs=0 on the
previous commit here, which listed their job-level refs but supplied no records.
The `dependencies:` section is the lockfile's resolution table, not commentary.

`gh actions-lock` v0.1.6 writes neither half for a job-level `uses:` (upstream
#129) and will not backfill a record for a key it did not write, so both halves
are supplied by hand. The nested `uses:` list is the sorted union of the called
reusable file's own pinned refs at that ref, normalised to OWNER/REPO@REF —
the lockfile schema rejects a subpath such as
`github/codeql-action/upload-sarif@…`.

Verified: `scripts/check-lock-sync.sh` clean, `gh actions-lock --verify-local`
clean (it was rc=2 on the un-normalised form), regeneration idempotent, and only
`actions.lock` modified.

Refs: hyperpolymath/standards#968

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X3hgXxWm6umMgZkjYyHnnm
`gh actions-lock` stamps this line on every workflow it scans. Committing it
keeps the working tree clean on subsequent runs.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X3hgXxWm6umMgZkjYyHnnm
Adds top-level `dependencies:` records for the 11 refs that appeared only
inside another record's nested `uses:` list, leaving the lockfile with zero
dangling edges.

MEASURED on this PR: GitHub rejects a run at startup (jobs=0, "This run
likely failed because of a workflow file issue") when the lockfile names a ref
it cannot resolve to a record. Governance, Hypatia Security Scan, Rust CI and
Secret Scanner all ran with jobs on `pull_request` on 2026-09-21 and went
startup_failure on fe22bbc (workflows: entry, no record) and again on cfadcf9
(record present, but its nested uses: were themselves unrecorded). Both
commits left a dangling edge; only its class differed.

metadatastician/burble's working lockfile is the control: 11 nested refs,
49 records, 0 unrecorded. This brings cicd-squabbler to the same shape.

Leaf records carry no nested `uses:`, so closure is reached in a single pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X3hgXxWm6umMgZkjYyHnnm
…t was blind to

The gate shipped in this PR was GREEN on two commits of this very branch that
GitHub refused to start. Measured here, 2026-09-22:

  commit    dangling-edge class                                result
  fe22bbc   workflows: -> dependencies: (ref listed, no record)  4 workflows startup_failure, jobs=0
  cfadcf9   dependencies: -> dependencies: (record added, its
            own nested uses: unrecorded)                        the same 4 still startup_failure
  5286aa5   none - transitively closed                          0 startup_failure, all 17 runs create jobs

At fe22bbc AND cfadcf9 check-lock-sync.sh exited 0, `gh actions-lock
--verify-local` exited 0, and the Lock Sync Gate reported green while four
workflows were dead. Every local gate was green on a fatal commit.

That is the guard/consumer trap: the gate asked "is every uses: locked?" while
GitHub asks "is every locked ref RESOLVABLE?". The asymmetry is counter-intuitive
and is what makes the new clause mandatory:

  * a job-level ref ABSENT from the lockfile entirely is HARMLESS;
  * a ref PRESENT in the lockfile but unresolvable is FATAL.

So adding entries without closing them is strictly worse than adding nothing.
Clause 1 demands entries be added; only the new clause 3 makes that demand safe.
Shipping clause 1 alone actively steers a developer into the fatal state:
Dependabot bumps a job-level ref -> clause 1 reds -> `gh actions-lock` will not
backfill a job-level key it did not write -> the developer hand-adds the
workflows: entry to go green -> no dependencies: record -> CI dies silently with
the gate still green.

Clause 3: every ref named anywhere in the lockfile must resolve to a top-level
dependencies: record. Closure terminates in one pass because a leaf record may
legally omit the nested uses: key, so adding leaves introduces no new edges.

Also require an awk with 3-argument match() (a GNU extension) and probe for it
rather than trusting the name: mawk is the Debian/Ubuntu default `awk`, and a
silent parse failure here would read as a clean pass - the exact failure mode
this script exists to prevent.

Regression-tested against the real trees, not synthetic mutants: red on fe22bbc
(2 edges) and cfadcf9 (11 edges), green on 5286aa5. Mutant: deleting one leaf
record is detected, with a before/after assertion that the deletion applied.

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

coderabbitai Bot commented Sep 26, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

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

Note

Currently processing new changes in this PR. This may take a few minutes, please wait...

⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Advanced

Run ID: 2bad6e12-99e8-4fa0-af4a-fbebb6470673

📥 Commits

Reviewing files that changed from the base of the PR and between d4f963b and 8aa756e.

⛔ Files ignored due to path filters (1)
  • .github/workflows/actions.lock is excluded by !**/*.lock
📒 Files selected for processing (2)
  • .github/workflows/lock-sync-gate.yml
  • scripts/check-lock-sync.sh
 _____________________
< 🧯 Bug extinguished. >
 ---------------------
  \
   \   (\__/)
       (•ㅅ•)
       /   づ
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • 🔴 Error committing to branch - (🔄 Check to retry)
  • Create a new PR

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 c56bcc1 into main Sep 26, 2026
41 of 47 checks passed
@hyperpolymath
hyperpolymath deleted the coderabbit/changes/233fc4bc branch September 26, 2026 10:50
@coderabbitai

coderabbitai Bot commented Sep 26, 2026

Copy link
Copy Markdown
Contributor

❌ Failed to create Coding Agent finishing-touch task. Please try again.

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