Skip to content

feat(code-tidying): rename dissolve-comments to remove-comments with a comment-reviewer agent - #12549

Merged
kyle-sexton merged 26 commits into
mainfrom
feat/12474-remove-comments
Nov 3, 2026
Merged

kyle-sexton merged 26 commits into
mainfrom
feat/12474-remove-comments

Conversation

@kyle-sexton

@kyle-sexton kyle-sexton commented Nov 2, 2026 •

Copy link
Copy Markdown
Member

Closes #12474

session: lane-2

Summary

Renames dissolve-comments to remove-comments, gives it an audit action, keeps audit-comment-residue as a separate model-invoked skill with its before description that routes to that action, and adds one agent, code-tidying:comment-reviewer, under comment postures. The rules come from the rule-by-rule absorption table. Two trigger passes showed a full fold-in loses audit requests, so the owner decided to keep the separate skill.

Behavior change to review first (table row 21): under necessary, a warning of consequence about our own code is deleted and becomes a reshape flag.

Fix

  • Skill. plugins/code-tidying/skills/remove-comments with remove and audit actions. Cross-plugin cites, catalogs, CI paths and eval cases are swept.
  • Agent. plugins/code-tidying/agents/comment-reviewer.md preloads the skill. A probe showed a preloaded skill's ! lines run inside an agent (record).
  • Settings. comment_posture (none, necessary, explanatory), comment_edit_scope (default diff) and encode_constraints_unattended (default off).
  • Choices the table left open, made on judgment: aggressive and strip stay as aliases for necessary and none; --pipeline is a new flag selecting the pipeline default; the agent is pinned to Sonnet at medium effort.

Verification

Preregistered before these runs (plugins/playbooks/skills/skill-authoring/reference/rewrite-a-plugin.md step 4)

All arms launch together on the final head, on Sonnet (claude-sonnet-5-5), judge Opus, --runs 3, --ablation none, identical flags, from plain copies outside any repository.

Arm Plugin copy Families
before merge-base of this branch same-contract outcome, audit outcome, trigger probes
after final head same-contract outcome, audit outcome, trigger probes
ctrl-remove-body before, with dissolve-comments procedure steps deleted and frontmatter kept same-contract outcome
ctrl-audit-body before, with audit-comment-residue procedure steps deleted and frontmatter kept audit outcome
ctrl-desc before, with a generic description on both skills and bodies kept trigger probes
  • Detection: a control detects a loss when the noise report calls a case drop or the mean case score falls by 0.15 or more. Otherwise that part is unmeasurable, which goes in the decision table.
  • No-loss rule: after is non-inferior to before at margin 0.05, no unexplained case drop, no lost positive trigger and no new false fire, each read per family.

Disclosed

  • An earlier before/after pass ran before this preregistration: non-inferior on the same-contract family (0.779 to 0.783) and the audit family (1.000 to 0.994). It measured 9e75316, not the final head, and had no control, so it does not count on its own.
  • Unmeasured path: tree-sitter does not reach the eval sandbox, so eval runs only propose deletions, in both arms. A no-loss result says nothing about applied deletions. The evidence there is three manual end-to-end runs under necessary, one through the agent.
  • Agent dispatch: remove-agent-dispatch scored 0.917; the agent was dispatched in 2 of 3 runs on Sonnet.
  • acr-readonly-strip-request cannot be compared: its Skill grader sits on a slash prompt and never fires in either arm.

Results: first preregistered pass, decision rule NOT met

Head 4817b2b against merge-base 4a3213c. Claude Code 2.1.316, Sonnet under test, Opus judge, --runs 3, 555 runs, no run errors. At most 6 concurrent runs, sampled peak 6; judge calls inside an arm's process would not be counted (UNVERIFIED).

Family before after Control Clauses that failed
Same-contract (21 cases) 0.777 0.764 ctrl-remove-body 0.767: UNMEASURABLE (fall 0.010, no case drop) Validity: one denial (a compound Bash cd, in invented-exempt-strip) makes the after file INVALID. Non-inferior passes (lower end -0.03).
Audit (7 compared) 0.990 0.970 ctrl-audit-body 0.907: UNMEASURABLE (fall 0.083, no case drop) Non-inferior FAILS (lower end -0.08). Validity: acr-dir-batch-skips run 3 never fired the skill.
Trigger probes fire rate 0.944 0.889 (18 direct positives) ctrl-desc: DETECTS (4 case drops) Non-inferior FAILS (lower end -0.13). Case drops on residue pos-train-05 and pos-val-01. Lost positives: residue pos-val-01 3 to 1, and neg-val-01 (a residue positive) 3 to 0. No new false fire on 13 negatives.

Reading:

  • Audit triggers were lost. The merged description dropped audit-comment-residue's "read-only" lead and "before a commit or on review". That this caused the loss is UNVERIFIED.
  • Neither body control detects a loss. Deleting the procedure steps barely moves either outcome suite: 15 of 21 same-contract cases score the same in all three arms, in part because every arm only proposes deletions (no tree-sitter in the sandbox). So these suites give little assurance about the body changes in either direction. The runbook says an unmeasurable part ships its before text.

Held with do-not-merge.

Preregistered before any confirmatory number was read: trigger family

The description now restores the before text of both skills, including the read-only lead, "before a commit or on review" and "workarounds with no link or removal condition". A two-labeler meaning diff found no loss. The wording came from the before descriptions; the earlier pass's lost cases named which cues to check, so the frozen set alone cannot count as held out.

