@erclx/canon 5.73.0 → 5.75.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 (87) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/claude/.claude-plugin/plugin.json +1 -1
  3. package/claude/skills/api-design/references/adopted.md +5 -3
  4. package/claude/skills/build-in-slices/references/adopted.md +4 -2
  5. package/claude/skills/code-craft/references/adopted.md +9 -7
  6. package/claude/skills/codebase-layout/references/adopted.md +8 -6
  7. package/claude/skills/create-rule/SKILL.md +5 -1
  8. package/claude/skills/create-rule/references/ledger.md +73 -0
  9. package/claude/skills/create-rule/references/rule.md +1 -1
  10. package/claude/skills/create-skill/references/skill-practice.md +6 -1
  11. package/claude/skills/deprecation-migration/references/adopted.md +5 -3
  12. package/claude/skills/design-pick/references/board.md +2 -2
  13. package/claude/skills/plan-feature/SKILL.md +2 -1
  14. package/claude/skills/plan-groundwork/SKILL.md +2 -0
  15. package/claude/skills/pr-evidence/REQUIREMENT.md +1 -0
  16. package/claude/skills/pr-evidence/SKILL.md +2 -0
  17. package/claude/skills/pr-evidence/references/evidence.md +11 -4
  18. package/claude/skills/pr-evidence/references/reel.md +108 -0
  19. package/claude/skills/proposal-critique/REQUIREMENT.md +34 -0
  20. package/claude/skills/proposal-critique/SKILL.md +126 -0
  21. package/claude/skills/proposal-critique/references/adopted.md +44 -0
  22. package/claude/skills/review-craft/references/adopted.md +4 -4
  23. package/claude/skills/search-craft/references/adopted.md +9 -7
  24. package/claude/skills/systematic-debugging/references/adopted.md +4 -2
  25. package/claude/skills/teach-craft/references/adopted.md +8 -6
  26. package/claude/skills/test-craft/references/adopted.md +14 -12
  27. package/claude/skills/test-first/SKILL.md +1 -1
  28. package/claude/skills/test-first/references/adopted.md +9 -5
  29. package/claude/skills/ui-film/REQUIREMENT.md +4 -5
  30. package/claude/skills/ui-film/SKILL.md +21 -19
  31. package/claude/skills/ui-film/references/compose-craft.md +2 -2
  32. package/claude/skills/ui-film/references/handoff.md +2 -7
  33. package/claude/skills/write-human/references/adopted.md +8 -3
  34. package/docs/agents/audits.md +24 -24
  35. package/docs/agents/migrate.md +10 -10
  36. package/docs/migrations/by-verb.md +2 -0
  37. package/docs/target/index.md +1 -0
  38. package/docs/target/outside-tools.md +39 -0
  39. package/docs/workflow/skill-map.md +1 -0
  40. package/governance/detect.toml +4 -0
  41. package/governance/ledger/claude/rule.md +16 -0
  42. package/governance/ledger/skills/build-in-slices/SKILL.md +55 -0
  43. package/governance/ledger/skills/proposal-critique/SKILL.md +66 -0
  44. package/governance/ledger/skills/search-craft/SKILL.md +54 -0
  45. package/governance/ledger/skills/systematic-debugging/SKILL.md +64 -0
  46. package/governance/ledger/skills/test-first/SKILL.md +28 -0
  47. package/governance/ledger/skills/write-human/SKILL.md +62 -0
  48. package/governance/ledger/skills/write-human/density.md +36 -0
  49. package/governance/ledger/skills/write-human/machine-tells.md +30 -0
  50. package/governance/rules/claude/rule.md +13 -0
  51. package/package.json +1 -1
  52. package/scripts/ci/docs-only.sh +24 -0
  53. package/scripts/ci/refresh-frames-pr.sh +11 -12
  54. package/src/audits/catalog.ts +7 -2
  55. package/src/capture/stamp.ts +3 -5
  56. package/src/claude/cases/misc.ts +14 -0
  57. package/src/claude/skills-audit.ts +154 -8
  58. package/src/cli/help.ts +1 -1
  59. package/src/commands/claude.ts +6 -2
  60. package/src/commands/gov.ts +12 -7
  61. package/src/commands/migrate.ts +6 -2
  62. package/src/commands/pr.ts +110 -13
  63. package/src/commands/take.ts +36 -7
  64. package/src/counts/catalogs.ts +3 -5
  65. package/src/gate/measures.ts +2 -145
  66. package/src/gate/sequencer.ts +7 -1
  67. package/src/gate/stages.ts +36 -47
  68. package/src/gov/audit.ts +59 -13
  69. package/src/markdown/scope.ts +4 -0
  70. package/src/migrate/session-defaults.ts +114 -4
  71. package/src/pr/checks.ts +75 -3
  72. package/src/pr/evidence.ts +62 -1
  73. package/src/pr/lift.ts +23 -2
  74. package/src/pr/merge.ts +13 -3
  75. package/src/take/encode.ts +9 -1
  76. package/src/take/film.ts +17 -2
  77. package/src/take/fixtures/busy.html +107 -0
  78. package/src/take/perform.ts +99 -25
  79. package/src/take/screencast.ts +4 -3
  80. package/src/take/stepper.ts +33 -20
  81. package/src/targets/pulls.ts +42 -0
  82. package/tooling/claude/reference.md +4 -2
  83. package/tooling/claude/seeds/.claude/hooks/plan-guard.sh +239 -0
  84. package/tooling/claude/seeds/.claude/settings.json +8 -0
  85. package/claude/skills/ui-film/references/pr-clip.md +0 -108
  86. package/scripts/core/regen-hero.ts +0 -113
  87. package/src/capture/frame-values.ts +0 -326
@@ -33,13 +33,8 @@ The track is final. It already carries the easing, the spring, and the hold, so
33
33
 
34
34
  ## Where the composition lives
35
35
 
36
- The HyperFrames project sits in the same workspace as the takes, so one folder holds everything a video is made from.
36
+ The HyperFrames project sits in the same workspace as the takes, so one folder holds everything a video is made from. Create it at `.canon/video/<slug>/composition` with the new-project command the `hyperframes` skill names, run the way that skill says for its install, since a plugin install routes the CLI through its own launcher.
37
37
 
38
- ```bash
39
- bunx -y hyperframes init .canon/video/<slug>/composition
40
- ```
41
-
42
- - Use `bunx` when bun is available, falling back to `npx -y hyperframes init ...` otherwise
43
38
  - Prefix the path with the main worktree root when running from a linked worktree, as `ui-film`'s write scope states
44
39
  - Read each clip from `../takes/<dir>/clip.mp4`, relative to the project, rather than copying it in
45
40
  - Leave renders in the project's `renders/` folder, which `canon records push` skips along with `takes/`, `scratch/`, `snapshots/`, `node_modules/`, and any video file
@@ -68,7 +63,7 @@ Where composing from the main root is not possible, write each file whole throug
68
63
 
69
64
  ## Applying it in a composition
70
65
 
71
- Load `hyperframes-core` for placing the clip and `hyperframes-keyframes` for the wrapper's transform before writing the composition.
66
+ Read the `hyperframes` skill's `references/format.md` for placing the clip and `references/motion.md` for the wrapper's transform before writing the composition.
72
67
 
