Skip to content

feat(runner-policy): add ci-workflows v0.39.8 contracts - #762

Merged
kyle-sexton merged 3 commits into
mainfrom
ci/policy-v0.39.8
Oct 10, 2026
Merged

kyle-sexton merged 3 commits into
mainfrom
ci/policy-v0.39.8

Conversation

@kyle-sexton

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

Copy link
Copy Markdown
Member

Related

Refs: melodic-software/ci-workflows#726
Refs: #748

Precedents: #742 (v0.39.3 contracts), #746 (retirement).

Fix

Registers the nine ci-workflows reusables at the v0.39.8 tag 594987abe8657a40bccc13d301f1f0d5cccb5348 in components/runner-policy/policy.json. This unblocks the claude-lanes repin in #748, whose policy lockstep declined, and the ci-runner repin, whose pin tests need one SHA across every ci-workflows reference. The v0.39.3 (ab83b01) entries stay until every consumer has repinned.

  • policy.json: nine new keys, each spliced in as text after its ab83b01 entry (121 insertions, 0 deletions). No workflow_call input, secret, workflow or job permission, or runs-on routing changed between v0.39.3 and v0.39.8, so each contract equals its v0.39.3 entry.
  • README.md: rollout note for v0.39.8.
  • runner-policy.test.mjs: REPINE_LANE_SHA_V0_39_8 and a copy-forward assertion that each v0.39.8 entry equals its v0.39.3 entry and that exactly nine v0.39.8 keys exist.
Reusable Change since v0.39.3 Lockstep result
intake-label-needs-triage.yml none, blob identical unchanged
pr-scan-dependencies.yml none, blob identical unchanged
pr-audit-workflows.yml none, blob identical unchanged
pr-automerge-dependabot.yml none, blob identical unchanged
intake-triage.yml claude-code-action v1.0.241 to v1.0.245 (6fed3ca) declined: credentialReferences
pr-review.yml same bump, plus rate-limit summary wording declined: credentialReferences
pr-review-security.yml same bump, plus rate-limit summary wording declined: credentialReferences
maintenance-sync-standards.yml setup-node v7.0.0 to v7.1.0 (949feb2) declined: sync job routes through needs
pr-run-checks.yml blob identical; $/markdownlint takes the setup-node bump declined: commit-relative reference changed

"unchanged" means the comparison found the surface unchanged. Because any decline suppresses every lockstep write, all nine entries were registered by hand, and the five declined ones were reviewed against the v0.39.8 file content. $/report-lane-outcome, which the claude lanes reach, changes only its rate-limit error message.

Verification

  • laneSecuritySurfacesMatch from repin-policy-lockstep.mjs, run without writes for all nine paths from ab83b01 to 594987a, gave the results in the table.
  • Each v0.39.8 file's workflow_call surface (inputs, secrets, workflow and job permissions, runs-on) was parsed and compared with v0.39.3: unchanged for all nine.
  • npm run test:runner-policy (298/298), npm run lint:runner-policy, biome, markdownlint and the lefthook pre-commit all pass.

🤖 Generated with Claude Code

https://claude.ai/code/session_01TRhsMPSTMFo99ik7gkdgQt

Register the nine ci-workflows reusables at the v0.39.8 tag
594987abe8657a40bccc13d301f1f0d5cccb5348. No workflow_call input, secret,
permission or runs-on routing changed since v0.39.3, so each contract
equals its v0.39.3 entry. The v0.39.3 entries stay until every consumer
repins.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TRhsMPSTMFo99ik7gkdgQt
@kyle-sexton
kyle-sexton marked this pull request as ready for review October 10, 2026 21:55
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TRhsMPSTMFo99ik7gkdgQt
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 10, 2026 •

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 ✅ Completed 2026-10-10T21:57:13.706806Z f675cbf 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.

@claude

claude Bot commented Oct 10, 2026

Copy link
Copy Markdown

Claude Code is working…

I'll analyze this and get back to you.

View job run

@claude

claude Bot commented Oct 10, 2026 •

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 2m 1s —— View job


Security review — no issues found

  • Gather context (PR diff, changed files)
  • Apply skip gate — not applicable (policy.json is a trust-boundary allowlist of secrets/permissions for externally-sourced reusable workflows, so it stays in scope)
  • Review components/runner-policy/policy.json changes
  • Review components/runner-policy/README.md changes
  • Review components/runner-policy/runner-policy.test.mjs changes
  • Check for instruction-surface deletions — none; diff is purely additive (0 deletions)
  • Post final findings

Scope: git diff origin/main...HEAD touches only components/runner-policy/{README.md,policy.json,runner-policy.test.mjs}, all additive (170 insertions / 0 deletions).