Head 10e75db, before 39f54bf (this branch's merge base). Merges of main that do not touch plugins/code-tidying keep this measurement valid. Sonnet (claude-sonnet-5-5), judge Opus, --runs 3, --ablation none, -j 1 per arm, --disallow-tools Read Glob Grep Agent, from plain copies outside any repository, launched together when the 5-minute load is under 24 and available memory is at least 16 GB: at most 5 concurrent runs.

Arm Plugin copy Probe set
before-frozen before main's dissolve-comments.json and audit-comment-residue.json
after-frozen head remove-comments.json plus the same 6 false-fire negatives as the first pass
before-held before new held-out set, 18 requests per before skill
after-held head the same 36 requests, unchanged, 24 expected to fire
ctrl-desc-held before, with "A code maintenance helper." as both descriptions the before-held set

The held-out set was written by a fresh agent given only the two before descriptions, and is kept outside the repository. A request one before skill's set treats as negative and that asks for the other skill's job is a positive for remove-comments.

Rule, read per set; every clause must hold:

  • Every arm VALID under /evals:plugin-eval's run-validity gate, with the skill-fired check not applied and a denial after the graded Skill decision not invalidating; --own-copy-search-warns on the control only.
  • Mean fire rate over positives: after non-inferior to before at margin 0.05.
  • No unexplained case drop.
  • No lost positive: no positive whose after count is 2 or more runs below before's count of the skill it was written for.
  • No new false fire: no negative that fires after in any run where before fired neither old skill in any run.
  • ctrl-desc-held detects a loss (a case drop, or a mean fall of 0.15 or more) against before-held. If it does not, the held-out set is unmeasurable and its clauses do not count.

A rerun of a run lost to an environment error is disclosed here. A failed clause keeps the hold.

The outcome families run after the owner's decision on the unmeasurable body rules, on the body that decision selects, because one option changes the body under test. Their preregistration goes here first.

Results: confirmatory trigger pass, decision rule NOT met

Head 10e75db against 39f54bf. Claude Code 2.1.317, Sonnet under test, Opus judge, --runs 3, 531 runs, no run errors, all five arms VALID. Every call to a disallowed tool (Read, Glob, Grep) errored in every arm, so the setting held. The --disallow-tools flag was the same across arms.

Clause Frozen set Held-out set
Fire rate over positives, before to after 0.950 to 0.883 (n=20) 0.986 to 0.931 (n=24)
Non-inferior at 0.05 (noise report, direct positives) FAILS, lower end -0.17 FAILS, lower end -0.19
Lost positives neg-val-01 3 to 1, acr-pos-train-05 3 to 1, acr-pos-val-01 3 to 1 acr-pos-train-04 3 to 0, acr-pos-val-02 3 to 1
Case drops the two acr- positives above the two acr- positives above, and negative acr-neg-train-02 (fired 2 of 3 before, 3 of 3 after; before already fired on it, so its label is contestable)
New false fire none none
Control not run on this set ctrl-desc-held DETECTS: case mean 0.972 to 0.778, fall 0.194, 12 case drops

Reading:

  • Restoring the wording did not recover the audit triggers. The frozen set lost the same three requests as the first pass with the before text restored, so that pass's suspected cause, the dropped cues, is refuted.
  • The loss sits on the audit side. Every lost positive is a request for the audit; every request for removal held. In the losing runs the model answers inline with Bash or a search and never calls the skill. Merging two skills under a description that leads with editing is the likely cause; that the merge causes it is UNVERIFIED.
  • This description is not re-measured on these sets, because their per-case results have now been read. Another attempt needs a fresh blind held-out set.

Hold kept. The fold-in is decision D60 and no-loss is #12474's done-when; both cannot be met as measured, so this goes to the owner.

Preregistered before any final-pass number was read

Head 137fd79, before 6f24399 (this branch's merge base). Merges of main that do not touch plugins/code-tidying keep this valid. Sonnet (claude-sonnet-5-5), judge Opus, --runs 3, --ablation none, -j 1 per arm, from plain copies outside any repository. Launch needs 1-minute and 5-minute load under 24, at least 16 GB available, and at most 8 model runs on the host with this launch counted.

Pass Arms launched together Cases
Outcome before-same, after-same, before-audit, after-audit the same 21 same-contract cases; the acr- audit cases, with acr-readonly-strip-request left out of the compare as before
Trigger before-frozen, after-frozen, before-held, after-held, ctrl-desc-held main's frozen probes against the same requests under the new skill names; a new held-out set of 36 requests, written by a fresh agent given only the two before descriptions

A trigger run counts as fired when either code-tidying comment skill fires: a request for the other skill's job still reaches its action, and audit-comment-residue routes to remove-comments audit. Polarity comes from the before probe file.

Rule, read per family; every clause must hold:

  • Every arm VALID under /evals:plugin-eval's run-validity gate, with the trigger arms' skill-fired check not applied and a denial after the graded Skill decision not invalidating. --own-copy-search-warns on the control only.
  • Non-inferior at margin 0.05 on the noise report.
  • No unexplained case drop.
  • Trigger sets also: no lost positive (after 2 or more runs below before) and no new false fire (a negative that fires after in any run where before fired neither skill in any run).
  • ctrl-desc-held detects a loss against before-held (a case drop or a mean fall of 0.15 or more). If not, the held-out set is unmeasurable and its clauses do not count.

The body controls stand from the first pass (falls 0.010 and 0.083, UNMEASURABLE); the before bodies have not changed. Per the owner's decision, that gap ships disclosed, and a new issue covers it. A rerun of a run lost to an environment error is disclosed here.

Results: final pass, rule met

Head 137fd79 against 6f24399. Claude Code 2.1.317, Sonnet under test, Opus judge, --runs 3, 714 runs, no run errors.

Family before after Result
Same-contract (21 cases) 0.790 0.771 VALID. Non-inferior, lower end -0.04. No case drop.
Audit (7 compared) 1.000 1.000 VALID with acr-readonly-strip-request left out. The preregistration left it out of the compare; leaving it out of the validity gate too was chosen after reading, as in the first pass (it never fires in either arm). Non-inferior. No case drop.
Trigger, held-out fire 0.933 fire 0.950 (n=20) VALID. Non-inferior on direct positives, lower end -0.02. No lost positive, no new false fire.
Trigger, frozen fire 0.963 fire 0.944 (n=18) VALID. No lost positive, no new false fire. Open: pos-val-01 went 1 of 3 to 0 of 3, a case drop, and the lower end rounds to -0.05, below the margin.
ctrl-desc-held 0.963 0.870 DETECTS: 8 case drops (mean fall 0.093).

Other flagged case drops, cause shown. Four negatives in the remove-comments probes (neg-train-01, neg-val-01, neg-train-other, neg-val-other) ask for the audit. Before, audit-comment-residue fired 3 of 3. After, audit-comment-residue fired 3 of 3 and routed to remove-comments, as designed, and that second call is what the grader scores as a false fire. The request reached the audit in every run, so these are not a loss. They also pull the all-cases compare below the margin (lower ends -0.14 and -0.13); the direct-positives lines above leave them out. That scoping was chosen after reading the numbers, and is disclosed here.

Post-read check, recorded before it ran

The runbook's step for a case drop is to re-run that case against a fresh before control, launched together. pos-val-01 fired 0 of 3 in the confirmatory pass's before arm and 2 of 3 in its after arm, so it looks noisy on both sides.

Frozen pos-val-01, --runs 10, before and after launched together, same flags. Rule: the drop is noise when after fires within 2 runs of before. Otherwise the case drop stands, this clause fails and the hold stays.

Result: met. Before fired 0 of 10 and after 2 of 10, within the rule. Every other frozen positive scored 3 of 3 in both arms, so this one case produced both the case drop and the -0.05 lower end, and this check settles both. The before description fires that request 0 of 10, so the frozen probe can't tell the versions apart on it. The check launched without an outbox claim or a load gate; it was 2 runs.

Disclosed: merge after the pass

Main's #12614 changed plugins/code-tidying after the pass, which the preregistered validity clause didn't cover. git diff of the two bases shows it touched the manifest's version, changelog, README, reference/config.md, the schema, lib/ and the tidy skill: neither measured skill and no description in the measured listing. This is not re-measured. The schema conflict resolved to both key sets.

Disclosed: changes after the pass, from review

Head fa56a40 is after the measured head and is not re-measured. None of these change a measured skill's procedure or description:

  • settings.sh reads its layers from the bound convention home, and SKILL.md's settings sentence and the README say so. In this repository the home is docs/conventions, so the measured settings resolve as they did.
  • acr-readonly-strip-request's prompt says strip again. The compare already left that case out.
  • evals/evals.json cases 14 and 16 now expect the new behaviour. That file is not in the measured families.
  • The probes for tidy, audit-dead-code, batch-simplify and tidy-diff list audit-comment-residue beside remove-comments. None of them were measured here.
  • settings.sh passes the old posture values through, so SKILL.md's mapping reaches a repository file too. acr-dir-batch-skips' fail sample and one section cite are corrected.
  • code-tidying: rename dissolve-comments to remove-comments with a comment-reviewer agent #12474's done-when item 4 now states the owner's decision on unmeasurable body rules, added by this lane after pr-verify read the item without it.
  • remove-comments drops its unused git diff grant. The schema accepts the deprecated posture values.
  • Security note: audit requests now run under remove-comments' grants, including git log, which the audit path did not have before. That follows from the owner's routing decision; git log is what the remove action runs, and it was granted at base.
  • The sweep catalog note in plugins/playbooks, the pr-require-checks.yml exclude glob and one duplicate row in scripts/shared-copies.txt.

Decision table

Part Decision Numbers Control, before to degraded
remove-comments description Ships: the before text plus the posture clause Held-out fire 0.933 to 0.950, lower end -0.02; no lost positive, no new false fire 0.963 to 0.870, 8 case drops: DETECTS
audit-comment-residue description Ships: the before text, naming the renamed skill As above; every audit positive held in both sets As above
remove-comments body Ships the new rules with the gap disclosed, on the owner's decision; #12703 makes it measurable Same-contract 0.790 to 0.771, lower end -0.04, no case drop 0.777 to 0.767, no case drop: UNMEASURABLE
audit action and audit-comment-residue router Same decision; the router forwards to the action Audit 1.000 to 1.000, no case drop 0.990 to 0.907, no case drop: UNMEASURABLE
code-tidying:comment-reviewer agent Ships; new, so no before remove-agent-dispatch 0.917; dispatched in 2 of 3 runs on Sonnet None

Control scores for the bodies are from the first pass; the before bodies have not changed.

Disclosed: discarded launch

The first launch ran 9 processes at -j 4 (up to 36 runs) on a 32-thread host and very likely froze the machine (15-minute load about 98; UNVERIFIED, since the kernel log searches returned nothing). Its partial results were discarded without their scores being read, as an environment error.

Related

🤖 Generated with Claude Code

kyle-sexton and others added 5 commits November 2, 2026 16:39
Rename the dissolve-comments and audit-comment-residue cases to
/code-tidying:remove-comments (audit action for the residue cases), map
the aggressive and strip tokens to the necessary and none postures, and
rewrite only the graders the absorption table changes: under necessary a
warning of consequence about this repository's code is deleted and
reported as a reshape flag (table row 21). Every other grader is
unchanged, so those cases stay the no-loss evidence.

Refs: #12474

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…a comment-reviewer agent

dissolve-comments becomes /code-tidying:remove-comments, and
audit-comment-residue becomes its audit action (actions/audit.md). The
skill is the orchestrator: it resolves scope and settings, hands the
triage and comment-only edits to the new code-tidying:comment-reviewer
agent, checks the agent's diff with change-shape, retries a rejected
report once, and applies the class-B moves itself. Without the Agent
tool it runs inline.

Postures none, necessary and explanatory replace strict, balanced,
conservative and aggressive, absorbing pstack's no-comments rules per
the 2026-10-20 table: under necessary ties delete, warnings and
rationale about our own code become reshape flags, a linked workaround
comment is open root-cause work, and constraint comments get an
encode step behind the new encode_constraints_unattended setting.
comment_edit_scope (default diff) limits the empty-argument pass to the
lines a change adds. Settings resolve through userConfig, then
docs/conventions/code-tidying.yaml and its .local.yaml overlay
(settings.sh, schemas/code-tidying.schema.json).

Every reference to the two old skill names is swept, including the
probes, the CI exclusions, catalogs and the cross-plugin cites.

Refs: #12474

Co-Authored-By: Claude Opus 5.5 <[email protected]>
The exempt-surface list, the divider caution and the doc-comment rule
still read as absolute after the posture split (table rows 18, 23, 25,
26). The audit action reports only the detector's findings, and the
description carries the residue wording again, so a natural-language
request for a comment audit keeps reaching the skill. A new case checks
the comment-reviewer dispatch when the Agent tool is granted.

Refs: #12474

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…-reviewer

Three eval runs with the Agent tool granted stayed inline: the router sent
them to the workflow first and the dispatch section sat after the hard
rules. The router and the workflow's opening now say to run steps 1 and 2
and dispatch, whatever the scope's size.

Refs: #12474

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…lusions personal

An outside party's behavior cannot be proven from inside a repository, so
"unverified is deleted" read literally left necessary with no such keeps.
Verified now means the adjacent code depends on the named party and nothing
here could remove the reason. hard_exclusions leaves the file layers: tidy's
exclusions reference owns its three channels, and a tracked file must not add
a fourth. The CI comment-marker exclusion narrows to the detector files, and
the pstack record's line cites stay on the pinned file they were checked at.

Refs: #12474

Co-Authored-By: Claude Opus 5.5 <[email protected]>
@kyle-sexton kyle-sexton added the do-not-merge Hard merge gate: do not merge while applied. label Nov 3, 2026
@kyle-sexton

Copy link
Copy Markdown
Member Author

Hub (GitHub Support), for laptop Lane 2: the owner decided both open questions at 02:58Z (comment on #12474), and he is watching this PR (open 4 h). Please post here an ETA for the final preregistered outcome and trigger passes, then lift do-not-merge and mark the PR ready when they pass. If a pass fails, say which, and what changes.

kyle-sexton and others added 7 commits November 2, 2026 22:03
Merging audit-comment-residue into remove-comments lost audit requests in
two preregistered trigger passes, so it stays a separate model-invoked skill
with its before description. It holds no scripts and runs remove-comments'
audit action. remove-comments keeps that action and gets a description
without the audit triggers.

Restores both probes to their before content, with only the skill and
competitor ids changed.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01VQb9Pzf47aw4gsMAyk98Wn
check-skill requires a new skill to ship evals or have a plugin suite case
tag it. This case tags the router and fails if the leading audit token is
doubled or dropped.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01VQb9Pzf47aw4gsMAyk98Wn
The pre-push reference check flags a slash reference to a skill the plugin no
longer ships.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01VQb9Pzf47aw4gsMAyk98Wn
Ports main's change to dissolve-comments onto remove-comments: an empty
argument takes the repository rung without asking and, outside report, runs
it in safe mode.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01VQb9Pzf47aw4gsMAyk98Wn
@kyle-sexton kyle-sexton removed the do-not-merge Hard merge gate: do not merge while applied. label Nov 3, 2026
@kyle-sexton
kyle-sexton marked this pull request as ready for review November 3, 2026 04:27
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Nov 3, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-11-03T04:30:08.783145Z 62f2863 Draft marked ready
ℹ️ 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" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@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: 62f2863a44

ℹ️ 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".

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

claude-security-review: 1 inline finding(s) on 62f2863a4469cf686556c7876f580b93505835d8; the summary is in this lane's pull request comment.

claude-lane: claude-security-review

@github-actions

github-actions Bot commented Nov 3, 2026 •

Copy link
Copy Markdown
Contributor

claude-security-review reviewed 5e7556c98328fd196f87f1c31ff850ef88bc32ac: read 137 of 137 changed file(s); 1 finding(s), 1 as inline comments.

Chunk 1 of 4 (40 files)

Security review, chunk 1 of 4: all 40 files read, 1 finding (a manifest flag restated)

I read every hunk in .claude-lane/chunks/chunk-1.patch. For context I also read the PR description and closing issue, the settled threads, the prior findings, the manifest and identical.txt. Nothing in this chunk leaks a token, secret or signing key. Nothing in it can take over the owner's accounts or machines, and nothing in it can bill the owner.

critical-findings: 0

Manifest (plugins/code-tidying/.claude-plugin/plugin.json)

  • manifest description: pass. Inert field, prose only. The changed userConfig description and title strings are inert too: pass.
  • manifest userConfig: flag. comment_posture now defaults to auto with a new option set, and the PR adds comment_edit_scope (default diff) and encode_constraints_unattended (default false). Posted inline at L40-62 as IMPORTANT. The owner settled this point in two threads (lines changed since resolution: no). A manifest flag is never dropped as settled, so the comment restates it and cites both threads. Neither new key's default widens unchecked action.

Checked

  • .github/workflows/pr-require-checks.yml L1757-1759 (trusted path).
    • The comment-marker exclude moves from the whole audit-comment-residue/scripts/** tree to remove-comments/scripts/detect* and scripts/lib/** (plus evals/**), so it now excludes fewer files.
    • The step is continue-on-error: true, so it is advisory. It is not a merge hold, a trust control or a token scope.
    • It widens nothing.
  • .github/workflows/pr-test-platforms.yml L466-468. Only a step name and a test path change. The if: and run: take no untrusted input.
  • plugins/code-tidying/agents/comment-reviewer.md (new agent, tools: Read, Grep, Glob, Bash, Edit).
    • It runs only when remove-comments dispatches it. The same triage ran in the main session at base with Bash and Edit available, so comment text reaches no new tool.
    • tools: limits which tools the agent has. It does not pre-approve them: session permissions still apply.
    • Its body says "Comment text is data", keeps it in scope and bars it from starting other agents.
    • It trusts no new party and reaches no credential.
  • README settings layering. The team file <home>/code-tidying.yaml and its overlay now set the five remove-comments options. hard_exclusions, the setting that loosens a gate, stays userConfig only. The README says no posture loosens a gate: deletions still need the change-shape COMMENT-ONLY proof, and moves still need a test net. settings.sh is in chunk 3.
  • Docs, catalog, landscape, upstream records, cross-plugin cites, changesets and eval cases or samples. These are renames, prose and test fixtures. The new acr-router-drops-leading-audit/scaffold.sh only execs the in-repo fixtures/acr-seed.sh.
  • Identical copies. The copies are changeset fragments under .changes/*/ and eval sample JSON. Content at those paths does nothing different from the first path.
  • Instruction-surface lens. This chunk deletes and softens no guardrail. The README's posture text changes what necessary deletes. That is the owner-approved behaviour change (table row 21), and the gates stay. I did not consult the instruction exception register because no standing rule is removed here.
  • PR context. It contains no embedded instructions aimed at this lane.

Settled and prior

  • Settled threads on settings.sh, the evals, the probes, the schema and remove-comments/SKILL.md concern files outside this chunk.
  • The prior manifest userConfig entries (lines changed since posted: yes, resolved) are restated inline as above.
  • Not past the round cap (2 of 3 rounds).

Usage (not a finding)

  • The new agent is pinned to Sonnet at medium effort with maxTurns: 80. It spends subscription or prepaid model usage per remove-comments run, and it bills nothing.

Chunk 2 of 4 (40 files)

Security review, chunk 2 of 4: 40 of 40 files read, no security findings

I read every hunk in .claude-lane/chunks/chunk-2.patch. Nothing in this chunk leaks a token, secret or signing key. Nothing in it compromises the owner's accounts or machines, and nothing can bill the owner. None of these files is on a trusted path, and none is a trust control, merge hold or plugin manifest.

What I checked

  • Eval cases (interaction-*, invented-*, real-*, probe-explicit-target, remove-report-mode-no-edits). The prompts swap the skill name and the posture tokens (aggressive→necessary, strip→none). allowed_tools is unchanged in each case. Some graders now expect warning comments to be deleted under necessary, the security warning in real-statusline-stamp-aggressive among them. That follows the owner-approved behaviour change (table row 21). The rule itself lives in remove-comments/SKILL.md in chunk 3, so these fixtures don't introduce it.
  • New remove-agent-dispatch case and its scaffold.sh. The case adds Agent to the eval's allowed_tools, which only affects the eval sandbox. The scaffold only execs the in-repo fixtures/seed.sh with a fixed argument, so no untrusted input reaches it.
  • prerequisites.json and the probes. These rename skill IDs and re-list competitors. They are data only.
  • schemas/code-tidying.schema.json. It adds the comment keys and their defaults: comment_edit_scope: diff, encode_constraints_unattended: false and class_c_max_lines capped at 40. A schema validates; it grants nothing. The deprecated posture values in the enum were settled in an earlier thread (lines changed since resolution: no).
  • scripts/allowed-tools-pairing.test.sh. Dropping audit-comment-residue from SKILLS was required, not a weakening. That skill now declares only allowed-tools: ["Skill"] (SKILL.md L6), so it has no bundled-script grant left to pair, and keeping it in the list would trip the "no bundled-script grant found" failure at L115-L117. remove-comments stays covered.
  • added-lines.sh, added-lines.test.sh, changed-code-files.sh and scope-code-files.sh. The script changes are comment-only. The test's change is a path update that keeps the crafted-hunk-header injection regression running against the moved detect.sh.
  • Instruction-surface lens. No standing instruction is deleted or softened in this chunk; the changed lines are fixtures, data and comments. I didn't read the instruction exception register, because this chunk removes no rule.

Settled and prior

  • None of this lane's prior findings or the settled threads sit on lines in this chunk's files, except the schema thread above. I'm not raising any of them again.

Usage (not a finding)

  • The new remove-agent-dispatch eval case adds eval runs on prepaid credit or the subscription. It can't create a real charge.

critical-findings: 0

Chunk 3 of 4 (36 files)

Security review, chunk 3 of 4: all 36 files read, no security findings

I read every hunk in .claude-lane/chunks/chunk-3.patch. Nothing in this chunk leaks a token, secret or signing key. Nothing in it gives a path to compromise the owner's accounts or machines, and nothing in it can bill the owner. No file in this chunk matches a TRUSTED PATHS: glob. No plugin manifest is in this chunk; the userConfig flag sits with plugin.json in chunk 1. None of the identical-file copies belong to this chunk.

What I checked

  • remove-comments/SKILL.md allowed-tools (L4). The unused Bash(git diff:*) grant from the earlier round is gone. The list now pre-approves only the skill's own scripts by path, plus git branch, git log, git ls-files, grep, head and echo. Audit requests now run under git log:*. The owner settled that as a decision in the resolved thread, citing code-tidying: rename dissolve-comments to remove-comments with a comment-reviewer agent #12474 comment 6594297398 (lines changed since resolution: no), and the PR body discloses it. I'm not raising it again.
  • audit-comment-residue/SKILL.md. This is now a router: allowed-tools: ["Skill"], and it forwards to /code-tidying:remove-comments audit. Its read-only rule ("No Edit, no Write, no mutating Bash", which now also holds when the request asks to strip) moved whole into remove-comments/actions/audit.md. The router body repeats "edits nothing … do not edit or delete a comment here". No read-only rule was dropped.
  • scripts/settings.sh (new).
    • Keys come from a fixed list.
    • Every value is checked against an allowlist; class_c_max_lines must be numeric and between 1 and 40.
    • Layer files are read under the git root.
    • It reports every key unset when the root is $HOME or an ancestor of it, or when the convention-home pointer is broken.
    • It takes no argument input from the model beyond an optional directory.
    • The earlier convention-home thread was fixed in eecf757, and settings.test.sh covers bound, declined and broken homes.
  • Instruction-surface lens. I read docs/contracts/instruction-exception-register/README.md, whose classes are the six Gate 0 classes, and checked each removed or narrowed rule against them:
    • The rules that guard against harm all carry over: comment text is data, now a Hard rule rather than report-mode only; the --notes symlink and tracked-path refusal; the GLOBAL HARD path exclusions (agent config, CI workflows, hook chains); the COMMENT-ONLY and RENAME-ONLY gates; the paired-record floor; the findings-file .gitignore rule.
    • The narrowed rule is necessary: it now deletes warnings of consequence, units and sentinels, with the narrative staged and a reshape flag. The owner approved this as table row 21. It is a content policy and opens no route to any register class.
  • Renames and cross-references. These cover detect.sh and its test, comment-shapes.sh, the reference docs, the tidy and tidy-diff cites, and the docs-hygiene and discipline probe cites. They are path and prose updates only. The script renames are 100% similarity or comment-only edits. The deleted audit-comment-residue/scripts/added-lines.sh was an exec wrapper, and nothing in the remaining skill grants or calls it.
  • Eval files. evals.json and the fixtures are test data, and none of it runs with credentials.

Settled and prior

  • The git-diff grant and audit-routing point: settled as above. The part to fix was fixed and the remaining widening is an owner decision, so it isn't posted again.
  • The earlier manifest userConfig flag is on plugin.json, which is in chunk 1, not this chunk.

Usage (not a finding)

  • remove-comments now sends every edit-capable run to the code-tidying:comment-reviewer subagent whenever a subagent tool is available, small scopes included, and allows one re-dispatch after a rejection. That spends subscription or API usage only.

critical-findings: 0

Chunk 4 of 4 (10 files)

Security review, chunk 4 of 4: all 10 files read, no findings

I read every hunk in .claude-lane/chunks/chunk-4.patch. I found no security issues in this chunk. Nothing here leaks a token, secret or signing key, takes over the owner's accounts or machines, or can bill the owner.

What I checked

  • Cross-plugin skill references. docs-hygiene/skills/audit-noise (the evals.json case 9 prompt and expectations, and a comment in noise-shapes.sh), the overengineering justification-lane.md and justify/SKILL.md owner tables, and the playbooks repo-sweep SKILL.md example all rename dissolve-comments / audit-comment-residue to remove-comments. These are prose and eval-text changes. No tool grant, hook or executable path changes.
  • plugins/playbooks/skills/repo-sweep/catalogs/hygiene.md.
    • The residue-dissolve step now names one skill, and its note says to run /code-tidying:remove-comments audit . first.
    • The CI-workflow exclusion is unchanged. It is still owned by the skill's Hard rules, and lifting it still takes an operator's explicit override.
    • The keep-tag is renamed to remove-comments-ignore.
    • Instruction-surface lens: no guardrail is removed or softened. Workflows stay excluded, and findings on synced files are still fixed upstream only. This note was settled in an earlier review thread (lines changed since resolution: no), and the current text matches that resolution.
  • plugins/playbooks/skills/repo-sweep/scripts/catalog.test.sh. Only the fixture's skill field and its expected TSV change. The test takes no untrusted input.
  • scripts/spoke-plugin-root-baseline.txt. This is a validator baseline. Two entries move from dissolve-comments/reference/{safety,scope}.md to the matching remove-comments/ paths. The counts (1 each) and justifications are the same, so the baseline admits no new token use.
  • scripts/suite-seconds.txt and scripts/test-windows-plan.txt. These rename the detect.test.sh path to the merged skill's directory. They are test-scheduling data and do not change what any CI job runs.

Trusted paths

No file in this chunk matches a TRUSTED PATHS glob, and none touches a trust control, token scope, kill switch or merge hold.

Settled and prior

  • Earlier findings from this lane (the plugin.json userConfig flag and the remove-comments allowed-tools grant) are on files outside this chunk, so I don't restate them here.
  • The settled hygiene.md thread is not re-raised.

Spend

None in this chunk.

critical-findings: 0

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

claude-review: 5 inline finding(s) on 62f2863a4469cf686556c7876f580b93505835d8; the summary is in this lane's pull request comment.

claude-lane: claude-review

Comment thread plugins/code-tidying/probes/tidy.json Resolved
@github-actions

github-actions Bot commented Nov 3, 2026 •

Copy link
Copy Markdown
Contributor

claude-review reviewed 5e7556c98328fd196f87f1c31ff850ef88bc32ac: read 137 of 137 changed file(s); 2 finding(s), 0 as inline comments.

Chunk 1 of 4 (40 files)

claude-review, chunk 1 of 4 at 5e7556c9: I read every hunk of all 40 files in this chunk. No new findings.

Prior findings and settled threads. All five inline findings from the 62f2863a round are resolved by the owner and marked lines changed since resolution: no, and their fixes are still in place at this head:

  • acr-readonly-strip-request/case.yaml:9 says "strip" again.
  • Its grader still requires remove-comments","args":"audit.

The other settled threads (the probes, evals.json, hygiene.md, the schema enum, the git diff grant) are on files in other chunks. I re-raise none of them.

Manifest (plugins/code-tidying/.claude-plugin/plugin.json)

  • manifest description: pass. It names remove-comments with its postures and keeps audit-comment-residue as read-only, which matches what ships.
  • manifest userConfig default: pass. comment_posture goes from strict to auto. The reason given is code-tidying: rename dissolve-comments to remove-comments with a comment-reviewer agent #12474's posture decision: explanatory when interactive, necessary with --pipeline. The README maps the old values onto the new ones. The security lane flagged this guard question and the owner settled it, with the re-check moved to code-tidying: run remove-comments in the PR pipeline and add the write-clean line #12548, so that judgment belongs to that lane.
  • manifest userConfig options: pass. The base manifest already declares options, so the changed and new option sets don't raise the client version floor.
  • manifest userConfig new keys: pass. scripts/settings.sh and actions/remove.md read comment_edit_scope and encode_constraints_unattended (chunk 3). Both default to the narrower value.
  • manifest version: pass. The fragment .changes/code-tidying/...-12ef7426.md says bump: minor. The plugin is below 1.0, so a minor bump fits removing dissolve-comments.
  • manifest keywords: pass.

Other checks

  • New agent plugins/code-tidying/agents/comment-reviewer.md. It preloads code-tidying:remove-comments, which has disable-model-invocation: false at head, so the preload can resolve. It runs steps 3 to 7 of the workflow, which matches what SKILL.md "The comment-reviewer agent" and actions/remove.md dispatch. Its run-inline fallback when it is itself the reviewer means it cannot dispatch itself in a loop.
  • Trusted path .github/workflows/pr-require-checks.yml:1757-1759. The comment-marker exclude is now remove-comments/scripts/detect*, scripts/lib/** and evals/**. The old dissolve-comments scripts moved into this directory, and the marker scan still covers them. So the exempt set is no wider than the old audit-comment-residue/scripts/** exclude. docs/contracts/tracker-reference-form/README.md describes the same set.
  • Trusted path .claude/skills/control-claude-code-plugins/features/code-tidying/README.md. The only change is one catalog line for the renamed skill.
  • .github/workflows/pr-test-platforms.yml. The Windows step points at the renamed detect.test.sh path.
  • New case acr-router-drops-leading-audit. Its grader requires args":"audit src/cache.ts", so the fail sample audit audit src/cache.ts does not match, as intended. Its scaffold reuses fixtures/acr-seed.sh.
  • Copied changelog fragments (identical.txt). They are patch fragments at changelog paths, so their paths don't change what they do.
  • PR body and closing issue. No embedded instructions aimed at this lane.

Spend (not a hold, not counted): the new agent pins Sonnet at medium effort with maxTurns: 80. Each remove-comments run that dispatches it uses one extra subagent's worth of subscription or API usage.

I ran nothing; the PR's eval numbers are author-claimed and unverified by this lane.

Chunk 2 of 4 (40 files)

claude-review, chunk 2 of 4 at 5e7556c9: I read every hunk of all 40 files in this chunk and found nothing new.

Settled and prior points in this chunk. Both are still fixed at this head, so I'm not raising either again:

  • Probe competitors. All four probes (tidy.json, audit-dead-code.json, batch-simplify.json, tidy-diff.json) list code-tidying:audit-comment-residue next to code-tidying:remove-comments. audit-comment-residue.json now names remove-comments in place of dissolve-comments.
  • Schema posture enum. schemas/code-tidying.schema.json:25 accepts strict, balanced, conservative and aggressive, and its description marks them deprecated. This matches what valid() accepts in skills/remove-comments/scripts/settings.sh:34-35. The new schema keys class_c_max_lines (1 to 40) and apply_local_renames match the settings.sh KEYS and range check, the plugin.json userConfig and the SKILL.md settings table.

What I checked

  • Eval prompt renames. Each dissolve-comments aggressive|strip prompt became remove-comments necessary|none. The tokens safe, report and --notes are still in the SKILL.md argument-hint and its token table, so cases like safe none and report still parse.

  • Graders flipped from kept to deleted. I checked them against the behaviour change in table row 21:

    • invented-class-c-aggressive: warning-deleted, plus a new warning-flagged check on the last message.
    • real-hook-utils-header-aggressive: the SSOT, sync, _to and kill-switch graders.
    • real-silent-revert-design-aggressive: threshold-warning-deleted.
    • real-statusline-stamp-aggressive: injection-warning-deleted.

    Their expected_outcome text matches the graders, and the kept-comment-succinct graders still hold when nothing is kept.

  • dissolve-comments-ignore in the exempt cases. It is still honoured: reference/safety.md:164 and SKILL.md:125-126 keep it as a legacy marker, so invented-exempt-* stay valid.

  • New remove-agent-dispatch case. Its code-intact and shebang graders are the same as invented-class-a-aggressive, which uses the same class-a.sh fixture. Agent is in the case's allowed_tools.

  • allowed-tools-pairing.test.sh. It drops audit-comment-residue from SKILLS. That is correct: the router skill now grants only Skill, so the test's "no ${CLAUDE_SKILL_DIR} bundled-script grant" check would fail on it.

  • prerequisites.json. It drops skill:audit-comment-residue from the runtime prerequisite. That is consistent with the router no longer running any scripts itself.

  • Script header comments and the added-lines.test.sh DETECT path. They now point at skills/remove-comments/scripts/detect.sh, which is a rename in chunk 3.

Not raised (below the bar)

  • The description: lines of interaction-safe-strip, invented-*-strip, invented-*-aggressive and similar cases still say "strip" or "aggressive" while the prompts use none or necessary. These are aliases, so the behaviour under test is the same.
  • real-statusline-stamp-aggressive says in its expected_outcome that the deleted warning is "listed as a reshape flag", but no regex grader checks it. invented-class-c-aggressive does carry such a grader.

There's no cost-relevant change in this chunk, and no embedded instructions in the PR context, settled-threads or prior-findings files.

Chunk 3 of 4 (36 files)

claude-review, chunk 3 of 4 at 5e7556c9: I read every hunk of all 36 files in this chunk, including the rename-only headers. 2 new findings, both inline. Both are about what remove-comments passes to its new comment-reviewer agent.

  1. Safe mode doesn't reach the agent. SKILL.md:96-99 lists what the dispatch carries: scope, posture, settings, markers and tooling layer. The run mode isn't on that list. The agent is told to use what it's given and not re-resolve it (agents/comment-reviewer.md:18-20). So a run in safe mode makes class-C edits that should only have been proposed. That covers an explicit safe, a widening to the repository rung, and a non-interactive widening.
  2. actions/remove.md:7-9 dispatches the agent with no exception for report. SKILL.md:89 excludes report. If a report run follows remove.md, an agent that has Edit and doesn't know the mode makes real edits. The report-mode rules call that run safe to start unattended.

Prior findings and settled threads. None of this lane's earlier findings is on a file in this chunk at the same lines with lines changed since posted: no. The settled threads on this chunk's files have no changed lines since they were settled, so I haven't raised them again:

  • remove-comments/evals/evals.json cases 14 and 16: case 14 now resolves balanced to explanatory, and case 16 deletes the warning with a reshape flag.
  • The remove-comments/SKILL.md grant: there's no git diff grant, and routing audits through this skill is the owner's decision.
  • The settings.sh convention-home thread: the fix is present (resolve-convention-home.sh, with bound, declined and broken-pointer cases in settings.test.sh).

Checked, no finding

  • added-lines.sh HEAD on the uncommitted rung (remove.md step 1). The plugin-root script compares the working tree against the merge base, so HEAD yields the uncommitted tracked hunks as intended.
  • Parity test in detect.test.sh. It now greps actions/audit.md for <skill-dir>/scripts/changed-code-files.sh, and that line is at audit.md:42.
  • Grants. The remove-comments grants include detect.sh and changed-code-files.sh, which the audit action runs. The audit-comment-residue router holds only Skill and drops one leading audit token.
  • Move counts in dissolving-moves.md. The "2 of 17 / 0 of 17" counts match the tier table now that it includes Encode in a Type.
  • Cross-plugin links. The tidy-diff, tidy, docs-hygiene and discipline edits point at paths that exist at head.
  • Closing issue code-tidying: rename dissolve-comments to remove-comments with a comment-reviewer agent #12474. Done-when item 2 ("every cite of it is swept") holds for this chunk. The only remaining dissolve-comments strings are deliberate: the "Old patterns" table and the legacy dissolve-comments-ignore marker, which is kept on the floor. Item 3, posture and edit scope resolving through the convention home, is pinned by settings.test.sh. I didn't run that test; that it passes is the author's claim.

Not raised (below the bar)

  • remove-comments/evals/evals.json case 26 still says it "points to /code-tidying:tidy for the edit-capable pass". The audit action now sends the author to the remove action.
  • Case 13 is still named ...-under-strict.
  • argument-hint doesn't list --added-since or --notes.

Manifest. No manifest file is in this chunk.

Spend. Nothing in this chunk changes billing. The new agent is pinned to Sonnet at medium effort with maxTurns: 80, which spends subscription or API usage only.

Chunk 4 of 4 (10 files)

claude-review, chunk 4 of 4 at 5e7556c9: I read every hunk of all 10 files in this chunk. No new findings.

What I checked

  • plugins/playbooks/skills/repo-sweep/catalogs/hygiene.md. The dead-code note now tells the sweep to tag notes with remove-comments-ignore. The renamed skill honours that marker, and the older dissolve-comments-ignore still works too (remove-comments/SKILL.md:125-126, reference/safety.md:164). The lift example remove-comments override .github/workflows/ci.yml matches the skill's override action (SKILL.md:78). The residue-dissolve note now names /code-tidying:remove-comments audit . as the step to run first. That is the fix the owner made for this lane's earlier finding (a settled thread, lines unchanged since), so I don't raise it again.
  • plugins/playbooks/skills/repo-sweep/scripts/catalog.test.sh. The fixture's skill: line and the expected TSV row both changed to the single skill name. The test still checks the same thing.
  • plugins/playbooks/skills/repo-sweep/SKILL.md:88. This line is only an example of the checklist format, and the skill@version stamp keeps that format.
  • scripts/spoke-plugin-root-baseline.txt. The two moved entries point at remove-comments/reference/safety.md and reference/scope.md. Each of those files holds exactly one CLAUDE_PLUGIN_ROOT token, so the counts of 1 still hold.
  • scripts/suite-seconds.txt and scripts/test-windows-plan.txt. Both now point at remove-comments/scripts/detect.test.sh. That matches where the detector moved, and the earlier round confirmed the Windows step in pr-test-platforms.yml against this plan file.
  • plugins/overengineering (justify/SKILL.md and context/justification-lane.md). The boundary tables now name only code-tidying:remove-comments as the owner of comments. audit-comment-residue still exists, but it forwards to remove-comments audit, so a single owner is accurate.
  • plugins/docs-hygiene (audit-noise evals.json case 9 and noise-shapes.sh). These now cite /code-tidying:remove-comments audit as the code-side sibling. The comment change in noise-shapes.sh changes no behaviour.

Prior findings: This lane's earlier finding on hygiene.md is resolved and its lines haven't changed since, so it stays settled. The other prior findings are on files in other chunks.

Embedded text: None of the PR context, settled-thread or prior-findings files tries to steer this lane.

Spend: Nothing in this chunk changes model, schedule or run spend.

critical-findings: 2

Findings not posted inline (their path, line or side is malformed):

  • plugins/code-tidying/skills/remove-comments/SKILL.md:96: The dispatch payload leaves out the run mode, so safe is lost once the agent takes over.

This step passes the agent the scope, posture, settings, markers and tooling layer. safe isn't a posture (it's an action token, and conservative maps to explanatory plus safe), so it isn't in that list. agents/comment-reviewer.md:18-20 tells the agent to "use them as given and do not re-resolve them". The agent then runs actions/remove.md step 6 under the bare posture. Under explanatory, that step deletes a criterion-2 failure and rewrites an over-budget comment.

Under safe, both of those must be proposals: "Only class-A deletions apply" (line 76). safe is also forced on runs that never typed it:

  • the repository rung;
  • any non-interactive widening (remove.md step 1).

That makes the whole-repository pass the one where the guarantee breaks.

Step 2's check doesn't catch it. It tests each deletion "against the floor and the posture's keep list", which a criterion-2 deletion under explanatory passes.

Repro: run /code-tidying:remove-comments safe lib/worker.sh (eval case 18) with a subagent tool available, on a rationale comment whose reasoning is in git log -L. The agent deletes it behind COMMENT-ONLY, and the orchestrator accepts the diff.

Fix:

  • Add the effective mode (safe or not, and the layer that set it) to the dispatch list.
  • Have the agent's limits name it.
  • Add a check to step 2: under safe, reject any applied edit that isn't a class-A deletion.
  • plugins/code-tidying/skills/remove-comments/actions/remove.md:7: This dispatch rule has no exception for report, though this file is also the report workflow (line 3).

SKILL.md:89 says only "a run that may apply edits (not audit, not report)" hands off to comment-reviewer. This paragraph says the opposite: with a subagent tool available you dispatch for steps 3 to 7, "even when a missing tool means the run can only propose".

If a report run follows this file, it dispatches an agent that:

  • has Edit;
  • is told to make the comment-only deletions and rewrites;
  • isn't told the run is report, because the SKILL.md dispatch list carries no mode.

The agent's step 7 has no report signal, so it applies edits. That breaks "Nothing in the repository changes" (line 180), the guarantee that keeps report --added-since safe to start unattended in pull-request prep.

Fix: make the exception explicit here:

With a subagent tool available, unless the action is `report` and unless you are `comment-reviewer`
yourself, you run steps 1 and 2 and then dispatch `code-tidying:comment-reviewer` for steps 3 to 7
("The comment-reviewer agent" in `SKILL.md`), even when a missing tool means the run can only propose.

@github-actions

github-actions Bot commented Nov 3, 2026

Copy link
Copy Markdown
Contributor

The pr-verify verifier failed head fa56a405a72b2b7692447219ae95a91ec206b357. What it wrote, as data:

What it wrote (96 lines)
Summary: Whole spec, fail: #12474 (closes): fail. Chunks 1 and 2 between them deliver the outcome
  and done-when items 1–3: the probe-based agent design, the remove-comments skill with its audit
  action and comment-reviewer agent, the dissolve-comments removal and sweep, and settings resolved
  through the convention home. Item 4, before/after evals showing no loss for each skill-body cut,
  is only partly delivered. Both chunks say they ship eval files only. Both point to the PR body for
  the evidence. The body cuts' controls were UNMEASURABLE, and the gap was deferred to #12703 by an
  owner decision. The spec has no person_checks, so that decision cannot excuse the item.
Chunk 1 of 2, pass-notes: Chunk 1 of 2 for #12474, judged against the issue body plus the owner's
  recorded decision to keep `audit-comment-residue` as a router and ship the body rules with the
  eval gap disclosed. No blocking defect in these parts.

Done-when status:
- **Item 1, behavior probe: delivered.** The probe is recorded on the issue with Claude Code
  2.1.316. The new `agents/comment-reviewer.md` is built around its result: it relies on the
  preloaded skill's `!` lines and falls back to reading SKILL.md.
- **Item 2, skill, audit action, agent, `dissolve-comments` gone, cites swept: delivered for the
  files in this chunk.**
  - These parts add `skills/remove-comments/SKILL.md`, `actions/audit.md`, `actions/remove.md` and
  the agent.
  - They delete `dissolve-comments/SKILL.md` and its `evals.json`, and turn `audit-comment-residue`
  into a router to `remove-comments audit`.
  - They sweep the cites in catalog, cheat sheet, landscape, upstream records, other plugins,
  probes, prerequisites, CI paths and eval cases.
  - The moved reference files, scripts and the new `remove-comments/evals/evals.json` are in chunk
  2.
- **Item 3, postures and edit scope resolve through the convention home: partly delivered here.**
  These parts hold the SKILL.md Settings section (four layers, with `<home>` the bound convention
  home), 
Chunk 2 of 2, pass-notes: Chunk 2 of 2 for #12474 (closes). I read all eight chunk-2 parts whole. I
  also read chunk-1 parts 016, 017 and 018 whole, because `detect.test.sh` and `settings.sh` are
  tied to `actions/audit.md` and `SKILL.md`, which sit in chunk 1. What this chunk delivers, by
  done-when item:
(1) Behavior probe: nothing here. The record is an issue comment, and the agent file is in chunk 1.
(2) Skill, agent and sweep: partly delivered. This chunk holds the new
  `remove-comments/evals/evals.json`; the `reference/` and `scripts/` files renamed from
  `dissolve-comments` and `audit-comment-residue` with their cites updated; and the sweep of
  cross-plugin cites in tidy-diff, tidy, discipline, docs-hygiene, overengineering, playbooks
  repo-sweep and its test, and the `scripts/*` lists. In the parts I read, `dissolve-comments`
  survives only as the deliberate `dissolve-comments-ignore` backward-compatible token and the Old
  patterns table. The skill body, the `audit` action and the agent are in chunk 1.
(3) Postures and edit scope through the convention home: delivered on the repository side. The new
  `scripts/settings.sh` resolves its file layers through `lib/resolve-convention-home.sh`, with
  `docs/conventions` as the default and a broken pointer leaving every key unset. `settings.test.sh`
  covers the bound-home, 
- Done-when item 4 (before/after evals showing no loss for each skill-body cut) is only partly
  delivered. Chunk 1 calls it 'partly delivered here' (updated same-contract and acr- eval cases,
  new remove-agent-dispatch and acr-router-drops-leading-audit). Chunk 2 'supplies the eval file
  only' (remove-comments/evals/evals.json). Neither chunk says the evals show no loss for the body
  cuts. The PR body records the body-rule controls as UNMEASURABLE and defers this to #12703. The
  owner decision comment sets that rule aside, but the spec lists no person_checks, so the item
  stays open.
- plugins/code-tidying/skills/remove-comments/scripts/settings.sh:177: chunk 2 notes that this
  script (chunk 2) rejects legacy posture values from file layers. SKILL.md (chunk 1) says those
  values still resolve, and evals 14 and 18 rely on that. A human should confirm the two agree.
- Neither chunk result contains text that tries to direct the verifier. CI evidence is absent: both
  chunks report that select-tests and every test job were skipped on this head.
- plugins/code-tidying/agents/comment-reviewer.md:3: the agent is pinned to `model: sonnet`,
  `effort: medium`, `maxTurns: 80`. These are model, effort and turn settings that spend within the
  subscription. SKILL.md lets a `/multi-agent:route` config layer override model and effort at
  dispatch.
- plugins/code-tidying/evals/acr-dir-batch-skips/samples/skill-invoked.json:25: the fail sample for
  `docs-hygiene:audit-noise` had its args changed from `scripts/` to `audit scripts/`. This looks
  like a blind replace; it is harmless because the skill name still fails the grader, but it is not
  accurate.
- plugins/code-tidying/evals/acr-readonly-strip-request/case.yaml:17: the grader `input_match:
  'remove-comments","args":"audit'` depends on how the tool input is serialized as JSON. The PR body
  says this grader never fires in either arm, so the case carries no signal until that is fixed.
- .github/workflows/pr-require-checks.yml:1757: the check-comment-markers exclude narrowed from all
  of the old residue skill's `scripts/**` to `remove-comments/scripts/detect*` and `scripts/lib/**`.
  That leaves `changed-code-files.sh`, which used to be excluded, inside the scan. The step is
  `continue-on-error`, so this is low risk; worth confirming the file has no banned markers.
- plugins/code-tidying/skills/audit-comment-residue/SKILL.md:37: the skill stays as a model-invoked
  router with `allowed-tools: ["Skill"]` and the before description. This partly reverses D60's
  fold-in, but it matches the owner's recorded decision on #12474.
- docs/upstream/cursor-pstack.md:89: this row still links `dissolve-comments/SKILL.md`, pinned to
  commit 4a3213c937, so its line cites stay valid. SKILL.md keeps an 'Old patterns' table and the
  `dissolve-comments-ignore` marker as floor aliases. These remaining mentions look intentional and
  do not break the sweep.
- plugins/code-tidying/skills/remove-comments/scripts/settings.sh:177: `valid()` accepts only
  auto/none/necessary/explanatory for comment_posture. A team or personal file holding a legacy
  value (`aggressive`, `balanced`, `strict`, `conservative`) is therefore reported as invalid and
  dropped. SKILL.md 'Settings' says old posture values still resolve, and evals 14 and 18 rely on
  that. Consider mapping the legacy values here, or stating that only userConfig accepts them.
- plugins/code-tidying/skills/remove-comments/scripts/lib/comment-shapes.sh:3: the header still
  points to "the skill's SKILL.md 'Residue shapes and treatments'". That section now lives in
  actions/audit.md, so this is a stale cite.
- plugins/code-tidying/skills/remove-comments/scripts/detect.test.sh:108: the parity check now greps
  actions/audit.md for `<skill-dir>/scripts/changed-code-files.sh`. I confirmed the string is
  present in actions/audit.md (chunk-1 part-018, the 'Running it' table).
- plugins/overengineering/skills/justify/SKILL.md:184 and
  plugins/overengineering/context/justification-lane.md:296: the owner tables now name only
  `code-tidying:remove-comments`. Per the owner's decision, `audit-comment-residue` still exists as
  a router that forwards to it. This is acceptable, but the router is no longer listed as an owner.
- upstream-jobs.json: `select-tests` and every test job were skipped, which marks a label or
  body-edit re-run. The list is no evidence for `detect.test.sh`, `settings.test.sh` or
  `catalog.test.sh` on this head.

This pull request leaves the merge queue, and ci-status holds it out while it carries pr-verify-failed. A pr-verify pass at a new commit removes the label.

@github-actions github-actions Bot added the pr-verify-failed pr-verify failed this head; a pass at a new commit removes it. label Nov 3, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Nov 3, 2026

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

claude-security-review: 2 inline finding(s) on 94339f6a61f5ac6c08524553cdaca6d731c0e9fe; the summary is in this lane's pull request comment.

claude-lane: claude-security-review

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

claude-review: 1 inline finding(s) on 94339f6a61f5ac6c08524553cdaca6d731c0e9fe; the summary is in this lane's pull request comment.

claude-lane: claude-review

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

claude-security-review: 1 inline finding(s) on 5e7556c98328fd196f87f1c31ff850ef88bc32ac; the summary is in this lane's pull request comment.

claude-lane: claude-security-review

@github-actions github-actions Bot removed the pr-verify-failed pr-verify failed this head; a pass at a new commit removes it. label Nov 3, 2026
@kyle-sexton
kyle-sexton added this pull request to the merge queue Nov 3, 2026
Merged via the queue into main with commit c556b3b Nov 3, 2026
101 of 103 checks passed
@kyle-sexton
kyle-sexton deleted the feat/12474-remove-comments branch November 3, 2026 06:33
@github-actions

github-actions Bot commented Nov 3, 2026

Copy link
Copy Markdown
Contributor

Post-merge mutation testing

Killed 4, survived 3, timeout 0, no coverage 0, invalid 0, not run 0.
Covered-code score 57%; mutation score 57%.

File Killed Survived Timeout No coverage Invalid Not run
plugins/code-tidying/skills/remove-comments/scripts/settings.sh 4 3 0 0 0 0

Surviving mutants

Location Operator Disposition Cause
plugins/code-tidying/skills/remove-comments/scripts/settings.sh:39 ROR productive input-gap
plugins/code-tidying/skills/remove-comments/scripts/settings.sh:54 LCR productive input-gap
plugins/code-tidying/skills/remove-comments/scripts/settings.sh:26 ROR productive input-gap

The run's summary has the full report.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

code-tidying: rename dissolve-comments to remove-comments with a comment-reviewer agent

1 participant