@erclx/canon 5.44.0 → 5.46.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 (253) hide show
  1. package/README.md +1 -1
  2. package/claude/.claude-plugin/plugin.json +1 -1
  3. package/claude/skills/api-design/REQUIREMENT.md +15 -31
  4. package/claude/skills/auto-ship/REQUIREMENT.md +14 -25
  5. package/claude/skills/backlog-triage/REQUIREMENT.md +12 -23
  6. package/claude/skills/build-in-slices/REQUIREMENT.md +15 -25
  7. package/claude/skills/canon-cli/REQUIREMENT.md +15 -27
  8. package/claude/skills/canon-cli/SKILL.md +0 -1
  9. package/claude/skills/canon-feedback/REQUIREMENT.md +10 -18
  10. package/claude/skills/canon-feedback-triage/REQUIREMENT.md +10 -15
  11. package/claude/skills/canvas-board/REQUIREMENT.md +14 -28
  12. package/claude/skills/ci-workflow/REQUIREMENT.md +12 -21
  13. package/claude/skills/code-craft/REQUIREMENT.md +14 -28
  14. package/claude/skills/codebase-layout/REQUIREMENT.md +14 -31
  15. package/claude/skills/context-fold/REQUIREMENT.md +15 -39
  16. package/claude/skills/context-fold/references/context.md +3 -3
  17. package/claude/skills/create-rule/REQUIREMENT.md +10 -24
  18. package/claude/skills/create-rule/SKILL.md +3 -0
  19. package/claude/skills/create-skill/REQUIREMENT.md +10 -21
  20. package/claude/skills/decision-escalate/REQUIREMENT.md +12 -24
  21. package/claude/skills/deploy-app/REQUIREMENT.md +12 -22
  22. package/claude/skills/deprecation-migration/REQUIREMENT.md +14 -42
  23. package/claude/skills/design-identity/REQUIREMENT.md +14 -20
  24. package/claude/skills/design-taste/REQUIREMENT.md +16 -57
  25. package/claude/skills/docs-sync/REQUIREMENT.md +14 -23
  26. package/claude/skills/document-health/REQUIREMENT.md +15 -29
  27. package/claude/skills/document-health/SKILL.md +2 -2
  28. package/claude/skills/document-repair/REQUIREMENT.md +32 -0
  29. package/claude/skills/document-repair/SKILL.md +76 -0
  30. package/claude/skills/document-repair/references/batches.md +44 -0
  31. package/claude/skills/draft-and-pick/REQUIREMENT.md +4 -3
  32. package/claude/skills/draft-doc/REQUIREMENT.md +4 -3
  33. package/claude/skills/draft-figure/REQUIREMENT.md +4 -3
  34. package/claude/skills/draft-identity/REQUIREMENT.md +4 -3
  35. package/claude/skills/draft-ready/REQUIREMENT.md +4 -3
  36. package/claude/skills/draft-screencast/REQUIREMENT.md +4 -3
  37. package/claude/skills/draft-slides/REQUIREMENT.md +4 -3
  38. package/claude/skills/draw-figure/REQUIREMENT.md +15 -39
  39. package/claude/skills/git-branch/REQUIREMENT.md +12 -26
  40. package/claude/skills/git-commit/REQUIREMENT.md +11 -15
  41. package/claude/skills/git-followup/REQUIREMENT.md +11 -22
  42. package/claude/skills/git-issue/REQUIREMENT.md +9 -15
  43. package/claude/skills/git-pr/REQUIREMENT.md +13 -32
  44. package/claude/skills/git-pr/SKILL.md +10 -2
  45. package/claude/skills/git-pr/references/closing-issues.md +47 -0
  46. package/claude/skills/git-pr/references/pr.md +4 -0
  47. package/claude/skills/git-ship/REQUIREMENT.md +13 -26
  48. package/claude/skills/git-split/REQUIREMENT.md +10 -17
  49. package/claude/skills/git-stage/REQUIREMENT.md +12 -18
  50. package/claude/skills/git-worktree/REQUIREMENT.md +15 -19
  51. package/claude/skills/make-deck/REQUIREMENT.md +13 -21
  52. package/claude/skills/markdown-craft/REQUIREMENT.md +9 -3
  53. package/claude/skills/pick-by-eye/REQUIREMENT.md +17 -67
  54. package/claude/skills/plan-feature/REQUIREMENT.md +15 -24
  55. package/claude/skills/plan-groundwork/REQUIREMENT.md +12 -28
  56. package/claude/skills/plan-groundwork/SKILL.md +5 -2
  57. package/claude/skills/plan-groundwork/references/output.md +47 -1
  58. package/claude/skills/plan-intake/REQUIREMENT.md +11 -26
  59. package/claude/skills/plan-intake/references/intake.md +2 -2
  60. package/claude/skills/plan-intake-answer/REQUIREMENT.md +14 -29
  61. package/claude/skills/plan-intake-answer/SKILL.md +7 -1
  62. package/claude/skills/plan-ready/REQUIREMENT.md +17 -36
  63. package/claude/skills/pr-evidence/REQUIREMENT.md +11 -17
  64. package/claude/skills/read-frames/REQUIREMENT.md +3 -8
  65. package/claude/skills/record-screencast/REQUIREMENT.md +14 -17
  66. package/claude/skills/review-address/REQUIREMENT.md +14 -38
  67. package/claude/skills/review-craft/REQUIREMENT.md +14 -32
  68. package/claude/skills/review-pr/REQUIREMENT.md +15 -34
  69. package/claude/skills/review-ui/REQUIREMENT.md +14 -39
  70. package/claude/skills/role-orchestrator/REQUIREMENT.md +16 -99
  71. package/claude/skills/role-orchestrator/references/orchestrator-refill.md +5 -0
  72. package/claude/skills/role-orchestrator/references/orchestrator-review-dispatch.md +9 -0
  73. package/claude/skills/role-planner/REQUIREMENT.md +15 -73
  74. package/claude/skills/role-reviewer/REQUIREMENT.md +15 -65
  75. package/claude/skills/role-reviewer/SKILL.md +5 -1
  76. package/claude/skills/role-worker/REQUIREMENT.md +13 -41
  77. package/claude/skills/role-worker/SKILL.md +2 -0
  78. package/claude/skills/script-screencast/REQUIREMENT.md +10 -16
  79. package/claude/skills/search-craft/REQUIREMENT.md +12 -36
  80. package/claude/skills/search-craft/SKILL.md +1 -1
  81. package/claude/skills/search-craft/references/adopted.md +2 -2
  82. package/claude/skills/session-compact/REQUIREMENT.md +13 -23
  83. package/claude/skills/session-map/REQUIREMENT.md +13 -29
  84. package/claude/skills/session-relay/REQUIREMENT.md +14 -58
  85. package/claude/skills/session-relay/SKILL.md +6 -0
  86. package/claude/skills/session-resume/REQUIREMENT.md +13 -27
  87. package/claude/skills/session-worktree/REQUIREMENT.md +14 -43
  88. package/claude/skills/systematic-debugging/REQUIREMENT.md +13 -34
  89. package/claude/skills/target-check/REQUIREMENT.md +16 -23
  90. package/claude/skills/target-setup/REQUIREMENT.md +11 -34
  91. package/claude/skills/target-setup/SKILL.md +2 -2
  92. package/claude/skills/target-setup/references/detect.md +0 -1
  93. package/claude/skills/target-setup/references/verify.md +2 -2
  94. package/claude/skills/task-board/REQUIREMENT.md +13 -22
  95. package/claude/skills/task-board/SKILL.md +7 -0
  96. package/claude/skills/task-board/references/tasks.md +1 -1
  97. package/claude/skills/task-complete/REQUIREMENT.md +11 -24
  98. package/claude/skills/task-complete/references/archive.md +1 -0
  99. package/claude/skills/teach-workspace/REQUIREMENT.md +14 -45
  100. package/claude/skills/teach-workspace/references/promotion.md +5 -5
  101. package/claude/skills/test-craft/REQUIREMENT.md +15 -46
  102. package/claude/skills/test-first/REQUIREMENT.md +14 -20
  103. package/claude/skills/ui-checklist/REQUIREMENT.md +14 -29
  104. package/claude/skills/ux-audit/REQUIREMENT.md +3 -7
  105. package/claude/skills/ux-measure/REQUIREMENT.md +14 -28
  106. package/claude/skills/video-craft/REQUIREMENT.md +14 -27
  107. package/claude/skills/write-doc/REQUIREMENT.md +14 -24
  108. package/claude/skills/write-human/REQUIREMENT.md +15 -27
  109. package/claude/skills/youtube-transcripts/REQUIREMENT.md +9 -15
  110. package/docs/agents/context-audit.md +19 -12
  111. package/docs/agents/install-and-sync.md +2 -2
  112. package/docs/agents/markdown-audit.md +15 -10
  113. package/docs/agents/output-shape.md +1 -2
  114. package/docs/target/migrations.md +18 -0
  115. package/docs/target/projects.md +3 -2
  116. package/docs/target/scenarios.md +4 -1
  117. package/docs/workflow/skill-map-on-request.md +1 -1
  118. package/docs/workflow/skill-map.md +6 -5
  119. package/governance/detect.toml +4 -0
  120. package/governance/ledger/lang/go.md +61 -0
  121. package/governance/ledger/lang/php.md +50 -0
  122. package/governance/ledger/lang/python.md +68 -0
  123. package/governance/ledger/lang/typescript.md +64 -0
  124. package/governance/ledger/lib/database.md +65 -0
  125. package/governance/ledger/lib/e2e-reliability.md +57 -0
  126. package/governance/ledger/lib/pydantic.md +61 -0
  127. package/governance/ledger/lib/security-server.md +62 -0
  128. package/governance/ledger/lib/security-web.md +51 -0
  129. package/governance/ledger/lib/tanstack-query.md +57 -0
  130. package/governance/ledger/lib/test-scope.md +43 -0
  131. package/governance/ledger/lib/testing-go.md +57 -0
  132. package/governance/ledger/lib/testing-php.md +51 -0
  133. package/governance/ledger/lib/testing-py.md +67 -0
  134. package/governance/ledger/lib/testing-ts.md +63 -0
  135. package/governance/ledger/lib/zod.md +47 -0
  136. package/governance/ledger/tooling/ci-workflow.md +33 -0
  137. package/governance/ledger/tooling/code-comments.md +48 -0
  138. package/governance/ledger/tooling/config-comments.md +27 -0
  139. package/governance/ledger/tooling/dependencies.md +38 -0
  140. package/governance/ledger/ui/a11y.md +55 -0
  141. package/governance/ledger/ui/copy.md +49 -0
  142. package/governance/ledger/ui/design-reference.md +42 -0
  143. package/governance/ledger/ui/design-taste.md +19 -0
  144. package/governance/ledger/ui/forms.md +71 -0
  145. package/governance/ledger/ui/interface-casing.md +47 -0
  146. package/governance/ledger/ui/keyboard.md +68 -0
  147. package/governance/ledger/ui/link-behavior.md +29 -0
  148. package/governance/ledger/ui/motion.md +33 -0
  149. package/governance/ledger/ui/surface-capture.md +69 -0
  150. package/governance/ledger/ui/ux-completeness.md +79 -0
  151. package/governance/renames.toml +0 -2
  152. package/governance/rules/claude/output.md +5 -1
  153. package/governance/rules/code/routing.md +5 -1
  154. package/governance/rules/lang/go.md +7 -16
  155. package/governance/rules/lang/php.md +3 -3
  156. package/governance/rules/lang/python.md +9 -18
  157. package/governance/rules/lang/typescript.md +9 -19
  158. package/governance/rules/lib/database.md +5 -5
  159. package/governance/rules/lib/e2e-reliability.md +4 -6
  160. package/governance/rules/lib/pydantic.md +14 -16
  161. package/governance/rules/lib/security-server.md +4 -4
  162. package/governance/rules/lib/security-web.md +6 -10
  163. package/governance/rules/lib/tanstack-query.md +10 -12
  164. package/governance/rules/lib/test-scope.md +4 -4
  165. package/governance/rules/lib/testing-go.md +1 -2
  166. package/governance/rules/lib/testing-php.md +4 -5
  167. package/governance/rules/lib/testing-py.md +11 -19
  168. package/governance/rules/lib/testing-ts.md +7 -16
  169. package/governance/rules/lib/zod.md +6 -8
  170. package/governance/rules/tooling/code-comments.md +2 -4
  171. package/governance/rules/tooling/config-comments.md +1 -4
  172. package/governance/rules/tooling/dependencies.md +1 -1
  173. package/governance/rules/ui/a11y.md +16 -45
  174. package/governance/rules/ui/copy.md +6 -9
  175. package/governance/rules/ui/forms.md +13 -19
  176. package/governance/rules/ui/interface-casing.md +5 -7
  177. package/governance/rules/ui/keyboard.md +38 -0
  178. package/governance/rules/ui/link-behavior.md +3 -3
  179. package/governance/rules/ui/motion.md +3 -3
  180. package/governance/rules/ui/surface-capture.md +15 -27
  181. package/governance/rules/ui/ux-completeness.md +16 -39
  182. package/governance/stacks/base.toml +0 -1
  183. package/package.json +1 -1
  184. package/scripts/core/install-check.sh +1 -1
  185. package/src/claude/cases/workflow.ts +12 -0
  186. package/src/cli/help.ts +0 -1
  187. package/src/cli.ts +0 -2
  188. package/src/commands/context.ts +57 -3
  189. package/src/commands/gov.ts +4 -0
  190. package/src/commands/init.ts +2 -2
  191. package/src/commands/labels.ts +83 -3
  192. package/src/commands/markdown.ts +188 -21
  193. package/src/commands/sessions.ts +36 -3
  194. package/src/commands/tasks.ts +180 -0
  195. package/src/commands/tooling.ts +18 -5
  196. package/src/commands/worktrees.ts +2 -0
  197. package/src/context/coverage.ts +210 -0
  198. package/src/context/gate.ts +12 -3
  199. package/src/design/components.ts +1 -1
  200. package/src/gate/stages.ts +1 -1
  201. package/src/gov/audit.ts +22 -2
  202. package/src/init/plan.ts +1 -8
  203. package/src/init/steps.ts +44 -7
  204. package/src/intake/items.ts +14 -0
  205. package/src/inventory/subjects.ts +1 -1
  206. package/src/labels/closing.ts +46 -0
  207. package/src/markdown/gated.ts +250 -0
  208. package/src/markdown/scope.ts +119 -2
  209. package/src/migrate/rename.ts +6 -0
  210. package/src/migrate/scratch-evidence.ts +12 -4
  211. package/src/records/backup.ts +3 -3
  212. package/src/records/validate.ts +3 -3
  213. package/src/roots/record.ts +17 -8
  214. package/src/sessions/claim.ts +7 -0
  215. package/src/sessions/live.ts +53 -6
  216. package/src/sessions/registry.ts +11 -0
  217. package/src/sessions/resolve.ts +32 -5
  218. package/src/tasks/closes.ts +136 -0
  219. package/src/tasks/record.ts +1 -1
  220. package/src/tooling/inject.ts +26 -7
  221. package/src/tooling/package.ts +32 -0
  222. package/src/tooling/read.ts +46 -3
  223. package/src/tooling/scan.ts +8 -2
  224. package/src/worktrees/reclaim.ts +16 -1
  225. package/tooling/astro/reference.md +64 -93
  226. package/tooling/base/configs/.github/workflows/phase-label-gate.yml +1 -1
  227. package/tooling/base/configs/scripts/verify.ts +2 -2
  228. package/tooling/base/reference.md +1 -9
  229. package/tooling/base/seeds/canon/context/{ci.md → development/ci.md} +1 -1
  230. package/tooling/base/seeds/canon/context/development/index.md +11 -0
  231. package/tooling/base/seeds/canon/context/{development.md → development/setup.md} +8 -12
  232. package/tooling/base/seeds/canon/context/index.md +1 -2
  233. package/tooling/claude/manifest.toml +1 -5
  234. package/tooling/claude/reference.md +36 -59
  235. package/tooling/claude/seeds/.claude/hooks/board-validate.sh +1 -1
  236. package/tooling/claude/seeds/.claude/hooks/index-reminder.sh +2 -7
  237. package/tooling/claude/seeds/.claude/hooks/pr-create-log.sh +2 -7
  238. package/tooling/claude/seeds/.claude/hooks/scratch-guard.sh +3 -10
  239. package/tooling/claude/seeds/.claude/hooks/search-reminder.sh +2 -7
  240. package/tooling/claude/seeds/.claude/hooks/standards-audit.sh +2 -4
  241. package/tooling/claude/seeds/CLAUDE.md +2 -2
  242. package/tooling/nextjs/reference.md +0 -6
  243. package/tooling/php/reference.md +0 -4
  244. package/tooling/web/configs/.github/workflows/verify.yml +28 -0
  245. package/tooling/web/configs/.oxlintrc.json +7 -0
  246. package/tooling/web/configs/e2e/capture-types.ts +35 -0
  247. package/tooling/web/configs/e2e/screenshot.ts +23 -72
  248. package/tooling/web/manifest.toml +1 -1
  249. package/tooling/web/reference.md +77 -124
  250. package/tooling/web/seeds/e2e/capture/cases.ts +47 -0
  251. package/governance/rules/canon/task-scope.md +0 -12
  252. package/src/commands/wiki.ts +0 -100
  253. package/src/wiki/init.ts +0 -85
