@erclx/aitk 0.38.0 → 0.39.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/claude/.claude-plugin/plugin.json +1 -1
  2. package/claude/skills/create-rule/REQUIREMENT.md +1 -1
  3. package/claude/skills/create-skill/REQUIREMENT.md +6 -2
  4. package/claude/skills/create-skill/SKILL.md +5 -2
  5. package/claude/skills/create-snippet/REQUIREMENT.md +36 -0
  6. package/claude/skills/create-snippet/SKILL.md +23 -5
  7. package/claude/skills/{create-standard → create-snippet}/references/snippets.md +1 -1
  8. package/claude/skills/create-standard/REQUIREMENT.md +38 -0
  9. package/claude/skills/create-standard/SKILL.md +8 -12
  10. package/claude/skills/migration-claude-md/REQUIREMENT.md +41 -0
  11. package/claude/skills/migration-standards/REQUIREMENT.md +38 -0
  12. package/claude/skills/project-commands/REQUIREMENT.md +42 -0
  13. package/claude/skills/session-resume/REQUIREMENT.md +38 -0
  14. package/claude/skills/setup-indexes/REQUIREMENT.md +42 -0
  15. package/claude/skills/setup-plugins/REQUIREMENT.md +42 -0
  16. package/claude/skills/setup-verify/REQUIREMENT.md +39 -0
  17. package/claude/skills/systematic-debugging/REQUIREMENT.md +41 -0
  18. package/claude/skills/toolkit-cli/REQUIREMENT.md +37 -0
  19. package/claude/skills/toolkit-feedback/REQUIREMENT.md +40 -0
  20. package/claude/skills/toolkit-operator/REQUIREMENT.md +39 -0
  21. package/claude/skills/toolkit-triage/REQUIREMENT.md +40 -0
  22. package/claude/skills/youtube-transcripts/REQUIREMENT.md +38 -0
  23. package/docs/agents.md +5 -4
  24. package/package.json +1 -1
  25. package/scripts/manage-sandbox.sh +4 -0
  26. package/src/sandbox/census.ts +1 -1
  27. package/standards/bundled/snippets.md +1 -1
  28. package/standards/skill.md +4 -4
  29. package/claude/skills/claude-design-propose/SKILL.md +0 -15
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "aitk",
3
3
  "description": "Automated governance, versioning, and discovery tools for Claude Code.",
