@thebassclef/lite 1.0.3 → 1.1.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 (275) hide show
  1. package/dist/cli.cjs +92 -6
  2. package/dist/cli.js +92 -6
  3. package/dist/index.cjs +1 -1
  4. package/dist/index.d.ts +1 -1
  5. package/dist/index.js +1 -1
  6. package/dist/lite/.claude/agents/architect.md +70 -0
  7. package/dist/lite/.claude/agents/builder.md +114 -0
  8. package/dist/lite/.claude/agents/designer.md +156 -0
  9. package/dist/lite/.claude/agents/reviewer.md +88 -0
  10. package/dist/lite/.claude/hooks/bassclef-sync.sh +85 -27
  11. package/dist/lite/.claude/hooks/longrun-prep-compounding-axis-check.sh +492 -0
  12. package/dist/lite/.claude/hooks/longrun-prep-render-check.sh +236 -0
  13. package/dist/lite/.claude/hooks/persona-name-scrub-check.sh +105 -0
  14. package/dist/lite/.claude/hooks/skill-step-list-check.sh +171 -0
  15. package/dist/lite/.claude/luminaries/alan-cooper.md +170 -0
  16. package/dist/lite/.claude/luminaries/alistair-cockburn.md +140 -0
  17. package/dist/lite/.claude/luminaries/amazon-pr-faq.md +34 -0
  18. package/dist/lite/.claude/luminaries/andreas-zeller.md +74 -0
  19. package/dist/lite/.claude/luminaries/ash-maurya.md +121 -0
  20. package/dist/lite/.claude/luminaries/bill-buxton.md +210 -0
  21. package/dist/lite/.claude/luminaries/charles-sanders-peirce.md +150 -0
  22. package/dist/lite/.claude/luminaries/david-ogilvy.md +192 -0
  23. package/dist/lite/.claude/luminaries/don-norman.md +173 -0
  24. package/dist/lite/.claude/luminaries/edward-tufte.md +179 -0
  25. package/dist/lite/.claude/luminaries/eric-evans.md +160 -0
  26. package/dist/lite/.claude/luminaries/frederick-brooks.md +50 -0
  27. package/dist/lite/.claude/luminaries/gang-of-four.md +157 -0
  28. package/dist/lite/.claude/luminaries/glenford-myers.md +230 -0
  29. package/dist/lite/.claude/luminaries/hunt-thomas.md +115 -0
  30. package/dist/lite/.claude/luminaries/hyrum-wright.md +94 -0
  31. package/dist/lite/.claude/luminaries/jason-fried-dhh.md +46 -0
  32. package/dist/lite/.claude/luminaries/jesse-james-garrett.md +154 -0
  33. package/dist/lite/.claude/luminaries/john-ousterhout.md +94 -0
  34. package/dist/lite/.claude/luminaries/karl-popper.md +132 -0
  35. package/dist/lite/.claude/luminaries/kent-beck.md +168 -0
  36. package/dist/lite/.claude/luminaries/linus-torvalds.md +218 -0
  37. package/dist/lite/.claude/luminaries/martin-fowler.md +164 -0
  38. package/dist/lite/.claude/luminaries/michael-feathers.md +125 -0
  39. package/dist/lite/.claude/luminaries/michael-nygard.md +118 -0
  40. package/dist/lite/.claude/luminaries/robert-c-martin.md +164 -0
  41. package/dist/lite/.claude/luminaries/saltzer-schroeder.md +194 -0
  42. package/dist/lite/.claude/luminaries/sophia-prater.md +193 -0
  43. package/dist/lite/.claude/luminaries/stephen-toulmin.md +131 -0
  44. package/dist/lite/.claude/luminaries/tony-hoare.md +170 -0
  45. package/dist/lite/.claude/luminaries/vaughn-vernon.md +50 -0
  46. package/dist/lite/.claude/luminaries/w-edwards-deming.md +158 -0
  47. package/dist/lite/.claude/rules/accessor-library-discipline.md +110 -0
  48. package/dist/lite/.claude/rules/adr-discipline.md +96 -0
  49. package/dist/lite/.claude/rules/api-conventions.md +115 -0
  50. package/dist/lite/.claude/rules/artifact-ingestion.md +137 -0
  51. package/dist/lite/.claude/rules/assert-only-after-verify.md +111 -0
  52. package/dist/lite/.claude/rules/blocked-items.md +139 -0
  53. package/dist/lite/.claude/rules/bootstrap-pair-discipline.md +106 -0
  54. package/dist/lite/.claude/rules/branching.md +28 -0
  55. package/dist/lite/.claude/rules/cold-adopter-harness-discipline.md +93 -0
  56. package/dist/lite/.claude/rules/commit-conventions.md +22 -0
  57. package/dist/lite/.claude/rules/compounding-axis-fresh-analysis.md +173 -0
  58. package/dist/lite/.claude/rules/compounding-sequence-fresh-analysis.md +173 -0
  59. package/dist/lite/.claude/rules/context-engineering.md +155 -0
  60. package/dist/lite/.claude/rules/context-management.md +85 -0
  61. package/dist/lite/.claude/rules/defensive-bash.md +52 -0
  62. package/dist/lite/.claude/rules/deferred-actions.md +233 -0
  63. package/dist/lite/.claude/rules/destructive-operations.md +69 -0
  64. package/dist/lite/.claude/rules/diagnosis.md +38 -0
  65. package/dist/lite/.claude/rules/github-issue-flash-tweet.md +114 -0
  66. package/dist/lite/.claude/rules/guardrails.md +73 -0
  67. package/dist/lite/.claude/rules/hook-wire-on-author.md +77 -0
  68. package/dist/lite/.claude/rules/identifier-leak-prevention.md +73 -0
  69. package/dist/lite/.claude/rules/iteration-bet-brief-completeness.md +43 -0
  70. package/dist/lite/.claude/rules/lite-manifest-schema-change-discipline.md +79 -0
  71. package/dist/lite/.claude/rules/longrun-prep-plan-doc-compression.md +77 -0
  72. package/dist/lite/.claude/rules/loop-discipline.md +71 -0
  73. package/dist/lite/.claude/rules/manual-prod-approval.md +100 -0
  74. package/dist/lite/.claude/rules/marker-enrichment-discipline.md +72 -0
  75. package/dist/lite/.claude/rules/mobile-ephemeral-session.md +109 -0
  76. package/dist/lite/.claude/rules/new-dependency-check.md +44 -0
  77. package/dist/lite/.claude/rules/oo-ad-entry-point.md +95 -0
  78. package/dist/lite/.claude/rules/operator-facing-prose.md +177 -0
  79. package/dist/lite/.claude/rules/option-label-discipline.md +82 -0
  80. package/dist/lite/.claude/rules/pattern-annotation.md +83 -0
  81. package/dist/lite/.claude/rules/persona-name-leak-scrub.md +90 -0
  82. package/dist/lite/.claude/rules/plain-english-discipline.md +132 -0
  83. package/dist/lite/.claude/rules/plan-enumeration-needs-value-props.md +177 -0
  84. package/dist/lite/.claude/rules/pr-body-shape.md +195 -0
  85. package/dist/lite/.claude/rules/pr-strategy.md +142 -0
  86. package/dist/lite/.claude/rules/pr-title-shape.md +90 -0
  87. package/dist/lite/.claude/rules/prototype-workflow.md +53 -0
  88. package/dist/lite/.claude/rules/reserved-skill-names.md +103 -0
  89. package/dist/lite/.claude/rules/schema-management.md +42 -0
  90. package/dist/lite/.claude/rules/sdlc-gates.md +149 -0
  91. package/dist/lite/.claude/rules/security.md +37 -0
  92. package/dist/lite/.claude/rules/session-artifacts.md +236 -0
  93. package/dist/lite/.claude/rules/skill-composition-declarations.md +105 -0
  94. package/dist/lite/.claude/rules/skill-description-clarity.md +196 -0
  95. package/dist/lite/.claude/rules/skill-procedure-step-list.md +119 -0
  96. package/dist/lite/.claude/rules/sprint-prep-preset-picker.md +76 -0
  97. package/dist/lite/.claude/rules/state-schema-validation.md +156 -0
  98. package/dist/lite/.claude/rules/stuck-signal-diagnostic.md +111 -0
  99. package/dist/lite/.claude/rules/substrate-config-schema.md +85 -0
  100. package/dist/lite/.claude/rules/test-list-discipline.md +129 -0
  101. package/dist/lite/.claude/rules/test-sufficiency.md +186 -0
  102. package/dist/lite/.claude/rules/testing-tier-config.md +125 -0
  103. package/dist/lite/.claude/rules/testing.md +38 -0
  104. package/dist/lite/.claude/rules/turn-estimate-grounding.md +82 -0
  105. package/dist/lite/.claude/rules/visual-hierarchy.md +427 -0
  106. package/dist/lite/.claude/rules/we-dont-break-adopters.md +103 -0
  107. package/dist/lite/.claude/rules/whereami-load-bearing.md +184 -0
  108. package/dist/lite/.claude/rules/writing-craft-discipline.md +72 -0
  109. package/dist/lite/.claude/rules/wu-sequencing-compounds.md +119 -0
  110. package/dist/lite/.claude/skills/build/SKILL.md +640 -0
  111. package/dist/lite/.claude/skills/chronicle/SKILL.md +55 -0
  112. package/dist/lite/.claude/skills/clean-artifacts/SKILL.md +249 -0
  113. package/dist/lite/.claude/skills/decompose/SKILL.md +280 -0
  114. package/dist/lite/.claude/skills/diagnose/SKILL.md +297 -0
  115. package/dist/lite/.claude/skills/feynman/SKILL.md +90 -0
  116. package/dist/lite/.claude/skills/howdoi/SKILL.md +105 -0
  117. package/dist/lite/.claude/skills/ia-model/SKILL.md +108 -0
  118. package/dist/lite/.claude/skills/interaction-design/SKILL.md +112 -0
  119. package/dist/lite/.claude/skills/interpret-input/SKILL.md +180 -0
  120. package/dist/lite/.claude/skills/journal/SKILL.md +209 -0
  121. package/dist/lite/.claude/skills/kiss/SKILL.md +449 -0
  122. package/dist/lite/.claude/skills/launch/SKILL.md +915 -0
  123. package/dist/lite/.claude/skills/lean-canvas/SKILL.md +332 -0
  124. package/dist/lite/.claude/skills/longrun/SKILL.md +512 -0
  125. package/dist/lite/.claude/skills/luminary/SKILL.md +481 -0
  126. package/dist/lite/.claude/skills/ogilvy-writing-audit/SKILL.md +177 -0
  127. package/dist/lite/.claude/skills/onboard-repo/SKILL.md +1640 -0
  128. package/dist/lite/.claude/skills/pattern-review/SKILL.md +99 -0
  129. package/dist/lite/.claude/skills/personas/SKILL.md +207 -0
  130. package/dist/lite/.claude/skills/promote/SKILL.md +283 -0
  131. package/dist/lite/.claude/skills/requirement/SKILL.md +98 -0
  132. package/dist/lite/.claude/skills/retro/SKILL.md +117 -0
  133. package/dist/lite/.claude/skills/riff/SKILL.md +114 -0
  134. package/dist/lite/.claude/skills/roadmap-reconcile/SKILL.md +163 -0
  135. package/dist/lite/.claude/skills/session-end/SKILL.md +309 -0
  136. package/dist/lite/.claude/skills/session-log/SKILL.md +299 -0
  137. package/dist/lite/.claude/skills/skills/SKILL.md +228 -0
  138. package/dist/lite/.claude/skills/spec/SKILL.md +105 -0
  139. package/dist/lite/.claude/skills/sprint/SKILL.md +418 -0
  140. package/dist/lite/.claude/skills/stage/SKILL.md +384 -0
  141. package/dist/lite/.claude/skills/state-a-problem/SKILL.md +185 -0
  142. package/dist/lite/.claude/skills/temperance/SKILL.md +108 -0
  143. package/dist/lite/.claude/skills/use-case/SKILL.md +417 -0
  144. package/dist/lite/.claude/skills/user-stories/SKILL.md +268 -0
  145. package/dist/lite/.claude/skills/value-prop/SKILL.md +251 -0
  146. package/dist/lite/.claude/skills/verify/SKILL.md +160 -0
  147. package/dist/lite/.claude/skills/visual-review/SKILL.md +503 -0
  148. package/dist/lite/.claude/skills/whats-the-plan/SKILL.md +202 -0
  149. package/dist/lite/.claude/skills/whereami/SKILL.md +307 -0
  150. package/dist/lite/AGENTS.md +79 -0
  151. package/dist/lite/CLAUDE-lite.md +85 -0
  152. package/dist/lite/CODE_OF_CONDUCT.md +28 -0
  153. package/dist/lite/CONTRIBUTING.md +177 -0
  154. package/dist/lite/README.md +173 -0
  155. package/dist/lite/SECURITY.md +19 -0
  156. package/dist/lite/architecture/decisions/ADR-029-release-pipeline.md +79 -0
  157. package/dist/lite/architecture/decisions/ADR-031-non-breaking-changes-adopter-discipline.md +139 -0
  158. package/dist/lite/architecture/decisions/ADR-032-adopter-sync-dispatcher-architecture.md +192 -0
  159. package/dist/lite/architecture/decisions/ADR-039-release-tagging-scheme.md +145 -0
  160. package/dist/lite/architecture/decisions/ADR-040-planning-skill-vocabulary-and-lite-profile.md +155 -0
  161. package/dist/lite/architecture/decisions/ADR-044-unified-skill-body-template.md +162 -0
  162. package/dist/lite/lib/clean-artifacts-sweep.sh +112 -0
  163. package/dist/lite/lib/code-comment-discipline.sh +144 -0
  164. package/dist/lite/lib/composer-preflight.sh +459 -0
  165. package/dist/lite/lib/deferred-actions.sh +146 -0
  166. package/dist/lite/lib/hook-header-parser.sh +61 -0
  167. package/dist/lite/lib/hook-heartbeat.sh +152 -0
  168. package/dist/lite/lib/hook-inject.sh +255 -0
  169. package/dist/lite/lib/hook-installer.sh +195 -0
  170. package/dist/lite/lib/luminary-pick.sh +96 -0
  171. package/dist/lite/lib/output-discipline.sh +143 -0
  172. package/dist/lite/lib/prose-scan-boundary.sh +171 -0
  173. package/dist/lite/lib/rewrite-check.sh +214 -0
  174. package/dist/lite/lib/session-rescue.sh +151 -0
  175. package/dist/lite/lib/source-graph-walker.sh +277 -0
  176. package/dist/lite/lib/state.sh +1372 -0
  177. package/dist/lite/lib/telemetry.sh +205 -0
  178. package/dist/lite/lib/tier-check.sh +187 -0
  179. package/dist/lite/lib/tier-dependency-audit.sh +1088 -0
  180. package/dist/lite/presence/install/bassclef-hook-connect.sh +178 -0
  181. package/dist/lite/presence/install/bassclef-sync.dispatcher.template.sh +841 -0
  182. package/dist/lite/presence/install/bassclef-sync.template.sh +2278 -0
  183. package/dist/lite/presence/install/schedule-auto-save.cron.sh +88 -0
  184. package/dist/lite/presence/install/schedule-auto-save.taskscheduler.md +122 -0
  185. package/dist/lite/scripts/aggregate-telemetry.sh +217 -0
  186. package/dist/lite/scripts/analyze-tier-dependencies.sh +239 -0
  187. package/dist/lite/scripts/generate-lite-manifest.sh +505 -0
  188. package/dist/lite/scripts/generate-tier-manifest.sh +28 -0
  189. package/dist/lite/scripts/intent-drift-check.sh +456 -0
  190. package/dist/lite/scripts/lite-manifest-drift-check.sh +146 -0
  191. package/dist/lite/scripts/render-lite-manifest-doc.sh +150 -0
  192. package/dist/lite/standards/adr-template.md +86 -0
  193. package/dist/lite/standards/api-conventions/nextjs.md +84 -0
  194. package/dist/lite/standards/artifact-composition.md +209 -0
  195. package/dist/lite/standards/bash-hook-safety.md +246 -0
  196. package/dist/lite/standards/bassclef-configs-schema.md +232 -0
  197. package/dist/lite/standards/bassclef-evolution.md +143 -0
  198. package/dist/lite/standards/bassclef-internal-jargon.md +244 -0
  199. package/dist/lite/standards/bassclef-managed-sentinel.md +96 -0
  200. package/dist/lite/standards/bassclef-source-config.md +228 -0
  201. package/dist/lite/standards/branch-stacking.md +408 -0
  202. package/dist/lite/standards/code-safety-principles.md +176 -0
  203. package/dist/lite/standards/composer-prerequisites.md +155 -0
  204. package/dist/lite/standards/deferred-actions-schema.md +204 -0
  205. package/dist/lite/standards/dependency-discipline/cargo.md +39 -0
  206. package/dist/lite/standards/dependency-discipline/gem.md +43 -0
  207. package/dist/lite/standards/dependency-discipline/go-mod.md +41 -0
  208. package/dist/lite/standards/dependency-discipline/npm.md +42 -0
  209. package/dist/lite/standards/dependency-discipline/pip.md +42 -0
  210. package/dist/lite/standards/deployment-topology/ec2-tailscale.md +225 -0
  211. package/dist/lite/standards/deployment-topology.md +69 -0
  212. package/dist/lite/standards/docs-sync-allowlist.md +76 -0
  213. package/dist/lite/standards/domain-and-dns.md +145 -0
  214. package/dist/lite/standards/frontend-stack.md +67 -0
  215. package/dist/lite/standards/frontmatter-schema.md +154 -0
  216. package/dist/lite/standards/graceful-exit.md +227 -0
  217. package/dist/lite/standards/hook-idempotency.md +102 -0
  218. package/dist/lite/standards/hook-injection-discipline.md +202 -0
  219. package/dist/lite/standards/hook-install-class.md +215 -0
  220. package/dist/lite/standards/input-handler-interface.md +152 -0
  221. package/dist/lite/standards/lite-manifest-schema-changes.md +180 -0
  222. package/dist/lite/standards/lite-manifest.json +2797 -0
  223. package/dist/lite/standards/luminary-matching.md +105 -0
  224. package/dist/lite/standards/luminary-problem-patterns.md +481 -0
  225. package/dist/lite/standards/migration-discipline/active-record.md +50 -0
  226. package/dist/lite/standards/migration-discipline/alembic.md +43 -0
  227. package/dist/lite/standards/migration-discipline/gorm.md +50 -0
  228. package/dist/lite/standards/migration-discipline/prisma.md +53 -0
  229. package/dist/lite/standards/migration-discipline/sqlalchemy.md +51 -0
  230. package/dist/lite/standards/mobile-ephemeral-session.md +167 -0
  231. package/dist/lite/standards/model-routing-discipline.md +160 -0
  232. package/dist/lite/standards/ogilvy-writing-rules.md +225 -0
  233. package/dist/lite/standards/opener-discipline.md +96 -0
  234. package/dist/lite/standards/operator-facing-prose-discipline.md +201 -0
  235. package/dist/lite/standards/persona-schema.md +229 -0
  236. package/dist/lite/standards/pluggable-luminaries.md +323 -0
  237. package/dist/lite/standards/pr-body-discipline.md +115 -0
  238. package/dist/lite/standards/preview-state-schema.md +189 -0
  239. package/dist/lite/standards/project-directory-layout.md +276 -0
  240. package/dist/lite/standards/release-tagging.md +137 -0
  241. package/dist/lite/standards/reserved-skill-names.md +120 -0
  242. package/dist/lite/standards/scannable-multi-option-output.md +265 -0
  243. package/dist/lite/standards/sdlc-compliance.md +286 -0
  244. package/dist/lite/standards/sdlc-gates/typescript.md +57 -0
  245. package/dist/lite/standards/secrets-lifecycle.md +210 -0
  246. package/dist/lite/standards/security-scanner-adapter.md +145 -0
  247. package/dist/lite/standards/session-board.md +256 -0
  248. package/dist/lite/standards/skill-output-discipline.md +121 -0
  249. package/dist/lite/standards/state-spine-contract.md +255 -0
  250. package/dist/lite/standards/state-spine.md +511 -0
  251. package/dist/lite/standards/steering-hints/kiss-words.md +11 -0
  252. package/dist/lite/standards/substrate-config-schema.md +267 -0
  253. package/dist/lite/standards/tech-stack-config.md +109 -0
  254. package/dist/lite/standards/tier-dependency-analysis.md +167 -0
  255. package/dist/lite/standards/tier-runtime-deps/lite.md +57 -0
  256. package/dist/lite/standards/tier-tag-schema.md +155 -0
  257. package/dist/lite/standards/two-layer-config.md +99 -0
  258. package/dist/lite/standards/use-case-format.md +292 -0
  259. package/dist/lite/standards/user-story-invest.md +268 -0
  260. package/dist/lite/standards/velocity-and-appetite.md +229 -0
  261. package/dist/lite/standards/voice-input-pattern.md +119 -0
  262. package/dist/lite/standards/whereami-schema.md +301 -0
  263. package/dist/lite/standards/worktree-management.md +211 -0
  264. package/dist/lite/standards/writing-guide.md +213 -0
  265. package/dist/lite/templates/chronicle-template.md +75 -0
  266. package/dist/lite/templates/deferred-action-template.md +45 -0
  267. package/dist/lite/templates/memory-proposal-template.md +77 -0
  268. package/dist/lite/templates/persona-template.md +200 -0
  269. package/dist/lite/templates/pr-faq.md +45 -0
  270. package/dist/lite/templates/secret-rotation-template.md +162 -0
  271. package/dist/lite/templates/spec-template.md +131 -0
  272. package/dist/lite/templates/use-case-template.md +194 -0
  273. package/dist/lite/templates/user-story-template.md +107 -0
  274. package/dist/lite/templates/whereami-template.md +101 -0
  275. package/package.json +1 -1