@@ -26,10 +26,10 @@ A page a reader cannot sort by that question is a page whose subject has not bee
26
26
 
27
27
  ## Where the wiki sits
28
28
 
29
- The folder has two spellings and a project carries whichever its scaffold wrote:
29
+ The folder has two spellings and a project carries whichever the project created:
30
30
 
31
- - `.claude/wiki/`, which is where the scaffolding verb creates one
32
- - A folder named `wiki` at the project root, which is where a project scaffolded before the move keeps its pages
31
+ - `.claude/wiki/`, the folder inside the Claude setup
32
+ - A folder named `wiki` at the project root
33
33
 
34
34
  Read which one exists rather than composing either. A project carrying both keeps its pages at the root, so propose the root spelling and say the other folder is there.
35
35
 
@@ -38,10 +38,10 @@ Read which one exists rather than composing either. A project carrying both keep
38
38
  A project carrying neither gets a refusal rather than a scaffold:
39
39
 
40
40
  ```plaintext
41
- ❌ No wiki folder. Run canon wiki init to create one, then promote again.
41
+ ❌ No wiki folder. Create `.claude/wiki/` with an `index.md`, then promote again.
42
42
  ```
43
43
 
44
- Creating the folder as a side effect of promoting one page hands the project a surface it never chose, and the refusal is one command from resolved.
44
+ Creating the folder as a side effect of promoting one page hands the project a surface it never chose, and the refusal is one step from resolved.
45
45
 
