fix(pr-issue-linkage): ignore markers in code - #355
Conversation
|
Bugbot is not enabled for your account, so this pull request was not reviewed. Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs. |
|
Claude finished @kyle-sexton's task in 4m 16s —— View job Code review
SummaryThis PR masks fenced- and inline-code contents in the PR body before the linkage-gate check, fixing the case where example text like "No linked issue" inside a code span/fence could satisfy the gate. Scope is narrow (only the Findings1. Inline code's closing backtick delimiter leaks into the "masked" output — pr-issue-linkage.yml:198 (posted as an inline review comment) Hand-traced This is asymmetric with the (correct) opening-tick handling and doesn't fully satisfy the code's own stated goal ("Code contents are masked from the returned text"). It's likely benign against the current keyword/ Verification noteI could not independently execute No other correctness, error-handling, or maintainability issues found in the diff. The fenced-code masking ( |
|
Claude finished @kyle-sexton's task in 3m 39s —— View job Security Review — PR #355
|
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: a2ced9509a
ℹ️ 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 has reviewed this PR 1 time. The lane skips further automatic reviews after 5; deleting this comment resets the count. |
|
Claude finished @kyle-sexton's task in 1m 54s —— View job Security Review — PR #355
|
No linked issue ## Summary - approve the exact `ci-workflows` v0.10.2 SHA in runner policy - deploy the shared PR issue linkage caller at that SHA - document the parser hardening that masks inline, fenced, and indented code while preserving real linkage metadata - retain the existing contract, permissions, secret flow, and reusable-workflow routing ## Verification - `actionlint .github/workflows/pr-issue-linkage.yml` - `python components/runner-policy/scripts/lint_runner_policy.py` - `python -m unittest discover -s components/runner-policy/tests` (242 tests) - `markdownlint README.md` - generated-distribution diff check ## Related - melodic-software/ci-workflows#355 - #327 - melodic-software/claude-code-plugins#1956 - `ci-workflows` release `v0.10.2`
No linked issue ## Summary Move the locally owned PR-linkage caller to the reviewed `ci-workflows` v0.10.2 release. This deploys the Markdown-aware parser that ignores linkage-like text inside inline, fenced, and indented code while preserving real HTML-comment metadata and the existing exact Dependabot exemption. The exact reusable-workflow SHA is approved by the synced runner policy from `standards@0d0c144`. ## Verification - `actionlint .github/workflows/pr-issue-linkage.yml` - `node .github/standards/runner-policy/runner-policy.mjs --root .` - `git diff --check` ## Related - melodic-software/ci-workflows#355 - melodic-software/standards#328 - #1957 - claude-code-plugins#1933
## Summary The scheduled `claude-lanes-repin` job has resolved v0.10.2 every day since 2026-08-05 and opened nothing: no re-pin App credential is provisioned, so it warns and directs a re-pin by hand. This is that hand re-pin, with the component rewrite performed by `repin-callers.sh apply` rather than by editing the pins directly. v0.10.2 is `e94438746c300b02385a7f8a2a2dcd19a7f4ad4a` (lightweight tag, ref points straight at the commit). ## Contract surface Both lane reusables carry an unchanged workflow-call contract against v0.9.1: identical input names, identical secret key set and required-ness, and no change to `runs-on` or the caller-permission surface. `select-runner.yml` is byte-identical between the two tags. The new `approvedReusableWorkflowContracts` entries are therefore verbatim copies of their `c136b27f` predecessors under a new SHA key, and the selector reference is owner-scoped as before. The lane deltas are internal to the reusables: the review lane moves its inline-comment tool grant out of the caller-replaceable `claude-args` default into the compose step, adds a scoped `Bash(gh pr diff:*)` grant, routes findings to line-anchored review comments, and narrows its retry gate to count real assistant turns. ## Scope `standards` is the manifest source, not a sync target, so its repo-local `.github/workflows/claude-review.yml` is re-pinned here alongside the components. The managed consumers (dotfiles, github-iac, medley, provisioning) receive the bump through the normal sync cascade; the one locally-owned caller set (claude-code-plugins) is re-pinned in its own repository. Ref: melodic-software/ci-workflows#355 Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
) ## Summary Re-pins this fixture's Claude review caller from ci-workflows v0.9.1 (`c136b27f`) to v0.10.2 (`e94438746c300b02385a7f8a2a2dcd19a7f4ad4a`). The workflow's own header records why this is a hand re-pin: > LOCALLY OWNED — not a sync-manifest target and not a standards-managed file. > This fixture is deliberately outside the caller wave […] Repin it by hand > when the fleet pin moves. ## Contract surface The reusable's input names, secret key set, `runs-on`, and caller-permission surface are unchanged against v0.9.1, so the caller needs no edit beyond the pin line. ## No policy dependency Unlike the claude-code-plugins caller bump, this repository carries no `.github/standards/runner-policy/` materialization and no runner-policy gate, so this PR has no ordering dependency on the standards policy approval and can merge on its own. ## Related No linked issue. This PR closes nothing. Related, not closed: - melodic-software/standards#337 — the policy approval and component re-pin. - melodic-software/claude-code-plugins#1990 — the locally-owned caller bump (blocked on the sync). - melodic-software/ci-workflows#355 — the change released as v0.10.2. Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
…337) ## Summary Re-pins the Claude review and security lane callers from ci-workflows v0.9.1 (`c136b27f`) to v0.10.2 (`e94438746c300b02385a7f8a2a2dcd19a7f4ad4a`), and approves that revision in `runner-policy`. The scheduled `claude-lanes-repin` job has resolved v0.10.2 on every run since 2026-08-05 and opened nothing — no re-pin App credential is provisioned, so it warns and directs a re-pin by hand: > `components/claude-lanes/` is behind ci-workflows v0.10.2, but no re-pin App > credential is configured, so no pull request was opened. […] Until then, > re-pin by hand. This is that hand re-pin. The component rewrite was produced by `repin-callers.sh apply v0.10.2 <sha>` — the same subject the scheduled job runs — rather than by editing the pins directly, so the script's own count guard covered the rewrite. ## Contract surface Both lane reusables carry an **unchanged** workflow-call contract against v0.9.1: - identical input names on `claude-review.yml` and `claude-security-review.yml` - identical secret key set and `required:` flags - no change to `runs-on` or to any caller-permission surface - `select-runner.yml` is **byte-identical** between the two tags The new `approvedReusableWorkflowContracts` entries are therefore verbatim copies of their `c136b27f` predecessors under a new SHA key, and the selector reference stays owner-scoped to `melodic-software`. The lane deltas are internal to the reusables: the review lane moves its inline-comment tool grant out of the caller-replaceable `claude-args` default into the compose step (so replacing that default can no longer drop it), adds a scoped `Bash(gh pr diff:*)` grant in its place, routes findings to line-anchored review comments, and narrows its retry gate to count real assistant turns. The one security-relevant delta — routing every line-anchorable finding through the inline-comment tool widens the surface on which untrusted diff content reaches a rendered comment carrying a one-click-applicable suggestion block — sits inside the reusable, not on the contract, and is recorded in the runner-policy README alongside the `contents: read` precedent. ## Scope `standards` is the manifest **source**, not a sync target, so its repo-local `.github/workflows/claude-review.yml` is re-pinned here alongside the components. - Managed consumers (dotfiles, github-iac, medley, provisioning) receive the bump through the normal sync cascade — not hand-edited. - The one `locally-owned` caller set (claude-code-plugins) is re-pinned in its own repository. - `claude-lane-sandbox` is a hand-wired fixture and is re-pinned separately. ## Test plan - `components/runner-policy`: `node --test runner-policy.test.mjs` — 242/242 pass. The selector-allowlist assertion required the new revision's constant (`INLINE_COMMENT_LANE_SHA`) and list entry; that is the only test change. - `npm run lint:runner-policy` (the self-gate CI runs) — `Runner policy passed.` - `harness/shell/run-tests.sh` — 23 passed, 0 failed, 3 skipped. This includes `components/claude-lanes/claude-lanes.test.sh` (30/30), which materializes the re-pinned component into every managed consumer and actionlints the result. ## Related No linked issue. This PR closes nothing. Related, not closed: - melodic-software/ci-workflows#355 — the change released as v0.10.2. - melodic-software/claude-code-plugins#1990 — the locally-owned caller bump, which is BLOCKED until this PR merges and its sync PR delivers the updated `policy.json` there. - melodic-software/claude-lane-sandbox#3 — the hand-wired fixture bump (independent; no policy dependency). Operator note: no `CLAUDE_LANES_REPIN_APP_CLIENT_ID` / `CLAUDE_LANES_REPIN_APP_PRIVATE_KEY` is provisioned, which is why this re-pin is manual. Provisioning them would let the scheduled job open this PR itself. --------- Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
…1990) > [!WARNING] > **Do not merge before melodic-software/standards#337 has merged AND its sync > PR has landed here.** CI on this branch is expected RED until then — see > "Ordering" below. The `do-not-merge` label is applied deliberately. ## Summary Re-pins both Claude lane callers from ci-workflows v0.9.1 (`c136b27f`) to v0.10.2 (`e94438746c300b02385a7f8a2a2dcd19a7f4ad4a`). These two callers are `locally-owned` in the standards sync manifest, not managed — this is the org's one PUBLIC caller target, and runner-policy forbids a public repository from referencing the governed `select-runner` indirection — so the pins are bumped here rather than arriving by sync. Neither reusable changes its input names, secret key set, `runs-on`, or caller-permission surface against v0.9.1, so no caller edit beyond the pin is required. ## Ordering — this PR is blocked `.github/standards/runner-policy/policy.json` is a MANAGED materialization and is deliberately **not** touched here. It still approves only `c136b27f`, and the gate fails closed on the new SHA. Measured locally on this branch: ``` $ node .github/standards/runner-policy/runner-policy.mjs --root . .github/workflows/claude-review.yml#review: runner-target-contract: the reusable workflow path@SHA has no reviewed runner-input contract (auto-approval declined: inputs changed since the previously reviewed ...@1d3762c2) .github/workflows/claude-security-review.yml#security-review: runner-target-contract: the reusable workflow path@SHA has no reviewed runner-input contract (auto-approval declined: inputs changed since the previously reviewed ...@66073e58) exit 1 ``` The same command on the unmodified base exits `0`, so this is caused by the pin bump and not pre-existing. melodic-software/standards#337 adds the v0.10.2 contracts to the policy source. Merging it triggers the sync cascade (`sync.yml` runs on `push` to `main`), which delivers the updated `policy.json` here. Once that sync PR merges, re-run CI on this branch and it goes green. ## Test plan - `node .github/standards/runner-policy/runner-policy.mjs --root .` — currently exits 1 by design (above); expected to exit 0 after the policy sync lands. - No other repository check is affected: the change is two `uses:` pin lines. ## Related No linked issue. This PR closes nothing. Related, not closed: - melodic-software/standards#337 — the policy approval and component re-pin this PR depends on. - melodic-software/ci-workflows#355 — the change released as v0.10.2. - melodic-software/claude-lane-sandbox#3 — the hand-wired fixture bump (independent; no policy dependency). Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>

No linked issue
Summary
Mask inline-code and fenced-code contents before validating PR linkage metadata. The v0.10.1 parser correctly prevented literal HTML-comment markers in code from hiding later live metadata, but preserved other code contents long enough for example
No linked issueor## Relatedtext to satisfy the gate.This keeps the comment-parser fix while restoring fail-closed behavior for linkage markers that are not rendered as metadata.
Verification
node --test .github/scripts/pr-issue-linkage.test.cjs(23/23)actionlint .github/workflows/pr-issue-linkage.ymlgit diff --checkRelated