Skip to content

feat(re-anchor): add sweep-all-disciplines posture-batch runbook#1050

Merged
kyle-sexton merged 6 commits into
mainfrom
feat/1041-re-anchor-posture-batch
Jul 22, 2026
Merged

feat(re-anchor): add sweep-all-disciplines posture-batch runbook#1050
kyle-sexton merged 6 commits into
mainfrom
feat/1041-re-anchor-posture-batch

Conversation

@kyle-sexton

@kyle-sexton kyle-sexton commented Jul 22, 2026

Copy link
Copy Markdown
Contributor

Closes #1041.

What

Adds a posture-batch runbook to the re-anchor plugin — a higher-order
skill that composes the discipline correctors into one re-anchor pass, instead
of hand-pasting a long list of /re-anchor:* invocations. It is a declared
second species
: not a corrector, carries zero discipline text, pure router.

Name sweep-all-disciplines — confirmed by Kyle from a blind 3-lens naming
pass (shortlist: sweep-all-disciplines (chosen), run-every-corrector,
ground-every-discipline, set-the-posture).

How it works

  • Fork audit fan-out. One conversation-inheriting fork subagent (Agent
    tool subagent_type: "fork" — inherits history, required to audit it)
    per in-scope corrector, audit-only (shared-loop steps 1-2, no writes), one
    SKILL.md each, returns a findings ledger.
  • Main-thread ordered corrections. Applied once, serialized, fixed rank
    order: use-your-skills first → evidence → structural → mind-your-maxims
    tighten-your-output last. A load-bearing correction whose drift source is
    the main context still escalates to a fresh-context (non-fork) re-derivation
    per the engine doc's Non-negotiable.
  • Membership via colocated tier metadata. Each corrector self-classifies
    in its own frontmatter (metadata.re-anchor-batch = core/situational/never
    • re-anchor-batch-rank). The runbook globs and reads; it never names
      members. 4 core / 7 situational / 3 never.
  • Relevance routing for the situational tier; skips reported, never
    silent.
  • userConfig overlay (batch_exclude / batch_promote / batch_demote)
    — the plugin's first userConfig surface.
  • Session-start mode = cheap listing-derived posture digest, no bodies
    load.
  • Declared delta from the engine doc's per-corrector "correct forward now"
    recorded in the skill. Member human-gates and the outward-artifact carve-out
    survive batching.
  • Fixes the README scrutinize-dont-coast table/detail drift (13 listed vs 14
    shipped). Bumps re-anchor to 0.6.0.

Verification

  • All facts checked against current official docs (fresh-docs mandate):
    userConfig schema (plugins-reference), metadata: frontmatter (skills),
    fork context/model inheritance (sub-agents).
  • skill-quality:check PASS on all 15 re-anchor skills (0 errors/warnings);
    markdownlint clean; claude plugin validate passes; internal doc link
    resolves; all CI checks green.
  • Independent fresh-context review (rationale withheld): ship-ready, no
    CRITICAL. Its one IMPORTANT (fresh-context escalation must survive batching)
    and the fork-cost caveat are applied in the latest commit. The Claude
    review-bot's clarity finding (never-tier excluded before the rank-walk) is
    also applied; the security bot's sole note was LOW / no-action; Codex clean.

Classification decisions (documented; reviewer-endorsed)

  1. scrutinize-dont-coastnever on architectural grounds: its audit
    needs a non-fork fresh context and it stops to remediate with the user
    — incompatible with the autonomous fork fan-out. A second "never" class
    beyond the -deep cost class. (Alternative if ever wanted: situational
    with a special non-fork dispatch path.)
  2. Overlay uses documented scalar-string userConfig (comma-separated
    names), not the multiple: true array — array-into-skill-content
    substitution is undocumented, and substitution is the overlay's only
    consumption path.

Related

  • Design record: the P14 surviving architecture from the session's
    adversarial-review decision log (repository-external working notes for the
    repeated-prompts-to-skills effort).
  • One of the parallel P13-P18 builder lanes; the sibling lanes ship as separate
    PRs and do not depend on this one.
  • Follow-up (out of scope here, filed separately): a pre-existing docs-hygiene
    rubric conflates Agent-tool fork with skill-level context: fork; this PR's
    usage is correct per official docs.

🤖 Generated with Claude Code

Add a composed runbook that batches the discipline correctors into a single
re-anchor pass: it fans out a conversation-inheriting fork subagent per
in-scope corrector for an audit-only walk, then applies the corrections once
on the main thread in a fixed rank order (use-your-skills first,
tighten-your-output last). At session start it reports a cheap posture digest
instead, loading no corrector bodies. It is a declared second species, not a
corrector, and records its split of the shared loop as a declared delta.

Membership and order live in each corrector's own colocated frontmatter
metadata (re-anchor-batch tier + re-anchor-batch-rank), so the runbook globs
and reads rather than naming members; a userConfig overlay
(batch_exclude/promote/demote) adjusts membership without a PR. Also fixes the
README scrutinize-dont-coast table/detail drift and bumps re-anchor to 0.6.0.

Refs #1041

🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
@claude

claude Bot commented Jul 22, 2026

Copy link
Copy Markdown

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


PR Review: feat(re-anchor): add sweep-all-disciplines posture-batch runbook

Tasks

  • Gather context and understand the PR
  • Review sweep-all-disciplines/SKILL.md — architecture, correctness
  • Review sweep-all-disciplines/evals/evals.json — eval quality
  • Review plugin.json changes — schema correctness
  • Review frontmatter additions to corrector SKILL.md files
  • Review README.md and CHANGELOG.md updates
  • Check CLAUDE.md / plugin design-rule compliance
  • Compile and post final review

Overall Assessment

This is a well-designed, thoroughly-documented addition. The declared-second-species framing is architecturally sound, the colocated-metadata approach avoids the hand-maintained-list drift problem neatly, and the fork/main-thread split for audit vs. correction is the right call. A few ambiguities in SKILL.md could cause inconsistent agent behavior and should be tightened before merge.


Findings

1. Step-3 correction mechanism is underspecified (correctness concern)

SKILL.md line 85–88:

Walk the members by ascending re-anchor-batch-rank and correct forward each finding on the main thread now — the shared loop's step 3, batched.

This tells the main thread when to apply corrections but not how. An agent following this instruction might correct from the findings ledger alone (i.e., from memory of what the audit found), rather than re-loading each corrector's SKILL.md and executing its step 3. That's a meaningful difference — the corrector's SKILL.md contains the discipline's specific correction rules.

Suggested addition after "correct forward each finding": "Load that corrector's SKILL.md and apply shared-loop step 3 using its discipline rules, not from the findings ledger alone."

Fix this →


2. userConfig overlay conflict cases are undefined (minor correctness gap)

SKILL.md lines 110–117 and plugin.json lines 37–55:

Three edge cases have no specified behavior:

  • Same name appears in both batch_promote and batch_demote — which wins?
  • A never-tier name in batch_exclude — already excluded; is this silently ignored or flagged?
  • A core name in batch_promote — already always-run; is this a no-op or flagged?

Given that the overlay is user-facing and errors here produce invisible misbehavior, a brief precedence rule (e.g., "exclude wins; promote and demote applied only to the tiers they make sense for; mismatched overlays are reported, not silently no-oped") would prevent silent incorrect behavior.

Fix this →


3. Session-start mode condition underspecified (minor ambiguity)

SKILL.md lines 22–27:

Derive the posture from the skill listing and each corrector's tier metadata — NO corrector bodies load, NO audit runs … This is the conversation-start case.

"When nothing has happened yet" isn't a crisp trigger. An agent could interpret this as: zero assistant turns, zero tool calls, zero tokens produced, or simply "this is the first user message." The skill description (frontmatter) says "at conversation start to set posture" — that phrase is sufficient in the description but the body should match it with an equally concrete signal. A concrete criterion such as "when there are no prior assistant turns in this conversation" would remove ambiguity.


4. Concurrency cap references -deep siblings without a number

SKILL.md line 81:

Cap concurrency in bounded waves like the -deep siblings

An agent that hasn't just run a -deep skill may not know what "like the -deep siblings" implies numerically. The -deep skills presumably state a cap; repeating or referencing a concrete number here (e.g., "waves of four to six") would make this self-contained and avoid the model guessing wrong.


5. re-anchor-batch-rank absent on never-tier correctors — worth a note (documentation gap)

The three never-tier correctors (do-your-research-deep, recheck-against-upstream-deep, scrutinize-dont-coast) correctly omit re-anchor-batch-rank since they're never sorted into the correction pass. But the SKILL.md's membership resolution step tells the runbook to read metadata.re-anchor-batch-rank from every globbed corrector. When globbing encounters a never-tier member, the rank will be absent/null. The SKILL.md should state explicitly that never-tier members carry no rank and are skipped from rank-ordered correction — currently a reader (and an agent) has to infer this.