46
46
  ## What a promoted page owes its destination
47
47
 
@@ -7,59 +7,28 @@ description: Why a session writing a test needs a stated layer rule and a qualit
7
7
 
8
8
  ## Gap
9
9
 
10
- Without this skill, a session writing a test has no surface telling it which layer the test belongs at or what makes one good. It writes whatever the touched file suggests, and nothing in the toolkit corrects that choice before the test lands.
10
+ A session writing a test has no surface telling it which layer the test belongs at or what makes one good. It writes whatever the touched file suggests, and the suite inverts into hundreds of end to end tests over a few unit files, with timing-sensitive assertions at the layer where load decides the result.
11
11
 
12
- The one surface that did pick a layer picked the expensive one. The UI test skill routed interactions, state transitions, loading, empty, and error states to a browser end to end run, the opposite of every external source read. `test-first` runs red and green with no layer choice and no refactor step. The testing rule states floors on structure and says nothing about layer.
13
-
14
- The failure is measured on a real target. A single-page portfolio site carried 219 end to end tests against 4 unit test files, an inverted pyramid. Its suite could not raise its worker count without failing between 11 and 24 tests on every retry, because timing-sensitive assertions sat at the layer where CI load decides the result. One copy edit failed three engines because the copy was asserted in a browser run.
15
-
16
- A stated rule is also one a session can talk itself out of. Each test in that suite sat where it did for a reason that sounded fine at the time, such as the end to end spec already being open or a pause quieting a run that flaked under load, and nothing in front of the session answered the reason.
17
-
18
- Moving the guidance into a path-scoped rule does not reach the session that needs it. A path-scoped rule loads when a session reads or writes a matching file, and it is absent from the write that creates the first one, measured in three headless runs, so a rule scoped to test files is silent on the first test of every feature.
12
+ A stated rule is one a session talks itself out of, since each misplaced test sat where it did for a reason that sounded fine. A path-scoped rule does not reach the first test of a feature either, because it loads on a matching file the write has not created yet.
19
13
 
20
14
  ## Must
21
15
 
