@erclx/canon 4.120.0 → 4.122.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 +29 -115
- package/claude/skills/auto-ship/references/draft-mark.md +30 -0
- package/claude/skills/auto-ship/references/failure-recovery.md +27 -0
- package/claude/skills/auto-ship/references/tier-failures.md +26 -0
- package/claude/skills/auto-ship/references/verb-absent.md +37 -0
- package/claude/skills/auto-ship/references/worktree-name.md +22 -0
- package/claude/skills/backlog-triage/REQUIREMENT.md +47 -0
- package/claude/skills/backlog-triage/SKILL.md +139 -0
- package/claude/skills/bash-script/SKILL.md +1 -1
- package/claude/skills/bash-script/references/patterns.md +0 -99
- package/claude/skills/bash-script/references/prompts.md +100 -0
- package/claude/skills/canon-rollout/SKILL.md +6 -6
- package/claude/skills/context-fold/REQUIREMENT.md +75 -0
- package/claude/skills/context-fold/SKILL.md +162 -0
- package/claude/skills/{docs-fold → context-fold}/references/anchor-sweep.md +1 -1
- package/claude/skills/{docs-fold → context-fold}/references/classify.md +4 -2
- package/claude/skills/context-fold/references/context-refresh.md +48 -0
- package/claude/skills/context-fold/references/promoted-pages.md +29 -0
- package/claude/skills/context-fold/references/receipt-sweep.md +43 -0
- package/claude/skills/context-fold/references/unusable-baseline.md +25 -0
- package/claude/skills/{docs-fold → context-fold}/references/wireframe-sweep.md +1 -1
- package/claude/skills/create-skill/SKILL.md +1 -1
- package/claude/skills/create-snippet/SKILL.md +1 -1
- package/claude/skills/create-standard/SKILL.md +1 -1
- package/claude/skills/design-extract/SKILL.md +1 -1
- package/claude/skills/design-taste/REQUIREMENT.md +2 -2
- package/claude/skills/docs-fold/REQUIREMENT.md +8 -58
- package/claude/skills/docs-fold/SKILL.md +3 -278
- package/claude/skills/docs-sync/REQUIREMENT.md +1 -1
- package/claude/skills/docs-sync/SKILL.md +2 -2
- package/claude/skills/draft-context/REQUIREMENT.md +2 -2
- package/claude/skills/draft-context/SKILL.md +4 -4
- package/claude/skills/draft-docs/REQUIREMENT.md +1 -1
- package/claude/skills/draft-docs/SKILL.md +1 -1
- package/claude/skills/draft-figure/SKILL.md +1 -1
- package/claude/skills/draft-readme/SKILL.md +1 -1
- package/claude/skills/draft-wiki/SKILL.md +1 -1
- package/claude/skills/draft-wireframes/REQUIREMENT.md +1 -1
- package/claude/skills/draft-wireframes/SKILL.md +3 -3
- package/claude/skills/git-issue/SKILL.md +1 -1
- package/claude/skills/git-issue/references/issue.md +1 -1
- package/claude/skills/git-pr/SKILL.md +9 -147
- package/claude/skills/git-pr/references/evidence.md +114 -0
- package/claude/skills/git-pr/references/labels.md +20 -0
- package/claude/skills/git-pr/references/task-number.md +26 -0
- package/claude/skills/git-ship/SKILL.md +1 -1
- package/claude/skills/git-stage/SKILL.md +1 -1
- package/claude/skills/memory-capture/REQUIREMENT.md +2 -2
- package/claude/skills/memory-capture/SKILL.md +6 -6
- package/claude/skills/memory-review/REQUIREMENT.md +1 -1
- package/claude/skills/memory-review/SKILL.md +5 -101
- package/claude/skills/memory-review/references/later-phases.md +108 -0
- package/claude/skills/plan-feature/REQUIREMENT.md +1 -1
- package/claude/skills/restate-plainly/REQUIREMENT.md +1 -1
- package/claude/skills/review-address/REQUIREMENT.md +1 -1
- package/claude/skills/review-address/SKILL.md +5 -4
- package/claude/skills/review-branch/REQUIREMENT.md +1 -0
- package/claude/skills/review-branch/SKILL.md +6 -7
- package/claude/skills/review-craft/REQUIREMENT.md +43 -0
- package/claude/skills/review-craft/SKILL.md +50 -0
- package/claude/skills/review-craft/references/security.md +21 -0
- package/claude/skills/review-craft/references/ui.md +72 -0
- package/claude/skills/review-pr/REQUIREMENT.md +1 -0
- package/claude/skills/review-pr/SKILL.md +1 -1
- package/claude/skills/review-pr/references/post.md +1 -1
- package/claude/skills/role-orchestrator/references/orchestrator-dispatch.md +1 -1
- package/claude/skills/role-orchestrator/references/orchestrator-parked.md +2 -0
- package/claude/skills/role-orchestrator/references/orchestrator-refill.md +2 -2
- package/claude/skills/role-planner/REQUIREMENT.md +1 -1
- package/claude/skills/session-resume/REQUIREMENT.md +1 -1
- package/claude/skills/session-worktree/SKILL.md +4 -10
- package/claude/skills/standards-audit/SKILL.md +1 -1
- package/claude/skills/task-board/REQUIREMENT.md +1 -1
- package/claude/skills/task-board/SKILL.md +6 -80
- package/claude/skills/task-board/references/archive.md +54 -0
- package/claude/skills/task-board/references/decline.md +40 -0
- package/claude/skills/teach-workspace/SKILL.md +8 -105
- package/claude/skills/teach-workspace/references/lesson-craft.md +51 -1
- package/claude/skills/teach-workspace/references/promotion.md +41 -0
- package/claude/skills/write-human/REQUIREMENT.md +7 -4
- package/claude/skills/write-human/SKILL.md +4 -2
- package/claude/skills/write-human/references/machine-tells.md +1 -1
- package/claude/skills/write-human/references/source-material.md +5 -2
- package/docs/agents/architecture-record.md +26 -0
- package/docs/agents/audits.md +1 -1
- package/docs/agents/commands.md +87 -154
- package/docs/agents/context-audit-checks.md +2 -20
- package/docs/agents/context-audit.md +1 -1
- package/docs/agents/context-classify.md +1 -1
- package/docs/agents/drift-surfaces.md +192 -0
- package/docs/agents/index.md +12 -4
- package/docs/agents/install-and-sync.md +2 -181
- package/docs/agents/markdown-audit-weight.md +73 -0
- package/docs/agents/markdown-audit.md +11 -104
- package/docs/agents/migrate.md +34 -0
- package/docs/agents/pr-local.md +6 -3
- package/docs/agents/records-stale.md +62 -0
- package/docs/agents/records.md +5 -1
- package/docs/agents/sandbox.md +1 -1
- package/docs/agents/tasks-archive.md +81 -0
- package/docs/agents/tasks-plans.md +147 -0
- package/docs/agents/tasks-validate.md +131 -0
- package/docs/agents/tasks.md +6 -333
- package/docs/target-projects.md +4 -4
- package/docs/workflow/ai-workflow.md +33 -27
- package/governance/rules/claude/500-prose.md +1 -1
- package/governance/rules/claude/501-markdown.md +3 -3
- package/governance/rules/core/045-memory.md +1 -1
- package/package.json +1 -1
- package/src/autoship/paths.ts +3 -2
- package/src/claude/cases/setup.ts +1 -1
- package/src/claude/cases/workflow.ts +27 -1
- package/src/commands/audits.ts +2 -2
- package/src/commands/markdown.ts +7 -9
- package/src/commands/pr.ts +11 -4
- package/src/commands/records.ts +146 -0
- package/src/commands/sandbox.ts +6 -4
- package/src/context/classify/extract.ts +1 -1
- package/src/context/classify/ollama.ts +1 -1
- package/src/context/classify/run.ts +1 -1
- package/src/gate/measures.ts +5 -5
- package/src/gate/stages.ts +0 -1
- package/src/markdown/bans.ts +11 -68
- package/src/markdown/gate.ts +1 -1
- package/src/markdown/scan.ts +7 -88
- package/src/migrate/skill-names.ts +15 -2
- package/src/records/stale.ts +243 -0
- package/src/sandbox/expect.ts +1 -1
- package/src/tasks/archive.ts +28 -4
- package/src/tasks/record.ts +1 -1
- package/src/tasks/validate.ts +36 -3
- package/standards/docs.md +1 -1
- package/standards/index.md +1 -1
- package/standards/markdown.md +5 -7
- package/standards/memory.md +13 -1
- package/standards/pr.md +1 -1
- package/standards/publish.md +1 -1
- package/standards/readme.md +2 -2
- package/standards/tasks.md +1 -1
- package/tooling/astro/reference.md +1 -1
- package/tooling/base/configs/.husky/post-merge +1 -1
- package/tooling/base/configs/scripts/verify.sh +2 -2
- package/tooling/base/seeds/canon/context/development.md +1 -1
- package/tooling/claude/reference.md +1 -1
- package/tooling/claude/seeds/.claude/hooks/standards-audit.sh +5 -6
- package/tooling/go/reference.md +1 -1
- package/tooling/nextjs/reference.md +1 -1
- package/tooling/php/reference.md +1 -1
- package/tooling/python/reference.md +1 -1
- package/tooling/vite-react/reference.md +1 -1
- package/tooling/web/reference.md +1 -1
package/src/tasks/record.ts
CHANGED
|
@@ -353,7 +353,7 @@ export async function recordPlan(
|
|
|
353
353
|
}
|
|
354
354
|
|
|
355
355
|
/**
|
|
356
|
-
* Marks the named outcomes `[x]` in place. `
|
|
356
|
+
* Marks the named outcomes `[x]` in place. `context-fold` runs this against a
|
|
357
357
|
* board it can read and cannot edit from a linked worktree, and the positions
|
|
358
358
|
* come from the read it already made.
|
|
359
359
|
*/
|
package/src/tasks/validate.ts
CHANGED
|
@@ -7,6 +7,7 @@ import {
|
|
|
7
7
|
isReservedStem,
|
|
8
8
|
readOutcomes,
|
|
9
9
|
readPlanTarget,
|
|
10
|
+
readPlanTargets,
|
|
10
11
|
readPullRequest,
|
|
11
12
|
resolveLivePlan,
|
|
12
13
|
tasksDir,
|
|
@@ -41,6 +42,7 @@ export const FINDING_KINDS = [
|
|
|
41
42
|
'plan-mismatched',
|
|
42
43
|
'plan-parked',
|
|
43
44
|
'plan-absent',
|
|
45
|
+
'plan-several',
|
|
44
46
|
'task-unresolved',
|
|
45
47
|
'row-duplicated',
|
|
46
48
|
'row-misshapen',
|
|
@@ -563,7 +565,7 @@ async function listTaskStems(dir: string): Promise<string[]> {
|
|
|
563
565
|
|
|
564
566
|
/**
|
|
565
567
|
* Resolves a pointer against the board and against the project root both, the
|
|
566
|
-
* way `
|
|
568
|
+
* way `context-fold` reads the same line. A fragment is dropped first, since an
|
|
567
569
|
* anchor is part of the link and never part of the path.
|
|
568
570
|
*/
|
|
569
571
|
function resolves(target: string, dir: string, root: string): boolean {
|
|
@@ -728,8 +730,12 @@ async function planDisagreement(
|
|
|
728
730
|
const file = join(dir, `${row.stem}.md`)
|
|
729
731
|
if (!existsSync(file)) return undefined
|
|
730
732
|
|
|
731
|
-
const
|
|
733
|
+
const text = await readFile(file, 'utf8')
|
|
734
|
+
const target = readPlanTarget(text)
|
|
732
735
|
if (!target) {
|
|
736
|
+
const several = severalPlans(text, 'Run now', subject)
|
|
737
|
+
if (several) return several
|
|
738
|
+
|
|
733
739
|
return {
|
|
734
740
|
kind: 'plan-uncited',
|
|
735
741
|
group: 'Run now',
|
|
@@ -787,7 +793,13 @@ async function groupClaimFinding(
|
|
|
787
793
|
const file = join(dir, `${row.stem}.md`)
|
|
788
794
|
if (!existsSync(file)) return undefined
|
|
789
795
|
|
|
790
|
-
const
|
|
796
|
+
const text = await readFile(file, 'utf8')
|
|
797
|
+
const target = readPlanTarget(text)
|
|
798
|
+
if (!target) {
|
|
799
|
+
const several = severalPlans(text, row.group, row.stem)
|
|
800
|
+
if (several) return several
|
|
801
|
+
}
|
|
802
|
+
|
|
791
803
|
const live = target ? resolveLivePlan(target, dir, root) : undefined
|
|
792
804
|
const hasLivePlan = live !== undefined && existsSync(live)
|
|
793
805
|
|
|
@@ -814,6 +826,27 @@ async function groupClaimFinding(
|
|
|
814
826
|
return undefined
|
|
815
827
|
}
|
|
816
828
|
|
|
829
|
+
/**
|
|
830
|
+
* Reports a `Plan:` line linking more than one plan. `readPlanTarget` reads
|
|
831
|
+
* such a line as naming nothing, so without this a caller would report the
|
|
832
|
+
* line as absent when it is there and breaks the one-plan rule instead.
|
|
833
|
+
*/
|
|
834
|
+
function severalPlans(
|
|
835
|
+
text: string,
|
|
836
|
+
group: Finding['group'],
|
|
837
|
+
subject: string,
|
|
838
|
+
): Finding | undefined {
|
|
839
|
+
const targets = readPlanTargets(text)
|
|
840
|
+
if (targets.length < 2) return undefined
|
|
841
|
+
|
|
842
|
+
return {
|
|
843
|
+
kind: 'plan-several',
|
|
844
|
+
group,
|
|
845
|
+
subject,
|
|
846
|
+
message: `cites ${targets.length} plans on its Plan: line (${targets.join(', ')}). One task names one plan, so split the task or drop the extra links.`,
|
|
847
|
+
}
|
|
848
|
+
}
|
|
849
|
+
|
|
817
850
|
/**
|
|
818
851
|
* Where a plan pointer lands, resolved against the board and against the
|
|
819
852
|
* project root the way the archive resolves the same line. Neither base
|
package/standards/docs.md
CHANGED
|
@@ -19,7 +19,7 @@ Does not govern:
|
|
|
19
19
|
- Per-domain internal narrative written for a reader with the source open: `context.md`
|
|
20
20
|
- The drawing inside a Mermaid fence: `mermaid.md`
|
|
21
21
|
- Voice, rhythm, and sentence construction: the `write-human` skill
|
|
22
|
-
-
|
|
22
|
+
- Punctuation and formatting: `markdown.md`
|
|
23
23
|
|
|
24
24
|
## What a working docs page looks like
|
|
25
25
|
|
package/standards/index.md
CHANGED
|
@@ -19,7 +19,7 @@ Reference docs for consistent authoring across the toolkit and target projects.
|
|
|
19
19
|
- [Glossary reference](glossary.md): Frontmatter, entry shape, ordering, and the rules deciding which terms a glossary carries
|
|
20
20
|
- [Groundwork reference](groundwork.md): Folder layout, ordinal naming, reserved numbering, frontmatter and dating, required file contents, and conventions for a measurement track
|
|
21
21
|
- [Intake reference](intake.md): Folder layout, ordinal naming, reserved index number, frontmatter and dating, the item template, the answer contract, and retrieval
|
|
22
|
-
- [Markdown reference](markdown.md): Headings, paragraph and list structure, code spans, the date form, punctuation, emphasis, file references,
|
|
22
|
+
- [Markdown reference](markdown.md): Headings, paragraph and list structure, code spans, the date form, punctuation, emphasis, file references, American spelling, and frontmatter wording
|
|
23
23
|
- [Memory reference](memory.md): Filename and type prefix, frontmatter, the body shape per type, links between entries, and the lifecycle from write to retire
|
|
24
24
|
- [Mermaid reference](mermaid.md): Direction and layout, node and edge budgets, accessibility fields, label punctuation, and render verification for a Mermaid diagram
|
|
25
25
|
- [Plan reference](plan.md): Filename and slug, required sections, the suggested-and-answer contract, and the lifecycle from the live folder to the archive
|
package/standards/markdown.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: Markdown reference
|
|
3
|
-
description: Headings, paragraph and list structure, code spans, the date form, punctuation, emphasis, file references,
|
|
3
|
+
description: Headings, paragraph and list structure, code spans, the date form, punctuation, emphasis, file references, American spelling, and frontmatter wording
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Markdown reference
|
|
@@ -9,11 +9,11 @@ Applies to markdown reference docs, READMEs, and inline documentation in repos.
|
|
|
9
9
|
|
|
10
10
|
## Scope
|
|
11
11
|
|
|
12
|
-
Governs what a check can decide about a markdown file: headings, paragraph and list structure, code spans and fences, the form a date takes, punctuation, emphasis, file references, the
|
|
12
|
+
Governs what a check can decide about a markdown file: headings, paragraph and list structure, code spans and fences, the form a date takes, punctuation, emphasis, file references, the spelling convention, what prose may claim about its sources, and the wording of a catalog title and description. It is an attribute standard rather than a document-type one, so it applies over documents whose shape another standard sets, and it carries no template because these rules are written across every document and have no shape of their own.
|
|
13
13
|
|
|
14
14
|
The two frontmatter fields it reaches are `title` and `description`. They are named here rather than in the statement above, since a backticked token in a scope statement's first sentence is published as the standard's jurisdiction.
|
|
15
15
|
|
|
16
|
-
The split with the voice guidance is what reads the rule rather than what the rule covers.
|
|
16
|
+
The split with the voice guidance is what reads the rule rather than what the rule covers. The character bans ship as data `canon markdown audit` and the installed audit hook both read, so a violation is measured on every run. Word choice, cadence, rhythm, and information density are judgments a reader settles, and those travel in the `canon:write-human` skill, which a markdown edit routes to.
|
|
17
17
|
|
|
18
18
|
Does not govern:
|
|
19
19
|
|
|
@@ -71,9 +71,7 @@ Does not govern:
|
|
|
71
71
|
|
|
72
72
|
## Language
|
|
73
73
|
|
|
74
|
-
- Use American English spelling
|
|
75
|
-
- Do not use marketing buzzwords (`seamless`, `robust`, `powerful`, `revolutionary`, `enhanced`, `allows`, `leverage`)
|
|
76
|
-
- Do not use vague qualifiers (`simply`, `just`, `easily`, `quickly`, `very`, `really`)
|
|
74
|
+
- Use American English spelling
|
|
77
75
|
- Open a sentence with its subject and action, not filler (`Note that`, `Basically`), a hollow connective (`That being said`, `It's worth noting`), or a gerund windup (`Leveraging the API...`). Substantive transitions that carry a real relationship are fine.
|
|
78
76
|
- Do not use the negative parallelism pattern (`It's not X, it's Y`, `not because X, but because Y`)
|
|
79
77
|
- Do not pad verb phrases or delay the action. Write the shortest form (`in order to` → `to`, `ensure that X is set` → `set X`, `By doing X, you can Y` → state Y directly).
|
|
@@ -84,7 +82,7 @@ Does not govern:
|
|
|
84
82
|
- Do not attribute a claim to an unnamed authority (`experts say`, `studies show`, `it is widely believed`). Name the source or cut the claim.
|
|
85
83
|
- Do not introduce a fact, name, date, or citation the source does not carry when rewriting existing text. A rewrite changes wording and never claims.
|
|
86
84
|
|
|
87
|
-
|
|
85
|
+
One command reads the character bans under `## Punctuation`. `canon markdown audit` ships them as package data, so a project that installed no standards is measured the same as one that did, and this file states them for a reader rather than for the parser. The spelling line above states a convention and ships no set, so a project's spell checker is what enforces it.
|
|
88
86
|
|
|
89
87
|
## Frontmatter descriptions
|
|
90
88
|
|
package/standards/memory.md
CHANGED
|
@@ -56,19 +56,21 @@ Write no entry for a fact another surface already owns. A fact about a domain be
|
|
|
56
56
|
|
|
57
57
|
## Frontmatter
|
|
58
58
|
|
|
59
|
-
Every entry carries
|
|
59
|
+
Every entry carries the three required fields, and a reviewed entry carries a fourth.
|
|
60
60
|
|
|
61
61
|
```yaml
|
|
62
62
|
---
|
|
63
63
|
title: A scope glob wide enough for a correct run can be wide enough for every wrong one
|
|
64
64
|
description: Omit a declaration key whose only passing value admits the whole tree
|
|
65
65
|
category: Project
|
|
66
|
+
reviewed: 2026-09-26
|
|
66
67
|
---
|
|
67
68
|
```
|
|
68
69
|
|
|
69
70
|
- `title` (required): the rule stated as a line a reader can act on, in sentence case.
|
|
70
71
|
- `description` (required): one line naming what the entry settles, so a reader scanning the catalog decides whether to open it.
|
|
71
72
|
- `category` (required): the type in sentence case, which is what groups the catalog.
|
|
73
|
+
- `reviewed` (optional): the `YYYY-MM-DD` date a review last read the entry and kept it. A review writes it and capture never does, so an entry without the field has never been reviewed. A rewrite of the entry carries the field through untouched, since dropping it sends a kept entry back to the front of the queue.
|
|
72
74
|
|
|
73
75
|
Never write the filename stem as the `title`. The stem is a slug, and an entry titled with it reads as an unwritten file in every catalog that renders the field.
|
|
74
76
|
|
|
@@ -103,6 +105,16 @@ Link a related entry as `[[name]]`, where `name` is the target's filename stem w
|
|
|
103
105
|
|
|
104
106
|
The catalog is generated from sibling frontmatter rather than authored. Never hand-edit it, since the next regeneration discards whatever was added by hand.
|
|
105
107
|
|
|
108
|
+
## Reading
|
|
109
|
+
|
|
110
|
+
Nothing loads the pen into every session, and that is the design. An entry reaches a reader through one of three paths:
|
|
111
|
+
|
|
112
|
+
- A review reads the pen in batches, taking entries in the order `canon records stale memory` reports: due entries first, those citing a path the tree no longer holds ahead of the rest, then the longest unreviewed.
|
|
113
|
+
- A resuming session reads the entries matching the task it picks up.
|
|
114
|
+
- Capture reads the catalog to find an existing entry on the same topic before writing a new one.
|
|
115
|
+
|
|
116
|
+
An entry none of the three reaches is one the pen holds for a review to promote or retire.
|
|
117
|
+
|
|
106
118
|
## Collecting a review receipt
|
|
107
119
|
|
|
108
120
|
A review of the pen writes a receipt recording what it proposed per entry and what was decided. The receipt is collected once every item on it has resolved, and it is held while any item is still pending, since a pending item is decision state the next round reads back.
|
package/standards/pr.md
CHANGED
|
@@ -16,7 +16,7 @@ Does not govern:
|
|
|
16
16
|
- Whether a phase label or a semver tag may appear in a title or body: `versioning.md`
|
|
17
17
|
- Whether a quoted label, a gitignored record path, or a link to one Claude Code session may appear in a title or body, which `canon labels scan` fails on: `publish.md`
|
|
18
18
|
- Voice, rhythm, and sentence construction in pull request prose: the `write-human` skill
|
|
19
|
-
- Punctuation
|
|
19
|
+
- Punctuation and formatting in pull request prose: `markdown.md`
|
|
20
20
|
|
|
21
21
|
## Title
|
|
22
22
|
|
package/standards/publish.md
CHANGED
|
@@ -26,7 +26,7 @@ Scope every check below by destination. Text published to a remote takes all of
|
|
|
26
26
|
|
|
27
27
|
## Banned characters
|
|
28
28
|
|
|
29
|
-
`markdown.md` holds the character bans
|
|
29
|
+
`markdown.md` holds the character bans. Read it at scan time rather than working the sets from memory, then scan the drafted text and rewrite each occurrence.
|
|
30
30
|
|
|
31
31
|
Restructure the sentence rather than substituting the character. A semicolon swapped for a period leaves both clauses in the order the semicolon chose, which is the shape the ban exists to remove.
|
|
32
32
|
|
package/standards/readme.md
CHANGED
|
@@ -5,7 +5,7 @@ description: Readme voice, structure, and content conventions
|
|
|
5
5
|
|
|
6
6
|
# Readme reference
|
|
7
7
|
|
|
8
|
-
Applies to every `README.md`. The `## Voice` section states the voice for a repository's root README, so the `write-human` skill yields to it there. The yield covers voice alone. The rhythm and density rules that skill carries stay in force, as
|
|
8
|
+
Applies to every `README.md`. The `## Voice` section states the voice for a repository's root README, so the `write-human` skill yields to it there. The yield covers voice alone. The rhythm and density rules that skill carries stay in force, as does the word-choice guidance that travels with them, and so do the punctuation and formatting in `markdown.md`, so the warmer register ships with the same hygiene: no em dashes, no semicolons, no marketing words.
|
|
9
9
|
|
|
10
10
|
The reader is what changes. Reference prose serves someone who already committed to the project and is scanning for a fact. A root README meets someone deciding whether to commit at all, and it is often the only file they read.
|
|
11
11
|
|
|
@@ -16,7 +16,7 @@ Governs every `README.md`: voice, heading structure, required and optional secti
|
|
|
16
16
|
Does not govern:
|
|
17
17
|
|
|
18
18
|
- Rhythm and sentence construction in README prose: the `write-human` skill, which yields the voice and keeps the rest
|
|
19
|
-
-
|
|
19
|
+
- Punctuation and formatting in README prose: `markdown.md`, which yields nothing
|
|
20
20
|
- Product scope and goals: `requirements.md`
|
|
21
21
|
- The consumer-facing reference under `docs/`, whose reader has already committed and is operating the project: `docs.md`
|
|
22
22
|
|
package/standards/tasks.md
CHANGED
|
@@ -51,7 +51,7 @@ The handoff takes one file per session for the reason a task does. A single shar
|
|
|
51
51
|
|
|
52
52
|
The catalog is the one reader that filters nothing, so it carries a row per sibling alongside the tasks. That is what a folder catalog is for, and the handoffs are what make it worth stating: a board accumulates one row per session that ever wrote one, with nothing pruning them. 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.
|
|
53
53
|
|
|
54
|
-
The `task-board` skill creates and archives task files, and the archive carries the task's plan with it. `
|
|
54
|
+
The `task-board` skill creates and archives task files, and the archive carries the task's plan with it. `context-fold` marks outcomes `[x]` in an existing file. Neither does the other's job.
|
|
55
55
|
|
|
56
56
|
## Ordering
|
|
57
57
|
|
|
@@ -58,7 +58,7 @@ Append to the `## Scripts` table:
|
|
|
58
58
|
|
|
59
59
|
## CI docs (extend)
|
|
60
60
|
|
|
61
|
-
In `canon/context/ci.md`, the Typecheck row's assertion reads: `` `astro check` passes ``. The Build row's assertion reads: `` `astro build` succeeds ``.
|
|
61
|
+
In `canon/context/ci.md`, the Typecheck row's assertion reads: `` `astro check` passes ``. The Build row's assertion reads: `` `astro build` succeeds ``. <!-- audit-ignore-citations: canon/context/ci.md -->
|
|
62
62
|
|
|
63
63
|
## Social card route
|
|
64
64
|
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
# to hand a worker. This is the only event that lands after a merge.
|
|
8
8
|
#
|
|
9
9
|
# Candidates rather than closed tasks, because an all-`[x]` board entry does not
|
|
10
|
-
# mean the work merged. `
|
|
10
|
+
# mean the work merged. `context-fold` marks outcomes on the branch as step 1 of
|
|
11
11
|
# the ship chain, so a task can read closed while its pull request is still open
|
|
12
12
|
# or already abandoned. The board is gitignored and an archived task has nothing
|
|
13
13
|
# to recover it, so `task-board` confirms the work is on `main` before moving
|
|
@@ -48,14 +48,14 @@ check_markdown_bans() {
|
|
|
48
48
|
|
|
49
49
|
case "$code" in
|
|
50
50
|
0)
|
|
51
|
-
log_info "No banned character
|
|
51
|
+
log_info "No banned character"
|
|
52
52
|
;;
|
|
53
53
|
1)
|
|
54
54
|
log_info "Skipped: canon markdown audit refused and measured nothing."
|
|
55
55
|
;;
|
|
56
56
|
2)
|
|
57
57
|
echo "$output" | pipe_output
|
|
58
|
-
log_error "Markdown prose carries a banned character,
|
|
58
|
+
log_error "Markdown prose carries a banned character, or a relative link resolves to nothing on disk"
|
|
59
59
|
;;
|
|
60
60
|
3)
|
|
61
61
|
echo "$output" | pipe_output
|
|
@@ -34,4 +34,4 @@ All `.sh` files live under `scripts/`. Do not place shell scripts outside `scrip
|
|
|
34
34
|
|
|
35
35
|
- `pre-commit` runs `lint-staged` (prettier, cspell, shfmt, shellcheck on staged files).
|
|
36
36
|
- `commit-msg` runs `commitlint` against the conventional commit format.
|
|
37
|
-
- `pre-push` runs `bun run check`. When a markdown-bans audit tool is on PATH, it also gates on banned characters
|
|
37
|
+
- `pre-push` runs `bun run check`. When a markdown-bans audit tool is on PATH, it also gates on banned characters across every tracked markdown file except `CHANGELOG.md`. After pushing, run `git status`. If files changed, commit the diff as `style(<scope>):` and push again.
|
|
@@ -25,7 +25,7 @@ canon/
|
|
|
25
25
|
.canon/
|
|
26
26
|
├── tasks/ ← seeded. One file per task plus a generated index.md, local scratch only. `archive/` holds the tasks that shipped.
|
|
27
27
|
├── diagrams/ ← seeded. Per-kind Mermaid views. `index.md` is the discovery anchor. `<kind>.md` files hold one diagram each, grouped by the `category` frontmatter field.
|
|
28
|
-
├── plans/ ← execution detail for multi-step tasks. `feature-*.md` entries swept by
|
|
28
|
+
├── plans/ ← execution detail for multi-step tasks. `feature-*.md` entries swept by context-fold into `archive/`.
|
|
29
29
|
├── review/ ← one subfolder per producer. `branch/` for review-branch, `feedback/` for canon feedback, `memory/` for memory-review with its own `archive/`, `design/` for canon design render.
|
|
30
30
|
├── tmp/ ← ephemeral scratch space, safe to delete without loss
|
|
31
31
|
└── memory/ ← session facts no context entry owns. `index.md` regenerated by a hook.
|
|
@@ -28,12 +28,11 @@ esac
|
|
|
28
28
|
|
|
29
29
|
[ -f "$file" ] || exit 0
|
|
30
30
|
|
|
31
|
-
# The audit verb owns the ban
|
|
32
|
-
#
|
|
33
|
-
# hardcoded the
|
|
34
|
-
#
|
|
35
|
-
#
|
|
36
|
-
# now reaches this hook without an edit here.
|
|
31
|
+
# The audit verb owns the ban set, so this hook carries no copy of it. The awk
|
|
32
|
+
# this replaces parsed its bans out of the project's own standards and
|
|
33
|
+
# hardcoded the rest, so edit time and a later corpus check could disagree with
|
|
34
|
+
# nothing in between explaining the difference. A ban added to the verb now
|
|
35
|
+
# reaches this hook without an edit here.
|
|
37
36
|
#
|
|
38
37
|
# The verb resolves its own paths under the cwd, so the project root is named
|
|
39
38
|
# rather than inherited. The payload carries an absolute file path, which is
|
package/tooling/go/reference.md
CHANGED
|
@@ -57,4 +57,4 @@ Append to the `## Scripts` table:
|
|
|
57
57
|
|
|
58
58
|
## CI docs (extend)
|
|
59
59
|
|
|
60
|
-
In `canon/context/ci.md`, the Typecheck row's assertion reads: `` `go vet ./...` passes ``. Add a Lint row whose assertion reads: `` `golangci-lint run` passes ``. Add a Tests row whose assertion reads: `` `go test -race ./...` exits 0 ``.
|
|
60
|
+
In `canon/context/ci.md`, the Typecheck row's assertion reads: `` `go vet ./...` passes ``. Add a Lint row whose assertion reads: `` `golangci-lint run` passes ``. Add a Tests row whose assertion reads: `` `go test -race ./...` exits 0 ``. <!-- audit-ignore-citations: canon/context/ci.md -->
|
|
@@ -50,4 +50,4 @@ Append to the `## Scripts` table:
|
|
|
50
50
|
|
|
51
51
|
## CI docs (extend)
|
|
52
52
|
|
|
53
|
-
In `canon/context/ci.md`, the Typecheck row's assertion reads: `` `next typegen && tsc --noEmit` passes ``.
|
|
53
|
+
In `canon/context/ci.md`, the Typecheck row's assertion reads: `` `next typegen && tsc --noEmit` passes ``. <!-- audit-ignore-citations: canon/context/ci.md -->
|
package/tooling/php/reference.md
CHANGED
|
@@ -71,4 +71,4 @@ Append to the `## Scripts` table:
|
|
|
71
71
|
|
|
72
72
|
## CI docs (extend)
|
|
73
73
|
|
|
74
|
-
In `canon/context/ci.md`, the Typecheck row's assertion reads: `` `phpstan analyse` passes ``. Add a Lint row whose assertion reads: `` `php-cs-fixer check` passes ``. Add a Tests row whose assertion reads: `` `phpunit` exits 0 ``.
|
|
74
|
+
In `canon/context/ci.md`, the Typecheck row's assertion reads: `` `phpstan analyse` passes ``. Add a Lint row whose assertion reads: `` `php-cs-fixer check` passes ``. Add a Tests row whose assertion reads: `` `phpunit` exits 0 ``. <!-- audit-ignore-citations: canon/context/ci.md -->
|
|
@@ -62,4 +62,4 @@ Append to the `## Scripts` table:
|
|
|
62
62
|
|
|
63
63
|
## CI docs (extend)
|
|
64
64
|
|
|
65
|
-
In `canon/context/ci.md`, the Typecheck row's assertion reads: `` `mypy .` passes ``. Add a Lint row whose assertion reads: `` `ruff check` and `ruff format --check` pass ``. Add a Tests row whose assertion reads: `` `pytest` exits 0 ``.
|
|
65
|
+
In `canon/context/ci.md`, the Typecheck row's assertion reads: `` `mypy .` passes ``. Add a Lint row whose assertion reads: `` `ruff check` and `ruff format --check` pass ``. Add a Tests row whose assertion reads: `` `pytest` exits 0 ``. <!-- audit-ignore-citations: canon/context/ci.md -->
|
|
@@ -52,4 +52,4 @@ Append to the `## Scripts` table:
|
|
|
52
52
|
|
|
53
53
|
## CI docs (extend)
|
|
54
54
|
|
|
55
|
-
In `canon/context/ci.md`, the Typecheck row's assertion reads: `` `tsc --noEmit` passes ``.
|
|
55
|
+
In `canon/context/ci.md`, the Typecheck row's assertion reads: `` `tsc --noEmit` passes ``. <!-- audit-ignore-citations: canon/context/ci.md -->
|
package/tooling/web/reference.md
CHANGED
|
@@ -84,7 +84,7 @@ Sticky negative knowledge. Do not relearn.
|
|
|
84
84
|
|
|
85
85
|
## CI docs (extend)
|
|
86
86
|
|
|
87
|
-
Extend `canon/context/ci.md` so the `## Checks` table reflects the web jobs.
|
|
87
|
+
Extend `canon/context/ci.md` so the `## Checks` table reflects the web jobs. <!-- audit-ignore-citations: canon/context/ci.md -->
|
|
88
88
|
|
|
89
89
|
Append rows:
|
|
90
90
|
|