@erclx/canon 4.122.0 → 4.124.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 (124) hide show
  1. package/claude/.claude-plugin/plugin.json +1 -1
  2. package/claude/skills/auto-ship/SKILL.md +7 -8
  3. package/claude/skills/auto-ship/references/tier-failures.md +7 -4
  4. package/claude/skills/backlog-triage/SKILL.md +1 -1
  5. package/claude/skills/codebase-layout/REQUIREMENT.md +1 -1
  6. package/claude/skills/codebase-layout/SKILL.md +1 -1
  7. package/claude/skills/create-rule/SKILL.md +5 -2
  8. package/claude/skills/design-taste/SKILL.md +1 -1
  9. package/claude/skills/draft-ready/REQUIREMENT.md +1 -1
  10. package/claude/skills/draft-ready/SKILL.md +1 -1
  11. package/claude/skills/git-ship/SKILL.md +4 -3
  12. package/claude/skills/memory-capture/SKILL.md +14 -4
  13. package/claude/skills/memory-review/REQUIREMENT.md +4 -2
  14. package/claude/skills/memory-review/SKILL.md +18 -7
  15. package/claude/skills/memory-review/references/later-phases.md +7 -4
  16. package/claude/skills/memory-review/references/receipt-format.md +19 -3
  17. package/claude/skills/role-orchestrator/SKILL.md +2 -2
  18. package/claude/skills/role-orchestrator/references/orchestrator-parked.md +2 -2
  19. package/claude/skills/session-resume/SKILL.md +4 -3
  20. package/claude/skills/task-board/SKILL.md +1 -1
  21. package/claude/skills/task-board/references/archive.md +1 -1
  22. package/claude/skills/task-board/references/decline.md +1 -1
  23. package/claude/skills/test-first/REQUIREMENT.md +1 -1
  24. package/docs/agents/counts.md +3 -3
  25. package/docs/agents/drift-surfaces.md +2 -2
  26. package/docs/agents/rule-citations.md +4 -4
  27. package/docs/agents/tasks-archive.md +3 -3
  28. package/docs/agents/tasks-plans.md +5 -3
  29. package/docs/agents/tasks-validate.md +1 -1
  30. package/docs/agents/tasks.md +1 -1
  31. package/docs/agents/test-order.md +1 -1
  32. package/docs/index.md +3 -0
  33. package/docs/target-migrations.md +93 -0
  34. package/docs/target-projects.md +4 -216
  35. package/docs/target-scenarios.md +56 -0
  36. package/docs/target-sync.md +93 -0
  37. package/docs/workflow/ai-workflow.md +4 -203
  38. package/docs/workflow/index.md +2 -0
  39. package/docs/workflow/operating-model.md +18 -47
  40. package/docs/workflow/parallel-features.md +77 -0
  41. package/docs/workflow/skill-map.md +148 -0
  42. package/governance/renames.toml +34 -0
  43. package/governance/rules/{claude/555-tasks.md → canon/655-tasks.md} +2 -1
  44. package/governance/rules/{claude/560-diagrams.md → canon/660-diagrams.md} +1 -1
  45. package/governance/rules/{claude/562-session.md → canon/662-session.md} +1 -1
  46. package/governance/rules/code/000-code.md +21 -0
  47. package/governance/rules/lib/300-testing-ts.md +0 -4
  48. package/governance/rules/lib/330-testing-py.md +0 -4
  49. package/governance/rules/{claude/500-prose.md → writing/800-prose.md} +1 -1
  50. package/governance/rules/{claude/501-markdown.md → writing/801-markdown.md} +1 -1
  51. package/governance/rules/{claude/502-mermaid.md → writing/802-mermaid.md} +1 -1
  52. package/governance/stacks/base.toml +7 -6
  53. package/governance/stacks/node.toml +1 -1
  54. package/governance/stacks/python.toml +1 -1
  55. package/package.json +1 -1
  56. package/scripts/core/install-check.sh +3 -5
  57. package/src/claude/routing.ts +1 -1
  58. package/src/commands/gov.ts +1 -1
  59. package/src/commands/tasks.ts +39 -29
  60. package/src/gate/measures.ts +1 -6
  61. package/src/gate/stages.ts +1 -0
  62. package/src/gov/citations.ts +1 -1
  63. package/src/gov/list.ts +1 -1
  64. package/src/gov/restated.ts +2 -2
  65. package/src/init/steps.ts +1 -1
  66. package/src/labels/spelling.ts +1 -1
  67. package/src/records/prune.ts +1 -1
  68. package/src/shipped/references.ts +1 -1
  69. package/src/tasks/archive.ts +212 -105
  70. package/src/tasks/reach.ts +1 -1
  71. package/src/tasks/record.ts +59 -16
  72. package/src/tasks/validate.ts +1 -1
  73. package/standards/board.md +136 -0
  74. package/standards/commit.md +5 -0
  75. package/standards/groundwork.md +25 -36
  76. package/standards/index.md +2 -1
  77. package/standards/plan.md +20 -34
  78. package/standards/readme.md +8 -77
  79. package/standards/requirements.md +2 -2
  80. package/standards/rule.md +4 -6
  81. package/standards/tasks.md +18 -125
  82. package/standards/versioning.md +1 -1
  83. package/tooling/base/configs/commitlint.config.js +27 -1
  84. package/tooling/base/reference.md +2 -2
  85. package/tooling/claude/seeds/.claude/hooks/path-form.sh +1 -1
  86. package/tooling/claude/seeds/.claude/hooks/scratch-guard.sh +1 -1
  87. package/tooling/web/reference.md +1 -1
  88. package/governance/rules/core/000-constitution.md +0 -30
  89. package/governance/rules/core/020-concurrency.md +0 -22
  90. package/governance/rules/core/030-error-handling.md +0 -31
  91. package/governance/rules/core/040-performance.md +0 -20
  92. package/governance/rules/core/050-logging.md +0 -20
  93. package/governance/rules/core/060-naming.md +0 -19
  94. package/governance/rules/snippets/600-at-references.md +0 -9
  95. /package/governance/rules/{core/025-indexes.md → canon/601-indexes.md} +0 -0
  96. /package/governance/rules/{core/035-tasks.md → canon/602-tasks.md} +0 -0
  97. /package/governance/rules/{core/045-memory.md → canon/603-memory.md} +0 -0
  98. /package/governance/rules/{core/055-scratch.md → canon/604-scratch.md} +0 -0
  99. /package/governance/rules/{core/085-worktrees.md → canon/605-worktrees.md} +0 -0
  100. /package/governance/rules/{core/087-git.md → canon/606-git.md} +0 -0
  101. /package/governance/rules/{claude/510-context.md → canon/610-context.md} +0 -0
  102. /package/governance/rules/{claude/511-indexes.md → canon/611-indexes.md} +0 -0
  103. /package/governance/rules/{claude/520-wireframes.md → canon/620-wireframes.md} +0 -0
  104. /package/governance/rules/{claude/530-requirements.md → canon/630-requirements.md} +0 -0
  105. /package/governance/rules/{claude/540-architecture.md → canon/640-architecture.md} +0 -0
  106. /package/governance/rules/{claude/545-decisions.md → canon/645-decisions.md} +0 -0
  107. /package/governance/rules/{claude/550-design.md → canon/650-design.md} +0 -0
  108. /package/governance/rules/{claude/556-groundwork.md → canon/656-groundwork.md} +0 -0
  109. /package/governance/rules/{claude/557-intake.md → canon/657-intake.md} +0 -0
  110. /package/governance/rules/{claude/558-plan.md → canon/658-plan.md} +0 -0
  111. /package/governance/rules/{claude/559-memory.md → canon/659-memory.md} +0 -0
  112. /package/governance/rules/{claude/561-teach.md → canon/661-teach.md} +0 -0
  113. /package/governance/rules/{claude/563-ready.md → canon/663-ready.md} +0 -0
  114. /package/governance/rules/{core/005-behavior.md → claude/565-behavior.md} +0 -0
  115. /package/governance/rules/{core/015-output.md → claude/566-output.md} +0 -0
  116. /package/governance/rules/{core/070-planning.md → claude/567-planning.md} +0 -0
  117. /package/governance/rules/{core → code}/010-testing.md +0 -0
  118. /package/governance/rules/{ci → tooling}/700-ci-workflow.md +0 -0
  119. /package/governance/rules/{core/065-spelling.md → tooling/765-spelling.md} +0 -0
  120. /package/governance/rules/{core/075-dependencies.md → tooling/775-dependencies.md} +0 -0
  121. /package/governance/rules/{core/080-config-comments.md → tooling/780-config-comments.md} +0 -0
  122. /package/governance/rules/{core/090-code-comments.md → tooling/790-code-comments.md} +0 -0
  123. /package/governance/rules/{claude/580-readme.md → writing/880-readme.md} +0 -0
  124. /package/governance/rules/{claude/591-standard-authoring.md → writing/891-standard-authoring.md} +0 -0
