feat(workflows): add thin caller for the issue-triage-label reusable - #850
Conversation
Applies priority: needs-triage to issues opened/reopened without a priority tier, via ci-workflows' issue-triage-label reusable workflow. Closes #506
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
|
Claude finished @kyle-sexton's task in 1m 0s —— View job PR Review: feat(workflows): add thin caller for the issue-triage-label reusable
ReviewThis is a clean, minimal thin-caller workflow. No blocking issues found. What was checked:
SHA pin format — consistent with siblings that omit a description suffix after the date: Permission structure — Runner — Concurrency block — absent, which differs from the Reusable defaults not overridden — Security — supply-chain hardened (SHA pin, not tag/ref), no secrets surfaced, no expression-injected inputs ( One minor observation (non-blocking): the header comment references the settled mechanism from Overall: LGTM. The file is correct, minimal, and follows all established conventions. |
|
Claude finished @kyle-sexton's task in 1m 10s —— View job Security Review
No security issues found. The thin caller is well-constructed across every risk dimension checked: Trigger ( Permissions (L15–19): Top-level Injection surfaces (L20–23): There are no Supply-chain / pin (L21): The reusable is pinned to a full 40-character commit SHA ( Context forwarding: The caller passes no issue-event context (title, body, labels) into the reusable via Consistency with repo convention: The pattern ( |
|
Blocked on CI: the `Runner policy` check fails because `.github/standards/runner-policy/policy.json` (a managed, standards-synced file per `standards/distribution/sync-manifest.yml` — never edited directly downstream) has no reviewed `approvedReusableWorkflowContracts` entry for this new reusable at any SHA: ``` Filed the upstream request: melodic-software/standards#235. This PR will re-green once that contract lands and syncs down via the automated "chore: sync standards components" PR — no local workaround exists (or should exist) for a synced security policy file. |
|
Staged the fix: melodic-software/standards#236 registers the reviewed runner-policy contract for `issue-triage-label.yml@c5e729c` (Closes melodic-software/standards#235). Locally verified there (227/227 `test:runner-policy`, `lint:runner-policy` passing, `lint:md`, `lint:hooks`). Not merging that PR — runner-policy is a hand-reviewed supply-chain allowlist, so it goes through operator review/merge rather than autonomous merge. This PR will re-green once #236 merges and syncs down here via the standard "chore: sync standards components" automation. |
…ontract (#236) Closes #235 ## Summary Registers ci-workflows' `issue-triage-label` reusable workflow as a reviewed `runner-input` contract in `components/runner-policy/policy.json`, pinned to its merged SHA `c5e729c0af0e55ffed4675ec85c1b57356fef79e`: ```json "melodic-software/ci-workflows/.github/workflows/issue-triage-label.yml@c5e729c0af0e55ffed4675ec85c1b57356fef79e": { "routing": "runner-input", "runnerInput": "runner", "allowedInputs": ["runner", "label", "label-prefix"], "allowedSecrets": {}, "allowedCallerPermissions": { "issues": "write" } } ``` - `allowedInputs` covers the reusable's full `workflow_call.inputs` surface (`runner`, `label`, `label-prefix`) — a caller may pass any subset. - `allowedSecrets: {}` — the reusable takes no secrets. - `allowedCallerPermissions: { issues: write }` — the reusable's job needs exactly `issues: write` to read and add labels; no `contents` (no checkout). - No `selectorResultInput` — the reusable has no chained-selector (`prerequisite-result`-style) input. Locally verified: `npm run test:runner-policy` (227/227 passing), `npm run lint:runner-policy` ("Runner policy passed."), `npm run lint:md`, `npm run lint:hooks`, plus `lefthook`'s pre-commit gate (typos, gitleaks, editorconfig, biome) on commit. ## Related - melodic-software/ci-workflows#191 — the reusable workflow, merged. - melodic-software/ci-workflows#195 — its dogfood self-caller, merged, pinned at this same merged SHA. - melodic-software/ci-workflows#192 — end-to-end proof the self-caller actually applies the floor label live. - melodic-software/claude-code-plugins#850 — the consumer PR blocked on this contract (its `Runner policy` check fails without it). - melodic-software/claude-code-plugins#506 — the issue driving that caller. ## Test plan - [x] `npm run test:runner-policy` (227 passing) - [x] `npm run lint:runner-policy` ("Runner policy passed.") - [x] `npm run lint:md` - [x] `npm run lint:hooks` - [x] `lefthook` pre-commit gate (typos, gitleaks, editorconfig, biome)
|
Claude finished @kyle-sexton's task in 1m 34s —— View job PR Review
Review:
|
| Dimension | Status |
|---|---|
| Supply-chain pin | Full 40-char SHA c5e729c0af0e55ffed4675ec85c1b57356fef79e — immutable, gold standard ✓ |
| Same-org target | melodic-software/ci-workflows — no external trust delegation ✓ |
| Permissions | permissions: {} at workflow scope; issues: write at job scope only ✓ |
secrets: inherit |
Absent — zero secrets forwarded to the reusable ✓ |
| Injection surfaces | No run: blocks; only with: runner: ubuntu-24.04 (static literal, no context interpolation) ✓ |
zizmor --persona=pedantic |
0 findings per PR description ✓ |
Convention alignment (sibling callers)
Checked against pr-issue-linkage.yml, do-not-merge.yml, and link-check.yml:
permissions: {}at workflow level, narrowed toissues: writeat job level — matches the pattern used bypr-issue-linkage.yml(which also needs write access) ✓runner: ubuntu-24.04passed explicitly — consistent with all three sibling callers ✓- SHA pin comment format (
# <short-sha> <date>) — consistent ✓ - No concurrency block — correct omission;
issues: opened/reopenedare discrete per-issue events with no stacking concern, unlike thepull_request_targetsiblings ✓
CI blocking situation — resolved
The previous Runner policy failure (reported at 16:13Z) was caused by the absence of an approvedReusableWorkflowContracts entry for issue-triage-label.yml@c5e729c in .github/standards/runner-policy/policy.json.
That entry is now present on this branch:
"melodic-software/ci-workflows/.github/workflows/issue-triage-label.yml@c5e729c0af0e55ffed4675ec85c1b57356fef79e": {
"routing": "runner-input",
"runnerInput": "runner",
"allowedInputs": ["runner", "label", "label-prefix"],
"allowedSecrets": {},
"allowedCallerPermissions": {
"issues": "write"
}
}This arrived via chore: sync standards components (#873) merging to main, followed by the Merge branch 'main' into ci/506-triage-label-caller commit (7ef6ab4). The contract entries are exact-match for what the caller passes — runner-input routing, runner as the input, issues: write as the only caller permission. The blocker is cleared.
Current CI: pr-title, pr-issue-linkage, and do-not-merge have all passed; ci, claude-review, and claude-security-review are in progress with no failures.
No changes requested. The file is correct, minimal, secure, and follows all established conventions. Ready to merge once in-progress CI checks complete.
|
Claude finished @kyle-sexton's task in 1m 2s —— View job Security Review
No security issues found. The file is a single, minimal reusable-workflow caller with no Trigger (L11–13): Permission structure (L15–19): Top-level Supply-chain (L21): Pinned to the full 40-character immutable commit SHA Injection surfaces: There are no Secrets: No Concurrency: Absent, which is correct — |
Closes #506
Summary
Adds
.github/workflows/issue-triage-label.yml, a thin caller invokingci-workflows'
issue-triage-labelreusable workflow (workflow_call) onissues: opened/reopened. Applies the existingpriority: needs-triagelabel when an issue carries no
priority:*label; leaves issues filed withan explicit tier untouched. Non-gating.
c5e729c0af0e55ffed4675ec85c1b57356fef79e(ci-workflowsPR build: Bump the npm-minor-patch group across 1 directory with 2 updates #191), matching this repo's existing SHA-pin convention
(
pr-issue-linkage.yml,do-not-merge.yml,link-check.yml).label(priority: needs-triage) andlabel-prefix(priority:) — both already match this repo's taxonomy, sono overrides needed.
runner: ubuntu-24.04passed explicitly per siblingcaller convention.
priority: needs-triageexists in this repo's label set(
gh label list), so the reusable's fail-closed missing-label guard willnot trip.
actionlint,zizmor --persona=pedantic(0findings after adding an explanatory comment on the
issues: writegrant),typos.Related
melodic-software/ci-workflows#191 (merged 2026-07-21T10:06:31Z) implements the
reusable workflow this caller invokes, carrying the settled mechanism from
#506's 2026-07-20 Class-B research-resolution comment and the tower decision
comment confirming this thin-caller shape.
Test plan
actionlint .github/workflows/issue-triage-label.ymlzizmor --persona=pedantic .github/workflows/issue-triage-label.yml(0 findings)typos .github/workflows/issue-triage-label.ymlgh label listconfirmspriority: needs-triageexists live in this repo