Skip to content

test+docs: close the gap in #18's fix, refresh README drift named in #19 - #60

Merged
forkwright merged 2 commits into
mainfrom
fix/issue-18-19-test-and-readme-drift
Aug 26, 2026
Merged

test+docs: close the gap in #18's fix, refresh README drift named in #19#60
forkwright merged 2 commits into
mainfrom
fix/issue-18-19-test-and-readme-drift

Conversation

@forkwright

@forkwrightforkwright commented Aug 26, 2026

Copy link
Copy Markdown
Owner

Finding

Two stale-issue findings against this repo:

  1. Authenticate release automation; never waive required gates by branch name #18 (release-please branch-name-prefix trusted independently of PR author) is fixed in the tree by PR fix(gate): require a Bot author type alongside the release-please branch shape #42 (08a0bad) — both gate-attestation.yml and hybrid-gate.yml now require user.type == 'Bot' alongside the branch shape. But Authenticate release automation; never waive required gates by branch name #18's own "Required mechanism" also asked for "adversarial workflow tests for a human/fork PR using the release-please prefix" and "verify that a spoofed-prefix fixture fails the emitted required check" — nothing did that. No test in tests/ touches this at all.
  2. Make reusable-workflow publication a protected executable release boundary #19 cited a main branch-protection 404 that is now stale (main is protected: true with required_pull_request_reviews.required_approving_review_count = 1; required_status_checks still 404s, unchanged), and named specific README drift: a nonexistent gate-attestationrunner input, 4 of 6 pinned actions on stale versions, a caller-pattern section covering 4 of 10 reusables, and a fleet-rollout list missing most of the fleet's actual converts.

Evidence

  • gh pr view 42 --json mergedAt,mergeCommit → merged 2026-08-17, 08a0badc7eeb726d59d8a5c419b816693e0305df. gate-attestation.yml:38 and hybrid-gate.yml:456-461 both gate the branch-shape waiver on user.type == 'Bot'; hybrid-gate.yml's check-trailer step (202-256) has no branch bypass at all.
  • No file under tests/ referenced release-please, PR_AUTHOR_TYPE, or spoof before this PR (grep -rln empty).
  • tests/release-please-waiver.sh extracts the live if: expression from gate-attestation.yml (translated + evaluated, not hand-copied) and the live run: block from hybrid-gate.yml's ai-attribution step, and drives both against a human/fork PR on a release-please--branches--* branch. All 12 cases pass. Mutation-checked: reverting the extracted expression to the pre-fix(gate): require a Bot author type alongside the release-please branch shape #42 shape (branch shape alone) flips the spoofed case to waived=True, confirming the fixture actually catches the regression it names.
  • gh api repos/forkwright/.github/branches/main/protection/required_pull_request_reviewsrequired_approving_review_count: 1. .../protection/required_status_checks → 404 "Required status checks not enabled".
  • actionlint.yml:34-37 still pipes curl straight into tar, unchanged (line numbers shifted slightly from Make reusable-workflow publication a protected executable release boundary #19's original 26-32 citation as the file grew).
  • README pin table vs actual uses: lines (13 actions/checkout sites, all v7.0.1@3d3c42e5...; README said v6@de0fac2e...; same story for actions-rust-lang/setup-rust-toolchain, EmbarkStudios/cargo-deny-action, actions/stale, and Swatinem/rust-cache's SHA — only googleapis/release-please-action matched).
  • gate-attestation.yml:6 is workflow_call: {} — zero inputs — while README documented a runner input for it.
  • GitHub code search ("forkwright/.github/.github/workflows" org:forkwright, filtered to .github/workflows/ paths) finds 18 repos currently consuming a reusable from this repo; the README's "Remaining fleet rollout" named 12 repos total (both lists combined) and omitted koinon, mneme, sphragis, zetesis, typikon, thumos, heurema, gnomon entirely.
  • README's "Visibility requirement" section named theatron and logismos as private-repo beneficiaries of this repo staying public; both are public (gh repo list --json isPrivate). gnomon is private and genuinely consumes gate-attestation + release-please per the same code-search query.

Why this matters

A checker never shown failing is not a checker — #18's fix had no regression test, so a future edit that reintroduces the branch-only trust (or narrows the user.type check) has nothing to catch it before it ships. And a README that is the CI-authoring repo's own onboarding doc, read stale, sends every new consumer to copy a runner: input that silently does nothing and to trust action pins two majors behind what's actually running.

Desired correction

  • tests/release-please-waiver.sh: adversarial fixture for Authenticate release automation; never waive required gates by branch name #18, extracting and driving the live workflow logic rather than a hand-copied description of it.
  • README.md: regenerated Workflow inputs / Pinned action versions / Fleet rollout sections, scripts/render_readme_tables.py to keep regenerating them, and the two caller-pattern/visibility-requirement inaccuracies fixed inline.

Done when:bash tests/release-please-waiver.sh exits 0 (verified above) and README's three generated sections match python3 scripts/render_readme_tables.py's current output (verified above, this PR's docs commit IS that splice).

Not in this PR

Closes#18. Refs #19 (evidence refreshed, kept open -- see comment on #19).

forkwright added 2 commits August 26, 2026 14:41
#18's fix (PR #42) paired the release-please branch shape with a
user.type == 'Bot' check in both gate-attestation.yml and hybrid-gate.yml,
but nothing exercised it -- actionlint checks the workflow's shape, not
what the expression or the shell decides for a given author, and #19
named exactly this gap ("no fixture caller proving ... adversarial cases
such as the branch-prefix bypass in #18").
Extracts the live if-expression and run-block text from both workflows
(never a hand-copied duplicate, so a future edit is what gets judged, not
a description of it) and drives each against a human/fork PR using the
release-please branch prefix. Verified against the actual regression: a
scratch copy of the pre-#42 if-expression (branch shape alone) makes the
spoofed case evaluate to waived=True, so this fixture would have caught it.
…tree
#19 named this repo's README as a defect in itself: a nonexistent
gate-attestation `runner` input, four of six action pins on a stale
version (actions/checkout v6 vs the v7.0.1 every workflow actually pins,
setup-rust-toolchain, cargo-deny-action, actions/stale likewise), a
caller-pattern section covering 4 of the 10 consumer-facing reusables,
and a fleet-rollout list that named 12 repos while a live code-search
shows 18 already converted with zero entries for most of them (koinon,
mneme, sphragis, zetesis, typikon, thumos, heurema, gnomon among them).
A hand-typed table describing a workflow file is a second copy of that
file, free to diverge invisibly the moment either side changes without
the other -- which is exactly what happened here. scripts/render_readme_tables.py
reads the workflow_call blocks and uses: lines directly and (best-effort,
network-dependent) the org via GitHub code search, and prints the three
tables for splicing back in. This commit is one such splice; re-run the
script and re-splice whenever the tree or the fleet's adoption moves.
Also fixes the visibility-requirement section's example, which named
theatron and logismos as the private consumers this repo's public
visibility unblocks -- both are public. gnomon is private and genuinely
consumes gate-attestation + release-please today per the same query.
@forkwright
forkwright merged commit 8b8bef5 into mainAug 26, 2026
2 checks passed
@forkwright
forkwright deleted the fix/issue-18-19-test-and-readme-drift branch August 26, 2026 19:52
Sign up for freeto 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.

Authenticate release automation; never waive required gates by branch name

1 participant

@forkwright