@erclx/aitk 0.52.0 → 0.53.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 (36) hide show
  1. package/claude/.claude-plugin/plugin.json +1 -1
  2. package/claude/skills/claude-design-extract/SKILL.md +2 -1
  3. package/claude/skills/claude-docs/SKILL.md +1 -1
  4. package/claude/skills/claude-memory-capture/SKILL.md +2 -1
  5. package/claude/skills/claude-standards-audit/SKILL.md +5 -3
  6. package/claude/skills/create-skill/SKILL.md +2 -1
  7. package/claude/skills/create-snippet/SKILL.md +3 -2
  8. package/claude/skills/create-snippet/references/snippets.md +2 -1
  9. package/claude/skills/create-standard/SKILL.md +2 -1
  10. package/claude/skills/docs-sync/SKILL.md +2 -1
  11. package/claude/skills/git-issue/SKILL.md +2 -1
  12. package/claude/skills/git-issue/references/issue.md +2 -1
  13. package/claude/skills/git-pr/SKILL.md +2 -1
  14. package/claude/skills/git-pr/references/pr.md +2 -1
  15. package/claude/skills/git-split/references/pr.md +2 -1
  16. package/claude/skills/git-stage/SKILL.md +2 -1
  17. package/governance/rules/claude/500-prose.md +4 -3
  18. package/governance/rules/claude/501-markdown.md +13 -0
  19. package/governance/stacks/base.toml +1 -1
  20. package/package.json +1 -1
  21. package/scripts/core/install-check.sh +1 -1
  22. package/src/comments/vocabulary.ts +1 -1
  23. package/standards/bundled/issue.md +2 -1
  24. package/standards/bundled/pr.md +2 -1
  25. package/standards/bundled/snippets.md +2 -1
  26. package/standards/diagrams.md +4 -3
  27. package/standards/index.md +2 -1
  28. package/standards/markdown.md +72 -0
  29. package/standards/prose.md +6 -57
  30. package/standards/publish.md +3 -2
  31. package/standards/readme.md +3 -2
  32. package/standards/skill.md +2 -1
  33. package/standards/standard.md +2 -1
  34. package/standards/versioning.md +2 -1
  35. package/standards/wireframes.md +3 -2
  36. package/tooling/claude/seeds/.claude/hooks/standards-audit.sh +5 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "aitk",
3
3
  "description": "Automated governance, versioning, and discovery tools for Claude Code.",