22
- - State the smallest-layer rule with a decision guide keyed on what the behavior touches, so a session picks a layer from the behavior rather than from the file it is in
23
- - Open every test with the question of which production change makes it fail and whether that change is a bug or a decision, since a test with no answer proves nothing
24
- - State the end to end budget in words: journeys and what only a real browser renders, never a state a component test reaches
25
- - Carry a final filter the session runs over its own tests, each item a shape it can check: mirror assertion, change detector, assertion on a mock, framework behavior, fixed pause, and the mutation check
26
- - Own the structure floors every test carries, being arrange, act, assert, one behavior per test, no branching or loops in a body, no testing of private functions or internal state, no coverage targets, nesting at most two levels deep, independent tests that clean up, factories for test data, every async call awaited, and no snapshot verification. The testing rule only points here, so a later trim keeps them.
27
- - Hold in the body what every test decision pays for, and defer each layer's specifics to a reference loaded only when a test at that layer is being written
28
- - Promise a middle layer for behavior a simulated DOM cannot render, naming the real-browser component runners, so a static site is not left choosing between a simulated DOM that computes no layout and a whole-site run
29
- - Repeat in the end to end reference the two floors a session writing its first spec never loads through the path-scoped rule, being the `scrollend` settle and motion reduced by default
30
- - Record the external patterns adopted and declined with the reason for each, so a later session extends the position instead of re-deriving it
31
- - Close with a table of the excuses a session gives for the wrong layer or a weak test, each with its rebuttal, and the red flags a session can see mid-work, so the reasons that produced the inverted pyramid meet an answer before the test lands
32
- - Trigger on writing or changing any test, after implementing as well as before, since regression tests and end to end tests are mostly written after the code exists
16
+ - Pick the smallest layer that can fail for the behavior from a decision guide keyed on what it touches, splitting a behavior that spans rows into one test per layer
17
+ - Open every test with the question of which production change makes it fail, and whether that change is a bug or a decision
18
+ - Run a final filter over each test, covering mirror assertions, change detectors, mock assertions, fixed pauses, and the mutation check, and rewrite or cut one that fails
19
+ - Hold the structure floors in the body and each layer's specifics in a reference loaded only for that layer
20
+ - Load on writing or changing any test, after implementing as well as before, and close with excuses, red flags, a checklist, and the external sources adopted and declined with the reason for each
33
21
 
34
22
  ## Must not
35
23
 
36
- - Name a framework or runner in the body. Runner specifics live in the references and in the language testing rules, so the body holds across stacks.
37
- - Carry a numeric mix across layers. A codebase-wide ratio is a target a session writing one test cannot act on.
38
- - Restate the settle, guard, and run-scope rules the end to end rules carry, beyond the two floors named above
39
- - Run the red, green, refactor procedure or decide its order, which `test-first` owns
40
- - Import an external skill's tone, such as a law stated as absolute, or an excuse row rebutting an objection no session has raised
41
- - Be reached only by an author typing its name. The intended non-author callers are `test-first`'s first step and a description matching any request to write or change a test. A test written in a session that never loaded this skill is the evidence the trigger is too weak, and nothing answers that before the skill has run.
42
-
43
- ## Guards
44
-
45
- - A behavior spanning more than one row of the decision guide is split into one test per layer rather than asserted whole at the highest layer it touches
46
- - A test failing the final filter is rewritten or cut, never kept with a note
24
+ - Name a framework or runner in the body, or carry a numeric mix across layers
25
+ - Restate the settle, guard, and run-scope rules the end to end rules carry
26
+ - Decide the order of red, green, and refactor
47
27
 
48
28
  ## Out of scope
49
29
 
50
- - The red, green, refactor loop and the order it runs in: `test-first`, which loads this skill at its first step
51
- - Reproducing a failure with no known cause: `systematic-debugging`
52
- - Runner choice, file suffix, placement, and query conventions: the TypeScript and Python testing rules
53
- - Settle, guard, and run-scope rules inside an end to end file: the end to end reliability and test scope rules
54
- - Writing a UI change's visual checklist, and naming the behaviors it ships untested for this skill to place: `ui-checklist`
55
- - Grading the tests a pull request adds: `review-pr`
56
- - Whether the guidance moves where a session puts a test, which needs a measured with-and-without run rather than a rule here
57
-
58
- ## Measured
59
-
60
- 2026-09-19, one Sonnet run per arm over the `pull` arm of the toolkit's own sandbox scenario for this skill, a page with an end to end spec already beside it and a prompt adding a loading state.
61
-
62
- - With the skill: the loading state landed in a new component test and the existing end to end spec stayed unchanged.
63
- - Without it, on a plugin dir lacking the skill: no `Skill` call fired, and the run made the same placement, one component test with three cases and the spec unchanged.
64
-
65
- The arm did not discriminate, so the run shows no movement from the skill. It also shows that the pull toward extending an existing spec is too weak to move an unaided session, which is a fixture finding and not evidence about the body. A stronger pull, such as a prompt naming the spec, is the next arm to try before reading this as a rework signal on the skill. One run per arm on one model cannot separate a difference of one test from noise.
30
+ - The red, green, refactor loop, which `test-first` owns
31
+ - Reproducing a failure with no known cause, which `systematic-debugging` owns
32
+ - Runner choice, file suffix, placement, and query conventions, which the TypeScript and Python testing rules own
33
+ - Writing a UI change's visual checklist, which `ui-checklist` owns
34
+ - Grading the tests a pull request adds, which `review-pr` owns
@@ -7,33 +7,27 @@ description: Why the loop exists and where it stops short of a debugging session
7
7
 
8
8
  ## Gap
9
9
 
10
- Without this skill, a session implementing a planned change writes the test after the code, or writes both in one motion and never runs the test against the code as it stood before. Either way, nothing showed that the test would have caught the defect it exists to catch, so a test added after the fact protects nothing beyond what the author was already confident about.
10
+ A session implementing a planned change writes the test after the code, or writes both in one motion and never runs the test against the code as it stood before. Nothing shows the test would have caught the defect it exists to catch, so a test added after the fact protects nothing beyond what the author already trusted.
11
11
 
12
12
  ## Must
13
13
 
14
- - Write or extend the test before the implementation it covers, for any behavior whose shape is already known
15
- - Run the test before implementing and confirm it fails for the missing behavior, not for an unrelated mistake in the test itself
16
- - Implement the minimum the current test demands, and start a new test before extending past it
17
- - Load `canon:code-craft` before writing the implementation when its shape is still open and the session has not loaded the skill, so the shape of the code is settled before the body rather than during refactor
18
- - Re-run the test after implementing and confirm the pass is the one the test was written to prove
19
- - Refactor the implementation and the test once the suite is green, re-running it after each change, since the smallest change that passes leaves duplication and shortcuts the loop exists to remove before they reach history
14
+ - Write or extend the test before the implementation, for any behavior whose shape is already known
15
+ - Run the test before implementing and confirm it fails for the missing behavior rather than a mistake in the test
16
+ - Implement the minimum the current test demands, then start a new test before extending past it
17
+ - Load `code-craft` before the implementation when its shape is still open, then confirm the pass is the one the test was written to prove
18
+ - Refactor the implementation and the test once the suite is green, re-running it after each change, and record the external sources adopted and declined with the reason for each
20
19
 
21
20
  ## Must not
22
21
 
23
22
  - Write the implementation and the test together with the test never run red first
24
- - Treat a test that already passes before any code change as evidence for the new behavior
25
- - Restate the reproducing-test step `canon:systematic-debugging` already owns for a failure with no known cause
26
- - Decide whether a change looks right visually, which runs after implementation as a separate check
27
-
28
- ## Guards
29
-
30
- - A test failing for a reason other than the missing behavior blocks moving to implementation. Fix the test first.
23
+ - Treat a test that passes before any code change as evidence for the new behavior
24
+ - Move to implementation while the test fails for a reason other than the missing behavior
25
+ - Decide whether a change looks right visually
31
26
 
