feat(issue-triage-label-self): dogfood caller pinned at merged SHA - #195
Conversation
… SHA Closes the runtime-verification gap for issue-triage-label.yml: no issues:opened/reopened trigger path existed in this repo before this caller, so the reusable's label-set guard and fail-closed existence check have only been exercised via local linting and an out-of-band API test, not a real GitHub Actions event. This repo already carries a real `priority: needs-triage` label, so the caller is a genuine end-to-end exercise, not a stub. Mirrors pr-issue-linkage-self.yml's shape: pinned to the reusable's merged SHA (c5e729c, PR #191), not a PR head. Closes #192 ## Related #191 (adds issue-triage-label.yml)
|
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 55s —— View job PR Review: feat(issue-triage-label-self): dogfood caller pinned at merged SHA
SummaryThis PR is clean. The new dogfood caller is correctly structured, the SHA pin is verified, permissions follow least-privilege, and the trigger contract matches what the reusable documents as required. No blocking or important findings. SHA Pin — Verified ✅The full SHA Trigger Contract — Correct ✅The reusable's header explicitly documents:
This caller does exactly that. The in-workflow guard ( Permissions — Correct ✅
Per CLAUDE.md: "A called workflow can only downgrade the caller's No Concurrency Block — Appropriate ✅Unlike CLAUDE.md / REVIEW.md Alignment ✅
🟡 Nit — Implicit defaults leave caller intent undocumented
The caller omits the label: 'priority: needs-triage'
label-prefix: 'priority:'These defaults are correct for this repo today. However, if the reusable's defaults ever change (e.g., a label rename across adopters), this caller silently follows — there's nothing to Not a blocker — the PR description notes intentional use of defaults, and the defaults are empirically correct. Worth considering on the merge or as a follow-up. Fix this → Verdict: Approve. The one nit above is genuinely optional given the PR's explicit rationale. The live verification step (open/reopen a real issue post-merge and confirm label application) documented in the test plan is the right remaining gate. |
|
Claude finished @kyle-sexton's task in 1m 4s —— View job Security Review
No security issues found. Reviewed Trigger — safe event
Permissions — correctly minimalpermissions: {} # workflow-level: everything locked out
jobs:
issue-triage-label:
permissions:
issues: write # job-level: only what addLabels needsTop-level SHA pin — correct and complete
No secrets, no shell execution, no untrusted input propagation
Reusable verified in scopeI also read the referenced Summary: The caller introduces no new attack surface. Trigger is safe, permissions are minimal, the pin is a full SHA at the merged commit, no secrets or untrusted input flows through. LGTM from a security standpoint. |
|
Tower merge (overnight delegation 2026-07-21, veto window open): dogfood self-caller mirroring sibling pattern, SHA-pin verified by review to resolve to #191's squash commit, least-privilege, all checks green. Live e2e trigger will be exercised immediately post-merge (reopen an unlabeled issue, verify the floor label lands). This was generated by AI (control tower, session 6). |
…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)
Closes #192
Summary
Adds
.github/workflows/issue-triage-label-self.yml, the dogfood caller forissue-triage-label.yml(#191), pinned to that reusable's merged squash SHA(
c5e729c), not a PR head — mirroringpr-issue-linkage-self.yml's pindiscipline exactly.
Why this exists:
issue-triage-label.ymlhad noissues: opened/reopenedtrigger path anywhere in this repo before now, so its label-set guard and
getLabel→ 404 →setFailedfail-closed check were only ever exercised bylocal linting and an out-of-band API test in a disposable repo — not a real
GitHub Actions event. This repo already carries a real
priority: needs-triagelabel (confirmed viagh label list), so this caller is agenuine end-to-end exercise, not a stub.
Locally verified clean:
actionlint,zizmor --persona=pedantic(0findings),
editorconfig-checker,typos.Related
#191 (adds
issue-triage-label.yml, merged atc5e729c0af0e55ffed4675ec85c1b57356fef79e).Test plan
actionlint .github/workflows/issue-triage-label-self.ymlzizmor --persona=pedantic .github/workflows/issue-triage-label-self.yml(0 findings)editorconfig-checker/typosover the changed filewith no
priority:*label and confirmpriority: needs-triageisapplied by this caller
🤖 Generated with Claude Code