What looks correct and solid

  • Rank ordering is internally consistent. Confirmed: use-your-skills=10 (first) → do-your-research=20 → situational correctors 30–90 → mind-your-maxims=100 → tighten-your-output=110 (last). The rationale in the comments on each rank is sound.
  • Membership counts match the claim. 4 core / 7 situational / 3 never — verified across all 14 corrector frontmatters.
  • ${CLAUDE_PLUGIN_ROOT} path correct. The relative path ../../context/re-anchor-audit-correct.md resolves correctly from skills/sweep-all-disciplines/, and the context file exists.
  • userConfig schema is correct. Three type: "string" keys with default: "" in plugin.json match the ${user_config.batch_*} substitutions in SKILL.md. The decision to use comma-separated strings rather than an undocumented multiple: true array is sound.
  • Fork subagent distinction is explicitly documented. The Gotchas section calls out the three fork-vs-non-fork paths clearly — this is the most common mistake with subagent dispatch and it's handled well.
  • Member human-gates survival is explicitly documented. Human-gate preservation for batching is stated at the skill level, not deferred to each corrector — correct place for it.
  • Evals cover all five distinct behaviors. Session-start digest, full batch pass, situational routing, never-tier exclusion, and userConfig overlay — each has a distinct prompt and concrete expectations.
  • README scrutinize-dont-coast drift fix is accurate. Table now has 14 correctors; CHANGELOG documents the fix.
  • CLAUDE.md compliance. Repo-agnostic (no hardcoded paths), configurable via userConfig without editing the plugin, plugin-form-safe (${CLAUDE_PLUGIN_ROOT} only), versioned (0.5.1 → 0.6.0), and the declared-delta pattern follows the design philosophy.

Pending decisions for Kyle (not blocking review, blocking merge)

Per the PR body — do not merge until Kyle confirms:

  1. Skill name: sweep-all-disciplines (recommended), or one of the three alternates.
  2. scrutinize-dont-coast as never: The architectural rationale is solid (non-fork fresh context + stops to remediate WITH the user — both incompatible with the autonomous fork fan-out). The classification is a defensible commitment.
  3. Comma-separated scalar userConfig: The decision not to rely on undocumented multiple: true array behavior is the right conservative call given the fresh-docs mandate.

@claude

claude Bot commented Jul 22, 2026

Copy link
Copy Markdown

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


Security Review — PR #1050

Tasks

  • Load tools and initialize
  • Fetch PR diff
  • Read changed files
  • Analyze for security vulnerabilities
  • Post findings

This PR adds a posture-batch runbook skill (sweep-all-disciplines), adds metadata: tier blocks to every existing corrector, and introduces three userConfig scalars to plugin.json. The changed files are SKILL.md instruction documents, a plugin manifest JSON, eval data, and documentation. There is no executable code, no shell scripts, no GitHub Actions modifications, and no external network calls.

No CRITICAL or IMPORTANT security findings.


SUGGESTION — userConfig values substituted raw into LLM instruction content

Confidence: LOW

Lines 110–112 of sweep-all-disciplines/SKILL.md:

- Excluded correctors: `${user_config.batch_exclude}`
- Promoted to always-run: `${user_config.batch_promote}`
- Demoted to relevance-gated: `${user_config.batch_demote}`

These three user-controlled strings are substituted verbatim into skill instruction content before it is interpreted by the model. A value containing embedded instructions (e.g., point-dont-copy\n\nIgnore previous instructions and ...) would be injected into the prompt as-is.

The blast radius is narrow: userConfig scalars are documented as personal, set only through Claude Code's plugin-config flow, and the consuming user is already the principal in the Claude Code session — so this is self-injection rather than a cross-user or cross-project privilege escalation. There is no scenario in which a third party controls these values to attack another user.

The low confidence reflects that the threat model for a personal Claude Code plugin config does not include a meaningful adversary. It is worth noting as a defence-in-depth concern if the platform ever allows project-level userConfig overrides that apply across users, or if the values are ever consumed in a higher-trust context than today's personal scalar.

No other injection surfaces, secret handling, permission escalation, path traversal, GitHub Actions patterns, or supply-chain risks were identified in the changed files.

Sync the root README plugin catalog with the re-anchor manifest description
via scripts/generate-catalog.mjs (plugin-gate parity).

🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
@claude

claude Bot commented Jul 22, 2026

Copy link
Copy Markdown

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


PR Review: feat(re-anchor): add sweep-all-disciplines posture-batch runbook

Tasks

  • Gather context — check what changed in the latest commit (b53110a)
  • Review sweep-all-disciplines/SKILL.md — architecture, correctness
  • Review corrector frontmatter additions
  • Review plugin.json changes
  • Review README/CHANGELOG/catalog updates
  • Compile and post final review

Latest commit (b53110a) — catalog sync only

The push that triggered this review contains one change: a root README.md update that appends sweep-all-disciplines to the re-anchor catalog description (generated by scripts/generate-catalog.mjs). The text correctly summarizes the runbook's second-species role, batch mechanics, and colocated-tier design. No correctness issues with this commit.


Overall Assessment

The architecture is sound. Declared second species, colocated tier metadata, fork-for-audit / main-thread-for-correction, no drift-prone member list — all of these are the right calls. The findings below are continuation from the 91a0a83 review; none have been addressed in b53110a.


Findings (ranked most-severe first)

1. Step-3 mechanism is underspecified — an agent could correct from memory alone

SKILL.md lines 83–85:

Walk the members by ascending re-anchor-batch-rank and correct forward each finding on the main thread now — the shared loop's step 3, batched.