4
- "version": "0.38.0",
4
+ "version": "0.39.0",
5
5
  "author": {
6
6
  "name": "Eric Le",
7
7
  "url": "https://github.com/erclx"
@@ -39,4 +39,4 @@ The band gets picked by feel, so a UI copy rule lands in the always-on range and
39
39
  - Editing a rule that already exists
40
40
  - Toolkit source rules, which are authored in the toolkit rather than in a target
41
41
  - Installing the rules the toolkit ships, which the governance setup path owns
42
- - A standard or a snippet, which `create-standard` owns
42
+ - A standard, which `create-standard` owns, and a snippet, which `create-snippet` owns
@@ -9,16 +9,20 @@ description: What skill creation is for, the gaps it closes, and why it confirms
9
9
 
10
10
  Without this skill, a new skill lands in the wrong shape and the wrong place. A session writes `SKILL.md` from its own idea of the format, writes malformed frontmatter that Claude Code routes on, and never opens the authoring standard that already answers every question it guessed at.
11
11
 
12
+ A skill born without its requirement is the second failure, and it surfaces much later. Coverage of the corpus is what the operator reads to decide whether a skill should exist, so every skill created without the sibling decays that reading, and the sweep that closes the gap has to reconstruct what the skill was for from the body it already shipped.
13
+
12
14
  ## Must
13
15
 
14
16
  - Read the authoring standard and the prose standard before drafting, so the draft starts conformant rather than getting corrected into shape
15
- - Confirm the name and the full body with the user before writing. The name is the routing key and a folder that disagrees with its frontmatter fails silently.
17
+ - Draft the sibling `REQUIREMENT.md` beside the body, from what the skill is for rather than from the drafted body
18
+ - Confirm the name and both files with the user before writing. The name is the routing key and a folder that disagrees with its frontmatter fails silently.
16
19
  - Write to the conventional skills path, so discovery finds it without configuration
17
20
 
18
21
  ## Must not
19
22
 
20
23
  - Auto-trigger. Creation is a deliberate act and a skill invented from an ambiguous request is worse than none.
21
- - Write before the user has seen the body
24
+ - Write either file before the user has seen it
25
+ - Derive the requirement from the drafted body, which records the draft's overfitting as the requirement
22
26
 
23
27
  ## Guards
24
28
 
@@ -20,5 +20,8 @@ Read a standard from `${CLAUDE_SKILL_DIR}/../../standards/` instead when the pro
20
20
  ## Steps
21
21
 
22
22
  1. Draft the full `SKILL.md` from the user's description
23
- 2. Confirm the skill name and full content with the user before writing
24
- 3. Write to `.claude/skills/<name>/SKILL.md`
23
+ 2. Draft the sibling `REQUIREMENT.md` from what the skill is for, in the shape the standard states. Write the gaps from the user's description rather than from the drafted body, since a requirement derived from the body records whatever the draft overfitted to.
24
+ 3. Confirm the skill name and both files with the user before writing
25
+ 4. Write to `.claude/skills/<name>/SKILL.md` and `.claude/skills/<name>/REQUIREMENT.md`
26
+
27
+ Every skill carries a requirement. A skill created without one is a gap someone closes in a later sweep, and the sweep has to reconstruct what the skill was for from the body it already shipped.
@@ -0,0 +1,36 @@
1
+ ---
2
+ name: create-snippet
3
+ description: Why a snippet needs its shape read from the reference and its write surface resolved before anything is drafted
4
+ ---
5
+
6
+ # Create snippet requirement
7
+
8
+ ## Gap
9
+
10
+ Without this skill, a snippet is drafted the way any other markdown file is drafted, so it arrives carrying frontmatter, headings, and a fill-in placeholder. None of the invocation channels strip those. Typing `>slug` in a chat inserts the scaffolding verbatim, and the file that was meant to be one instruction reads as a document.
11
+
12
+ The write surface is the second failure. The toolkit authors at `snippets/` and a target project holds only the installed copy under `.claude/snippets/`, so a session picks whichever folder it noticed first. A toolkit snippet written into the consumed copy fails the drift assertion that regenerates that folder. A snippet written there in a target project is correct and looks identical, which is why the surface has to be resolved from what the project has rather than guessed.
13
+
14
+ ## Must
15
+
16
+ - Read the bundled snippet reference before drafting, since the shape rules are what the invocation channels depend on
17
+ - Resolve the write surface from which snippet folder the project has, rather than from whichever one the session noticed first
18
+ - Confirm the slug and the full body with the user before writing
19
+ - Emit the written path in full, so the terminal can resolve it
20
+ - State what the resolved surface implies after writing, since a root file needs the consumed copy regenerated and a project-local one needs copying to the toolkit to ship
21
+
22
+ ## Must not
23
+
24
+ - Restate the snippet authoring conventions in the body, which the bundled reference owns and which would drift from it
25
+ - Write a standard, which answers to a different authoring contract
26
+
27
+ ## Guards
28
+
29
+ - Neither snippet folder exists: stop, since there is nowhere for the snippet to live
30
+
31
+ ## Out of scope
32
+
33
+ - Editing a snippet that already exists
34
+ - A standard, which `create-standard` owns
35
+ - Installing and syncing the snippets the toolkit ships, which the `aitk snippets` commands own
36
+ - What a snippet is and how it is invoked, which the bundled snippet reference states
@@ -1,13 +1,31 @@
1
1
  ---
2
2
  name: create-snippet
3
- description: Retired. `create-standard` absorbed this skill and writes snippets as well as standards. Invoke `aitk:create-standard` instead.
4
- disable-model-invocation: true
3
+ description: Creates a new snippet file in `snippets/` or `.claude/snippets/`. Use when asked to create a snippet, add a snippet, write a reusable prompt, or make a new snippet. Do NOT use to edit an existing snippet.
5
4
  ---
6
5
 
7
6
  # Create snippet
8
7
 
9
- Retired. `create-standard` absorbed the snippet surface, resolves `snippets/` or `.claude/snippets/` the same way it resolves the standards folders, and its description carries every trigger this skill used to route on.
8
+ Creates one snippet file. Read these files in parallel:
10
9
 
11
- Invoke `aitk:create-standard` instead and ask for a snippet. The name understates what the skill covers, which is why its description names both surfaces.
10
+ - `.claude/standards/prose.md` from the project root: prose conventions for all generated text
11
+ - `${CLAUDE_SKILL_DIR}/references/snippets.md`: authoring conventions, invocation channels, use patterns
12
12
 
13
- This body exists so a project that installed the plugin before the merge keeps resolving the old name for one sync cycle. It ships in `0.18.0` and is removed in `0.19.0`.
13
+ Read `${CLAUDE_SKILL_DIR}/../../standards/prose.md` instead when the project does not have it.
14
+
15
+ ## Guards
16
+
17
+ - If neither `snippets/` nor `.claude/snippets/` exists, stop: `❌ No snippets/ or .claude/snippets/ directory found.`
18
+
19
+ ## Steps
20
+
21
+ 1. Resolve the write surface: `snippets/` at the root if present, which is the toolkit's own authoring source. Otherwise `.claude/snippets/`, a target project's installed copy.
22
+ 2. Draft the content from the user's description. The snippet reference governs structure, invocation, and authoring conventions.
23
+ 3. Confirm the slug and full content with the user before writing
24
+ 4. Write the file to `<surface>/<category>/<slug>.md`, or to `<surface>/<slug>.md` when the snippet takes no category
25
+
26
+ ## After writing
27
+
28
+ Emit the full path on its own line.
29
+
30
+ - Root surface: this is the toolkit's authoring source. Remind the user to run `bun run check` to regenerate the consumed copy under `.claude/`.
31
+ - `.claude/` surface: the file is project-local. `aitk snippets sync` leaves it alone, since sync only updates filenames it recognizes from the toolkit. Remind the user to copy it to the toolkit repo, under `snippets/<category>/<name>.md`, if it should ship to every project.
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  title: Snippet reference
3
3
  description: Snippet reference and authoring conventions
4
- consumers: create-standard
4
+ consumers: create-snippet
5
5
  ---
6
6
 
7
7
  # Snippet reference
@@ -0,0 +1,38 @@
1
+ ---
2
+ name: create-standard
3
+ description: Why a standard needs its shape read from the meta-standard and its write surface resolved before anything is drafted
4
+ ---
5
+
6
+ # Create standard requirement
7
+
8
+ ## Gap
9
+
10
+ Without this skill, a standard is written from memory of what other standards look like. It arrives without the scope section that says what the file does not govern, so the next author cannot tell whether a rule belongs to it or to a sibling, and two standards end up claiming the same subject with no way to settle which one wins.
11
+
12
+ The write surface is the second failure. The toolkit authors at `standards/` and a target project holds only the installed copy under `.claude/standards/`, so a session picks whichever folder it noticed first. A toolkit standard written into the consumed copy fails the drift assertion that regenerates that folder. A standard written there in a target project is correct and looks identical, which is why the surface has to be resolved from what the project has rather than guessed.
13
+
14
+ A standard written at the root and left there is the third. The index entry and the context table are both generated or maintained downstream of the write, so a file that ships without them is catalogued nowhere and reached only by whoever already knew the path.
15
+
16
+ ## Must
17
+
18
+ - Read the meta-standard before drafting, since the shape is what makes the file arguable against a sibling
19
+ - Resolve the write surface from which standards folder the project has, rather than from whichever one the session noticed first
20
+ - Confirm the slug and the full body with the user before writing
21
+ - Emit the written path in full, so the terminal can resolve it
22
+ - State what the resolved surface implies after writing, since a root file needs the consumed copy and the index regenerated and a project-local one needs copying to the toolkit to ship
23
+
24
+ ## Must not
25
+
26
+ - Work the standard's shape or frontmatter from memory
27
+ - Write a snippet, which carries no frontmatter and answers to a different authoring contract
28
+
29
+ ## Guards
30
+
31
+ - Neither standards folder exists: stop, since there is nowhere for the standard to live
32
+
33
+ ## Out of scope
34
+
35
+ - Editing a standard that already exists
36
+ - A snippet, which `create-snippet` owns
37
+ - A path-scoped coding rule, which `create-rule` owns
38
+ - Installing and syncing the standards the toolkit ships, which the `aitk standards` commands own
@@ -1,29 +1,25 @@
1
1
  ---
2
2
  name: create-standard
3
- description: Creates a new standard file in `standards/` or `.claude/standards/`, or a new snippet file in `snippets/` or `.claude/snippets/`. Use when asked to create a standard, add a standard, write a new authoring convention, create a snippet, add a snippet, or make a new snippet. Do NOT use to edit an existing standard or snippet.
3
+ description: Creates a new standard file in `standards/` or `.claude/standards/`. Use when asked to create a standard, add a standard, or write a new authoring convention. Do NOT use to edit an existing standard.
4
4
  ---
5
5
 
6
6
  # Create standard
7
7
 
8
- Creates one authoring file on either surface. Read the user's request for which artifact they asked for, standard or snippet, and carry that choice through every step below. Ask only when the request names neither.
9
-
10
- Read these files in parallel:
8
+ Creates one standard file. Read these files in parallel:
11
9
 
12
10
  - `.claude/standards/prose.md` from the project root: prose conventions for all generated text
13
- - `.claude/standards/standard.md` from the project root, for a standard: the meta-standard for shape, frontmatter, and structure
14
- - `${CLAUDE_SKILL_DIR}/references/snippets.md`, for a snippet: authoring conventions, invocation channels, use patterns
11
+ - `.claude/standards/standard.md` from the project root: the meta-standard for shape, frontmatter, and structure
15
12
 
16
13
  Read a standard from `${CLAUDE_SKILL_DIR}/../../standards/` instead when the project does not have it.
17
14
 
18
15
  ## Guards
19
16
 
20
- - For a standard, if neither `standards/` nor `.claude/standards/` exists, stop: `❌ No standards/ or .claude/standards/ directory found.`
21
- - For a snippet, if neither `snippets/` nor `.claude/snippets/` exists, stop: `❌ No snippets/ or .claude/snippets/ directory found.`
17
+ - If neither `standards/` nor `.claude/standards/` exists, stop: `❌ No standards/ or .claude/standards/ directory found.`
22
18
 
23
19
  ## Steps
24
20
 
25
- 1. Resolve the write surface for the chosen artifact: the root folder (`standards/` or `snippets/`) if present, the toolkit's own authoring source. Otherwise the `.claude/` folder, a target project's installed copy.
26
- 2. Draft the content from the user's description. A standard follows `standard.md` for frontmatter, headings, and structure.
21
+ 1. Resolve the write surface: `standards/` at the root if present, which is the toolkit's own authoring source. Otherwise `.claude/standards/`, a target project's installed copy.
22
+ 2. Draft the content from the user's description. The meta-standard governs frontmatter, headings, and structure.
27
23
  3. Confirm the slug and full content with the user before writing
28
24
  4. Write the file to `<surface>/<slug>.md`
29
25
 
@@ -31,5 +27,5 @@ Read a standard from `${CLAUDE_SKILL_DIR}/../../standards/` instead when the pro
31
27
 
32
28
  Emit the full path on its own line.
33
29
 
34
- - Root surface: this is the toolkit's authoring source. Remind the user to run `bun run check` to regenerate the consumed copy under `.claude/`. For a standard, that pass also regenerates the `standards/index.md` entry, and the user adds a row to the standards table in `.claude/context/standards.md`.
35
- - `.claude/` surface: the file is project-local. `aitk standards sync` and `aitk snippets sync` leave it alone, since sync only updates filenames it recognizes from the toolkit. Remind the user to copy it to the toolkit repo, under `standards/<slug>.md` or `snippets/<category>/<name>.md`, if it should ship to every project.
30
+ - Root surface: this is the toolkit's authoring source. Remind the user to run `bun run check` to regenerate the consumed copy under `.claude/`. That pass also regenerates the `standards/index.md` entry, and the user adds a row to the standards table in `.claude/context/standards.md`.
31
+ - `.claude/` surface: the file is project-local. `aitk standards sync` leaves it alone, since sync only updates filenames it recognizes from the toolkit. Remind the user to copy it to the toolkit repo, under `standards/<slug>.md`, if it should ship to every project.
@@ -0,0 +1,41 @@
1
+ ---
2
+ name: migration-claude-md
3
+ description: Why a bloated CLAUDE.md is rebalanced by proposal rather than by edit, and what the seed baseline settles
4
+ ---
5
+
6
+ # Migration claude md requirement
7
+
8
+ ## Gap
9
+
10
+ Without this skill, a session asked to slim `CLAUDE.md` deletes sections it judges stale and writes the rest into files it creates in the same pass, so a classification the user disagrees with is no longer one command to undo. The file is always-load context, so a wrong move costs every later session rather than one.
11
+
12
+ Three more failures share a cause. The session has no baseline for what belongs in `CLAUDE.md`, so it reads toolkit-seeded always-load behavior as bloat and proposes moving it, and the next seed sync puts it back. A section carrying a rule and a narrative together gets sorted whole into one bucket, which loses half of it either way. And a target that already exists gets written over, since a proposal blind to the folder cannot tell a create from a collision.
13
+
14
+ The skill also writes into `.claude/context/`, a folder `migration-context` moves files into. A proposal drafted before those moves land cannot see the entries they create, so a move that should have resolved to an append reads as a create.
15
+
16
+ ## Must
17
+
18
+ - Classify every `##` section against the three tiers in a fixed order, so the same section lands the same way twice
19
+ - Treat a section matching the seed baseline as always-load by definition and propose no move for it
20
+ - Read the existing rules and context folders before resolving a target, so an existing entry resolves to an append and a taken rule slot resolves to a conflict
21
+ - Derive a rule's glob from the scope the section names rather than from the folder it describes
22
+ - Propose and stop, leaving every file write and the `CLAUDE.md` edit to the user
23
+ - Report the already-lean case as a pass rather than manufacturing moves to justify the run
24
+
25
+ ## Must not
26
+
27
+ - Sort a section holding both a rule and a narrative into either bucket. Flag it for a manual split.
28
+ - Create a rule file, create a context entry, or edit `CLAUDE.md`
29
+ - Propose a move onto an existing rule path. Report it as a conflict and skip it.
30
+
31
+ ## Guards
32
+
33
+ - No `CLAUDE.md` at the project root stops before any classification runs
34
+ - Fewer than three `##` sections reports the file already lean, since a rebalance needs something to rebalance
35
+
36
+ ## Out of scope
37
+
38
+ - Relocating `docs/` files, which `migration-context` proposes into this same `.claude/context/` folder. Run that skill first when both apply, so Step 3 reads a folder its moves have already populated.
39
+ - Relocating root `standards/` and `snippets/`: `migration-standards`
40
+ - Scaffolding the rule files it proposes, which `create-rule` does with the numbering and frontmatter
41
+ - Regenerating `.claude/context/index.md`, which `aitk indexes regen` does once the user has applied the moves
@@ -0,0 +1,38 @@
1
+ ---
2
+ name: migration-standards
3
+ description: Why the root-to-.claude relocation ships as git mv commands the user runs, and which inbound references are worth fixing
4
+ ---
5
+
6
+ # Migration standards requirement
7
+
8
+ ## Gap
9
+
10
+ Without this skill, a project whose rules cite `.claude/standards/` while the files sit at the root gets fixed by hand, and the hand fix loses what version control was holding. A plain `mv` breaks the rename chain, so every relocated standard reads as a delete beside an unrelated add and its history stops at the move.
11
+
12
+ Three failures follow from acting without looking first. A move onto an existing `.claude/standards/` copy overwrites the files already installed there, which is the case the relocation was supposed to be unnecessary for. A `git mv` on a dirty tree lands the relocation in the same commit as unrelated work, so neither can be reviewed or reverted alone. And a session that rewrites every inbound reference spends its effort on toolkit-owned rules and skills, which the next sync overwrites, while the author-owned lines that actually break go unmentioned.
13
+
14
+ ## Must
15
+
16
+ - Detect an existing copy under `.claude/` and skip that folder's move rather than merging into it
17
+ - Read the working tree state and require it clean before the moves, since the relocation has to be revertible on its own
18
+ - Propose `git mv` so history follows each file
19
+ - Report author-owned inbound references as TODO lines the user fixes, and leave the reference itself untouched
20
+ - Name the re-sync commands that reinstall toolkit-owned content at the new path, since the move alone leaves the install stale
21
+ - Report the already-relocated case as a pass
22
+
23
+ ## Must not
24
+
25
+ - Run the moves, or edit `CLAUDE.md`, a rule file, or a doc
26
+ - Surface references inside toolkit-owned rules and skills, which the next sync rewrites anyway
27
+
28
+ ## Guards
29
+
30
+ - Neither root `standards/` nor root `snippets/` present stops, since there is nothing to relocate
31
+ - A directory that is not a git work tree stops, since `git mv` needs version control and a plain move is the failure the skill exists to prevent
32
+
33
+ ## Out of scope
34
+
35
+ - Classifying `CLAUDE.md` sections into the three-tier model: `migration-claude-md`
36
+ - Relocating `docs/` files by audience: `migration-context`
37
+ - Running the re-sync, which the user does after applying the moves
38
+ - What each sync command overwrites once it runs: `toolkit-cli`
@@ -0,0 +1,42 @@
1
+ ---
2
+ name: project-commands
3
+ description: Why running a documented command stops at the report, and what a single-file read buys over framework inference
4
+ ---
5
+
6
+ # Project commands requirement
7
+
8
+ ## Gap
9
+
10
+ Without this skill, a session asked to start the app infers a command from a framework it recognizes or a script name it likes the look of, and a project whose dev loop differs from the convention gets the convention anyway. The user cannot see it was a guess, because a guess and a read produce the same first line.
11
+
12
+ The larger failure is the one past the launch. A session that starts a server keeps going into log reading, browser checks, and defects it noticed on the way, so a request that was one command becomes an open-ended investigation nobody asked for and the answer arrives buried. A request covering a frontend and a backend gets one of the two, which reports success on half an app.
13
+
14
+ Two more failures are mechanical. A command that stays up run in the foreground blocks until the tool timeout, which reports as a service that never came up while nothing is left running. And a command whose effect outlives the process, such as a deploy or a migration, is not undone by stopping it, so running it to see what happens is not available.
15
+
16
+ ## Must
17
+
18
+ - Read the documented dev loop and treat it as the only source, since a second file is a discovery chain and this skill has none
19
+ - Match the request against the stated purpose rather than the command name, since a project documenting two similar commands means the distinction
20
+ - Resolve every documented command the request covers, not the first one that matches
21
+ - Background a command that stays up, and read its output back before checking anything against it
22
+ - Report the port, URL, or exit status per command, then end the turn
23
+
24
+ ## Must not
25
+
26
+ - Infer a command from a filename, a framework, or a second file
27
+ - Stop, restart, or reconfigure a process the skill did not start, or tear down one it did
28
+ - Continue past the report into a second check, a screenshot, or a defect report. Say in one line that one looks warranted and let the user decide.
29
+ - Abandon the remaining commands when one fails
30
+
31
+ ## Guards
32
+
33
+ - No documented dev loop stops by naming the missing file, since a reconstruction the user cannot see through is worse than a stop
34
+ - A request matching nothing documented lists what is documented instead of inferring
35
+ - A command whose effect outlives the process prints for the user to run rather than running, judged on the effect rather than the name
36
+
37
+ ## Out of scope
38
+
39
+ - Confirming a change works in the running app, which is a verification request and needs the steps this skill refuses
40
+ - Deploying, publishing, releasing, migrating, and resetting
41
+ - Running the scaffold verification chain against `package.json` scripts: `setup-verify`
42
+ - Writing the entry it reads, which belongs to the project's own development docs
@@ -0,0 +1,38 @@
1
+ ---
2
+ name: session-resume
3
+ description: Why resuming reads an index before task files, resolves scratch at the main root, and never mutates what it reports
4
+ ---
5
+
6
+ # Session resume requirement
7
+
8
+ ## Gap
9
+
10
+ Without this skill, a session picking up old work reconstructs state from the git log, which records what shipped and not what is queued, so finished work reads as pending and the actual next item goes unmentioned. The alternative failure is worse for a different reason. A session that reads every task file and every plan to be thorough spends the context the work needs before the work starts, and the summary arrives in a session with no room left to act on it.
11
+
12
+ From a linked worktree the shared scratch folders resolve against the worktree rather than the main root, where they are empty. That reports no tracked work on a repository carrying a full backlog, and the report is indistinguishable from the true empty case.
13
+
14
+ A resume is a read, and a session that treats it as a cleanup pass offers to archive finished entries or refresh a memory it decided was stale. Both change tracked state on the strength of a summary the user has not confirmed yet.
15
+
16
+ ## Must
17
+
18
+ - Resolve the plans, memory, and tasks folders at the main worktree root
19
+ - Read the task index before any individual task file, and open only the task files the summary needs
20
+ - Preserve the index's order in the report, since the order is the priority
21
+ - Surface only the memory entries that inform the top item
22
+ - Close with one recommendation naming the first item and whether a plan backs it
23
+
24
+ ## Must not
25
+
26
+ - Read the whole tasks folder to build a summary
27
+ - Offer to remove, archive, or reorder an entry. Resume reports and does not mutate.
28
+ - Update memory, which changes when a recorded fact becomes wrong rather than on a resume
29
+
30
+ ## Guards
31
+
32
+ - All three surfaces absent or empty reports no tracked work and stops, rather than inventing a next step from the repository
33
+
34
+ ## Out of scope
35
+
36
+ - Archiving a shipped task out of the folder: `claude-tasks`
37
+ - Archiving a plan and marking an outcome, which `claude-docs` does when the work ships
38
+ - Implementing the item it recommends, which is the next request rather than part of this one
@@ -0,0 +1,42 @@
1
+ ---
2
+ name: setup-indexes
3
+ description: Why index bootstrap is all-or-nothing per folder, what the confirmation loop protects, and why the convention block is pasted rather than written
4
+ ---
5
+
6
+ # Setup indexes requirement
7
+
8
+ ## Gap
9
+
10
+ Without this skill, a session bootstrapping the index system writes `index.md` into a folder and leaves the sibling frontmatter for later, so the first regen hard-errors on the first file missing a `title`. Partial coverage is not a partial success. The folder is broken until every sibling carries both fields, and the error surfaces at regen rather than at the write that caused it.
11
+
12
+ The scan is where the other failures start. A walk that does not prune reaches `node_modules`, gitignored output, and the snippets folder, which is invoked by reference rather than browsed and needs neither an index nor per-file frontmatter. A folder that already carries an `index.md` gets a second one written over the first.
13
+
14
+ Drafted frontmatter is a proposal, and a session that writes it before the user sees it turns a review into a cleanup. The convention block has the mirror failure. A session that paraphrases it into `CLAUDE.md` produces a copy that reads correctly and no longer matches its source, so the two drift with nothing reporting it. And a project with no `CLAUDE.md` gets one scaffolded to hold the block, which installs a file the project declined.
15
+
16
+ ## Must
17
+
18
+ - Bootstrap all-or-nothing per chosen folder, since a folder carrying partial frontmatter hard-errors on regen
19
+ - Prune the scan to folders a reader browses, and skip any folder already carrying an `index.md`
20
+ - Surface every drafted `title` and `description` for the user to accept, edit, or reject before anything is written
21
+ - Validate with a dry run and stop on the first reported error, before writing for real
22
+ - Paste the convention block verbatim from its single source
23
+ - Emit the closeout exactly once, whatever the seed step concluded
24
+
25
+ ## Must not
26
+
27
+ - Write a draft the user has not confirmed
28
+ - Index the snippets folder, which is read by reference rather than browsed
29
+ - Create `CLAUDE.md` to hold the convention block. Name the skip and the command that installs the file.
30
+ - Overwrite content below the frontmatter block, or touch a file the user rejected
31
+
32
+ ## Guards
33
+
34
+ - A folder with fewer than the sibling threshold stays out of the candidate list unless the user names it explicitly, so the scan proposes and the user overrides
35
+ - A `CLAUDE.md` already carrying the convention section skips the seed silently rather than appending a second copy
36
+
37
+ ## Out of scope
38
+
39
+ - Regenerating an index in a project that already runs the system, which `aitk indexes regen` does on its own
40
+ - Wiring the lint-staged entry or the hook, which the closeout offers and the user opts into
41
+ - Installing governance rules or scaffolding a project: `setup-gov` and `setup-init`
42
+ - Writing the frontmatter conventions themselves, which the prose standard owns
@@ -0,0 +1,42 @@
1
+ ---
2
+ name: setup-plugins
3
+ description: Why plugin installs read a curated catalog, install user-scoped, and never touch toolkit workflow skills
4
+ ---
5
+
6
+ # Setup plugins requirement
7
+
8
+ ## Gap
9
+
10
+ Without this skill, a session asked to install plugins invents marketplace sources and install strings from names it half remembers, and a plugin name that does not exist fails in a way that reads like a network problem. The catalog is the difference between an install and a guess.
11
+
12
+ Scope is the failure that shows up later. A domain plugin installed into one project is missing from the next one, so the machine looks provisioned until the user opens another repository. The mirror mistake is treating toolkit workflow skills as plugins to install, when they load live through a plugin directory and a copied version goes stale the moment it lands.
13
+
14
+ Two failures come from running the batch carelessly. A reinstall over a plugin already present costs time and can replace a working version. And a batch that aborts on the first failure leaves a partial install with no record of which rows ran, so the next attempt starts from an unknown state.
15
+
16
+ ## Must
17
+
18
+ - Read the curated catalog through the skill's own directory, so the path resolves from any project
19
+ - Detect what is already installed and skip those rows
20
+ - Install user-scoped, since a domain plugin belongs to the machine rather than to one project
21
+ - Run each install independently so one failure does not abort the batch
22
+ - Preview the chosen rows, the scope, and the exact commands before executing
23
+ - Report the failures with their CLI errors, the reload requirement, and the settings-level remedy for an over-triggering plugin
24
+
25
+ ## Must not
26
+
27
+ - Install a plugin, marketplace, or command string that is not in the catalog
28
+ - Install toolkit workflow skills, which load live rather than being copied
29
+ - Reinstall a plugin already present
30
+ - Pause for a confirmation beyond the tool permission dialog
31
+
32
+ ## Guards
33
+
34
+ - The `claude` CLI absent from PATH stops before any install, since every step shells out to it
35
+ - A catalog row that installs outside the plugin CLI runs its own installer verbatim rather than being forced through the marketplace path
36
+
37
+ ## Out of scope
38
+
39
+ - Curating the catalog, which is an edit to the bundled reference rather than a run of this skill
40
+ - Uninstalling, since an over-triggering plugin is tuned through settings rather than removed
41
+ - Installing anything into a project, which every setup skill but this one does
42
+ - First-time project scaffolding: `setup-init`
@@ -0,0 +1,39 @@
1
+ ---
2
+ name: setup-verify
3
+ description: Why a fresh scaffold is checked with declared leaf scripts in a fixed order, and what the excluded stages would cost
4
+ ---
5
+
6
+ # Setup verify requirement
7
+
8
+ ## Gap
9
+
10
+ Without this skill, a freshly scaffolded project is handed over on the strength of the configs looking right, and the first typo surfaces when the user runs something. A scaffold is generated from a reference, so the errors it carries are wiring mistakes and missing dependencies, both of which any script run would have caught.
11
+
12
+ The naive check fails two ways. A session that assumes script names runs `test` against a stack that exposes `test:run`, or invents a fallback command when a script is absent, and either result reports on something the project never declared. A session that runs a composite script gets one failure covering several stages, so the output names the wrapper rather than the break.
13
+
14
+ The stages left out are the ones that lie. A dev server or a preview reads as failed when it starts slowly, a browser test needs an install and a running server before it can even fail correctly, and a CI workflow cannot be judged locally at all. Including any of them turns a scaffold check into a flaky one, and a flaky check gets ignored.
15
+
16
+ ## Must
17
+
18
+ - Read the scripts the project declares and run only those
19
+ - Run leaf scripts in a fixed order, so a failure points at the exact stage that broke
20
+ - Stop at the first failure and surface its output rather than continuing to collect more
21
+ - Report per script and close with one summary line naming the failing stage when there is one
22
+
23
+ ## Must not
24
+
25
+ - Invent a fallback command for an absent script. Skip it.
26
+ - Run a composite script, which hides which stage broke
27
+ - Run a dev server, a preview, or a browser test
28
+
29
+ ## Guards
30
+
31
+ - No `package.json` at the project root stops, since there are no declared scripts to read
32
+ - A missing dependency folder installs first rather than letting every script fail on the same cause
33
+
34
+ ## Out of scope
35
+
36
+ - Dev and preview smoke tests, which `project-commands` starts on request
37
+ - Browser end-to-end tests, which need a browser install and a running server
38
+ - CI workflow validation, which runs on the pull request rather than locally
39
+ - Generating the configs it checks, which the tooling stack reference owns
@@ -0,0 +1,41 @@
1
+ ---
2
+ name: systematic-debugging
3
+ description: Why a fix is blocked until investigation completes, and what the three-attempt stop is measuring
4
+ ---
5
+
6
+ # Systematic debugging requirement
7
+
8
+ ## Gap
9
+
10
+ Without this skill, a session handed a failure proposes a fix from the first plausible reading of the error, and the fix is judged by whether the symptom moved. A symptom that moves is the normal result of changing something near it, so the session reports success and the cause is still there.
11
+
12
+ The compounding failures come next. Several changes go in at once, so a pass says nothing about which one mattered. A fix that fails gets another fix stacked on top of it rather than a new hypothesis, and the code accumulates changes nobody can trace to a reason. A bad value gets corrected where it was observed rather than where it was produced, which moves the failure downstream instead of removing it.
13
+
14
+ Two failures are about stopping rather than about fixing. A session that never counts its attempts keeps fixing through the pattern where each fix reveals a problem elsewhere, which is architectural and cannot be reached from inside the loop. And a session that concludes an issue is environmental usually has an incomplete investigation rather than an environmental issue, because that conclusion is available at any point and is never contradicted by evidence.
15
+
16
+ ## Must
17
+
18
+ - Complete the investigation before any fix is proposed, reading the failure in full and reproducing it
19
+ - Trace a bad value back to where it was produced and fix there
20
+ - Compare the broken code against working code in the same codebase before hypothesizing
21
+ - State one hypothesis and change one variable to test it
22
+ - Write the failing test before the fix, so the fix is judged against a reproduction rather than against the symptom
23
+ - Stop after three failed attempts and hand the architectural question to the user
24
+
25
+ ## Must not
26
+
27
+ - Stack a second fix on a failed one rather than forming a new hypothesis
28
+ - Bundle a refactor or an unrelated improvement into the fix
29
+ - Accept an environmental or timing conclusion before the investigation is exhausted
30
+ - Claim an understanding it does not have
31
+
32
+ ## Guards
33
+
34
+ - An incomplete investigation blocks the fix proposal, which is the skill's one refusal and the reason it exists
35
+ - Three failed attempts stop the loop, since the pattern is evidence about the design rather than about the bug
36
+
37
+ ## Out of scope
38
+
39
+ - A typo fix and a cause already agreed on, where the phases cost more than they return
40
+ - Reviewing a change for defects it has not yet exhibited: `claude-review`
41
+ - Deciding whether the architecture should change, which the three-attempt stop hands to the user rather than answering
@@ -0,0 +1,37 @@
1
+ ---
2
+ name: toolkit-cli
3
+ description: Why the overwrite contract is stated before a sync runs, and why the skill reads rather than executes
4
+ ---
5
+
6
+ # Toolkit cli requirement
7
+
8
+ ## Gap
9
+
10
+ Without this skill, a session runs an `aitk` sync and finds out afterward what it did. The command names give nothing away. `install` and `sync` differ per domain, some surfaces overwrite unconditionally, some merge, some are written once and never touched again, and none of that is visible from the command line the user typed.
11
+
12
+ The damage lands on the files a project owns. A golden config carrying local edits is replaced without a warning anyone saw, and a standards install overwrites every standard in a project that only needed the two it had drifted on. The user learns which category a file was in by losing the edit.
13
+
14
+ The inverse failure is quieter. A session that assumes a sync will pick up a change edits a seed and waits for an update that never comes, because the seed is copy-once and no sync command writes it again. Both failures are one missing fact available before the command runs.
15
+
16
+ ## Must
17
+
18
+ - State per surface and per command whether an existing file is overwritten, merged, written once, or left alone
19
+ - Warn about a destructive run before it happens, naming the surface that will be lost
20
+ - Name the section-preserving path for a standard or seed the project has customized
21
+ - Defer to the toolkit's own context docs when they and this summary disagree, since the summary is a copy and they are the source
22
+
23
+ ## Must not
24
+
25
+ - Run any `aitk` command. The skill is read before acting.
26
+ - Restate the full semantics. It is a target-session summary and the detail lives with its owner.
27
+
28
+ ## Guards
29
+
30
+ - A surface or command the contract does not cover routes to the context docs rather than to an inference from a similar row
31
+
32
+ ## Out of scope
33
+
34
+ - Executing the sync, which the user runs or `toolkit-operator` routes
35
+ - Reconciling a customized seed section by section: `claude-seed-sync`
36
+ - Relocating a project's folders into the layout a newer version expects: `migration-standards`
37
+ - Deciding which stack, rule, or standard a project should install, which the setup skills resolve from live catalogs
@@ -0,0 +1,40 @@
1
+ ---
2
+ name: toolkit-feedback
3
+ description: Why a toolkit defect is reported from session context alone, and what shipping through the CLI replaces
4
+ ---
5
+
6
+ # Toolkit feedback requirement
7
+
8
+ ## Gap
9
+
10
+ Without this skill, a toolkit defect noticed inside a target project dies with the session. The user is told to mention it in the toolkit repository later, which means retyping a report they no longer have the context to write, so the defect is either reported badly or not at all.
11
+
12
+ The report itself fails two ways. A block printed in chat needs a copy-paste into another repository, and a step that manual is skipped under any time pressure. A report that names no surface cannot be routed, because the toolkit acts on a plugin skill, a snippet, a CLI command, and a seed through different paths, and the difference is not recoverable from the symptom.
13
+
14
+ The last failure is the session's own effort. Asked to report, a session starts diagnosing instead, searching the toolkit and reading its surfaces to find the cause. That spends the context the report was meant to capture cheaply, and it produces a diagnosis from a project that cannot see the toolkit's current source.
15
+
16
+ ## Must
17
+
18
+ - Build the report from what the session already holds
19
+ - Name the surface and its type, since the toolkit routes on that rather than on the symptom
20
+ - Write the stated fallback for a field the session cannot fill, so an empty field reads as absent rather than as unreported
21
+ - Ship through the CLI so the report lands without a copy-paste, and print the returned path on its own line
22
+ - Offer the durable route for a report worth keeping across sessions and machines
23
+ - Fall back to printing the block when the CLI is absent, so the report still exists
24
+
25
+ ## Must not
26
+
27
+ - Probe the project, list files, grep, or read toolkit surfaces to enrich the report
28
+ - Guess the surface type when the session is ambiguous. Ask one line.
29
+ - Diagnose or fix, which needs the toolkit's source rather than the target's
30
+
31
+ ## Guards
32
+
33
+ - Nothing in session context pointing at a toolkit issue stops, since a report assembled from nothing wastes the triage it reaches
34
+
35
+ ## Out of scope
36
+
37
+ - Fixing the defect, which happens in the toolkit repository against its own source
38
+ - Draining the queue this fills: `toolkit-triage`
39
+ - Filing an issue against the current project: `git-issue`
40
+ - Complaints about tooling the toolkit does not own
@@ -0,0 +1,39 @@
1
+ ---
2
+ name: toolkit-operator
3
+ description: Why the toolkit has one front door, what orienting on live catalogs prevents, and where it hands off
4
+ ---
5
+
6
+ # Toolkit operator requirement
7
+
8
+ ## Gap
9
+
10
+ Without this skill, using the toolkit means knowing which skill to pick, and the user who most needs it is the one who cannot. A plain-language intent has no obvious owner among a dozen setup and sync skills, so the session guesses a command instead of resolving one, and a wrong guess installs into a project rather than reporting a mismatch.
11
+
12
+ Two failures come from acting on memory. A session that names a stack, rule, or snippet from what it remembers rather than from the live catalog runs against an entry that has been renamed or removed. And a session that edits a managed file by hand produces a change the next sync overwrites, which reads as the toolkit undoing work rather than as the edit having been made in the wrong place.
13
+
14
+ The last failure is duplication. A front door that answers everything itself reimplements first-time detection and seed diffing inline, badly, beside the skills that already do both. The value of a router is that it stops at the handoff.
15
+
16
+ ## Must
17
+
18
+ - Orient on the toolkit's own docs and the live catalogs before acting
19
+ - Map the stated intent to one lifecycle phase, then either run the simplest command that satisfies it or hand off
20
+ - Resolve every stack, rule, snippet, and standard name from a catalog at runtime
21
+ - Run the CLI non-interactively and report the command run, what changed, and the full path of anything written
22
+
23
+ ## Must not
24
+
25
+ - Edit a managed file by hand instead of running the CLI that owns it
26
+ - Reimplement a flow another skill owns
27
+ - Hardcode a catalog name
28
+ - Auto-trigger. It is a door the user opens, and a router that fires on its own routes requests nobody made.
29
+
30
+ ## Guards
31
+
32
+ - An intent matching a deep flow hands off rather than running a shallow version of it, since a partial scaffold is harder to recover from than none
33
+
34
+ ## Out of scope
35
+
36
+ - First-time scaffold of a fresh project: `setup-init`
37
+ - Seed and preamble drift in installed files: `claude-seed-sync`
38
+ - Governance rule install and index bootstrap: `setup-gov` and `setup-indexes`
39
+ - What a given sync overwrites once it runs: `toolkit-cli`
@@ -0,0 +1,40 @@
1
+ ---
2
+ name: toolkit-triage
3
+ description: Why the feedback queue is read from GitHub rather than local scratch, and why triage routes instead of implementing
4
+ ---
5
+
6
+ # Toolkit triage requirement
7
+
8
+ ## Gap
9
+
10
+ Without this skill, the feedback queue fills and nothing drains it. Reports arrive from projects the toolkit never sees, and a queue nobody reads on a schedule is the same as no queue. The local review folder looks like the right place to read, and it is the wrong one, because that content is per-machine session scratch that any cleanup removes.
11
+
12
+ Triage fails three ways once it starts. Unrelated issues get batched into one branch, so review has to judge several unconnected changes at once and can approve none of them cleanly. An issue needing a plan gets implemented inline from a paragraph of description, which skips the step where scope is argued. And an issue whose report contradicts itself gets a guess rather than a question, so the fix addresses a defect nobody confirmed.
13
+
14
+ The queue also fails to drain even when the work ships. A fix merged with no link back leaves its issue open, and the next triage re-reads work already done.
15
+
16
+ ## Must
17
+
18
+ - Read the durable queue rather than local session scratch
19
+ - Classify each issue in a fixed order and stop at the first match, stating the class and its one-line reason before routing
20
+ - Route to the skills that own planning, branch naming, and the pull request body rather than restating them
21
+ - Keep one issue to one branch and one pull request
22
+ - Link a fix to its issue so merge closes it, and preserve that link when the body is regenerated
23
+ - Ask on the issue when the report is unreadable, then move on rather than blocking the batch
24
+
25
+ ## Must not
26
+
27
+ - Batch unrelated fixes into one branch
28
+ - Implement a plan-worthy issue, which stops at the plan handed back to the user
29
+ - Close an issue whose pull request has yet to merge
30
+
31
+ ## Guards
32
+
33
+ - The `gh` CLI absent or unauthenticated stops, since the queue is unreachable
34
+ - An empty queue reports nothing open rather than widening the label to find work
35
+
36
+ ## Out of scope
37
+
38
+ - Filing new feedback: `toolkit-feedback`
39
+ - Writing the plan a plan-worthy issue needs: `claude-feature`
40
+ - Triage of issues carrying any other label, which surface here by design only under the feedback label
@@ -0,0 +1,38 @@
1
+ ---
2
+ name: youtube-transcripts
3
+ description: Why the transcript fetch stays in the CLI, and why fetching stops short of reading
4
+ ---
5
+
6
+ # Youtube transcripts requirement
7
+
8
+ ## Gap
9
+
10
+ Without this skill, a pasted video link turns into captions printed in chat, which persist nowhere and cannot be cited by a later session. The file is the point. A transcript saved with its metadata is context the repository holds, and a transcript in a message is context that ends with the turn.
11
+
12
+ A session that fetches on its own gets the shape wrong. Raw captions carry timing cues and duplicated lines, and a file written without frontmatter has no title, no source URL, and no way to tell which video it came from. Reimplementing the cleanup also duplicates logic the CLI already owns, so the two drift and the drift shows up as inconsistent files rather than as an error.
13
+
14
+ Two smaller failures follow the fetch. A video with no captions produces a file that looks empty rather than one reported as having none, so the user reads it as a failed fetch. And a session that summarizes what it fetched answers a question nobody asked, spending context on a reading the user may not want yet.
15
+
16
+ ## Must
17
+
18
+ - Run the CLI, which owns the fetch, the caption cleanup, and the frontmatter
19
+ - Surface the written path as a full relative path so the terminal makes it clickable
20
+ - Report a video with no captions as a fact about the video, since the file still exists and carries its metadata
21
+ - Name the missing external binary and stop, leaving the install to the user
22
+
23
+ ## Must not
24
+
25
+ - Reimplement the fetch or the cleanup
26
+ - Summarize or annotate the transcript unasked, which is a separate request against the file
27
+ - Install the external binary the command shells out to
28
+
29
+ ## Guards
30
+
31
+ - No URL stops, since there is nothing to fetch
32
+ - A link that is not a YouTube URL stops rather than attempting a generic fetch the command cannot do
33
+
34
+ ## Out of scope
35
+
36
+ - Downloading the video or its audio
37
+ - Summarizing a transcript already on disk, which is a read of that file
38
+ - Choosing where transcripts live, which the command defaults and a flag overrides
package/docs/agents.md CHANGED
@@ -466,10 +466,11 @@ one malformed file cannot hide the rest of the catalog. `--names` emits skill
466
466
  names one per line.
467
467
 
468
468
  Each entry also carries `requirement`, whether the folder holds a sibling
469
- `REQUIREMENT.md`. Coverage of that file is selective by design, so a `false` is
470
- not a gap to close and the flag answers which skills carry one without a caller
471
- listing the directory itself. It says nothing about why, which is a judgment the
472
- toolkit records against its own corpus rather than in the catalog.
469
+ `REQUIREMENT.md`. Every skill is meant to carry one, so a `false` is a gap to
470
+ close rather than a recorded exemption, and the flag answers which skills are
471
+ missing theirs without a caller listing the directory itself. Nothing gates the
472
+ rule yet, which is why the flag is worth reading against the shipped corpus after
473
+ a merge.
473
474
 
474
475
  ## Non-interactive examples
475
476
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@erclx/aitk",
3
3
  "type": "module",
4
- "version": "0.38.0",
4
+ "version": "0.39.0",
5
5
  "description": "Infrastructure and quality tooling for developer workflows",
6
6
  "license": "MIT",
7
7
  "bin": {
@@ -296,6 +296,10 @@ inject_changed_skills() {
296
296
  [ -z "$combined" ] && return
297
297
 
298
298
  while IFS= read -r skill_path; do
299
+ # The diff against main lists a deleted skill alongside a changed one, and
300
+ # there is nothing left to inject for a name this branch removed.
301
+ [ -f "$PROJECT_ROOT/$skill_path" ] || continue
302
+
299
303
  local skill_name
300
304
  skill_name=$(basename "$(dirname "$skill_path")")
301
305
  local target_dir="$SANDBOX/.claude/skills/$skill_name"
@@ -70,7 +70,7 @@ export function listSkills(root: string): string[] {
70
70
  * Maps a scenario to the skill it drives, trying two spellings in order.
71
71
  *
72
72
  * `<category>-<command>` is the rule `.claude/context/sandbox/coverage.md` states, and it
73
- * alone pairs 29 of 55 skills. The bare `<command>` fallback is what reaches the
73
+ * alone pairs 29 of 54 skills. The bare `<command>` fallback is what reaches the
74
74
  * rest: `claude/setup-init.sh` drives the `setup-init` skill, not a
75
75
  * `claude-setup-init` that does not exist. Stating one spelling and shipping two
76
76
  * is what let the audit report a paired skill as unpaired.
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  title: Snippet reference
3
3
  description: Snippet reference and authoring conventions
4
- consumers: create-standard
4
+ consumers: create-snippet
5
5
  ---
6
6
 
7
7
  # Snippet reference
@@ -11,7 +11,7 @@ Skills give Claude Code domain-specific constraints and rules inline, so it can
11
11
 
12
12
  ## Scope
13
13
 
14
- Governs a skill folder under `skills/` as one artifact: `SKILL.md`, its optional sibling `REQUIREMENT.md`, and the bundled reference, script, and asset folders beside them.
14
+ Governs a skill folder under `skills/` as one artifact: `SKILL.md`, its sibling `REQUIREMENT.md`, and the bundled reference, script, and asset folders beside them.
15
15
 
16
16
  Does not govern:
17
17
 
@@ -68,14 +68,14 @@ allowed-tools: <tools required>
68
68
 
69
69
  ## Structure
70
70
 
71
- - Skill is a folder named in kebab-case containing `SKILL.md` (required), `REQUIREMENT.md` (optional), `scripts/` (optional), `references/` (optional), `assets/` (optional)
71
+ - Skill is a folder named in kebab-case containing `SKILL.md` (required), `REQUIREMENT.md` (required), `scripts/` (optional), `references/` (optional), `assets/` (optional)
72
72
  - `SKILL.md` must start with YAML frontmatter between `---` delimiters
73
73
  - No `README.md` inside the skill folder
74
74
  - No spaces, capitals, or underscores in folder or skill name
75
75
 
76
76
  ## Requirement
77
77
 
78
- `REQUIREMENT.md` states what a skill is for, so a proposed change can be argued against something. This standard governs shape across the corpus and the requirement governs scope for one skill. Claude Code loads `SKILL.md` as the entry and ignores the sibling, so the file costs a target session nothing.
78
+ `REQUIREMENT.md` states what a skill is for, so a proposed change can be argued against something and the corpus can be read to decide whether a skill should exist at all. This standard governs shape across the corpus and the requirement governs scope and behavior for one skill. Claude Code loads `SKILL.md` as the entry and ignores the sibling, so the file costs a target session nothing.
79
79
 
80
80
  The file serves a second purpose beside the argument. A skill body is procedural by design, so what the skill is for sits spread across its steps rather than stated in one place. The requirement is the compressed statement a reader gets before opening the body, and that purpose holds whether or not the skill's scope is contested.
81
81
 
@@ -83,7 +83,7 @@ Read it before editing the skill. When a change closes no gap the requirement st
83
83
 
84
84
  Write the gaps from what the skill is for, then compare the body against them. Deriving the requirement from the body is circular, because a requirement reverse-engineered from an overfitted skill records the overfitting as the requirement. That failure costs more under the orientation purpose than under the argument one, since a file summarizing the body misinforms whoever reads it in place of the body rather than merely failing to gate a change.
85
85
 
86
- A skill earns one when a reader cannot recover what the skill is for from the body alone. Apply the test to a skill nobody in the session has read before: read the body once, then state both the failures the skill exists to prevent and the nearest thing it deliberately does not do. A body answering both is its own specification and needs no sibling, and a body leaving either open earns one. Length is a weak proxy for that, since a short skill with a contested boundary earns one and a long skill doing one plain thing may not.
86
+ Every skill carries one. Coverage was selective while the file existed only to disambiguate a contested boundary, and a file present for some skills and absent for others cannot be scanned, because an absence reads as a gap rather than as a verdict. A skill whose scope nobody contests still owes the statement, since the reader deciding whether a skill should exist reads the corpus rather than one entry. A new skill is created with the sibling beside it rather than acquiring one in a later sweep.
87
87
 
88
88
  ### What a working requirement looks like
89
89
 
@@ -1,15 +0,0 @@
1
- ---
2
- name: claude-design-propose
3
- description: Retired. `claude-design-extract` absorbed this skill and now takes the greenfield path itself. Invoke `aitk:claude-design-extract` instead.
4
- disable-model-invocation: true
5
- ---
6
-
7
- # Design propose
8
-
9
- Retired. `claude-design-extract` absorbed the greenfield path, picks it from what the project has, and its description carries every trigger this skill used to route on.
10
-
11
- Invoke `aitk:claude-design-extract` instead. It reads `.claude/REQUIREMENTS.md` for the `## Personality` paragraph and `.claude/ARCHITECTURE.md` for platform signals when the project has no UI code, which is what this skill did.
12
-
13
- This body exists so a project that installed the plugin before the merge keeps resolving the old name for one sync cycle. It ships in `0.18.0` and is removed in `0.19.0`.
14
-
15
- `scripts/sandbox/claude/design-propose.sh` goes at the same time, but its fixture does not. That scenario is the only greenfield coverage the survivor has, so `0.19.0` folds it into `scripts/sandbox/claude/design-extract.sh` as a second arm rather than deleting it. Removing the file outright drops the greenfield path from the catalog.