32
27
  ## Out of scope
33
28
 
34
- - Choosing the layer a test belongs at and judging whether it is a good test: `canon:test-craft`, loaded at step 1 rather than restated here
35
- - Finding the cause of an unexplained failure: `canon:systematic-debugging`
36
- - Confirming visual output after a change lands: `ui-checklist` writes the list to confirm against
37
- - Shaping the function, class, or module the implementation writes: `canon:code-craft`, loaded at step 4 rather than restated here
38
- - Committing the behavior as a slice and ordering the slices of a larger build: `canon:build-in-slices`
39
- - The mechanical audit of whether an implementation reached history ahead of its test: `canon gov test-order`, invoked from `auto-ship`
29
+ - Choosing a test's layer and judging whether it is good, which `test-craft` owns
30
+ - Finding the cause of an unexplained failure, which `systematic-debugging` owns
31
+ - Shaping the function, class, or module the implementation writes, which `code-craft` owns
32
+ - Committing the behavior as a slice, which `build-in-slices` owns, and the mechanical test-order audit `auto-ship` invokes, which `canon gov test-order` owns
33
+ - Confirming visual output after a change lands, which `ui-checklist` owns
@@ -7,44 +7,29 @@ description: Why the visual half of a UI change needs a written record a reviewe
7
7
 
8
8
  ## Gap
9
9
 
10
- Without this skill, UI work ships on the confidence of the session that wrote it. Nobody states which part of the change an eye has to judge, so a reviewer opens the diff and reads the automatable half, which the tests already cover, and never looks at the half that only rendering shows.
10
+ Without this skill, UI work ships on the confidence of the session that wrote it. Nobody states which part of the change an eye has to judge, so a reviewer reads the automatable half and never looks at what only rendering shows. A checklist printed into chat scrolls away.
11
11
 
12
- The visual half is where the record is lost. A checklist printed into chat scrolls away before anyone verifies it, so the ship step has nothing to gate on and the work reads as verified because a list was produced. Written from a linked worktree against `pwd`, the file lands where the caller does not look.
13
-
14
- Writing the checklist correctly to disk does not close the gap either. The file sits under a gitignored folder on the machine that authored it, so a pull request reviewer, on that machine or another, never sees it. A record that only the author can open reads as verified for the same reason a record that never existed does.
15
-
16
- Posting it as a comment of its own is the next failure. The screenshots the checklist annotates sit in a second comment, so a reviewer reads "the hero settles without a jump" with no picture of the hero beside it and scrolls looking for one. Two comments describing one change also drift: a later push re-renders the screenshots and leaves the checklist claiming what an older head showed.
17
-
18
- The automatable half has its own gap, and it is no longer this skill's to close by writing the tests. `test-first` writes a behavior's test while the code is written, and `test-craft` owns which layer it belongs at. A skill writing tests after implementation duplicates both, and what it produces is the test the session already skipped rather than the test the behavior needed. What stays open is that nobody names the behaviors shipping untested, which is a list rather than a test.
12
+ A file under a gitignored folder is unreadable to a pull request reviewer, and a checklist posted as its own comment sits apart from the screenshots it annotates. A later push then re-renders the screenshots and leaves the checklist describing an older head. Nobody names the behaviors shipping untested either, which is a list rather than a test.
19
13
 
20
14
  ## Must
21
15
 
22
- - Split every change into visual-only and automatable before writing anything
23
- - Write the checklist for the visual-only half, each item an action and the result a person is looking for
24
- - Give each item what a driver needs to run it without guessing: the route, the width where the change can differ by width, an action verb to open on, a `(taste)` marker on a judgment of look or feel, and the setup or a `(local only)` marker for a state the page does not open in
25
- - Name every automatable change shipping with no test, with the layer `test-craft` would place it at, as a section of the same file
26
- - Write the file to the `.canon/tmp/handoff/ui-checklist/<slug>.md` handoff at the main worktree root, overwriting
27
- - Report that there is nothing to verify rather than manufacturing a checklist to show work
16
+ - Every change is split into visual-only and automatable before anything is written
17
+ - The checklist covers the visual-only half, each item an action and the result a person looks for, with its route, width, and a `(taste)` or `(local only)` marker where one applies
18
+ - Every automatable change shipping with no test is named, with the layer `test-craft` would place it at, in the same file
19
+ - The file is written to the `.canon/tmp/handoff/ui-checklist/<slug>.md` handoff at the main worktree root, overwriting
20
+ - A change with nothing visual and nothing untested reports the coverage and writes no file
28
21
 
29
22
  ## Must not
30
23
 
31
- - Write a test at any layer, which is `test-first` while the code is written and `test-craft` for where it goes
32
- - Read a project's test config or runner in order to write against it
33
- - Try to assert a visual property programmatically
34
- - Repeat the full checklist in chat, which is what made it evaporate
35
- - Stage or commit the checklist, which is gitignored scratch
36
- - Talk to GitHub directly. Posting the checklist belongs to `pr-evidence`, the sole consumer of the handoff file
24
+ - Write a test at any layer, read a project's test config to write against it, or assert a visual property programmatically
25
+ - Repeat the full checklist in chat, stage or commit it, or talk to GitHub directly
37
26
  - Move the handoff path to match this skill's name, which strands a checklist an older binary wrote
38
-
39
- ## Guards
40
-
41
- - No implementation context in the session: stop, since there is nothing to split
42
- - Nothing visual and nothing untested: skip the file write and report the coverage
27
+ - Run in a session with no implementation context, since there is nothing to split
43
28
 
44
29
  ## Out of scope
45
30
 
46
31
  - Judging whether the UI is any good, which `ux-audit` owns
47
- - The rules for choosing a layer, which `test-craft` owns
48
- - Writing the test itself, which is `test-first`
49
- - Deciding whether an outstanding checklist blocks the ship, which the calling pipeline gates on
50
- - Performing the visual verification, which needs a person
32
+ - The rules for choosing a test layer, which `test-craft` owns
33
+ - Writing the test itself, which `test-first` owns
34
+ - Posting the checklist, which `pr-evidence` owns as the sole consumer of the handoff file
35
+ - Performing the visual verification, which `review-ui` owns for the boxes a driver can run
@@ -24,12 +24,8 @@ The pass slides into fixing what it finds, and then the audit and the change lan
24
24
  - Suggest an implementation or change any code
25
25
  - Flag a surface the task board marks in progress
26
26
  - Report a preference no stated intent supports
27
- - Repeat the full report in chat, which is what loses it
28
- - Stage or commit the report, which is gitignored scratch
29
-
30
- ## Guards
31
-
32
- - No UI surfaces in the project: stop, since there is nothing to audit
27
+ - Repeat the full report in chat, which is what loses it, or stage the report, which is gitignored scratch
28
+ - Audit a project carrying no UI surface, since there is nothing to observe
33
29
 
34
30
  ## Out of scope
35
31
 
@@ -37,4 +33,4 @@ The pass slides into fixing what it finds, and then the audit and the change lan
37
33
  - Feature planning, which `plan-feature` owns
38
34
  - Verifying one specific change, which `ui-checklist` owns
39
35
  - Defining the intent it audits against, which the design document owns
