@erclx/aitk 0.105.0 → 0.106.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 (56) hide show
  1. package/claude/.claude-plugin/plugin.json +1 -1
  2. package/claude/skills/claude-address-review/SKILL.md +4 -3
  3. package/claude/skills/claude-design-extract/SKILL.md +3 -3
  4. package/claude/skills/claude-docs/SKILL.md +1 -1
  5. package/claude/skills/claude-memory-capture/SKILL.md +2 -2
  6. package/claude/skills/claude-pr-review/SKILL.md +1 -1
  7. package/claude/skills/claude-standards-audit/SKILL.md +8 -6
  8. package/claude/skills/create-skill/SKILL.md +2 -2
  9. package/claude/skills/create-snippet/SKILL.md +2 -2
  10. package/claude/skills/create-snippet/references/snippets.md +2 -2
  11. package/claude/skills/create-standard/SKILL.md +2 -2
  12. package/claude/skills/docs-sync/SKILL.md +2 -2
  13. package/claude/skills/git-issue/SKILL.md +2 -2
  14. package/claude/skills/git-issue/references/issue.md +2 -2
  15. package/claude/skills/git-pr/SKILL.md +2 -2
  16. package/claude/skills/git-pr/references/pr.md +2 -2
  17. package/claude/skills/git-split/references/pr.md +2 -2
  18. package/claude/skills/git-stage/SKILL.md +2 -2
  19. package/claude/skills/migration-standards/SKILL.md +1 -1
  20. package/claude/skills/setup-indexes/SKILL.md +1 -1
  21. package/claude/skills/write-human/REQUIREMENT.md +46 -0
  22. package/claude/skills/write-human/SKILL.md +68 -0
  23. package/claude/skills/write-human/references/density.md +38 -0
  24. package/claude/skills/write-human/references/machine-tells.md +107 -0
  25. package/claude/skills/write-human/references/source-material.md +37 -0
  26. package/docs/agents/markdown-audit.md +7 -7
  27. package/docs/ai-workflow.md +1 -0
  28. package/docs/target-projects.md +1 -1
  29. package/governance/rules/claude/500-prose.md +7 -5
  30. package/governance/rules/claude/501-markdown.md +5 -4
  31. package/package.json +1 -1
  32. package/scripts/core/install-check.sh +1 -1
  33. package/src/commands/markdown.ts +2 -2
  34. package/src/comments/vocabulary.ts +1 -1
  35. package/src/markdown/bans.ts +2 -2
  36. package/src/standards/closure.ts +1 -1
  37. package/standards/bundled/issue.md +2 -2
  38. package/standards/bundled/pr.md +2 -2
  39. package/standards/bundled/snippets.md +2 -2
  40. package/standards/diagrams.md +5 -5
  41. package/standards/glossary.md +2 -2
  42. package/standards/groundwork.md +2 -2
  43. package/standards/index.md +1 -2
  44. package/standards/intake.md +2 -2
  45. package/standards/markdown.md +55 -6
  46. package/standards/memory.md +2 -2
  47. package/standards/plan.md +2 -2
  48. package/standards/publish.md +2 -2
  49. package/standards/readme.md +4 -4
  50. package/standards/skill.md +2 -2
  51. package/standards/standard.md +2 -2
  52. package/standards/teach.md +2 -2
  53. package/standards/versioning.md +2 -2
  54. package/standards/wireframes.md +3 -3
  55. package/tooling/claude/seeds/.claude/hooks/standards-audit.sh +2 -2
  56. package/standards/prose.md +0 -89