@@ -18,7 +18,7 @@ const ORDERING_FILE = 'priority.md'
18
18
  const BACKLOG_FILE = 'backlog.md'
19
19
 
20
20
  /**
21
- * The readiness headings `standards/tasks.md` fixes. The names are the
21
+ * The readiness headings `standards/board.md` fixes. The names are the
22
22
  * contract rather than a suggestion, so a board grouping under names of its own
23
23
  * reads as carrying no group at all and the run refuses instead of reporting a
24
24
  * clean board it never parsed.
@@ -0,0 +1,136 @@
1
+ ---
2
+ title: Board reference
3
+ description: Readiness groups, row cells, and ordering for priority.md, the unordered backlog.md beside it, and the generated index under .canon/tasks/
4
+ ---
5
+
6
+ # Board reference
7
+
8
+ Applies to `.canon/tasks/priority.md`, `.canon/tasks/backlog.md`, and `.canon/tasks/index.md`, the three files beside the tasks that say which one runs next. Update `priority.md` when a task is filed, planned, dispatched, or blocked, and `backlog.md` whenever the board is swept.
9
+
10
+ ## Scope
11
+
12
+ Governs the board files under `.canon/tasks/`: the readiness groups and their columns in `priority.md`, row order and the reason each row states, the backlog beside it, and the generated index.
13
+
14
+ Does not govern:
15
+
16
+ - The task files the rows link to, their filenames, format, origin lines, and archiving: `tasks.md`
17
+ - The plan a `## Run now` row cites and the file set it declares: `plan.md`
18
+ - The pre-compaction handoff sitting in the same folder: `session.md`
19
+
20
+ ## What a working board looks like
21
+
22
+ A board works when a session reading it alone can answer:
23
+
24
+ - Which task can a worker be handed now, and which files would it collide on?
25
+ - What is each blocked task waiting on, and what would clear it?
26
+ - Which task gets planned next, and what is it ranked against?
27
+
28
+ A board failing these is non-conforming even when it satisfies every shape rule below.
29
+
30
+ ## The files
31
+
32
+ `canon tasks list` reports each task's readiness from `priority.md` and `backlog.md`, so a reader never infers it from the folder.
33
+
34
+ `backlog.md` is optional. A project small enough that every task it holds would be planned soon carries none, and the ordering rules below then describe the whole board.
35
+
36
+ `index.md` is generated from sibling frontmatter. The folder is gitignored, so the whole-repo index walk skips it and a hook passing the changed path regenerates it instead. Never hand-edit it.
37
+
38
+ The catalog is the one reader that filters nothing, so it carries a row per sibling alongside the tasks, handoffs included. Anything reading the catalog as the backlog therefore does its own filtering, and a reader that takes every row as a task reports the handoffs as queued work.
39
+
40
+ ## Ordering
41
+
42
+ `priority.md` carries execution order and what each task is waiting on. The generated index sorts by filename and says nothing about order, so without this file board state gets reconstructed by hand every session. Why a row sits where it does inside its group is stated on the row itself, in the column that already carries what the task is waiting on, one line per row.
43
+
44
+ That cell is the only home sequencing rationale has. Rationale spanning several rows, why one group of work runs before another, is carried by nothing and reaches a later session only through whoever remembers it. Naming the gap is deliberate: a second document holding it would be the version-sequencing surface this board replaced, and a row already states what it waits on, which is the part of the reasoning a reader acts on.
45
+
46
+ Group tasks by readiness rather than by status, one row per task, under the columns each group fixes below. Keep it to links and blockers: tables, plus at most one sentence per section. A paragraph in `priority.md` is a defect whatever it says. Stating the shape this way is what lets a single diff fail, since a size cap only trips after the fact and every addition looks defensible on its own.
47
+
48
+ ### Readiness groups
49
+
50
+ Readiness is three groups under fixed headings, `## Run now`, `## Up next`, and `## Needs a plan`, in that order. The names are the contract rather than a suggestion, because a board grouped by readiness under names of its own satisfies every other rule here and still reads as empty to anything counting rows under a heading. Add no fourth group. A task belongs to exactly one, and the tests are read in order.
51
+
52
+ - `## Run now`: a written plan covers every open outcome, and the task carries no reason it cannot start. A collision against the files something already running touches is one such reason, and the `Touches` column is what states it. A worker is handed a task from this group alone.
53
+ - `## Up next`: a written plan exists, and the task carries a stated reason it cannot start. The `Waiting on` column names that reason.
54
+ - `## Needs a plan`: everything else. The task has no plan, or the plan it carries no longer describes the work.
55
+
56
+ Each group fixes its own columns, which follow from the test above it rather than from preference. Neither half of the `## Run now` test is checkable without the file set and the plan sitting beside the task.
57
+
58
+ A `Touches` cell is copied from its plan's own list, so it states what the branch sets out to write rather than a bound on it, and a branch outgrows it while the row still reads as it did at dispatch. Correct the cell from the branch rather than from the plan once one is running, since the plan is the prediction that already went stale and only the diff says what was written. `canon tasks plan-reach <plan>` reads that diff against every live plan and every cell in this group, and the row's owner is the one who writes the correction: a worker never edits this board.
59
+
60
+ ### Row order
61
+
62
+ Row position inside `## Needs a plan` is the order those tasks get planned in, top first. The three tests answer whether a task can start, which is mechanical, and none of them answers which task is worth starting, which is a judgment no column holds. Position is where that judgment is recorded, so the top row is the answer to what to plan next and a reader needs no other surface to get it. The other two groups take the same reading, and it costs them little, since a group holding what is already planned is short by construction.
63
+
64
+ Position alone carries it, and no rank column exists. A number beside each row is a second thing to keep in step with the order it duplicates, and the file is edited by one session at a time, so the order the rows are written in is already unambiguous. State on each row why it sits where it does, in the same cell that carries what it is waiting on. A position with no stated reason is re-derived from memory by the next session, which is the failure the ordering replaces rather than moves.
65
+
66
+ ### The waiting-on cell
67
+
68
+ The `Waiting on` column under `## Up next` carries that reason in one of three forms. `## Needs a plan` states no file set at all, because a task with no plan has no bounded one to state. A group with no rows keeps its heading and its header row.
69
+
70
+ Under `## Up next` a collision names the file held by the task already running, a sibling task names that task, and an external condition names both the condition and what would satisfy it. Naming what would satisfy it is what separates a blocked row from one nobody has examined, so a cell stating a condition with no way out of it fails the test. The header text is the contract the way the group names are, because anything reading the cell resolves the column by header rather than by position.
71
+
72
+ Under `## Needs a plan` the cell carries two halves and each takes one clause: what the task needs before it can be planned, then why it sits at this position. The second clause is comparative, and it names what the row is ranked against in one of two forms: a sibling row, or the class of rows it sits in. The row `leads`, `heads`, `opens`, `closes`, `trails`, `precedes`, `follows`, or `outranks` whichever it names, or `sits under`, `above`, or `below` it. Either form puts something other than this row in the clause, which is what makes the position readable by anyone but its author.
73
+
74
+ Why the task matters is not that claim, and it is what the cell drifts into. A reason naming no other row ranks against nothing, so every row reads defensible on its own and the order records when each was filed. The comparison replaces that reason rather than joining it, since the cell still takes two clauses and no third one is licensed by naming a rival in the second. A cell running past that is the paragraph this file already deletes, arriving one row at a time rather than all at once, and the group is where it costs the most, since it holds the rows nobody has read recently and is the longest group on any board that needs a backlog at all.
75
+
76
+ `canon tasks validate` reads that clause back, so a cell phrased comparatively and unusually reports as unranked. The vocabulary above is the whole of what it recognizes, and widening it is a change to the check rather than something the cell may decide for itself.
77
+
78
+ ```markdown
79
+ ---
80
+ title: Priority
81
+ description: One line on what the board covers
82
+ ---
83
+
84
+ # Priority
85
+
86
+ ## Run now
87
+
88
+ | Task | Touches | Plan |
89
+ | ------------------------------- | ----------------------- | ------------------------------------ |
90
+ | [vXX.Y <slug>](vXX.Y-<slug>.md) | <what the task touches> | [<slug>](../plans/feature-<slug>.md) |
91
+
92
+ ## Up next
93
+
94
+ | Task | Touches | Waiting on |
95
+ | ---- | ------- | ---------- |
96
+
97
+ ## Needs a plan
98
+
99
+ | Task | Waiting on |
100
+ | ------------------------------- | --------------------------------------------------------------------------------- |
101
+ | [vXX.Y <slug>](vXX.Y-<slug>.md) | <what it needs before it can be planned, and which row or class it ranks against> |
102
+ ```
103
+
104
+ The tests live here so the board does not carry them. Writing them as a sentence under each heading produces the paragraph the rule above deletes, and a criterion with no home gets restated from memory every time the board is touched.
105
+
106
+ ## The backlog
107
+
108
+ A task sits on the board when it would plausibly be planned within the next few waves, and on `backlog.md` otherwise. The call is a judgment, so restate it whenever the board is swept rather than making it once: a backlogged task rises when the work in front of it lands or the world changes under it, and a board row falls to the backlog when it stops being near-term.
109
+
110
+ A mechanical test over age or origin was the alternative and neither predicts what gets picked next, which is the judgment the ordering exists to carry. Leaving everything on the board is the other alternative, and it is what produces a group too long to rank, where the ordering means nothing because nobody can hold the whole list in one reading.
111
+
112
+ What the split buys is that the board is short enough for its order to be read, and what it costs is a second surface to keep. That trade only pays while the backlog stays honest about what it is, which is why it carries no order, no groups, and no readiness claim.
113
+
114
+ Nothing is deleted. A backlogged task keeps its file, its findings, and its frontmatter, and the backlog row is a pointer at that file. The folder is gitignored and has no history behind it, so a row dropped without landing somewhere readable is gone with nothing to recover it from.
115
+
116
+ The backlog is a flat list of links under one heading, sorted by filename. Sorting mechanically is what keeps it from reading as a queue: the order is the same order the index already sorts in, so no position on it means anything.
117
+
118
+ ```markdown
119
+ ---
120
+ title: Backlog
121
+ description: One line on what the backlog holds
122
+ ---
123
+
124
+ # Backlog
125
+
126
+ Unordered. Nothing here is scheduled, and a task rises to `priority.md` when it becomes near-term.
127
+
128
+ - [vXX.Y <slug>](vXX.Y-<slug>.md)
129
+ - [vXX.Y <slug>](vXX.Y-<slug>.md)
130
+ ```
131
+
132
+ Add no fourth readiness group in place of this file. The three group names are the contract, and a backlog is a separate surface rather than a group because it makes no readiness claim at all: it says nobody has scheduled the task, which is a fact about attention rather than about whether the work can start.
133
+
134
+ ## Validation
135
+
136
+ `canon tasks validate` reads the board against the tree, and what it checks, what it refuses on, and what it reports are at `canon docs tasks-validate`. Run it when the readiness claim is made rather than on a schedule, since the board is gitignored per-machine scratch and no shared moment exists to hang it on.
@@ -54,6 +54,11 @@ Does not govern:
54
54
  - No backslash escaping or internal double quotes
55
55
  - No conversational filler or introductory phrases
56
56
 
57
+ ## Trailers
58
+
59
+ - Do not add a `Co-authored-by` trailer crediting Claude or Anthropic, by name or by address
60
+ - The `commit-msg` hook refuses a commit carrying one, so remove the line and commit again
61
+
57
62
  ## Examples
58
63
 
59
64
  ### Correct
@@ -5,9 +5,9 @@ description: Folder layout, ordinal naming, reserved numbering, frontmatter and
5
5
 
6
6
  # Groundwork reference
7
7
 
8
- Applies to a groundwork track at `.canon/groundwork/<nn>-<slug>/`. A track measures one question that has to be settled before anyone can plan against it. The numbering inside the folder is the table of contents, so a reader opens the folder and knows where to start and what follows without an index maintained inside each file.
8
+ Applies to a groundwork track at `.canon/groundwork/<nn>-<slug>/`. A track measures one question that has to be settled before anyone can plan against it. The numbering inside the folder is its table of contents.
9
9
 
10
- The folder is gitignored, and backed wherever a records remote is configured: `canon records push` and `canon records pull` protect it against the machine being lost there, refusing with `no-remote` where no remote is set, and neither protects against a compaction dropping a session's reasoning before anyone has pushed. No check reaches its contents, so every rule here holds only while a session reads it, and the handoff file has to be self-contained.
10
+ The folder is gitignored, and backed by `canon records push` wherever a records remote is configured. Nothing backs it against a compaction dropping a session's reasoning before a push, so the handoff file has to be self-contained.
11
11
 
12
12
  ## Scope
13
13
 
@@ -26,8 +26,8 @@ Does not govern:
26
26
 
27
27
  - Name the folder `<nn>-<slug>`, a two-digit zero-padded ordinal followed by a kebab-case slug.
28
28
  - The ordinal marks a folder per track, opened once and worked over time, distinct from a file addressed by name, one already carrying its own sorting prefix, or one deliberately overwritten.
29
- - Claim the ordinal through `canon records ordinal groundwork <slug> --claim`, which reads the highest one already present across both `.canon/groundwork/` and `.canon/intake/` and creates the folder in the same atomic act, closing the race a read-then-create sequence leaves open between two sessions opening at once. A listing then sorts by when each folder opened rather than alphabetically, and the count includes both kinds because the two share one creation-order line.
30
- - With neither folder holding an entry, the first one opened takes `01`. Do not read this off the numbering inside a track, which starts at `00` on a large one and disagrees with intake's own first file.
29
+ - Claim the ordinal through `canon records ordinal groundwork <slug> --claim`, which reads the highest one across both `.canon/groundwork/` and `.canon/intake/` and creates the folder in one atomic act, so two sessions opening at once never share a number. The two kinds share one creation-order line.
30
+ - With neither folder holding an entry, the first one opened takes `01`, whatever number a track's own files start at.
31
31
  - Never renumber an existing folder. The ordinal is the order it opened, and a later reader cites it by that name.
32
32
 
33
33
  ## What a working track looks like
@@ -43,19 +43,15 @@ A track failing these is non-conforming even when it satisfies every shape rule
43
43
 
44
44
  ## Frontmatter and dating
45
45
 
46
- Every file carries `title` and `description`. `README.md` carries one field the others do not.
47
-
48
46
  - `title` (required): the track subject in sentence case
49
47
  - `description` (required): one line naming what the track measures
50
48
  - `date` (required, `README.md` only): the day the folder opened, as `YYYY-MM-DD`
51
49
 
52
- Carry the opening date as a frontmatter field rather than a sentence in the body. A date written into prose is readable by a person and by nothing that walks the folder, and the two spellings drift once both are permitted. State it once and remove the body sentence rather than leaving the pair in place.
53
-
54
- Date the folder once rather than every file. A per-file date leaves every other file stale the first time one is edited, while the opening date never rots. The checkable half is the commit each measurement was taken against, which the file holding that measurement names.
50
+ Carry the opening date as a frontmatter field rather than a sentence in the body, since nothing that walks the folder reads prose. Date the folder once rather than every file, because a per-file date goes stale on the first edit. The checkable half is the commit each measurement was taken against, which the file holding that measurement names.
55
51
 
56
52
  ## Reserved numbers
57
53
 
58
- Five slots carry a fixed meaning. The rest are free, which is what lets the middle of a folder follow its subject.
54
+ Five slots carry a fixed meaning, and the rest are free.
59
55
 
60
56
  | Number | Holds | Required |
61
57
  | ------------ | ----------------------------------------------- | --------------------------- |
@@ -66,9 +62,9 @@ Five slots carry a fixed meaning. The rest are free, which is what lets the midd
66
62
  | `07` | Handoff, self-contained | To close |
67
63
  | `08` | Spikes: method, result, and cost per experiment | Tracks that run experiments |
68
64
 
69
- A folder missing `06` and `07` is live. That is the only status marker, and no separate tracking is needed.
65
+ A folder missing `06` and `07` is live, and that is its only status marker.
70
66
 
71
- `08` sits after the closing files because it is an appendix. It holds evidence rather than a topic, so folding it into the `02` to `05` range buries it, and a track closes with or without one.
67
+ `08` sits after the closing files because it is an appendix of evidence rather than a topic, and a track closes with or without one.
72
68
 
73
69
  ## README.md
74
70
 
@@ -82,11 +78,7 @@ Orients. Holds no findings.
82
78
  - A `## Source citation` section stating the rule below, so a returning session picks it up from the folder
83
79
  - The phase stated out loud in the first three lines, in the form `Groundwork phase. Nothing here is a feature plan.`
84
80
 
85
- The file map is how a returning reader re-enters. After the decision, it is the highest-value thing in the folder.
86
-
87
- Every claim about a source outside the project carries a link to it, wherever the claim appears in the folder. A sentence asserting that a vendor documents something reads the same whether it came from a fetched page or from recall, and a later reader can neither check it nor tell the two apart.
88
-
89
- A source found and not read is listed as a lead and is never cited. That half is what keeps the rule from producing citation theater, because a link attached to a page nobody opened is worse than no link. Listing it still pays, since it stops a later pass re-searching for what this one already surfaced.
81
+ Every claim about a source outside the project carries a link to it, wherever the claim appears in the folder. Without one, a later reader cannot tell a fetched page from recall. A source found and not read is listed as a lead and is never cited, since a link to a page nobody opened is worse than no link. Listing it stops a later pass re-searching for it.
90
82
 
91
83
  Where the track supersedes an earlier plan or an earlier folder, name it and say not to go looking for it. Without that, the old reasoning keeps circulating.
92
84
 
@@ -94,13 +86,13 @@ Where the track supersedes an earlier plan or an earlier folder, name it and say
94
86
 
95
87
  Facts before opinion. Verified measurement only, taken during this pass.
96
88
 
97
- - Never carry a figure from a previous session without re-measuring. Stale ratios survive a sunset that invalidates them, and every number built on one is quietly wrong.
89
+ - Never carry a figure from a previous session without re-measuring, since every number built on a stale one is quietly wrong.
98
90
  - Mark an inference as an inference where one is unavoidable.
99
91
  - Measure only what an open question needs. A number with no question attached is the mechanism by which the groundwork becomes the work.
100
92
 
101
93
  ## 00-scope.md
102
94
 
103
- Written when the subject is large enough to run away. Holds constraints, risks, the open question list, and the downstream surfaces a decision would touch. A small track skips it and carries its questions inside the topic files.
95
+ Written when the subject is large enough to run away. Holds constraints, risks, the open question list, and the downstream surfaces a decision would touch. A small track skips it.
104
96
 
105
97
  ## 06-decision.md
106
98
 
@@ -111,7 +103,7 @@ Closes the folder. Everything above it is input.
111
103
  - The items to do
112
104
  - What was considered and dropped
113
105
 
114
- The dropped list pays off later. It is what stops a future session re-proposing something already rejected.
106
+ The dropped list is what stops a future session re-proposing something already rejected.
115
107
 
116
108
  ## 07-next-session.md
117
109
 
@@ -119,30 +111,28 @@ Written to survive a compaction that loses the conversation. It repeats facts he
119
111
 
120
112
  ## 08-spikes.md
121
113
 
122
- Evidence by experiment, sitting beside the evidence by measurement that `01-current-state.md` holds. Optional, and most tracks never open it, because measuring what is already there settles most questions.
114
+ Evidence by experiment, beside the evidence by measurement `01-current-state.md` holds. Optional, since measuring what is already there settles most questions.
123
115
 
124
116
  Each spike carries four things:
125
117
 
126
- - The open question it answers, named by file and number. A spike attached to no question is the same runaway the current-state file is capped against.
127
- - The method, stated fully enough for a later reader to re-run it. Name the fixture and where it lived, the exact command, and how many repetitions were run. An arm pointed at a fixture inside the project measured the project, so the fixture location is part of whether the result stands.
128
- - The result, and which question it closes. A spike that settles nothing is still recorded, so a later pass does not pay to learn the same thing twice.
129
- - The measured cost, and the caveats bounding what the result proves.
130
-
131
- Cost is a report rather than a limit, and it is what makes the next spike estimable before anyone commits to it. Record it even when it comes to a single read.
118
+ - The open question it answers, named by file and number. A spike attached to no question is a runaway.
119
+ - The method, stated fully enough for a later reader to re-run it. Name the fixture and where it lived, since an arm pointed at a fixture inside the project measured the project, plus the exact command and the repetition count.
120
+ - The result, and which question it closes. Record a spike that settles nothing too, so a later pass does not pay for it twice.
121
+ - The measured cost, even for a single read, and the caveats bounding what the result proves. Cost is a report rather than a limit, and it makes the next spike estimable.
132
122
 
133
- Start a spike against a sample and scale up only once the sample shows the method works. Bound the sample on all three of input size, duration, and spend, since fifty minutes of audio is a runtime and a bill before it is a file size, and three minutes of it usually shows whether the pipeline runs at all. The same holds for a dataset, an image set, or a batch of queries. Record the sample's bounds and the figure for the full input in the spike, so a reader can tell what the result was measured on and what the scale-up costs. The rule reaches only a track, since that is the surface that reads this standard, and nothing checks that a spike ran small first, so it holds only while a session reads it.
123
+ Start a spike against a sample bounded on input size, duration, and spend, and scale up only once it shows the method works. Record the sample's bounds beside the figure for the full input.
134
124
 
135
- A spike also leaves files behind, and they split on whether a later reader needs the file to check a claim rather than on whether it is markdown or re-runnable. A file a reader opens to verify how a result was produced or what it showed lives inside the track. A file that is only bulk input, such as a large fixture or a copied asset, stays outside it wherever the surface driving the spike puts it. Three subfolders inside the track carry the first kind, and none takes a number, since numbering is the read order over the files a reader opens in sequence and these are reached from the claim that cites them instead:
125
+ A file a reader opens to verify how a result was produced or what it showed lives inside the track, and bulk input such as a large fixture stays outside it. Three unnumbered subfolders carry the first kind, since a reader reaches them from the citing claim rather than in read order:
136
126
 
137
127
  - `evidence/`: what a run produced and the record cites, being a recording, a render, or a frame pulled from one, beside the file citing it.
138
- - `scripts/`: the arm scripts and harnesses a spike ran. An arm script is re-runnable, and it is also what a reader opens to check the method, so this refines the earlier split, which sorted on re-runnable alone, and does not contradict it.
128
+ - `scripts/`: the arm scripts and harnesses a spike ran, which a reader opens to check the method.
139
129
  - `clones/`: checkouts and copies of outside material a claim rests on, kept small enough to hold in the folder. A checkout too large to keep is cited by its address and commit instead.
140
130
 
141
- `spikes/`, `web/`, and `research/` were considered and folded into these, so do not reopen them. A spike's files sit under the three above, and a fetched page belongs in `clones/`. The `web/` case is the arguable one, since a screenshot of a reference site could sit apart, and it folds into `evidence/` because that is where a cited artifact already lives.
131
+ Open no other subfolder: `spikes/`, `web/`, and `research/` fold into these three, with a fetched page in `clones/` and a reference-site screenshot in `evidence/`.
142
132
 
143
- Reach for a test harness the project already carries before building one. A track needing an experiment no existing harness can express has found a finding, and it belongs in the folder rather than in a new abstraction.
133
+ Reach for a test harness the project already carries before building one. An experiment no existing harness can express is a finding for the folder, not a new abstraction.
144
134
 
145
- One method error is worth naming, because it is made rather than imagined. Counting matches in a transcript overstates whether a file was read, since an instruction naming a path puts that path in the transcript whether or not anything opened it. The check is the tool call.
135
+ Never count transcript matches to show a file was read. An instruction naming a path puts it in the transcript whether or not anything opened it, so the check is the tool call.
146
136
 
147
137
  ## Open questions
148
138
 
@@ -158,7 +148,7 @@ Every open question carries a lean, wherever it appears. A bare numbered list ha
158
148
  - On a measurement rather than a judgment, write `- Leaning: none, needs measuring` and drop the overturn line. A guess at a number is worse than an admission.
159
149
  - Mark each question open or answered, and repeat the open ones at the end of the file they belong to. That gives the decision file its agenda for free.
160
150
 
161
- A lean is weaker than the suggestion a plan file carries. It records the current read on a question still open by definition, not a decision to accept by default at execution time.
151
+ A lean is weaker than a plan's suggestion: it records the current read on an open question, not a decision to accept at execution time.
162
152
 
163
153
  ## Conventions
164
154
 
@@ -170,9 +160,8 @@ A lean is weaker than the suggestion a plan file carries. It records the current
170
160
 
171
161
  - **The groundwork becomes the work.** Gathering expands until the measuring costs more than the change it justifies. Cap it, and drop any thread with no question attached.
172
162
  - **Deciding by omission.** Closing a track while an unresolved question quietly fails an outcome. Resolve it or record it as knowingly accepted.
173
- - **Recording a constraint discovered while defending a decision.** Check a constraint against the alternative design before writing it down, or a fact about the current shape gets written up as inherent to the problem.
163
+ - **Recording a constraint discovered while defending a decision.** Check it against the alternative design first, or a fact about the current shape reads as inherent to the problem.
174
164
  - **A plan written before the groundwork.** Every track that has done this had to supersede the plan it wrote.
175
- - **The date left in the body.** A frontmatter field and a sentence both claiming the opening date resolve to whichever a reader happens to hit, and only one of them is readable by a walker.
176
165
 
177
166
  ## Template
178
167
 
@@ -8,6 +8,7 @@ subtitle: Reference docs for consistent authoring across the toolkit and target
8
8
  Reference docs for consistent authoring across the toolkit and target projects.
9
9
 
10
10
  - [Architecture reference](architecture.md): Shape and content rules for canon/ARCHITECTURE.md
11
+ - [Board reference](board.md): Readiness groups, row cells, and ordering for priority.md, the unordered backlog.md beside it, and the generated index under .canon/tasks/
11
12
  - [Branch reference](branch.md): Branch naming format and type conventions
12
13
  - [Commit reference](commit.md): Commit message format and type conventions
13
14
  - [Context entry reference](context.md): Shape and content rules for canon/context/<domain>.md entries
@@ -35,7 +36,7 @@ Reference docs for consistent authoring across the toolkit and target projects.
35
36
  - [Slug reference](slug.md): Transform from a git branch name to a slug, and the three responses to an empty result
36
37
  - [Snippet reference](snippets.md): Snippet reference and authoring conventions
37
38
  - [Standard reference](standard.md): Shape and content rules for authoring a standard
38
- - [Tasks reference](tasks.md): Folder layout, filename convention, readiness groups, and content rules for .canon/tasks/
39
+ - [Tasks reference](tasks.md): Folder layout, filename convention, file format, origin lines, and archiving for task files under .canon/tasks/
39
40
  - [Teach reference](teach.md): Workspace layout, ordinal naming, frontmatter, and the mission and learning-record formats for a learning workspace
40
41
  - [Versioning reference](versioning.md): Phase label vs semver discipline across tasks, PRs, reviews, issues, commits, and tags
41
42
  - [Wiki reference](wiki.md): Folder split, frontmatter, naming convention, and sourcing for a wiki reference page
package/standards/plan.md CHANGED
@@ -7,7 +7,7 @@ description: Filename and slug, required sections, the suggested-and-answer cont
7
7
 
8
8
  Applies to a feature plan at `.canon/plans/feature-<slug>.md`. One file holds one concern, written before implementation starts and read by whatever executes it, so it has to carry the scope without the conversation that produced it.
9
9
 
10
- The folder is gitignored, and backed wherever a records remote is configured: `canon records push` and `canon records pull` protect it against the machine being lost there, refuse with `no-remote` where it is not, and protect nothing against a plan deleted before anyone has pushed. That is why the archive step below is a move rather than a cleanup.
10
+ The folder is gitignored, and backed by `canon records push` wherever a records remote is configured. Nothing backs a plan deleted before a push, which is why the archive step below is a move rather than a cleanup.
11
11
 
12
12
  ## Scope
13
13
 
@@ -39,7 +39,7 @@ A plan failing these is non-conforming even when it satisfies every shape rule b
39
39
 
40
40
  - Name the file `feature-<slug>.md`, with `<slug>` two to four kebab-case words naming the concern.
41
41
  - Write one concern per file. A request spanning two independent concerns takes two plans rather than one bundling both, since a bundled plan cannot be executed by two sessions or abandoned by half.
42
- - A staged batch is a concern of its own and takes its own file rather than a `**Batch N**` sub-heading inside one plan's `**Files to touch:**`. `canon tasks plan-branch` derives one branch from one plan filename, so every batch sharing a file has nothing left to open a pull request against once an earlier batch merges under that name. State a batch's dependency on the ones before it in its own `**Constraints:**`.
42
+ - A staged batch is a concern of its own and takes its own file rather than a `**Batch N**` sub-heading inside one plan's `**Files to touch:**`. One plan filename derives one branch, so batches sharing a file have nothing to open a pull request against once the first merges. State a batch's dependency on the ones before it in its own `**Constraints:**`.
43
43
  - Derive the slug from the concern rather than from a branch, because the plan is written before the branch exists.
44
44
  - Give the branch that executes the plan the same slug. A later surface finds the plan from the branch name and finds nothing when the two spellings differ.
45
45
 
@@ -60,33 +60,29 @@ The document opens with `# Feature: <short title>` and one paragraph stating wha
60
60
  | `**Questions:**` | numbered open decisions, each with a suggestion and an answer slot | Always |
61
61
 
62
62
  - Write each marker as the table gives it. `Summary` opens the prose a reader scans, so it takes an H2, and the six that follow are labels over lists rather than sections of prose.
63
- - A section written in the other spelling is still that section. `## Risks` and `**Risks:**` name one thing, and a plan carrying either has stated its risks, so neither reads as an omission. Write the table's form in a new plan and leave an existing plan's spelling alone.
64
- - Both spellings break a depth run, so `canon markdown audit` reads either as the seam it is and reports a plan for a section that genuinely runs long rather than for its whole body. The markdown standard states the rule.
63
+ - A section written in the other spelling is still that section, since `## Risks` and `**Risks:**` name one thing. Write the table's form in a new plan and leave an existing plan's spelling alone. Either spelling breaks a depth run.
65
64
  - Write `None identified.` under a required section with nothing to report rather than dropping the marker. A dropped section and an unconsidered one read identically.
66
65
  - Aim `## Summary` at a person scanning the plan, not at the session executing it. The other sections carry what execution needs.
67
66
  - Give every `**Files to touch:**` entry a backticked path and something said about it. A bare path states scope and not intent, and the reason is what an executing session checks its edit against. Lead with the path or lead with a label carrying the path, whichever reads better for the entry.
68
- - Separate the two halves with a colon, and keep every path the entry declares ahead of it. What sits before the colon is the entry's subject and reads as a target, so both sides of a rename belong there and a file merely cited by the reason does not. A reason is free to name another path, and one entry that did was read as declaring a file its branch never wrote.
69
- - Read the list as what the branch sets out to write rather than as a bound on it. The ship chain writes past it on nearly every branch, since the sync skills refresh whichever context entry and public doc the change reaches, and no planner can name those before the change exists. `canon tasks plan-reach <plan>` reads the branch back against this list and every other live plan, ahead of the pull request.
67
+ - Separate the two halves with a colon, and keep every path the entry declares ahead of it. What sits before the colon reads as a target, so both sides of a rename belong there and a file merely cited by the reason does not.
68
+ - Read the list as what the branch sets out to write rather than as a bound on it, since the doc syncs at ship write past it on nearly every branch. `canon tasks plan-reach <plan>` reads the branch back against this list and every other live plan.
70
69
  - State every count and every claim about the tree as measured during the pass that wrote the plan. A figure carried in from a summary or an earlier session is the most common way a plan ships the wrong scope.
71
70
  - Prefer a short plan over a padded one. A section filled to look thorough costs the reader the same attention as one that matters.
72
71
 
73
72
  ### Constraints
74
73
 
75
- A constraint naming a surface to leave alone forbids two different acts, and it says which. A constraint carrying only the surface leaves the executing session to guess.
74
+ A constraint naming a surface to leave alone says which of two acts it forbids, rather than leaving the executing session to guess.
76
75
 
77
- - Forbid conforming that surface to whatever shape the change introduces. This is what a scope constraint means, and it keeps the branch from growing a second concern.
76
+ - Forbid conforming that surface to whatever shape the change introduces, which keeps the branch to one concern.
78
77
  - Never forbid retargeting a pointer the change breaks. A rename, a split, or a deletion that leaves a citation behind ships a dangling reference, so repairing it is required work rather than scope creep.
79
- - Decide both acts for every surface the constraint names. Carving the distinction out for one file and leaving its siblings under the bare wording ships one correct call beside one broken reference.
78
+ - Decide both acts for every surface the constraint names, not for one file among its siblings.
80
79
 
81
- A constraint measured against work in flight expires when that work merges, and a plan is read some time after it is written. Stamp the block with what it was measured against so a reader can test whether it still holds.
80
+ A constraint measured against work in flight expires when that work merges, so stamp the block with what it was measured against.
82
81
 
83
- - Give the stamp its own leading bullet, written as Measured against `<commit>` on <YYYY-MM-DD>. One stamp covers the whole block however many tracks the constraints below it name, since a plan is written against the tree once.
84
- - Stamp the commit and not the track names. The constraint already names each track by its work and its file set, so a second list of names is a second place to keep in step. A date alone does not separate two plans written the same afternoon on either side of three merges, which is why the commit is the part a reader tests against.
85
- - Re-test a stamped constraint before honoring it with `git fetch origin main --quiet && git log <commit>..origin/main --oneline -- <the paths the constraint names>`. Any commit it reports means the track landed and the constraint is dead. Fetch inside the same command, since a remote-tracking ref left behind reports fewer merges than have landed and reads a dead constraint as live, which is the failure the stamp exists to remove.
86
- - Scope the log to the paths rather than reading every subject. A squashed merge carries a pull request number while the constraint names its track by work and file set, so an unscoped log leaves the reader matching subjects.
87
- - Read an unstamped constraint as unverified rather than as live. There is no commit to anchor the log against, so confirming one costs the open pull request list against the named paths, which is the work a stamp removes. Every plan written before this rule carries an unstamped block, which is why the default sits here rather than in a sweep over the live folder.
88
-
89
- A dead constraint fails silently in the expensive direction. A session honoring one ships the dangling citation the change created and reports success, where a session crossing a live constraint collides visibly and is caught.
82
+ - Give the stamp its own leading bullet, written as Measured against `<commit>` on <YYYY-MM-DD>. One stamp covers the whole block.
83
+ - Stamp the commit rather than the track names or a date alone. The constraint already names each track, and a date does not separate two plans written on either side of a merge.
84
+ - Re-test a stamped constraint before honoring it with `git fetch origin main --quiet && git log <commit>..origin/main --oneline -- <the paths the constraint names>`. Any commit it reports means the track landed and the constraint is dead. Fetch in the same command and scope the log to the paths, since a stale remote-tracking ref reads a dead constraint as live and a squashed subject names no track.
85
+ - Read an unstamped constraint as unverified rather than as live, and confirm it against the open pull request list for the named paths.
90
86
 
91
87
  A constraint naming a `.canon/ready/` folder is a third shape beside the two above. It makes that folder's files the verbatim source for the paths this plan's `**Files to touch:**` lists, per `ready.md`, so the executing session copies those paths rather than authoring them.
92
88
 
@@ -104,8 +100,8 @@ A constraint naming a `.canon/ready/` folder is a third shape beside the two abo
104
100
  ### Review focus
105
101
 
106
102
  - Name each input or state that would break the change if the implementation got it wrong, one bullet each, with what the change must do there.
107
- - Write it for the reviewer rather than the builder. The session writing the plan understood the risk before any diff existed, and this section is where that understanding reaches the review pass.
108
- - Keep it apart from `**Risks:**`. A risk is something the work might collide with, and a focus item is something the finished diff must be shown to handle, so a reviewer confirms the second and the executing session plans around the first.
103
+ - Write it for the reviewer rather than the builder, since this section is where the planner's understanding of the risk reaches the review pass.
104
+ - Keep it apart from `**Risks:**`. A risk is something the work might collide with, and a focus item is something the finished diff must be shown to handle.
109
105
 
110
106
  ## The suggested-and-answer contract
111
107
 
@@ -131,32 +127,22 @@ An execution that deviates rewrites the suggestion into the form below, leaving
131
127
  - Write `- Suggested: needs your call, <why>` where the answer turns on preference rather than on a technical default. Fabricating a default there hides an open question behind an accepted answer.
132
128
  - Never fill an `- Answer:` slot on behalf of the person who owns it. Recording the pick as the suggestion is what the suggestion line is for.
133
129
  - Rewrite the `- Suggested:` line to the pick execution made when it deviates from an unanswered question, and leave the slot blank. The prohibition above reaches the answer line alone, so the suggestion line is where a deviation goes.
134
- - Open the rewritten text with `overridden at execution to <pick>,` and follow it with the measurement that moved the pick. The phrase is fixed, because a suggestion carrying a number is the ordinary shape of an authored one and says nothing about who wrote it.
130
+ - Open the rewritten text with `overridden at execution to <pick>,` and follow it with the measurement that moved the pick. The fixed phrase is what tells an override from an authored suggestion, which routinely carries a number too.
135
131
  - Take a deviation from an answered question back to whoever answered it rather than rewriting either line. A filled slot is a decision already made, and a suggestion rewritten under one leaves the plan holding two picks with no default resolving them.
136
132
  - Answer in place when a question is settled in conversation, so the file and the decision do not disagree.
137
133
 
138
- The fixed phrase is what a later reader tells an override by, and the measurement alone is not, since an authored suggestion routinely carries a number of its own and a reader meeting one learns nothing about who put it there. The plan is archived at ship, so the same deviation takes one line in the open task's `## Findings` naming what shipped. That is one fact in two registers, the plan holding why the pick moved and the task holding what the tree now has, rather than two records to keep in step.
134
+ The plan is archived at ship, so the same deviation takes one line in the open task's `## Findings` naming what shipped. The plan holds why the pick moved and the task holds what the tree now has.
139
135
 
140
- This contract inverts the one an intake folder keeps, where an empty slot means unread and acceptance is typed out. A plan is written and read in one sitting with every question already surfaced, so silence is a usable default here and is not one there. Both files state the inversion, since a contract read on only one side of a boundary is the one that gets applied to the wrong document.
136
+ This contract inverts the one an intake folder keeps, where an empty slot means unread and acceptance is typed out. A plan is written and read in one sitting with every question already surfaced, so silence is a usable default here and is not one there.
141
137
 
142
138
  ## Lifecycle
143
139
 
144
- - Write the plan before implementation starts, and treat it as the scope of the run that executes it.
140
+ - Write the plan before implementation starts, and treat it as the scope of the run that executes it. A subject that has to be measured before anyone can plan against it takes a measurement track first.
145
141
  - Keep every plan at one root. A plan copied into each parallel working tree forks, and the copies answer the same question differently.
146
142
  - Amend the plan in place when a decision changes mid-flight. Do not append a second passage narrating the change, which leaves a reader to work out which of two answers is current. An execution-time deviation from a suggestion is one such amendment, and the contract above fixes which line takes it.
147
- - Move the plan to `.canon/plans/archive/` when the work it describes ships or is declined. Never delete it, because the plan is where the rejected alternative is written down and nothing else records it. The archive nests inside `.canon/plans/` rather than sitting beside it as `.claude/plans-archive/`, so an older layout is a flat sibling by that name and a current one is not.
143
+ - Move the plan to `.canon/plans/archive/` when the work it describes ships or is declined. Never delete it, because the plan is where the rejected alternative is written down. A flat `.claude/plans-archive/` sibling is the older layout.
148
144
  - Write the plan in the same session that opens the task it serves. The session executing it later inherits reasoning it would otherwise re-derive.
149
145
 
150
- ## Anti-patterns
151
-
152
- - **The plan written before the measuring.** A subject that has to be measured before anyone can plan against it belongs in a measurement track, and every plan that skipped that step had to be superseded.
153
- - **The bundled plan.** Two concerns under one slug cannot be split later without rewriting both halves.
154
- - **The question with no suggestion.** It reads as thoroughness and lands as a blocked run.
155
- - **The answer filled in by the author.** A slot holding the writer's own pick destroys the only signal that anyone else agreed.
156
- - **The deviation recorded off the plan.** The reasoning lands in a pull request description no later reader of the plan opens, and the archived plan reads as though its suggestion held.
157
- - **The count carried in.** A figure quoted from an earlier session survives the change that invalidated it, and the scope built on it is quietly wrong.
158
- - **The plan deleted on ship.** The considered-and-dropped reasoning goes with it, and the next session re-proposes what this one rejected.
159
-
160
146
  ## Template
161
147
 
162
148
  ```markdown
@@ -147,85 +147,16 @@ See the [contributing guidelines](CONTRIBUTING.md).
147
147
 
148
148
  ### Correct
149
149
 
150
- ````markdown
151
- # Auth SDK
152
-
153
- Lightweight authentication library for Node.js with OAuth2 and JWT support.
154
-
155
- ## Features
156
-
157
- - OAuth2 provider integration (Google, GitHub, Azure)
158
- - JWT token generation and validation
159
- - Session management with Redis support
160
- - TypeScript support with full type definitions
161
-
162
- ## Installation
163
-
164
- ```bash
165
- npm install auth-sdk
150
+ ```plaintext
151
+ Lightweight authentication library for Node.js with OAuth2 and JWT support. # one line naming what it is
152
+ ## Quick start # sentence case, a runnable snippet follows
153
+ [MIT](LICENSE) # links the license file
166
154
  ```
167
155
 
168
- ## Quick start
169
-
170
- ```javascript
171
- import { AuthClient } from 'auth-sdk'
172
-
173
- const client = new AuthClient({
174
- provider: 'google',
175
- clientId: process.env.CLIENT_ID,
176
- })
177
-
178
- const user = await client.authenticate(code)
179
- ```
180
-
181
- ## Documentation
182
-
183
- Visit [docs.auth-sdk.dev](https://docs.auth-sdk.dev) for full API reference.
184
-
185
- ## Support
186
-
187
- - Report bugs via [GitHub Issues](../../issues)
188
- - Community support on [Discord](https://discord.gg/example)
189
-
190
- ## License
191
-
192
- [MIT](LICENSE)
193
- ````
194
-
195
156
  ### Incorrect
196
157
 
197
- ````markdown
198
- # Auth SDK
199
-
200
- This is a seamless and powerful authentication library that allows developers to easily integrate robust OAuth2 functionality.
201
-
202
- ## Why Use This?
203
-
204
- Basically, this library is just amazing and will revolutionize how you handle auth.
205
-
206
- ## Installation
207
-
208
- Simply run the following command to install:
209
-
210
- ```bash
211
- npm install auth-sdk
158
+ ```plaintext
159
+ ## Why Use This? # title case, and a pitch rather than a feature list
160
+ Simply run the following command to install: # filler qualifier before the command
161
+ Copyright (c) 2026 Example Corp # license text inline rather than linked
212
162
  ```
213
-
214
- ## API Documentation
215
-
216
- ### AuthClient Class
217
-
218
- #### Constructor
219
-
220
- constructor(options: AuthOptions)
221
-
222
- [...full API docs inline, should link to external docs...]
223
-
224
- ## License
225
-
226
- MIT License
227
-
228
- Copyright (c) 2026 Example Corp
229
-
230
- [...full license text, should reference LICENSE file...]
231
- ````
@@ -14,7 +14,7 @@ Governs the product-scope document at `canon/REQUIREMENTS.md`: problem, goals, n
14
14
  Does not govern:
15
15
 
16
16
  - Rationale for a technical choice: `architecture.md`
17
- - Execution order across the work the scope generates: `tasks.md`
17
+ - Execution order across the work the scope generates: `board.md`
18
18
  - Per-domain structure and narrative: `context.md`
19
19
 
20
20
  ## What goes in
@@ -40,7 +40,7 @@ Use `## Problem`, `## Goals`, `## Non-goals`, `## MVP features`, `## Tech stack`
40
40
 
41
41
  The MVP list is a historical record of the original scope. Once those features ship it stays as written. Do not renumber it, do not append to it, and do not annotate entries with status. A reader telling the original scope apart from what followed depends on the first one staying legible.
42
42
 
43
- Later scope arrives as a new section rather than as an extension of the MVP list. Name the section for what it delivers and state its entries as outcomes, the same way the goals are stated. Nothing sequences either list into versions. Work reaches the board as discrete tasks under `tasks.md`, which orders them by readiness, so a section here states what is wanted and never when it lands.
43
+ Later scope arrives as a new section rather than as an extension of the MVP list. Name the section for what it delivers and state its entries as outcomes, the same way the goals are stated. Nothing sequences either list into versions. Work reaches the board as discrete tasks under `tasks.md`, and `board.md` orders them by readiness, so a section here states what is wanted and never when it lands.
44
44
 
45
45
  ## Distribution
46
46