feat(codebase-health): route the audit's Boundary to the seven sibling drift lanes - #3828
Conversation
…g drift lanes The audit skill covers doc, config, code, and architecture drift, and named only one adjacent lane. An operator who reached it had no path to the other six, so a request that belonged elsewhere got claim-extraction run over it. Add a `Boundary, the adjacent drift lanes` section: one table row per lane, each stating what that lane owns. The prior claude-config-only scope note is folded into the table rather than left as a second statement of the same rule. Every route is presence-gated; an absent plugin means the lane is named as out of scope, never asserted as available. The README points at the section instead of repeating it. Frontmatter description untouched, so the listing entry is unchanged at 562 chars. Closes #3810 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ViPsHkL3ng9xWt2GjEQJob
…kill Two rows of the new Boundary table described the case where the lanes do not collide and stayed silent on the case where they do. `doc-drift-detector` was scoped to "a change under review", but that agent audits every doc area when invoked with no scope, and its own description triggers on "audit documentation" and "find stale docs" during maintenance cycles. That standalone mode is exactly where it overlaps this skill's `documentation` dimension, so the row now names it and splits the sweep by question: whether a page deserves to exist is the agent's, it runs a derivability admission gate this skill has no equivalent of; whether a page's claims are true is this skill's. The claude-config row named `audit` and `audit-automation-gaps` but not `audit-instructions`, the nearest unnamed misroute: Phase 0 reads `CLAUDE.md`, `AGENTS.md`, and `.claude/rules/`, and a claim those files make about the harness is not repo state this skill can verify. The row adds it and says the instruction files are read here only as the convention lens. The README's claude-config scope note survived the first fold three lines above the paragraph that anchors to the table routing the same lane. Folded, so the table is the single place that rule lives. No manifest bump; 0.9.0 already covers this change. Closes #3810 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ViPsHkL3ng9xWt2GjEQJob
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
|
Claude finished @kyle-sexton's task in 5m 4s —— View job Code review complete
This is a docs-only change (
The README anchor ( One inline nit posted on the invocation-mechanism wording (Skill tool vs. agent invocation). One cross-file finding, no changed line to anchor it to: The skill's Everything else — presence-gating contract, the two overlap disambiguations (doc-drift-detector's repo-wide mode vs. this skill's Note: I could not independently re-run the PR's cited verification commands ( Branch: |
Independent review and the fix it produced — flipped to readyPosted by the autonomous worker lane ( A fresh-context reviewer verified every routing claim individually against the target's own frontmatter and body, because a Boundary section that sounds authoritative and routes wrong is worse than none. Verified
The blocking findingThe The fix reads better than a simple widening: it splits the overlap by question rather than by scope. Whether a page should exist at all is the agent's (it runs a derivability admission gate this skill has no equivalent of, confirmed by grep); whether a page's claims are true is this skill's, with Two smaller ones, both real
Gates green in the foreground: Generated by Claude Code |
|
Claude finished @kyle-sexton's task in 40s —— View job Security review complete
Skip gate triggered: this PR has no security-relevant surface. All four changed files are documentation and manifest metadata:
There's no code execution path, no auth/access-control logic, no injection surface (command/SQL/path/template), and no secret/token handling touched by this diff. Nothing here falls in this lane's scope. No security issues found. Nothing to report. |
|
Last security-reviewed head: |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 886ba846fe
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
Claude has reviewed this PR 1 time. The lane skips further automatic reviews after 5; deleting this comment resets the count. |
Merge lane claim — canonical for #3810, and the diagnosis of
|
Addresses the four open review threads holding this PR at blocked. P1, the read-only contract. The preamble told a bare audit to "route there and invoke it via the Skill tool". /discipline:recheck-against- upstream says "Correct each forward now: fix gaps toward upstream", and bare audit is READ-ONLY per the verb contract, so that let the skill edit the repo through a sibling. The table is now a router for the operator: a request owned by another lane is reported as uncovered and the lane is named as the next thing to run, whether or not its plugin is installed. --fix authorizes remediation of this skill's own findings only. P2, contradictory ownership of factual doc drift. The dispatch rule is now the question asked, not the scope swept. Whether a page deserves to exist is the agent's derivability gate; whether its claims are true is always this skill's, repo-wide included, and --docs-only never routes out. P2, the unnamed fanout mode. The row now names /review:fanout run-everything, verified: doc-drift-detector appears in context/run-everything-mode.md and not in context/default-mode.md, so an unqualified /review:fanout can finish without reaching the owner. Nit, agent vs skill. The blanket "via the Skill tool" clause is gone; each row states its own invocation form and row 1 names the Agent tool. The read-only routing contract is ported from #3829, the parallel independent PR on #3810 now closed as a duplicate, with attribution in the CHANGELOG. Heading text is unchanged, so the README anchor still resolves. Verification: affected-tests.sh --explain/--run (all 4 files are recorded no-suite classes), check-skill.sh PASS 0 errors 7 warnings (unchanged from before), check-listing-budget 562/8000 unchanged, markdownlint 0 issues, check-purged-em-dashes clean, changelog parity --check and --check-bump pass. Manifest stays 0.9.0; this refines the unreleased entry rather than adding a bump. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VPLatLkg4329L8eyfxhuMa
… verification (#3809) v1 evidence restated as class-level with no lane-specific run record and the ruling made a dispatch gate; ci-cron reduced to a fact plus an illustrative binding with no exclusion; audit lane given a deterministic pre-invocation target check; rotation index tables; no-path grep widened; precedent, counts, and PR #3828 status corrected. Refs #3809 Refs #3803 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012jiwedVq2GxuzN7siXQbr4
Closes #3810
Summary
/codebase-health:auditcovers doc, config, code, and architecture drift. Seven sibling lanes each own a different kind of drift, and the skill named exactly one of them (claude-config), in a paragraph buried inside the graceful-degrade section. An operator who reached this skill had no path to the other six, so a request that belonged to another lane got claim-extraction run over it instead of a route.Fix
plugins/codebase-health/skills/audit/SKILL.mdgains a## Boundary, the adjacent drift lanessection, placed between the graceful-degrade section and the dimension seam. It follows the routing-table shape already used byoverengineering:justify: a presence-gating preamble, then one table row per lane stating what that lane owns.review'sdoc-drift-detectoragentplugins/review/agents/doc-drift-detector.md; listed inskills/fanout/context/leaf-roster.mdand dispatched byrun-everything-mode.md/session-flow:reanchorplugins/session-flow/skills/reanchor/SKILL.md/discipline:recheck-against-upstreamplugins/discipline/skills/recheck-against-upstream/SKILL.md/provenance:auditplugins/provenance/skills/audit/SKILL.md/claude-config:audit(+audit-automation-gaps,audit-instructions)settings.json,.mcp.json, hooks, permissions, env vars, and instruction-surface text judged against model capability or against how Claude Code actually behavesplugins/claude-config/skills/audit/SKILL.md,.../audit-instructions/SKILL.md/instruction-placement:deltaplugins/instruction-placement/skills/delta/SKILL.md/overengineering:deltaplugins/overengineering/skills/delta/SKILL.mdEach name was read out of its own
SKILL.md(or agent frontmatter) rather than recalled, so no row asserts a capability the target does not have.Supporting points:
doc-drift-detectoraudits every doc area when invoked with no scope (plugins/review/agents/doc-drift-detector.md, Workflow step 1), and its description triggers on "audit documentation" and "find stale docs" during maintenance cycles. That standalone mode is the one place it collides with this skill'sdocumentationdimension, so the row names it and splits the sweep by question: whether a page deserves to exist is the agent's (it runs a derivability admission gate this skill has no equivalent of), whether a page's claims are true is this skill's. Theclaude-configrow addsaudit-instructions, the nearest unnamed misroute: Phase 0 readsCLAUDE.md,AGENTS.md, and.claude/rules/, and a claim those files make about the harness is not repo state this skill can verify; the row says they are read here only as the convention lens.Out of scope per the issue and untouched here: what the audit detects, how it reports, and all seven sibling skills.
Verification
Run from
/home/user/wt-3810on the committed state (re-run after the follow-up routing commit; results unchanged).bash scripts/affected-tests.sh --explainbash scripts/affected-tests.sh --runCHECK_SKILL_SKILLS_ROOT=$PWD bash plugins/skill-quality/scripts/check-skill.sh plugins/codebase-health/skills/auditPASS — 0 errors, 7 warning(s); the same 7 warnings appear on the pre-change file (line numbers shifted only)bash plugins/skill-quality/scripts/check-listing-budget.sh plugins/codebase-health/skillsOK — aggregate 562/8000 chars, byte-identical to the pre-change measurement (description unchanged)bash scripts/check-purged-em-dashes.shnpx markdownlint-cli2on the 3 changed markdown filesbash scripts/check-changelog-parity.sh --checkbash scripts/check-changelog-parity.sh --check-orderbash scripts/check-changelog-parity.sh --check-bump origin/main0.9.0entry present for the bumped manifestbash scripts/check-changelog-parity.sh --check-preserved origin/mainThe README anchor
#boundary-the-adjacent-drift-lanesstill resolves: the heading text is unchanged atSKILL.md:67.Manifest bumped
0.8.9→0.9.0(additive section) with a matching## [0.9.0]CHANGELOG entry. The follow-up routing commit refines the same unreleased entry and adds no further bump.docs/SKILL-CHEAT-SHEET.mdanddocs/CATALOG.mdrendermetadata.summaryand the plugin-manifest description respectively; neither changed, so neither doc row needed editing.Not from this branch:
test_save_point.py::test_new_origin_falls_back_to_directory_namefails identically on pristineorigin/main.Related
instruction-placement:delta), disjoint tree🤖 Generated with Claude Code
https://claude.ai/code/session_01ViPsHkL3ng9xWt2GjEQJob
Generated by Claude Code