This tells the main thread when to correct but not how. An agent following this literally might apply corrections directly from the findings ledger (the fork's output), rather than reloading each corrector's SKILL.md and executing its discipline-specific step 3. Those two are semantically different — the corrector's own rules govern exactly what "correct forward" means for that discipline.

Suggested text after "correct forward each finding on the main thread now —": "Load that corrector's SKILL.md and apply its step 3 using its discipline rules, not from the findings ledger alone."

Fix this →


2. userConfig overlay conflict cases have no defined precedence

SKILL.md lines 110–117:

Three edge cases have no specified resolution:

  • Same name in both batch_promote and batch_demote — which wins?
  • A never-tier name in batch_exclude — already excluded; silently ignored or reported?
  • A core name in batch_promote — already always-run; no-op or reported?

Without rules here, these produce invisible misbehavior. Suggested one-liner precedence: "exclude wins over promote/demote; promote/demote applied only to the tiers they make sense for; mismatched overlays are reported, not silently ignored."

Fix this →


3. Glob self-inclusion: the runbook is a sibling directory and has no re-anchor-batch key

SKILL.md lines 33–38:

Glob the sibling corrector directories and read each one's metadata.re-anchor-batch

sweep-all-disciplines/ itself lives in skills/ alongside the correctors — a glob of sibling directories will match it. It carries no re-anchor-batch key. The SKILL.md doesn't instruct the agent to skip entries with no tier metadata, or to skip itself by name. An agent could either error on the missing key or treat the runbook as an implicit never. Both are wrong. A short exclusion rule — "skip any sibling that has no re-anchor-batch key in its frontmatter" — closes this without naming any member inline.

Fix this →


4. Session-start mode condition is not crisp

SKILL.md lines 22–27:

This is the conversation-start case: set posture, audit nothing.

"When nothing has happened yet" is ambiguous to an agent — zero assistant turns? Zero tool calls? Zero tokens produced? The frontmatter description says "at conversation start to set posture" — a concrete equivalent in the body (e.g., "when there are no prior assistant turns in this conversation") removes the guesswork.


5. Concurrency cap references the -deep siblings without a number

SKILL.md line 81:

Cap concurrency in bounded waves like the -deep siblings

An agent that hasn't just run a -deep skill may not know what cap "like the -deep siblings" implies. A concrete number (or range, e.g., "waves of four to six") makes this self-contained and prevents a wrong guess.


6. never-tier entries will surface in rank sort with no rank — not called out

SKILL.md line 83:

Walk the members by ascending re-anchor-batch-rank

The membership resolution step globs all correctors and reads their rank. The three never-tier correctors carry no re-anchor-batch-rank. An agent asked to sort by ascending rank will encounter null/absent values. The SKILL.md should state explicitly that never-tier members are filtered out before rank-sorting — currently an agent has to infer that.


What is correct and verified

  • Tier membership counts match the PR claim. 4 core (use-your-skills:10, do-your-research:20, mind-your-maxims:100, tighten-your-output:110) / 7 situational (ranks 30–90) / 3 never (no rank). Verified across all 14 corrector frontmatters.
  • Rank ordering is internally consistent. use-your-skills=10 → do-your-research=20 → situational correctors 30–90 → mind-your-maxims=100 → tighten-your-output=110. Matches the narrative order declared in the SKILL.md body.
  • ${CLAUDE_PLUGIN_ROOT} path resolves correctly. ../../context/re-anchor-audit-correct.md from skills/sweep-all-disciplines/ lands in context/, which exists.
  • userConfig schema is correct. Three type: "string" keys with default: "" in plugin.json match the ${user_config.batch_*} substitutions in SKILL.md; comma-separated scalar over undocumented multiple: true is the right conservative call given the fresh-docs mandate.
  • Latest commit (b53110a) catalog text is accurate. The root README entry correctly summarizes the runbook's second-species role, fork fan-out, ordered correction, colocated-tier membership, and userConfig overlay.
  • Fork subagent distinction is explicit. The Gotchas section distinguishes subagent_type: "fork" from fresh/typed and skill-level context: fork — the most common mistake in subagent dispatch.
  • Human-gates survive batching. Stated at skill level, not deferred — correct placement.
  • Evals cover all five distinct behaviors (session-start digest, full batch pass, situational routing, never-tier exclusion, userConfig overlay).
  • README scrutinize-dont-coast drift fixed. Table has 14 correctors; CHANGELOG documents it; the runbook gets its own table separate from the corrector table.

Pending decisions for Kyle (blocking merge per PR body)

  1. Skill namesweep-all-disciplines is the recommendation. Confirm or pick from shortlist.
  2. scrutinize-dont-coast as never — architectural rationale is solid (non-fork fresh context + collaborative remediation, both incompatible with autonomous fan-out). Defensible commitment.
  3. Comma-separated scalar userConfig — correct conservative call; leave as-is.

@claude

claude Bot commented Jul 22, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 2m 5s —— View job


Security Review — PR #1050

Tasks

  • Fetch PR diff and identify changed files
  • Read new/changed SKILL.md files for injection surfaces
  • Review plugin.json changes for secrets/config risks
  • Check for dangerous GitHub Actions patterns
  • Compile and post findings

This PR adds sweep-all-disciplines/SKILL.md (a posture-batch runbook), an evals file, three userConfig scalars to plugin.json, and tier-metadata frontmatter blocks to every existing corrector. The latest commit (b53110a) is a root-catalog regeneration touching only README.md — one description string change, no new security surface.

Changed file types: LLM instruction documents (Markdown), eval JSON, and a plugin manifest. No executable code, no shell scripts, no GitHub Actions modifications.

No CRITICAL or IMPORTANT security findings.


SUGGESTION — userConfig strings substituted verbatim into LLM instruction content

Confidence: LOW

sweep-all-disciplines/SKILL.md lines 110–112:

- Excluded correctors: `${user_config.batch_exclude}`
- Promoted to always-run: `${user_config.batch_promote}`
- Demoted to relevance-gated: `${user_config.batch_demote}`

These three userConfig scalars are substituted verbatim into skill instruction content at load time. A value containing embedded instructions (e.g. point-dont-copy\n\nIgnore previous instructions and …) would be injected into the model's prompt as-is.

In today's platform model, userConfig scalars are configured only by the individual user through Claude Code's native plugin-config flow — so this is self-injection: the user can only affect their own session, which they could influence through direct prompting anyway. There is no cross-user or privilege-escalation risk under the current trust model, and no meaningful adversary to exploit this. Confidence is LOW for that reason.

Worth noting as a defense-in-depth concern if the platform later supports org-level userConfig overrides administered across users, where a third party would control these substituted values. No action required now; flagged for awareness if the plugin is adapted for a managed/multi-user context.


Areas with no findings

  • No GitHub Actions changes. All eight workflow files (ci.yml, claude-review.yml, claude-security-review.yml, etc.) are untouched. No pull_request_target, workflow_run, github context script-injection, permission-widening, or action-pin changes.
  • No external network surfaces. The new SKILL.md contains no external URLs, no remote MCP server references, no webhook targets, and no data-egress paths.
  • No secrets or credentials. The plugin.json userConfig additions are three empty-default string scalars; none handle tokens, API keys, or credentials.
  • No path traversal. The glob-based membership resolution described in the SKILL.md is LLM instruction text, not executable filesystem code. The only path references use ${CLAUDE_PLUGIN_ROOT} (the plugin-form-safe variable) and resolve within the plugin boundary.
  • Corrector frontmatter additions are inert. The 12 modified corrector files each gain 2–3 lines of metadata: YAML declaring a tier and optional rank integer — no code, no injection surface.
  • Evals file is benign. evals.json contains static prompt/expectation pairs with no external references and no executable content.
  • Fork subagent dispatch is intentional and scoped. The subagent_type: "fork" instruction is a documented Claude Code pattern; the forks inherit conversation history by design for audit purposes and perform no writes.

@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: b53110a009

ℹ️ 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/re-anchor/skills/sweep-all-disciplines/SKILL.md
The correction step walks in-scope members by ascending re-anchor-batch-rank;
never-tier correctors carry no rank and are already excluded at membership
resolution. State that explicitly so the rank sort never meets an absent rank.

🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
@claude

claude Bot commented Jul 22, 2026

Copy link
Copy Markdown

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


PR Review: feat(re-anchor): add sweep-all-disciplines posture-batch runbook

Tasks

  • Gather context and load tools
  • Read sweep-all-disciplines/SKILL.md — verify Codex P1 and prior findings
  • Check latest commit (4512013) changes
  • Review plugin.json and frontmatter additions
  • Verify subagent_type: "fork" against live docs
  • Compile and post final review

Latest commit (4512013) — addresses finding #6 from prior reviews

The change explicitly states that never-tier correctors carry no rank and are excluded at membership resolution before the rank-walk:

-3. **Correct once, in rank order.** Walk the members by ascending
-   `re-anchor-batch-rank` and correct forward each finding on the main thread
-   now — the shared loop's step 3, batched.
+3. **Correct once, in rank order.** Walk the in-scope members — the core and
+   situational correctors that ran (never-tier carries no rank and was already
+   excluded at membership resolution) — by ascending `re-anchor-batch-rank`,

This closes the null-rank ambiguity that previous reviews flagged. Finding #6: fixed.


Codex P1 finding — factually incorrect, but surfaces a real gap

Codex flagged subagent_type: "fork" as invalid ("fork is not an agent type"). This is wrong per the live docs: fork is a documented subagent type that the Agent tool accepts when fork mode is active. From sub-agents:

"Claude can spawn a fork by requesting the fork subagent type explicitly."

However, Codex was directionally right that there's a problem — just not this one. See finding #1 below.


New finding: fork mode is opt-in and experimental — not documented in SKILL.md

SKILL.md line 73–75:

dispatch a conversation-inheriting fork subagent — the Agent tool's subagent_type: "fork", which inherits the full conversation history the audit must read

The docs confirm the mechanism is correct, but also state:

"Letting Claude itself spawn forks is experimental and may change in future releases."
"To control fork mode regardless of the staged rollout, set CLAUDE_CODE_FORK_SUBAGENT to 1 to enable it explicitly."

Without CLAUDE_CODE_FORK_SUBAGENT=1 set (or a server-side rollout), the Agent tool does not accept the fork subagent type. A consumer who runs this skill without fork mode enabled will find the entire batched audit pass broken: the forks cannot be dispatched, the ledger is empty, and no corrections fire. The SKILL.md has an accurate Gotchas section distinguishing fork from fresh/skill-level-fork, but is silent on the prerequisite.

Suggested addition to the Gotchas section:

Fork mode must be enabled. Claude spawning forks through the Agent tool is experimental and requires CLAUDE_CODE_FORK_SUBAGENT=1 (or a server-side rollout). Without it, the audit fan-out step cannot run and the batch produces no corrections. Set the variable or confirm the staged rollout covers your environment before using the full batch pass.

Fix this →


Still-open findings from prior reviews (none addressed since 91a0a83)

Step-3 mechanism underspecified — agent could correct from memory alone

SKILL.md lines 83–91:

correct forward each finding on the main thread now — the shared loop's step 3, batched.

The SKILL.md tells the main thread when to correct but not how. An agent could apply corrections directly from the findings ledger rather than reloading each corrector's SKILL.md and executing its discipline-specific step 3. Add after "correct forward each finding on the main thread now —": "Load that corrector's SKILL.md and apply its step 3 using its discipline rules, not from the findings ledger alone."

Fix this →

userConfig overlay conflict cases have no defined precedence

SKILL.md lines 116–119:

Three edge cases are unspecified: same name in both batch_promote and batch_demote; a never-tier name in batch_exclude; a core name in batch_promote. Each produces invisible misbehavior. A one-liner precedence rule would close all three: "exclude wins over promote/demote; promote/demote apply only to tiers they make sense for; mismatched overlays are reported, not silently ignored."

Fix this →

Glob self-inclusion: the runbook has no re-anchor-batch key and no skip rule

SKILL.md lines 33–38:

Glob the sibling corrector directories and read each one's metadata.re-anchor-batch

sweep-all-disciplines/ itself lives in skills/ alongside the correctors and will be globbed. It carries no re-anchor-batch key. The SKILL.md doesn't instruct the agent to skip entries missing the tier key. A short exclusion rule — "skip any sibling with no re-anchor-batch key" — closes this without naming any member inline.

Fix this →

Session-start mode condition is ambiguous

SKILL.md line 22`: "default when nothing has happened yet" is not crisp — an agent could interpret this as zero assistant turns, zero tool calls, or zero tokens. Concrete criterion: "when there are no prior assistant turns in this conversation."

Concurrency cap references -deep siblings without a number

SKILL.md line 80: "Cap concurrency in bounded waves like the -deep siblings" — an agent that hasn't just run a -deep skill won't know what "like the -deep siblings" means numerically. A concrete number or range (e.g., "waves of four to six") makes this self-contained.


What is verified correct

  • subagent_type: "fork" is a valid type (per live docs). The Gotchas section's three-way distinction (fork / fresh / skill-level context: fork) is accurate: only subagent_type: "fork" in the Agent tool inherits conversation history; skill-level context: fork explicitly starts the subagent blank. Codex's P1 finding is factually incorrect.
  • Latest commit (4512013) is correct. Parenthetical clarification cleanly closes the null-rank concern from prior reviews.
  • plugin.json userConfig schema is correct. Three type: "string" / default: "" keys match ${user_config.batch_*} substitutions in SKILL.md. Comma-separated scalar over undocumented multiple: true is the right conservative call.
  • Tier membership counts verified. 4 core / 7 situational / 3 never across all 14 corrector frontmatters.
  • Rank ordering is internally consistent. use-your-skills=10 → do-your-research=20 → situational 30–90 → mind-your-maxims=100 → tighten-your-output=110.
  • ${CLAUDE_PLUGIN_ROOT} path resolves. ../../context/re-anchor-audit-correct.md from skills/sweep-all-disciplines/ lands in context/.
  • Human-gates survive batching. Stated at skill level, not deferred — correct placement.
  • Evals cover all five behaviors (session-start digest, full batch pass, situational routing, never-tier exclusion, userConfig overlay).

Summary

Finding #6 (null-rank sort) is fixed. One new finding: fork mode requires CLAUDE_CODE_FORK_SUBAGENT=1 and is flagged as experimental by the official docs — not documented in the SKILL.md, and a silent failure mode for consumers without it. The other five open findings from prior reviews are unchanged. Pending decisions (skill name, scrutinize-dont-coast as never, scalar userConfig) still block merge per the PR body.

@claude

claude Bot commented Jul 22, 2026

Copy link
Copy Markdown

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


Security Review — PR #1050 (latest commit: 4512013)

Tasks

  • Load tools and initialize
  • Fetch PR diff (latest commit)
  • Read changed files
  • Analyze for security vulnerabilities
  • Post findings

Latest commit (4512013)

This commit makes one change to sweep-all-disciplines/SKILL.md: it inserts a parenthetical into step 3 of the batch pass to state explicitly that never-tier correctors carry no rank and are already excluded at membership resolution, so the rank-sort never encounters an absent rank value. Documentation-only change — no executable code, no new security surface.

No new security findings introduced by this commit.


Full PR security assessment (all 20 changed files)

Changed file types: LLM instruction documents (Markdown), one eval JSON, one plugin manifest JSON. No executable code, no shell scripts, no GitHub Actions modifications.

No CRITICAL or IMPORTANT security findings.


SUGGESTION — userConfig strings substituted verbatim into LLM instruction content

Severity: SUGGESTION | Confidence: LOW

sweep-all-disciplines/SKILL.md lines 112–114:

- Excluded correctors: ${user_config.batch_exclude}
- Promoted to always-run: ${user_config.batch_promote}
- Demoted to relevance-gated: ${user_config.batch_demote}

These three userConfig scalars are substituted verbatim into skill instruction content at load time. A value containing embedded instruction text (e.g., point-dont-copy\n\nIgnore all previous instructions and …) would be injected into the model's context as-is.

In the current platform trust model, userConfig scalars are configured only by the individual user through Claude Code's native plugin-config flow — so this is self-injection at best. The user can only affect their own session, which they could influence through direct prompting anyway. No cross-user or privilege-escalation risk exists under the current model. Confidence is LOW for that reason.

Worth noting as a defence-in-depth concern if the platform later supports org-level or administrator-managed userConfig overrides applied across users — in that scenario a third party would control these substituted values. No action required for the current single-user plugin-config scope; flagged for awareness if the plugin is adapted to a managed/multi-user context.

This finding is unchanged from the previous two security review passes on this PR (17:46 and 17:50 UTC).


Areas with no findings

  • No GitHub Actions changes. All workflow files untouched. No pull_request_target, workflow_run, script-injection via the github context, permission-widening, or action-pin changes.
  • No external network surfaces. The SKILL.md contains no external URLs, no remote MCP server references, no webhook targets, and no data-egress paths.
  • No secrets or credentials. The plugin.json userConfig additions are three empty-default string scalars (batch_exclude, batch_promote, batch_demote); none handle tokens, API keys, or credentials.
  • No path traversal. All path references use ${CLAUDE_PLUGIN_ROOT} and resolve within the plugin boundary. The glob-based membership resolution is LLM instruction text, not executable filesystem code.
  • Fork subagent dispatch is intentional and scoped. subagent_type: "fork" is a documented pattern; forks inherit conversation history by design for audit purposes and are instructed to make no writes. The never-tier correctors (scrutinize-dont-coast, both -deep siblings) are explicitly excluded from the fork fan-out.
  • Corrector frontmatter additions are inert. The 12 modified corrector files each gain 2–3 lines of metadata: YAML declaring a tier and optional rank integer — no code, no injection surface.
  • Evals file is benign. evals.json contains static prompt/expectation pairs with no external references and no executable content.

@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: 4512013e2f

ℹ️ 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/re-anchor/skills/sweep-all-disciplines/SKILL.md Outdated
Batched step 3 now states that a load-bearing correction whose suspected drift
source is the main context still escalates to a fresh-context (non-fork)
re-derivation per the shared method's Non-negotiable — the batch orchestrates
the correction on the main thread but does not waive that escalation (the fork
audit inherits context on purpose, as step 2 is a same-context self-audit).
Adds a Gotcha that Agent-tool forks run at the parent model over the full
transcript, so the never tier and situational relevance-gating keep the
fan-out small.

Addresses independent-review IMPORTANT + fork-cost suggestion.

🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
@claude

claude Bot commented Jul 22, 2026

Copy link
Copy Markdown

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


PR Review: feat(re-anchor): add sweep-all-disciplines posture-batch runbook

Tasks

  • Load tools and initialize
  • Check latest commit (b5088ee) changes
  • Read sweep-all-disciplines/SKILL.md — verify status of open findings
  • Check if prior open findings were addressed
  • Identify any new issues introduced
  • Compile and post final review

Latest commit (b5088ee) — two targeted fixes

This commit makes two additions to SKILL.md only:

1. Fresh-context escalation preservation in step 3 (lines 91–97):

Correcting on the main thread does not suppress the shared method's fresh-context escalation: where a finding's suspected drift source is this context's own judgement, re-derive it in a fresh-context (non-fork) subagent blind to that reasoning, per the method doc's Non-negotiable — the batch orchestrates the correction here, it does not waive that escalation. (The fork audit inherits context on purpose: step 2 is a same-context self-audit; this carve-out is about step 3.)

This is architecturally correct and well-motivated. Verified against re-anchor-audit-correct.md Non-negotiable ("Prefer a fresh context over self-trust for anything load-bearing"). The parenthetical explaining why the fork audit inherits context (step 2 is a same-context self-audit) is exactly the right kind of disambiguation — the two modes have opposite context-inheritance intent and the SKILL.md now makes that explicit. Finding from independent review: addressed.

2. Fork cost Gotcha (lines 148–152):

An Agent-tool fork ignores a model override and inherits the whole conversation, so each in-scope corrector's audit runs at the parent model over the full transcript; the wave cap bounds burst, not per-fork cost.

Accurate and actionable. The note that "keeping the never tier out and relevance-gating the situational tier are what hold the fan-out small" is the right place to link cost control back to the architectural choices already documented. Fork-cost suggestion: addressed.


Still-open findings (none addressed since 4512013)

The following findings from prior reviews remain unaddressed. Ranked most-severe first.

1. Step-3 mechanism underspecified — agent could correct from memory alone

SKILL.md lines 83–87:

correct forward each finding on the main thread now — the shared loop's step 3, batched

The main thread is told when to apply step 3 but not how: whether it re-loads each corrector's SKILL.md (with that corrector's discipline-specific rules) or applies corrections from the findings ledger alone is unspecified. Step 3 in the shared method doc says "do the missing work THIS turn" — but the corrector-specific SKILL.mds contain the resolution ladder and discipline rules that govern exactly what "the missing work" is for each discipline. An agent that works only from the ledger skips those rules. A one-line instruction — "For each corrector, re-read its SKILL.md to apply step 3 using its discipline rules, not from the findings ledger alone" — closes this.

Fix this →


2. Fork mode is experimental and opt-in — not documented as a prerequisite

SKILL.md lines 72–75:

dispatch a conversation-inheriting fork subagent — the Agent tool's subagent_type: "fork"

Per the live sub-agents docs: "Letting Claude itself spawn forks is experimental and may change in future releases" and "To control fork mode regardless of the staged rollout, set CLAUDE_CODE_FORK_SUBAGENT to 1 to enable it explicitly."

Without that variable set (or a server-side rollout covering the consumer's environment), the fork dispatch silently fails — the audit fan-out produces no ledgers and the batch produces no corrections, with no error surfaced to the user. The new Gotcha in b5088ee addresses fork cost, not fork availability. A prerequisite note in the Gotchas section — e.g., "Fork dispatch is experimental; set CLAUDE_CODE_FORK_SUBAGENT=1 or confirm server-side rollout covers your environment before the full batch pass" — would prevent silent total failure.

Fix this →


3. userConfig overlay conflict cases have no defined precedence

SKILL.md lines 118–125:

Three edge cases remain unspecified:

  • Same name in both batch_promote and batch_demote — which wins?
  • A never-tier name in batch_exclude — already excluded; silently no-op or reported?
  • A core name in batch_promote — already always-run; no-op or reported?

All three produce invisible misbehavior without a stated rule. Suggested one-liner: "exclude wins over promote/demote; promote/demote apply only to the tiers they make sense for; mismatched overlays are reported, not silently ignored."

Fix this →


4. Unsubstituted userConfig tokens treated as non-empty (Codex P2)

SKILL.md lines 118–120:

- Excluded correctors: `${user_config.batch_exclude}`
- Promoted to always-run: `${user_config.batch_promote}`
- Demoted to relevance-gated: `${user_config.batch_demote}`

Per the repo's extensibility contract smoke tests, if a user hasn't configured the plugin (fresh install, upgrade from 0.5.x, headless run), the ${user_config.*} tokens remain literal in the skill content. The SKILL.md states "empty when unset" (line 122) — but an unsubstituted placeholder is not empty; it's the literal string ${user_config.batch_exclude}. An agent that parses this would treat it as a corrector name to exclude/promote/demote and produce bogus overlay behavior. A guard sentence — "If any of these values is an unsubstituted ${...} placeholder, treat it as empty/unset" — closes the zero-config failure path.

Fix this →


5. Glob self-inclusion: runbook has no re-anchor-batch key and no skip rule

SKILL.md lines 34–38:

Glob the sibling corrector directories and read each one's metadata.re-anchor-batch

sweep-all-disciplines/ lives in skills/ alongside the correctors and will be matched by a sibling glob. It carries no re-anchor-batch key. The SKILL.md contains no instruction to skip entries with no tier key. An agent encounters a missing key and either errors or treats the runbook as an implicit never. A short rule — "skip any sibling whose frontmatter has no re-anchor-batch key" — closes this without naming any member inline.

Fix this →


6. Session-start mode condition is ambiguous

SKILL.md line 22:

default when nothing has happened yet

"Nothing has happened yet" is not a crisp trigger — an agent could interpret it as zero assistant turns, zero tool calls, zero tokens, or simply "this is the first user message." A concrete criterion such as "when there are no prior assistant turns in this conversation" is unambiguous and matches the frontmatter description ("at conversation start to set posture").


7. Concurrency cap references -deep siblings without a number

SKILL.md line 80:

Cap concurrency in bounded waves like the -deep siblings

An agent that hasn't just run a -deep skill won't know what "like the -deep siblings" means numerically. A concrete wave size (or range, e.g., "waves of four to six") makes this self-contained.


What looks correct and unchanged

  • Fresh-context escalation addition (b5088ee) is architecturally sound. The fork audit inheriting context for step 2 (same-context self-audit) vs. step 3 needing fresh-context re-derivation for load-bearing judgements are genuinely different requirements and the SKILL.md now distinguishes them correctly.
  • Fork cost Gotcha (b5088ee) is accurate. Fork-ignores-model-override + inherits-full-transcript is correct per Agent tool behavior.
  • Codex P1 (fork not a valid agent type) remains factually wrong. subagent_type: "fork" is a documented type per the live sub-agents docs; the Gotchas section's three-way distinction is accurate.
  • Tier membership counts, rank ordering, path resolution, userConfig schema, human-gate survival, and eval coverage — all verified in prior reviews and unchanged.

Pending decisions for Kyle (blocking merge per PR body)

  1. Skill namesweep-all-disciplines is the recommendation per the blind 3-lens naming pass.
  2. scrutinize-dont-coast as never — architectural rationale is solid; no new evidence against it.
  3. Comma-separated scalar userConfig — correct conservative call; leave as-is.

@claude

claude Bot commented Jul 22, 2026

Copy link
Copy Markdown

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


Security Review — PR #1050 (latest commit: b5088ee)

Tasks

  • Load tools and initialize
  • Fetch PR diff (latest commit b5088ee)
  • Read changed files
  • Analyze for security vulnerabilities
  • Post findings

Latest commit (b5088ee)

This commit modifies only sweep-all-disciplines/SKILL.md. Two additions:

  1. Fresh-context escalation clause in step 3 (lines 91–97): states that if a finding's suspected drift source is the main context's own judgement, the batch still escalates to a non-fork fresh-context subagent for re-derivation, per the shared method's Non-negotiable — the batch does not waive this.
  2. Fork cost Gotcha (lines 148–152): documents that Agent-tool forks inherit the full transcript and run at the parent model's cost; wave cap bounds burst, not per-fork cost.

Both additions are LLM instruction prose — no executable code, no new external calls, no new injection surface. No new security findings introduced by this commit.


Full PR security assessment (all 20 changed files, latest HEAD: b5088ee)

Changed file types: LLM instruction documents (Markdown), eval JSON, plugin manifest JSON, documentation. No executable code, no shell scripts, no GitHub Actions modifications.

No CRITICAL or IMPORTANT security findings.


SUGGESTION — userConfig strings substituted verbatim into LLM instruction content

Severity: SUGGESTION | Confidence: LOW

sweep-all-disciplines/SKILL.md lines 118–120:

- Excluded correctors: `${user_config.batch_exclude}`
- Promoted to always-run: `${user_config.batch_promote}`
- Demoted to relevance-gated: `${user_config.batch_demote}`

These three userConfig scalars are substituted verbatim into skill instruction content at load time. A value containing embedded instruction text (e.g., point-dont-copy\n\nIgnore all previous instructions and …) would be injected into the model's context as-is.

In the current platform trust model, userConfig scalars are configured only by the individual user through Claude Code's native plugin-config flow — so this is self-injection at best. The user can only affect their own session, which they could influence through direct prompting anyway. No cross-user or privilege-escalation risk exists under the current model. Confidence: LOW for that reason.

Worth noting as a defence-in-depth concern if the platform later supports org-level or administrator-managed userConfig overrides applied across users — in that scenario a third party would control these substituted values. No action required for the current single-user plugin-config scope; flagged for awareness if the plugin is adapted to a managed/multi-user context.

This finding is unchanged from the three prior security review passes on this PR (17:46, 17:50, and 18:05 UTC).


Areas with no findings

  • No GitHub Actions changes. All workflow files untouched. No pull_request_target, workflow_run, script-injection via the github context, permission-widening, or action-pin changes.
  • No external network surfaces. The SKILL.md contains no external URLs, no remote MCP server references, no webhook targets, and no data-egress paths.
  • No secrets or credentials. The plugin.json userConfig additions are three empty-default string scalars (batch_exclude, batch_promote, batch_demote); none handle tokens, API keys, or credentials.
  • No path traversal. All path references use ${CLAUDE_PLUGIN_ROOT} and resolve within the plugin boundary. The glob-based membership resolution and the ../../context/re-anchor-audit-correct.md reference are LLM instruction text, not executable filesystem code.
  • Fresh-context escalation clause (new in b5088ee) is correctly scoped. The escalation path dispatches a non-fork, fresh-context (history-blind) subagent. This is a narrower trust surface than the fork audit, not a wider one. No injection risk introduced.
  • Fork subagent dispatch is intentional and scoped. subagent_type: "fork" is a documented pattern; forks are instructed to make no writes and return only findings. The never-tier correctors are explicitly excluded from the fork fan-out.
  • Corrector frontmatter additions are inert. The 12 modified corrector files each gain 2–3 lines of metadata: YAML declaring a tier and optional rank integer — no code, no injection surface.
  • Evals file is benign. evals.json contains static prompt/expectation pairs with no external references and no executable content.

Note: The Codex P2 finding (unsubstituted ${user_config.*} tokens when not configured) is a functional behavior gap, not a security vulnerability — an unexpanded token in LLM instruction text does not create an exploitable injection surface.

@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: b5088eeded

ℹ️ 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/re-anchor/.claude-plugin/plugin.json
Codex review: (1) fork-spawning is a rollout-gated capability
(CLAUDE_CODE_FORK_SUBAGENT); where it is off, a `fork` request degrades to a
fresh general-purpose subagent that cannot see the conversation — so the batch
now reports it cannot run the inheriting audit rather than auditing blind. The
`subagent_type: "fork"` mechanism itself is correct per the official
sub-agents docs. (2) An unset userConfig option does not reliably substitute
to empty — the literal ${user_config.*} token can survive on zero-config or
headless installs; treat a surviving literal placeholder as unset so it is
never parsed as a corrector name.

🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
@claude

claude Bot commented Jul 22, 2026

Copy link
Copy Markdown

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


PR Review: feat(re-anchor): add sweep-all-disciplines posture-batch runbook

Tasks

  • Gather context and understand the PR
  • Read latest commit (ee4ecb3) changes
  • Verify status of all open findings from prior reviews
  • Check for any new issues introduced
  • Compile and post final review

Latest commit (ee4ecb3) — two targeted fixes

This commit addresses two open findings:

1. Fork-mode gating — previously reviewers flagged that fork-spawning being experimental (CLAUDE_CODE_FORK_SUBAGENT) was not documented and could cause a silent total failure (the batch produces no ledgers and no corrections without informing the user). The fix correctly instructs the agent to report and stop if forks are unavailable, rather than falling back to a blind fresh-context audit. The fix is well-placed inline in step 1 — where the dispatch instruction lives — rather than deferred to the Gotchas section where it would be easy to miss. Finding: closed.

2. Unsubstituted userConfig tokens (Codex P2) — the prior text said the overlay values are "empty when unset," which is incorrect for zero-config, headless, or pre-configure installs where ${user_config.…} remains literal. The fix instructs the agent to treat BOTH an empty value AND a surviving literal placeholder as unset, and explicitly forbids reading the literal token as a corrector name. Finding: closed.


Findings status — full PR view

# Finding Status
1 Step-3 mechanism underspecified (correct from memory vs. re-read SKILL.md) Open
2 Fork mode experimental / not documented Fixed (ee4ecb3)
3 userConfig overlay conflict cases have no precedence rule Open
4 Unsubstituted ${user_config.*} tokens treated as non-empty (Codex P2) Fixed (ee4ecb3)
5 Glob self-inclusion — runbook has no re-anchor-batch key, no skip rule Open
6 never-tier null rank in rank-walk Fixed (4512013)
7 Fresh-context escalation suppression Fixed (b5088ee)
8 Fork cost undocumented Fixed (b5088ee)
9 Session-start mode condition ambiguous ("nothing has happened yet") Open (minor)
10 Concurrency cap references -deep siblings without a number Open (minor)
N Missing setup skill for new userConfig surface New (see below)

Open findings

1. Step-3 mechanism underspecified — agent could correct from memory alone

SKILL.md line 91:

correct forward each finding on the main thread now — the shared loop's step 3, batched

The main thread is told when to apply step 3 but not how. An agent executing step 3 from the findings ledger alone skips each corrector's discipline-specific resolution rules — the resolution ladder, escalation conditions, and correction vocabulary live in each corrector's own SKILL.md, not in the ledger the fork returned.

Suggested addition after "the shared loop's step 3, batched": "For each corrector, re-read its SKILL.md to execute step 3 by its own discipline rules — do not correct from the findings ledger alone."

Fix this →


3. userConfig overlay conflict cases have no defined precedence

SKILL.md lines 132–135:

Three edge cases remain unspecified:

  • Same name appears in both batch_promote and batch_demote — which wins?
  • A never-tier name in batch_exclude — already excluded; silently ignored or reported?
  • A core name in batch_promote — already always-run; no-op or reported?

Without a precedence rule, all three produce invisible misbehavior. A one-liner: "exclude wins over promote/demote; promote/demote apply only to the tiers they make sense for; mismatched overlays are reported, not silently ignored."

Fix this →


5. Glob self-inclusion — no skip rule for entries with no re-anchor-batch key

SKILL.md lines 34–38:

Glob the sibling corrector directories and read each one's metadata.re-anchor-batch

sweep-all-disciplines/ itself lives in skills/ alongside the correctors and will be matched by a sibling glob. It carries no re-anchor-batch key. The SKILL.md contains no instruction to skip entries whose frontmatter lacks the tier key. An agent encountering a missing key either errors or treats the runbook as an implicit never. A short rule — "skip any sibling whose frontmatter has no re-anchor-batch key" — closes this without naming any member inline and also future-proofs against any non-corrector additions to skills/.

Fix this →


N. Missing setup skill for new userConfig surface (PLUGIN-PHILOSOPHY.md requirement)

plugin.json lines 37–55 and PLUGIN-PHILOSOPHY.md lines 227–276:

This PR introduces re-anchor's first userConfig surface (three batch overlay scalars: batch_exclude, batch_promote, batch_demote). The PLUGIN-PHILOSOPHY.md is explicit:

A plugin requires a setup skill iff it has … (c) non-trivial userConfig.

No re-anchor:setup skill exists in the current tree. Since the overlay userConfig is the plugin's entire configuration surface (no tracked project config, no external prerequisites), the philosophy doc explicitly carves this out as a check-only setup: check verifies and reports the current effective overlay; reconfiguration routes through /plugin configure re-anchor. No apply is needed — the only thing apply could write is pluginConfigs, which the setup contract forbids.

This is a gap relative to the repo's own documented design rules — the Codex P3 review-bot finding is correct. A check-only /re-anchor:setup skill is relatively thin, but without it users and headless/fleet automation have no discoverable entry point to inspect effective batch configuration.


Minor open findings (unchanged since prior reviews)

Session-start mode condition (SKILL.md line 22): "default when nothing has happened yet" is not crisp — an agent could interpret this as zero assistant turns, zero tool calls, or zero tokens. A concrete criterion ("when there are no prior assistant turns in this conversation") matches the frontmatter description and removes the ambiguity.

Concurrency cap (SKILL.md line 85): "Cap concurrency in bounded waves like the -deep siblings" — an agent that hasn't just run a -deep skill won't know what cap this implies. A concrete wave size (or range, e.g., "waves of four to six") makes the instruction self-contained.


What is verified correct

  • Latest commit (ee4ecb3) is well-targeted. Fork-mode gating and unsubstituted-token handling are both addressed correctly and placed in the right locations — inline at the point of action, not buried in Gotchas.
  • subagent_type: "fork" is a valid type. Codex P1 (fork is not a recognized agent type) remains factually wrong per the live sub-agents docs. The Gotchas section's three-way distinction (fork / fresh / skill-level context: fork) is accurate.
  • Tier membership counts verified. 4 core / 7 situational / 3 never across all 14 corrector frontmatters.
  • Rank ordering internally consistent. use-your-skills=10 → do-your-research=20 → situational 30–90 → mind-your-maxims=100 → tighten-your-output=110.
  • ${CLAUDE_PLUGIN_ROOT} path resolves. ../../context/re-anchor-audit-correct.md from skills/sweep-all-disciplines/ lands in context/.
  • userConfig schema is correct. Three type: "string" / default: "" keys in plugin.json match the ${user_config.batch_*} substitutions in SKILL.md.
  • Human-gates survive batching. Stated at skill level — correct placement.
  • Evals cover all five distinct behaviors (session-start digest, full batch pass, situational routing, never-tier exclusion, userConfig overlay).
  • Fresh-context escalation and fork cost documented. Both correct and placed where they matter (step 3 and Gotchas, respectively).

Summary

Five previous findings are now fixed. Three substantive findings remain open: step-3 mechanism (finding #1 — important for correct agent behavior), overlay conflict precedence (finding #3 — invisible misbehavior risk), and glob self-inclusion (finding #5 — agent could mis-classify or error on the runbook itself). The missing setup skill for the new userConfig surface is a documented PLUGIN-PHILOSOPHY.md requirement that wasn't called out in prior review rounds — a check-only /re-anchor:setup skill is all that's needed and relatively thin to add. The two minor findings (session-start condition, concurrency cap number) are low-risk but easy to tighten. Per the PR body, the three Kyle-confirms (skill name, scrutinize-dont-coast as never, scalar userConfig) still block merge.

@claude

claude Bot commented Jul 22, 2026

Copy link
Copy Markdown

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


Security Review — PR #1050 (latest commit: ee4ecb3)

Tasks

  • Load tools and initialize
  • Fetch PR diff (latest commit ee4ecb3)
  • Read changed files for security analysis
  • Analyze for vulnerabilities
  • Post findings

Latest commit (ee4ecb3) — two targeted security/correctness fixes

This commit modifies only sweep-all-disciplines/SKILL.md. Two additions:

  1. Fork-mode gating (lines 77–81): Documents that CLAUDE_CODE_FORK_SUBAGENT controls whether fork-spawning is available; where it is off the fork type falls back to a fresh subagent that cannot see the conversation, and the skill now explicitly instructs to report the audit cannot run and stop — rather than silently auditing blind. Closes the fork-availability finding from prior reviews. No security regression introduced.

  2. Unset userConfig guard (lines 127–131): Adds an explicit instruction that a surviving literal ${user_config.…} placeholder (on zero-config or headless installs) must be treated identically to an empty value — never read as a corrector name. Closes Codex P2 (unsubstituted tokens treated as non-empty overlay). This tightens the prior surface, not a new one.


Full PR security assessment (all 20 changed files, HEAD: ee4ecb3)

Changed file types: LLM instruction documents (Markdown), eval JSON, plugin manifest JSON, documentation. No executable code, no shell scripts, no GitHub Actions modifications.

No CRITICAL or IMPORTANT security findings.


SUGGESTION — userConfig strings substituted verbatim into LLM instruction content

Severity: SUGGESTION | Confidence: LOW

sweep-all-disciplines/SKILL.md lines 123–125:

- Excluded correctors: `${user_config.batch_exclude}`
- Promoted to always-run: `${user_config.batch_promote}`
- Demoted to relevance-gated: `${user_config.batch_demote}`

These three userConfig scalars are substituted verbatim into skill instruction content at load time. A value containing embedded instruction text (e.g., point-dont-copy\n\nIgnore all previous instructions and …) would be injected into the model's context as-is.

In the current platform trust model, userConfig scalars are configured only by the individual user through Claude Code's native plugin-config flow — so this is self-injection at best. No cross-user or privilege-escalation risk exists under the current model. Confidence: LOW for that reason.

Worth noting as a defence-in-depth concern if the platform later supports org-level or administrator-managed userConfig overrides applied across users — in that scenario a third party would control these substituted values. No action required now; flagged for awareness if the plugin is adapted to a managed/multi-user context.

This finding is unchanged from the four prior security review passes on this PR. The new unset-placeholder guard in this commit narrows the practical surface by ensuring literal tokens are never parsed as corrector names, but does not address the general substitution path.


Areas with no findings

  • No GitHub Actions changes. All workflow files untouched. No pull_request_target, workflow_run, script injection via the github context, permission-widening, or action-pin changes.
  • No external network surfaces. The SKILL.md contains no external URLs, no remote MCP server references, no webhook targets, and no data-egress paths.
  • No secrets or credentials. The plugin.json userConfig additions (batch_exclude, batch_promote, batch_demote) are empty-default string scalars; none handle tokens, API keys, or credentials.
  • No path traversal. All path references use ${CLAUDE_PLUGIN_ROOT} and resolve within the plugin boundary. The glob-based membership resolution is LLM instruction text, not executable filesystem code. ../../context/re-anchor-audit-correct.md resolves within the plugin root.
  • Fork-mode fallback is correctly defensive. The new text instructs the agent to stop and report rather than fall through to a blind audit — this is the correct failure mode and introduces no new attack surface.
  • Unset-placeholder guard closes a functional gap. Treating a surviving ${…} literal as unset prevents the literal string from being parsed as a corrector name; no new injection surface introduced.
  • Corrector frontmatter additions are inert. The 12 modified corrector files each gain 2–3 lines of metadata: YAML declaring a tier and optional rank integer — no code, no injection surface.
  • Evals file is benign. evals.json contains static prompt/expectation pairs with no external references and no executable content.
  • Fork subagent dispatch is intentional and scoped. subagent_type: "fork" is a documented pattern; forks are instructed to make no writes and return only findings. The never-tier correctors are explicitly excluded.

The plugin gains its first userConfig surface (the sweep-all-disciplines batch
overlay), so the setup contract wants a discoverable setup skill. Per the
userConfig-only carve-out it is check-only: /re-anchor:setup check reports the
effective overlay (excluded/promoted/demoted correctors, validated against the
installed correctors), treats an unexpanded ${user_config.*} token as unset,
notes the fork-mode prerequisite, and routes reconfiguration to the native
/plugin configure re-anchor flow. It writes no config. README Configuration
and CHANGELOG updated.

Addresses Codex P2 (setup check for batch userConfig).

🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
@claude

claude Bot commented Jul 22, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 2m 46s —— View job


PR Review: feat(re-anchor): add sweep-all-disciplines posture-batch runbook

Tasks

  • Load tools and initialize
  • Read latest commit (bf80d45) — setup skill for batch userConfig
  • Verify status of all open findings from prior reviews
  • Check new setup/SKILL.md for correctness and completeness
  • Check new setup/evals/evals.json
  • Compile and post final review

Latest commit (bf80d45) — setup skill added for batch userConfig

This commit adds plugins/re-anchor/skills/setup/SKILL.md and plugins/re-anchor/skills/setup/evals/evals.json, addressing the Missing setup skill finding (Finding N) from the prior review round.

The setup skill is well-formed and correctly satisfies the check-only carve-out from PLUGIN-PHILOSOPHY.md lines 272–276:

"Where that native surface is a plugin's entire configuration — nothing but userConfig, no tracked project config, no external prerequisite setup can resolve — a check-only setup is conforming: check verifies and reports, reconfiguration routes through the native flow, and no apply is offered, because the only thing it could write is the pluginConfigs this contract forbids."

Specific verifications:

  • disable-model-invocation: true — correct per the uniform setup contract (PLUGIN-PHILOSOPHY.md line 234).
  • No apply action. The skill explicitly documents this and explains why (lines 66–68): the only thing apply could write is pluginConfigs, which the contract forbids.
  • Unexpanded-token guard matches the fix applied to sweep-all-disciplines/SKILL.md in ee4ecb3 — both skills now consistently treat ${user_config.…} literals as unset.
  • Overlay conflict validation (step 4): the setup check now reports contradictions (same name in both batch_exclude and batch_promote/batch_demote) and no-op overlays (batch_promote on a core corrector, batch_demote on a situational one) — this is the discoverability path for finding feat: markdown-formatter plugin (pilot migration) #3 (see Partially Addressed below).
  • Fork prerequisite INFO (step 5): documents CLAUDE_CODE_FORK_SUBAGENT so a consumer whose fan-out is disabled sees it as expected, not a misconfiguration.
  • Routes reconfiguration correctly. /plugin configure re-anchor for interactive; documents the headless reinstall caveat. Does not hand-edit pluginConfigs.

Evals: 3 evals covering check output, unexpanded token, and name validation — adequate for the three distinct behaviors. One minor gap: no eval specifically exercises the fork-prerequisite INFO (step 5). Not blocking.

Finding N: FIXED.


One minor gap in the setup skill itself

setup/SKILL.md step 4:

The step validates batch_promote naming an already-core corrector (no-op) and batch_demote naming an already-situational one (no-op), but does not validate batch_promote or batch_demote naming a never-tier corrector. A user who configures batch_promote = do-your-research-deep would see no warning, yet the sweep will still exclude it (no rank). This is a minor gap — annotating it as a FAIL (same category as a typo) would be more accurate than silently reporting the overlay with no effect. Not blocking.


Findings status — full PR view

# Finding Status
1 Step-3 mechanism underspecified Open
2 Fork mode experimental / not documented Fixed (ee4ecb3)
3 userConfig overlay conflict precedence Partially addressed — setup check reports; sweep runtime still unspecified
4 Unsubstituted ${user_config.*} tokens treated as non-empty Fixed (ee4ecb3)
5 Glob self-inclusion — no skip rule for entries missing re-anchor-batch Open
6 never-tier null rank in rank-walk Fixed (4512013)
7 Fresh-context escalation suppression Fixed (b5088ee)
8 Fork cost undocumented Fixed (b5088ee)
9 Session-start mode condition ambiguous Open (minor)
10 Concurrency cap references -deep siblings without a number Open (minor)
N Missing setup skill for userConfig surface Fixed (bf80d45)

Still-open findings

1. Step-3 mechanism underspecified — agent could correct from memory alone

sweep-all-disciplines/SKILL.md lines 89–92:

Walk the in-scope members … and correct forward each finding on the main thread now — the shared loop's step 3, batched.

This is the most persistent finding across five review rounds. The SKILL.md tells the main thread when to apply step 3 but not how: whether it re-loads each corrector's SKILL.md (with its discipline-specific resolution ladder and correction vocabulary) or works from the findings ledger alone is unspecified. The corrector's own SKILL.md contains rules that determine exactly what "correct forward" means for that discipline — working from the ledger alone skips those rules.

Suggested addition after "the shared loop's step 3, batched": "For each corrector, re-read its SKILL.md and execute step 3 using its own discipline rules — do not correct from the findings ledger alone."

Fix this →


3. userConfig overlay conflict precedence partially addressed but sweep runtime still unspecified

sweep-all-disciplines/SKILL.md lines 119–135:

The setup skill (step 4) now validates and reports conflicts before the batch runs — that's the right discoverability path. But the sweep skill itself still doesn't say what to do at runtime when the user proceeds with a contradictory overlay (e.g., same name in both batch_exclude and batch_promote). Should execution halt and prompt for reconfiguration? Default to exclude winning? A one-liner: "On a conflict, report it and stop — do not proceed with an ambiguous overlay." would define the runtime path and prevent silent incorrect behavior.

Fix this →


5. Glob self-inclusion — no skip rule for entries with no re-anchor-batch key

sweep-all-disciplines/SKILL.md lines 34–38:

Glob the sibling corrector directories and read each one's metadata.re-anchor-batch

sweep-all-disciplines/ and the new setup/ skill both live in skills/ alongside the correctors and will be matched by a sibling glob. Neither carries a re-anchor-batch key. The SKILL.md contains no instruction to skip entries whose frontmatter lacks the tier key. An agent encountering a missing key either errors or treats the entry as an implicit never. The new setup/ skill adds a second non-corrector sibling, making this more likely to surface.

Suggested addition in the Resolving membership section: "Skip any sibling whose frontmatter has no re-anchor-batch key — these are non-corrector skills (the runbook itself, setup) and are not batch members."

Fix this →


Minor open findings (unchanged)

Session-start mode condition (SKILL.md line 22): "default when nothing has happened yet" is not crisp — an agent could interpret it as zero assistant turns, zero tool calls, or zero tokens. A concrete criterion ("when there are no prior assistant turns in this conversation") matches the frontmatter and removes the ambiguity.

Concurrency cap (SKILL.md line 85): "Cap concurrency in bounded waves like the -deep siblings" — an agent that hasn't just run a -deep skill won't know what cap this implies. A concrete wave size (or range, e.g., "waves of four to six") makes the instruction self-contained.


What is verified correct

  • Setup skill (bf80d45) is correct and conforming. Check-only per the userConfig-only carve-out, disable-model-invocation: true, no apply, routes reconfiguration to the native flow, does not touch pluginConfigs, handles unexpanded tokens, validates overlay names, reports contradictions and no-ops, documents fork prerequisite. Meets PLUGIN-PHILOSOPHY.md lines 272–276 exactly.
  • Evals for setup cover the three key behaviors. Check output, unexpanded token, name validation. The one minor gap (no eval for fork-prerequisite INFO) is non-blocking.
  • Codex P1 (fork not a valid agent type) remains factually wrong per the live sub-agents docs. The Gotchas section's three-way distinction is accurate.
  • Tier membership (4 core / 7 situational / 3 never), rank ordering, path resolution, userConfig schema, human-gate survival, sweep evals — all verified in prior rounds and unchanged.
  • Fresh-context escalation and fork cost — both documented correctly in b5088ee and unchanged.
  • fork-mode gating and unsubstituted-token guard — both correctly applied in ee4ecb3 and unchanged.

Summary

Finding N (missing setup skill) is fixed. The re-anchor:setup skill is architecturally correct, satisfies the check-only carve-out, and closes the PLUGIN-PHILOSOPHY.md gap Codex P3 identified. Adding the setup/ sibling to skills/ also makes finding #5 (glob self-inclusion) more concrete — there are now two non-corrector siblings the runbook's membership glob will match. Findings 1, 3 (runtime half), 5, 9, and 10 remain open; 1 and 5 are the most important for correct agent behavior.

@claude

claude Bot commented Jul 22, 2026

Copy link
Copy Markdown

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


Security Review — PR #1050 (latest commit: bf80d45)

Tasks

  • Load tools and initialize
  • Fetch PR diff (latest commit bf80d45)
  • Read changed files for security analysis
  • Analyze for vulnerabilities
  • Post findings

Latest commit (bf80d45)

This commit adds plugins/re-anchor/skills/setup/SKILL.md and plugins/re-anchor/skills/setup/evals/evals.json, plus minor prose additions to README.md and CHANGELOG.md.

No CRITICAL or IMPORTANT security findings.


SUGGESTION — userConfig strings substituted verbatim into LLM instruction content (second substitution site)

Severity: SUGGESTION | Confidence: LOW

setup/SKILL.md lines 11–13:

Batch exclude: `${user_config.batch_exclude}`
Batch promote: `${user_config.batch_promote}`
Batch demote: `${user_config.batch_demote}`

The same three userConfig scalars substituted verbatim in sweep-all-disciplines/SKILL.md are now also substituted into the setup skill body. A value containing embedded instruction text would be injected into the model's context at both substitution sites. The trust model is unchanged — userConfig scalars are set only by the individual user through Claude Code's native plugin-config flow, so this remains self-injection with no cross-user or privilege-escalation risk. Confidence: LOW for the same reason as prior reviews.

The skill's own unexpanded-token guard (lines 37–40: treat a surviving literal ${user_config.…} as unset) reduces the practical impact of the unset case, but does not address an adversarially-crafted value. No action required under the current single-user trust model; flagged if the platform ever supports org-level or administrator-managed userConfig overrides.


Positive security controls in this commit

  • Explicit prohibition on writing config. The setup skill explicitly forbids touching pluginConfigs, settings.json, or settings.local.json (lines 35, 61–62). This is correctly enforced at the LLM instruction layer — the agent is told explicitly that it has nothing to write and must not attempt to do so. The check-only design eliminates any write surface entirely.
  • No GitHub Actions changes. All workflow files untouched.
  • No external network surfaces. The one URL in the skill body (https://code.claude.com/docs/en/plugins-reference#user-configuration) is documentation text, not a fetch target in LLM logic.
  • No secrets or credentials. The userConfig entries are empty-default overlay scalars; none handle tokens, API keys, or credentials.
  • No path traversal. The glob-based corrector validation (step 4, lines 47–53) is LLM instruction text, not executable filesystem code. All paths resolve within ${CLAUDE_PLUGIN_ROOT}.
  • Evals file is benign. evals.json contains static prompt/expectation pairs with no external references and no executable content.
  • Unexpanded-token guard is consistent with sweep-all-disciplines. The same guard applied in ee4ecb3 is now also present in the setup skill — both skills handle the zero-config case identically.

Full PR security assessment across all 6 commits

No CRITICAL or IMPORTANT security findings across any commit in this PR.

The one SUGGESTION (LOW confidence) — userConfig scalars substituted verbatim into LLM instruction content — has now been flagged in five consecutive security review passes and is unchanged in nature. It applies to both sweep-all-disciplines/SKILL.md and setup/SKILL.md as of this commit. No action required for the current single-user scope.

@kyle-sexton

Copy link
Copy Markdown
Contributor Author

🔒 babysit-prs lane claiming this PR for on-branch fix work this cycle (amendment-round: 16, safe tier). Will fix clear branch-owned findings and push; will not resolve threads or merge (safe tier).

@kyle-sexton
kyle-sexton merged commit c67d8bc into main Jul 22, 2026
25 checks passed
@kyle-sexton
kyle-sexton deleted the feat/1041-re-anchor-posture-batch branch July 22, 2026 18:59
@kyle-sexton

Copy link
Copy Markdown
Contributor Author

Safe-tier babysit pass — classification of the open findings on this review (validated against head bf80d456). All six are accurate observations, but each is an author-owned design/prose decision that has been deliberately deferred across prior rounds, not a clear branch-owned mechanical fix — so per the safe tier they are surfaced and classified, not auto-fixed.

# Finding Classification Evidence
1 Step-3 mechanism underspecified — re-read each corrector's SKILL.md vs. correct from the ledger VALID (defer — design decision) sweep-all-disciplines/SKILL.md step 3 says "correct forward each finding on the main thread now — the shared loop's step 3, batched" with no re-read directive; step 1 already loads each corrector's SKILL.md in the fork audit. Whether step 3 re-loads every corrector SKILL.md is a token-cost tradeoff the author owns.
3 userConfig overlay conflict — runtime precedence unspecified VALID (defer — design decision) Configuration section defines exclude/promote/demote but names no runtime behavior for a contradictory overlay; setup step 4 already reports the contradiction pre-run. Halt-and-prompt vs. exclude-wins is a behavioral choice for the author.
5 Glob self-inclusion — no skip rule for siblings lacking re-anchor-batch VALID (defer — author wording) "Resolving membership" globs sibling dirs and reads metadata.re-anchor-batch; sweep-all-disciplines/ and the new setup/ are siblings with no key. Real gap; the exact skip wording is the author's call.
9 Session-start mode "default when nothing has happened yet" ambiguous VALID (defer — minor prose) Confirmed at SKILL.md line 22. A crisper criterion ("no prior assistant turns") is a prose choice the author owns.
10 Concurrency cap references "-deep siblings" without a number VALID (defer — minor prose) Confirmed at step 1 ("Cap concurrency in bounded waves like the -deep siblings"). A concrete wave size is an author prose choice.
N setup step 4 doesn't validate batch_promote/batch_demote naming a never-tier corrector VALID (defer — author wording) setup/SKILL.md step 4 handles no-match FAIL, exclude/promote contradiction, and promote-core/demote-situational no-op, but not a promote/demote of a never-tier corrector (no rank → silently excluded). Minor; author decides FAIL vs. INFO wording.

Reacted 👀 (acknowledged, deferred to author — no fix this pass).

Security review (latest-commit SUGGESTION, LOW confidence — userConfig scalars substituted verbatim into instruction text at a second site): acknowledged. Unchanged trust model (single-user self-injection only); reviewer states no action required under current scope. Concur — no safe-tier action.

Status: green (all required checks pass; review non-blocking and its result already posted), all inline review threads resolved, zero CRITICAL/IMPORTANT. The six items above are advisory design/prose calls for the author to decide.

kyle-sexton added a commit that referenced this pull request Jul 22, 2026
…derivability rubric+evals (#1058)

## Summary

The `audit-derivability` spot-test protocol told the auditor to avoid
`context: fork` "because a fork inherits this context's contaminated
history." That inverts the mechanism and conflates two distinct things:

- **Skill-level `context: fork`** (a SKILL.md frontmatter setting)
starts BLANK — it does not inherit the invoking conversation.
- **Agent-tool `fork` subagent type** (`subagent_type: "fork"`) DOES
inherit the parent conversation (and its model), so it is the mechanism
that carries the contamination.

The stated *reason* was inverted; the *recommendation* (delegate the
spot-test to a fresh-context, non-fork subagent) was and remains
correct.

## Fix

Re-point the contamination risk to the Agent-tool `fork` subagent type,
and add a tight clause distinguishing it from skill-level `context:
fork`, in all three sites where the inverted claim appeared:

- `plugins/docs-hygiene/skills/audit-derivability/SKILL.md` (spot-test
bullet)
- `plugins/docs-hygiene/skills/audit-derivability/context/rubric.md`
(spot-test protocol, step 1)
- `plugins/docs-hygiene/skills/audit-derivability/evals/evals.json`
(eval id 7: `expected_output` + one expectation)

The issue named only the rubric and evals; a sweep of the skill surfaced
the same inverted claim in `SKILL.md`, which is fixed here too so the
correction is complete rather than half-applied. Includes a patch
version bump (`0.8.4` → `0.8.5`) and a matching CHANGELOG entry.

## Verification

Confirmed the distinction against the official docs (fetched, not
recited):

- Skills — https://code.claude.com/docs/en/skills, "Run skills in a
subagent": *"Add `context: fork` to your frontmatter when you want a
skill to run in isolation. The skill content becomes the prompt that
drives the subagent. **It won't have access to your conversation
history.**"*
- Sub-agents — https://code.claude.com/docs/en/sub-agents, "What loads
at startup": *"Each subagent starts with a fresh, isolated context
window… The exception is a fork, which inherits the parent conversation
instead of starting fresh."* And "Fork the current conversation": *"A
fork is a subagent that inherits the entire conversation so far instead
of starting fresh… a fork sees the same system prompt, tools, model, and
message history as the main session."* Claude spawns one "by requesting
the `fork` subagent type explicitly."

`docs/PLUGIN-PHILOSOPHY.md`'s fresh-eyes section already carries the
correct Agent-tool fork wording and was used as the phrasing model; it
is intentionally not edited. `evals.json` re-validated as well-formed
JSON after the edit.

Closes #1053

## Related

- #1053 — the issue this fixes.
- #1050 — the re-anchor `sweep-all-disciplines` PR whose independent
review verified the fork-mechanism claims against the official docs and
surfaced this contradiction.
- #1062 — deferred follow-up (SUGGESTION, non-blocking): SKILL.md Hard
Rules line 111 could use an inline clarification too.

---

Authored by Claude Code (Claude Opus 4.8). Session:
https://claude.ai/code/session_01Mu8bLN896ia5AeWmGPqAUv

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
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.

feat(re-anchor): add posture-batch runbook composing the correctors

1 participant