@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.
- package/claude/.claude-plugin/plugin.json +1 -1
- package/claude/skills/auto-ship/SKILL.md +7 -8
- package/claude/skills/auto-ship/references/tier-failures.md +7 -4
- package/claude/skills/backlog-triage/SKILL.md +1 -1
- package/claude/skills/codebase-layout/REQUIREMENT.md +1 -1
- package/claude/skills/codebase-layout/SKILL.md +1 -1
- package/claude/skills/create-rule/SKILL.md +5 -2
- package/claude/skills/design-taste/SKILL.md +1 -1
- package/claude/skills/draft-ready/REQUIREMENT.md +1 -1
- package/claude/skills/draft-ready/SKILL.md +1 -1
- package/claude/skills/git-ship/SKILL.md +4 -3
- package/claude/skills/memory-capture/SKILL.md +14 -4
- package/claude/skills/memory-review/REQUIREMENT.md +4 -2
- package/claude/skills/memory-review/SKILL.md +18 -7
- package/claude/skills/memory-review/references/later-phases.md +7 -4
- package/claude/skills/memory-review/references/receipt-format.md +19 -3
- package/claude/skills/role-orchestrator/SKILL.md +2 -2
- package/claude/skills/role-orchestrator/references/orchestrator-parked.md +2 -2
- package/claude/skills/session-resume/SKILL.md +4 -3
- package/claude/skills/task-board/SKILL.md +1 -1
- package/claude/skills/task-board/references/archive.md +1 -1
- package/claude/skills/task-board/references/decline.md +1 -1
- package/claude/skills/test-first/REQUIREMENT.md +1 -1
- package/docs/agents/counts.md +3 -3
- package/docs/agents/drift-surfaces.md +2 -2
- package/docs/agents/rule-citations.md +4 -4
- package/docs/agents/tasks-archive.md +3 -3
- package/docs/agents/tasks-plans.md +5 -3
- package/docs/agents/tasks-validate.md +1 -1
- package/docs/agents/tasks.md +1 -1
- package/docs/agents/test-order.md +1 -1
- package/docs/index.md +3 -0
- package/docs/target-migrations.md +93 -0
- package/docs/target-projects.md +4 -216
- package/docs/target-scenarios.md +56 -0
- package/docs/target-sync.md +93 -0
- package/docs/workflow/ai-workflow.md +4 -203
- package/docs/workflow/index.md +2 -0
- package/docs/workflow/operating-model.md +18 -47
- package/docs/workflow/parallel-features.md +77 -0
- package/docs/workflow/skill-map.md +148 -0
- package/governance/renames.toml +34 -0
- package/governance/rules/{claude/555-tasks.md → canon/655-tasks.md} +2 -1
- package/governance/rules/{claude/560-diagrams.md → canon/660-diagrams.md} +1 -1
- package/governance/rules/{claude/562-session.md → canon/662-session.md} +1 -1
- package/governance/rules/code/000-code.md +21 -0
- package/governance/rules/lib/300-testing-ts.md +0 -4
- package/governance/rules/lib/330-testing-py.md +0 -4
- package/governance/rules/{claude/500-prose.md → writing/800-prose.md} +1 -1
- package/governance/rules/{claude/501-markdown.md → writing/801-markdown.md} +1 -1
- package/governance/rules/{claude/502-mermaid.md → writing/802-mermaid.md} +1 -1
- package/governance/stacks/base.toml +7 -6
- package/governance/stacks/node.toml +1 -1
- package/governance/stacks/python.toml +1 -1
- package/package.json +1 -1
- package/scripts/core/install-check.sh +3 -5
- package/src/claude/routing.ts +1 -1
- package/src/commands/gov.ts +1 -1
- package/src/commands/tasks.ts +39 -29
- package/src/gate/measures.ts +1 -6
- package/src/gate/stages.ts +1 -0
- package/src/gov/citations.ts +1 -1
- package/src/gov/list.ts +1 -1
- package/src/gov/restated.ts +2 -2
- package/src/init/steps.ts +1 -1
- package/src/labels/spelling.ts +1 -1
- package/src/records/prune.ts +1 -1
- package/src/shipped/references.ts +1 -1
- package/src/tasks/archive.ts +212 -105
- package/src/tasks/reach.ts +1 -1
- package/src/tasks/record.ts +59 -16
- package/src/tasks/validate.ts +1 -1
- package/standards/board.md +136 -0
- package/standards/commit.md +5 -0
- package/standards/groundwork.md +25 -36
- package/standards/index.md +2 -1
- package/standards/plan.md +20 -34
- package/standards/readme.md +8 -77
- package/standards/requirements.md +2 -2
- package/standards/rule.md +4 -6
- package/standards/tasks.md +18 -125
- package/standards/versioning.md +1 -1
- package/tooling/base/configs/commitlint.config.js +27 -1
- package/tooling/base/reference.md +2 -2
- package/tooling/claude/seeds/.claude/hooks/path-form.sh +1 -1
- package/tooling/claude/seeds/.claude/hooks/scratch-guard.sh +1 -1
- package/tooling/web/reference.md +1 -1
- package/governance/rules/core/000-constitution.md +0 -30
- package/governance/rules/core/020-concurrency.md +0 -22
- package/governance/rules/core/030-error-handling.md +0 -31
- package/governance/rules/core/040-performance.md +0 -20
- package/governance/rules/core/050-logging.md +0 -20
- package/governance/rules/core/060-naming.md +0 -19
- package/governance/rules/snippets/600-at-references.md +0 -9
- /package/governance/rules/{core/025-indexes.md → canon/601-indexes.md} +0 -0
- /package/governance/rules/{core/035-tasks.md → canon/602-tasks.md} +0 -0
- /package/governance/rules/{core/045-memory.md → canon/603-memory.md} +0 -0
- /package/governance/rules/{core/055-scratch.md → canon/604-scratch.md} +0 -0
- /package/governance/rules/{core/085-worktrees.md → canon/605-worktrees.md} +0 -0
- /package/governance/rules/{core/087-git.md → canon/606-git.md} +0 -0
- /package/governance/rules/{claude/510-context.md → canon/610-context.md} +0 -0
- /package/governance/rules/{claude/511-indexes.md → canon/611-indexes.md} +0 -0
- /package/governance/rules/{claude/520-wireframes.md → canon/620-wireframes.md} +0 -0
- /package/governance/rules/{claude/530-requirements.md → canon/630-requirements.md} +0 -0
- /package/governance/rules/{claude/540-architecture.md → canon/640-architecture.md} +0 -0
- /package/governance/rules/{claude/545-decisions.md → canon/645-decisions.md} +0 -0
- /package/governance/rules/{claude/550-design.md → canon/650-design.md} +0 -0
- /package/governance/rules/{claude/556-groundwork.md → canon/656-groundwork.md} +0 -0
- /package/governance/rules/{claude/557-intake.md → canon/657-intake.md} +0 -0
- /package/governance/rules/{claude/558-plan.md → canon/658-plan.md} +0 -0
- /package/governance/rules/{claude/559-memory.md → canon/659-memory.md} +0 -0
- /package/governance/rules/{claude/561-teach.md → canon/661-teach.md} +0 -0
- /package/governance/rules/{claude/563-ready.md → canon/663-ready.md} +0 -0
- /package/governance/rules/{core/005-behavior.md → claude/565-behavior.md} +0 -0
- /package/governance/rules/{core/015-output.md → claude/566-output.md} +0 -0
- /package/governance/rules/{core/070-planning.md → claude/567-planning.md} +0 -0
- /package/governance/rules/{core → code}/010-testing.md +0 -0
- /package/governance/rules/{ci → tooling}/700-ci-workflow.md +0 -0
- /package/governance/rules/{core/065-spelling.md → tooling/765-spelling.md} +0 -0
- /package/governance/rules/{core/075-dependencies.md → tooling/775-dependencies.md} +0 -0
- /package/governance/rules/{core/080-config-comments.md → tooling/780-config-comments.md} +0 -0
- /package/governance/rules/{core/090-code-comments.md → tooling/790-code-comments.md} +0 -0
- /package/governance/rules/{claude/580-readme.md → writing/880-readme.md} +0 -0
- /package/governance/rules/{claude/591-standard-authoring.md → writing/891-standard-authoring.md} +0 -0
package/src/tasks/validate.ts
CHANGED
|
@@ -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/
|
|
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.
|
package/standards/commit.md
CHANGED
|
@@ -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
|
package/standards/groundwork.md
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
30
|
-
- With neither folder holding an entry, the first one opened takes `01
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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,
|
|
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
|
|
127
|
-
- The method, stated fully enough for a later reader to re-run it. Name the fixture and where it lived,
|
|
128
|
-
- The result, and which question it closes.
|
|
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
|
|
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
|
|
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
|
|
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/`
|
|
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.
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
package/standards/index.md
CHANGED
|
@@ -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,
|
|
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
|
|
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:**`.
|
|
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
|
|
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
|
|
69
|
-
- Read the list as what the branch sets out to write rather than as a bound on it
|
|
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
|
|
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
|
|
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
|
|
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,
|
|
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
|
|
84
|
-
- Stamp the commit
|
|
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
|
|
86
|
-
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
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
|
|
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
|
package/standards/readme.md
CHANGED
|
@@ -147,85 +147,16 @@ See the [contributing guidelines](CONTRIBUTING.md).
|
|
|
147
147
|
|
|
148
148
|
### Correct
|
|
149
149
|
|
|
150
|
-
|
|
151
|
-
#
|
|
152
|
-
|
|
153
|
-
|
|
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
|
-
|
|
198
|
-
#
|
|
199
|
-
|
|
200
|
-
|
|
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: `
|
|
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`,
|
|
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
|
|