Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
fa5c7ed
docs: add corpus inventory and coordination plan for docs-hygiene sweep
claude Aug 26, 2026
580c595
fix(docs-hygiene): stop audit-noise aborting on a fence after prose (…
claude Aug 26, 2026
631637d
fix(docs-hygiene): fix the same stale-BASH_REMATCH defect in audit-no…
claude Aug 26, 2026
06c0f39
docs: record the mechanical noise-detector baseline for the sweep
claude Aug 26, 2026
48c2af7
fix(docs-hygiene): stop audit-progressive-disclosure orphaning cited …
claude Aug 26, 2026
b3f4e51
docs: land wave 1 findings for the four structural docs-hygiene lanes
claude Aug 26, 2026
ad6ef81
docs: checkpoint in-progress L6 and L7 lane output
claude Aug 26, 2026
b386ebe
docs: checkpoint further L6 and L7 group findings
claude Aug 26, 2026
14d1d67
docs: adjudicate both L1 deletion verdicts against fresh-context spot…
claude Aug 26, 2026
c2f658c
docs: rule on the two escalations gating wave 3
claude Aug 26, 2026
20d267b
fix: drop "in order to" at its generator, and land the noise-lane fin…
claude Aug 26, 2026
48bf0c1
docs: apply the derivability remediations, and narrow a doctrine disc…
claude Aug 26, 2026
973fe6e
docs: checkpoint in-progress L8 write-for-humans findings
claude Aug 26, 2026
782aa25
docs: reconcile the eight lanes into one ordered edit plan
claude Aug 26, 2026
822084a
docs: correct the E1 ruling against the measurement that tested it
claude Aug 26, 2026
33d15ff
fix: close four defects a fresh-context verifier found in the L1 reme…
claude Aug 26, 2026
fa0e7ca
docs: split nine oversize skill bodies, and land the write-for-humans…
claude Aug 26, 2026
0e5ddde
docs: correct the E1 ruling against its own evidence, and settle both…
claude Aug 26, 2026
6b1a4d0
fix: satisfy the version-bump gate, and revert a split that broke a s…
claude Aug 26, 2026
486cf45
docs: apply the remaining remediations, graduate the outcomes, prune …
claude Aug 26, 2026
4884218
docs(work-items): link the container-lifecycle sibling instead of nam…
claude Aug 26, 2026
46a258a
fix(source-control): revert the worktree split, a test owns that body…
claude Aug 26, 2026
803551a
chore: ignore .pytest_cache in git and in the markdown linter
claude Aug 26, 2026
8b55ebc
Merge origin/main into the docs-hygiene sweep branch
claude Aug 26, 2026
bb1b245
fix: carry three manifest bumps the merge commit left behind
claude Aug 26, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# Dependencies
node_modules/
__pycache__/
.pytest_cache/
.venv/
venv/

Expand Down
1 change: 1 addition & 0 deletions .markdownlint-cli2.jsonc
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
// Build, dependency, and cache trees — not authored markdown.
"**/node_modules/**",
"**/.venv/**",
"**/.pytest_cache/**",
"**/bin/**",
"**/obj/**"
],
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ user opts in with `/plugin enable`; an existing install is never flipped by cata
## Finding your way

- Not sure which skill to invoke? Start at the [skill cheat sheet](docs/SKILL-CHEAT-SHEET.md). A
scan-and-go map from what you're doing to the skill to use.
scan-and-go map from what you are doing to the skill that does it.
- [Plugin catalog](docs/CATALOG.md). Every plugin by category, generated from the manifests and
kept in sync by CI. New plugins clear the per-plugin migration gate in
[`docs/MIGRATION-PLAYBOOK.md`](docs/MIGRATION-PLAYBOOK.md).
Expand Down
278 changes: 20 additions & 258 deletions docs/MIGRATION-PLAYBOOK.md

Large diffs are not rendered by default.