40
- - Measuring what a running interface costs to paint, block, or shift, which `ux-measure` owns. Contrast stays here rather than going with it, being computable from two color values this skill already reads off the stylesheet's custom properties.
36
+ - Measuring what a running interface costs to paint, block, or shift, which `ux-measure` owns, while contrast stays here as two color values off the stylesheet
@@ -7,43 +7,29 @@ description: Why a rendering cost question is answered with a number against a p
7
7
 
8
8
  ## Gap
9
9
 
10
- Without this skill, a session asked what a page costs answers from source. It reads component code, names a suspicious loop, and reports a judgment, so nobody learns the number and the next session repeats the guess. Nothing in the corpus starts a browser, so the question has no surface at all and lands on whichever skill matched the word "UI".
10
+ Without this skill, a session asked what a page costs answers from source. It names a suspicious loop and reports a judgment, so nobody learns the number and the next session repeats the guess. Nothing else in the corpus starts a browser, so the question lands on whichever skill matched the word "UI".
11
11
 
12
- A session that does start one picks a runner on the spot. The reading then comes from a browser nobody chose, cannot be compared against the next run, and disappears with the chat. Loading the page also takes in whatever it says, so a string in it or in the console can pass for direction. A number reported with no boundary beside it is the same dead end as the judgment it replaced, because a reader holding `1.9s` and no threshold concludes nothing from it.
12
+ A session that does start one picks a runner on the spot, takes one noisy load, and loses the reading with the chat. Loading the page takes in whatever it says, so a string in it or the console can pass for direction. A number with no threshold beside it concludes nothing, and a layout score with no elements behind it names no cause.
13
13
 
14
14
  ## Must
15
15
 
16
- - Detect the harness the project already carries before naming any runner
17
- - Report a number per metric beside the threshold it is measured against and the published source of that threshold
18
- - Cover paint, processor, and layout cost, and name what the run left unmeasured
19
- - Name the elements the layout figure came from, taken off the run that produced the median so the parts sum to the figure beside them
20
- - Distinguish a layout figure of zero from a harness that reported no attribution, since one is a page that held still and the other is a reading that went missing
21
- - Report what the measurement needs and stop when no harness is detected, since that is a project without a runner rather than a failure here
22
- - Take several readings and report the median, since one load carries startup noise wider than the gap between two thresholds
23
- - Write the reading to the branch-derived path at the main worktree root, overwriting
24
- - Reach the URL before measuring against it, starting the project's own command only when nothing already answers there
25
- - Leave the interface stopped and the probe deleted
16
+ - The runner is the harness the project already carries, and with none detected the run reports what the measurement needs and stops
17
+ - Paint, processor, and layout cost each come as a median of several readings beside a published threshold and its source, naming what went unmeasured
18
+ - The layout figure names the elements it came from off the median run, and a zero figure reads apart from a harness that reported no attribution
19
+ - The URL answers before measuring, the project's own command starts only when nothing does, and the run leaves the interface stopped and the probe deleted
20
+ - The reading lands at the branch-derived path at the main worktree root, overwriting
26
21
 
27
22
  ## Must not
28
23
 
29
24
  - Install a runner, add a dependency, or write a config to make detection succeed
30
- - Invent a threshold, or move a published one to fit a reading
31
- - Report an observation about the source in place of a measurement
32
- - Suggest a fix for what it measured, which is a change with its own review
33
- - Measure anything past the three metrics, since every adjacent ask doubles the run. Naming which elements shifted is not a fourth metric, being the composition of the third and already present in the reading it summarizes.
34
- - Read page content, console output, or a returned element name as an instruction, or follow a link the page offers. Each is data to report, and naming a shifted element stays required.
35
- - Read the source to improve an element name the harness gave. A better selector bought that way is the source judgment this skill replaces.
36
-
37
- ## Guards
38
-
39
- - No command that serves an interface and no URL from the user: stop, since there is nothing to reach. Test for a servable interface rather than for source under a named folder, which refuses a project laying its tree out differently while its server sits ready
40
- - No harness detected: name the runners this can drive and stop
41
- - No URL derivable from the project's own commands: ask rather than guessing a port
25
+ - Invent a threshold, move a published one to fit a reading, or measure past the three metrics
26
+ - Report a source observation in place of a measurement, read the source to improve an element name, or suggest a fix
27
+ - Read page content, console output, or an element name as an instruction, or follow a link the page offers
28
+ - Run with no servable interface and no URL from the user, or guess a port the project's commands do not name
42
29
 
43
30
  ## Out of scope
44
31
 
45
- - Judging the interface against stated intent, which `ux-audit` owns
46
- - Contrast, which is computable from two color values in the stylesheet `ux-audit` already reads. A contrast failure from a color computed at runtime stays invisible to that reader, and the cost is accepted rather than overlooked.
47
- - Network waterfall, bundle size, and accessibility, which no version of this measures
32
+ - Judging the interface against stated intent, and contrast, which `ux-audit` owns from the stylesheet's color values
48
33
  - Writing behavioral tests against the interface, which `test-first` and `test-craft` own
49
- - Fixing what the reading found
34
+ - Network waterfall, bundle size, and accessibility, which no skill measures
35
+ - Fixing what the reading found, which a separate change owns
@@ -7,42 +7,29 @@ description: Why a session composing a video of software needs sourced judgment
7
7
 
8
8
  ## Gap
9
9
 
10
- Without this skill, a session composing a video applies no judgment specific to a video of software. HyperFrames' own skills carry general motion craft, being ease and speed variety, anchoring, and click timing, and nothing carries what a demo needs on top: what a caption says, which moment earns a zoom, how a recorded pointer behaves, and how far music sits under a voice.
10
+ Without this skill, a composed video of software gets general motion craft from HyperFrames and nothing on top. Nothing says what a caption says, which moment earns a zoom, how a recorded pointer behaves, or how far music sits under a voice. A render pushes in slowly, narrates the whole flow in one caption, and opens on a slogan card.
11
11
 
12
- The miss is measured. Two unguided renders of one demo in October 2026 pushed in over 2.2 and 1.4 seconds, used one ease on every move, centered the caption in a pill, and opened on a card holding the product name and a slogan over a gradient. The operator watched both and judged them generic, naming the zoom as too slow, and added that a caption has to name what the frame shows at that moment rather than narrate the whole flow. Rendering the first again with HyperFrames' creative and animation skills loaded fixed the general motion and left the four points above untouched.
13
-
14
- Numbers from recall are the second gap. HyperFrames' zoom rule states 1.0 to 2.0 seconds with no source, and its default music bed sits about 18 dB under a voice where the accessibility guideline asks for 20. A session taking either as given reproduces the defaults the operator rejected.
12
+ Numbers from recall are the second gap. HyperFrames states its zoom duration with no source, and its default music bed sits closer under a voice than the accessibility guideline asks. A session taking either as given reproduces the defaults that read generic.
15
13
 
16
14
  ## Must
17
15
 