4
- "version": "0.52.0",
4
+ "version": "0.53.0",
5
5
  "author": {
6
6
  "name": "Eric Le",
7
7
  "url": "https://github.com/erclx"
@@ -33,6 +33,7 @@ Read these from the project root on both paths, skipping any that do not exist:
33
33
  - `CLAUDE.md`: voice, personality, spelling rules
34
34
  - `.claude/REQUIREMENTS.md`: the `## Personality` paragraph, worldview, non-goals
35
35
  - `.claude/standards/prose.md`: tone constraints
36
+ - `.claude/standards/markdown.md`: punctuation and formatting constraints
36
37
 
37
38
  Read a standard from `${CLAUDE_SKILL_DIR}/../../standards/` instead when the project does not have it.
38
39
 
@@ -54,7 +55,7 @@ Use the returned content as the target shape. Keep every section heading and eve
54
55
 
55
56
  ## Step 4: fill the template
56
57
 
57
- Walk each section once. Follow `.claude/standards/prose.md` throughout: no em dashes, no semicolons, no marketing buzzwords. Use commas or separate sentences instead.
58
+ Walk each section once. Follow `.claude/standards/markdown.md` for punctuation and `.claude/standards/prose.md` for word choice throughout: no em dashes, no semicolons, no marketing buzzwords. Use commas or separate sentences instead.
58
59
 
59
60
  Mark any cell not traced to a source value by appending ` ? verify` inside the cell value, never as a trailing column. The cell stays inside the table shape: `| #ffffff ? verify |`. A trailing `| ? verify` after the row breaks the parser. A prose section takes its uncertainty inline instead, for example `Proposed 150ms ease-out, not yet confirmed.`, because a trailing tag on a sentence renders raw in the preview.
60
61
 
@@ -97,7 +97,7 @@ For each doc with relevant changes, apply updates following these rules. Read a
97
97
 
98
98
  - Update only the sections affected by session decisions.
99
99
  - Do not rewrite sections unrelated to what changed.
100
- - Follow `.claude/standards/prose.md` for all edits.
100
+ - Follow `.claude/standards/prose.md` and `.claude/standards/markdown.md` for all edits.
101
101
 
102
102
  Write each updated file immediately. Claude Code's tool permission dialog is the confirmation gate. Do not wait for user input.
103
103
 
@@ -23,7 +23,8 @@ Read in parallel from the project root, skipping any that do not exist:
23
23
  - `CLAUDE.md`: Memory section rules, including save thresholds and file format overrides
24
24
  - `.claude/memory/index.md`: existing index, to avoid duplicates
25
25
  - `.claude/context/index.md`: the domain catalog Step 3 routes against
26
- - `.claude/standards/prose.md`: prose conventions applied to memory file bodies
26
+ - `.claude/standards/prose.md`: voice and banned words applied to memory file bodies
27
+ - `.claude/standards/markdown.md`: punctuation and formatting applied to memory file bodies
27
28
 
28
29
  Read a standard from `${CLAUDE_SKILL_DIR}/../../standards/` instead when the project does not have it.
29
30
 
@@ -9,6 +9,7 @@ description: Audits changed markdown files against every authoring standard that
9
9
 
10
10
  - Resolve the base ref first, per Diff baseline below, then scope the file list exactly as Step 1 does, fallback included. If no markdown files changed, stop: `✅ No markdown changes to audit.` A guard that reads bare local `main`, or that skips the unusable-baseline fallback, passes the skill clean on a branch it never read.
11
11
  - If neither `.claude/standards/prose.md` nor `${CLAUDE_SKILL_DIR}/../../standards/prose.md` is present, stop: `❌ prose.md standard not found. Install toolkit standards first.` Test the file rather than the directory, since a project that installed standards before a given file existed keeps the directory without ever receiving that file.
12
+ - Apply the same test to `markdown.md`, stopping with its own name. It carries the character bans and the formatting rules, so a run reaching only `prose.md` reports word choice against a clean file and calls the pass complete.
12
13
 
13
14
  ## Diff baseline
14
15
 
@@ -72,7 +73,7 @@ Read each applicable standard once. For each changed file, audit against every r
72
73
  - **Pattern rules**: grep the file for every token the standard bans. Grep is authoritative. Reading alone misses occurrences.
73
74
  - **Judgment rules**: check each rule in context against the standard that states it.
74
75
 
75
- Every changed markdown file gets the prose pattern pass, since `.claude/standards/prose.md` applies to all of them. Take the banned tokens from that standard at read time rather than from a list held here.
76
+ Every changed markdown file gets the prose pattern pass, since `.claude/standards/prose.md` and `.claude/standards/markdown.md` both apply to all of them. Take the banned tokens from those standards at read time rather than from a list held here. The banned words sit in the first and the banned characters in the second, so a pass reading one file finds half the tokens.
76
77
 
77
78
  ## Step 4: report
78
79
 
@@ -81,8 +82,9 @@ Group findings by file with line references, naming the standard each one comes
81
82
  ```markdown
82
83
  path/to/file.md
83
84
 
84
- - L12: `prose.md`, em dash in prose
85
- - L34: `prose.md`, semicolon used to join clauses
85
+ - L12: `markdown.md`, em dash in prose
86
+ - L34: `markdown.md`, semicolon used to join clauses
87
+ - L51: `prose.md`, vague qualifier `simply`
86
88
  - L67: `context.md`, decision entry names no rejected alternative
87
89
  ```
88
90
 
@@ -9,7 +9,8 @@ disable-model-invocation: true
9
9
  Read these files from the project root in parallel:
10
10
 
11
11
  - `.claude/standards/skill.md`: skill structure, skill types, frontmatter fields, invocation rules
12
- - `.claude/standards/prose.md`: prose conventions for skill body text
12
+ - `.claude/standards/prose.md`: voice and banned words for skill body text
13
+ - `.claude/standards/markdown.md`: punctuation and formatting for skill body text
13
14
 
14
15
  Read a standard from `${CLAUDE_SKILL_DIR}/../../standards/` instead when the project does not have it.
15
16
 
@@ -7,10 +7,11 @@ description: Creates a new snippet file in `snippets/` or `.claude/snippets/`. U
7
7
 
8
8
  Creates one snippet file. Read these files in parallel:
9
9
 
10
- - `.claude/standards/prose.md` from the project root: prose conventions for all generated text
10
+ - `.claude/standards/prose.md` from the project root: voice and banned words for all generated text
11
+ - `.claude/standards/markdown.md` from the project root: punctuation and formatting for all generated text
11
12
  - `${CLAUDE_SKILL_DIR}/references/snippets.md`: authoring conventions, invocation channels, use patterns
12
13
 
13
- Read `${CLAUDE_SKILL_DIR}/../../standards/prose.md` instead when the project does not have it.
14
+ Read a standard from `${CLAUDE_SKILL_DIR}/../../standards/` instead when the project does not have it.
14
15
 
15
16
  ## Guards
16
17
 
@@ -13,7 +13,8 @@ Governs a snippet file: what one is for, whether a prompt qualifies as one, how
13
13
  Does not govern:
14
14
 
15
15
  - Skill folders, which carry frontmatter, references, and scripts a snippet has none of: `skill.md`
16
- - Voice, punctuation, and formatting in snippet prose: `prose.md`
16
+ - Voice and word choice in snippet prose: `prose.md`
17
+ - Punctuation and formatting in snippet prose: `markdown.md`
17
18
 
18
19
  ## What a snippet is
19
20
 
@@ -7,7 +7,8 @@ description: Creates a new standard file in `standards/` or `.claude/standards/`
7
7
 
8
8
  Creates one standard file. Read these files in parallel:
9
9
 
10
- - `.claude/standards/prose.md` from the project root: prose conventions for all generated text
10
+ - `.claude/standards/prose.md` from the project root: voice and banned words for all generated text
11
+ - `.claude/standards/markdown.md` from the project root: punctuation and formatting for all generated text
11
12
  - `.claude/standards/standard.md` from the project root: the meta-standard for shape, frontmatter, and structure
12
13
 
13
14
  Read a standard from `${CLAUDE_SKILL_DIR}/../../standards/` instead when the project does not have it.
@@ -7,7 +7,8 @@ description: Rewrites stale `README.md` and `docs/*.md` sections based on change
7
7
 
8
8
  Read these files from the project root in parallel:
9
9
 
10
- - `.claude/standards/prose.md`: prose conventions for all generated text
10
+ - `.claude/standards/prose.md`: voice and banned words for all generated text
11
+ - `.claude/standards/markdown.md`: punctuation and formatting for all generated text
11
12
  - `.claude/standards/readme.md`: README structure, required sections, and content rules
12
13
 
13
14
  Read a standard from `${CLAUDE_SKILL_DIR}/../../standards/` instead when the project does not have it.
@@ -12,7 +12,8 @@ Format an issue from session context following the issue standard, then file it
12
12
  Read these in parallel:
13
13
 
14
14
  - `${CLAUDE_SKILL_DIR}/references/issue.md`: issue title, labels, body sections, and banned phrases
15
- - `.claude/standards/prose.md` from the project root: prose conventions for all generated text
15
+ - `.claude/standards/prose.md` from the project root: voice and banned words for all generated text
16
+ - `.claude/standards/markdown.md` from the project root: punctuation and formatting for all generated text
16
17
 
17
18
  Read a standard from `${CLAUDE_SKILL_DIR}/../../standards/` instead when the project does not have it.
18
19
 
@@ -14,7 +14,8 @@ Does not govern:
14
14
 
15
15
  - Pull request title and body: `pr.md`
16
16
  - Whether a phase label may appear in issue text: `versioning.md`
17
- - Voice, punctuation, and banned words in issue prose: `prose.md`
17
+ - Voice and banned words in issue prose: `prose.md`
18
+ - Punctuation and formatting in issue prose: `markdown.md`
18
19
 
19
20
  ## Title
20
21
 
@@ -11,7 +11,8 @@ Read these files in parallel:
11
11
 
12
12
  - `${CLAUDE_SKILL_DIR}/references/branch.md`: branch format, valid types, and constraints
13
13
  - `${CLAUDE_SKILL_DIR}/references/pr.md`: structure, rules, and banned phrases
14
- - `.claude/standards/prose.md` from the project root: prose conventions for all generated text
14
+ - `.claude/standards/prose.md` from the project root: voice and banned words for all generated text
15
+ - `.claude/standards/markdown.md` from the project root: punctuation and formatting for all generated text
15
16
  - `.claude/standards/versioning.md` from the project root: phase label vs semver discipline
16
17
 
17
18
  Read a standard from `${CLAUDE_SKILL_DIR}/../../standards/` instead when the project does not have it.
@@ -15,7 +15,8 @@ Does not govern:
15
15
  - Commit subject format, which shares the title form: `commit.md`
16
16
  - Branch naming: `branch.md`
17
17
  - Whether a phase label or a semver tag may appear in a title or body: `versioning.md`
18
- - Voice, punctuation, and banned words in pull request prose: `prose.md`
18
+ - Voice and banned words in pull request prose: `prose.md`
19
+ - Punctuation and formatting in pull request prose: `markdown.md`
19
20
 
20
21
  ## Title
21
22
 
@@ -15,7 +15,8 @@ Does not govern:
15
15
  - Commit subject format, which shares the title form: `commit.md`
16
16
  - Branch naming: `branch.md`
17
17
  - Whether a phase label or a semver tag may appear in a title or body: `versioning.md`
18
- - Voice, punctuation, and banned words in pull request prose: `prose.md`
18
+ - Voice and banned words in pull request prose: `prose.md`
19
+ - Punctuation and formatting in pull request prose: `markdown.md`
19
20
 
20
21
  ## Title
21
22
 
@@ -8,7 +8,8 @@ description: Groups staged files by concern and generates one conventional commi
8
8
  Read these files in parallel:
9
9
 
10
10
  - `${CLAUDE_SKILL_DIR}/references/commit.md`: format, types, scopes, and constraints
11
- - `.claude/standards/prose.md` from the project root: prose conventions for all generated text
11
+ - `.claude/standards/prose.md` from the project root: voice and banned words for all generated text
12
+ - `.claude/standards/markdown.md` from the project root: punctuation and formatting for all generated text
12
13
 
13
14
  Read a standard from `${CLAUDE_SKILL_DIR}/../../standards/` instead when the project does not have it.
14
15
 
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: Route markdown edits to the prose standard for voice, structure, formatting, and punctuation
2
+ description: Route markdown edits to the prose standard for voice, language, and frontmatter wording
3
3
  paths:
4
4
  - '**/*.md'
5
5
  ---
@@ -8,5 +8,6 @@ paths:
8
8
 
9
9
  ## Authority
10
10
 
11
- - Follow `.claude/standards/prose.md` for all prose: voice, structure, formatting, language, and banned punctuation. It is the single source.
12
- - Read it before a substantial prose edit. Do not work the bans from memory.
11
+ - Follow `.claude/standards/prose.md` for voice, language, and the wording of a `title` or `description`. It is the single source.
12
+ - Read it before a substantial prose edit. Do not work the banned words from memory.
13
+ - Punctuation, formatting, and file references are a separate topic. `501-markdown` routes them.
@@ -0,0 +1,13 @@
1
+ ---
2
+ description: Route markdown edits to the markdown standard for headings, lists, punctuation, and file references
3
+ paths:
4
+ - '**/*.md'
5
+ ---
6
+
7
+ # Markdown mechanics standards
8
+
9
+ ## Authority
10
+
11
+ - Follow `.claude/standards/markdown.md` for headings, paragraph and list structure, code spans, punctuation, emphasis, and file references. It is the single source.
12
+ - Read it before a substantial markdown edit. Do not work the banned characters from memory.
13
+ - Voice, language, and frontmatter wording are a separate topic. `500-prose` routes them.
@@ -1,2 +1,2 @@
1
1
  extends = ""
2
- rules = ["000-constitution", "010-testing", "020-concurrency", "030-error-handling", "040-performance", "050-logging", "060-naming", "070-planning", "080-config-comments", "090-code-comments", "500-prose", "510-context", "520-wireframes", "530-requirements", "540-architecture", "550-design", "555-tasks", "560-diagrams", "570-skill", "580-readme", "590-rule-authoring", "591-standard-authoring"]
2
+ rules = ["000-constitution", "010-testing", "020-concurrency", "030-error-handling", "040-performance", "050-logging", "060-naming", "070-planning", "080-config-comments", "090-code-comments", "500-prose", "501-markdown", "510-context", "520-wireframes", "530-requirements", "540-architecture", "550-design", "555-tasks", "560-diagrams", "570-skill", "580-readme", "590-rule-authoring", "591-standard-authoring"]
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@erclx/aitk",
3
3
  "type": "module",
4
- "version": "0.52.0",
4
+ "version": "0.53.0",
5
5
  "description": "Infrastructure and quality tooling for developer workflows",
6
6
  "license": "MIT",
7
7
  "bin": {
@@ -79,7 +79,7 @@ log_step "Assert scaffold"
79
79
  # The snippets path has to name a slug the default preset still carries, since
80
80
  # init resolves snippets through `essentials`. Editing that preset without
81
81
  # editing this line fails the gate on a correct install.
82
- for path in "CLAUDE.md" ".claude/snippets/decision-help.md" ".claude/standards/prose.md" ".claude/wiki/index.md" ".claude" ".claude/context/index.md" ".claude/wireframes/index.md" ".claude/diagrams/index.md" \
82
+ for path in "CLAUDE.md" ".claude/snippets/decision-help.md" ".claude/standards/prose.md" ".claude/standards/markdown.md" ".claude/wiki/index.md" ".claude" ".claude/context/index.md" ".claude/wireframes/index.md" ".claude/diagrams/index.md" \
83
83
  ".prettierrc" ".editorconfig" ".lintstagedrc" ".husky/pre-commit" ".github/workflows/verify.yml" "scripts/verify.sh" \
84
84
  ".claude/rules/core/000-constitution.md"; do
85
85
  if [ ! -e "$TARGET_DIR/$path" ]; then
@@ -57,7 +57,7 @@ export function parseVocabulary(markdown: string): string[] | undefined {
57
57
  *
58
58
  * Reading the list out of the rule rather than hardcoding it is what keeps one
59
59
  * definition when the rule installs into a target, the same way
60
- * `.claude/hooks/standards-audit.sh` reads its bans out of `prose.md`.
60
+ * `.claude/hooks/standards-audit.sh` reads its word bans out of `prose.md`.
61
61
  */
62
62
  export async function loadVocabulary(root: string): Promise<Vocabulary> {
63
63
  for (const ruleRoot of RULE_ROOTS) {
@@ -14,7 +14,8 @@ Does not govern:
14
14
 
15
15
  - Pull request title and body: `pr.md`
16
16
  - Whether a phase label may appear in issue text: `versioning.md`
17
- - Voice, punctuation, and banned words in issue prose: `prose.md`
17
+ - Voice and banned words in issue prose: `prose.md`
18
+ - Punctuation and formatting in issue prose: `markdown.md`
18
19
 
19
20
  ## Title
20
21
 
@@ -15,7 +15,8 @@ Does not govern:
15
15
  - Commit subject format, which shares the title form: `commit.md`
16
16
  - Branch naming: `branch.md`
17
17
  - Whether a phase label or a semver tag may appear in a title or body: `versioning.md`
18
- - Voice, punctuation, and banned words in pull request prose: `prose.md`
18
+ - Voice and banned words in pull request prose: `prose.md`
19
+ - Punctuation and formatting in pull request prose: `markdown.md`
19
20
 
20
21
  ## Title
21
22
 
@@ -13,7 +13,8 @@ Governs a snippet file: what one is for, whether a prompt qualifies as one, how
13
13
  Does not govern:
14
14
 
15
15
  - Skill folders, which carry frontmatter, references, and scripts a snippet has none of: `skill.md`
16
- - Voice, punctuation, and formatting in snippet prose: `prose.md`
16
+ - Voice and word choice in snippet prose: `prose.md`
17
+ - Punctuation and formatting in snippet prose: `markdown.md`
17
18
 
18
19
  ## What a snippet is
19
20
 
@@ -15,7 +15,8 @@ Governs per-kind diagram entries under `.claude/diagrams/`: which question each
15
15
 
16
16
  Does not govern:
17
17
 
18
- - Punctuation, formatting, and language in explanation prose and node labels: `prose.md`, whose bans the yield does not lift
18
+ - Language and word choice in explanation prose and node labels: `prose.md`, whose bans the yield does not lift
19
+ - Punctuation and formatting in explanation prose: `markdown.md`, which the yield does not reach
19
20
  - The mechanism behind any component a diagram draws: `context.md`
20
21
  - UI layout, on-screen copy, and interaction intent: `wireframes.md`
21
22
  - The decision record a components diagram is drawn from: `architecture.md`
@@ -93,7 +94,7 @@ A second entry for one kind takes a suffixed name (`request-flow-admin.md`) and
93
94
  - Do not duplicate prose across entries. An entry that restates its neighbor has taken the neighbor's job.
94
95
  - The audience is mixed, so vocabulary runs as a gradient across the set. `System context` assumes no knowledge of the repository. `Deployment` may assume the reader has read the others.
95
96
 
96
- This section states the voice for the surface, which is what claims the yield `prose.md` grants to a surface whose own standard sets it. Explanation prose is pedagogical here and the default developer-facing voice does not apply. The yield covers voice alone. Punctuation, formatting, and language bans stay in force.
97
+ This section states the voice for the surface, which is what claims the yield `prose.md` grants to a surface whose own standard sets it. Explanation prose is pedagogical here and the default developer-facing voice does not apply. The yield covers voice alone. The language bans in `prose.md` stay in force, as do the punctuation and formatting rules in `markdown.md`, which grants no yield at all.
97
98
 
98
99
  ## Verification
99
100
 
@@ -120,7 +121,7 @@ Reference the context entry by path when a reader needs the mechanism. The diagr
120
121
  - `System context` has no named source signal beyond `.claude/REQUIREMENTS.md`, so nothing tells a session it went stale. Re-read it when the boundary or the set of external dependencies moves.
121
122
  - The `claude-docs` sweep watches two things and writes frontmatter only. It appends `stale` when a path an entry cites leaves the tree, and it stubs a kind when a diff adds the source signal that kind is drawn from. Diagram bodies and explanation paragraphs are off limits to it, because a change that removes a module does not carry the new correct shape of the picture.
122
123
  - That watch samples thinly. It sees the one or two paths an entry happened to cite and nothing else, so a change elsewhere leaves the entry looking current. `verified` is what covers the gap, and an entry whose date sits far behind the branch is due a read whether or not anything flagged it.
123
- - The explanation paragraphs around a Mermaid block are prose and follow `prose.md`. The fenced block itself is not, which is why a check scoped to prose is the wrong thing to rely on for what sits inside it.
124
+ - The explanation paragraphs around a Mermaid block are prose and follow `prose.md` and `markdown.md`. The fenced block itself is not, which is why a check scoped to prose is the wrong thing to rely on for what sits inside it.
124
125
  - The punctuation bans still apply to node and subgraph labels, and nothing checks them there. An em dash in a label passes every gate the repository has, so read the labels before shipping the entry.
125
126
 
126
127
  ## Template
@@ -11,7 +11,8 @@ Reference docs for consistent authoring across the toolkit and target projects.
11
11
  - [Context entry reference](context.md): Shape and content rules for .claude/context/<domain>.md entries
12
12
  - [Design reference](design.md): Shape and content rules for .claude/DESIGN.md
13
13
  - [Diagram reference](diagrams.md): Shape and content rules for .claude/diagrams/<kind>.md files
14
- - [Prose reference](prose.md): Voice, structure, formatting, and language rules for reference markdown
14
+ - [Markdown reference](markdown.md): Headings, paragraph and list structure, code spans, punctuation, emphasis, and file references
15
+ - [Prose reference](prose.md): Voice, language, and frontmatter wording for reference markdown
15
16
  - [Publish reference](publish.md): Scan run against finished text leaving through a channel no automated check covers
16
17
  - [Readme reference](readme.md): Readme voice, structure, and content conventions
17
18
  - [Requirements reference](requirements.md): Shape and content rules for .claude/REQUIREMENTS.md
@@ -0,0 +1,72 @@
1
+ ---
2
+ title: Markdown reference
3
+ description: Headings, paragraph and list structure, code spans, punctuation, emphasis, and file references
4
+ ---
5
+
6
+ # Markdown reference
7
+
8
+ Applies to markdown reference docs, READMEs, and inline documentation in repos. These are mechanics rather than voice, so no surface yields them. A surface stating its own voice claims that yield from `prose.md` and formats by this file regardless.
9
+
10
+ ## Scope
11
+
12
+ Governs the markdown mechanics of every markdown file: headings, paragraph and list structure, code spans and fences, punctuation, emphasis, and file references. 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 mechanics are written across every document and have none of their own to shape.
13
+
14
+ Does not govern:
15
+
16
+ - Voice, word choice, and the wording of a `title` or `description`: `prose.md`
17
+ - What sections a document has, or what belongs in each: the standard for that document type
18
+ - The text inside a fenced block, which follows the conventions of its own language rather than these
19
+ - The scan that applies the punctuation bans to finished text on its way out: `publish.md`
20
+
21
+ ## Headings
22
+
23
+ - H1 for document title, H2 for main sections, H3 for subsections
24
+ - Use sentence case for all headings (H1, H2, H3)
25
+ - Proper nouns and product names retain their casing in headings
26
+
27
+ ## Paragraphs and lists
28
+
29
+ - Use prose by default. Reserve bullets for discrete, unrelated items.
30
+ - Keep paragraphs to four sentences or fewer. Split longer blocks at the next logical boundary.
31
+ - Keep bullets tight. If a bullet needs more than a couple of sentences, it belongs in prose.
32
+ - Use dashes (`-`) not asterisks (`*`) for bulleted lists
33
+ - Do not end single-sentence or fragment bullets with a period. Use periods when a bullet has two or more sentences.
34
+ - For key path lists, use colon format: `- \`src/\`: description`. Never use an em dash.
35
+ - Do not introduce a list with a "Here are the X:" or "The following X:" lead-in
36
+
37
+ ## Code and identifiers
38
+
39
+ - Wrap commands, API names, file paths, and code identifiers in backticks
40
+ - Use a language identifier on all fenced code blocks (`markdown`, `typescript`, `plaintext`). Never use a bare ` ``` `
41
+ - In ASCII tree diagrams, use `←` for inline annotations. Never use `#`.
42
+
43
+ ## Punctuation
44
+
45
+ - Do not use em dashes (`—`) or semicolons (`;`). Rewrite or restructure the sentence to avoid them.
46
+ - Do not use parenthetical asides in prose (`the config (which is optional) controls...`). Split into its own sentence or drop it. Parentheses in rule definitions for grouping examples are fine.
47
+
48
+ The closed-set word bans sit in `prose.md` under `## Language` rather than here, because a banned word is a word-choice rule and these are character rules. A surface applying both reads both files.
49
+
50
+ ## Emphasis and dividers
51
+
52
+ - Do not over-format with excessive bold, italic, or header usage
53
+ - Do not use horizontal rules or dividers (`---`) in body content. The `---` delimiters of a YAML frontmatter block at the top of the file are allowed.
54
+
55
+ ## Links and file references
56
+
57
+ - Use descriptive anchor text for links. Avoid `click here` or `read more`.
58
+ - Wrap file references in backticks by default. Use a labeled markdown link (`[label](path)`) only on rendered-for-human surfaces (`README.md`, `docs/`) and in an index file, whose rows exist to be followed. Never repeat the path verbatim as the label.
59
+
60
+ ## Examples
61
+
62
+ Each pair shows a banned pattern and its fix.
63
+
64
+ ```markdown
65
+ Bad: See [.claude/context/retrieval.md](.claude/context/retrieval.md) for the retrieval flow.
66
+ Good: See `.claude/context/retrieval.md` for the retrieval flow.
67
+ ```
68
+
69
+ ```markdown
70
+ Bad: Read [docs/development.md](docs/development.md) before contributing.
71
+ Good: Read the [development guide](docs/development.md) before contributing.
72
+ ```
@@ -1,18 +1,19 @@
1
1
  ---
2
2
  title: Prose reference
3
- description: Voice, structure, formatting, and language rules for reference markdown
3
+ description: Voice, language, and frontmatter wording for reference markdown
4
4
  ---
5
5
 
6
6
  # Prose reference
7
7
 
8
- Applies to markdown reference docs, READMEs, and inline documentation in repos. It is the default voice for `.md` files and yields to any surface with its own voice, such as blogs, emails, changelogs, or commit messages. It also yields wherever another standard states the voice for the surface it governs, which is how a surface claims the exemption without this file having to name it. The yield covers voice alone. Punctuation, formatting, and language rules below stay in force on every surface, including the surfaces no automated check reaches.
8
+ Applies to markdown reference docs, READMEs, and inline documentation in repos. It is the default voice for `.md` files and yields to any surface with its own voice, such as blogs, emails, changelogs, or commit messages. It also yields wherever another standard states the voice for the surface it governs, which is how a surface claims the exemption without this file having to name it. The yield covers voice alone. The language rules below stay in force on every surface, including the surfaces no automated check reaches, as do the mechanics in `markdown.md`.
9
9
 
10
10
  ## Scope
11
11
 
12
- Governs voice, punctuation, formatting, and word choice wherever prose is written. It is an attribute standard rather than a document-type one, so it applies over documents whose shape another standard sets, and yields on voice alone where that standard states one.
12
+ Governs voice, word choice, and frontmatter wording wherever prose is written. It is an attribute standard rather than a document-type one, so it applies over documents whose shape another standard sets, yields on voice alone where that standard states one, and carries no template because voice is written across every document and has none of its own to shape.
13
13
 
14
14
  Does not govern:
15
15
 
16
+ - Headings, list and paragraph structure, code spans, punctuation, emphasis, and file references: `markdown.md`
16
17
  - What sections a document has, or what belongs in each: the standard for that document type
17
18
  - Which frontmatter fields a document carries, which is that standard's own subject. This file governs the wording of a `title` and a `description` and nothing else about them.
18
19
  - Phase-label and semver discipline: `versioning.md`
@@ -28,52 +29,8 @@ Does not govern:
28
29
  - Use substantive connectives where flow matters, but never add words solely for rhythm. Terse reference prose needs no padding.
29
30
  - Be direct on established facts. Hedge on genuinely uncertain claims.
30
31
  - Assume developer-level technical knowledge. Skip hand-holding explanations.
31
- - Keep paragraphs to four sentences or fewer. Split longer blocks at the next logical boundary.
32
-
33
- ## Structure
34
-
35
- ### Headings
36
-
37
- - H1 for document title, H2 for main sections, H3 for subsections
38
- - Use sentence case for all headings (H1, H2, H3)
39
- - Proper nouns and product names retain their casing in headings
40
-
41
- ### Paragraphs and lists
42
-
43
32
  - Front-load key information in each paragraph. Keep paragraphs concise and scannable.
44
33
  - Every sentence must provide new information. Cut redundant context.
45
- - Use prose by default. Reserve bullets for discrete, unrelated items.
46
- - Keep bullets tight. If a bullet needs more than a couple of sentences, it belongs in prose.
47
-
48
- ## Formatting
49
-
50
- ### Lists
51
-
52
- - Use dashes (`-`) not asterisks (`*`) for bulleted lists
53
- - Do not end single-sentence or fragment bullets with a period. Use periods when a bullet has two or more sentences.
54
- - For key path lists, use colon format: `- \`src/\`: description`. Never use an em dash.
55
- - Do not introduce a list with a "Here are the X:" or "The following X:" lead-in
56
-
57
- ### Code and identifiers
58
-
59
- - Wrap commands, API names, file paths, and code identifiers in backticks
60
- - Use a language identifier on all fenced code blocks (`markdown`, `typescript`, `plaintext`). Never use a bare ` ``` `
61
- - In ASCII tree diagrams, use `←` for inline annotations. Never use `#`.
62
-
63
- ### Punctuation
64
-
65
- - Do not use em dashes (`—`) or semicolons (`;`). Rewrite or restructure the sentence to avoid them.
66
- - Do not use parenthetical asides in prose (`the config (which is optional) controls...`). Split into its own sentence or drop it. Parentheses in rule definitions for grouping examples are fine.
67
-
68
- ### Emphasis and dividers
69
-
70
- - Do not over-format with excessive bold, italic, or header usage
71
- - Do not use horizontal rules or dividers (`---`) in body content. The `---` delimiters of a YAML frontmatter block at the top of the file are allowed.
72
-
73
- ### Links and file references
74
-
75
- - Use descriptive anchor text for links. Avoid `click here` or `read more`.
76
- - Wrap file references in backticks by default. Use a labeled markdown link (`[label](path)`) only on rendered-for-human surfaces (`README.md`, `docs/`) for cross-folder navigation. Never repeat the path verbatim as the label.
77
34
 
78
35
  ## Language
79
36
 
@@ -86,6 +43,8 @@ Does not govern:
86
43
  - Do not address the reader as a participant (`Let's`, `Here's`, `Here are`). State the content directly.
87
44
  - Commit to a position. Do not hedge in clusters (`It might be worth considering`) or use false balance (`While X is true, Y is also important`). Recommend, or state the tradeoff.
88
45
 
46
+ The character bans sit in `markdown.md` under `## Punctuation` rather than here, because an em dash and a semicolon are typography and these are word choice. A surface applying both reads both files.
47
+
89
48
  ## Frontmatter descriptions
90
49
 
91
50
  When frontmatter carries a short `title` or `description` used for catalog display:
@@ -122,13 +81,3 @@ Good: Use the `retry` option for failed webhooks. Set `maxRetries` to 3.
122
81
  Bad: It might be worth considering whether to enable caching.
123
82
  Good: Enable caching for read-heavy endpoints. Skip it for writes.
124
83
  ```
125
-
126
- ```markdown
127
- Bad: See [.claude/context/retrieval.md](.claude/context/retrieval.md) for the retrieval flow.
128
- Good: See `.claude/context/retrieval.md` for the retrieval flow.
129
- ```
130
-
131
- ```markdown
132
- Bad: Read [docs/development.md](docs/development.md) before contributing.
133
- Good: Read the [development guide](docs/development.md) before contributing.
134
- ```
@@ -11,7 +11,8 @@ Governs the scan an author runs against finished text on its way out, and the re
11
11
 
12
12
  Does not govern:
13
13
 
14
- - Which characters are banned, and the voice and formatting the text is written in: `prose.md`
14
+ - Which characters are banned, and the formatting the text carries: `markdown.md`
15
+ - The voice and word choice the text is written in: `prose.md`
15
16
  - The phase-label rule and the table of surfaces each namespace may appear on: `versioning.md`
16
17
  - Which gap a given surface has, and what it publishes through, which that surface names for itself
17
18
 
@@ -23,7 +24,7 @@ Run the scan as an explicit step against the finished text. Having read the unde
23
24
 
24
25
  ## Banned characters
25
26
 
26
- `prose.md` holds the character bans. Read it at scan time rather than working them from memory, then scan the drafted text and rewrite each occurrence.
27
+ `markdown.md` holds the character bans and `prose.md` holds the banned words. Read both at scan time rather than working them from memory, then scan the drafted text and rewrite each occurrence.
27
28
 
28
29
  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.
29
30
 
@@ -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 `prose.md` yields to it there. The yield covers voice alone. The punctuation bans, spelling rules, banned words, and formatting rules in `prose.md` stay in force, so the warmer register ships with the same hygiene: no em dashes, no semicolons, no buzzwords.
8
+ Applies to every `README.md`. The `## Voice` section states the voice for a repository's root README, so `prose.md` yields to it there. The yield covers voice alone. The spelling rules and banned words in `prose.md` stay in force, as do the punctuation and formatting rules in `markdown.md`, so the warmer register ships with the same hygiene: no em dashes, no semicolons, no buzzwords.
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
 
@@ -15,7 +15,8 @@ Governs every `README.md`: voice, heading structure, required and optional secti
15
15
 
16
16
  Does not govern:
17
17
 
18
- - Punctuation, formatting, spelling, and banned words in README prose: `prose.md`, which yields the voice and keeps the rest
18
+ - Spelling and banned words in README prose: `prose.md`, which yields the voice and keeps the rest
19
+ - Punctuation and formatting in README prose: `markdown.md`, which yields nothing
19
20
  - Product scope and goals: `requirements.md`
20
21
 
21
22
  ## Voice
@@ -17,7 +17,8 @@ Does not govern:
17
17
 
18
18
  - Path-scoped coding rules, which load on a file match rather than on a request match: `rule.md`
19
19
  - Single-purpose chat prompts carrying no frontmatter, references, or scripts: `snippets.md`
20
- - Voice, punctuation, and formatting in a skill body: `prose.md`
20
+ - Voice and word choice in a skill body: `prose.md`
21
+ - Punctuation and formatting in a skill body: `markdown.md`
21
22
  - The transform from a branch name to a slug a skill carries in a filename: `slug.md`
22
23
  - The domain conventions a skill cites, each of which belongs to the standard that owns it
23
24
 
@@ -17,7 +17,8 @@ Governs each authored standard under `standards/`: its stated jurisdiction, succ
17
17
 
18
18
  Does not govern:
19
19
 
20
- - The voice, punctuation, and formatting a standard is written in: `prose.md`
20
+ - The voice and word choice a standard is written in: `prose.md`
21
+ - The punctuation and formatting a standard is written in: `markdown.md`
21
22
  - The shape of any artifact a standard governs, which is that standard's own subject
22
23
 
23
24
  ## What a working standard looks like
@@ -16,7 +16,8 @@ Does not govern:
16
16
  - The format of a phase label, which is project-specific by the rule below
17
17
  - Task filenames and board layout: `tasks.md`
18
18
  - Commit subject, branch name, and pull request title format: `commit.md`, `branch.md`, and `pr.md`
19
- - Voice, punctuation, and formatting in any text carrying a label: `prose.md`
19
+ - Voice and word choice in any text carrying a label: `prose.md`
20
+ - Punctuation and formatting in any text carrying a label: `markdown.md`
20
21
 
21
22
  ## Phase labels
22
23
 
@@ -17,7 +17,8 @@ Does not govern:
17
17
 
18
18
  - Tokens, typography, spacing, and the rest of the visual system: `design.md`
19
19
  - The mechanism behind a surface: `context.md`
20
- - Voice, punctuation, and formatting in wireframe prose: `prose.md`
20
+ - Voice and word choice in wireframe prose: `prose.md`
21
+ - Punctuation and formatting in wireframe prose: `markdown.md`
21
22
 
22
23
  ## What a working wireframe looks like
23
24
 
@@ -74,7 +75,7 @@ Reference the context entry from the wireframe by path when a reader needs the m
74
75
  ## Maintenance
75
76
 
76
77
  - When a surface's layout or interaction changes, update its wireframe file in the same PR. A wireframe showing a defunct layout is worse than none.
77
- - The Behavior and Copy prose around an ASCII block is prose and follows `prose.md`. The fenced block itself is not, so a check scoped to prose is the wrong thing to rely on for what sits inside it.
78
+ - The Behavior and Copy prose around an ASCII block is prose and follows `prose.md` and `markdown.md`. The fenced block itself is not, so a check scoped to prose is the wrong thing to rely on for what sits inside it.
78
79
 
79
80
  ## Template
80
81
 
@@ -19,6 +19,10 @@ esac
19
19
  # Read the closed-set word bans from the standard so the hook never carries a
20
20
  # second copy. Every "Do not use ... (`a`, `b`)" bullet contributes its
21
21
  # single-word backticked terms, which skips the multi-word and punctuation bans.
22
+ #
23
+ # The word bans sit in prose.md and the em-dash and semicolon bans in
24
+ # markdown.md, so this parses the first and hardcodes the second. A "Do not use"
25
+ # bullet added to markdown.md is parsed by nothing and enforces silently.
22
26
  standard="${CLAUDE_PROJECT_DIR:-.}/.claude/standards/prose.md"
23
27
  words=""
24
28
  if [ -f "$standard" ]; then
@@ -56,6 +60,6 @@ hits=$(awk -v words="$words" '
56
60
 
57
61
  [ -z "$hits" ] && exit 0
58
62
 
59
- msg=$(printf 'Standards-audit: prose.md violations in %s. Rewrite or restructure (do not lazy-swap).\n%s' "$file" "$hits")
63
+ msg=$(printf 'Standards-audit: prose.md and markdown.md violations in %s. Rewrite or restructure (do not lazy-swap).\n%s' "$file" "$hits")
60
64
 
61
65
  jq -nc --arg msg "$msg" '{hookSpecificOutput:{hookEventName:"PostToolUse",additionalContext:$msg}}'