What this PR does: adds nine @594987abe8657a40bccc13d301f1f0d5cccb5348 (v0.39.8) entries to approvedReusableWorkflowContracts, one per existing @ab83b01... (v0.39.3) reusable, plus a copy-forward test and a README rollout note.

Analysis:

  • I diffed each new v0.39.8 entry against its v0.39.3 predecessor directly in policy.json. For all nine reusables (intake-triage, pr-review, pr-review-security, intake-label-needs-triage, pr-scan-dependencies, maintenance-sync-standards, pr-audit-workflows, pr-automerge-dependabot, pr-run-checks), allowedInputs, allowedSecrets, and allowedCallerPermissions/minimumCallerPermissions are byte-for-byte identical between the two tags — no widened secret exposure, no added caller permission, no routing change. This matches the PR body's claim and the new test added in runner-policy.test.mjs.
  • No instruction-surface deletion: the diff adds text/entries only, nothing is removed or softened in README.md, policy.json, or any rules/skill/agent file.
  • No injection, path-traversal, or credential-handling logic in this diff — it is static JSON config plus a Node test asserting structural equality; no new code path executes untrusted input.

Verification limitation: I could not independently fetch melodic-software/ci-workflows at commit 594987abe8657a40bccc13d301f1f0d5cccb5348 from this session — outbound gh api/network calls require interactive approval that isn't available in this CI lane. I could not re-derive the claimed "workflow_call surface unchanged between v0.39.3 and v0.39.8" independently of the PR's own laneSecuritySurfacesMatch tooling output and hand-review table; I'm relying on that reported verification rather than confirming it against the upstream repo myself. If tighter assurance is wanted, re-run laneSecuritySurfacesMatch from a context with registry/network access, or have a second reviewer diff the nine upstream workflow files at both SHAs directly.

No CRITICAL / IMPORTANT / SUGGESTION findings. GitHub Actions trigger/permission-widening/supply-chain concerns are zizmor's advisory lane and are not re-reported here.

@claude

claude Bot commented Oct 10, 2026 •

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 2m 46s —— View job


Code review complete

  • Gather context (CLAUDE.md, REVIEW.md, diff)
  • Review components/runner-policy/policy.json
  • Review components/runner-policy/README.md
  • Review components/runner-policy/runner-policy.test.mjs
  • Verify claims where tooling allows
  • Post findings

No high-signal findings. This is a mechanical copy-forward registering the nine ci-workflows v0.39.8 contracts, and it follows the exact precedent pattern used for the v0.39.0 and v0.39.3 rollouts already documented in README.md (e.g. L1126-L1156):

  • policy.json: all nine new entries use the single SHA 594987abe8657a40bccc13d301f1f0d5cccb5348 with no typos (checked via grep across the file), each is a verbatim copy of its ab83b01... (v0.39.3) sibling, and insertion-only (170 additions / 0 deletions matches the stated diff).
  • runner-policy.test.mjs: the new test (REPINE_LANE_SHA_V0_39_8) asserts, for all nine reusables, that the v0.39.8 entry deep-equals the v0.39.3 entry read via the existing LIVE_CI_WORKFLOWS_SHA constant (ab83b01...), and that exactly nine @594987a... keys exist — correctly guards against a missing or stray entry.
  • README.md: the new paragraph's four "byte-identical" reusables (intake-label-needs-triage, pr-scan-dependencies, pr-audit-workflows, pr-automerge-dependabot) and the five hand-reviewed ones (claude-code-action bump for the three Claude lanes, setup-node bump for maintenance-sync-standards and pr-run-checks's $/markdownlint tree) match the PR description's table exactly, and the prose follows the same structure as the two prior rollout paragraphs immediately above it.

Not independently verified (sandbox has no outbound network/gh/node access in this run): the claim that none of the five "declined" reusables changed their workflow_call inputs/secrets/permissions/runs-on between ab83b01 and 594987a in the upstream ci-workflows repo, and the author's reported npm run test:runner-policy (298/298) / lint / repin-policy-lockstep.mjs output. These are author-claimed; the in-repo test logic itself is sound, but I could not run it or diff the upstream blobs myself.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: f675cbf1de

ℹ️ 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".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread components/runner-policy/README.md Outdated
@github-actions

github-actions Bot commented Oct 10, 2026 •

Copy link
Copy Markdown

claude-security-review has reviewed this pull request through f357f5b; a later push is reviewed from there.

@github-actions

Copy link
Copy Markdown

PR body contract — issue linkage

This PR body does not yet satisfy the issue-linkage contract:

  • Missing a "## Summary" section. Describe what this PR changes and why, in a sentence or two.

Edit the body and this comment updates itself on the next run.

@github-actions

github-actions Bot commented Oct 10, 2026 •

Copy link
Copy Markdown

claude-review has reviewed this pull request through f357f5b; a later push is reviewed from there.

The lockstep's comparison found four surfaces unchanged, but its
declines suppress every write, so all nine entries were added by hand.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TRhsMPSTMFo99ik7gkdgQt
@claude

claude Bot commented Oct 10, 2026 •

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 2m 40s —— View job


Code review complete

  • Gather context (incremental diff, PR data)
  • Invoke /review:code-review per the incremental scope
  • Review components/runner-policy/README.md changes since 79f7abf
  • Post findings

Scope: per the lane header, only components/runner-policy/README.md changed since the last review at 79f7abf; policy.json and runner-policy.test.mjs are unchanged and were reviewed then. The diff (components/runner-policy/README.md#L1157-L1173) rewords the v0.39.8 rollout paragraph to fix the audit-trail inaccuracy Codex flagged on f675cbf (the review comment above, on the old "pr-audit-workflows, pr-automerge-dependabot), and the claude-lanes lockstep copies them" wording).

No findings — the fix is correct. I verified it against components/claude-lanes/repin-policy-lockstep.mjs:

  • Codex's concern: the prior wording ("the claude-lanes lockstep copies them") implied the lockstep auto-copied the four byte-identical entries (intake-label-needs-triage, pr-scan-dependencies, pr-audit-workflows, pr-automerge-dependabot), which is wrong on two counts — they're absent from REPIN_TARGETS (repin-policy-lockstep.mjs#L45-L58), and settleLockstep suppresses every write once any inspected workflow declines (withheldSurfacesClause, repin-policy-lockstep.mjs#L152-L159: "any decline suppresses every write").
  • The new text (L1162-L1165) now says the claude-lanes lockstep's surface comparison (laneSecuritySurfacesMatch, the function the PR body's Verification section says was run "without writes for all nine paths") finds the four unchanged, and because the other five decline, "any decline suppresses every lockstep write" — matching the script's own docstring almost verbatim — so "all nine entries were registered by hand and signed off on 2026-10-10." That accurately reflects that no auto-copy ever happened for any of the nine, which matches the PR's actual diff (nine hand-spliced policy.json entries, 0 lockstep-driven writes).
  • The five-way decline breakdown (intake-triage, pr-review, pr-review-security on credentialReferences; maintenance-sync-standards on needs-routing; pr-run-checks on commit-relative ref) is untouched by this edit and still matches the PR body's table.

Only a cosmetic note, not a finding: L1165 runs noticeably longer than this paragraph's other lines before wrapping, but the surrounding prose already has similarly ragged line lengths (e.g. L1134, L1152), so this isn't a regression and markdownlint has no line-length rule enabled here — not worth a change.

@kyle-sexton
kyle-sexton merged commit f513412 into main Oct 10, 2026
55 of 56 checks passed
@kyle-sexton
kyle-sexton deleted the ci/policy-v0.39.8 branch October 10, 2026 22:10
kyle-sexton added a commit that referenced this pull request Oct 11, 2026
…t ci-workflows v0.40.0 (#773)

No related issue: Phase 17 of the pr-unblock lane plan; ci-workflows
v0.40.0

Hold: a human merges this.

## Summary

ci-workflows v0.40.0 (`a92020292976c2e9b50f7adc922693a45a6c1226`) adds
an optional `allowed-bot-sender-ids` input to `pr-review.yml` and
`pr-review-security.yml`. A bot whose event sender id is listed passes
the reusable's bot skip, and only that sender's login reaches the
action's `allowed_bots`. This registers that input in runner policy and
has the four review caller components pass the automation-lanes App's
id, so a commit the App pushes to a pull request is reviewed.

## Fix

- `components/runner-policy/policy.json`: `pr-review.yml` and
`pr-review-security.yml` at the v0.40.0 tag, each equal to its v0.39.8
entry plus `allowed-bot-sender-ids` in `allowedInputs`. Only these two
reusables are registered at v0.40.0.
- `components/claude-lanes/claude-{review,security-review}.yml` and
`components/claude-lanes-hosted/claude-{review,security-review}.yml`:
re-pinned from v0.39.3 to v0.40.0, passing `allowed-bot-sender-ids: ${{
vars.AUTOMATION_LANES_APP_SENDER_ID }}`; header comments updated.
- `components/runner-policy/README.md`: rollout note for v0.40.0.
- `components/runner-policy/runner-policy.test.mjs`:
`REPINE_LANE_SHA_V0_40_0` and a test that each v0.40.0 entry is its
v0.39.8 entry plus the input, and that exactly two v0.40.0 keys exist.

Upstream diff v0.39.8 to v0.40.0 for both reusables: the new input, the
job `if:` (bot actor admitted only when the input is non-empty,
well-formed, and contains the sender id), and `allowed_bots`. No secret,
workflow or job permission, `runs-on`, or reached composite action
changed. The claude-lanes lockstep declines both on `inputs`, so the
entries are registered by hand. Moving from v0.39.3 also takes the
v0.39.8 changes reviewed in #762.

### Consumers without the variable

The manifest syncs these components to 11 targets. Hosted callers:
agent-plugins, ci-runner, claude-code-account-rotation,
claude-code-plugins, codex-plugins, cursor-plugins. Fleet callers:
claude-code-proxy, dotfiles, github-iac, medley, provisioning. Only
`claude-code-plugins` sets the repository variable
`AUTOMATION_LANES_APP_SENDER_ID`, and no org-level variable exists
(checked with `gh api
.../actions/variables/AUTOMATION_LANES_APP_SENDER_ID` on each). GitHub
returns an empty string for an unset configuration variable ([contexts
reference,
`vars`](https://docs.github.com/en/actions/reference/workflows-and-actions/contexts#vars-context)),
and the reusable's `if:` requires a non-empty list, so in the other 10
targets the review lanes still skip every bot.

## Verification

- `npm run test:runner-policy`: 299/299 pass. With
`allowed-bot-sender-ids` removed from one v0.40.0 contract, 5 tests
fail: the new test and the four target-audit tests for the lane callers.
- `npm run lint:runner-policy`: passed.
- `claude-lanes.test.sh` (materialize into every target plus
actionlint), `repin-callers.test.sh`, `repin-policy-lockstep.test.mjs`
(23/23), and the pin-comment scan: pass.
- Lefthook pre-commit (editorconfig, typos, markdownlint, gitleaks,
biome): pass.

## Related

- Upstream release:
https://github.com/melodic-software/ci-workflows/releases/tag/v0.40.0
- Contract precedent: #762 (v0.39.8). #748 (the automated v0.39.8
re-pin) touches the same four caller pins and will conflict with this
one.
- After merge, the standards sync carries the callers and `policy.json`
to the targets.

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

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
kyle-sexton added a commit that referenced this pull request Oct 12, 2026
No related issue: runner-policy contract for ci-workflows v0.42.0
(ci-workflows#741)

## Summary

Lets callers pin the intake lanes at ci-workflows v0.42.0, where the
triage lane sets the Issue Type and clears the `needs-triage` floor
(melodic-software/ci-workflows#741).

## Fix

`components/runner-policy/policy.json` gains two contracts at
`182aca3ad32b79fd002def94e58eb498ac49e7af` (v0.42.0), each its v0.39.8
entry plus the one new input:

| Reusable | New input (default) | Secrets | Caller permissions |
| --- | --- | --- | --- |
| `intake-triage.yml` | `floor-label` (`needs-triage`) |
`CLAUDE_CODE_OAUTH_TOKEN`, unchanged | `contents: read`, `issues:
write`, unchanged |
| `intake-label-needs-triage.yml` | `human-label` (`needs-human`) |
none, unchanged | `issues: write`, unchanged |

`claude-args` exists on `intake-triage.yml` at both tags but stays out
of `allowedInputs`, matching the v0.39.8 entry. The README gains a
rollout note, and `runner-policy.test.mjs` asserts each v0.42.0 entry is
its v0.39.8 entry plus that input and that exactly two v0.42.0 keys
exist. `fixtures/historical-contracts.json` is unchanged: it holds
retired contracts only.

## Verification

- Parsed `on.workflow_call` (inputs, secrets), workflow `permissions`
and job `permissions` of both files at `594987a` (v0.39.8) and `182aca3`
(v0.42.0): only the two inputs differ. The new steps use the job's
existing `github.token`; no `uses:`, secret or permission is added.
- `npm run test:runner-policy`: 301/301 pass.
- `npm run lint:runner-policy`: "Runner policy passed."
- lefthook pre-commit (typos, editorconfig, markdownlint, gitleaks,
biome): pass.

## Related

- melodic-software/ci-workflows#741
- Precedent: #762 (v0.39.8 contracts)
- Consumer repin: melodic-software/claude-code-plugins (draft, follows)

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

https://claude.ai/code/session_01W6SjPvY7DmXBGzboeCq8nj

---------

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