@@ -0,0 +1,236 @@
1
+ ---
2
+ tier: lite
3
+ globs: ["*"]
4
+ description: Session artifacts — chronicle + journal entries at every phase transition and session end
5
+ ---
6
+
7
+ In ALL configurations (operator-gated, orchestrator-gated, sequential, parallel), these artifacts are mandatory.
8
+ They fire regardless of whether /autonomous is active.
9
+
10
+ ## Bassclef-side note — telemetry is local-only (bassclef#1205)
11
+
12
+ When this rule fires INSIDE bassclef itself (not adopter repos):
13
+ chronicles and state markers are written but NOT git-tracked. The paths
14
+ `chronicle/` and `state/markers/` are gitignored in bassclef's repo
15
+ per bassclef#1205. Iteration telemetry stays on the operator machine
16
+ and is destined for bassclef-upstream long-term per memory
17
+ `project_bassclef_private_to_bassclef_upstream`.
18
+
19
+ INSTEAD of pushing chronicles + markers to bassclef-public: write
20
+ them locally for operator continuity, commit only artifacts that
21
+ belong in the public substrate (skills, rules, hooks, standards,
22
+ ADRs). The brand-team Google Doc push (per the journal step below)
23
+ preserves shareable content without coupling bassclef's git history
24
+ to specific adopter sessions.
25
+
26
+ This applies to bassclef's own repo only; adopter repos keep
27
+ chronicles + markers tracked per their own configuration.
28
+
29
+ ## Backfill before current (MUST — applies to all artifacts below)
30
+
31
+ Before writing ANY session artifact (chronicle, journal entry, release notes):
32
+ 1. Check when the last entry was written
33
+ 2. Check how many sessions/commits/days are missing since then
34
+ 3. If there are gaps: backfill them FIRST, in chronological order (oldest first)
35
+ 4. THEN write the current session's artifact
36
+
37
+ This prevents out-of-order content in append-only destinations (Google Docs)
38
+ and ensures no session is silently skipped.
39
+
40
+ ## Chronicle (MUST — every phase transition + session end)
41
+
42
+ Before ending any session or completing any phase transition:
43
+ 1. Check: when was the last chronicle entry? How many commits since?
44
+ 2. If ≥3 commits since last entry: backfill the missing chronicle(s) FIRST
45
+ 3. Then write the current session's chronicle
46
+ 4. Chronicle location (per `standards/project-directory-layout.md`):
47
+ - App repos: `docs/chronicle/`
48
+ - Bassclef: `chronicle/` (root level)
49
+ - If the directory doesn't exist, create it per the standard.
50
+ 5. **Use the bassclef template** — `templates/chronicle-template.md`.
51
+ Do NOT invent ad-hoc section structures for "narrative closeouts" or
52
+ similar shapes. The /chronicle and /session-end SKILLs both reference
53
+ this template; ad-hoc chronicles silently drop the Gate Evidence
54
+ section (bassclef#298 root cause).
55
+ 6. **Populate the Gate Evidence section** — MUST, not optional. This
56
+ is the authoritative input for the 5-session gate-compliance counter.
57
+ Auto-populate script is in the template. Skipping it produces the
58
+ "0% compliance / no data" failure mode that pre-commit-gate.sh now
59
+ blocks mechanically (bassclef#298). Override only if you have an
60
+ explicit valid `n/a` reason per `standards/sdlc-compliance.md`
61
+ §"Gate skip justifications".
62
+ 7. Verify the file exists after writing AND `grep -qiE "^## Gate (E|e)vidence"`
63
+ confirms the section is present.
64
+
65
+ ## journal entries (SHOULD — session start + every notable decision or handoff)
66
+
67
+ ### At session start (SHOULD — backfill before new work)
68
+
69
+ Before starting any new work, check for journal entry gaps:
70
+ 1. Read the most recent draft in `docs/operator-private/journals/`
71
+ 2. Read chronicles since that draft date
72
+ 3. If any session produced a notable decision, trade-off, or insight:
73
+ backfill drafts NOW, oldest first, push to Google Doc
74
+ 4. Then proceed with session work
75
+
76
+ This fires at session start, not just session end, because session-end
77
+ is where drafts get dropped — the agent runs out of context, the hook
78
+ times out, or the session dies. Catching it at the START of the next
79
+ session is the safety net.
80
+
81
+ ### At session end and handoffs
82
+
83
+ At every role handoff, phase transition, or session end, ask:
84
+ "Did this session/phase/handoff produce a notable decision, trade-off,
85
+ or insight worth sharing?"
86
+
87
+ If yes:
88
+ 1. Check for gaps: when was the last journal entry? Are there missed
89
+ sessions that owed drafts? Backfill those FIRST, oldest to newest.
90
+ 2. Create docs/operator-private/journals/ if it doesn't exist
91
+ 3. Write draft to docs/operator-private/journals/YYYY-MM-DD.md
92
+ 4. Push to Google Doc — push in chronological order (oldest first):
93
+ Read the Google Doc ID from `substrate.config.md` field `journal_doc_id`.
94
+ If not configured there, check project memory for the doc ID.
95
+ If neither exists, skip the push and keep drafts local in docs/operator-private/journals/.
96
+ When configured — prefer `--dir` for batch pushes (script sorts by filename):
97
+ npx tsx ~/src/sunj-labs/poa/scripts/push-to-gdoc.ts --dir [drafts dir] --doc-id [ID from substrate.config.md]
98
+ For single new draft:
99
+ npx tsx ~/src/sunj-labs/poa/scripts/push-to-gdoc.ts --file [draft path] --doc-id [ID from substrate.config.md]
100
+ To fix out-of-order doc (clear + re-push sorted):
101
+ npx tsx ~/src/sunj-labs/poa/scripts/push-to-gdoc.ts --dir [drafts dir] --replace --doc-id [ID from substrate.config.md]
102
+ 5. Verify both the local file and Google Doc push succeeded
103
+
104
+ High-value moments for journal entries:
105
+ - Scope kills (Shaper cutting features)
106
+ - Architecture choices (Architect choosing boring tech)
107
+ - Process insights (what broke, what worked, what surprised)
108
+ - Design pushback (Designer vs PM)
109
+ - Quantified results (N agents, M minutes, K artifacts)
110
+
111
+ Every draft file MUST include an **audience recommendations table**:
112
+
113
+ | Post | Primary audience | Hook strength | Publish priority |
114
+ |------|-----------------|--------------|-----------------|
115
+
116
+ Target audiences: PE partners, executive search leaders, board-level
117
+ operators, CPTOs, technical founders, eng leaders/managers.
118
+ Rate hook strength (weak/medium/strong/very strong/strongest).
119
+ Recommend a publish sequence with rationale.
120
+ Note overlapping posts and recommend which to publish vs hold.
121
+
122
+ ## Wiki-as-we-go discipline (SHOULD — at /longrun closeout, per bassclef#1208)
123
+
124
+ At every `/longrun closeout`, ask:
125
+
126
+ > Did this run produce material surface changes that need a wiki refresh?
127
+
128
+ Discriminator list — any YES means wiki-refresh is owed:
129
+
130
+ - New, renamed, or retired skill
131
+ - New, renamed, or retired hook
132
+ - New, renamed, or retired rule
133
+ - New, renamed, or retired standard or ADR
134
+ - Changes to `/onboard-repo` Phase 2.x discovery surfaces
135
+ - New entries in `standards/bassclef-internal-jargon.md` (wordlist amendments)
136
+ - New entries in `standards/bassclef-source-consumers.json` (anonymizer registry)
137
+
138
+ If yes, either:
139
+
140
+ 1. **Add wiki edits to the closeout PR** when the change is small and ships in the same window. Wiki repo is separate; commit + push the wiki-side changes with a cross-ref to the bassclef PR, and note the wiki commit hash in the closeout PR body.
141
+ 2. **File a wiki-refresh follow-on ticket** when wiki changes are larger or need separate review. The ticket cites the bassclef PR(s) that introduced the substrate change and the wiki pages that need updating.
142
+
143
+ If no, note "no wiki refresh owed" in the closeout chronicle so a future reader sees the question was asked.
144
+
145
+ INSTEAD of letting the wiki drift quietly: ask the discriminator question at every closeout. The wiki is the cold-adopter front door; drift there is the most operator-visible failure mode.
146
+
147
+ ## Session-rescue + memory-proposal (MUST — abrupt stop safety net)
148
+
149
+ When the Stop hook fires with unfinished MUST-tier obligations,
150
+ `.claude/hooks/session-end.sh` writes a
151
+ `docs/deferred-actions/<ts>-session-rescue.md` entry automatically.
152
+ The next session surfaces it as `BLOCKED: deferred-action` via
153
+ `60-deferred-actions.sh` and resolves per the entry's Command section.
154
+
155
+ ### What the hook checks
156
+
157
+ Two signals trigger a rescue write (bassclef #239 hardening, 2026-04-21):
158
+
159
+ 1. **Chronicle freshness** — at least one file in `chronicle/` or
160
+ `docs/chronicle/` has been written or modified within the last 24
161
+ hours. This is **session-relative**, not UTC-calendar-date-relative:
162
+ a chronicle dated yesterday written at 23:50 UTC still satisfies
163
+ the obligation when the next Stop fires at 00:10 the following day.
164
+ 2. **Clean working tree** — `git status --porcelain -u` returns empty,
165
+ OR the only uncommitted paths are session-rescue entries the hook
166
+ itself wrote on a prior firing (self-output suppression). Real
167
+ content (any non-rescue path) still fires rescue.
168
+
169
+ Both signals together close the self-amplifying loop that prior
170
+ shapes produced (UTC calendar-date check + rescue-entry counting as
171
+ uncommitted work → auto-save → Stop → rescue → loop; see
172
+ `chronicle/2026-04-21-session-rescue-loop.md`).
173
+
174
+ This is additive to the obligations above — chronicle + journal entries
175
+ continue to be first-line duties. Rescue is the safety net for cases
176
+ where those weren't completed (context exhausted, OS interruption,
177
+ sandbox teardown, explicit abort).
178
+
179
+ ### Memory proposals from ephemeral sessions
180
+
181
+ Mobile and cloud-web sessions cannot write to
182
+ `~/.claude/projects/.../memory/` — the operator's real home is
183
+ unreachable from the sandbox. When such a session identifies a memory
184
+ entry worth adding:
185
+
186
+ 1. Copy `templates/memory-proposal-template.md` to
187
+ `docs/deferred-actions/<ts>-memory-<topic-slug>.md`
188
+ 2. Fill in the target path, proposed frontmatter + body, MEMORY.md
189
+ index line
190
+ 3. Commit with the session's normal artifact flow
191
+
192
+ Next desktop session sees it as `BLOCKED: deferred-action` (requires
193
+ `memory-write` capability), reviews, applies verbatim or edits first,
194
+ and `git mv`'s to `completed/` per the deferred-actions protocol.
195
+
196
+ See `.claude/rules/deferred-actions.md` for the full lifecycle.
197
+
198
+ ## Cloud and degraded environments
199
+
200
+ In cloud (Claude Code web), CI runners, and fresh clones, the Stop hook
201
+ may not fire or may be killed before completing. This is not an excuse
202
+ to skip artifacts — it is a reason to be proactive.
203
+
204
+ When operating in a cloud or degraded environment:
205
+
206
+ 1. **Do not wait for hooks** — invoke /session-end explicitly before ending
207
+ the session.
208
+
209
+ INSTEAD of assuming the Stop hook will fire: type `/session-end`
210
+ yourself when the session is at a natural close. Hooks are unreliable
211
+ in cloud / ephemeral / CI environments.
212
+ 2. **Must tier first** — write the chronicle and commit locally before
213
+ attempting any network operation (push, Google Doc). Network may not
214
+ be available or may timeout.
215
+ 3. **Journal-entry Google Doc push** — requires a service account key that is
216
+ not available in cloud. Write the draft to `docs/operator-private/journals/` and
217
+ skip the push step. Note "push pending — service account unavailable"
218
+ in the draft frontmatter.
219
+ 4. **Stop hook timeout** — if the app repo's `settings.json` has a timeout
220
+ on the Stop hook, it MUST be at least 30 seconds (see session-end SKILL.md).
221
+ A 5-second timeout will kill `git push` silently.
222
+
223
+ INSTEAD of silently accepting a too-short timeout: file a ticket to
224
+ fix it. If you discover a timeout shorter than 30s, surface it.
225
+ 5. **Graceful degradation order**:
226
+ - Chronicle (local, always possible) → commit checkpoint → git push
227
+ (may fail) → journal entry local (always possible) → Google Doc push
228
+ (may fail in cloud)
229
+ - Phase 1 (local artifacts) MUST complete even if Phase 2 (network) fails
230
+
231
+ ## This rule exists because
232
+
233
+ Agents forget to write session artifacts in long sessions, especially
234
+ after context compaction. Putting this in rules/ ensures it loads into
235
+ every session at every level. The choreography doc has the full protocol;
236
+ this rule is the reminder that fires regardless of mode.
@@ -0,0 +1,105 @@
1
+ ---
2
+ tier: lite
3
+ description: How and when skills declare composes_with (extends another skill) vs depends_on (needs a runtime predecessor) in frontmatter. Closes bassclef#862 Gap 3.
4
+ ---
5
+
6
+ # Skill composition declarations — `composes_with:` and `depends_on:`
7
+
8
+ Two frontmatter fields make skill relationships explicit and machine-checkable. `composes_with:` names skills the current skill builds on. `depends_on:` names what must exist at runtime before the skill can usefully run.
9
+
10
+ The substrate-clarity-gate hook reads both fields and catches typos by checking that named targets actually exist on disk. `composes_with:` is strict — a missing target blocks the write. `depends_on:` is advisory in V1.
11
+
12
+ ## When this rule fires
13
+
14
+ When authoring or editing a skill frontmatter and you need to express:
15
+
16
+ - "This skill chains with skill X" → `composes_with:`
17
+ - "This skill needs Y to exist or be set first" → `depends_on:`
18
+
19
+ Either field is optional. Skills that stand alone need neither.
20
+
21
+ ## `composes_with:` — extends another skill's behavior
22
+
23
+ Use when the current skill builds on another skill's output, runs another skill as a step, or extends another skill's discipline.
24
+
25
+ Format:
26
+
27
+ ```yaml
28
+ composes_with: [kiss, value-prop]
29
+ ```
30
+
31
+ Each name must match a `.claude/skills/<name>/SKILL.md` file. The hook BLOCKs the write when a name does not resolve.
32
+
33
+ Examples that qualify:
34
+
35
+ - `/longrun` composes_with `[temperance, retro, promote, session-end]` — runs these skills at lifecycle points
36
+ - `/launch` composes_with `[interpret-input, stage, spec, use-case]` — chains the buildable-plan pipeline
37
+ - `/diagnose` composes_with `[temperance]` — fires temperance before diagnostic ceremony
38
+
39
+ When `composes_with:` is wrong, the substrate doesn't know the skill maps to a real chain. INSTEAD of listing rough memory of which skills run: list the exact slugs the skill calls.
40
+
41
+ ## `depends_on:` — required runtime predecessors
42
+
43
+ Use when the skill assumes a predecessor exists at runtime. The predecessor can be a skill, a rule, or a known config block in `.claude/bassclef-configs.jsonc`.
44
+
45
+ Format:
46
+
47
+ ```yaml
48
+ depends_on: [tech_stack, personas]
49
+ ```
50
+
51
+ V1 enforcement is advisory. The hook warns when a named target does not resolve as a skill, rule, or known config block, but the write passes. V2 may flip to strict once the vocabulary stabilizes.
52
+
53
+ Recognized config blocks (V1 list): `tech_stack`, `adopter_defaults`, `plan_tier`, `prose_discipline`, `longrun`, `testing`.
54
+
55
+ Examples that qualify:
56
+
57
+ - A skill that reads adopter stack metadata depends_on `[tech_stack]`
58
+ - A skill that requires persona definitions depends_on `[personas]` (the `/personas` skill must have run)
59
+ - A skill that reads adopter overrides depends_on `[adopter_defaults]` (the bassclef-configs block)
60
+
61
+ When `depends_on:` is wrong, the skill silently produces empty output instead of telling the operator what is missing. INSTEAD of letting the skill discover its preconditions at runtime: declare them up front.
62
+
63
+ ## composes_with vs depends_on — picking one
64
+
65
+ | If the relationship is... | Use |
66
+ |---|---|
67
+ | The current skill runs the other skill as a step | `composes_with:` |
68
+ | The current skill extends or chains the other skill's output | `composes_with:` |
69
+ | The current skill needs prior session state from another skill | `depends_on:` |
70
+ | The current skill reads a config block at runtime | `depends_on:` |
71
+ | The current skill assumes a rule is in force | `depends_on:` |
72
+
73
+ INSTEAD of listing the same name in both fields: pick the relationship that fires first. A skill that both runs `/value-prop` AND needs `/personas` from a prior session declares `composes_with: [value-prop]` plus `depends_on: [personas]`.
74
+
75
+ ## What this rule does NOT cover
76
+
77
+ - Source code patterns and design pattern annotations — see `.claude/rules/pattern-annotation.md`
78
+ - Frontmatter schema fields other than these two — see `standards/frontmatter-schema.md`
79
+ - Adopter onboarding wiring (which adopter-config blocks ship by default) — see `.claude/skills/onboard-repo/SKILL.md`
80
+ - Layer 3 traceability manifests that auto-populate from declared values — Phase 4 of bet 2026-06-18a (WU-17/WU-18/WU-19 deferred follow-on)
81
+
82
+ ## Mechanical enforcement
83
+
84
+ - `composes_with:` value type must be a YAML list of strings. A non-list type or a non-string item BLOCKs the write.
85
+ - Each name in `composes_with:` must resolve to `<repo>/.claude/skills/<name>/SKILL.md`. A missing target BLOCKs.
86
+ - Each name in `depends_on:` resolves against skills, rules, or known config blocks. A miss emits an ADVISORY notice and passes.
87
+ - Substrate root for path resolution is derived from the file being written (everything before `/.claude/`).
88
+
89
+ Hook: `.claude/hooks/substrate-clarity-gate.sh` (added in bassclef#862 WU-15).
90
+ Tests: `.claude/hooks/tests/substrate-clarity-gate.test.sh` Tests 27–36.
91
+
92
+ ## Override
93
+
94
+ `SKIP_SUBSTRATE_CLARITY=1 <command>` bypasses the validation and logs the override via trace-helper. INSTEAD of overriding when a target is genuinely missing: file the missing skill first, then add the composes_with entry.
95
+
96
+ Override is appropriate when:
97
+
98
+ - A migration script edits many skills at once and the target skill ships in the same PR
99
+ - Emergency rescue when the hook itself is broken
100
+
101
+ ## Composes with
102
+
103
+ - `.claude/rules/skill-description-clarity.md` — sister discipline at the frontmatter description surface
104
+ - `.claude/rules/state-schema-validation.md` — sister mechanical check at the state-spine surface
105
+ - `standards/frontmatter-schema.md` — full frontmatter field catalog
@@ -0,0 +1,196 @@
1
+ ---
2
+ tier: lite
3
+ description: "Every skill's frontmatter description field must be parseable by an engineer with no bassclef context in under 60 seconds."
4
+ ---
5
+
6
+ # Skill-Description Clarity
7
+
8
+ Every skill's frontmatter `description` field must be parseable by an
9
+ engineer with no bassclef context in under 60 seconds. Outcome-first.
10
+ ≤280 chars. Plain language. INSTEAD-block discipline.
11
+
12
+ This rule sits at the entry surface. It parallels bassclef#357 (which governs autonomous-run output). It applies `.claude/rules/context-engineering.md` at the description field: write for what the model can access. For this rule, that means write what a fresh engineer can read in 60 seconds.
13
+
14
+ **Mechanical enforcement**: `.claude/hooks/substrate-clarity-gate.sh` fires at PreToolUse Edit|Write on substrate paths. It BLOCKs skill descriptions past 280 chars or without verb-first openers. The rule + luminary INSTEAD-block check runs ADVISORY today. It flips to BLOCK once the rule + luminary audits ship (tracked under bassclef-upstream#303). The allowlist at `.claude/hooks/substrate-clarity-allowlist.txt` grandfathers existing violators during the grace window. Per bassclef#382.
15
+
16
+ ## The bar
17
+
18
+ Anthropic's frontend-design description (per Welch's revision):
19
+
20
+ > "Create distinctive, production-grade frontend interfaces with
21
+ > high design quality. Avoids generic AI aesthetics."
22
+
23
+ That's the bar. Outcome ("create distinctive interfaces"), one-line
24
+ how ("with high design quality"), one-line why-distinct ("avoids
25
+ generic AI aesthetics"). 117 chars. Engineer reads it; knows what
26
+ the skill produces; knows when to use it.
27
+
28
+ Compare to bassclef's pre-rule descriptions (representative):
29
+
30
+ > "BUILD-tier composer (Construction transition). Chains the
31
+ > prototype pipeline (input → variants → gallery → bind-subdomain)
32
+ > PLUS the buildable-spec pipeline (use-case → user-stories →
33
+ > ia-model → interaction-design → decompose → spec → ux-migration)."
34
+
35
+ 571 chars. Methodology-laden. Requires knowing what every named
36
+ component is. Engineer can't grok in 60 seconds.
37
+
38
+ ## Format
39
+
40
+ Every skill's frontmatter `description` field follows:
41
+
42
+ ```
43
+ <verb> <outcome>. <one-line how>. <one-line why-distinct>.
44
+ ```
45
+
46
+ - **Verb**: imperative — "Create," "Generate," "Run," "Compose," "Audit"
47
+ - **Outcome**: what the skill PRODUCES (not how it works internally)
48
+ - **One-line how**: the most distinguishing mechanism, in plain language
49
+ - **One-line why-distinct**: what makes it different from adjacent skills (or what it specifically AVOIDS)
50
+
51
+ Total ≤280 chars including spaces.
52
+
53
+ ## INSTEAD-block discipline
54
+
55
+ Every "DON'T" / "AVOID" / "NEVER" in the description gets paired with
56
+ the actionable substitute, per `.claude/rules/context-engineering.md`.
57
+
58
+ INSTEAD of bare negation: state the actionable substitute the engineer
59
+ or model can verify in their current context. Bare "DON'T X" without
60
+ "INSTEAD: Y" is a no-op for a stateless reader.
61
+
62
+ In a description, this shows up in the why-distinct clause:
63
+
64
+ - **Anti**: "Don't use this for short prompts."
65
+ - **INSTEAD**: "Use for prompts ≥3 sentences; for one-liners, see /value-prop flash."
66
+
67
+ The negation lives in context (when not to use). The substitute names the actionable path (which skill to use instead).
68
+
69
+ ## Plain language (per /kiss words)
70
+
71
+ Grade-10 reading level. Common substitutions bassclef-substrate writers should make:
72
+
73
+ | Replace | With |
74
+ |---|---|
75
+ | "composer" | "runs" / "chains" / "combines" |
76
+ | "primitive" | "building block" |
77
+ | "tier-preset" | "preset" / "size" |
78
+ | "operationalize" | "do" / "ship" |
79
+ | "load-bearing" | "required" / "must work" |
80
+ | "blast radius" | "impact" / "what it can break" |
81
+ | "substrate" | "system" / "framework" |
82
+ | "bassclef" (in description body) | use sparingly; prefer "the framework" |
83
+ | "compose-with" | "uses" / "builds on" |
84
+ | "scope-bounded" | "small" / "tight" |
85
+
86
+ If the description still uses bassclef jargon after substitution,
87
+ the description was assuming context the engineer doesn't have.
88
+ Rewrite further.
89
+
90
+ ## What MUST NOT appear in a description
91
+
92
+ - References to other skills the engineer hasn't read yet (skill names OK; methodology references aren't)
93
+ - Methodology chains ("X → Y → Z → ...")
94
+ - Tier specifications without explaining what the tier does
95
+ - Citations to bassclef issues (those go in the body)
96
+ - Dates / versions / "renamed from X on Y" (those go in the body)
97
+ - Assumed pipeline knowledge ("Phase 14 of the buildable-spec chain")
98
+
99
+ ## What MUST appear in a description
100
+
101
+ - The verb-outcome opener
102
+ - A concrete sense of what the user gets back
103
+ - A distinguishing characteristic vs. adjacent skills
104
+ - **Modes / tiers / sizes named inline when frontmatter declares them** (bassclef#535) — see next section
105
+
106
+ ## Description-mirrors-modes (bassclef#535)
107
+
108
+ When a skill's frontmatter declares structured `modes:` / `tiers:` / `sizes:` (per bassclef#515), the description **text** MUST name each declared value inline. Operators see Claude Code's type-ahead BEFORE invoking `/skills`; type-ahead reads only the `description` field. Frontmatter `modes:` is machine-readable for bassclef's audit + render pipeline but invisible to type-ahead.
109
+
110
+ **The discipline:**
111
+
112
+ - If frontmatter has `modes: [scope, words]`, description must contain "scope" AND "words" (typically as "Two modes — scope ... and words ..." or similar)
113
+ - If frontmatter has `tiers: [quick, light, medium, full]`, description must name all four
114
+ - If frontmatter has `sizes: [flash, tweet, brief, verbose]`, description must name all four
115
+ - Skills with `no_user_modes: true` (opt-out) are exempt
116
+ - The 280-char ceiling still applies — naming N modes that won't fit means the description is over-claiming; collapse the verbiage around them
117
+
118
+ **Why mirror, not auto-render?**
119
+
120
+ Type-ahead reads `description`. bassclef doesn't control the harness; we control the data we put in `description`. Mirroring is the cheap fix that makes type-ahead useful for mode-bearing skills today. Frontmatter `modes:` stays machine-readable for `/skills` catalog rendering + audit + future structured uses; description text stays human-readable for type-ahead.
121
+
122
+ **Conformance examples (all 7 skills with modes today):**
123
+
124
+ | Skill | Frontmatter | Description names them? |
125
+ |---|---|---|
126
+ | `/value-prop` | `sizes: [flash, tweet, brief, verbose]` | ✓ "Four sizes — flash ... tweet ... brief ... verbose" |
127
+ | `/kiss` | `modes: [scope, words]` | ✓ "Two modes — scope ... and words ..." |
128
+ | `/stage` | `sizes: [quick, light]` | ✓ "Two sizes: quick ... and light ..." |
129
+ | `/launch` | `sizes: [medium, full]` | ✓ "Two sizes: medium ... and full ..." |
130
+ | `/shape` | `tiers: [quick, light, medium, full]` | ✓ "four sizes — quick, light, medium, full" |
131
+ | `/longrun` | `modes: [prep, checkpoint, closeout]` | ✓ "three modes — prep, checkpoint, closeout" (after bassclef#535) |
132
+ | `/interpret-input` | `modes: [text, url, image, repo, transcript, napkin, mixed]` | ✓ types listed in parens |
133
+ | `/onboard-repo` | `modes: [default, --with-deploy-host, --with-secrets, --full]` | ❌ pending — fold into LR8.6 PR #526 amendment |
134
+
135
+ **Mechanical enforcement (deferred follow-on):**
136
+
137
+ - `scripts/audit-skills-modes.sh` (bassclef#515 PR #519) extends with `description-doesnt-mirror-modes` finding type
138
+ - `.claude/hooks/substrate-clarity-gate.sh` extends with the same check at PreToolUse Edit/Write time
139
+ - Both gated behind bassclef#515 + bassclef#382 landing first; until then, this rule is methodology-level + the operator runs the audit manually
140
+
141
+ **Override:**
142
+
143
+ `SKIP_DESCRIPTION_MIRRORS_MODES=1` per-call override (logged via trace-helper). Use only when the frontmatter declares modes that are too numerous to mention inline (>5) AND a higher-level grouping description suffices.
144
+
145
+ ## Application
146
+
147
+ ### Per skill (rewrites)
148
+
149
+ 1. Read existing description
150
+ 2. Score against rule (Verb? Outcome? ≤280 chars? Jargon? Plain language?)
151
+ 3. Rewrite if score < B
152
+ 4. Test the rewrite: would a senior engineer with no bassclef context understand it in 60 seconds?
153
+
154
+ ### Per longrun (audit)
155
+
156
+ The audit issue (bassclef#375 + sister WU-3 issues) tracks
157
+ per-skill rewrites. WU-6 of this longrun ships top-7 (data + judgment
158
+ based) as in-scope examples; rest filed as follow-up.
159
+
160
+ ### Per new skill
161
+
162
+ Every new skill's description goes through this rule before merge.
163
+ Test: paste the description into a Slack DM to a senior engineer
164
+ without bassclef context. If they ask "what does this DO?" you
165
+ violated the rule.
166
+
167
+ INSTEAD of testing against a bassclef-savvy reader: test against
168
+ a fresh reader who carries no internal vocabulary. That's the
169
+ audience the description has to serve.
170
+
171
+ ## Relationship to other rules
172
+
173
+ - `.claude/rules/context-engineering.md` — the foundational rule; this is one application
174
+ - bassclef#357 (autonomous-run flash + kiss) — sibling discipline at output surface; this rule is at description surface
175
+ - bassclef#367 (section-heading standardization) — sibling specificity discipline
176
+ - bassclef#339 (plan-enumeration-needs-value-props) — sibling at choice-presentation surface
177
+
178
+ ## Override
179
+
180
+ There is no override. Skill descriptions are an entry surface for
181
+ engineers and operators. Violating the rule means engineers won't
182
+ adopt the skill, regardless of how good the skill itself is.
183
+
184
+ If you can't write the description per the rule, the skill's job
185
+ isn't clear enough — clarify the skill before clarifying the
186
+ description.
187
+
188
+ ## Audit pattern
189
+
190
+ ```bash
191
+ # Find skills whose descriptions exceed 280 chars
192
+ grep -r "^description:" .claude/skills/*/SKILL.md | awk -F: '{ if (length($0) > 280) print $0 }'
193
+
194
+ # Find skills whose descriptions use bassclef jargon
195
+ git grep -niE 'composer|primitive|tier-preset|operationalize|load-bearing|blast radius|compose-with' .claude/skills/*/SKILL.md | grep -E '^.*:description:'
196
+ ```
@@ -0,0 +1,119 @@
1
+ ---
2
+ tier: lite
3
+ description: Before executing any SKILL procedure, I write the numbered step list into the response.
4
+ ---
5
+
6
+ # Skill-procedure step-list
7
+
8
+ Before executing any SKILL procedure, I write the numbered step list into the response. Each step is marked `[x]` executed with source cited OR `[~]` explicitly deferred with reason. No `[ ]` unchecked lines ship at output time. Silence is not deferral.
9
+
10
+ This rule extends `.claude/rules/assert-only-after-verify.md` from the assertion surface to the SKILL-procedure surface. It is the methodology layer. The mechanical layer is `.claude/hooks/skill-step-list-check.sh` — Stop hook that scans the transcript for a Skill dispatch followed by an assistant response without a step-list block.
11
+
12
+ ## When this rule fires
13
+
14
+ Every SKILL dispatch. Agents self-check before writing the response. Hook fires at Stop event as the write-time backstop.
15
+
16
+ Fires on:
17
+
18
+ - Any Skill tool dispatch in the current turn
19
+ - Any SKILL body whose procedure names 2+ steps
20
+
21
+ Passes through on:
22
+
23
+ - Non-Skill tool calls (Bash, Read, Edit, Write, Grep, etc.) — those follow their own discipline rules
24
+ - SKILL body procedures with 0 or 1 step (no list needed)
25
+ - Tool-output relays (test output, git output) that carry no assertions of their own
26
+
27
+ ## What the rule requires
28
+
29
+ Before shipping any response following a SKILL dispatch:
30
+
31
+ 1. **Read the SKILL body Procedure section.** Enumerate the numbered steps.
32
+ 2. **Write the step list at the top of the response.** Format: `Step N — <name>` followed by a status marker.
33
+ 3. **Execute each step.** Cite the source inline as it runs.
34
+ 4. **Mark each step's status:**
35
+ - `[x]` executed with source cited
36
+ - `[~]` explicitly deferred with reason (silence is not deferral)
37
+ - Do not ship `[ ]` unchecked at output time.
38
+ INSTEAD: mark every step `[x]` or `[~]` before the response ships. Unchecked shipped equals silent skip.
39
+ 5. **Loaded context is a hint, not a substitute for a source read named by a step.** The context feels full. That is when the skip is easiest and the drift is worst.
40
+ INSTEAD: cite the source per the SKILL step. Loaded context is a hint, not a substitute.
41
+
42
+ ## Format contract
43
+
44
+ Each step line matches one of these shapes:
45
+
46
+ - `Step N — <name> — [x] <source cited>`
47
+ - `Step N — <name> — [~] <deferral reason>`
48
+
49
+ Or a block header + list format:
50
+
51
+ ```
52
+ Steps:
53
+ - Step 1 — <name> — [x] <source>
54
+ - Step 2 — <name> — [~] <reason>
55
+ ```
56
+
57
+ The hook scans for two markers together: the token `Step\s+\d+` AND either `[x]` or `[~]` bracketed. Both must appear in the assistant text following a Skill dispatch.
58
+
59
+ ## Anti-patterns
60
+
61
+ These shapes fail this rule.
62
+
63
+ **Dispatch skill; write results with no step list.** The response ships without any `Step N` markers. Hook fires ADVISORY (or BLOCK under strict toggle).
64
+ INSTEAD: enumerate the SKILL procedure steps at the top of the response before running them.
65
+
66
+ **Silent skip.** A step gets no `[x]` and no `[~]` line — the response simply omits it.
67
+ INSTEAD: every step from the SKILL procedure appears in the response, either done or explicitly deferred with reason.
68
+
69
+ **Context as substitute.** Loaded context carries a plausible answer. Skip the SKILL step; use the context.
70
+ INSTEAD: cite the source per the SKILL step. Loaded context is a hint, not a substitute for the read the step names.
71
+
72
+ **Half-written list.** Some steps carry markers; others do not.
73
+ INSTEAD: every step marked before response ships. Half-written lists cause reviewer confusion + trigger the hook.
74
+
75
+ ## When this rule does NOT fire
76
+
77
+ - Tool-output relays (test output, git output) — no assertion of the agent's own
78
+ - SKILL body with 0 or 1 step — no list needed
79
+ - Skill invoked purely for its output display (e.g., `/whereami` for a status snapshot)
80
+ - Chat responses that do not follow a Skill dispatch
81
+
82
+ ## Override
83
+
84
+ `SKIP_SKILL_STEP_LIST=1 <command>` — per-call bypass, logged via trace-helper. Use rarely:
85
+
86
+ - One-shot migration scripts that dispatch many SKILLs at once
87
+ - Emergency rescue when the hook itself misbehaves
88
+ - Explicitly-deferred rework where the step list ships in a follow-up response
89
+
90
+ For routine SKILL dispatches, write the step list. The cost is small; the audit trail compounds.
91
+
92
+ ## Toggle
93
+
94
+ The hook reads `SKILL_STEP_LIST_TOGGLE` from env OR `skill_step_list.toggle` from `.claude/bassclef-configs.jsonc`:
95
+
96
+ - `true` (default) — advisory (exit 0, findings to stderr)
97
+ - `strict` — strict (exit 2, blocks the stop event, forces a rewrite)
98
+ - `false` — silent (exit 0, no scan)
99
+
100
+ V1 ships advisory. V2 may flip to strict after a calibration cycle observes drift stays under 10%.
101
+
102
+ ## Anchor luminaries
103
+
104
+ - `.claude/luminaries/saltzer-schroeder.md` (Saltzer & Schroeder 1975, IEEE 63(9)) — complete mediation. Every access to protected state is checked. Whereami narrative was a cached authorization. Rule + hook forces mediation at every SKILL dispatch.
105
+ - `.claude/luminaries/tony-hoare.md` (Hoare 1969, CACM 12(10)) — pre/postcondition triple. Each step's postcondition is the next step's precondition. Skip breaks the chain.
106
+ - `.claude/luminaries/michael-feathers.md` (Feathers 2004) — characterization tests. Pin actual behavior via source of record before naming it.
107
+ - `.claude/luminaries/kent-beck.md` (Beck 2002) — list-before-execute. Sister discipline at test surface applied to SKILL surface.
108
+
109
+ ## Composes with
110
+
111
+ - `.claude/rules/assert-only-after-verify.md` — parent discipline at claim surface; this rule extends to SKILL-procedure surface
112
+ - `.claude/rules/bootstrap-pair-discipline.md` — pair-shape pattern (rule + hook + Tier 0 test)
113
+ - `.claude/rules/substrate-as-system.md` — ADR-035 tenet
114
+ - `.claude/rules/test-list-discipline.md` — Beck's list-before-execute sister rule at test surface
115
+ - `.claude/rules/testing-tier-config.md` — Tier 0 strict TDD on hook + tests
116
+ - `.claude/rules/we-dont-break-adopters.md` — V1 ADVISORY default preserves adopter behavior
117
+ - `.claude/rules/blocked-items.md` — BLOCK protocol the hook fires under strict toggle
118
+ - `.claude/hooks/skill-step-list-check.sh` — mechanical implementation
119
+ - `.claude/hooks/tests/skill-step-list-check.test.sh` — Tier 0 test coverage (10 tests)