73
68
  1. Size a stage at 1920x1080 and place the clip inside a non-timed wrapper that fills it, with `transform-origin: 0 0`. Time the video, never the wrapper too.
74
69
  2. Drive the wrapper from the track on the composition's registered timeline, setting `scale(s) translate(-x px, -y px)` at each frame's time from the clip's start.
@@ -12,6 +12,8 @@ Two external writing skills were read as source material for this one.
12
12
 
13
13
  Neither was imported wholesale, and one measurement settles why. Read this before adding a rule from outside this corpus, and extend the position below rather than deriving a second one.
14
14
 
15
+ A source a bullet rests on is linked once, in that bullet's row of the toolkit's per-bullet ledger at `governance/ledger/skills/write-human/`, which ships outside the plugin. This file names those sources without the link and keeps the catalog-level adopted and declined record, linking only a source no row cites.
16
+
15
17
  ## What was adopted
16
18
 
17
19
  Roughly half the pattern catalog had no counterpart in this corpus. Six of those patterns are now in `machine-tells.md`, each a shape rather than a token, which kept it out of a ban list that matches words.
@@ -49,8 +51,11 @@ The source material treats repetition of a noun as a defect. This skill treats i
49
51
 
50
52
  The source material also prefers shorter sentences without bound. This skill measures the spread instead, since a passage of uniformly short sentences is the reported failure rather than the fix for it.
51
53
 
52
- ## The industry-guide record
54
+ ## Where the rows sit
53
55
 
54
- The cadence rules and the bans they pair with trace to three industry style guides, being Google's developer documentation style guide, Microsoft's writing style guide, and Apple's style guide.
56
+ Each bullet and ordered step in the skill body and in `density.md` has its own source row in a ledger outside the plugin, one ledger per file and one row per bullet under the H2 the bullet sits under.
55
57
 
56
- The authoring toolkit keeps the per-rule attributions and the dates each guide was read. No install carries that record, so this file is the position a target reads.
58
+ - The toolkit's skill audit fails a ledgered file whose bullets and rows disagree in count under any heading, and a target never carries the rows
59
+ - The rows cite plain-language guidance, the Google and Microsoft style guides, Nielsen Norman Group, Purdue OWL, and Signs of AI writing, and mark the rest as house choices
60
+ - `machine-tells.md` holds its tells as prose, so its ledger sources each tell in a list rather than a table
61
+ - This record keeps the adopted and declined position above, which no row restates
@@ -63,30 +63,30 @@ An audit that finds no corpus reports `absent`, which moves neither the verdict
63
63
 
64
64
  `canon audits list` reports the first 18 rows. The rows marked `outside` run by hand or from a skill and sit beside the aggregate.
65
65
 
66
- | Id | Verb | Measures | Finding |
67
- | -------------------- | ----------------------------------- | ---------------------------------------------------------------------------------- | -------------- |
68
- | `context` | `canon context audit` | Context folder structure, citations, and the requirements record's word cap | Gates |
69
- | `markdown` | `canon markdown audit` | Bans, dead links, density, and reference shape | Gates |
70
- | `skills` | `canon claude skills audit` | Both skill corpora against the skill standards | Gates |
71
- | `skills-reach` | `canon claude skills reach` | Skill bodies citing a path no target receives | Reports |
72
- | `skills-rank` | `canon claude skills rank` | Whether skill descriptions separate against a routing case corpus | Reports |
73
- | `tasks` | `canon tasks validate` | Board rows nothing resolves | Reports |
74
- | `records-plans` | `canon records validate plans` | Plan records against their shape | Reports |
75
- | `records-groundwork` | `canon records validate groundwork` | Groundwork folders against their shape | Reports |
76
- | `records-intake` | `canon records validate intake` | Intake folders against their shape | Reports |
77
- | `comments` | `canon comments scan` | Comment density by language and kind, and `TODO`, `FIXME`, `HACK`, `XXX` | Reports |
78
- | `test-order` | `canon gov test-order` | Implementations that reached branch history before their test | Reports |
79
- | `secrets` | `canon secrets scan` | Credential-shaped values in the shipped tree | Gates |
80
- | `labels` | `canon labels audit` | Changed paths no row of the label map reaches | Reports |
81
- | `restated` | `canon gov restated` | Instructions `CLAUDE.md` states that a second surface states too | Reports |
82
- | `rules` | `canon gov audit` | Rules past a shape limit, and here rules short of a ledger or out of step with one | Reports |
83
- | `counts` | `canon gov counts` | Sentences stating a closed catalog's size that disagree with the tree | Reports |
84
- | `census` | `canon census` | File count, extension breakdown, and line total | Reports |
85
- | `deps` | `canon deps audit` | Advisories against the resolved dependencies | Reports |
86
- | `outside` | `canon gov citations` | Rule citations and internal frontmatter globs reaching nothing | Gates in check |
87
- | `outside` | `canon gov superseded <old> <new>` | Where the tree still asserts a value a changed convention no longer produces | Reports |
88
- | `outside` | `canon claude skills drift <ref>` | Shipped skill bodies rewritten since a ref | Reports |
89
- | `outside` | `canon claude routing` | Per `CLAUDE.md` section, how many bullets name a path and whether a rule covers it | Reports |
66
+ | Id | Verb | Measures | Finding |
67
+ | -------------------- | ----------------------------------- | ------------------------------------------------------------------------------------------- | -------------- |
68
+ | `context` | `canon context audit` | Context folder structure, citations, and the requirements record's word cap | Gates |
69
+ | `markdown` | `canon markdown audit` | Bans, dead links, density, and reference shape | Gates |
70
+ | `skills` | `canon claude skills audit` | Both skill corpora against the skill standards, and any ledger under `canon/ledger/skills/` | Gates |
71
+ | `skills-reach` | `canon claude skills reach` | Skill bodies citing a path no target receives | Reports |
72
+ | `skills-rank` | `canon claude skills rank` | Whether skill descriptions separate against a routing case corpus | Reports |
73
+ | `tasks` | `canon tasks validate` | Board rows nothing resolves | Reports |
74
+ | `records-plans` | `canon records validate plans` | Plan records against their shape | Reports |
75
+ | `records-groundwork` | `canon records validate groundwork` | Groundwork folders against their shape | Reports |
76
+ | `records-intake` | `canon records validate intake` | Intake folders against their shape | Reports |
77
+ | `comments` | `canon comments scan` | Comment density by language and kind, and `TODO`, `FIXME`, `HACK`, `XXX` | Reports |
78
+ | `test-order` | `canon gov test-order` | Implementations that reached branch history before their test | Reports |
79
+ | `secrets` | `canon secrets scan` | Credential-shaped values in the shipped tree | Gates |
80
+ | `labels` | `canon labels audit` | Changed paths no row of the label map reaches | Reports |
81
+ | `restated` | `canon gov restated` | Instructions `CLAUDE.md` states that a second surface states too | Reports |
82
+ | `rules` | `canon gov audit` | Rules past a shape limit or out of step with a ledger, and here rules short of one | Reports |
83
+ | `counts` | `canon gov counts` | Sentences stating a closed catalog's size that disagree with the tree | Reports |
84
+ | `census` | `canon census` | File count, extension breakdown, and line total | Reports |
85
+ | `deps` | `canon deps audit` | Advisories against the resolved dependencies | Reports |
86
+ | `outside` | `canon gov citations` | Rule citations and internal frontmatter globs reaching nothing | Gates in check |
87
+ | `outside` | `canon gov superseded <old> <new>` | Where the tree still asserts a value a changed convention no longer produces | Reports |
88
+ | `outside` | `canon claude skills drift <ref>` | Shipped skill bodies rewritten since a ref | Reports |
89
+ | `outside` | `canon claude routing` | Per `CLAUDE.md` section, how many bullets name a path and whether a rule covers it | Reports |
90
90
 