@@ -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.105.0",
4
+ "version": "0.106.0",
5
5
  "author": {
6
6
  "name": "Eric Le",
7
7
  "url": "https://github.com/erclx"
@@ -103,9 +103,10 @@ sessions addressing different pull requests never overwrite each other between
103
103
  the write and the post. Note any `.claude/` docs refreshed as a result of the
104
104
  fixes.
105
105
 
106
- The reply is a rendered-for-human GitHub surface, so follow
107
- `.claude/standards/prose.md` for voice, or `${CLAUDE_SKILL_DIR}/../../standards/prose.md`
108
- when the project does not have it, and keep each mapping to a line or two.
106
+ The reply is a rendered-for-human GitHub surface, so load the `write-human`
107
+ skill for voice, follow `.claude/standards/markdown.md` for the banned words, or
108
+ `${CLAUDE_SKILL_DIR}/../../standards/markdown.md` when the project does not have
109
+ it, and keep each mapping to a line or two.
109
110
 
110
111
  Open the body with the `## Review response` heading so it anchors as a section
111
112
  distinct from human threads and stays subordinate to the `## Review` heading the
@@ -32,8 +32,8 @@ Read these from the project root on both paths, skipping any that do not exist:
32
32
 
33
33
  - `CLAUDE.md`: voice, personality, spelling rules
34
34
  - `.claude/REQUIREMENTS.md`: the `## Personality` paragraph, worldview, non-goals
35
- - `.claude/standards/prose.md`: tone constraints
36
- - `.claude/standards/markdown.md`: punctuation and formatting constraints
35
+ - `.claude/standards/markdown.md`: word, punctuation, and formatting constraints
36
+ - The `write-human` skill: tone and sentence construction constraints
37
37
 
38
38
  Read a standard from `${CLAUDE_SKILL_DIR}/../../standards/` instead when the project does not have it.
39
39
 
@@ -55,7 +55,7 @@ Use the returned content as the target shape. Keep every section heading and eve
55
55
 
56
56
  ## Step 4: fill the template
57
57
 
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
+ Walk each section once. Follow `.claude/standards/markdown.md` for punctuation and word choice throughout: no em dashes, no semicolons, no marketing buzzwords. Use commas or separate sentences instead.
59
59
 
60
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.
61
61
 
@@ -106,7 +106,7 @@ The verb resolves the board at the main worktree root in-process, which is the r
106
106
 
107
107
  - Update only the sections affected by session decisions.
108
108
  - Do not rewrite sections unrelated to what changed.
109
- - Follow `.claude/standards/prose.md` and `.claude/standards/markdown.md` for all edits.
109
+ - Follow `.claude/standards/markdown.md` and the `write-human` skill for all edits.
110
110
  - Close a decision entry in `.claude/ARCHITECTURE.md` with its verification anchor whenever this run writes that entry or amends its reasoning and that reasoning cites a measured number. Re-read the number against the tree first, since the marker records the read rather than the edit. `.claude/standards/architecture.md` fixes the sentence.
111
111
  - Leave every decision entry this run did not write alone, anchored or not. The rule is scoped forward, so an entry written before it is dated by blame rather than by a read. Step 6 reports a stale anchor and no step writes one on an entry it did not amend.
112
112
 
@@ -27,8 +27,8 @@ Read in parallel from the project root, skipping any that do not exist:
27
27
  - `CLAUDE.md`: the project's write location and any rule it states over the folder
28
28
  - `.claude/memory/index.md`: existing index, to avoid duplicates
29
29
  - `.claude/context/index.md`: the domain catalog Step 3 routes against
30
- - `.claude/standards/prose.md`: voice and banned words applied to memory file bodies
31
- - `.claude/standards/markdown.md`: punctuation and formatting applied to memory file bodies
30
+ - `.claude/standards/markdown.md`: banned words, punctuation, and formatting applied to memory file bodies
31
+ - The `write-human` skill: voice, rhythm, and sentence construction applied to memory file bodies
32
32
 
33
33
  Read a standard from `${CLAUDE_SKILL_DIR}/../../standards/` instead when the project does not have it.
34
34
 
@@ -111,7 +111,7 @@ An empty result means no response arrived since the prior pass, so this pass wou
111
111
 
112
112
  The response is also the whole read on a repeated head. Step 2 resolves an empty range, because a commit is its own ancestor and `<prior-oid>..<headRefOid>` spans nothing, so the delta cannot answer whether a prior finding landed. Read that comment for what the worker changed or accepted, and treat an accepted finding as closed rather than restating it.
113
113
 
114
- The comment is a rendered-for-human GitHub surface, so follow `.claude/standards/prose.md` for voice, or `${CLAUDE_SKILL_DIR}/../../standards/prose.md` when the project does not have it: cut editorializing, and keep every sentence load-bearing. Match this shape on a first pass:
114
+ The comment is a rendered-for-human GitHub surface, so load the `write-human` skill for voice and follow `.claude/standards/markdown.md` for the banned words, or `${CLAUDE_SKILL_DIR}/../../standards/markdown.md` when the project does not have it: cut editorializing, and keep every sentence load-bearing. Match this shape on a first pass:
115
115
 
116
116
  ```markdown
117
117
  ## Review
@@ -8,8 +8,8 @@ description: Audits changed markdown files against every authoring standard that
8
8
  ## Guards
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
- - 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.
11
+ - If neither `.claude/standards/markdown.md` nor `${CLAUDE_SKILL_DIR}/../../standards/markdown.md` is present, stop: `❌ markdown.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
+ - `markdown.md` is the one standard testable before the mapping runs, since its scope statement declares an attribute and every changed markdown file therefore maps to it. Every other standard is tested in Step 3, where the mapping has named which ones the run needs.
13
13
 
14
14
  ## Diff baseline
15
15
 
@@ -68,12 +68,14 @@ Every mapping names a changed markdown file, which is the only thing Step 1 prod
68
68
 
69
69
  ## Step 3: read standards and audit
70
70
 
71
- Read each applicable standard once. For each changed file, audit against every rule:
71
+ Read each applicable standard once, testing `.claude/standards/<name>` and `${CLAUDE_SKILL_DIR}/../../standards/<name>` before reading it. A standard the mapping named and neither path carries is reported as a finding against the file that mapped to it rather than skipped, since a standard read from nowhere reports every file under it clean.
72
+
73
+ For each changed file, audit against every rule:
72
74
 
73
75
  - **Pattern rules**: grep the file for every token the standard bans. Grep is authoritative. Reading alone misses occurrences.
74
76
  - **Judgment rules**: check each rule in context against the standard that states it.
75
77
 
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.
78
+ Every changed markdown file gets the pattern pass, since `.claude/standards/markdown.md` applies to all of them. Take the banned tokens from that standard at read time rather than from a list held here. It carries the banned words, the banned spellings, and the banned characters together, so one read covers every token this pass greps for.
77
79
 
78
80
  ## Step 4: report
79
81
 
@@ -84,13 +86,13 @@ path/to/file.md
84
86
 
85
87
  - L12: `markdown.md`, em dash in prose
86
88
  - L34: `markdown.md`, semicolon used to join clauses
87
- - L51: `prose.md`, vague qualifier `simply`
89
+ - L51: `markdown.md`, vague qualifier `simply`
88
90
  - L67: `context.md`, decision entry names no rejected alternative
89
91
  ```
90
92
 
91
93
  If clean, respond with `✅ No violations.`
92
94
 
93
- Reporting only. Do not rewrite any file, swap any punctuation, or propose fixes inline. Fixes are a separate user-initiated step because lazy swaps (semicolon to period, em dash to comma) violate the prose rule against shallow substitution.
95
+ Reporting only. Do not rewrite any file, swap any punctuation, or propose fixes inline. Fixes are a separate user-initiated step because a lazy swap (semicolon to period, em dash to comma) leaves the sentence in the shape the ban exists to remove.
94
96
 
95
97
  ## Output
96
98
 
@@ -9,8 +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`: voice and banned words for skill body text
13
- - `.claude/standards/markdown.md`: punctuation and formatting for skill body text
12
+ - `.claude/standards/markdown.md`: banned words, punctuation, and formatting for skill body text
13
+ - The `write-human` skill: voice, rhythm, and sentence construction for skill body text
14
14
 
15
15
  Read a standard from `${CLAUDE_SKILL_DIR}/../../standards/` instead when the project does not have it.
16
16
 
@@ -7,8 +7,8 @@ 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: voice and banned words for all generated text
11
- - `.claude/standards/markdown.md` from the project root: punctuation and formatting for all generated text
10
+ - `.claude/standards/markdown.md` from the project root: banned words, punctuation, and formatting for all generated text
11
+ - The `write-human` skill: voice, rhythm, and sentence construction for all generated text
12
12
  - `${CLAUDE_SKILL_DIR}/references/snippets.md`: authoring conventions, invocation channels, use patterns
13
13
 
14
14
  Read a standard from `${CLAUDE_SKILL_DIR}/../../standards/` instead when the project does not have it.
@@ -13,8 +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 and word choice in snippet prose: `prose.md`
17
- - Punctuation and formatting in snippet prose: `markdown.md`
16
+ - Voice, rhythm, and sentence construction in snippet prose: the `write-human` skill
17
+ - Punctuation, formatting, and word choice in snippet prose: `markdown.md`
18
18
 
19
19
  ## What a snippet is
20
20
 
@@ -7,8 +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: voice and banned words for all generated text
11
- - `.claude/standards/markdown.md` from the project root: punctuation and formatting for all generated text
10
+ - `.claude/standards/markdown.md` from the project root: banned words, punctuation, and formatting for all generated text
11
+ - The `write-human` skill: voice, rhythm, and sentence construction for all generated text
12
12
  - `.claude/standards/standard.md` from the project root: the meta-standard for shape, frontmatter, and structure
13
13
 
14
14
  Read a standard from `${CLAUDE_SKILL_DIR}/../../standards/` instead when the project does not have it.
@@ -7,8 +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`: voice and banned words for all generated text
11
- - `.claude/standards/markdown.md`: punctuation and formatting for all generated text
10
+ - `.claude/standards/markdown.md`: banned words, punctuation, and formatting for all generated text
11
+ - The `write-human` skill: voice, rhythm, and sentence construction for all generated text
12
12
  - `.claude/standards/readme.md`: README structure, required sections, and content rules
13
13
 
14
14
  Read a standard from `${CLAUDE_SKILL_DIR}/../../standards/` instead when the project does not have it.
@@ -12,8 +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: voice and banned words for all generated text
16
- - `.claude/standards/markdown.md` from the project root: punctuation and formatting for all generated text
15
+ - `.claude/standards/markdown.md` from the project root: banned words, punctuation, and formatting for all generated text
16
+ - The `write-human` skill: voice, rhythm, and sentence construction for all generated text
17
17
 
18
18
  Read a standard from `${CLAUDE_SKILL_DIR}/../../standards/` instead when the project does not have it.
19
19
 
@@ -14,8 +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 and banned words in issue prose: `prose.md`
18
- - Punctuation and formatting in issue prose: `markdown.md`
17
+ - Voice, rhythm, and sentence construction in issue prose: the `write-human` skill
18
+ - Punctuation, formatting, and banned words in issue prose: `markdown.md`
19
19
 
20
20
  ## Title
21
21
 
@@ -12,8 +12,8 @@ Read these files in parallel:
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
14
  - `${CLAUDE_SKILL_DIR}/references/labels.md`: label map format, matching, and the missing-label warning. Skip when the project has no `.claude/pr-labels.toml`.
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
15
+ - `.claude/standards/markdown.md` from the project root: banned words, punctuation, and formatting for all generated text
16
+ - The `write-human` skill: voice, rhythm, and sentence construction for all generated text
17
17
  - `.claude/standards/versioning.md` from the project root: phase label vs semver discipline
18
18
 
19
19
  Read a standard from `${CLAUDE_SKILL_DIR}/../../standards/` instead when the project does not have it.
@@ -15,8 +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 and banned words in pull request prose: `prose.md`
19
- - Punctuation and formatting in pull request prose: `markdown.md`
18
+ - Voice, rhythm, and sentence construction in pull request prose: the `write-human` skill
19
+ - Punctuation, formatting, and banned words in pull request prose: `markdown.md`
20
20
 
21
21
  ## Title
22
22
 
@@ -15,8 +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 and banned words in pull request prose: `prose.md`
19
- - Punctuation and formatting in pull request prose: `markdown.md`
18
+ - Voice, rhythm, and sentence construction in pull request prose: the `write-human` skill
19
+ - Punctuation, formatting, and banned words in pull request prose: `markdown.md`
20
20
 
21
21
  ## Title
22
22
 
@@ -8,8 +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: voice and banned words for all generated text
12
- - `.claude/standards/markdown.md` from the project root: punctuation and formatting for all generated text
11
+ - `.claude/standards/markdown.md` from the project root: banned words, punctuation, and formatting for all generated text
12
+ - The `write-human` skill: voice, rhythm, and sentence construction for all generated text
13
13
 
14
14
  Read a standard from `${CLAUDE_SKILL_DIR}/../../standards/` instead when the project does not have it.
15
15
 
@@ -79,7 +79,7 @@ aitk gov sync .
79
79
 
80
80
  ## Inbound references to verify
81
81
 
82
- - CLAUDE.md:42 references standards/prose.md
82
+ - CLAUDE.md:42 references standards/markdown.md
83
83
  - docs/contributing.md:8 references snippets/claude/feature
84
84
 
85
85
  ## Reminder
@@ -44,7 +44,7 @@ Ask the user which to bootstrap. Accept folder paths, `all`, or `none`. The user
44
44
  For each chosen folder, read every `*.md` sibling and draft frontmatter:
45
45
 
46
46
  - `title`: derived from the first H1. If absent, derive from the filename in sentence case.
47
- - `description`: one line summarizing the file's purpose, drawn from the first paragraph after the H1. Follow `.claude/standards/prose.md` § Frontmatter descriptions for length and style, or `${CLAUDE_SKILL_DIR}/../../standards/prose.md` when the project does not have it.
47
+ - `description`: one line summarizing the file's purpose, drawn from the first paragraph after the H1. Follow `.claude/standards/markdown.md` § Frontmatter descriptions for length and style, or `${CLAUDE_SKILL_DIR}/../../standards/markdown.md` when the project does not have it.
48
48
 
49
49
  Surface every drafted entry to the user grouped by file:
50
50
 
@@ -0,0 +1,46 @@
1
+ ---
2
+ name: write-human
3
+ description: Scope boundary between the writing rules a scan enforces and the ones only a reader can, and why the second set travels in a skill
4
+ ---
5
+
6
+ # Write human requirement
7
+
8
+ ## Gap
9
+
10
+ Without this skill, a session is graded on the words it avoids and never on how the prose reads. The banned words, characters, and spellings ship as data the CLI and the installed hook both read, so that half is measured on every run. The voice half sat under a heading in a standard nothing opened, so a session wrote the whole passage without it and the audit reported a clean exit over prose that read machine-written.
11
+
12
+ The output of that arrangement is specific rather than general. Paragraphs come back with every sentence landing within a few words of the last, with consecutive sentences opening on the same word and the same grammatical shape, and with the compression rule applied until the verb is gone, so the passage trades uniform sentences for uniform fragments. A session told to be terse and told nothing about cadence produces exactly that, since cutting is the only instruction it holds.
13
+
14
+ A session also has no name for the patterns no closed word set can match. Rule-of-three, synonym cycling, false ranges, inline-header lists, and adverb propping each survive a clean scan, so a passage carrying all five reports zero findings and still reads wrong. Nothing tells the session those patterns exist, and a ban list cannot be extended to reach them, because each is a shape rather than a token.
15
+
16
+ Importing that catalog wholesale fails on a different measurement. External material of this kind bans abstract metaphor nouns and names `surface` among them, which this corpus uses 593 times in tracked markdown at `57ee7467`. A session handed the catalog with no stated position either rewrites established vocabulary or silently ignores the item, and neither outcome is recoverable by a later reader who cannot tell which happened.
17
+
18
+ ## Must
19
+
20
+ - Arrive attached to the writing rather than waiting to be consulted, which is why the path-scoped rule on a markdown edit carries an explicit instruction to load this skill
21
+ - State cadence as something to measure, giving the sentence-length spread and the repeated-opening count a session can check, since a rule to vary sentence length is one a session satisfies by assertion
22
+ - Ban the fragment trade by name, since compression is the instruction a terse register already carries and the verb is what it drops first
23
+ - Name the machine tells a scan cannot reach, and hold the catalog behind a stated trigger so a run that needs none pays no read for it
24
+ - Point at the banned words rather than restating them, since they ship as package data a command reads and a second copy drifts with nothing comparing the two
25
+ - Record which external patterns were adopted, which were declined, and the measurement behind each, so a later session extends the position instead of re-deriving it
26
+ - Yield voice to a surface that states its own, and hold rhythm, density, and the tells on every surface
27
+
28
+ ## Must not
29
+
30
+ - Restate the banned words, characters, or spellings, at any length or as an example set
31
+ - Claim the reported failure is closed. Cadence is a property of a passage and nothing measures the output against these rules yet, so this skill states the rule and the measurement is owed separately.
32
+ - Rewrite a term the corpus already uses because an external source bans it, without the count and a recorded position
33
+ - Grow a second voice register inside this body. One baseline covers every surface, and a register a real surface needs arrives as an overlay that yields on voice alone.
34
+
35
+ ## Guards
36
+
37
+ - A passage on a surface stating its own voice keeps that voice, so the yield is read before the voice rules are applied rather than after the rewrite
38
+ - Text a model drafted goes through the tells catalog, and a short original draft with nothing reading off skips it
39
+
40
+ ## Out of scope
41
+
42
+ - The banned words, characters, and spellings, which `markdown.md` states for a reader and `aitk markdown audit` gates from package data
43
+ - Markdown mechanics, being headings, lists, code spans, punctuation, and file references
44
+ - Restating text that already exists in plainer words, which is a different job on a different trigger, since a restatement is asked for by name and this arrives on a glob match
45
+ - What voice a given surface declares, which belongs to the standard governing that surface
46
+ - Measuring whether finished output followed these rules, which needs a check this skill does not carry
@@ -0,0 +1,68 @@
1
+ ---
2
+ name: write-human
3
+ description: Carries the voice, rhythm, sentence construction, and information density rules a banned-word list cannot express, plus the catalog of machine tells that survive a clean ban scan. Use when writing or revising prose a person will read, when a passage reads flat or uniform, or when asked to "make this read like a person", "fix the cadence", "this reads like AI wrote it", "vary the sentences", or "tighten this without gutting it". Do NOT use for banned words, characters, or spellings, which `.claude/standards/markdown.md` states and `aitk markdown audit` gates, and do NOT use to restate text that already exists in plainer words.
4
+ ---
5
+
6
+ # Write human
7
+
8
+ Write prose that reads as though a person wrote it. A ban list subtracts words and reaches nothing about how a passage moves, so this skill carries the half no scan measures.
9
+
10
+ Load this before drafting a passage rather than after. A revision pass recovers the words and never recovers the structure the draft already settled.
11
+
12
+ The banned words, characters, and spellings sit in `.claude/standards/markdown.md`, or `${CLAUDE_SKILL_DIR}/../../standards/markdown.md` when the project does not have that file. They stay in force here. This skill adds to them and never restates them, since `aitk markdown audit` reads them from the package and a second copy would drift.
13
+
14
+ ## What yields and what does not
15
+
16
+ - A surface stating its own voice keeps that voice. Blogs, emails, changelogs, and commit messages are surfaces of that kind, as is any document whose own standard states a voice.
17
+ - The yield covers voice alone. Rhythm, density, and the machine tells below apply on every surface, as do the bans and the markdown mechanics.
18
+ - Terse reference prose is the default register. A warmer register is an overlay a surface declares, never a reason to drop the rules underneath it.
19
+
20
+ ## Voice
21
+
22
+ - Write for a developer who is scanning rather than studying. Every sentence has to land on first read.
23
+ - Use active voice, and present tense unless past or future is factually correct.
24
+ - Name the actor in a sentence that has one. Passive voice with an unnamed actor hides who acts and reads as evasion.
25
+ - Prefer direct verbs and plain words. Write `use` over `utilize`, `help` over `facilitate`, `is` over `serves as`.
26
+ - Be direct on an established fact. Hedge on a genuinely uncertain claim and say which it is.
27
+ - Assume developer-level knowledge. Skip the explanation the reader already carries.
28
+ - Front-load the key information in a paragraph, and give every sentence something the reader did not have.
29
+
30
+ ## Rhythm
31
+
32
+ Uniform cadence is the tell that survives the cleanest ban scan. Measure it rather than judging it:
33
+
34
+ - Read the paragraph as one block. Uniformity is audible and close to invisible line by line.
35
+ - Compare the longest and shortest sentence in a paragraph. Within roughly five words of each other means the paragraph has one cadence and needs a short sentence or a long one added.
36
+ - Count the opening word of each sentence. Two alike is coincidence and three is a pattern to break.
37
+ - Vary the grammatical shape of the opening, not the word alone. Three sentences opening on three different subjects still share one shape.
38
+ - Never buy variety with a fragment. A verbless clause standing as a sentence trades one uniformity for another and is the failure these rules exist against.
39
+ - Use a substantive connective where the flow needs one, and never add a word for rhythm alone.
40
+
41
+ ## Density
42
+
43
+ - Carry one claim per sentence. A sentence carrying three claims hides the two the reader most needs to check.
44
+ - Cut a sentence restating the one above it at a different altitude. A summary of the previous sentence is the most common padding in machine prose.
45
+ - Compress by removing what repeats, never by removing the verb. Dropping the verb is the fragment rule wearing an efficiency argument.
46
+ - Resolve a pronoun or a demonstrative to its noun whenever more than one antecedent is in reach.
47
+
48
+ Read `${CLAUDE_SKILL_DIR}/references/density.md` when a passage is dense and still reads long, or when cutting it keeps breaking the sentences.
49
+
50
+ ## Machine tells
51
+
52
+ Read `${CLAUDE_SKILL_DIR}/references/machine-tells.md` before revising text a model drafted, and whenever a passage clears the ban scan and still reads wrong. It catalogs the patterns no closed word set can match, being rule-of-three, synonym cycling, false ranges, inline-header lists, adverb propping, and the rest, each with the fix.
53
+
54
+ Skip that reference on a short original draft where nothing reads off. The catalog is a diagnostic and costs a read on every invocation that does not need it.
55
+
56
+ ## Revising a passage
57
+
58
+ 1. Read the whole passage before editing a line of it.
59
+ 2. Mark the sentence lengths and the openings in each paragraph, and rewrite the flattest run first.
60
+ 3. Check each paragraph for a sentence that adds no claim, and cut it rather than shortening it.
61
+ 4. Re-read for the tells the catalog names, if the passage came from a model.
62
+ 5. Run `aitk markdown audit <path>` for the mechanical half, and rewrite each hit rather than swapping the token for a near-synonym.
63
+
64
+ Report each file written or updated by its full path from the project root.
65
+
66
+ ## Source material
67
+
68
+ The position on external writing guidance sits in `${CLAUDE_SKILL_DIR}/references/source-material.md`, which states what this skill adopted, what it declined, and the measurement behind each. Read it before importing a rule from outside this corpus. Do not re-derive that position, since a second answer will disagree with the recorded one.
@@ -0,0 +1,38 @@
1
+ ---
2
+ title: Information density
3
+ description: What to cut from a passage, what never to cut, and how to keep a compressed sentence unambiguous
4
+ ---
5
+
6
+ # Information density
7
+
8
+ Read this when a passage is dense and still reads long, or when cutting it keeps breaking the sentences. Density is claims per sentence rather than words per sentence, so a short passage carrying one claim four times is the failure this reference addresses.
9
+
10
+ ## What to cut
11
+
12
+ - A sentence restating the one above it at a different altitude. Machine prose states the specific claim, then the general version of it, then the reason it matters.
13
+ - A setup clause that names what the next clause already names. `In terms of performance, the query is slow` carries one claim and two subjects.
14
+ - A qualifier that changes no truth condition. `Generally`, `in most cases`, and `typically` earn their place where an exception exists and gets named, and nowhere else.
15
+ - An example that demonstrates the same thing as the example above it. Two examples differ in what they teach or one of them goes.
16
+ - A transition that names the relationship the sentences already carry. `Additionally` before an addition adds nothing.
17
+
18
+ ## What never to cut
19
+
20
+ - The verb. A compressed clause with the verb removed is a fragment, and the fragment is the failure the rhythm rules exist against.
21
+ - A qualifier that bounds a claim. `Every tracked markdown file` and `most files` are different claims, and dropping the bound is a fabrication rather than a compression.
22
+ - The named source of a claim, and the date or ref a measurement was taken at. A number with no stamp cannot be re-measured, so it stops being evidence.
23
+ - The actor of a sentence that has one. Compressing to the passive removes the fact rather than the words.
24
+
25
+ ## Keeping a compressed sentence unambiguous
26
+
27
+ Compression is what creates ambiguity, so each pass over a tightened sentence checks the same four things:
28
+
29
+ - Resolve every pronoun and demonstrative to a noun when more than one antecedent is in reach. `This breaks the build` after two clauses names neither.
30
+ - Attach every modifier to the word it modifies. A clause that moved during a rewrite lands next to the wrong noun and reads as a claim about it.
31
+ - Quantify an amount rather than naming it. `Large`, `often`, and `slow` each ask the reader to supply the number.
32
+ - Split a sentence carrying two claims joined by `and` when either claim can be false on its own. One sentence per truth condition is what makes a passage checkable.
33
+
34
+ ## Measuring a paragraph
35
+
36
+ Count the claims a paragraph makes and the sentences it uses. More sentences than claims means the paragraph is padded, and the cut targets the restatements above. Fewer sentences than claims means the paragraph is compressed past the point a reader can check it, and the split targets the joined sentences.
37
+
38
+ A paragraph carrying no claim at all is a transition, and a transition earns one sentence at most.
@@ -0,0 +1,107 @@
1
+ ---
2
+ title: Machine tells
3
+ description: Patterns that survive a clean ban scan, why each is invisible to a word set, and the fix for each
4
+ ---
5
+
6
+ # Machine tells
7
+
8
+ Each pattern below is a shape rather than a token, so no closed word set matches it and `aitk markdown audit` reports a clean exit over a passage carrying every one. Read this when revising text a model drafted, or when a passage passes the scan and still reads wrong.
9
+
10
+ Work top down. The first three account for most of what a reader calls machine-written.
11
+
12
+ ## Rule of three
13
+
14
+ A triad wherever a list appears, whatever the subject actually holds. Three adjectives, three clauses, three examples, over and over, until the count is the only thing a reader can predict.
15
+
16
+ The tell is the regularity rather than the number. A subject with two parts gets a third invented to fill the shape, and a subject with five gets cut to three.
17
+
18
+ ```markdown
19
+ Bad: The parser is fast, simple, and reliable.
20
+ Good: The parser reads 40k lines a second and has no configuration.
21
+ ```
22
+
23
+ Fix by counting what the subject has and writing that many. A list of two is fine, and so is a list of six.
24
+
25
+ ## Synonym cycling
26
+
27
+ One thing named four ways across a paragraph, on the belief that repeating a noun reads poorly. The reader then cannot tell whether `the handler`, `the callback`, `the listener`, and `the hook` are one thing or four.
28
+
29
+ ```markdown
30
+ Bad: Register the handler. The callback receives the event, and the listener returns a promise.
31
+ Good: Register the handler. The handler receives the event and returns a promise.
32
+ ```
33
+
34
+ Fix by picking one name per thing and repeating it. Repetition of a term is precision in reference prose.
35
+
36
+ ## False ranges
37
+
38
+ `from X to Y` used over things that form no spectrum, which smuggles a claim of coverage the sentence cannot support.
39
+
40
+ ```markdown
41
+ Bad: Everything from authentication to deployment.
42
+ Good: Authentication, schema migration, and deployment.
43
+ ```
44
+
45
+ Fix by naming the members. Keep the range form where the endpoints bound a scale, such as a version range or a byte size.
46
+
47
+ ## Inline-header lists
48
+
49
+ A bullet opening with a bold label and a colon, where the body then restates the label in a sentence. The shape looks organized and carries one fact per bullet instead of two.
50
+
51
+ ```markdown
52
+ Bad: - **Caching**: Caching stores the response so the next request skips the fetch.
53
+ Good: - Caching stores the response, so the next request skips the fetch.
54
+ ```
55
+
56
+ Fix by cutting the label when the sentence already names the subject. Keep the label where the bullets form a lookup table a reader scans by key.
57
+
58
+ ## Adverb propping
59
+
60
+ An adverb carrying the weight the verb should. `significantly improves`, `dramatically reduces`, and `effectively handles` each name no amount and no mechanism.
61
+
62
+ ```markdown
63
+ Bad: The index significantly improves query performance.
64
+ Good: The index cuts the median query from 400ms to 12ms.
65
+ ```
66
+
67
+ Fix by replacing the adverb with the measurement, or by cutting it and leaving the verb alone.
68
+
69
+ ## Passive voice with an unnamed actor
70
+
71
+ `it was decided`, `changes were made`, `the file is expected to be updated`. The actor is the fact the reader wanted, and the construction is what removes it.
72
+
73
+ ```markdown
74
+ Bad: The threshold was raised after the incident.
75
+ Good: The on-call engineer raised the threshold after the incident.
76
+ ```
77
+
78
+ Fix by naming who acts. Keep the passive where the actor is genuinely unknown or genuinely irrelevant, and say which.
79
+
80
+ ## Closing restatement
81
+
82
+ A final sentence per section summarizing the section, at a higher altitude and with no new claim. In a short document every section then ends the same way.
83
+
84
+ Fix by cutting it. A section that needs a summary is too long, and the split is the answer.
85
+
86
+ ## Question as transition
87
+
88
+ `So what does this mean?` or `Why does this matter?` standing alone between paragraphs. It addresses the reader as a participant and delays the answer by one line.
89
+
90
+ Fix by stating the answer as the next sentence.
91
+
92
+ ## Escalating parallel clauses
93
+
94
+ `not only X but also Y`, and the longer chains built on it. The construction promises a second claim that outranks the first and usually delivers a restatement.
95
+
96
+ ```markdown
97
+ Bad: The cache not only stores responses but also improves latency.
98
+ Good: The cache stores responses, which is what cuts latency.
99
+ ```
100
+
101
+ Fix by writing the two claims as two sentences, or by cutting the one that repeats.
102
+
103
+ ## Empty superlative frames
104
+
105
+ `one of the most important`, `a critical piece of`, `at the heart of`. The frame ranks a thing against a set the sentence never names.
106
+
107
+ Fix by stating what the thing does. A ranking survives only where the set is named and the position is measured.
@@ -0,0 +1,37 @@
1
+ ---
2
+ title: Source material
3
+ description: Which external writing patterns this skill adopted, which it declined, and the measurement behind each decision
4
+ ---
5
+
6
+ # Source material
7
+
8
+ Two external writing skills were read on 2026-08-19 as source material for this one. The first catalogs 31 patterns of machine-sounding prose. The second layers document mode, sentence construction, information density, and ambiguity prevention.
9
+
10
+ Neither was imported wholesale, and one measurement settles why. Read this before adding a rule from outside this corpus, and extend the position below rather than deriving a second one.
11
+
12
+ ## What was adopted
13
+
14
+ Roughly half the pattern catalog had no counterpart in this corpus, and six of those patterns are now in `machine-tells.md`: rule-of-three, synonym cycling, false ranges, inline-header lists, adverb propping, and passive voice with an unnamed actor. Each is a shape rather than a token, which is what kept it out of a ban list that matches words.
15
+
16
+ The density layer had no counterpart at all and is now `density.md`. Its useful half is the split between what a compression pass may cut and what it may not, since a terse register already instructs a session to cut and names nothing that has to survive.
17
+
18
+ The ambiguity rules travel with that layer for the same reason. Compression is what creates the ambiguity, so a rule about pronouns and modifiers belongs beside the rule that shortened the sentence.
19
+
20
+ ## What was declined
21
+
22
+ - **The ban on abstract metaphor nouns.** The nouns it names are load-bearing terms in this corpus rather than decoration, and the count below is what decides it.
23
+ - **Document mode as a selector.** The source has the writer pick a mode before drafting. In this corpus a document's shape is already fixed by the standard governing its type, so a mode selector adds a second authority over one question and the two will disagree.
24
+ - **Any restatement of a banned word set.** The bans ship as package data that `aitk markdown audit` reads, and a copy here would be a second source for one list with a machine reading the other.
25
+ - **A voice register per surface.** One baseline covers every surface. A surface needing a warmer register states its own voice and claims the yield, which lifts voice alone and leaves the bans, the rhythm rules, and the tells in force.
26
+
27
+ The first of those four rests on a count. The source names `surface` among the nouns it bans, and tracked markdown in the authoring repository used `surface` 593 times, `harness` 95, `scaffolding` 17, and `primitive` 4, measured at `57ee7467` on 2026-08-19. Adopting the item either rewrites established vocabulary across the corpus or is ignored in silence, and a reader arriving later cannot tell which happened.
28
+
29
+ ## Where this diverges
30
+
31
+ The source material treats repetition of a noun as a defect. This skill treats it as precision and bans the synonym cycling that avoids it, which reverses the item for reference prose where a reader has to know that two names are one thing.
32
+
33
+ The source material also prefers shorter sentences without bound. This skill measures the spread instead, since a passage of uniformly short sentences is the reported failure rather than the fix for it.
34
+
35
+ ## The industry-guide record
36
+
37
+ The cadence rules and the bans they pair with trace to three industry style guides, being Google's developer documentation style guide, Microsoft's writing style guide, and Apple's style guide. The authoring toolkit keeps the per-rule attributions and the dates each guide was read, and no install carries that record, so this file is the position a target reads.