18
- - State that a caption names only what its frame shows, with its on-screen time, line count, line length, and reading rate traced to published subtitle guidelines
19
- - State which moment earns a zoom, aim it from the timeline `canon demo run` writes beside the take, and give a sourced duration for a push onto an action
20
- - State how a recorded pointer behaves on a real interface: one pointer, and each click inside its recorded target. Smoothing and hiding the pointer are recorder settings a composition cannot change, so they stay out
21
- - Cover choosing music or silence, the level music sits under a voice, and the pace of a captioned voiceover, each number sourced
22
- - State that a checker finding is dismissed only after the frame it names is read
23
- - Record the source behind every number in `references/adopted.md`, and name each conflict between sources with its pick rather than averaging
24
- - Close with the practice skill's excuses, red flags, and closing checklist
25
- - Be loaded by `record-screencast` before it composes, reporting when the skill does not resolve
16
+ - A caption names only what its frame shows, with its timing, line count, line length, and reading rate traced to published subtitle guidelines
17
+ - A zoom lands on an action, aimed from the take's timeline with a sourced push duration, and one pointer clicks inside each recorded target
18
+ - The choice of music or silence, the music's level under a voice, and a voiceover's pace each carry a sourced number
19
+ - A checker finding is dismissed only after the frame it names is read
20
+ - Every number traces to a source in `references/adopted.md`, a conflict between sources names its pick, and the body closes with the practice skill's three closing sections
26
21
 
27
22
  ## Must not
28
23
 
29
- - Restate a rule HyperFrames' own skills carry, such as ease variety, anchoring, click timing, the scale and dwell of a zoom, safe margins, or the carve that sits music under a voice. Point at the skill that owns it.
30
- - State a number that `references/adopted.md` does not trace to a source
24
+ - Restate a rule HyperFrames' own skills carry, such as ease variety, anchoring, click timing, a zoom's scale and dwell, safe margins, or the carve under a voice
25
+ - State a number `references/adopted.md` does not trace to a source, or claim loading the skill improves a render before a with-and-without comparison
31
26
  - Fetch, generate, or install a media file or HyperFrames itself
32
27
  - Name this repository's demos, branches, or render files, since the body ships to targets holding none of them
33
-
34
- ## Guards
35
-
36
- - Two sources disagreeing on a number are named together with the side the body takes, never averaged
28
+ - Set pointer smoothing or hiding, which are recorder settings a composition cannot change
37
29
 
38
30
  ## Out of scope
39
31
 
40
- - General motion and composition rules: `hyperframes-animation` and `hyperframes-creative`
41
- - Sourcing media: `media-use`
42
- - Recording the take: `record-screencast`
43
- - Vertical 9:16 framing, until a project asks for it
44
- - Whether loading the skill improves a render, which needs a with-and-without comparison rather than a rule here
45
-
46
- ## Measured
47
-
48
- Not yet measured. The comparison owed is a demo composed with the skill loaded, judged by the operator against the unguided renders described under Gap. Whether the result reads designed is a taste call, so a pattern check cannot stand in for it.
32
+ - General motion and composition rules, which `hyperframes-animation` and `hyperframes-creative` own
33
+ - Sourcing media, which `media-use` owns
34
+ - Recording the take, and loading this skill before it composes, which `record-screencast` owns
35
+ - Vertical 9:16 framing, which no skill owns until a project asks for it
@@ -7,40 +7,30 @@ description: Why a brand-new project document needs its kind's standard, a catal
7
7
 
8
8
  ## Gap
9
9
 
10
- Without this skill, a session drafting a document that has no prior version either invents a shape from memory or reaches for a rewrite or refresh surface. `docs-sync` and `context-fold` read an existing document and a diff, and a document that never existed has neither, so they report the request as unrelated to any change. Either way the document ships with no read of the standard its kind answers to and no check against the catalog for a sibling already covering the same ground under a different name.
10
+ Without this skill, a session drafting a document with no prior version invents a shape from memory or reaches for a rewrite surface. `docs-sync` and `context-fold` read an existing document and a diff, so a new one reads as unrelated to any change.
11
11
 
12
- The same procedure ran as five skills, one per kind, each restating the read, the collision check, the confirm, and the write. They drifted on their own cadence, and five descriptions competed for one trigger, writing a new document.
12
+ The document then ships unread against its kind's standard and unchecked against the catalog for a sibling covering the same ground. Split into one skill per kind, the procedure drifts and the descriptions compete for one trigger.
13
13
 
14
14
  ## Must
15
15
 
16
- - Resolve the kind from the destination the request names, and ask rather than defaulting when it names none, since a document in the wrong surface is invisible where a reader looks for it
16
+ - Resolve the kind from the destination the request names, and ask when it names none, since a document in the wrong surface is invisible where a reader looks for it
17
17
  - Load exactly one kind reference per run, so every step that differs by kind lives in one file and the shared procedure in one body
18
- - Read the kind's standard before drafting, since its frontmatter contract and its reader questions make the document arguable against a sibling
19
- - Check the catalog by exact name and by title and description, since a subject can be covered under a name the request does not guess
18
+ - Read the kind's standard before drafting, and check the catalog by exact name and by title and description, since a subject can be covered under a name the request does not guess
20
19
  - Confirm the resolved path, the kind's detections, and the full content with the user before writing, since placement and detection are judgment calls with no diff to preview them against
21
20
  - Regenerate the catalog of the folder the document landed in, where the kind keeps one, so the next run's collision check sees it
22
- - Draft a README from the template for every detected project type and combine them, never the closest one, since a project that is a CLI and a plugin owes its reader both
23
- - Carry each kind's own musts in its reference: the root check for context, both placement tests and a fetched source for the wiki, and project detection and rendered-value badges for the readme
24
21
 
25
22
  ## Must not
26
23
 
27
- - Rewrite, refresh, or sync a document that already exists. A collision refuses toward the surface that owns the existing document.
28
- - Hand-edit an `index.md`. It regenerates from sibling frontmatter, and a hand edit is overwritten on the next regen.
29
- - Substitute recall for a failed fetch on the wiki kind, or invent an image or a placeholder path on the readme kind.
30
- - Build a hand-drawn diagram loop for a docs page.
31
- - Widen the wiki's folder split to admit a subject its second placement test rejects. That is a change to the standard, argued there.
32
- - Assume this skill's routing needs no check. One description now covers four triggers, and a ranking over descriptions is a proxy for how Claude Code routes, so a review some months in should read real invocations back.
33
-
34
- ## Guards
35
-
36
- - No subject given, for any kind but the readme: stop and ask what the document should cover.
37
- - No destination named: ask which kind rather than defaulting to `docs/`.
38
- - Every other guard is the kind's own, stated in its reference.
24
+ - Rewrite, refresh, or sync a document that already exists, since a collision refuses toward the surface that owns it
25
+ - Hand-edit an `index.md`, which regenerates from sibling frontmatter and overwrites the edit
26
+ - Substitute recall for a failed fetch on the wiki kind, or invent an image or a placeholder path on the readme kind
27
+ - Build a hand-drawn diagram loop for a docs page
28
+ - Widen the wiki's folder split to admit a subject its second placement test rejects
39
29
 
40
30
  ## Out of scope
41
31
 
42
- - Rewriting or syncing an existing `docs/` page or an authored README against a diff: `docs-sync`
43
- - Refreshing an existing context entry: `context-fold`
44
- - Drafting a governance rule: `create-rule`
45
- - Drawing a figure or a diagram for a document: `draw-figure`
46
- - Voice, rhythm, punctuation, and formatting in the drafted document: the `write-human` skill and the markdown standard
32
+ - Rewriting or syncing an existing `docs/` page or an authored README against a diff, which `docs-sync` owns
33
+ - Refreshing an existing context entry, which `context-fold` owns
34
+ - Drafting a governance rule, which `create-rule` owns
35
+ - Drawing a figure or a diagram for a document, which `draw-figure` owns
36
+ - Voice, rhythm, and word choice in the drafted document, which `write-human` owns
@@ -7,42 +7,30 @@ description: Scope boundary between the writing rules a scan enforces and the on
7
7
 