91
91
  A deliberate secret takes a `canon-allow-secret: <reason>` marker. A deliberate citation takes `canon-allow-citation: <reason>` and a deliberate superseded value takes `canon-allow-superseded: <reason>`, each on its own line or the one above. Run any verb with `--help` for its flags and refusal reasons.
92
92
 
@@ -21,7 +21,7 @@ kind: reference
21
21
  | `record-layout` | Review receipts, memory archives, feedback, renders, picks, evidence, and the design board into their current folders |
22
22
  | `session-defaults` | The seeded session defaults into an existing `.claude/settings.json`, listed below the table |
23
23
 
24
- `record-tree` follows citations in `diagrams`, `memory`, `plans`, `proposals`, `review`, `tasks`, and `teach`. `session-defaults` denies `Agent`, `Task`, and both merge commands, and turns auto memory off. The bullets below add detail per verb.
24
+ `record-tree` follows citations in `diagrams`, `memory`, `plans`, `proposals`, `review`, `tasks`, and `teach`. `session-defaults` denies `Agent`, `Task`, and both merge commands, turns auto memory off, and wires an installed `plan-guard.sh` into the PreToolUse hooks. The bullets below add detail per verb.
25
25
 
26
26
  - `skill-names` takes no `--scope`, and skips the changelog, eval transcripts, replay fixtures, and the pointer each renamed `draft-` skill leaves at its old name
27
27
  - `surface-roots` moves `context/`, `wireframes/`, `ARCHITECTURE.md`, `REQUIREMENTS.md`, `DESIGN.md`, and the stamp folder, and leaves `rules/`, `skills/`, `hooks/`, and `settings.json` in place
@@ -56,15 +56,15 @@ Three markers keep an old spelling on a line. Each also covers the nearest non-b
56
56
 
57
57
  ## Refusals
58
58
 
59
- | Verb | Refuses when |
60
- | ------------------ | ------------------------------------------------------------------------------------- |
61
- | `records` | The project does not ignore `.canon/`. Run `canon tooling sync --write` first. |
62
- | `records` | A record folder already exists at the destination |
63
- | `surface-roots` | Any destination already exists under `canon/`, refusing the whole plan |
64
- | `scratch-evidence` | A destination is occupied |
65
- | `record-layout` | A destination already exists, each move refused on its own |
66
- | `rule-layout` | A destination holds different bytes. Neither file is touched and other moves apply. |
67
- | `session-defaults` | The settings file is not valid JSON, or `permissions` or its `deny` has another shape |
59
+ | Verb | Refuses when |
60
+ | ------------------ | --------------------------------------------------------------------------------------------------------- |
61
+ | `records` | The project does not ignore `.canon/`. Run `canon tooling sync --write` first. |
62
+ | `records` | A record folder already exists at the destination |
63
+ | `surface-roots` | Any destination already exists under `canon/`, refusing the whole plan |
64
+ | `scratch-evidence` | A destination is occupied |
65
+ | `record-layout` | A destination already exists, each move refused on its own |
66
+ | `rule-layout` | A destination holds different bytes. Neither file is touched and other moves apply. |
67
+ | `session-defaults` | The settings file is not valid JSON, or `permissions`, `deny`, `hooks`, or `PreToolUse` has another shape |
68
68
 
69
69
  A `rule-layout` destination holding the same bytes marks a duplicate, which `--write` deletes.
70
70
 
@@ -108,6 +108,8 @@ It moves each surface with `git mv` and repoints every tracked citation. No othe
108
108
 
109
109
  The seeded `.claude/settings.json` now denies the `Agent` and `Task` tools and both merge commands, and sets `autoMemoryEnabled` to `false`. `canon claude sync` never rewrites a settings file you hold, so it warns while the file holds no default or lacks a merge entry. Removing `Agent` and `Task` later draws no warning.
110
110
 
111
+ The plan guard takes two steps. `canon claude init` adds the absent `.claude/hooks/plan-guard.sh`, and the verb below then wires it into `hooks.PreToolUse` for `Bash` and `Write|Edit`. It skips a tool whose matcher already runs the guard, and wires nothing while the script is absent.
112
+
111
113
  ```bash
112
114
  canon migrate session-defaults --json
113
115
  canon migrate session-defaults --write --json
@@ -10,6 +10,7 @@ Scaffold, sync, and migrate a toolkit-managed project, with worked setups for th
10
10
 
11
11
  ## Agent surface
12
12
 
13
+ - [Outside tools](outside-tools.md): The two tools canon's media skills reach but do not own, which skill uses each, how to install both through the canon-media bundle, and what keeps them current
13
14
  - [Target projects](projects.md): Scaffold, add domains later, and sync upstream drift in a toolkit-managed project
14
15
  - [Target scenarios](scenarios.md): Worked setups for a markdown-heavy project, a web application, and a monorepo
15
16
  - [Target sync](sync.md): Check what drifted in a toolkit-managed project and pull it in, per domain or all at once, and update canon itself
@@ -0,0 +1,39 @@
1
+ ---
2
+ title: Outside tools
3
+ description: The two tools canon's media skills reach but do not own, which skill uses each, how to install both through the canon-media bundle, and what keeps them current
4
+ category: Agent surface
5
+ ---
6
+
7
+ # Outside tools
8
+
9
+ Two canon skills hand work to a tool canon does not ship. Plain `canon` installs neither, so a machine that never films the app or picks a design never pulls them in.
10
+
11
+ | Tool | Used by | What it does there |
12
+ | ----------- | ------------- | ---------------------------------------------------------- |
13
+ | HyperFrames | `ui-film` | Composes, captions, and renders the takes `ui-film` films |
14
+ | Frameboard | `design-pick` | Serves the board the design arms are drawn on and selected |
15
+
16
+ A skill checks that its tool is present and names the install when it is missing. It never installs or updates a tool itself. `ui-film` films the takes either way and stops at the handoff when HyperFrames is absent.
17
+
18
+ ## Install both
19
+
20
+ The `canon-media` plugin carries no skills of its own. It depends on `canon`, `hyperframes`, and `frameboard`, so installing it installs all three. Add the three marketplaces first, since Claude Code resolves a dependency only from a marketplace you have added:
21
+
22
+ ```bash
23
+ claude plugin marketplace add https://github.com/erclx/canon
24
+ claude plugin marketplace add heygen-com/hyperframes
25
+ claude plugin marketplace add erclx/frameboard
26
+ claude plugin install canon-media@canon
27
+ ```
28
+
29
+ Inside a session, `/plugin install canon-media@canon` does the same once the marketplaces are added. Restart Claude Code, or run `/reload-plugins`, to load the skills.
30
+
31
+ To take one tool alone, install `hyperframes@hyperframes` or `frameboard@frameboard` from its own marketplace instead of the bundle.
32
+
33
+ ## Keep them current
34
+
35
+ Neither tool is pinned. Claude Code's plugin manager owns each plugin's updates, and ships auto-update off for a third-party marketplace, so turn it on once per marketplace under `/plugin` in the Marketplaces tab. Updating by hand runs the same two steps per plugin that [target sync](sync.md) gives for canon.
36
+
37
+ - HyperFrames runs its CLI through the plugin's own launcher at the plugin's version, so updating the plugin moves the CLI with it
38
+ - `design-pick` uses a `frameboard` binary on your PATH when one is there, and otherwise runs `bunx -y frameboard` at the latest published release
39
+ - A standalone copy of the HyperFrames skills under `~/.claude/skills/` updates apart from the plugin and can lag its layout, so remove it once the plugin is installed
@@ -24,6 +24,7 @@ Groups run in the order a project meets them. Every name `canon claude skills li
24
24
  | `canon:backlog-triage` | The backlog needs pruning |
