Skip to content

docs(review): reconcile stale code-review framing in fanout SKILL.md + findings-normalization.md - #1351

Merged
kyle-sexton merged 4 commits into
mainfrom
docs/1325-reconcile-code-review-framing-fanout
Jul 25, 2026
Merged

docs(review): reconcile stale code-review framing in fanout SKILL.md + findings-normalization.md#1351
kyle-sexton merged 4 commits into
mainfrom
docs/1325-reconcile-code-review-framing-fanout

Conversation

@kyle-sexton

Copy link
Copy Markdown
Contributor

This was generated by AI during work-loop execution.

Summary

  • fanout/SKILL.md's "Orchestrator plugins" section and fanout/context/findings-normalization.md
    described code-review as one of three optional claude-plugins-official marketplace
    orchestrator plugins, invoked as /code-review:code-review. Per current official docs
    (https://code.claude.com/docs/en/code-review), /code-review is a bundled built-in command
    (invoked bare, no plugin namespace) — the "parallel agents / posts PR comments" behavior
    actually belongs to the separate managed Code Review GitHub App service. Neither is an
    installable marketplace plugin.
  • Reworded SKILL.md's Orchestrator plugins section down to the two real plugins
    (pr-review-toolkit, codex) and added a new "Boundary" section documenting the two
    built-in/managed surfaces distinctly, mirroring the pattern quality-gate's pr.md already
    uses (docs(review): reconcile stale code-review framing in quality-gate pr.md and README #732).
  • Removed the code-review row from findings-normalization.md's per-surface parse-contracts
    table and its Stage-1 no-severity example, since neither built-in surface is dispatched as a
    normalized fan-out leaf.
  • Updated two fanout evals (pr-comment-gate-opt-in, renamed
    unscored-surface-severity-derived-not-invented) that referenced the same stale "code-review
    orchestrator plugin" framing, for internal consistency within the same skill directory.
  • Bumped review 0.15.0 -> 0.15.1 (docs-only patch) with a CHANGELOG entry.

Test plan

  • Re-verified the built-in-vs-managed-service split against current official docs
    (https://code.claude.com/docs/en/code-review), fetched during this session.
  • npx markdownlint-cli2 against the three changed Markdown files — 0 issues.
  • check-jsonschema against plugins/skill-quality/reference/evals.schema.json for the
    changed evals.json — valid.
  • check-jsonschema against the plugin manifest schema for the changed plugin.json — valid.
  • jq empty on evals.json to confirm well-formed JSON.
  • Grepped the whole review plugin for remaining code-review mentions after the edit —
    the only survivors are code-reviewer (the agent, unrelated) and the new correct
    built-in/managed-service framing.

Related

Note on same-plugin concurrency: #732's fix (docs/732-reconcile-code-review-framing) is not
yet merged and also bumps review's version/CHANGELOG. This PR's diff touches disjoint files
(fanout/* vs quality-gate/pr.md + README.md), so there is no content conflict, but the
plugin.json version bump and CHANGELOG.md insertion point may need a rebase at merge time if
#732 lands first — a known, accepted risk for concurrent same-plugin items per this loop's own
dispatch documentation.

…+ findings-normalization.md

fanout/SKILL.md's "Orchestrator plugins" section described code-review as one
of three optional claude-plugins-official marketplace plugins, invoked as
/code-review:code-review. findings-normalization.md's per-surface parse-
contracts table and Stage-1 severity crosswalk carried the same assumption.
Per current official docs (https://code.claude.com/docs/en/code-review),
/code-review is a bundled built-in command (invoked bare, no plugin
namespace); the "parallel agents / posts PR comments" behavior actually
belongs to the separate managed Code Review GitHub App service. Neither is
an installable marketplace plugin.

Reworded SKILL.md's Orchestrator plugins section down to the two real
plugins (pr-review-toolkit, codex) and added a Boundary section documenting
the two built-in/managed surfaces distinctly, mirroring the pattern pr.md
already uses (#732). Removed the code-review row from findings-
normalization.md's parse-contracts table and its Stage-1 no-severity
example, since neither built-in surface is dispatched as a normalized
fan-out leaf. Updated two fanout evals that referenced the same stale
"code-review orchestrator plugin" framing for internal consistency. Bumped
review 0.15.0 -> 0.15.1 (docs-only patch) with a CHANGELOG entry.

Closes #1325

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@claude

claude Bot commented Jul 25, 2026

Copy link
Copy Markdown

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


Code Review

Todo List

  • Gather context and understand the PR
  • Read changed files and diff
  • Review for correctness, alignment, and consistency
  • Post findings

This is a documentation-only patch that fixes a factual misclassification (code-review was described as a claude-plugins-official marketplace plugin in the fanout skill; it is in fact a bundled built-in command, with the parallel-agent/PR-comment behavior belonging to the separate managed Code Review GitHub App service). All five changed files are in scope and the changes are internally consistent. No security concerns.


SKILL.md — Orchestrator plugins + new Boundary section

The rewrite is accurate and well-structured. The key improvements:

  • Count correction "Three optional orchestrator plugins""Two optional orchestrator plugins" is correct now that code-review has been removed from that list.
  • New ## Boundary section clearly distinguishes the built-in /code-review command from the managed GitHub App, mirrors the pattern already established in quality-gate/pr.md (docs(review): reconcile stale code-review framing in quality-gate pr.md and README #732 reference is appropriate), and cross-references findings-normalization.md. The PR-mutation gate guidance is preserved and extended to cover both surfaces correctly.

One minor observation on the Boundary section at line 98:

Not enabled/available → note the skip; a repository's own CI review bot (e.g. the managed service, when enabled) still provides PR coverage independently.

The phrase "a repository's own CI review bot (e.g. the managed service, when enabled)" is slightly awkward — if the managed service isn't enabled, this reads as if nothing provides coverage. The parallel structure in the old code-review bullet ("Absent → note the skip") was slightly cleaner. This is cosmetic and not a blocker.


findings-normalization.md — Parse-contracts table + Stage-1 bullet

Both changes are correct:

  • Table row removal: Deleting the code-review plugin row is right — neither built-in surface is a normalized fan-out leaf, so no parse contract is needed.
  • Bold explanatory note: **Not in this table:** the bundled /code-review command... at line 20 is an excellent addition — it proactively answers the "why isn't it here?" question for future readers.
  • Stage-1 bullet generalization: Removing the (e.g. the code-review plugin) parenthetical from the "Surfaces emitting no severity" rule is correct; the rule was always general, and the specific example was misleading since that surface is now removed. The rule stands cleanly on its own.

evals.json — Evals 6 and 11

Both eval updates are accurate and consistent with the corrected documentation.


plugin.json — Version bump

0.15.00.15.1 is appropriate for a docs-only patch. The $schema field points to the correct SchemaStore manifest schema.


CHANGELOG.md

The [0.15.1] entry is thorough and cites the official docs URL consulted during the fix. Consistent with the existing format in the file (no release dates, no compare-diff links at the bottom). No issues.


Concurrent-PR risk (acknowledged)

The PR description notes that #732 (docs/732-reconcile-code-review-framing) also bumps review's version and CHANGELOG, and that plugin.json / CHANGELOG.md may need a rebase if #732 lands first. The content changes are in disjoint files, so there is no semantic conflict — only an insertion-point collision in CHANGELOG.md and a version-line collision in plugin.json. The risk is correctly characterized as "known, accepted" and is straightforward to resolve at merge time.


Summary

Clean, accurate, well-scoped docs patch. All five files are consistently updated, the new ## Boundary section mirrors the established pattern, the eval generalization is correct, and the version bump is appropriate. The one cosmetic phrasing observation in SKILL.md line 98 is not a blocker. No changes required — ready to merge (pending #732 ordering resolution).

@claude

claude Bot commented Jul 25, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 56s —— View job


Security Review

  • Gather context
  • Read changed files
  • Analyze for security issues
  • Post findings

No security issues found.

This PR is documentation-only. All five changed files are Markdown prose, a JSON eval fixture, and a version-bump to plugin.json. A targeted review of each:

File Change Security verdict
plugin.json 0.15.00.15.1 version bump Clean — no schema, dependency, or permission changes
CHANGELOG.md Prose entry + one URL reference Clean — URL is a documentation cite, no fetch or action
fanout/SKILL.md Rewords "Orchestrator plugins", adds "Boundary" section Clean — behavioral prose for Claude agents; no code execution, no injection surface
fanout/context/findings-normalization.md Removes stale table row, adds explanatory note Clean — static reference table
fanout/evals/evals.json Renames two eval entries, updates prompt/expected_output/expectations strings Clean — JSON data consumed as test fixtures, never eval'd as code; no secrets or shell expansion

Checked surfaces:

  • No GitHub Actions workflows touched (none of the five files are under .github/)
  • No pull_request_target, workflow_run, or permissions: changes
  • No script injection via ${{ github.* }} context in run: blocks
  • No action or dependency pins loosened or unpinned
  • No credentials, tokens, API keys, or PII introduced
  • No path traversal or command injection surfaces — all added text is prose or JSON string values consumed by eval harnesses, not shell commands
  • The string /code-review --comment in evals.json and @claude review in SKILL.md are descriptive text, not executable triggers in any automated context

@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: 4e56eb3442

ℹ️ 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 plugins/review/skills/fanout/context/findings-normalization.md Outdated
Comment thread plugins/review/skills/fanout/SKILL.md
@kyle-sexton

Copy link
Copy Markdown
Contributor Author

🤖 Autonomous merge lane — held, premise falsified. (AI-generated.)

Do not merge this PR as written. It was green and gate-ready; the merge lane held it anyway because its central factual premise does not survive checking against primary sources.

The premise

Both this PR and its sibling assert that no installable code-review plugin exists — that the "parallel agents / confidence scoring / posts PR comments" behavior belongs solely to the managed Code Review GitHub App, and that /code-review is only a bundled built-in command. On that basis they delete the code-review orchestrator plugin's documentation: its pr.md section, its README bullet, its orchestrator roster entry, its parse-contract row, and its Stage-1 example.

The premise is false

code-review is a live plugin in the official Anthropic marketplace. Verified this session against the primary source, not recall:

  • anthropics/claude-plugins-official.claude-plugin/marketplace.json carries an entry "name": "code-review", author Anthropic, "source": "./plugins/code-review", described as "Automated code review for pull requests using multiple specialized agents with confidence-based scoring to filter false positives."
  • anthropics/claude-plugins-officialplugins/code-review/commands/code-review.md exists and defines /code-review:code-review. Its own steps: launch 5 parallel Sonnet agents to review independently, then score each finding 0–100 for confidence via Haiku agents, filter the low-confidence ones, and post via gh pr comment.

That is precisely the behavior the deleted pr.md section described. The documentation this PR removes was accurate.

The correct diagnosis: three surfaces exist, not two

  1. The installable code-review@claude-plugins-official plugin/code-review:code-review. Real, and wrongly deleted here.
  2. The bundled built-in /code-review command — invoked bare, no install. Real; this PR discovered it correctly.
  3. The managed Code Review GitHub App — org-level service, posts inline comments. Real; this PR discovered it correctly.

The PR found (2) and (3), wrote a genuinely useful Boundary section for them, and then wrongly concluded that (1) does not exist. The Boundary work is worth keeping. The deletion is not.

Secondary defect, independent of the above

findings-normalization.md (and the SKILL.md Boundary) assert that both /code-review surfaces "mutate the PR directly." Current official documentation (https://code.claude.com/docs/en/code-review, fetched this session) states that bare /code-review reports findings in the conversation, and that only --fix (working-tree edits) and --comment (inline PR comments) mutate. Classifying the bare invocation as PR-mutating makes the stated rationale false and causes fanout to skip an always-available read-only review surface.

Suggested remedy — a design call for the authoring lane, not this one

  • Restore surface (1): the orchestrator bullet, the parse-contract row, the Stage-1 example, and the pr.md section.
  • Keep the corrected Boundary section covering surfaces (2) and (3) — that part is an improvement.
  • Fix the "both mutate" clause to match the documented flag behavior.
  • Do not apply the "update README lines 61-63" remedy suggested in the sibling PR's review thread: plugins/review/README.md:61-63 is correct as it stands, and that change would propagate the error into public install documentation.

Blast radius (named, not touched)

Note on one commit in PR #1326

The merge lane pushed 0936b4e3 to that branch before this premise was falsified: a one-line fix changing a broken context/pr.md pointer to a working link to skills/quality-gate/context/pr.md. That fix is correct in isolation and independent of the premise dispute — keep it under whichever remedy you choose.

Nothing was merged. No force-push, no rebase, no --admin, no work-class label touched. Role label applied per the escalation contract; this repo's .work-item-tracker.json carries no config.role_labels map, so the canonical needs-human default was used.

@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: 2ff0a9d9dd

ℹ️ 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 plugins/review/skills/fanout/SKILL.md Outdated
@kyle-sexton

Copy link
Copy Markdown
Contributor Author

🤖 Autonomous merge lane — still held. (AI-generated.) Updating the earlier escalation with what has changed.

The partial fix landed; the premise fix did not. Commit 2ff0a9d9 corrected the bare-/code-review mutation misclassification — that was one of the two defects named above, and the correction is right.

The other defect is untouched. plugins/review/skills/fanout/SKILL.md still reads:

Neither is an installable claude-plugins-official marketplace plugin — both ship with Claude Code itself

and the orchestrator roster is still reduced to pr-review-toolkit + codex, with code-review removed.

Re-verified after the sibling merge, directly against the marketplace source: anthropics/claude-plugins-official's marketplace.json lists both code-review and pr-review-toolkit — same author (Anthropic), same category: productivity. plugins/code-review/commands/code-review.md defines /code-review:code-review (5 parallel Sonnet reviewers, 0-100 confidence scoring, gh pr comment). The claim is false.

Sibling PR #1326 merged at 21:12Z with the same false premise intact, shipping it to main in review v0.15.1. That regression is now tracked in #1402, which carries the full evidence and a suggested remedy.

This PR would compound the same error into fanout's SKILL.md, so the merge lane continues to hold it. It is also currently CONFLICTING.

Remedy unchanged: restore the code-review orchestrator entry, keep the corrected Boundary section for the built-in command and the managed service, keep the corrected mutation gate. Items #732 and #1325 still carry the premise upstream and are labeled needs-human — worth fixing there first, or this gets re-derived.

…plugins into HEAD

# Conflicts:
#	plugins/review/CHANGELOG.md
#	plugins/review/README.md
@claude

claude Bot commented Jul 25, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 3m 15s —— View job


Code Review

Todo List

  • Gather context and understand the PR
  • Read changed files and diff
  • Review for correctness, alignment, and known issues
  • Post findings

Summary

This PR carries the same false central premise that the merge lane's escalation comment identified and documented in detail. The review below is scoped to the six changed files and treats the merge lane's factual finding — that code-review IS a live installable claude-plugins-official marketplace plugin (/code-review:code-review) — as established, per the independently re-verified evidence in the two escalation comments.


Blocking: false premise persists in SKILL.md Boundary section

File: plugins/review/skills/fanout/SKILL.md:93

The Boundary section states:

Neither is an installable claude-plugins-official marketplace plugin — both ship with Claude Code itself.

"Both" refers to the bundled /code-review command and the managed Code Review GitHub App service. This claim is correct for those two surfaces taken alone. The problem is that the same sentence is used to justify removing the installable code-review plugin (/code-review:code-review) from the orchestrator roster — but that plugin is a third, distinct surface, not one of the two the Boundary section names. The Boundary section needs a sentence that explicitly distinguishes the installable plugin from the bundled command; otherwise it misclassifies all three surfaces as non-installable.


Blocking: orchestrator roster is incomplete

File: plugins/review/skills/fanout/SKILL.md:86

Two optional orchestrator plugins add adversarial breadth — `pr-review-toolkit` from the
`claude-plugins-official` marketplace, plus the OpenAI Codex plugin (`codex@openai-codex`)…

The installable code-review plugin (code-review@claude-plugins-official, invoked as /code-review:code-review) was removed from this list. Per the merge lane's primary-source verification, the plugin exists in anthropics/claude-plugins-official with "name": "code-review", author Anthropic, parallel-agent fan-out and 0–100 confidence scoring behavior. The roster count ("Two") and the bullet list should both be restored to three, with the corrected mutation-gate understanding from commit 2ff0a9d9 (bare invocation is report-only; only --comment posts to the PR). Fix this →


Blocking: README.md omits code-review from orchestrator list

File: plugins/review/README.md:58–70

The "Graceful degrade" bullet was updated to remove code-review from the optional orchestrator plugin list. This is the public install documentation that users read to know what to install. If the plugin exists (and the escalation confirms it does), removing it here misdirects consumers.


Blocking: CHANGELOG.md for 0.15.1 perpetuates the false premise

File: plugins/review/CHANGELOG.md

The 0.15.1 entry (added in this diff as part of the pre-existing state from sibling PR #1326 merging into main) describes /code-review:code-review as not being an installable marketplace plugin. The 0.15.2 entry's "Fixed" narrative also builds on this framing. Since the merge lane has now falsified this claim with primary-source evidence, the changelog entries are factually incorrect as written. They would lock in the false premise as permanent historical record.


What commit 2ff0a9d9 got right (non-blocking, preserve)

The bare-invocation correction — classifying bare /code-review as report-only (findings in conversation only; --fix and --comment mutate) — is correct and should be kept regardless of how the orchestrator roster issue is resolved. The updated eval #6 (pr-comment-gate-opt-in) and the generalized eval #11 rename (unscored-surface-severity-derived-not-invented) accurately reflect the corrected behavior and are good changes.


What's worth keeping (non-blocking, good work)

  • Boundary section concept: The new ## Boundary section in SKILL.md is architecturally sound. Documenting the distinction between the bundled command and the managed service is a real improvement. The section just needs to explicitly carve out the installable plugin as a separate, in-scope orchestrator.
  • findings-normalization.md explanatory note at line 20: "Not in this table: the bundled /code-review command and the managed Code Review GitHub App service…" is accurate for those two surfaces and should be preserved.
  • Mutation-gate logic: The PR-mutation gate scoping (--comment and managed service gate; bare invocation ungated) is now correct after 2ff0a9d9.

Suggested resolution

Per the merge lane escalation (aligned with Codex's P2 findings and the second escalation comment):

  1. Restore the code-review orchestrator plugin bullet to SKILL.md's "Orchestrator plugins" section (THREE total, not two), with the corrected --comment-only mutation gate.
  2. Clarify the Boundary section to explicitly distinguish the installable plugin (/code-review:code-review) from the bundled command — these share a name but are different surfaces with different invocation paths.
  3. Restore code-review to the README "Graceful degrade" roster.
  4. Correct the CHANGELOG entries so they don't assert the plugin is non-installable.
  5. Rebase (the PR description notes it is currently conflicting) and address the quality-gate/context/pr.md cross-reference (now moot since docs(review): reconcile stale code-review framing in quality-gate pr.md and README #1326 merged that correction into main already).

Not ready to merge in current form.

@claude

claude Bot commented Jul 25, 2026

Copy link
Copy Markdown

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


Security Review

Todo List

  • Load tooling
  • Fetch PR diff
  • Read changed files
  • Analyze for security issues
  • Post findings

No security issues found.

This PR is documentation-only. All six changed files are Markdown prose, a JSON eval fixture, and a version bump in plugin.json. Each was reviewed for the surfaces the custom instructions enumerate.

File Change Verdict
plugin.json 0.15.0 → 0.15.1 version bump (branch HEAD shows 0.15.2 after follow-up commit) Clean — no schema, dependency, or permission changes
CHANGELOG.md Prose entries for 0.15.1 and 0.15.2; one URL cite (https://code.claude.com/docs/en/code-review) Clean — documentation cite, not a fetch trigger or action
README.md "Graceful degrade" bullet reworded; two local Markdown links added Clean — purely informational prose, local relative links only
fanout/SKILL.md "Orchestrator plugins" section reworded; new "Boundary" section added Clean — prose only; the !-prefixed pre-computed shell commands are pre-existing (unchanged by this PR); the new section contains no shell commands or auto-fetched URLs
fanout/context/findings-normalization.md Table row removed; bold explanatory note added Clean — static reference table edit
fanout/evals/evals.json Two eval entries renamed/updated (prompt, expected_output, expectations strings) Clean — JSON data consumed as test fixtures; strings like /code-review --comment are descriptive text, not executable triggers

Surfaces checked:

  • GitHub Actions — no files under .github/ were touched; no pull_request_target, workflow_run, or permissions: changes; no script injection via github context in run: blocks.
  • Shell injection — the !-prefixed pre-computed commands in SKILL.md's frontmatter block are unchanged. No new shell command strings were introduced in any changed file.
  • Secrets / credentials / PII — none present.
  • Supply chain — no action pins loosened, no new dependencies, no new remote MCP server references.
  • Path traversal — no file-path construction in the changed prose that could reach outside the plugin.
  • Data egress — no new external URLs that would be fetched automatically; the one URL added (code.claude.com/docs/…) is in a CHANGELOG prose line, not a hook or fetch directive.

…l ref space

The fanout boundary section cited quality-gate's pr.md with backticked link
text `context/pr.md`, which check-skill.sh reads as a skill-internal supporting
file and cannot resolve under the fanout skill dir. Name the cross-skill path in
the link text instead.
@claude

claude Bot commented Jul 25, 2026

Copy link
Copy Markdown

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


Code Review

Todo List

  • Load tooling
  • Read current diff and latest commit changes
  • Review changed files
  • Assess whether previous blocking issues are resolved
  • Post findings

Latest commit (61702c5) — valid fix, narrow scope

The synchronize event was triggered by a single-line change to SKILL.md:

-Two Claude Code surfaces overlap this skill's job … [`context/pr.md`](../quality-gate/context/pr.md)'s "Boundary" section
+Two Claude Code surfaces overlap this skill's job … [`quality-gate/context/pr.md`](../quality-gate/context/pr.md)'s "Boundary" section

The motivation is correct: when link text is a bare context/pr.md, check-skill.sh reads it as a skill-internal supporting file and fails to resolve it under the fanout skill directory. Renaming the link text to the full cross-skill path quality-gate/context/pr.md avoids the false alarm. This change is accurate and non-controversial.


Blocking issue — still open

The blocking issue identified in the two merge-lane escalations (2026-07-25T18:37:51Z, 2026-07-25T21:42:08Z) and in the previous code review pass (2026-07-25T22:05:24Z) has not been addressed by this commit.

What the official docs confirm (fetched this session)

https://code.claude.com/docs/en/code-review describes exactly two surfaces:

  1. Managed Code Review GitHub App service — Team/Enterprise org-level service, set up via admin settings, runs parallel review agents and posts findings as inline PR comments. Not a marketplace plugin.
  2. Bundled /code-review command — Runs locally in-terminal, no install required. Per docs: bare invocation is report-only; --fix and --comment mutate. Not a marketplace plugin.

The PR's framing of these two surfaces is correct. The Boundary section and the mutation gate classification are accurate against the official docs.

What the official docs do not confirm

The docs page at that URL describes the built-in command and the managed service. It does not enumerate the installable marketplace catalog. The merge-lane escalations claim — with stated primary-source verification against anthropics/claude-plugins-official's marketplace.json and plugins/code-review/commands/code-review.md — that a third, distinct surface exists:

Installable code-review@claude-plugins-official plugin — invoked as /code-review:code-review (namespaced), 5 parallel Sonnet reviewer agents, 0–100 confidence scoring via Haiku, gh pr comment output.

If that claim is accurate, the PR removes documentation for a real orchestrator surface by conflating it with the identically-named built-in command. The PR author has not independently re-verified against the marketplace repo as part of this revision; the verification cited in the PR description covers the docs page only.

Per the CLAUDE.md fresh-docs mandate:

"operate only off current official documentation… Before the change, open the index, WebFetch the page(s) it points to for current schema and behavior, and cite the URL."

The marketplace source (anthropics/claude-plugins-official) is the primary source for whether an installable plugin exists — the /code-review docs page is authoritative for the built-in command and managed service, but is not a complete enumeration of installable plugins.

What this means for the six changed files

File Status
SKILL.md line 86 — "Two optional orchestrator plugins" Contested: should be three if the installable plugin exists
SKILL.md line 93 — "Neither is an installable marketplace plugin" Contested: accurate for the two surfaces the Boundary section names, but used to justify removing a third surface
CHANGELOG.md line 10 — "nonexistent plugin" Contested: asserts the contested conclusion as historical fact
findings-normalization.mdcode-review row removed Contested: correct if no installable plugin; incorrect if the plugin exists and produces parseable findings
evals/evals.json — evals 6 and 11 Good: both evals are internally consistent with the rest of the PR; eval #11 rename is a real improvement
README.md lines 61–67 Contested: the "Graceful degrade" roster names only two orchestrators if the third exists

What is definitively good and should be kept

  • Boundary section structure: the concept of a dedicated section distinguishing built-in/managed surfaces from orchestrator plugins is an improvement. The section just needs to explicitly carve out the installable plugin as a separate in-scope surface if it exists.
  • Mutation gate correctness (from commit 2ff0a9d9): bare /code-review is report-only; only --comment and --fix mutate. This is confirmed against the official docs page and is correct.
  • Eval fix(markdown-formatter): harden hook + simplify plumbing #11 rename (plugin-findings-severity-derived-not-inventedunscored-surface-severity-derived-not-invented): the generalization is accurate — the rule applies to any surface with no native severity, not specifically the code-review plugin.
  • Link text fix (latest commit 61702c5): correct and necessary for the portability checker.

Suggested path to resolution

The authoring lane needs to verify the marketplace directly — fetch anthropics/claude-plugins-official's .claude-plugin/marketplace.json and plugins/code-review/ — and treat that as the primary source per the fresh-docs mandate. Two outcomes:

  1. Plugin does not exist: the PR's premise is correct. Address only the CHANGELOG wording ("nonexistent plugin" → something less absolute like "not present in the marketplace") and re-merge.
  2. Plugin exists: restore the code-review orchestrator bullet to SKILL.md (three total), restore its parse-contract row to findings-normalization.md, restore it to the README roster, and narrow the Boundary section to describe only the two surfaces it currently names (built-in command + managed service) — not the installable plugin.

Not ready to merge without that verification.

@claude

claude Bot commented Jul 25, 2026

Copy link
Copy Markdown

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


Security Review

Todo List

  • Gather context and understand the PR
  • Fetch PR diff and read changed files
  • Analyze for security issues
  • Post findings

No security issues found.

This PR is documentation-only. All six changed files are Markdown prose, a JSON eval fixture, and a version bump in plugin.json. I reviewed each for the injection, secrets, supply-chain, and GitHub Actions patterns called out in the review instructions.

File Change Verdict
plugin.json 0.15.10.15.2 version bump Clean — no schema, dependency, or permission changes
CHANGELOG.md Prose entries for 0.15.2; one URL cite (code.claude.com/docs/en/code-review) Clean — cite in prose, not a fetch directive or action trigger
README.md "Graceful degrade" bullet reworded; two local relative Markdown links added Clean — informational prose; local-only relative links, no external fetch
fanout/SKILL.md "Orchestrator plugins" count lowered to two, one bullet removed; new "Boundary" section added Clean — prose only; no new !-prefixed shell commands introduced; the existing pre-computed commands at lines 12–16 are unchanged by this PR
fanout/context/findings-normalization.md One table row removed; explanatory bold note added Clean — static reference table, no executable content
fanout/evals/evals.json Two eval entries renamed/updated (prompt, expected_output, expectations strings) Clean — JSON consumed as test fixtures; strings like /code-review --comment are descriptive text, not executable triggers

Surfaces checked:

  • GitHub Actions — no files under .github/ touched; no pull_request_target, workflow_run, or permissions: changes; no github context injection in run: blocks.
  • Shell injection — the pre-computed !-prefixed commands in SKILL.md's frontmatter (lines 12–16) are unchanged by this PR. No new shell command strings were introduced in any changed file.
  • Secrets / credentials / PII — none present.
  • Supply chain — no action pins loosened, no new dependencies, no new remote MCP server references.
  • Path traversal — no file-path construction in the changed prose that could reach outside the plugin; the two new relative links in README.md point to files inside the plugin (skills/quality-gate/context/pr.md, skills/fanout/SKILL.md).
  • Data egress — no new external URLs that would be fetched automatically; the code.claude.com URL appears only in a CHANGELOG prose line, not in a hook or fetch directive.
  • Prompt injection — the new prose in SKILL.md's Boundary section and findings-normalization.md's explanatory note describes Claude Code surfaces accurately and contains no embedded instruction that would alter agent behavior beyond its documented scope.

@kyle-sexton
kyle-sexton merged commit 7e070ef into main Jul 25, 2026
26 checks passed
@kyle-sexton
kyle-sexton deleted the docs/1325-reconcile-code-review-framing-fanout branch July 25, 2026 22:45
@kyle-sexton kyle-sexton added the do-not-merge Hard merge gate: do not merge while applied. label Jul 25, 2026
@kyle-sexton

Copy link
Copy Markdown
Contributor Author

🤖 do-not-merge applied — operator-authorized. (AI-generated.)

Commit d0bdcfe8 merged main in and cleared the conflict, so this PR is now MERGEABLE. The premise fix is still not in it. Checked at d0bdcfe8:

  • ## Orchestrator plugins (line 86) still lists only pr-review-toolkit + codex@openai-codex; the code-review entry is still removed.
  • ## Boundary — built-in/managed surfaces, not marketplace plugins (line 91) and line 93 still assert: "Neither is an installable claude-plugins-official marketplace plugin — both ship with Claude Code itself."

That claim is false. anthropics/claude-plugins-official's marketplace.json lists both code-review and pr-review-toolkit — same author (Anthropic), same category: productivity — and plugins/code-review/commands/code-review.md defines /code-review:code-review.

Why a label and not another comment. Sibling PR #1326 carried the identical dispute in a comment posted at 18:37Z and merged anyway at 21:12Z, shipping the false claim to main in review v0.15.1 (tracked in #1402). The merging lane never read the comment. A comment is not a gate; this label is. It is respected in every tier and at every rung, and it moves eligibility in the fail-closed direction only.

This label is a hold, not a verdict on the PR. Much of this change is good and should land: the Boundary section for the bundled command and the managed service is a genuine improvement, and the bare-/code-review mutation-gate correction in 2ff0a9d9 is right. Only the deletion of the installable plugin is wrong.

To clear the hold: restore the code-review orchestrator entry and its parse-contract row, retitle the Boundary heading (it asserts the false claim in the heading text itself), and correct line 93. Then remove the label and this lane will gate-merge it normally.

Upstream, item #1325 still carries the premise and is labeled needs-human; #732 was closed by the #1326 merge with the premise intact. Fixing only the PRs will let this be re-derived from the same brief.

@kyle-sexton

Copy link
Copy Markdown
Contributor Author

🤖 Merged carrying a falsified premise — this needs a follow-up fix. (AI-generated.)

This PR merged while an unresolved factual dispute was open on it. Recording it here so the history is legible; the correction is tracked in #1402.

The claim that landed

code-review is an installable plugin in the official Anthropic marketplace. Verified three times against the primary source, most recently after both merges:

  • anthropics/claude-plugins-official.claude-plugin/marketplace.json lists both code-review and pr-review-toolkit — same author (Anthropic), same category: productivity, sitting side by side in the same file.
  • code-review's entry: "Automated code review for pull requests using multiple specialized agents with confidence-based scoring to filter false positives", "source": "./plugins/code-review".
  • plugins/code-review/commands/code-review.md exists and defines /code-review:code-review. Its documented steps: 5 parallel Sonnet agents review independently, Haiku agents score each finding 0-100 for confidence, low-confidence findings are filtered, results post via gh pr comment.

That is exactly what the removed documentation described. The content deleted across these PRs was accurate.

Three surfaces exist, not two

  1. The installable code-review@claude-plugins-official plugin/code-review:code-review. Real. Removed by these PRs.
  2. The bundled built-in /code-review command — invoked bare, no install. Real; correctly discovered and documented.
  3. The managed Code Review GitHub App — org-level service. Real; correctly discovered and documented.

The work found (2) and (3) and wrote a genuinely good Boundary section for them, then wrongly concluded (1) does not exist.

What is right and should be kept

Not everything here is wrong, and the fix should be surgical:

  • The Boundary sections describing surfaces (2) and (3) are a real improvement.
  • The bare-/code-review mutation correction is right: bare invocation is report-only, and only --fix and --comment mutate. That matches https://code.claude.com/docs/en/code-review.

Only the removal of surface (1), and the "neither is an installable marketplace plugin" framing, are wrong.

Current state on main

The claim now appears in five places, shipped across review v0.15.1 and v0.15.2:

File Where
plugins/review/skills/quality-gate/context/pr.md line 7
plugins/review/README.md "Graceful degrade" bullet
plugins/review/skills/fanout/SKILL.md lines 91, 93 — heading asserts it too
plugins/review/skills/fanout/context/findings-normalization.md line 20
plugins/review/CHANGELOG.md the 0.15.1 and 0.15.2 entries state it as their rationale

Two fanout evals were also updated to match the removed framing, so the correction needs to reach those as well.

Both upstream items were auto-closed by these merges with the premise intact: #732 (closed 21:12Z) and #1325 (closed 22:45Z). Both should be reopened or superseded, or this gets re-derived from the same brief.

Suggested remedy

Restore surface (1) in all five files and the two evals; keep the Boundary sections and the mutation-gate correction; retitle the fanout Boundary heading, which asserts the false claim in the heading text itself; ship as v0.15.3 with a CHANGELOG entry recording the correction, since both prior entries cite the false premise as their rationale.

Nothing was reverted by this lane — reverting merged work on main is an operator decision, not an autonomous one.

kyle-sexton added a commit that referenced this pull request Jul 26, 2026
…face (#1431)

## Summary

- Restores the `review` plugin's three-surface framing after
`#1326`/`#1351` shipped a false
two-surface premise (that no installable `code-review` marketplace
plugin exists).
- `anthropics/claude-plugins-official`'s `marketplace.json` lists
`code-review` alongside
`pr-review-toolkit`; `plugins/code-review/commands/code-review.md`
defines
  `/code-review:code-review`. Re-verified live this session.
- Touches `pr.md`, `README.md`, `fanout/SKILL.md`,
`fanout/context/findings-normalization.md`,
`fanout/evals/evals.json`, and `CHANGELOG.md` (0.15.3 entry). The two
behavioral corrections the
`0.15.1`/`0.15.2` entries got right (bare `/code-review` stays ungated;
the managed App stays
described as built-in/managed) are preserved unchanged. History is
corrected forward — the prior
false CHANGELOG entries are left as written, with a new entry explaining
what was wrong and why.
- The plugin's mutation gate is **unconditional**, not scoped to "its PR
mode". Upstream
`plugins/code-review/commands/code-review.md` takes a PR as its only
target and its final step is
"use the `gh` bash command to comment back on the pull request with the
result"
(`allowed-tools` grants `Bash(gh pr comment:*)`); there is no mode that
returns findings to the
  session instead.

## Test plan

- [x] `plugins/review/tests/standards-binding.test.sh` — 8/8 pass, run
against this branch.
- [x] `markdownlint-cli2 'plugins/review/**/*.md'` — 27 files, 0 issues.
- [x] `fanout/evals/evals.json` parses.
- [x] Diff read in full against `origin/main` before opening this PR.

Closes #1402

## Related

- #1326 — the first PR that shipped the false two-surface premise, in
`quality-gate/context/pr.md`
  and `README.md`
- #1351 — carried that same false premise into `fanout/SKILL.md` and
  `fanout/context/findings-normalization.md`; this PR reverses both

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

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
@kyle-sexton

Copy link
Copy Markdown
Contributor Author

This was generated by AI during triage.

Correction to the dispute annotation on this PR

An earlier annotation on this PR asserted that it merged past a bypassed hard merge gate. That
framing is wrong and is being corrected on the record so a future reader does not act on it. Tracked
at #1409, which has been retriaged with the corrected mechanics.

What the event history actually shows:

2026-07-25T22:45:37Z  merged
2026-07-25T22:45:37Z  closed
2026-07-25T22:45:39Z  head_ref_deleted
2026-07-25T22:48:57Z  labeled  do-not-merge      <-- 3m20s AFTER the merge

There is exactly one labeled event for do-not-merge and no unlabeled event anywhere in this
PR's history. The label was applied to an already-merged PR; it was not present at merge time and
was therefore never bypassed.

The server-side gate was not defeated — it worked. The org ci-gate ruleset (id 17989001,
enforcement: active, bypass_actors: []) lists do-not-merge / do-not-merge as a required status
check. On this PR's head 61702c5, that check reports:

Conclusion Completed Correct?
success 2026-07-25T22:39:19Z Yes — no label present at that time
failure 2026-07-25T22:49:05Z Yes — fired 8s after the label landed, 4m after the PR had closed

Both results are correct for the label state at the moment each ran.

What actually went wrong was upstream of any gate: the escalating lane decided to hold this PR
but did not make the API call that performs the hold until roughly half an hour later, drafting its
escalation comment against a stale snapshot. The convention did not define a cross-lane PR-hold
mechanism, so the hold was expressed in a register nothing enforces.

Nothing about this PR's content is disputed by this correction, and nothing is being reverted. The
remedy — defining the cross-lane hold mechanism — is a decision parked for the operator on #1409.

kyle-sexton added a commit that referenced this pull request Aug 12, 2026
…n-explain (9.0.0) (#2512)

## Summary

Adds a **Cross-lane PR hold** subsection to the loop-lane convention's
§2 escalation contract, closing the gap the 2026-07-25 incident exposed:
an escalating lane decided PR #1351 must not merge, drafted its
explanation first, and applied `do-not-merge` ~30 minutes later — 3m20s
**after** the merge. Three independent investigations on the issue
converged on the same root cause: the server-side enforcement
(org-ruleset-required `do-not-merge` status check, no bypass actors)
worked correctly on both sides of the merge boundary; what no convention
defined was *when to engage it*. Holding a PR was undifferentiated from
escalating a tracker item, and the two acts fail differently — a PR hold
carries a hard real-time deadline.

The clause states three rules:

- **`do-not-merge` is the only cross-lane hold; a PR comment is never
one** (comments are advisory by construction — the same night, an
explicit "do not merge as written" comment on #1326 held nothing).
- **Hold first, explain second** — the label goes on the moment the hold
is decided, before the escalation comment is drafted.
- **Freshness re-read before any hold action** — a hold decision drafted
against a stale snapshot can target an already-merged PR.

Per the convention's own versioning rule, a change to the escalation
contract is a major bump: `8.1.0` → `9.0.0`, CHANGELOG entry included.

This implements the recommended remedy from the issue's decision-ready
triage summary (Option A, parts 1 and 3 — the convention clause plus the
retitle correcting the issue's falsified framing, done on the issue
directly). Part 2 (a `babysit_merge.py` label backstop) is deliberately
**not** included: the ruleset-required check already enforces the hold
server-side with no bypass actors and demonstrably held during the
incident; a wrapper-level duplicate narrows only the
label-apply→check-report race, which the freshness-re-read rule
addresses at the behavioral layer. If future evidence shows the ruleset
gate insufficient, that is its own scoped change.

## Test plan

- `npx markdownlint-cli2@0.23.2` on both edited files — 0 issues.
- Docs-only change to a convention document; no scripts, hooks, or
plugin behavior surfaces touched. CI's markdown/link gates cover the
rest.

## Related

Fixes #1409

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Kyle Sexton <kyle-sexton@users.noreply.github.com>
cursor Bot pushed a commit that referenced this pull request Aug 12, 2026
…n-explain (9.0.0) (#2512)

## Summary

Adds a **Cross-lane PR hold** subsection to the loop-lane convention's
§2 escalation contract, closing the gap the 2026-07-25 incident exposed:
an escalating lane decided PR #1351 must not merge, drafted its
explanation first, and applied `do-not-merge` ~30 minutes later — 3m20s
**after** the merge. Three independent investigations on the issue
converged on the same root cause: the server-side enforcement
(org-ruleset-required `do-not-merge` status check, no bypass actors)
worked correctly on both sides of the merge boundary; what no convention
defined was *when to engage it*. Holding a PR was undifferentiated from
escalating a tracker item, and the two acts fail differently — a PR hold
carries a hard real-time deadline.

The clause states three rules:

- **`do-not-merge` is the only cross-lane hold; a PR comment is never
one** (comments are advisory by construction — the same night, an
explicit "do not merge as written" comment on #1326 held nothing).
- **Hold first, explain second** — the label goes on the moment the hold
is decided, before the escalation comment is drafted.
- **Freshness re-read before any hold action** — a hold decision drafted
against a stale snapshot can target an already-merged PR.

Per the convention's own versioning rule, a change to the escalation
contract is a major bump: `8.1.0` → `9.0.0`, CHANGELOG entry included.

This implements the recommended remedy from the issue's decision-ready
triage summary (Option A, parts 1 and 3 — the convention clause plus the
retitle correcting the issue's falsified framing, done on the issue
directly). Part 2 (a `babysit_merge.py` label backstop) is deliberately
**not** included: the ruleset-required check already enforces the hold
server-side with no bypass actors and demonstrably held during the
incident; a wrapper-level duplicate narrows only the
label-apply→check-report race, which the freshness-re-read rule
addresses at the behavioral layer. If future evidence shows the ruleset
gate insufficient, that is its own scoped change.

## Test plan

- `npx markdownlint-cli2@0.23.2` on both edited files — 0 issues.
- Docs-only change to a convention document; no scripts, hooks, or
plugin behavior surfaces touched. CI's markdown/link gates cover the
rest.

## Related

Fixes #1409

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Kyle Sexton <kyle-sexton@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

do-not-merge Hard merge gate: do not merge while applied.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

docs(review): reconcile stale code-review framing in fanout SKILL.md + findings-normalization.md

1 participant