Skip to content

Config location: docs convention file with a CLAUDE.md pointer as the default, .claude/ as an option #5606

Closed

Description

@kyle-sexton

Problem

The config-cascade convention (docs/conventions/config-cascade/README.md) puts every plugin's consumer config under .claude/<name> (user, team, local overlay). Plugins reference more than 30 distinct .claude/* files today (for example .claude/source-control.md, .claude/testing.yaml, .claude/topic-docs.yaml), each in its own format.

The owner's preference (2026-09-30): rules like these apply to other agents and tools too, and .claude/ is not a shared or reusable location (tools that write there hit edit restrictions, and other agents do not read it). The default a plugin ships should be:

  • a prose convention doc under docs/conventions/<concern>.md (for example docs/conventions/testing.md) holding the rules;
  • a CLAUDE.md or AGENTS.md pointer that loads it on demand ("if testing, read docs/conventions/testing.md"), per progressive disclosure;
  • a structured file only where performance or readability needs one.

Both routes stay supported, and the location stays configurable per repository.

Constraint

Scripts and hooks cannot follow a CLAUDE.md pointer. The testing scanner and its test-scan hook run on every test-file write under a p95 budget of 150 ms on WSL, so they need a machine-readable block at a known path. A proposed form: the convention doc carries one fenced config block (same keys as today's file) that the script reads directly, with .claude/<name> accepted as a fallback. The read time must be measured inside the hook before adoption.

Scope

  1. Extend the config-cascade contract with a location axis: a docs convention file with a pointer as the default, .claude/<name> as an option, and the resolution order between them.
  2. Adopt it in the testing plugin first (.claude/testing.yaml → docs/conventions/testing.md with a fenced block), including a timing probe inside the hook and a migration note.
  3. List the other plugins' .claude/* surfaces for later adoption; do not migrate them in the same change.

Acceptance

Related: #5575 (removing docs/topics and docs/specs), #5603, #5604.

🤖 Generated with Claude Code

Activity

  1. added
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Sep 30, 2026
  2. kyle-sexton commented on Oct 1, 2026

    @kyle-sexton
    ContributorAuthor

    Owner decision (2026-10-01): approved the recommendation ("go with recommended", the owner's reply to the batch decision page that listed this question and its recommendation).

    Question: should structured plugin config move out of .claude/ files into a fenced block in docs/conventions/.md, reversing ADR 0018 for structured surfaces, testing first?

    Chosen: A. The docs file wins. A new ADR supersedes ADR 0018 for structured surfaces. The default becomes docs/conventions/.md with one fenced config block, and .claude/ is read only when that block is absent. A warning is printed when both exist. Testing goes first: the scanner reads the docs block and falls back to .claude/testing.yaml, and the read is timed inside the hook. The other .claude/* surfaces are only listed for later.

    Next: an agent writes the superseding ADR, updates docs/conventions/config-cascade/README.md (location axis, precedence, Expression doctrine, conformance table), adds the fenced-block reader to the testing scanner, times the test-scan hook against its 150 ms p95 budget on WSL, writes a migration note, lists the other .claude/* surfaces, and opens a draft PR that closes this issue.

  3. added
    agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.
    and removed
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Oct 1, 2026
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

    agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions