feat(runner-policy): register wave-3 runner-input contracts - #160
Conversation
Register three reusable-workflow contracts required by the Wave 3 per-repo floor conversion (github-iac#78): - standards-sync.yml@3dfb1845 — runner input landed in ci-workflows#124 but the contract was never registered, blocking the standards repo's sync-lane exception drop. - do-not-merge-gate.yml@8853021 (ci-workflows#108) and pr-issue-linkage.yml@f7e94a8 (ci-workflows#118) — both ship the runner/prerequisite-result shape; registration unblocks the fleet-routed caller rollouts (ci-workflows#120/#121). The contract set is fail-closed: unregistered references make every caller's runner-policy lane fail, so registration must precede the caller PRs. Full component suite passes (181/181). 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01K3QehVwmWzkBLpKokNCkkt Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 903586892b
ℹ️ 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".
|
Claude finished @kyle-sexton's task in 4m 42s —— View job Review:
|
Codex review: a secret-bearing runner-input contract without allowedCallerPermissions still fails privilegedHostedRequirement(), and the write-permission rule forbids a read-only allowedCallerPermissions map — so the standards-sync registration was unusable. Sync-lane fleet routing is deferred behind a reviewed secret-capable waiver. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01K3QehVwmWzkBLpKokNCkkt Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 24a47a09c7
ℹ️ 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".
|
Claude finished @kyle-sexton's task in 3m 49s —— View job
Review:
|
Wave 3 per-repo floor conversion (melodic-software/github-iac#78, 2026-07-16 owner override): converts the convertible hosted control-plane lanes to governed selector routing. No linked issue. ## What - `ci.yml`: runner-policy lane routes via select-runner (success-guard, watched by the aggregate); the ci-status aggregate routes with `if: ${{ !cancelled() }}` (fails closed through execution on the hosted fallback, never by skipping). - `pr-title.yml`: select-runner added; semantic-pr pin bumped to `51012e2` with `prerequisite-result` (`if: ${{ always() }}` per the validator's fail-closed reporter contract). - `link-check.yml`: select-runner added; pin bumped to the `3dfb184` runner-input variant (issues:write admitted via contract `allowedCallerPermissions`). - New `do-not-merge` + `pr-issue-linkage` callers (melodic-software/ci-workflows#120 / #121 rollout): `pull_request_target` + `merge_group`; execute on the hosted fallback until melodic-software/ci-workflows#130 admits those events. - `runner-policy.json`: 4 exceptions dropped. ## Kept hosted (deferred set, recorded on the epic) - `publish-packages.yml#publish` — LOCAL job holding `packages: write`; the validator hard-blocks selector routing for write-token local jobs (`privileged-hosted-only`). - `sync.yml#sync` — secret-bearing standards-sync caller; no admissible contract shape exists (Codex-confirmed on #160). Both need a standards validator change first. ## Verification - Local `runner-policy.mjs` (against this repo's own component, which the lane reads directly): **Runner policy passed — zero errors** (branch is rebased onto main with the #160 contracts). - actionlint clean; every converted `runs-on` keeps the `|| 'ubuntu-24.04'` fallback (epic decision 4). ## Related - melodic-software/github-iac#78 (epic — Wave 3) - melodic-software/ci-workflows#120, melodic-software/ci-workflows#121, melodic-software/ci-workflows#130 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01K3QehVwmWzkBLpKokNCkkt --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…#134) Closes #131 ## Related - melodic-software/standards#160 (registered the selectorResultInput contracts whose validator enforces the shape) - melodic-software/github-iac#78 (Wave 3 callers all ship `always()`) ## What Option (a) from the issue: docs-only reconcile to the enforced shape. - `do-not-merge-gate.yml` `prerequisite-result` description: `if: !cancelled()` -> `if: always()`, mirroring `pr-issue-linkage.yml`. - README fail-closed contract section: example and prose now state the validator-required `if: ${{ always() }}` and the accepted, bounded cancellation tradeoff (one `ubuntu-slim` reporter run; a superseded run's stale failure clears on re-run) instead of recommending the rejected shape. Contract shape is unchanged; consumers stay pinned at their registered SHAs; no caller changes needed. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01K3QehVwmWzkBLpKokNCkkt --------- Co-authored-by: Claude Fable 5 (1M context) <noreply@anthropic.com>
… contract (#217) ## Summary Registers the approved reusable-workflow contract for `melodic-software/ci-workflows/.github/workflows/pr-issue-linkage.yml@d7734df8c557084edc2df7cf578cf62ad2f261e4` — the just-merged ci-workflows#171, which adds the opt-in `exempt-authors` input to the `pr-issue-linkage` reusable (comma-separated exact author logins that skip body validation; fail-closed empty default preserves existing behavior). The entry mirrors the existing `pr-issue-linkage` runner-input contracts: `routing: runner-input`, `runnerInput: runner`, `selectorResultInput: prerequisite-result`, empty `allowedSecrets`, and extends `allowedInputs` to `["runner", "prerequisite-result", "exempt-authors"]`. Additive — the existing `pr-issue-linkage` SHA entries are untouched. ## Verification - **Input surface transcribed from the reusable at the pinned SHA** (review basis, since the static lint does not fetch the workflow): the `workflow_call` inputs at `d7734df` are exactly `runner`, `prerequisite-result`, `exempt-authors` — three inputs, no secrets. Contract carries no `allowedSecrets` and no `allowedCallerPermissions`, so it does not trip `privilegedHostedRequirement` or the write-permission rule. - `npm run lint:runner-policy` → "Runner policy passed." - `npm run test:runner-policy` → 227/227 pass. - Diff is one file, +7 lines, `components/runner-policy/policy.json` only. **No README change (intentional):** the README's only counts are the "eight … contracts at [90f1c54]" batch narrative and "ten selector revisions"; neither goes stale — this adds no selector reference and `d7734df` is a distinct revision from `90f1c54`. This matches the single-contract-registration precedent (#160, which added a `pr-issue-linkage` entry touching only `policy.json`); #203 touched the README solely because it completed the `90f1c54` batch the README narrates. **Operator momentum delegation:** opened under operator momentum delegation (cite + veto window). Held for the operator veto window; not to be merged by the agent. Merge to `main` auto-fires `standards-sync`, so hold until the window elapses. No linked issue. ## Related - melodic-software/ci-workflows#171 — upstream change that added `exempt-authors` (Closes ci-workflows#149) - melodic-software/ci-workflows#157 — downstream pin-bump tracking - melodic-software/claude-code-plugins#748 — consumer of this contract (Closes claude-code-plugins#684; dependabot PR unmergeable) Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Registers two reusable-workflow contracts required by the Wave 3 per-repo floor conversion (melodic-software/github-iac#78):
do-not-merge-gate.yml@8853021…(feat: add do-not-merge-gate reusable workflow ci-workflows#108) andpr-issue-linkage.yml@f7e94a8…(feat: add pr-issue-linkage reusable workflow ci-workflows#118) — both ship therunner/prerequisite-resultshape; registration unblocks the fleet-routed caller rollouts (Roll out do-not-merge-gate caller to all requires-ci repos ci-workflows#120 / fix(runner-policy): require a paired sentinel for required selector input #121).The contract set is fail-closed: an unregistered reference fails every caller's runner-policy lane, so registration must precede the Wave 3 caller PRs.
A
standards-sync.yml@3dfb1845…registration was included originally and removed after Codex review: a secret-bearing runner-input contract withoutallowedCallerPermissionsstill failsprivilegedHostedRequirement(), and the write-permission rule forbids a read-onlyallowedCallerPermissionsmap — sync-lane fleet routing is deferred behind a reviewed secret-capable waiver (tracked on melodic-software/github-iac#78).No linked issue.
Verification
semantic-pr.yml@51012e2c…runner-input shape (selectorResultInput: prerequisite-result);allowedCallerPermissionsomitted per the validator's write-permission rule (both are read-only).allowedInputs/allowedSecretstranscribed from each reusable at its pinned SHA.Related
🤖 Generated with Claude Code
https://claude.ai/code/session_01K3QehVwmWzkBLpKokNCkkt