8
8
  ## Gap
9
9
 
10
- Without this skill, a session is graded on the words it avoids and never on how the prose reads. The banned characters ship as data the CLI and the installed hook both read, so that half is measured on every run. The voice half sat under a heading in a standard nothing opened, so a session wrote the whole passage without it and the audit reported a clean exit over prose that read machine-written.
10
+ Without this skill, a session is graded on the words it avoids and never on how the prose reads. The banned characters ship as data a command reads. The voice half sits in a standard nothing opens, so a clean audit passes prose that reads machine-written.
11
11
 
12
- The output of that arrangement is specific rather than general. Paragraphs come back with every sentence landing within a few words of the last, with consecutive sentences opening on the same word and the same grammatical shape, and with the compression rule applied until the verb is gone, so the passage trades uniform sentences for uniform fragments. A session told to be terse and told nothing about cadence produces exactly that, since cutting is the only instruction it holds.
13
-
14
- A session also has no name for the patterns no closed word set can match. Rule-of-three, synonym cycling, false ranges, inline-header lists, and adverb propping each survive a clean scan, so a passage carrying all five reports zero findings and still reads wrong. Nothing tells the session those patterns exist, and a ban list cannot be extended to reach them, because each is a shape rather than a token.
15
-
16
- Importing that catalog wholesale fails on a different measurement. External material of this kind bans abstract metaphor nouns and names `surface` among them, which this corpus uses 593 times in tracked markdown. A session handed the catalog with no stated position either rewrites established vocabulary or silently ignores the item, and neither outcome is recoverable by a later reader who cannot tell which happened.
12
+ Terse sessions return uniform fragments, each sentence near the same length and opening alike. Rule-of-three and synonym cycling survive any scan because each is a shape, not a token. External catalogs also ban terms this corpus uses heavily, and a session without a stated position rewrites them or ignores the item.
17
13
 
18
14
  ## Must
19
15
 
20
- - Arrive attached to the writing rather than waiting to be consulted, which is why the path-scoped rule on a markdown edit carries an explicit instruction to load this skill
21
- - State cadence as something to measure, giving the sentence-length spread and the repeated-opening count a session can check, since a rule to vary sentence length is one a session satisfies by assertion
22
- - Ban the fragment trade by name, since compression is the instruction a terse register already carries and the verb is what it drops first
23
- - Name the machine tells a scan cannot reach, and hold the catalog behind a stated trigger so a run that needs none pays no read for it
24
- - Carry the marketing words and vague qualifiers as word-choice guidance, since no command reads them and a word ban catches the token and misses the habit behind it
25
- - Point at the banned characters rather than restating them, since they ship as package data a command reads and a second copy drifts with nothing comparing the two
26
- - Record which external patterns were adopted, which were declined, and the measurement behind each, so a later session extends the position instead of re-deriving it
27
- - Yield voice to a surface that states its own, and hold rhythm, density, and the tells on every surface
16
+ - Arrive attached to the writing through the path-scoped markdown rule, rather than waiting to be consulted
17
+ - State cadence as something to measure, with a sentence-length spread and a repeated-opening count, and ban the fragment trade by name
18
+ - Name the machine tells a scan cannot reach behind a stated trigger, and carry marketing words and vague qualifiers as word-choice guidance
19
+ - Point at the banned characters rather than restating them, since they ship as package data and a second copy drifts
20
+ - Record which external patterns were adopted or declined with the measurement behind each, and yield voice to a surface that states its own
28
21
 
29
22
  ## Must not
30
23
 
31
24
  - Restate the banned characters, at any length or as an example set
32
- - Present the word guidance as a gate, or restate it on a second surface, since this body is its one copy
33
- - Claim the reported failure is closed. Cadence is a property of a passage and nothing measures the output against these rules yet, so this skill states the rule and the measurement is owed separately.
25
+ - Present the word guidance as a gate, or restate it on a second surface
26
+ - Claim the cadence failure is closed, since nothing measures finished output against these rules yet
34
27
  - Rewrite a term the corpus already uses because an external source bans it, without the count and a recorded position
35
- - Grow a second voice register inside this body. One baseline covers every surface, and a register a real surface needs arrives as an overlay that yields on voice alone.
36
-
37
- ## Guards
38
-
39
- - A passage on a surface stating its own voice keeps that voice, so the yield is read before the voice rules are applied rather than after the rewrite
40
- - Text a model drafted goes through the tells catalog, and a short original draft with nothing reading off skips it
28
+ - Grow a second voice register inside this body
41
29
 
42
30
  ## Out of scope
43
31
 
44
- - The banned characters, which `markdown.md` states for a reader and `canon markdown audit` gates from package data
45
- - Spelling, which a project's spell checker enforces
46
- - Markdown mechanics, being headings, lists, code spans, punctuation, and file references
47
- - What voice a given surface declares, which belongs to the standard governing that surface
48
- - Measuring whether finished output followed these rules, which needs a check this skill does not carry
32
+ - The banned characters, which `markdown-craft` points at and `canon markdown audit` gates
33
+ - Markdown mechanics, being headings, lists, code spans, punctuation, and file references, which `markdown-craft` owns
34
+ - What voice a given surface declares, which the standard governing that surface owns
35
+ - Spelling, which a project's spell checker owns
36
+ - Measuring whether finished output followed these rules, which no check owns yet
@@ -7,32 +7,26 @@ description: Why the transcript fetch stays in the CLI, and why fetching stops s
7
7
 
8
8
  ## Gap
9
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.
10
+ Without this skill, a pasted video link becomes captions printed in chat, which persist nowhere and cannot be cited later. A saved transcript with its metadata is context the repository holds.
11
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.
12
+ A session fetching on its own gets the shape wrong. Raw captions carry timing cues and duplicates, a file without frontmatter loses its source, and reimplemented cleanup drifts from the CLI. A video with no captions looks like a failed fetch, and a summary answers a question nobody asked.
15
13
 
16
14
  ## Must
17
15
 
18
16
  - Run the CLI, which owns the fetch, the caption cleanup, and the frontmatter
19
- - Surface the written path as a full relative path, in the form the project's instruction file sets under `## Output`
17
+ - Surface the written path in full, in the form the project's instruction file sets under `## Output`
20
18
  - 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
19
+ - Name a missing external binary and stop, leaving the install to the user
20
+ - Stop on a missing URL or a link that is not a YouTube URL, since the command cannot fetch either
22
21
 
23
22
  ## Must not
24
23
 
25
24
  - Reimplement the fetch or the cleanup
26
- - Summarize or annotate the transcript unasked, which is a separate request against the file
25
+ - Summarize or annotate the transcript unasked
27
26
  - Install the external binary the command shells out to
28
27
 
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
28
  ## Out of scope
35
29
 
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
30
+ - Downloading the video or its audio, which no skill here owns
31
+ - Summarizing a transcript already on disk, which is a plain read of that file
32
+ - Choosing where transcripts live, which the command's default and its flag own