Skip to content

ci: repin ci-workflows to v0.58.0 - #8800

Merged
kyle-sexton merged 10 commits into
mainfrom
ci/repin-ci-workflows-v0.56.0
Oct 21, 2026
Merged

kyle-sexton merged 10 commits into
mainfrom
ci/repin-ci-workflows-v0.56.0

Conversation

@kyle-sexton

@kyle-sexton kyle-sexton commented Oct 21, 2026 •

Copy link
Copy Markdown
Member

Refs: melodic-software/ci-workflows#818
Refs: melodic-software/ci-workflows#819
Refs: melodic-software/ci-workflows#782

Summary

This moves the two locally owned review lane callers to v0.55.0 (see below). The other hand-maintained melodic-software/ci-workflows composite pins move to v0.58.0 (5e18f3d6cebd6fa5e66b0941ee0f7ed6ba288d6c). The two reusable intake callers, intake-triage.yml and intake-label-needs-triage.yml, stay at v0.56.0 (1bb8953) until the standards runner policy approves v0.58.0 contracts for them.

The PR also applies what the callers need from each release in between:

  • pr-verify now hands the judgment to the subscription job on run-claude-cli's new handoff output.
  • Its subscription lane record goes back to the plain pr-verify lane name, with the reason in fallback-reason.
  • The intake-reenter.yml "Accepted exposure" paragraph is updated for the trusted-comment filter (ci-workflows#782 / #830).
  • 2e08ec6 (the test-bash leg timeout raise) is reverted: the owner's rule is to make a slow job faster or split it, and fix(planning): run the shared browser suites 6 at a time under CI #8840 did that.

Fix

Pins moved:

File From To
.github/workflows/pr-require-checks.yml (21 composite pins, check-managed-files among them, and the markdownlint npx cache key) v0.39.8 594987a v0.58.0
.github/workflows/pr-verify.yml (run-claude-cli, apply-claude-managed-settings, report-lane-outcome) v0.54.0 7b36242 v0.58.0
.github/workflows/pr-run-activity-read.yml, pr-run-activity-write.yml (report-lane-outcome) v0.43.0 64fd515 v0.58.0
.github/workflows/maintenance-audit-test-selection.yml (shellcheck) v0.39.3 ab83b01 v0.58.0
.github/workflows/intake-triage.yml v0.54.0 7b36242 v0.56.0
.github/workflows/intake-label-needs-triage.yml v0.42.0 182aca3 v0.56.0

Changes the callers needed, v0.39.4 through v0.58.0:

  • run-claude-cli defaults cli-version to latest (it was 2.1.304). pr-verify passes no cli-version, so the verifier now runs the newest Claude Code release. The action's npm-signature and GPG-manifest checks still verify it (#819). .github/scripts/pr-verify/probe/replay.mjs records RUN_CLAUDE_CLI_PIN = 5e18f3d6… and CLI_VERSION = latest. A live replay resolves latest with npm view @anthropic-ai/claude-code version, as lane.cjs does, and refuses a local CLI that differs. cliArgs and legEnv in lane.cjs are byte-identical between 7b36242 and 5e18f3d6, and apply-claude-managed-settings is unchanged.

  • New handoff output on run-claude-cli (v0.57.0 #840, narrowed in v0.58.0 #841):

    • It is true only when the key leg ended in a credit stop, or in class auth with API status 401 or 402.
    • A 403 gives false, and the output is empty when the step failed before the leg ran.

    pr-verify now follows ci-workflows' intake-triage.yml at v0.58.0:

    • check-intent outputs handoff.
    • "Check the key leg", the key report's if, and the check-intent-subscription job's if key on handoff == 'true' instead of lane-class == 'credit-stop'.
    • The key-leg warning tells a refused key (replace the secret) apart from a credit stop (rotate one in).
    • A 403 hands nothing off and fails the key job.
    • known-failure-class is unchanged: a credit stop reports as rate-limit, auth as auth.
  • report-lane-outcome fallback-reason (#834; v0.57.0 adds auth). The subscription job's report no longer builds the long lane: string, which worked around ci-workflows#806, fixed in v0.55.0. It passes lane: pr-verify and a fallback-reason of credit-stop, auth or no-key, using the same expression as intake-triage. docs/conventions/pr-pipeline/README.md (Funding) and a pr-pipeline changelog fragment describe the new rule.

  • run-claude-cli runs one leg per invocation (#803, v0.54.0). pr-verify already uses the two-job pattern from feat(pr-pipeline): run pr-verify's model on the key first and the subscription token only on a credit stop #8577.

  • report-lane-outcome emits install-failed and no-execution (#813, v0.55.0; install-failed is newer than the v0.43.0 pin). .github/actions/report-check-run/lane-record.mjs drops the lane record for any class outside its allowlist, so a pr-run-activity run that left no execution file would have lost its record. Both classes are added, with a test that fails without the change.

  • aggregate-results finds its own gate job by job.check_run_id and step name (#814). ci-status now passes step-name: Aggregate lane results, as ci-workflows' own ci-status does.

  • ci-status waits out GitHub API rate limits (#833). Two 60 s waits, the retries and the 90 s re-run wait add up to about four minutes, so ci-status timeout-minutes goes from 3 to 5, as feat(toolchain): add lychee-offline to cross-cutting ecosystem default #833 sets in its own workflow and README.

  • check-managed-files checks each queued PR's own diff in a merge group (#823). feat(planning): add incumbent mode to devils-advocate #823 named the job comment saying a merge group "passes" as stale at this bump, so it is rewritten. The job already grants pull-requests: read, which that mode needs.

  • aggregate-results accepts a carried writer only from a full run (#826). No caller change is needed: a full run here runs many jobs, which job_shape reads as full, and its 12 jobs fit the per_page=100 jobs read.

  • The markdownlint default moves to 0.23.3 (#809). The npx cache key is keyed on the composite pin, so it now names 5e18f3d6.

  • intake-triage (#821, #830): caller inputs, secrets and the contents: read / issues: write grant are unchanged. The trusted-comment filter reads allowed-author-ids, which this caller already fills from the trusted-actor list (human-ids, which includes 153232337), and allowed-bot-sender-ids.

  • The rest are additive, optional inputs: check-contract issue-ref-pattern and rate-limit-wait-seconds, and report-lane-outcome fallback-reason, install-outcome and known-failure-class. A merge_group path was added to check-contract, aggregate-results and gitleaks.

Re-verified hand-maintained notes: aggregate-results and check-machine-paths have no diff between 1bb8953 and 5e18f3d6, so the contract-only claim holds. The pin notes in README.md and scripts/check-docs-only-gate.sh move to v0.58.0, dated 2026-10-21.

intake-reenter.yml: the "Accepted exposure" paragraph now says what the triage run passes the model:

  • Comments reach the model only from allowed-author-ids / allowed-bot-sender-ids authors, and never the lane's own comment.
  • The title and body still reach the model and stay untrusted data.
  • The model holds no GitHub token and only Read, Grep and Glob, and a job with no model applies the output.

The sentence saying this work belonged in ci-workflows is removed, because #830 did it.

Review lane callers (locally owned), pinned to v0.55.0

.github/workflows/pr-review-hosted.yml and .github/workflows/pr-review-security-hosted.yml are locally-owned for this repository in the standards distribution/sync-manifest.yml (claude-review-hosted-caller, claude-security-review-hosted-caller), and their headers say so. Both move from v0.48.0 (96b50d4) to v0.55.0 (3a2c748fdef9cfb9ceec5a66289e21842189689f). Standards already holds approved runner contracts for both reusables at 3a2c748. The local resolve-model, kill-switch and model-args wiring stays as it is.

What the callers need from v0.48.0 to v0.55.0:

  • #828, closing-issue author trust: pr-review.yml gains allowed-author-ids, which defaults to empty. When it is empty, every same-repository closing issue written by a person becomes a placeholder. The code-review caller now passes allowed-author-ids: '153232337', the human entry of .github/standards/trusted-actors/trusted-actors.json, with the comment from standards components/claude-lanes-hosted/claude-review.yml. The comment's sentence about trusted-actors.test.mjs is left out, because that test does not cover this file. pr-review-security.yml has no such input, so the security caller gets nothing new.
  • No caller change is needed for the rest:
    • #818 (no persisted checkout credential) and #812 (drop the credential strip step) change only the reusables' own steps.
    • #796 (fail closed when the bubblewrap sandbox cannot start), #813 and #780 add sandbox-unavailable, install-failed and no-execution to the lane's failure-class output. These callers do not read that output.
    • #810 changes only the prompt.
    • Both reusables' on.workflow_call inputs and job permission lines are otherwise unchanged between 96b50d4 and 3a2c748, so the callers' grants and their single CLAUDE_CODE_OAUTH_TOKEN secret stay as they are.

Intake reusable callers held at v0.56.0

runner-policy.mjs rejects intake-triage.yml@5e18f3d6 and intake-label-needs-triage.yml@5e18f3d6, because the synced policy.json has no reviewed contract for either at v0.58.0. That file is standards-managed. Both callers stay at 1bb8953, which the synced policy approves. A standards PR adding v0.58.0 contracts, then a follow-up repin, brings the intake lane the same auth handoff and latest CLI default.

Sync-managed files left to the standards sync (hand-editing them fails check-managed-files):

  • .github/workflows/pr-check-managed-files-hosted.yml (v0.55.0).
  • .github/workflows/maintenance-check-links-online-claude-code-plugins.yml (v0.55.0).
  • .github/standards/runner-policy/policy.json.

Verification

  • actionlint (1.7.12, repo config) on the five changed workflows: no findings.
  • node --test:
    • workflow.test.mjs: 14/14, including new assertions on the handoff gates, the plain lane plus fallback-reason, and that no if keys on lane-class == 'credit-stop'.
    • parity.test.mjs 13/13, replay.test.mjs 11/11, write-verdict.test.mjs 11/11, resolve-pr.test.mjs 26/26, resolve-config/callers.test.mjs 22/22.
  • scripts/check-affected.sh --tests: 11 passed, 3 skipped (no plugin, .py or skill changes).
  • node .github/standards/runner-policy/runner-policy.mjs --root .: "Runner policy passed." The synced policy.json now holds the 1bb8953 contracts, so the earlier expected red is gone.
  • scripts/check-changelog-fragments.sh --check: all fragments are valid.
  • Not run locally: zizmor on the new head.
  • This PR edits pr-require-checks.yml, so its AI review lanes skip themselves.

Related

🤖 Generated with Claude Code

kyle-sexton and others added 2 commits October 20, 2026 23:43
Move every hand-maintained ci-workflows pin to v0.56.0 (1bb8953) and
apply what the callers need between each old pin and it:

- ci-status: pass step-name to aggregate-results (ci-workflows#814) and
  raise timeout-minutes from 3 to 5 for the rate-limit waits
  (ci-workflows#833).
- check-managed-files: the job comment now says a merge group checks
  each queued pull request's diff (ci-workflows#823).
- report-check-run: admit report-lane-outcome's install-failed and
  no-execution classes, so those runs keep their lane record
  (ci-workflows#813).
- intake-reenter: rewrite the Accepted exposure paragraph for the
  trusted-comment filter (ci-workflows#782, ci-workflows#830).
- Refresh the markdownlint cache key, the pr-verify replay pin and the
  hand-verified pin notes in README.md and check-docs-only-gate.sh.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Tje1j8KEYaYSxYe8RgJ3Lw
…he exposure note

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Tje1j8KEYaYSxYe8RgJ3Lw
kyle-sexton and others added 2 commits October 20, 2026 23:59
… v0.55.0

Move pr-review-hosted.yml and pr-review-security-hosted.yml from v0.48.0
to v0.55.0 (3a2c748), the release standards holds runner contracts for,
and pass allowed-author-ids to the code-review lane so a trusted
person's closing issue keeps its title and body (ci-workflows#828).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Tje1j8KEYaYSxYe8RgJ3Lw
kyle-sexton added a commit to melodic-software/standards that referenced this pull request Oct 21, 2026
…829)

Refs: melodic-software/ci-workflows#818
Refs: melodic-software/ci-workflows#819

## Summary

Registers ci-workflows
[v0.56.0](https://github.com/melodic-software/ci-workflows/releases/tag/v0.56.0)
(`1bb8953644d16f21d10718962c6702f01ea3308a`) contracts for
`intake-triage.yml` and `intake-label-needs-triage.yml`.
[claude-code-plugins#8800](melodic-software/claude-code-plugins#8800)
repins both intake callers to that SHA, and its runner-policy gate fails
with `runner-target-contract: the reusable workflow path@SHA has no
reviewed runner-input contract (auto-approval declined: ... carries a
reviewed allowedCallerPermissions grant; its steps cannot be proven
unchanged by this surface diff, so auto-approval is declined)` for both.

**Owner sign-off pending.** The README rollout line says "sign-off
pending"; replace it with "signed off by hand on <date>" when you sign
off.

## Fix

- `components/runner-policy/policy.json`:
- `intake-triage.yml@1bb8953`: a verbatim copy of the v0.55.0 entry
(`3a2c748`).
- `intake-label-needs-triage.yml@1bb8953`: a verbatim copy of the
v0.42.0 entry (`182aca3`), the newest reviewed SHA for that file.
- `components/runner-policy/README.md`: the v0.56.0 rollout line,
sign-off pending.
- `components/runner-policy/runner-policy.test.mjs`: a test that both
v0.56.0 entries equal their source entries and that they are the only
two keys at that SHA.

### Byte-identity evidence

Git blob SHA of each file, from `gh api
repos/melodic-software/ci-workflows/contents/.github/workflows/<file>?ref=<sha>
--jq .sha`:

| File | `182aca3` | `3a2c748` (v0.55.0) | `1bb8953` (v0.56.0) |
|---|---|---|---|
| `intake-triage.yml` | `fa4e86f8` | `d79b7e9e` | `d79b7e9e` |
| `intake-label-needs-triage.yml` | `8d274a66` | `8d274a66` | `8d274a66`
|

`gh api repos/melodic-software/ci-workflows/compare/3a2c748...1bb8953`
is one commit
([ci-workflows#836](melodic-software/ci-workflows#836))
touching nine files, all under `.github/actions/pr-require-checks/` plus
`README.md`; neither intake file is among them. Against `182aca3`, the
compare lists `intake-triage.yml` as modified (that file's reviewed SHA
is `3a2c748`, not `182aca3`) and not `intake-label-needs-triage.yml`.

No input, secret, caller permission, or `runs-on` routing changes.

## Verification

- `npm run test:runner-policy`: 323 pass, 0 fail, including `✔ both
intake contracts at the v0.56.0 tag copy their reviewed entries forward
verbatim`. Adding an input to the new `intake-label-needs-triage` entry
makes that test fail.
- `npm run lint:runner-policy`: `Runner policy passed.`
- Against the claude-code-plugins#8800 worktree
(`--repository-visibility public`, worktree not modified):
- with its vendored policy: the two `runner-target-contract` failures
above, and no others;
- with `--policy` set to this branch's `policy.json`: `Runner policy
passed.`;
- with this branch's `runner-policy.mjs` and `policy.json`: `Runner
policy passed.`
- Every other ci-workflows reusable that #8800 calls stays on a SHA that
already has a contract (`pr-review` and `pr-review-security` at v0.48.0,
`maintenance-check-links-online` at v0.55.0). The other v0.56.0 pins are
composite actions, which need no contract.
- lefthook pre-commit (typos, editorconfig, markdownlint, gitleaks,
biome): clean.

## Related

-
[claude-code-plugins#8800](melodic-software/claude-code-plugins#8800)
passes its runner-policy gate once this merges and syncs.
- Precedent: #828 (v0.55.0 verbatim copies), #811, #802.

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

https://claude.ai/code/session_01Tje1j8KEYaYSxYe8RgJ3Lw

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
@kyle-sexton
kyle-sexton marked this pull request as ready for review October 21, 2026 05:13
@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review 🔄 Running since 2026-10-21T05:14:02.625865Z 8d50108 Draft marked ready
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

kyle-sexton and others added 6 commits October 21, 2026 02:17
A full plan puts plugins/planning/shared/tests/ui.test.sh (41 browser suites, about 9.3 minutes by ui-timings.txt) in one leg with ~380 other suites, so the 9-minute limit cancels the leg on every full run, main dispatches included.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

Claude-Session: https://claude.ai/code/session_01Tje1j8KEYaYSxYe8RgJ3Lw
This reverts commit 2e08ec6. The owner's rule (pr-require-checks.yml:143-144) is to make a slow job faster or split it, never to raise its timeout. #8840 fixes the slow leg by running the shared browser suites 6 at a time.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Move every ci-workflows composite pin at v0.56.0 to v0.58.0
(5e18f3d6cebd6fa5e66b0941ee0f7ed6ba288d6c), and the markdownlint cache
key with it. v0.58.0's run-claude-cli defaults cli-version to latest and
adds the handoff output; report-lane-outcome accepts fallback-reason auth.
No other composite changed between the two tags.

The pr-verify replay records the new pin and CLI_VERSION latest, and a
live run resolves latest with npm view as lane.cjs does. cliArgs and
legEnv are byte-identical across the two tags.

intake-triage.yml and intake-label-needs-triage.yml stay at v0.56.0: the
standards-managed runner policy has no reviewed contract for either
reusable workflow at 5e18f3d6, and runner-policy.mjs rejects them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Key the subscription fallback on run-claude-cli v0.58.0's handoff output
instead of lane-class credit-stop, as ci-workflows' intake-triage.yml
does: a credit stop, or class auth with API status 401 or 402, hands the
judgment on; a 403 does not, and the key job fails.

- check-intent outputs handoff; Check the key leg, the key report and the
  subscription job's if read it. The key-leg warning tells a refused key
  (replace the secret) from a credit stop (rotate one in), with the class
  passed through env.
- The subscription job's report goes back to the plain lane name
  pr-verify and says why it ran in fallback-reason (credit-stop, auth or
  no-key). The long lane string worked around ci-workflows#806, fixed in
  v0.55.0.
- known-failure-class is unchanged: credit-stop reports as rate-limit,
  auth as auth.

workflow.test.mjs holds the new gates and the fallback-reason literals,
and fails if any if still keys on lane-class credit-stop.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@kyle-sexton kyle-sexton changed the title ci: repin ci-workflows to v0.56.0 ci: repin ci-workflows to v0.58.0 Oct 21, 2026
@kyle-sexton
kyle-sexton added this pull request to the merge queue Oct 21, 2026
Merged via the queue into main with commit aa7ac93 Oct 21, 2026
34 of 36 checks passed
@kyle-sexton
kyle-sexton deleted the ci/repin-ci-workflows-v0.56.0 branch October 21, 2026 14:03
kyle-sexton added a commit to melodic-software/standards that referenced this pull request Oct 21, 2026
…832)

Refs: melodic-software/ci-workflows#840
Refs: melodic-software/ci-workflows#841

## Summary

Registers ci-workflows

[v0.58.0](https://github.com/melodic-software/ci-workflows/releases/tag/v0.58.0)
(`5e18f3d6cebd6fa5e66b0941ee0f7ed6ba288d6c`) contracts for
`intake-triage.yml` and `intake-label-needs-triage.yml`, so

[claude-code-plugins#8800](melodic-software/claude-code-plugins#8800)
can repin both intake callers from v0.56.0 (`1bb8953`) to v0.58.0 and
intake
gets the 401/402 subscription handoff.

**Owner review needed.** Unlike #829, `intake-triage` is not
byte-identical to
the SHA its copied entry reviewed. Its contract surface is unchanged,
but its
steps changed, so the gate cannot auto-approve it and the copy rests on
the
review below. The README rollout line says "sign-off pending"; replace
it with
"signed off by hand on <date>" when you sign off.

## Fix

- `components/runner-policy/policy.json`: verbatim copies of the v0.56.0
  (`1bb8953`) entries at `5e18f3d6`, for `intake-triage` and
`intake-label-needs-triage`. No input, secret mapping, caller permission
or
  routing is added or widened.
- `components/runner-policy/README.md`: the v0.58.0 rollout line,
sign-off
  pending.
- `components/runner-policy/runner-policy.test.mjs`: a test that both
v0.58.0
entries equal their v0.56.0 entries and are the only two keys at that
SHA.

### Review basis

Git blob SHAs (`git rev-parse <sha>:.github/workflows/<file>`):

| File | `1bb8953` (v0.56.0) | `5e18f3d6` (v0.58.0) |
|---|---|---|
| `intake-label-needs-triage.yml` | `8d274a66` | `8d274a66` |
| `intake-triage.yml` | `d79b7e9e` | `8ff8eac3` |

`intake-label-needs-triage.yml` is byte-identical, so its copy has the
same
basis as #829.

For `intake-triage.yml`, parsing both versions and comparing them
structurally: `on.workflow_call` inputs (except the `cli-version`
description), secrets and outputs are identical, as are the top-level
permissions and every job's `permissions` and `runs-on`. The two jobs
that
hold `issues: write`, `apply` and `skipped`, are identical in full. The
`claude`, `subscription` and `status` jobs changed (ci-workflows#840,
#841).
Please review these changes:

1. **CLI default goes from the pinned `2.1.304` to `latest`.** When the
   caller passes no `cli-version` and sets no `CLAUDE_LANE_CLI_VERSION`
variable, run-claude-cli now installs whatever npm resolves as latest at
   run time, with a Claude credential in its environment

([L200](https://github.com/melodic-software/ci-workflows/blob/5e18f3d6cebd6fa5e66b0941ee0f7ed6ba288d6c/.github/workflows/intake-triage.yml#L200),

[L527](https://github.com/melodic-software/ci-workflows/blob/5e18f3d6cebd6fa5e66b0941ee0f7ed6ba288d6c/.github/workflows/intake-triage.yml#L527),

[L1053](https://github.com/melodic-software/ci-workflows/blob/5e18f3d6cebd6fa5e66b0941ee0f7ed6ba288d6c/.github/workflows/intake-triage.yml#L1053)).
   The contract does not model this. It is a supply-chain change.
2. **The subscription token is used in more cases.** The secret mapping
is
   unchanged, but the `subscription` job, which holds
   `CLAUDE_CODE_OAUTH_TOKEN`, now runs when `handoff == 'true'`: after a
credit stop as before, and also when the API refuses the key with status
   401 or 402. A 403 stops the run

([L855](https://github.com/melodic-software/ci-workflows/blob/5e18f3d6cebd6fa5e66b0941ee0f7ed6ba288d6c/.github/workflows/intake-triage.yml#L855)).
3. A new `handoff` job output on `claude` and `subscription`

([L340](https://github.com/melodic-software/ci-workflows/blob/5e18f3d6cebd6fa5e66b0941ee0f7ed6ba288d6c/.github/workflows/intake-triage.yml#L340),

[L866](https://github.com/melodic-software/ci-workflows/blob/5e18f3d6cebd6fa5e66b0941ee0f7ed6ba288d6c/.github/workflows/intake-triage.yml#L866)).
   These are job outputs, not `workflow_call` outputs.
4. `fallback-reason: auth` in the subscription job's lane record

([L1295](https://github.com/melodic-software/ci-workflows/blob/5e18f3d6cebd6fa5e66b0941ee0f7ed6ba288d6c/.github/workflows/intake-triage.yml#L1295)),
   and a status-job warning and `class=auth` when the key was refused

([L1671](https://github.com/melodic-software/ci-workflows/blob/5e18f3d6cebd6fa5e66b0941ee0f7ed6ba288d6c/.github/workflows/intake-triage.yml#L1671)).

The contract has no allowlist entry for the `skipped-label` input. That
was
already true at v0.56.0, and this PR leaves it unchanged.

## Verification

- `npm run test:runner-policy`: 324 pass, 0 fail, including `✔ both
intake
contracts at the v0.58.0 tag copy their v0.56.0 entries forward
verbatim`.
- `npm run lint:runner-policy`: `Runner policy passed.`
- End to end, against a temp copy of the claude-code-plugins#8800
worktree's
  `.github` with both intake callers repinned to `5e18f3d6`
  (`--repository-visibility public`):
  - with #8800's vendored `runner-policy.mjs` and policy: two
`runner-target-contract` failures, `intake-label-needs-triage` ("carries
a
    reviewed allowedCallerPermissions grant; its steps cannot be proven
    unchanged by this surface diff, so auto-approval is declined") and
    `intake-triage` ("inputs changed since the previously reviewed
    ...intake-triage.yml@182aca3..."), and no others;
- with the vendored `runner-policy.mjs` and `--policy` set to this
branch's
    `policy.json`: `Runner policy passed.`;
- with this branch's `runner-policy.mjs` and `policy.json`: `Runner
policy
    passed.`
- lefthook pre-commit (typos, editorconfig, markdownlint, gitleaks,
biome):
  clean.

## Related

-
[claude-code-plugins#8800](melodic-software/claude-code-plugins#8800)
  can repin to v0.58.0 once this merges and syncs.
- v0.58.0 also changes `pr-review.yml` and `pr-review-security.yml` (4
lines
  each). This PR adds no contracts for them. #8800 calls both at v0.55.0
  (`3a2c748`), which already has contracts.
- Precedent: #829 (v0.56.0 verbatim copies), #828.

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

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
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