Skip to content

ci: bind the no-mistakes attestation to the current PR head - #46

Merged
kunchenguid merged 1 commit into
mainfrom
fm/tasks-axi-nm-headbind-r1
Aug 21, 2026
Merged

ci: bind the no-mistakes attestation to the current PR head#46
kunchenguid merged 1 commit into
mainfrom
fm/tasks-axi-nm-headbind-r1

Conversation

@kunchenguid

Copy link
Copy Markdown
Owner

What Changed

The Require no-mistakes gate parsed the no-mistakes-pipeline-attestation:v1 comment and required review/test/document = completed, but it only printed the attestation's head_sha - it never compared it to the PR's current head. A commit pushed directly after a no-mistakes run therefore passed the gate on a stale attestation.

This ports lavish-axi main's head-binding (PR #271) verbatim:

  • PR_HEAD_SHA: ${{ github.event.pull_request.head.sha }} added to the gate step's env:.
  • After the attestation payload parses, the gate extracts head_sha and fails with an ::error:: saying the attestation is STALE for the current head (a commit was pushed after the no-mistakes run; re-run git push no-mistakes to refresh it) unless it equals $PR_HEAD_SHA. Absent on either side fails closed too.
  • Everything else is preserved: this repo's triggers, paths-ignore, bot exemptions, job name, and the rest of the script. The gate script is now byte-identical to lavish-axi's; the only file-level difference remains this repo's paths-ignore list (no plugin.json).

This is the attestation contract: a synchronize event whose PR body was NOT rewritten by no-mistakes going red is the intended behavior, not a false positive.

Tests

test/workflows/no-mistakes-gate.test.ts (which extracts and executes the workflow's exact inline run: block) gains four head-binding cases, mirroring lavish's:

  • accepts an attestation whose head_sha is the PR's current head
  • rejects an attestation whose head_sha is not the current head (asserts the STALE error, the re-run hint, and both shas in the output)
  • fails closed when the attestation carries no head_sha at all
  • fails closed when the PR head sha is unavailable

runGate and attestation now take an optional head sha, defaulting to the existing HEAD_SHA constant, so every pre-existing case is unchanged.

Transcript

$ npx vitest run test/workflows/no-mistakes-gate.test.ts
 ✓ test/workflows/no-mistakes-gate.test.ts (21 tests) 418ms
 Test Files  1 passed (1)
      Tests  21 passed (21)

$ pnpm build
$ tsc

$ pnpm lint
$ eslint .

$ pnpm test
 Test Files  22 passed (22)
      Tests  451 passed (451)

$ pnpm run build:skill -- --check
skills/tasks-axi/SKILL.md is up to date.

Note

This is a direct PR for internal CI tooling, raised without the no-mistakes pipeline, so the advisory Require no-mistakes check will fail on it (no signature) - expected and non-blocking. Build/test/guard checks are the real signal.

@kunchenguid
kunchenguid merged commit 24ddd22 into main Aug 21, 2026
4 of 5 checks passed
yjuyjuy added a commit to yjuyjuy/tasks-axi that referenced this pull request Aug 24, 2026
…e no-mistakes gate to the shared action (#6)

* fix(cli): speed up standalone version queries (kunchenguid#34)

* perf(cli): answer --version through the axi-sdk-js fast path

Extract the package-version helper out of the heavy `src/cli.ts` graph into a
leaf `src/version.ts` (node builtins only), and rewrite `bin/tasks-axi.ts` to
answer a bare `-v`/`-V`/`--version` via `axi-sdk-js/fast-path`, dynamically
importing the command graph only for everything else. Bumps axi-sdk-js to
^0.1.10 for the `./fast-path` subpath export.

Version output is byte-identical and all other argv shapes still route through
`runAxiCli` unchanged. Guarded by a deterministic ESM loader module trace with
a negative control plus flag parity; no wall-clock assertion in CI.

* no-mistakes(document): Confirm fast-path docs and lint cleanliness

* no-mistakes: apply CI fixes

* chore(main): release tasks-axi 0.2.5 (kunchenguid#35)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* fix(cli): accept canonical Forgejo pull request URLs (kunchenguid#36)

* fix: accept canonical Forgejo pull request URLs as typed PR links

One classification seam (isPrUrl in src/pr-url.ts) now decides what
counts as a PR URL for prose link derivation, done/add --pr validation,
and public-followup pr_url deliverables: canonical GitHub
https://github.com/<owner>/<repo>/pull/<n> or Forgejo
https://<host>/<owner>/<repo>/pulls/<n> with a positive, no-leading-zero
number. Near misses (issue routes, singular/plural route confusion,
trailing slash, query/fragment, whitespace, userinfo, ports, encoded
separators, malformed segments) are rejected as --pr / pr_url values and
derive as doc links, never pr.

Fixes kunchenguid#19

* fix: validate pr links against the untrimmed input

Review follow-ups from pipeline run 01KZFA73D662DCSJ4HVWKW21QX: --pr values
and pr-kind addLinks are validated before any trim, so whitespace-padded
input is rejected instead of normalized. The literal NUL byte in
test/pr-url.test.ts is now written as a unicode source escape so git
treats the file as text; an embedded-space rejection case is added
alongside it.

* chore: remove committed no-mistakes evidence (now on orphan branch) (kunchenguid#39)

* chore: gitignore no-mistakes evidence dir (contributor safety) (kunchenguid#41)

* chore(agents): use @AGENTS.md import instead of CLAUDE.md symlink (kunchenguid#42)

Co-authored-by: Kun Chen <kun-1@kunchenguid.com>

* ci: require no-mistakes pipeline attestation in the gate (kunchenguid#45)

* ci: require no-mistakes pipeline attestation in the gate

* test: run the no-mistakes gate script on POSIX legs only

* ci: bind the no-mistakes attestation to the current PR head (kunchenguid#46)

* ci: migrate the no-mistakes gate to the shared composite action (kunchenguid#47)

Replace the inline gate `run:` block in
.github/workflows/no-mistakes-required.yml with a thin caller of
kunchenguid/no-mistakes/.github/actions/require-no-mistakes, pinned to an
immutable commit SHA. Enforcement logic and its tests now live upstream, so
this repository no longer carries a hand-copied script that can drift from
its siblings.

Drop `synchronize` from the pull_request trigger: the verdict is a pure
function of the PR body, and the pipeline pushes before it writes the
Pipeline section, so a push-triggered run pinned a failure to a head whose
body the same run was about to fix. This repo's ruleset is advisory with no
required status check, so dropping the trigger cannot wedge a merge.

Remove test/workflows/no-mistakes-gate.test.ts, which extracted and executed
the now-absent inline block, and point AGENTS.md at the shared action.

* fix: make the generated skill defer to live CLI guidance (kunchenguid#48)

* fix(skill): shrink SKILL.md to a CLI-deferring stub

Installed skills go stale when the npm package is bumped. Keep only
identity frontmatter plus pointers to live CLI help so regeneration
cannot re-inflate baked command docs.

Co-authored-by: Cursor <cursoragent@cursor.com>

* no-mistakes(review): Align skill documentation with minimal generator contract

* no-mistakes(document): Consolidate generated skill documentation

---------

Co-authored-by: Cursor <cursoragent@cursor.com>

* no-mistakes: apply CI fixes

---------

Co-authored-by: Kun Chen <3233006+kunchenguid@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Evelyn Scidmore <13389701+escidmore@users.noreply.github.com>
Co-authored-by: Kun Chen <kun-1@kunchenguid.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Chris Yuan <cyuan@hyfin.app>
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