Skip to content

fix(ci): pin cicd-suite lock at 0c1bc9f — the cure never reached a consumer - #35

Merged
hyperpolymath merged 1 commit into
mainfrom
fix/repin-lock-at-cured-composites
Sep 22, 2026
Merged

hyperpolymath merged 1 commit into
mainfrom
fix/repin-lock-at-cured-composites

Conversation

@hyperpolymath

Copy link
Copy Markdown
Owner

The cure was green here and inert everywhere else

fa71ac2 (#32) cured the composite -e kill. 0c1bc9f (#34) restored the
lockfile pins #28 dropped. Both merged green. Neither reached a single
consumer
, and nothing was red to say so.

pons-asinorum was repointed at 0c1bc9f (pons#26) and its estate audit still
died at Required Files Gate — 82 ms, silent, exit 1, 25 downstream gates
skipped. Identical to before the cure.

Why

The reusable invokes its gates by branch ref:

uses: hyperpolymath/cicd-suite/actions/required-files-check@main

A branch ref is trusted from the lockfile, and the runner executes the commit
the lockfile names
— not the branch tip. This lock pinned cicd-suite@main at
9adb3908, four commits back:

commit PR carried
0c1bc9f #34 lock pins restored
fa71ac2 #32 the -e cure (3 + 1 guards)
6ff6057 #31 linguist-check
3b4afaf #28 (the regression)

9adb3908 has 0 of those guards. So no SHA a consumer picks for the
reusable can reach a cured composite. The lock's @main entry is the real
gate, and re-pinning it is the actual delivery step — the one #31, #32 and #34
all skipped.

What this does

  1. Bumps dependencies['hyperpolymath/cicd-suite@main'].commit to 0c1bc9f.
    Ancestor-clean fast-forward (9adb3908 is an ancestor of 0c1bc9f); the
    transitive uses: list is unchanged, so dependencies: needs no other churn.
  2. Makes it impossible to forget again. tests/lock-transitive-closure.sh
    gains a third assertion: for any self-referencing branch pin, the actions/
    tree at the locked commit must equal HEAD's. On drift it names the files.
  3. shell-contract gains fetch-depth: 0 so the locked commit is present to
    compare against.

The house pattern for this is a follow-up "pin cicd-suite lock at <sha>"
commit — f8c8f4a, 4f9a7a4, 373714a all do exactly this. It has been
carried by memory, and memory dropped it three times running. Now it is a test.

Non-vacuity — twice

The assertion was written before the bump and caught the live defect, naming
all three drifted composites:

FAIL hyperpolymath/cicd-suite@main pins 9adb3908..., whose actions/ tree differs from HEAD
       actions/linguist-check/action.yml
       actions/required-files-check/action.yml
       actions/spdx-license-check/action.yml

And its first draft printed its header while checking nothing — an ERE sed
has no lazy quantifiers, so .git stayed on the repo name and no dependency key
ever matched. A header is not a check, so the block now carries its own
non-vacuity counter, separate from block 1's.

Local

tests/lock-transitive-closure.sh   PASS=9 FAIL=0
tests/composite-shell-contract.sh  PASS=7 FAIL=0   (mutant dies silently)

Acceptance

Composite shell contract green with the new assertion passing — and then
pons#26's audit re-measured. Per the standing owner ruling, the gates that have
been skipped rather than passing may now surface new findings; those become
issues with acceptance criteria, not blockers on this PR.

🤖 Generated with Claude Code

https://claude.ai/code/session_01WRvDivYwLSeVCJUrfjic3f

…g old gates

fa71ac2 (#32) cured the composite `-e` kill and 0c1bc9f (#34) restored the
lockfile's composite-reached pins. Both are green here. Both were inert for
every downstream consumer, and nothing was red to say so.

pons-asinorum's estate audit still died at Required Files Gate, 82ms, silently,
skipping 25 downstream gates — after being repointed at 0c1bc9f. The reason is
that the reusable invokes its composites by BRANCH ref:

    uses: hyperpolymath/cicd-suite/actions/required-files-check@main

A branch ref is trusted from the lockfile, and the runner executes THE COMMIT
THE LOCKFILE NAMES, not the branch tip. The lock pinned cicd-suite@main at
9adb390 — four commits back, with 0 of the three `-e` guards. So no SHA a
consumer chooses for the reusable can reach a cured composite; the lock's
`@main` entry is the real gate, and re-pinning it is the actual delivery step.

This bumps that pin to 0c1bc9f (an ancestor-clean fast-forward, transitive
`uses:` unchanged). It carries three composites the old pin lacked:

    actions/linguist-check/action.yml        (#31)
    actions/required-files-check/action.yml  (#32)
    actions/spdx-license-check/action.yml    (#32)

The house pattern is a follow-up "pin cicd-suite lock at <sha>" commit —
f8c8f4a, 4f9a7a4, 373714a all do exactly this. #31, #32 and #34 never got one.
Rather than rely on remembering, lock-transitive-closure.sh now asserts it: for
any self-referencing branch pin, the actions/ tree at the locked commit must
equal HEAD's, and it names the drifted files when it does not. `shell-contract`
gains `fetch-depth: 0` so the locked commit is present to compare against.

Non-vacuity, twice over. The assertion was written BEFORE the bump and caught
this defect live, naming all three files. And its first draft printed its header
while checking nothing — a sed without lazy-quantifier support left ".git" on
the repo name so no key matched — so the block now carries its own non-vacuity
counter. A header is not a check.

Local: lock-transitive-closure PASS=9 FAIL=0; composite-shell-contract PASS=7
FAIL=0 with its mutant killed.

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

coderabbitai Bot commented Sep 22, 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: a64b6e65-07dc-4261-baab-91dfa37b7776

📥 Commits

Reviewing files that changed from the base of the PR and between 0c1bc9f and 01a5004.

⛔ Files ignored due to path filters (1)
  • .github/workflows/actions.lock is excluded by !**/*.lock
📒 Files selected for processing (2)
  • .github/workflows/code-hygiene-self-test.yml
  • tests/lock-transitive-closure.sh
 ________________________________________________________________________________
< A bunny is never late, nor is he early, he reviews precisely when he means to. >
 --------------------------------------------------------------------------------
  \
   \   \
        \ /\
        ( )
      .( o ).
✨ Finishing Touches
📝 Generate docstrings
  • Commit to this branch
  • 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.

@sonarqubecloud

Copy link
Copy Markdown

@hyperpolymath
hyperpolymath merged commit 6cb08dd into main Sep 22, 2026
7 of 8 checks passed
@hyperpolymath
hyperpolymath deleted the fix/repin-lock-at-cured-composites branch September 22, 2026 21:47
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