Skip to content

fix(claude-config): audit-pass claims CLAUDE_PLUGIN_DATA resolves outside any target repository — false by construction #2229

Description

@kyle-sexton

Defect

audit-pass's report-location contract states that ${CLAUDE_PLUGIN_DATA} "resolves outside any target
repository". That is false by construction, not a misconfiguration: the resolution formula is
unconditional and rooted at ~.

Evidence at HEAD

plugins/claude-config/skills/audit-pass/reference/report-location-and-schema.md:10-14:

**A run never writes into its own scan set.** If run 1 writes a report into the tree, run 2's tree is
not unchanged and the idempotence property is unfalsifiable by construction.

- The report goes under `${CLAUDE_PLUGIN_DATA}`, which resolves outside any target repository and
  survives plugin updates, at `runs/<state-key>/<run-id>/findings.json`.

Restated as an absolute at SKILL.md:353:

Never writes into its own scan set without `--report-to`, and never scans what it wrote.

The omission that makes it bite: reference/exclusion-set.md:49-60 Class 4 enumerates exactly two
members — the suppression record and a redirected report. The default path is in no class.

Docs grounding

https://code.claude.com/docs/en/plugins-reference.md, fetched 2026-08-11 — "The
${CLAUDE_PLUGIN_DATA} directory resolves to ~/.claude/plugins/data/{id}/, where {id} is the plugin
identifier with characters outside a-z, A-Z, 0-9, _, and - replaced by -." No configuration
knob relocates it; no setting is documented that would.

Scope of the error, stated precisely

The sentence is true for an ordinary git repo under, say, C:/Projects/…. Its defect is that it is
stated unconditionally while a whole reachable target class falsifies it — any target at or above
~. A dotfiles repo is exactly that shape and is a plausible audit-pass target. State it as a
conditional, not as a universal.

Note this survives the non-git refusal filed separately: the residual class is a git repository rooted
at or above $HOME, so containment holds there by construction and independently of gitignore.

Grading

  • Severity: HIGH — it is the load-bearing premise of the read-only contract's headline property and
    of assertions 2.1 and 2.4, and it fails by construction.
  • Provenance: AUDITOR_VERIFIED. Verdict: PRESENT_AT_HEAD.
  • Dedup: audit-pass: four design/shipped contract contradictions in rerun-contract.md, plus PLAN.md phase drift #1940 covers four design-doc vs shipped-contract contradictions in rerun-contract.md.
    None of them is this sentence and none is the containment predicate. Adjacent at most.
  • Originating inbox item: 20260811-020411-claude-config-audit-pass-report-path-inside-scan-set.md
    (ledger I8, row F1).

Activity

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions