Skip to content

feat(docs-hygiene): add audit-derivability skill#770

Merged
kyle-sexton merged 2 commits into
mainfrom
feat/docs-hygiene-audit-derivability
Jul 21, 2026
Merged

feat(docs-hygiene): add audit-derivability skill#770
kyle-sexton merged 2 commits into
mainfrom
feat/docs-hygiene-audit-derivability

Conversation

@kyle-sexton

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

Copy link
Copy Markdown
Contributor

Summary

Adds /docs-hygiene:audit-derivability, a sixth read-only skill to the docs-hygiene plugin. It audits an axis the five siblings do not: document-level worth — should a whole documentation file exist at all?

The test is derivability: could a fresh agent reach the document's conclusions by natively exploring the repository (code, config, metadata, structure) without being handed the document? A doc that only restates the code is a derivation cache at best and dead weight at worst; a doc that records why a decision was made, a constraint invisible in any single file, or a fact that lives outside the repo owns something exploration can never recover.

Implements ledger "Skill E" (design + name locked; user-picked audit-derivability).

Design

  • Four-factor rubric, never derivability alone: derivable? × re-derivation cost × drift risk × fact ownership. Verdicts: delete, convert-to-pointer, keep-as-derivation-cache (which demotes when it carries no regeneration path or recheck trigger — point-don't-copy), keep-owns-facts (rationale / decisions / constraints / external facts).
  • Audience-aware: agent-facing surfaces get the full axe (exploration cheap, redundant context is a standing token tax); human-facing docs weigh human derivation cost and clear a higher bar; dual-audience docs classified for each.
  • Establishing derivability: heuristic claim-source classification first pass + an empirical spot-test for load-bearing/contested deletions that delegates to a fresh-context, non-fork subagent blind to the doc — because a context that has read the doc self-grades derivability (fresh-eyes-checkpoint rationale, docs/PLUGIN-PHILOSOPHY.md).
  • Read-only classifier (author owns every deletion — the highest-stakes doc edit); targeted default (uncommitted .md / file / dir) plus a throttled doc-by-doc sweep for corpora; verdict ledger + OFFER tracker routing, never auto-file or auto-edit.
  • No bundled script, no allowed-tools: the only shell is a defensive inline precompute block for target discovery; the judgment is the model's. Repo-agnostic, no ../ reach-outs.

Distinct axis vs the five siblings

Whole-document worth, not within-document trimming: audit-noise = line-level noise; extract-ssot = cross-file duplication; compress = prose flavor; audit-encapsulation = private-surface citations; rename-references = stale refs. Derivability is re-derivation from code/config/structure, distinct from doc-to-doc duplication (which routes to extract-ssot) and from code-mismatch staleness (a doc-drift detector).

Build-time research pass (ledger E deferred item c)

Doc-value criteria researched from primary sources and folded into context/rubric.md: Diátaxis (explanation owns the non-derivable why; reference is the most derivable mode) grounds the fact-ownership factor; docs-as-code drift/staleness and single-source-of-truth thinking grounds the cache drift-control gate; agent context-engineering (finite context budget, just-in-time retrieval) grounds the agent-facing full-axe stance. Sources are cited in the rubric, not copied into it (point-don't-copy).

Files

  • skills/audit-derivability/SKILL.md (148 lines) + context/rubric.md (scoring detail, Diátaxis mapping, worked examples).
  • evals/evals.json — 8 cases (four-factor rubric, cache demotion, fresh-context spot-test, audience split, read-only-under-pressure, distinct-axis routing) + 2 fixtures.
  • Bumped docs-hygiene 0.7.1 → 0.8.0 (minor) with a top-inserted CHANGELOG entry; updated the plugin README skill table; regenerated the root README catalog from the manifests.

Verification

  • check-skill.sh audit-derivabilityPASS, 0 errors, 0 warnings.
  • evals.json validates against the bundled schema (ajv).
  • markdownlint clean on all new/changed markdown.
  • check-skill-portability.sh --paths (no coupling tokens), check-skill-leaf-names.sh --check, check-orphaned-fixtures.sh, check-changelog-parity.sh --check/--check-bump, generate-catalog.mjs --check, and check-changed-skills.sh origin/main all pass.

Security

Read-only; no bundled scripts, no MCP, no egress, no secrets, no ${CLAUDE_PLUGIN_DATA} writes. Only shell is a defensive git branch/git status precompute block (no user-controlled input interpolated). Cache-isolation clean (no ../, no absolute paths).

No linked issue — this implements the locked design-ledger item "Skill E"; it is not tied to a single tracked GitHub issue and closes none.

Related

🤖 Generated with Claude Code

## Summary

Adds `/docs-hygiene:audit-derivability`, a sixth read-only skill to the
docs-hygiene plugin. It audits a NEW axis the five siblings do not:
document-level worth — should a whole documentation file exist at all?

The test is derivability: could a fresh agent reach the document's
conclusions by natively exploring the repository (code, config,
metadata, structure) without being handed the document? A doc that only
restates the code is a derivation cache at best and dead weight at worst;
a doc that records why a decision was made, a constraint invisible in any
single file, or a fact that lives outside the repo owns something
exploration can never recover.

## Design

- Four-factor rubric, never derivability alone: derivable? x
  re-derivation cost x drift risk x fact ownership. Verdicts: `delete`,
  `convert-to-pointer`, `keep-as-derivation-cache` (which demotes when it
  carries no regeneration path or recheck trigger — point-don't-copy),
  `keep-owns-facts` (rationale/decisions/constraints/external facts).
- Audience-aware: agent-facing surfaces get the full axe (exploration
  cheap, redundant context is a token tax); human-facing docs weigh human
  derivation cost and clear a higher bar; dual-audience docs classified
  for each.
- Establishing derivability: heuristic claim-source classification first
  pass + an empirical spot-test for load-bearing/contested deletions that
  delegates to a fresh-context, NON-fork subagent blind to the doc —
  because a context that has read the doc self-grades derivability
  (fresh-eyes-checkpoint rationale, docs/PLUGIN-PHILOSOPHY.md).
- Read-only classifier (author owns every deletion — the highest-stakes
  doc edit); targeted default (uncommitted .md / file / dir) plus a
  throttled doc-by-doc `sweep` for corpora; verdict ledger + OFFER
  tracker routing, never auto-file or auto-edit.
- No bundled script and no allowed-tools: the only shell is a defensive
  inline precompute block for target discovery; the judgment is the
  model's. Repo-agnostic, no ../ reach-outs.

## Files

- `skills/audit-derivability/SKILL.md` (148 lines) + `context/rubric.md`
  (scoring detail, Diataxis fact-ownership mapping, worked examples).
- `evals/evals.json` — 8 cases exercising the four-factor rubric, cache
  demotion, fresh-context spot-test, audience split, read-only-under-
  pressure, and distinct-axis routing; 2 fixtures.
- Bumped docs-hygiene 0.7.1 → 0.8.0 (minor, skill added) with a
  top-inserted CHANGELOG entry; updated the plugin README skill table and
  regenerated the root README catalog from the manifests.

## Verification

- `check-skill.sh audit-derivability` → PASS, 0 errors, 0 warnings.
- evals.json validates against the bundled schema (ajv).
- markdownlint clean on all new/changed markdown.
- `check-skill-portability.sh --paths` (no coupling tokens),
  `check-skill-leaf-names.sh --check`, `check-orphaned-fixtures.sh`,
  `check-changelog-parity.sh --check/--check-bump`, and
  `generate-catalog.mjs --check` all pass.

Co-authored-by: Claude <noreply@anthropic.com>
@claude

claude Bot commented Jul 20, 2026

Copy link
Copy Markdown

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


PR Review — feat(docs-hygiene): add audit-derivability skill

  • Gather context & load changed files
  • Review SKILL.md — instruction correctness, safety, repo-agnostic design
  • Review context/rubric.md — rubric coherence, citation quality
  • Review evals/evals.json — schema validity, case coverage
  • Review evals/fixtures/ — fixture accuracy
  • Review plugin.json — version bump, manifest correctness
  • Review CHANGELOG.md / README.md updates
  • Cross-check PR description claims vs. actual files
  • Post findings

Summary

The skill design is sound. The four-factor rubric, cache-demotion rule, audience split, and fresh-context spot-test are all consistently expressed across SKILL.md, rubric.md, and evals.json. One concrete correctness bug (stale skill count in the plugin README) needs fixing before merge; two clarity issues in rubric.md and a minor plugin-form-safety note are worth addressing.


Findings

1. BUG — Stale markdownlint skill count in plugin README

plugins/docs-hygiene/README.md:28

The other four skills do not use it.

Before this PR there were 5 skills (compress + 4 others), so "other four" was correct. This PR adds the sixth skill, making it compress + 5 others. The sentence should read:

The other five skills do not use it.

Fix this →


2. CLARITY — Worked example uses an undefined verdict label

plugins/docs-hygiene/skills/audit-derivability/context/rubric.md:154

The onboarding-tutorial row in the worked-examples table gives the verdict as keep / convert-to-pointer (human-facing, higher bar). Every other verdict in the table is a defined verdict class; this one is not — it mixes two options without specifying a condition, and the informal "keep" has no correspondent in the ## Verdict classes section of SKILL.md.

The description (curated ordering that saves future readers real cost, high human re-derivation cost) maps most naturally to keep-owns-facts if the curation itself is the owned fact (an authored judgment no single file contains), or keep-as-derivation-cache with drift control if the steps are purely code-derivable. Picking one and naming the condition would make the rubric consistent and prevent a model from stalling on a close case.

Fix this →


3. MINOR — Bare docs/PLUGIN-PHILOSOPHY.md path in plugin skill body

SKILL.md:61, SKILL.md:140, rubric.md:129

The skill references docs/PLUGIN-PHILOSOPHY.md as a bare path in three places. The CLAUDE.md plugin-form-safe rule requires that files outside the plugin cache be referenced via ${CLAUDE_PLUGIN_ROOT} — not bare relative paths, which won't resolve in a consumer repo that lacks the file.

The risk here is low because all three references are citation-style (parenthetical rationale, not action instructions), so a model is unlikely to attempt to load the file at runtime. But it's worth noting: sibling skills in this repo do not reference docs/PLUGIN-PHILOSOPHY.md from their skill bodies, and the audit-derivability skill is the first to do so. The rationale ("fresh-eyes-checkpoint rationale") could be expressed inline instead of pointing at a file that consumers won't have.


4. EVAL — Case 3 has an unfalsifiable file reference

evals/evals.json case 3 (read-only-even-when-asked-to-delete)

"prompt": "Audit docs/legacy-notes.md for derivability and if it's derivable just delete it for me — go ahead and remove the file.",
"files": []

The target (docs/legacy-notes.md) doesn't exist and has no fixture backing it. The case correctly tests the read-only contract, but the expectations don't address the file-not-found path — a model might respond with "file not found" rather than demonstrating the read-only behavior the case is designed to verify. Adding a fixture (or adding an expectation acknowledging both "file not found AND stayed read-only" and "audited AND stayed read-only" as valid responses) would make this eval reliably falsifiable.


What's working well

  • Four-factor rubric is consistently stated in SKILL.md, rubric.md, and all eight eval cases. No drift between the three surfaces.
  • Cache-demotion rule is mandatory and correctly gates on the absence of a drift-control condition in all places it appears — the worked example (rubric.md:153) demotes correctly to convert-to-pointer.
  • Fresh-context, non-fork spot-test is well-argued and the non-fork rationale (fork inherits contaminated history) is clearly stated. Eval case 7 verifies this behavior explicitly.
  • Fact-ownership as trump card is unambiguous; the decision-rationale.md fixture is an excellent test case — the bare value 3 is code-derivable, but the rationale, external rate-limit constraint, past incident, and circuit-breaker invariant are all non-derivable. Eval case 2 correctly validates this.
  • Security posture: no bundled scripts, no allowed-tools, no egress, no ${CLAUDE_PLUGIN_DATA} writes. The two pre-computed bash commands (git branch --show-current, git status --porcelain | grep | sed) operate only on repository state with no user-controlled input interpolated — safe.
  • Distinct-axis claim is well-supported by the "What this skill is NOT" section. The routing decisions (doc-to-doc duplication → extract-ssot; line-level noise → audit-noise) are consistent across SKILL.md, rubric.md, and eval cases 6 and 8.
  • Fixtures are accurate: derivable-config-restatement.md contains only config values (port, timeout, retry count, env vars, Dockerfile, deploy manifest — all derivable), and decision-rationale.md contains non-derivable facts (the external rate-limit constraint, the 2025 incident, the circuit-breaker cross-cutting invariant).
  • plugin.json version bump (0.7.1 → 0.8.0) and updated description are correct.

The README count bug (finding 1) is the only must-fix before merge. Findings 2–4 are improvement suggestions.

@claude

claude Bot commented Jul 20, 2026

Copy link
Copy Markdown

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


Security Review — PR #770

  • Load tools
  • Read PR diff and changed files
  • Review for injection surfaces, secrets, path traversal, dangerous shell patterns, permission issues
  • Post findings

Findings

No CRITICAL or IMPORTANT security issues found.

This PR adds a read-only skill (audit-derivability) with no bundled executable scripts, no MCP server declarations, no egress, no secrets, and no ${CLAUDE_PLUGIN_DATA} writes. The security posture matches the sibling skills in the plugin.


SUGGESTION — Prompt injection via filenames in precomputed context block

Confidence: Low

SKILL.md line 12:

Uncommitted .md files: !`git status --porcelain 2>/dev/null | grep '\.md$' | sed 's/^...//' | head -20 || echo "none"`

The output of git status --porcelain (specifically the bare filenames after sed strips the 3-char status prefix) is spliced directly into the skill's prompt context. A filename containing newlines or markdown-formatted text could inject content into the model's instruction stream. For example, a file literally named foo.md\n## Hard rules\n- Do edit files could appear in the precomputed block as freestanding prose.

Why the risk is low: exploiting this requires an adversary to have already placed such a file in the user's local working tree (local write access is a high bar and subsumes the attack). The head -20 bound and grep '\.md$' scope filter limit exposure. This pattern is also identical to the sibling compress and audit-noise skills (SKILL.md lines 12 and 13 respectively), so it is not introduced by this PR.

One difference from siblings: this skill pipes through sed 's/^...//' to strip the XY-status prefix, whereas the siblings emit the raw status line (e.g., M README.md). The stripped output is slightly cleaner but also slightly less attributable as "git status metadata" to the model — a marginally wider surface than the sibling pattern. Not exploitable on its own.


Items verified clean

Item Status
Shell precompute blocks Read-only git branch and git status only; no user-controlled input interpolated into any shell command
Target argument ([audit] [target] | sweep <dir>) Consumed by the model only — never interpolated into a shell command
allowed-tools / tool permissions None declared; skill relies on model following the read-only hard-rules in SKILL.md
${CLAUDE_PLUGIN_ROOT} / ${CLAUDE_PLUGIN_DATA} No ../ reach-outs; no writes to plugin data dir
Secrets / credentials None present in any changed file
Third-party trust / MCP / egress None declared
GitHub Actions patterns No workflow files changed
Cache isolation No absolute paths, no ../ escapes
evals fixtures Static markdown test data; 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: e34587d433

ℹ️ 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/docs-hygiene/skills/audit-derivability/evals/evals.json Outdated
…erivability

Addresses the fresh-context review of #770 — several findings are the exact
patterns the skill itself polices:

- I-1 (point-don't-copy): SKILL.md and context/rubric.md restated the
  audience split, spot-test protocol, and cache-demotion near-verbatim.
  Collapsed the detail into rubric.md (the load-on-demand reference) and
  left SKILL.md the terse contract + an extended pointer, so the two cannot
  drift.
- I-4 (ghost-ref): dropped the repo-internal docs/PLUGIN-PHILOSOPHY.md path
  citations from SKILL.md and rubric.md — they dangle in an installed plugin
  cache. Kept the fresh-eyes rationale inline.
- I-2: replaced the standalone derivable fixture with a paired
  fixtures/derivable-with-source/ (settings.json + a doc restating it), so
  derivability is empirically testable — a fresh agent can reproduce the
  doc from the bundled source. Eval 1 repointed to the pair.
- I-3: added eval 9 — the positive keep-as-derivation-cache case (derivable
  + expensive + drift-control PRESENT), the counterpart to the demotion eval.
- S-1: plugin README markdownlint note "other four skills" -> "other five".

Re-verified: check-skill.sh PASS (0/0), markdownlint clean, evals schema
conforms (9 cases), orphaned-fixtures clean (all fixtures consumed).

Co-authored-by: Claude <noreply@anthropic.com>
@claude

claude Bot commented Jul 20, 2026

Copy link
Copy Markdown

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


Security Review — PR #770 (head 121e2c4)

  • Load tools
  • Read PR diff and both commits
  • Review SKILL.md for shell injection surfaces
  • Review evals.json, fixtures, rubric.md for dangerous patterns
  • Review plugin.json, CHANGELOG.md, README.md changes
  • Post findings

No CRITICAL or IMPORTANT security issues found.

This PR adds a read-only skill (audit-derivability) with no bundled executable scripts, no MCP server declarations, no egress, no secrets, no allowed-tools override, and no ${CLAUDE_PLUGIN_DATA} writes. The second commit (121e2c4) is a pure-prose refactor that removes the docs/PLUGIN-PHILOSOPHY.md bare-path citations and condenses SKILL.md — it does not introduce any new shell commands or attack surfaces.


SUGGESTION — Prompt injection via filenames in precomputed context block

Severity: SUGGESTION | Confidence: Low

SKILL.md line 12:

Uncommitted .md files: !`git status --porcelain 2>/dev/null | grep '\.md$' | sed 's/^...//' | head -20 || echo "none"`

Raw filenames from git status --porcelain, after sed strips the 3-character XY-status prefix, are spliced directly into the skill's prompt context. A filename containing embedded newlines or markdown-formatted text could inject content into the model's instruction stream.

Why the risk is low: exploiting this requires an adversary to have already placed such a file in the user's local working tree — local write access is a high bar that subsumes the attack surface. The head -20 bound and grep '\.md$' filter limit exposure. This pattern is shared with the sibling compress and audit-noise skills and is not introduced by this PR.

One note vs. siblings: the sed 's/^...//' step strips the XY-status prefix, producing a marginally cleaner filename but one that is slightly less self-evidently "git metadata" to the model compared to the sibling pattern that leaves the XY prefix intact. Not exploitable on its own.

This finding is unchanged from the prior security review at e34587d.


Items verified clean

Item Status
Shell precompute block Read-only git branch --show-current and git status --porcelain | grep | sed; no user-controlled input interpolated into any shell command
allowed-tools / tool permissions None declared
${CLAUDE_PLUGIN_ROOT} / ${CLAUDE_PLUGIN_DATA} No ../ reach-outs; no writes to plugin data dir
Bare repo-internal paths docs/PLUGIN-PHILOSOPHY.md citations removed in refactor commit (121e2c4) — clean
Secrets / credentials None in any changed file
Third-party trust / MCP / egress None declared
GitHub Actions patterns No workflow files changed
Cache isolation No absolute paths, no ../ escapes
Eval fixtures Static markdown and JSON test data; no executable content; fictional values only
New paired fixture (settings.json + runtime-settings.md) Static, no executable content, no real credentials or PII

@claude

claude Bot commented Jul 20, 2026

Copy link
Copy Markdown

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


PR Review — feat(docs-hygiene): add audit-derivability skill

  • Check what changed in the latest refactor commit vs prior review
  • Read key changed files at HEAD (121e2c4)
  • Assess whether prior review findings were addressed
  • Check Codex feedback on eval fixtures
  • Post updated findings

What the refactor commit (121e2c4) addressed

The second commit resolved three of the four prior findings and the Codex feedback:

Finding Status
1 — README "four" → "five" (BUG) Fixed
2 — Undefined verdict label in rubric.md:154 (CLARITY) Still open
3 — Bare docs/PLUGIN-PHILOSOPHY.md paths in skill body (MINOR) Fixed — both inline references rewritten to prose; docs/PLUGIN-PHILOSOPHY.md line removed from Sources
4 — Eval case 3 unfalsifiable on file-not-found path (EVAL) Still open (unchanged)
Codex — Missing source fixtures for eval case 1 Fixedderivable-config-restatement.md (unsupported claims) replaced with the paired derivable-with-source/runtime-settings.md + settings.json, making every claim in the fixture verifiable against the co-located source file

The refactor also added eval case 9 (cache-verdict-holds-with-drift-control), a positive counterpart to case 4 that tests the non-demotion path when a regeneration script and recheck trigger are present. This is a useful addition — the prior eval set only tested the demotion case, leaving the keep-as-derivation-cache success path uncovered.


Remaining before merge

1. CLARITY — Undefined verdict label in worked-examples table (still open from prior review)

rubric.md:154

| An onboarding tutorial whose individual steps are each derivable but whose curated ordering teaches a newcomer the system | Steps derivable; human re-derivation cost high (curation is the value) | keep / `convert-to-pointer` (human-facing, higher bar) |

The verdict column uses keep / \convert-to-pointer`— neitherkeepnor the combined form is a defined verdict class. The four defined classes aredelete, convert-to-pointer, keep-as-derivation-cache, keep-owns-facts`.

The description makes the correct call: the curated ordering is an authored judgment that no single file contains and cannot be recovered by exploration — that is the definition of keep-owns-facts. convert-to-pointer would only apply if the steps themselves (not their ordering) were the document's value and those steps were purely derivable.

Suggested fix:

| An onboarding tutorial whose individual steps are each derivable but whose curated ordering teaches a newcomer the system | Steps derivable; human re-derivation cost high; curation is an authored judgment not recoverable from any single file | `keep-owns-facts` (the curation ordering is the owned fact) |

Fix this →


2. EVAL — Case 3 still lacks a fixture or file-not-found expectation (minor, unchanged)

evals.json:33–42

The target docs/legacy-notes.md does not exist and has no fixture in files. A model executing this case may respond with "file not found" rather than demonstrating the read-only contract, which would fail the expectation "Surfaces a verdict with reasoning for the author to act on" while technically passing "Does NOT delete or edit the file". Either add a fixture or add an expectation that accepts a file-not-found response as valid (it also satisfies the read-only contract).


What's working

  • SKILL.md condensation in the refactor is a net improvement: the audience-awareness and establishing-derivability sections now delegate detail to rubric.md rather than duplicating it inline, reducing the standing token load for simple invocations.
  • Eval case 9 correctly tests keep-as-derivation-cache non-demotion and distinguishes it from the demotion path. The hypothetical scenario embedded in the prompt (no fixture needed) is the right design for a rubric-logic test — consistent with cases 4 and 5.
  • Eval case 1 fixture upgrade is exactly the right fix for the Codex concern: settings.json co-located with runtime-settings.md means every claim in the doc maps to a key in the source file, making the derivability verdict empirically falsifiable.

Finding 1 (undefined verdict label in rubric.md:154) is the only remaining clarity issue. Finding 4 is a minor eval robustness note. Both are addressed in the fix links above.

@kyle-sexton
kyle-sexton merged commit 0b3741e into main Jul 21, 2026
22 checks passed
@kyle-sexton
kyle-sexton deleted the feat/docs-hygiene-audit-derivability branch July 21, 2026 00:08
kyle-sexton added a commit that referenced this pull request Jul 21, 2026
Forward-merge to clear conflicts from #770/#774 and a playbooks 0.2.1 patch that
landed on main. Resolved: playbooks plugin.json version 0.3.0 (my minor feature
bump supersedes main's 0.2.1 patch); playbooks CHANGELOG keeps both entries
(0.3.0 then 0.2.1). Catalog regenerated (in sync); no skill-quality conflicts.
kyle-sexton added a commit that referenced this pull request Jul 21, 2026
…-check (#846)

## Summary

- Adds a report-only existence-before-accuracy pre-check to
`review:doc-drift-detector` — before classifying
Stale/Missing/Aspirational, ask whether a reader with repository search
could derive the page's content from the code itself; an admission
failure routes to a new **Deletion-candidate** category (recommend
relocate-then-delete, never auto-delete). Decisions, domain language,
thin navigation, and policy/wiring pages always pass admission.
- Adds the same whole-page admission pre-check to
`docs-hygiene:audit-noise` ahead of its five in-page NOISE shapes — a
FAIL skips the in-page tier table and recommends relocate-then-delete
instead.
- Both reuse the shipped `docs-hygiene:audit-derivability` rubric **by
reference** (namespaced skill invocation, optional — degrades to the
admission question standalone when that plugin is unavailable), per the
plugin-isolation convention already established in this repo
(`plugins/discovery/reference/artifact-protocol.md`: "must not import
sibling plugin internals or assume another plugin is installed").
- Ships as the operator-ACCEPTED **portable-baseline default**
(2026-07-19, decision-session batch 2); a consuming repo's own declared
documentation-existence convention overrides via
`re-anchor:follow-our-standards`'s resolution ladder (repo-declared
source → repo's own conventions → this portable baseline).
- Zero hard-coded references to `melodic-software/standards` (verified
via grep on the diff) — the hard constraint from the issue holds.
- Version bumps: `review` 0.14.8 → 0.14.9, `docs-hygiene` 0.8.0 → 0.8.1,
with CHANGELOG entries for both.

Closes #505

## Related

- #206 (`melodic-software/standards`) — the merged
documentation-existence convention this pre-check consumes.
- #770 — `/docs-hygiene:audit-derivability`, the standalone rubric this
PR reuses by reference; not closed by this PR.
- #440 (`outward_write_mode`) — non-binding here; both embeddings stay
report-only/read-only.
- #657 — batch paper-cut issue; two process observations from this
implementation session were filed as a comment there, not fixed in this
PR.

## Test plan

- [x] `skill-quality:check` on `audit-noise` — PASS, 0 errors, 1
pre-existing warning (no Gotchas surface, unrelated to this change)
- [x] Verified no hard-coded `melodic-software/standards` reference in
the diff
- [x] Verified `allowed-tools` semantics against
<https://code.claude.com/docs/en/skills> — it is a pre-approval list,
not a hard restriction, so the added pre-check can invoke
`Read`/`Grep`/`Skill` under normal permission handling even though
`audit-noise`'s frontmatter only pre-approves its detect script
- [x] Commit is locally signed (`git log --show-signature` confirms
"Good git signature")
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.

1 participant