25
25
  | `canon:plan-groundwork` | The state is unmeasured and approaches compete |
26
26
  | `canon:decision-escalate` | Open decisions turn on your preference |
27
+ | `canon:proposal-critique` | A proposal needs questioning before it is built |
27
28
  | `canon:design-pick` | The call is taste, wanting candidates side by side |
28
29
  | `canon:task-board` | A decided item needs a file on the board |
29
30
  | `canon:plan-feature` | The approach is settled and needs a plan |
@@ -20,6 +20,10 @@
20
20
  deps = []
21
21
  files = [".claude/skills", "claude/skills"]
22
22
 
23
+ ["rule"]
24
+ deps = []
25
+ files = [".claude/rules/project"]
26
+
23
27
  ["ci-workflow"]
24
28
  deps = []
25
29
  files = [".github/workflows"]
@@ -0,0 +1,16 @@
1
+ ---
2
+ title: Rule rule ledger
3
+ description: Decisions behind governance/rules/claude/rule.md, one row per bullet
4
+ ---
5
+
6
+ # Rule rule ledger
7
+
8
+ The rule is a core rule, so every row is a house choice rather than a citation. Each names what goes wrong without its bullet and the option the bullet beat, with the date it was decided.
9
+
10
+ ## Rule files
11
+
12
+ | Bullet | Source | Read |
13
+ | ------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
14
+ | Load create-rule before an edit | House choice: a session hand-editing rules without the skill shipped defects `canon gov audit` passed (issue 2842). It beat relying on the audit alone | 2026-10-29 |
15
+ | Report an unresolved skill | House choice: a project that installed governance without the plugin has no `create-rule`, and a silent skip hides that. It beat omitting the line | 2026-10-29 |
16
+ | Audit each touched rule | House choice: the audit catches the shape and ledger defects the skill's checklist names, so running it before the commit closes the loop. It beat leaving the audit to the pre-push gate alone | 2026-10-29 |
@@ -0,0 +1,55 @@
1
+ ---
2
+ title: Build in slices skill ledger
3
+ description: Sources for claude/skills/build-in-slices/SKILL.md, one row per bullet in its concern groups
4
+ ---
5
+
6
+ # Build in slices skill ledger
7
+
8
+ The field is software delivery practice. Google's engineering practices carry small changes, Fowler's continuous integration article carries reverting to a good build, and Addy Osmani's `incremental-implementation` skill carries the cycle and the slicing order.
9
+
10
+ The closing sections and `## What this delegates` restate these rules or route, so they take no table.
11
+
12
+ The house rows route a rule through this toolkit's own surfaces, being `git-commit`, the task's findings, and a ship chain's verify gate, where no outside source takes a side. `references/adopted.md` stays the record of what was adopted and declined at the source level.
13
+
14
+ ## Run the cycle per slice
15
+
16
+ | Bullet | Source | Read |
17
+ | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------- |
18
+ | Implement through `test-first` | [addyosmani/agent-skills, Incremental Implementation](https://github.com/addyosmani/agent-skills/blob/2686b620/skills/incremental-implementation/SKILL.md): "Implement the smallest complete piece of functionality", then "write a test if none exists". [Google, Small CLs](https://google.github.io/eng-practices/review/developer/small-cls.html): "A CL that adds or changes logic should be accompanied by new or updated tests for the new behavior." | 2026-10-28 |
19
+ | Run every check it could affect | [addyosmani/agent-skills, Incremental Implementation](https://github.com/addyosmani/agent-skills/blob/2686b620/skills/incremental-implementation/SKILL.md): "Run each verification command after a change that could affect it." | 2026-10-28 |
20
+ | Commit through `git-commit` | [addyosmani/agent-skills, Incremental Implementation](https://github.com/addyosmani/agent-skills/blob/2686b620/skills/incremental-implementation/SKILL.md): "save your progress with a descriptive message". Routing it through `git-commit` and staging only the slice's files is a House choice: a whole-tree commit sweeps a second slice's edits into the first, which no later revert can split | 2026-10-28 |
21
+ | Carry forward from the commit | [addyosmani/agent-skills, Incremental Implementation](https://github.com/addyosmani/agent-skills/blob/2686b620/skills/incremental-implementation/SKILL.md): "Move to the next slice", then "carry forward, don't restart" | 2026-10-28 |
22
+
23
+ ## Choose the next slice
24
+
25
+ | Bullet | Source | Read |
26
+ | ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------- |
27
+ | One path through every layer | [Google, Small CLs](https://google.github.io/eng-practices/review/developer/small-cls.html): "you can instead break down your code into smaller, full-stack, vertical features." [addyosmani/agent-skills](https://github.com/addyosmani/agent-skills/blob/2686b620/skills/incremental-implementation/SKILL.md): "Build one complete path through the stack" | 2026-10-28 |
28
+ | Riskiest piece first | [addyosmani/agent-skills, Incremental Implementation](https://github.com/addyosmani/agent-skills/blob/2686b620/skills/incremental-implementation/SKILL.md): "Tackle the riskiest or most uncertain piece first", since "If Slice 1 fails, you discover it before investing in Slices 2 and 3." | 2026-10-28 |
29
+ | Contract first, then each side | [addyosmani/agent-skills, Incremental Implementation](https://github.com/addyosmani/agent-skills/blob/2686b620/skills/incremental-implementation/SKILL.md): "Slice 0: Define the API contract (types, interfaces, OpenAPI spec)", with the backend and frontend built against it as slices 1a and 1b | 2026-10-28 |
30
+ | File list as scope, not order | House choice: a plan lists its files by path, and building them in that order builds one layer at a time, the order the slicing rules above exist to replace | 2026-10-28 |
31
+
32
+ ## Keep each commit safe to revert on its own
33
+
34
+ | Bullet | Source | Read |
35
+ | ------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
36
+ | One logical change per commit | [Google, Small CLs](https://google.github.io/eng-practices/review/developer/small-cls.html): "The CL makes a minimal change that addresses just one thing." [addyosmani/agent-skills](https://github.com/addyosmani/agent-skills/blob/2686b620/skills/incremental-implementation/SKILL.md): "Each increment changes one logical thing." | 2026-10-28 |
37
+ | Test with or ahead of its code | [Google, Small CLs](https://google.github.io/eng-practices/review/developer/small-cls.html): "CLs should include related test code." | 2026-10-28 |
38
+ | No delete and replace in one | [addyosmani/agent-skills, Incremental Implementation](https://github.com/addyosmani/agent-skills/blob/2686b620/skills/incremental-implementation/SKILL.md): "Avoid deleting something in one commit and replacing it in the same commit", then "separate them" | 2026-10-28 |
39
+ | Narrow edits to existing code | [addyosmani/agent-skills, Incremental Implementation](https://github.com/addyosmani/agent-skills/blob/2686b620/skills/incremental-implementation/SKILL.md): "Modifications to existing code should be minimal and focused". [Fowler, Continuous Integration](https://martinfowler.com/articles/continuousIntegration.html): "Usually the best way to fix the build is to revert the latest commit from the mainline," | 2026-10-28 |
40
+
41
+ ## Note what you notice, and leave it
42
+
43
+ | Bullet | Source | Read |
44
+ | ---------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
45
+ | One line under the task's findings | [addyosmani/agent-skills, Incremental Implementation](https://github.com/addyosmani/agent-skills/blob/2686b620/skills/incremental-implementation/SKILL.md): "If you notice something worth improving outside your task scope, note it". The task's `## Findings` as the place is a House choice: a note left in the session's output dies with the session | 2026-10-28 |
46
+ | The handover when no task exists | House choice: a file created to hold a finding is a task with no row on the board, so nobody schedules it. It beat the source's offer to "create tasks for these", which a worker may not do | 2026-10-28 |
47
+ | Leave the file, even for one line | [addyosmani/agent-skills, Incremental Implementation](https://github.com/addyosmani/agent-skills/blob/2686b620/skills/incremental-implementation/SKILL.md): "Touch only what the task requires." [Google, Small CLs](https://google.github.io/eng-practices/review/developer/small-cls.html): "It's usually best to do refactorings in a separate CL from feature changes or bug fixes." | 2026-10-28 |
48
+ | Fix it only when the plan needs it | [addyosmani/agent-skills, Incremental Implementation](https://github.com/addyosmani/agent-skills/blob/2686b620/skills/incremental-implementation/SKILL.md): "After each increment, the project must build and existing tests must pass." Saying so in the commit is a House choice: an unexplained out-of-scope hunk reads to review as scope creep | 2026-10-28 |
49
+
50
+ ## Run a check when the code under it changed
51
+
52
+ | Bullet | Source | Read |
53
+ | -------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
54
+ | Re-run after an edit it can see | [addyosmani/agent-skills, Incremental Implementation](https://github.com/addyosmani/agent-skills/blob/2686b620/skills/incremental-implementation/SKILL.md): "After a successful run, don't repeat the same command unless the code has changed since", since "re-running on unchanged code adds no information." | 2026-10-28 |
55
+ | A chain's verify step still runs | House choice: read unscoped, the source's note lets a session skip a ship gate's verify on a resumed run, where the gate is the only check reading the tree as it now stands. It beat applying the note to every run | 2026-10-28 |
@@ -0,0 +1,66 @@
1
+ ---
2
+ title: Proposal critique skill ledger
3
+ description: Sources for claude/skills/proposal-critique/SKILL.md, one row per bullet in its steps
4
+ ---
5
+
6
+ # Proposal critique skill ledger
7
+
8
+ The field is judgment and decision-making, plus red teaming doctrine. Kahneman, Lovallo, and Sibony carry the question set and independence, Klein the premortem, Bezos the scaling, and the UK Ministry of Defence handbook the devil's advocate.
9
+
10
+ A row opening `House choice` states a rule no source makes. `## Output` and `## What this delegates` restate the steps or route, so they take no table.
11
+
12
+ ## Guards
13
+
14
+ | Bullet | Source | Read |
15
+ | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------- |
16
+ | Stop when no proposal is named | House choice: a critique of a guessed proposal answers questions nobody asked | 2026-10-28 |
17
+ | Critique only what is not built | [Klein, 2007](https://hbr.org/2007/09/performing-a-project-premortem): those with reservations "may speak freely at the outset, so that the project can be improved rather than autopsied" | 2026-10-28 |
18
+ | Write nothing into the record | House choice: a plan's sections belong to its validator, and the operator decides what moves into a record | 2026-10-28 |
19
+
20
+ ## Step 1: read the proposal
21
+
22
+ | Bullet | Source | Read |
23
+ | ------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
24
+ | Say it was read from the conversation | [Kahneman, Lovallo, and Sibony, 2011](https://thecne.org/wp-content/uploads/2016/04/The-Big-Idea_-Before-You-Make-That-Big-Decision.pdf): "What you see is all there is", so the reader names what it saw | 2026-10-28 |
25
+ | Say when this session wrote it | [Kahneman, Lovallo, and Sibony, 2011](https://thecne.org/wp-content/uploads/2016/04/The-Big-Idea_-Before-You-Make-That-Big-Decision.pdf): "the individuals using this quality screen should be completely independent from the teams making the recommendations" | 2026-10-28 |
26
+ | Read the requirements record | House choice: the goal and non-goal questions need the record that states them | 2026-10-28 |
27
+
28
+ ## Step 2: size the critique
29
+
30
+ | Bullet | Source | Read |
31
+ | ------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
32
+ | Reversibility | [Bezos, 2016 letter](https://www.aboutamazon.com/news/company-news/2016-letter-to-shareholders): "Many decisions are reversible, two-way doors. Those decisions can use a light-weight process" | 2026-10-28 |
33
+ | Reach | [Kahneman, Lovallo, and Sibony, 2011](https://thecne.org/wp-content/uploads/2016/04/The-Big-Idea_-Before-You-Make-That-Big-Decision.pdf): "This approach is not designed for routine decisions that an executive formally rubber-stamps" | 2026-10-28 |
34
+
35
+ ## Step 3: ask in both directions
36
+
37
+ | Bullet | Source | Read |
38
+ | ------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
39
+ | What does it solve, who hits it | [Kahneman, Lovallo, and Sibony, 2011](https://thecne.org/wp-content/uploads/2016/04/The-Big-Idea_-Before-You-Make-That-Big-Decision.pdf): the third group of questions is "aimed at evaluating the proposal" | 2026-10-28 |
40
+ | Which goal, which non-goal | House choice: a requirements record states goals and non-goals, and a proposal crossing one is decided there | 2026-10-28 |
41
+ | Is the cause ours | House choice: a fix for an upstream fault ships as ours unless the evidence separating the two is named first | 2026-10-28 |
42
+ | The strongest rival explanation | [UK MoD Red Teaming Handbook, 2021](https://assets.publishing.service.gov.uk/media/61702155e90e07197867eb93/20210625-Red_Teaming_Handbook.pdf): "Team members should adopt the role of devil's advocate" | 2026-10-28 |
43
+ | Where the numbers came from | [Kahneman, Lovallo, and Sibony, 2011](https://thecne.org/wp-content/uploads/2016/04/The-Big-Idea_-Before-You-Make-That-Big-Decision.pdf): "Do you know where the numbers came from?" and "Which numbers in this plan are facts and which are estimates?" | 2026-10-28 |
44
+ | What doing nothing costs | [Kahneman, Lovallo, and Sibony, 2011](https://thecne.org/wp-content/uploads/2016/04/The-Big-Idea_-Before-You-Make-That-Big-Decision.pdf): "Is the base case overly optimistic?" | 2026-10-28 |
45
+ | Around the cause or into it | House choice: a retry into an upstream failure repeats it, which only a question about the mechanism catches | 2026-10-28 |
46
+ | Has its mechanism worked once | House choice: a mechanism never seen working, such as a cache that never saved, is a guess the fix rests on | 2026-10-28 |
47
+ | Is it too cautious | [Kahneman, Lovallo, and Sibony, 2011](https://thecne.org/wp-content/uploads/2016/04/The-Big-Idea_-Before-You-Make-That-Big-Decision.pdf): "Is the recommending team overly cautious?", since "excessive conservatism is a source of less visible but serious chronic underperformance" | 2026-10-28 |
48
+ | Assume it shipped and failed | [Klein, 2007](https://hbr.org/2007/09/performing-a-project-premortem): "the premortem operates on the assumption that the 'patient' has died, and so asks what did go wrong" | 2026-10-28 |
49
+ | The cheapest reversible probe | [Kahneman, Lovallo, and Sibony, 2011](https://thecne.org/wp-content/uploads/2016/04/The-Big-Idea_-Before-You-Make-That-Big-Decision.pdf): "what information would you want, and can you get more of it now?" | 2026-10-28 |
50
+ | When to stop mitigating | House choice: a mitigation chain with no end point set in advance keeps adding fixes after each one fails | 2026-10-28 |
51
+
52
+ ## Step 4: route what evidence cannot answer
53
+
54
+ | Bullet | Source | Read |
55
+ | ---------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
56
+ | One batch through the question surface | House choice: `decision-escalate` owns the batch shape, so a preference question takes its form rather than a second one | 2026-10-28 |
57
+ | Hold the verdict when an answer moves it | [Bezos, 2016 letter](https://www.aboutamazon.com/news/company-news/2016-letter-to-shareholders): "most decisions should probably be made with somewhere around 70% of the information you wish you had" | 2026-10-28 |
58
+
59
+ ## Step 5: give one verdict
60
+
61
+ | Bullet | Source | Read |
62
+ | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
63
+ | Go | [Bezos, 2016 letter](https://www.aboutamazon.com/news/company-news/2016-letter-to-shareholders): "If you're good at course correcting, being wrong may be less costly than you think" | 2026-10-28 |
64
+ | Probe first | [Kahneman, Lovallo, and Sibony, 2011](https://thecne.org/wp-content/uploads/2016/04/The-Big-Idea_-Before-You-Make-That-Big-Decision.pdf): "can you get more of it now?" | 2026-10-28 |
65
+ | Absorb | House choice: a fix costing more than the problem it removes is declined with its reason recorded | 2026-10-28 |
66
+ | Stop | House choice: a problem not shown or a cause not ours leaves the fix nothing to act on | 2026-10-28 |
@@ -0,0 +1,54 @@
1
+ ---
2
+ title: Search craft skill ledger
3
+ description: Sources for claude/skills/search-craft/SKILL.md, one row per bullet in its concern groups
4
+ ---
5
+
6
+ # Search craft skill ledger
7
+
8
+ The field is information literacy and research methods. ACRL's framework carries how a searcher picks producers and judges authority, and Wineburg and McGrew's study of fact checkers carries reading past the ranking. Caulfield's SIFT carries tracing a claim to its origin, while Anthropic's tool docs carry the domain filter.
9
+
10
+ The closing sections and `## What this delegates` restate these rules or route, so they take no table.
11
+
12
+ The access note's Reddit and X rows record refusals, so they are measurements re-run on the date in `Read` rather than citations. Its last row cites a source like any other.
13
+
14
+ ## Name the field
15
+
16
+ | Bullet | Source | Read |
17
+ | ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------- |
18
+ | Name the field before a query | [ACRL Framework, Searching as Strategic Exploration](https://www.ala.org/acrl/standards/ilframework): learners "match information needs to appropriate search tools and information producers" | 2026-10-28 |
19
+ | At a practitioner's level | [ACRL Framework, Searching as Strategic Exploration](https://www.ala.org/acrl/standards/ilframework): learners "distinguish between different types of searching language (e.g., controlled vocabulary, keywords, natural language)" | 2026-10-28 |
20
+ | Say the field in the output | House choice: an answer from a search run in the wrong field reads the same as a wrong fact unless the output names where it looked. It beat reporting the sources alone | 2026-10-28 |
21
+
22
+ ## Derive who the field trusts
23
+
24
+ | Bullet | Source | Read |
25
+ | --------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
26
+ | Ask what kind of body settles it | [ACRL Framework, Authority Is Constructed and Contextual](https://www.ala.org/acrl/standards/ilframework): "authority is a type of influence recognized or exerted within a community", and learners "identify different types of authority" | 2026-10-28 |
27
+ | Derive the names, never a list | House choice: a remembered list of sites per category rots with nobody noticing, and reading one skips the test of what kind of body the field trusts. It beat a per-category directory, declined in `references/adopted.md` | 2026-10-28 |
28
+ | Search for the authorities first | [Wineburg and McGrew, Lateral Reading and the Nature of Expertise](https://stacks.stanford.edu/file/druid:yk133ht8603/Wineburg%20McGrew_Lateral%20Reading%20and%20the%20Nature%20of%20Expertise.pdf): "before diving deeply into unfamiliar content, chart a plan for moving forward" | 2026-10-28 |
29
+ | Each new question derives its own names | [ACRL Framework, Authority Is Constructed and Contextual](https://www.ala.org/acrl/standards/ilframework): "the information need of the individual or community may help to determine the form of authority required" | 2026-10-28 |
30
+
31
+ ## Search twice
32
+
33
+ | Bullet | Source | Read |
34
+ | --------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
35
+ | The same query scoped and open | [Wineburg and McGrew, Lateral Reading and the Nature of Expertise](https://stacks.stanford.edu/file/druid:yk133ht8603/Wineburg%20McGrew_Lateral%20Reading%20and%20the%20Nature%20of%20Expertise.pdf): fact checkers "knew that the first result was not necessarily the most authoritative", since optimizers push "more authoritative sites to the bottom" | 2026-10-28 |
36
+ | Prefer the scoped side, and say so | House choice: a silent pick hides which source a fact rests on, so a reader cannot re-check the disagreement. It beat keeping whichever result ranked higher | 2026-10-28 |
37
+ | The open result for what is unpublished | [Wineburg and McGrew, Lateral Reading and the Nature of Expertise](https://stacks.stanford.edu/file/druid:yk133ht8603/Wineburg%20McGrew_Lateral%20Reading%20and%20the%20Nature%20of%20Expertise.pdf): reading laterally means "drawing on the resources of the Internet to learn more about a site and its claims" | 2026-10-28 |
38
+ | Check every scoped result's domain | [Anthropic, Server tools, Domain filtering](https://platform.claude.com/docs/en/agents-and-tools/tool-use/server-tools): "Subdomains are automatically included (`example.com` covers `docs.example.com`)", and Unicode names "can bypass domain filters through homograph attacks" | 2026-10-28 |
39
+ | Fetch the page where summaries differ | [Caulfield, SIFT (The Four Moves)](https://hapgood.us/2019/06/19/sift-the-four-moves/): "we'll have you trace the claim, quote, or media back to the source" | 2026-10-28 |
40
+
41
+ ## Prefer a structured source
42
+
43
+ | Bullet | Source | Read |
44
+ | ------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
45
+ | A public API over a summarized page | [Crossref REST API](https://www.crossref.org/documentation/retrieve-metadata/rest-api/): "Our publicly available REST API exposes the scholarly metadata that members and trusted sources deposit with Crossref" | 2026-10-28 |
46
+ | A plain request rather than a wrapper | [claude-research-stack](https://github.com/aghori3004/claude-research-stack): "The skill talks to the CLIs and MCPs directly, on purpose", listing "No wrapper scripts" among what it leaves out | 2026-10-28 |
47
+
48
+ ## Access note
49
+
50
+ | Bullet | Source | Read |
51
+ | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------- |
52
+ | Reddit refuses keyless routes | House choice, measured: `curl` on `/r/programming/.rss` and on `/search.json` both returned 403, and `WebFetch` answered that it is "unable to fetch from www.reddit.com" | 2026-10-28 |
53
+ | X answers nothing without login | House choice, measured: `curl` on `/search` returned 307 to `/i/jf/onboarding/web` with `mode=login`, and `WebFetch` returned "HTTP 402 Payment Required" | 2026-10-28 |
54
+ | Ask before a route that pays | [x-research-skill](https://github.com/rohunvora/x-research-skill): "Each search page returns up to 100 posts = ~$0.50/page", a spend that is the operator's to authorize rather than one a session discovers | 2026-10-28 |
@@ -0,0 +1,64 @@
1
+ ---
2
+ title: Systematic debugging skill ledger
3
+ description: Sources for claude/skills/systematic-debugging/SKILL.md, one row per step and bullet in its concern groups
4
+ ---
5
+
6
+ # Systematic debugging skill ledger
7
+
8
+ The field is software debugging, with reliability engineering for a cause outside the code. Most rows cite the `obra/superpowers` skill this one was ported from, and `addyosmani/agent-skills` adds the non-reproducible tree. Git's docs, Zeller's Debugging Book, and the SRE book cover bisect, reduction, and retry.
9
+
10
+ The closing sections restate these rules, so they take no table. `references/adopted.md` stays the record of what was adopted and declined at the source level.
11
+
12
+ ## Phase 1: investigate
13
+
14
+ | Bullet | Source | Read |
15
+ | ------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
16
+ | Read every line of the output | [superpowers, Systematic Debugging](https://github.com/obra/superpowers/blob/8ca22dba9a94f28898bbce59f2537ff4d87c747d/skills/systematic-debugging/SKILL.md): "Read stack traces completely", noting "line numbers, file paths, error codes" | 2026-10-28 |
17
+ | Reproduce, by the likely cause | [agent-skills](https://github.com/addyosmani/agent-skills/blob/2686b620fc1fed2e8f60c704839c766b8594c6b6/skills/debugging-and-error-recovery/SKILL.md): its non-reproducible tree splits on "Timing-dependent?", "Environment-dependent?", "State-dependent?" | 2026-10-28 |
18
+ | Check what changed, bisecting a regression | [git-bisect](https://git-scm.com/docs/git-bisect): "uses a binary search algorithm to find which commit in your project's history introduced a bug" | 2026-10-28 |
19
+ | Instrument each component boundary | [superpowers, Systematic Debugging](https://github.com/obra/superpowers/blob/8ca22dba9a94f28898bbce59f2537ff4d87c747d/skills/systematic-debugging/SKILL.md): "Run once to gather evidence showing WHERE it breaks", then "investigate that specific component" | 2026-10-28 |
20
+ | Trace a bad value to its source | [superpowers, Systematic Debugging](https://github.com/obra/superpowers/blob/8ca22dba9a94f28898bbce59f2537ff4d87c747d/skills/systematic-debugging/SKILL.md): "Keep tracing up until you find the source" and "Fix at source, not at symptom" | 2026-10-28 |
21
+
22
+ ## Phase 2: reduce and find the pattern
23
+
24
+ | Bullet | Source | Read |
25
+ | ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
26
+ | Reduce to the smallest failing case | [The Debugging Book, Reducing Failure-Inducing Inputs](https://www.debuggingbook.org/html/DeltaDebugger.html): a minimum "not only eases debugging" but explains "why and when the program fails" | 2026-10-28 |
27
+ | Compare against working code | [superpowers, Systematic Debugging](https://github.com/obra/superpowers/blob/8ca22dba9a94f28898bbce59f2537ff4d87c747d/skills/systematic-debugging/SKILL.md): "Locate similar working code in same codebase" | 2026-10-28 |
28
+ | Read a reference completely | [superpowers, Systematic Debugging](https://github.com/obra/superpowers/blob/8ca22dba9a94f28898bbce59f2537ff4d87c747d/skills/systematic-debugging/SKILL.md): "read reference implementation COMPLETELY", and "Don't skim - read every line" | 2026-10-28 |
29
+ | List every difference | [superpowers, Systematic Debugging](https://github.com/obra/superpowers/blob/8ca22dba9a94f28898bbce59f2537ff4d87c747d/skills/systematic-debugging/SKILL.md): "List every difference, however small", and "Don't assume "that can't matter"" | 2026-10-28 |
30
+
31
+ ## Phase 3: hypothesize and test
32
+
33
+ | Bullet | Source | Read |
34
+ | ----------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
35
+ | State one specific hypothesis | [superpowers, Systematic Debugging](https://github.com/obra/superpowers/blob/8ca22dba9a94f28898bbce59f2537ff4d87c747d/skills/systematic-debugging/SKILL.md): "State clearly: "I think X is the root cause because Y"", "Be specific, not vague" | 2026-10-28 |
36
+ | The smallest change, one variable | [superpowers, Systematic Debugging](https://github.com/obra/superpowers/blob/8ca22dba9a94f28898bbce59f2537ff4d87c747d/skills/systematic-debugging/SKILL.md): "Make the SMALLEST possible change to test hypothesis", "One variable at a time" | 2026-10-28 |
37
+ | A new hypothesis, not a stacked fix | [superpowers, Systematic Debugging](https://github.com/obra/superpowers/blob/8ca22dba9a94f28898bbce59f2537ff4d87c747d/skills/systematic-debugging/SKILL.md): "Didn't work? Form NEW hypothesis" and "DON'T add more fixes on top" | 2026-10-28 |
38
+ | Say what you do not understand | [superpowers, Systematic Debugging](https://github.com/obra/superpowers/blob/8ca22dba9a94f28898bbce59f2537ff4d87c747d/skills/systematic-debugging/SKILL.md): "Say "I don't understand X"" and "Don't pretend to know" | 2026-10-28 |
39
+
40
+ ## Phase 4: fix
41
+
42
+ | Bullet | Source | Read |
43
+ | ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
44
+ | A failing test before the fix | [superpowers, Systematic Debugging](https://github.com/obra/superpowers/blob/8ca22dba9a94f28898bbce59f2537ff4d87c747d/skills/systematic-debugging/SKILL.md): the failing test case is one you "MUST have before fixing" | 2026-10-28 |
45
+ | One change at the root cause | [superpowers, Systematic Debugging](https://github.com/obra/superpowers/blob/8ca22dba9a94f28898bbce59f2537ff4d87c747d/skills/systematic-debugging/SKILL.md): "ONE change at a time", "No "while I'm here" improvements", "No bundled refactoring" | 2026-10-28 |
46
+ | The test passes and nothing breaks | [superpowers, Systematic Debugging](https://github.com/obra/superpowers/blob/8ca22dba9a94f28898bbce59f2537ff4d87c747d/skills/systematic-debugging/SKILL.md): "Test passes now?" and "No other tests broken?" | 2026-10-28 |
47
+
48
+ ## Three-fix circuit breaker
49
+
50
+ | Bullet | Source | Read |
51
+ | ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------- |
52
+ | Each fix reveals a new problem | [superpowers, Systematic Debugging](https://github.com/obra/superpowers/blob/8ca22dba9a94f28898bbce59f2537ff4d87c747d/skills/systematic-debugging/SKILL.md): "Each fix reveals new shared state/coupling/problem in different place" | 2026-10-28 |
53
+ | Each fix needs refactoring elsewhere | [superpowers, Systematic Debugging](https://github.com/obra/superpowers/blob/8ca22dba9a94f28898bbce59f2537ff4d87c747d/skills/systematic-debugging/SKILL.md): "Fixes require "massive refactoring" to implement" | 2026-10-28 |
54
+ | Symptoms keep moving | [superpowers, Systematic Debugging](https://github.com/obra/superpowers/blob/8ca22dba9a94f28898bbce59f2537ff4d87c747d/skills/systematic-debugging/SKILL.md): "Each fix creates new symptoms elsewhere" | 2026-10-28 |
55
+
56
+ ## When the cause is external or not found
57
+
58
+ | Bullet | Source | Read |
59
+ | ----------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
60
+ | Document what was ruled out | [superpowers, Systematic Debugging](https://github.com/obra/superpowers/blob/8ca22dba9a94f28898bbce59f2537ff4d87c747d/skills/systematic-debugging/SKILL.md): for a cause that is "truly environmental, timing-dependent, or external", "Document what you investigated" | 2026-10-28 |
61
+ | Log for the next occurrence | [superpowers, Systematic Debugging](https://github.com/obra/superpowers/blob/8ca22dba9a94f28898bbce59f2537ff4d87c747d/skills/systematic-debugging/SKILL.md): "Add monitoring/logging for future investigation" | 2026-10-28 |
62
+ | Ask whether handling routes around | House choice: CI retried a degraded package mirror when the fix that fit was routing around it. It beat naming retry first | 2026-10-28 |
63
+ | Ask whether a retry meets the fault | [SRE book, Addressing Cascading Failures](https://sre.google/sre-book/addressing-cascading-failures/): "the retries themselves may be keeping the backend in an overloaded mode" | 2026-10-28 |
64
+ | Count what absorbing costs | House choice: a retry kept a degraded package mirror on CI's path, and each rerun paid its time and spend. It beat retry by default | 2026-10-28 |
@@ -0,0 +1,28 @@
1
+ ---
2
+ title: Test first skill ledger
3
+ description: Sources for claude/skills/test-first/SKILL.md, one row per step and bullet in its concern groups
4
+ ---
5
+
6
+ # Test first skill ledger
7
+
8
+ The field is test-driven development. Kent Beck states the loop, Martin Fowler makes its refactor step mandatory, and `obra/superpowers` carries the failure check the loop runs before writing code. `## What this delegates` routes, so it takes no table.
9
+
10
+ `references/adopted.md` stays the record of what was adopted and declined at the source level.
11
+
12
+ ## The loop
13
+
14
+ | Bullet | Source | Read |
15
+ | --------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
16
+ | The test before the code it covers | [Fowler, TestDrivenDevelopment](https://martinfowler.com/bliki/TestDrivenDevelopment.html): "Write a test for the next bit of functionality you want to add", ahead of "Write the functional code until the test passes" | 2026-10-28 |
17
+ | The behavior to come, named as proved | [obra/superpowers, Test-Driven Development](https://github.com/obra/superpowers/blob/5bf4e78/skills/test-driven-development/SKILL.md): a good test "Demonstrates desired API", and its "Name describes behavior" where `test('test1')` does not | 2026-10-28 |
18
+ | A failure for the missing behavior | [obra/superpowers, Test-Driven Development](https://github.com/obra/superpowers/blob/5bf4e78/skills/test-driven-development/SKILL.md): confirm the test "Fails because feature missing (not typos)", and on an error "Fix error, re-run until it fails correctly" | 2026-10-28 |
19
+ | The smallest change that passes | [obra/superpowers, Test-Driven Development](https://github.com/obra/superpowers/blob/5bf4e78/skills/test-driven-development/SKILL.md): "Write simplest code to pass the test", and "Don't add features, refactor other code, or "improve" beyond the test" | 2026-10-28 |
20
+ | The pass it was written for, then suite | [Beck, Canon TDD](https://newsletter.kentbeck.com/p/canon-tdd): "Change the code to make the test (& all previous tests) pass", where "delete assertions so the test pretends to pass" is a mistake | 2026-10-28 |
21
+ | Refactor with the suite green | [Fowler, TestDrivenDevelopment](https://martinfowler.com/bliki/TestDrivenDevelopment.html): "Refactor both new and old code to make it well structured", since "The most common way that I hear to screw up TDD is neglecting the third step" | 2026-10-28 |
22
+
23
+ ## Extending existing behavior
24
+
25
+ | Bullet | Source | Read |
26
+ | ----------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
27
+ | A changed assertion fails first | [obra/superpowers, Test-Driven Development](https://github.com/obra/superpowers/blob/5bf4e78/skills/test-driven-development/SKILL.md) applies the loop "Always" to "Behavior changes", under "If you didn't watch the test fail, you don't know if it tests the right thing" | 2026-10-28 |
28
+ | A pass before any change is no test | [obra/superpowers, Test-Driven Development](https://github.com/obra/superpowers/blob/5bf4e78/skills/test-driven-development/SKILL.md): "Test passes? You're testing existing behavior. Fix test." | 2026-10-28 |