19 changes: 17 additions & 2 deletions docs/PLUGIN-PHILOSOPHY.md
Original file line number Diff line number Diff line change
Expand Up @@ -212,7 +212,7 @@ re-deriving a row.
| [Skills](https://code.claude.com/docs/en/skills) | Primary surface | The default unit of capability. Newer frontmatter — `paths`, `context: fork` (+ `agent`), `arguments`, skill-scoped `hooks` with `once` — adopted case-by-case through the adoption gate. | 2026-07-17 |
| [`commands/`](https://code.claude.com/docs/en/plugins-reference) | Prohibited | Officially merged into skills; docs direct "use `skills/` for new plugins". Existing flat commands migrate to skill directories. | 2026-07-17 |
| [Agents](https://code.claude.com/docs/en/sub-agents) | Adopt on need | Plugin agents do not support `hooks`, `mcpServers`, or `permissionMode` (security restriction) — design within that limit rather than working around it. | 2026-07-17 |
| [Workflows](https://code.claude.com/docs/en/workflows) | Adopt on need | Native and not experimental: a script in `workflows/`, or wherever the `workflows` manifest field points (that field replaces the default scan), runs as a plugin-namespaced `/plugin:name` command. Availability, not maturity, is the constraint — workflows are paid-plan-gated, a consumer can switch them off (`disableWorkflows`, `CLAUDE_CODE_DISABLE_WORKFLOWS`), and an org can disable them fleet-wide in managed settings; so, as with `bin/`, never make a workflow the only path to a capability. Not "Wait": the [deferred workflow engines](MIGRATION-PLAYBOOK.md#deferred-surfaces--decision-record-2026-07-12) are a named candidate carrying a live trigger, so the gap is identified rather than hypothetical. None ship in this fleet today. | 2026-07-27 |
| [Workflows](https://code.claude.com/docs/en/workflows) | Adopt on need | Native and not experimental: a script in `workflows/`, or wherever the `workflows` manifest field points (that field replaces the default scan), runs as a plugin-namespaced `/plugin:name` command. Availability, not maturity, is the constraint — workflows are paid-plan-gated, a consumer can switch them off (`disableWorkflows`, `CLAUDE_CODE_DISABLE_WORKFLOWS`), and an org can disable them fleet-wide in managed settings; so, as with `bin/`, never make a workflow the only path to a capability. Not "Wait": the [deferred workflow engines](adr/0020-defer-three-medley-surfaces-with-explicit-recheck-triggers.md) are a named candidate carrying a live trigger, so the gap is identified rather than hypothetical. None ship in this fleet today. | 2026-07-27 |
| [Hooks](https://code.claude.com/docs/en/hooks) | Adopt on need | Exec form (`args`) is mandatory wherever `${user_config.*}` appears — shell form errors since v2.1.207; otherwise read the `CLAUDE_PLUGIN_OPTION_<KEY>` mirror. Windows exec form spawns real executables only (no `.cmd`/`.bat` shims): use `"command": "node", "args": [...]`, a `${CLAUDE_PLUGIN_ROOT}`-rooted path, or shell form with `"shell": "bash"` — never a bare `bash`/`sh` (WSL relay) or `python`/`python3` (WindowsApps alias stub), whose launch fails non-blockingly and leaves a guard hook silently enforcing nothing. Prose cannot self-verify, so `scripts/check-hook-exec-form.sh` turns that rule into a mechanical check across hook configs and skill/agent frontmatter alike. | 2026-07-17 |
| [MCP servers](https://code.claude.com/docs/en/mcp) | Adopt on need | Clears the plugin-acceptance security review for egress and trust delegation. Also the only component type that can cost a consumer their prompt cache: every other kind only appends to the request, while enabling or disabling a plugin that provides an MCP server forces a full re-read whenever the server's tools load into the prefix instead of being deferred by tool search ([actions that invalidate the cache](https://code.claude.com/docs/en/prompt-caching#actions-that-invalidate-the-cache), verified 2026-08-10). | 2026-08-10 |
| [LSP servers](https://code.claude.com/docs/en/plugins-reference) | Adopt on need | Consumer must have the language-server binary; declare the prerequisite per the failure-behavior rules. | 2026-07-17 |
Expand Down Expand Up @@ -342,6 +342,21 @@ A bare `context/…`-style path is reserved for a skill's OWN supporting files;
the citing skill's directory, so a cross-skill citation written that way points at a file that is
not there.

This permission stops at the plugin boundary. It exists because a plugin is the unit that ships:
one `plugin.json`, one version, one marketplace entry, and skills that always travel together, so
a citation between two skills in the same plugin cannot arrive at an absent file. **Do not path-cite
into a skill in a different plugin.** Plugins install independently, so that path can genuinely be
missing at runtime; cite the other plugin's skill by its `/plugin:skill` invocation instead, or
promote the shared content to a convention doc both plugins can cite. The same limit applies to
anything outside `plugins/`: `docs/**` and `.claude/rules/**` cite skills by slash invocation, never
by path.

Heading anchors are never a citation target, in either direction. A heading is body structure, and
renaming one is exactly the refactor a skill must stay free to make.

The full public-surface contract this narrows is
`/docs-hygiene:audit-encapsulation`'s, which audits against it.

## Setup is explicit and repeatable

A plugin requires a `setup` skill iff it has (a) a consumer-project configuration surface, (b) an
Expand Down Expand Up @@ -543,7 +558,7 @@ prerequisite-absence rules are one slice of that contract, specialized here for

Hooks follow the event's official control contract. Use a blocking result only when the event can still
be blocked and the hook is enforcing a policy. Advisory hooks surface a visible non-blocking diagnostic.
Do not swallow errors or claim success when the promised result was not produced.
Surface every error, and report the result the run actually produced.

## Convention registry

Expand Down
Loading
Loading