@thebassclef/lite 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.cjs +2 -0
- package/dist/cli.js +2 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/substrate/.bassclef/lite-manifest.json +999 -92
- package/substrate/.claude/hooks/longrun-prep-compounding-axis-check.sh +492 -0
- package/substrate/.claude/hooks/longrun-prep-compounding-sequence-check.sh +492 -0
- package/substrate/.claude/hooks/pre-commit-gate.sh +1 -2
- package/substrate/.claude/hooks/turn-prose-kiss-check.sh +30 -1
- package/substrate/.claude/luminaries/glenford-myers.md +230 -0
- package/substrate/.claude/luminaries/hunt-thomas.md +115 -0
- package/substrate/.claude/luminaries/hyrum-wright.md +94 -0
- package/substrate/.claude/luminaries/michael-feathers.md +2 -2
- package/substrate/.claude/luminaries/tony-hoare.md +170 -0
- package/substrate/.claude/luminaries/vaughn-vernon.md +50 -0
- package/substrate/.claude/luminaries/w-edwards-deming.md +158 -0
- package/substrate/.claude/rules/accessor-library-discipline.md +138 -0
- package/substrate/.claude/rules/adr-discipline.md +120 -0
- package/substrate/.claude/rules/api-conventions.md +125 -0
- package/substrate/.claude/rules/bootstrap-pair-discipline.md +141 -0
- package/substrate/.claude/rules/cold-adopter-harness-discipline.md +129 -0
- package/substrate/.claude/rules/compounding-axis-fresh-analysis.md +188 -0
- package/substrate/.claude/rules/compounding-sequence-fresh-analysis.md +188 -0
- package/substrate/.claude/rules/defensive-bash.md +68 -0
- package/substrate/.claude/rules/deferred-actions.md +233 -0
- package/substrate/.claude/rules/github-issue-flash-tweet.md +156 -0
- package/substrate/.claude/rules/hook-wire-on-author.md +103 -0
- package/substrate/.claude/rules/iteration-bet-brief-completeness.md +54 -0
- package/substrate/.claude/rules/lite-manifest-schema-change-discipline.md +3 -3
- package/substrate/.claude/rules/longrun-prep-plan-doc-compression.md +89 -0
- package/substrate/.claude/rules/loop-discipline.md +81 -0
- package/substrate/.claude/rules/manual-prod-approval.md +100 -0
- package/substrate/.claude/rules/marker-enrichment-discipline.md +99 -0
- package/substrate/.claude/rules/mobile-ephemeral-session.md +109 -0
- package/substrate/.claude/rules/new-dependency-check.md +51 -0
- package/substrate/.claude/rules/option-label-discipline.md +108 -0
- package/substrate/.claude/rules/pattern-annotation.md +100 -0
- package/substrate/.claude/rules/plain-english-discipline.md +11 -9
- package/substrate/.claude/rules/plan-enumeration-needs-value-props.md +211 -0
- package/substrate/.claude/rules/pr-title-shape.md +161 -0
- package/substrate/.claude/rules/prototype-workflow.md +65 -0
- package/substrate/.claude/rules/reserved-skill-names.md +123 -0
- package/substrate/.claude/rules/schema-management.md +49 -0
- package/substrate/.claude/rules/security.md +37 -0
- package/substrate/.claude/rules/skill-composition-declarations.md +124 -0
- package/substrate/.claude/rules/skill-description-clarity.md +247 -0
- package/substrate/.claude/rules/skill-procedure-step-list.md +137 -0
- package/substrate/.claude/rules/stuck-signal-diagnostic.md +140 -0
- package/substrate/.claude/rules/substrate-config-schema.md +98 -0
- package/substrate/.claude/rules/test-list-discipline.md +175 -0
- package/substrate/.claude/rules/test-sufficiency.md +210 -0
- package/substrate/.claude/rules/testing-tier-config.md +145 -0
- package/substrate/.claude/rules/testing.md +38 -0
- package/substrate/.claude/rules/turn-estimate-grounding.md +134 -0
- package/substrate/.claude/rules/visual-hierarchy.md +437 -0
- package/substrate/.claude/rules/we-dont-break-adopters.md +126 -0
- package/substrate/.claude/rules/wu-sequencing-compounds.md +145 -0
- package/substrate/.claude/skills/build/SKILL.md +1 -1
- package/substrate/.claude/skills/chronicle/SKILL.md +55 -0
- package/substrate/.claude/skills/clean-artifacts/SKILL.md +249 -0
- package/substrate/.claude/skills/decompose/SKILL.md +1 -1
- package/substrate/.claude/skills/diagnose/SKILL.md +1 -1
- package/substrate/.claude/skills/feynman/SKILL.md +90 -0
- package/substrate/.claude/skills/howdoi/SKILL.md +1 -1
- package/substrate/.claude/skills/ia-model/SKILL.md +1 -1
- package/substrate/.claude/skills/interaction-design/SKILL.md +1 -1
- package/substrate/.claude/skills/interpret-input/SKILL.md +8 -8
- package/substrate/.claude/skills/journal/SKILL.md +209 -0
- package/substrate/.claude/skills/kiss/SKILL.md +1 -1
- package/substrate/.claude/skills/launch/SKILL.md +14 -23
- package/substrate/.claude/skills/lean-canvas/SKILL.md +1 -1
- package/substrate/.claude/skills/longrun/SKILL.md +45 -8
- package/substrate/.claude/skills/luminary/SKILL.md +1 -1
- package/substrate/.claude/skills/ogilvy-writing-audit/SKILL.md +1 -1
- package/substrate/.claude/skills/onboard-repo/SKILL.md +143 -709
- package/substrate/.claude/skills/pattern-review/SKILL.md +1 -1
- package/substrate/.claude/skills/personas/SKILL.md +5 -5
- package/substrate/.claude/skills/promote/SKILL.md +1 -1
- package/substrate/.claude/skills/requirement/SKILL.md +1 -1
- package/substrate/.claude/skills/retro/SKILL.md +1 -1
- package/substrate/.claude/skills/riff/SKILL.md +1 -1
- package/substrate/.claude/skills/roadmap-reconcile/SKILL.md +1 -1
- package/substrate/.claude/skills/session-end/SKILL.md +1 -1
- package/substrate/.claude/skills/session-log/SKILL.md +3 -3
- package/substrate/.claude/skills/skills/SKILL.md +1 -1
- package/substrate/.claude/skills/spec/SKILL.md +1 -1
- package/substrate/.claude/skills/sprint/SKILL.md +1 -1
- package/substrate/.claude/skills/stage/SKILL.md +1 -1
- package/substrate/.claude/skills/state-a-problem/SKILL.md +1 -1
- package/substrate/.claude/skills/temperance/SKILL.md +1 -1
- package/substrate/.claude/skills/use-case/SKILL.md +1 -1
- package/substrate/.claude/skills/user-stories/SKILL.md +1 -1
- package/substrate/.claude/skills/value-prop/SKILL.md +1 -1
- package/substrate/.claude/skills/verify/SKILL.md +1 -1
- package/substrate/.claude/skills/visual-review/SKILL.md +503 -0
- package/substrate/.claude/skills/whats-the-plan/SKILL.md +202 -0
- package/substrate/.claude/skills/whereami/SKILL.md +2 -2
- package/substrate/CONTRIBUTING.md +1 -1
- package/substrate/README.md +5 -5
- package/substrate/lib/prose-scan-boundary.sh +171 -0
- package/substrate/lib/tier-check.sh +50 -1
- package/substrate/lib/tier-dependency-audit.sh +159 -4
- package/substrate/presence/install/bassclef-sync.template.sh +1 -1
- package/substrate/scripts/generate-lite-manifest.sh +21 -5
- package/substrate/standards/adr-template.md +86 -0
- package/substrate/standards/api-conventions/nextjs.md +84 -0
- package/substrate/standards/artifact-composition.md +209 -0
- package/substrate/standards/bash-hook-safety.md +246 -0
- package/substrate/standards/branch-stacking.md +408 -0
- package/substrate/standards/code-safety-principles.md +176 -0
- package/substrate/standards/composer-prerequisites.md +155 -0
- package/substrate/standards/dependency-discipline/cargo.md +39 -0
- package/substrate/standards/dependency-discipline/gem.md +43 -0
- package/substrate/standards/dependency-discipline/go-mod.md +41 -0
- package/substrate/standards/dependency-discipline/npm.md +42 -0
- package/substrate/standards/dependency-discipline/pip.md +42 -0
- package/substrate/standards/deployment-topology/ec2-tailscale.md +225 -0
- package/substrate/standards/deployment-topology.md +69 -0
- package/substrate/standards/docs-sync-allowlist.md +4 -4
- package/substrate/standards/domain-and-dns.md +145 -0
- package/substrate/standards/frontend-stack.md +67 -0
- package/substrate/standards/frontmatter-schema.md +154 -0
- package/substrate/standards/hook-injection-discipline.md +202 -0
- package/substrate/standards/hook-install-class.md +215 -0
- package/substrate/standards/input-handler-interface.md +152 -0
- package/substrate/standards/lite-manifest-schema-changes.md +60 -0
- package/substrate/standards/luminary-matching.md +105 -0
- package/substrate/standards/migration-discipline/active-record.md +50 -0
- package/substrate/standards/migration-discipline/alembic.md +43 -0
- package/substrate/standards/migration-discipline/gorm.md +50 -0
- package/substrate/standards/migration-discipline/prisma.md +53 -0
- package/substrate/standards/migration-discipline/sqlalchemy.md +51 -0
- package/substrate/standards/mobile-ephemeral-session.md +167 -0
- package/substrate/standards/model-routing-discipline.md +160 -0
- package/substrate/standards/persona-schema.md +229 -0
- package/substrate/standards/pluggable-luminaries.md +323 -0
- package/substrate/standards/pr-body-discipline.md +115 -0
- package/substrate/standards/preview-state-schema.md +189 -0
- package/substrate/standards/reserved-skill-names.md +120 -0
- package/substrate/standards/scannable-multi-option-output.md +261 -0
- package/substrate/standards/sdlc-gates/typescript.md +57 -0
- package/substrate/standards/session-board.md +256 -0
- package/substrate/standards/state-spine-contract.md +255 -0
- package/substrate/standards/steering-hints/kiss-words.md +11 -0
- package/substrate/standards/substrate-config-schema.md +267 -0
- package/substrate/standards/tier-dependency-analysis.md +1 -1
- package/substrate/standards/tier-tag-schema.md +1 -1
- package/substrate/standards/two-layer-config.md +99 -0
- package/substrate/standards/use-case-format.md +292 -0
- package/substrate/standards/user-story-invest.md +268 -0
- package/substrate/standards/velocity-and-appetite.md +229 -0
- package/substrate/standards/voice-input-pattern.md +119 -0
- package/substrate/standards/worktree-management.md +211 -0
- package/substrate/templates/chronicle-template.md +75 -0
- package/substrate/templates/memory-proposal-template.md +77 -0
- package/substrate/templates/persona-template.md +200 -0
- package/substrate/templates/pr-faq.md +45 -0
- package/substrate/templates/secret-rotation-template.md +162 -0
- package/substrate/templates/spec-template.md +131 -0
- package/substrate/templates/use-case-template.md +194 -0
- package/substrate/templates/user-story-template.md +107 -0
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
---
|
|
2
|
+
tier: lite
|
|
3
|
+
globs: ["**/*"]
|
|
4
|
+
description: Mobile/ephemeral session rules — state round-trips through git, no filesystem-only markers, explicit session-end
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Mobile / Ephemeral Session Rule
|
|
8
|
+
|
|
9
|
+
Fires whenever the session is running in an ephemeral environment
|
|
10
|
+
(claude.ai/code mobile sandbox, CI runner, temporary container). See
|
|
11
|
+
`standards/mobile-ephemeral-session.md` for the full standard.
|
|
12
|
+
|
|
13
|
+
## Detection
|
|
14
|
+
|
|
15
|
+
**Primary signal (required for certainty):**
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
[ "$CLAUDE_EPHEMERAL" = "1" ]
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Operator sets this as the first command in mobile / CI / ephemeral
|
|
22
|
+
sessions. Explicit opt-in removes guessing. Put it in a bookmarklet,
|
|
23
|
+
shell init, or session template.
|
|
24
|
+
|
|
25
|
+
**Fallback heuristics** (if primary not set, OR of these):
|
|
26
|
+
|
|
27
|
+
| Check | Signal strength |
|
|
28
|
+
|-------|----------------|
|
|
29
|
+
| `pwd` doesn't start with `/Users/` (macOS operator path) | High |
|
|
30
|
+
| `hostname` doesn't match known operator machines | High |
|
|
31
|
+
| `$HOME` isn't operator's real home | High |
|
|
32
|
+
| `/Applications/Tailscale.app/Contents/MacOS/Tailscale` missing | Medium |
|
|
33
|
+
| `git reflog \| wc -l` is very small (fresh clone) | Medium |
|
|
34
|
+
|
|
35
|
+
If ≥2 fallback signals fire, treat as ephemeral with a surfaced
|
|
36
|
+
warning: "Detected ephemeral mode via heuristics — explicit
|
|
37
|
+
`CLAUDE_EPHEMERAL=1` recommended."
|
|
38
|
+
|
|
39
|
+
**First-session bootstrap**: on the very first mobile session, run
|
|
40
|
+
with heuristics OR explicit flag — observe which signals fire —
|
|
41
|
+
refine this list based on actual claude.ai/code sandbox environment.
|
|
42
|
+
Update this rule after empirical data.
|
|
43
|
+
|
|
44
|
+
## Rules when ephemeral
|
|
45
|
+
|
|
46
|
+
1. **All artifacts push immediately.** Auto-save hook does
|
|
47
|
+
`git commit` AND `git push` — not deferred. If push fails, retry
|
|
48
|
+
once with backoff, then surface failure visibly.
|
|
49
|
+
|
|
50
|
+
2. **Markers go git-tracked, not /tmp.** Any skill or hook that writes
|
|
51
|
+
`/tmp/*` markers MUST also write a git-tracked equivalent. The
|
|
52
|
+
bassclef durable surface is `state/markers/<gate>/...`
|
|
53
|
+
(temperance, diagnose, edit-count, session-timing); `/verify` keeps
|
|
54
|
+
its own pre-existing surface at `state/markers/verify/<branch>.marker`
|
|
55
|
+
for backward-compat with `pre-commit-gate.sh`. In ephemeral mode,
|
|
56
|
+
the git-tracked form is authoritative. Consumers of gate evidence
|
|
57
|
+
(pre-build-gate hook, compliance counter, `/chronicle` gate-evidence
|
|
58
|
+
auto-populate) read whichever form exists; dual-write ensures mobile
|
|
59
|
+
firings survive sandbox teardown.
|
|
60
|
+
|
|
61
|
+
3. **Session lock has TTL.** Lock at `.claude/SESSION_LOCK` includes
|
|
62
|
+
ISO 8601 timestamp. Locks older than 30 minutes are cleared with
|
|
63
|
+
an announcement ("Clearing stale lock from [timestamp]"). No
|
|
64
|
+
indefinite holds.
|
|
65
|
+
|
|
66
|
+
4. **Explicit session-end MUST fire.** Stop hook is unreliable in
|
|
67
|
+
ephemeral. Agent must invoke `/session-end` at natural stopping
|
|
68
|
+
points — task complete, context pressure, operator cue.
|
|
69
|
+
|
|
70
|
+
5. **No credential-bearing tools.** Ephemeral sessions do not hold
|
|
71
|
+
SSH keys, AWS access keys, Tailscale tokens, or long-lived PATs.
|
|
72
|
+
Only fine-grained PATs or GitHub App installation tokens with
|
|
73
|
+
short TTL. Deploy work happens in CI after PR merge, never from
|
|
74
|
+
ephemeral.
|
|
75
|
+
|
|
76
|
+
6. **Chronicle read at session start.** If project memory isn't
|
|
77
|
+
available (no MCP memory server), read the last 2-3 chronicles
|
|
78
|
+
at session start as context substitute. This is how ephemeral
|
|
79
|
+
sessions recover "what we were working on."
|
|
80
|
+
|
|
81
|
+
7. **Conservative gating default.** Orchestrator-gated mode requires
|
|
82
|
+
explicit `--ephemeral-ok` flag in ephemeral. Default is operator-
|
|
83
|
+
gated even if orchestrator was requested — ephemeral adds risk
|
|
84
|
+
that deserves confirmation at decision points.
|
|
85
|
+
|
|
86
|
+
## Failures to surface
|
|
87
|
+
|
|
88
|
+
When any of the following happen, session output must prominently
|
|
89
|
+
report it:
|
|
90
|
+
|
|
91
|
+
- Push failure on auto-save (state loss risk)
|
|
92
|
+
- Stale lock cleared (possible other session running)
|
|
93
|
+
- Chronicle read failed at start (no context recovery)
|
|
94
|
+
- Credential-bearing tool invoked (should not happen; rule violation)
|
|
95
|
+
|
|
96
|
+
## Rationale
|
|
97
|
+
|
|
98
|
+
Desktop sessions assume the filesystem survives between steps. Mobile
|
|
99
|
+
sessions don't. A rule that lets agents keep working with the same
|
|
100
|
+
skills and hooks — but with ephemeral-safe behavior — is how
|
|
101
|
+
continuity holds.
|
|
102
|
+
|
|
103
|
+
## Relationship
|
|
104
|
+
|
|
105
|
+
- `standards/mobile-ephemeral-session.md` — full standard with
|
|
106
|
+
all MUST/SHOULD items
|
|
107
|
+
- `.claude/rules/blocked-items.md` — BLOCKED: protocol still applies
|
|
108
|
+
- `.claude/rules/guardrails.md` — "deploy prod requires human approval"
|
|
109
|
+
is reinforced by this rule (ephemeral can't deploy anyway)
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
---
|
|
2
|
+
tier: lite
|
|
3
|
+
globs: ["package.json", "package-lock.json", "pnpm-lock.yaml", "yarn.lock", "requirements.txt", "pyproject.toml", "poetry.lock", "Gemfile", "Gemfile.lock", "Cargo.toml", "Cargo.lock", "go.mod", "go.sum"]
|
|
4
|
+
description: New dependency check — verify before adding any package; loads per-pkg-manager sibling
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# New Dependency Check
|
|
8
|
+
|
|
9
|
+
Before adding any new dependency to the project, verify five universal concerns. Then load the per-package-manager sibling under `standards/dependency-discipline/<pkg_manager>.md` for stack-specific specifics.
|
|
10
|
+
|
|
11
|
+
## Universal concerns (every package manager)
|
|
12
|
+
|
|
13
|
+
1. **Stack compatibility** — does it work with the project's framework, language version, build system, and runtime constraints?
|
|
14
|
+
2. **Bundle / install impact** — what does it add to your build artifact, install footprint, or runtime memory?
|
|
15
|
+
3. **Runtime compatibility** — does the package make assumptions about the runtime environment (SSR vs CSR, threaded vs async, target architecture)?
|
|
16
|
+
4. **Maintenance risk** — last publish date, open issues, bus factor. Prefer packages from known maintainers or organizations.
|
|
17
|
+
5. **Alternatives** — can the need be met without a dependency? Built-in standard library? CSS-only? Native HTML? Small inline helper?
|
|
18
|
+
|
|
19
|
+
## Per-package-manager siblings
|
|
20
|
+
|
|
21
|
+
Bassclef's loader logic reads `tech_stack.pkg_manager:` from `.claude/bassclef-configs.jsonc` and loads the matching sibling for stack-specific specifics:
|
|
22
|
+
|
|
23
|
+
| Adopter's `pkg_manager` | Sibling loaded |
|
|
24
|
+
|---|---|
|
|
25
|
+
| `npm` / `pnpm` / `yarn` | `standards/dependency-discipline/npm.md` |
|
|
26
|
+
| `pip` / `poetry` | `standards/dependency-discipline/pip.md` |
|
|
27
|
+
| `cargo` | `standards/dependency-discipline/cargo.md` |
|
|
28
|
+
| `gem` | `standards/dependency-discipline/gem.md` |
|
|
29
|
+
| `go-mod` | `standards/dependency-discipline/go-mod.md` |
|
|
30
|
+
| `none` or unset | Universal concerns only |
|
|
31
|
+
|
|
32
|
+
When the matching sibling does not exist (e.g., a stack bassclef has not yet adopted), the rule fires the universal concerns only and surfaces a `/promote` candidate for the missing sibling.
|
|
33
|
+
|
|
34
|
+
## Process
|
|
35
|
+
|
|
36
|
+
1. State the package name and what it is for.
|
|
37
|
+
2. Run the five universal checks above.
|
|
38
|
+
3. Run the per-PM checks from the matching sibling.
|
|
39
|
+
4. If red flags surface in any check, propose an alternative.
|
|
40
|
+
5. If clear, install and add to the project's Approved Dependencies list (or equivalent — see sibling for the exact list name and location).
|
|
41
|
+
|
|
42
|
+
## Tech stack vocabulary
|
|
43
|
+
|
|
44
|
+
The loader reads `tech_stack.pkg_manager` shipped in bassclef#1127 (WU-2 of bet 2026-06-18a). Adopters set the value at `/onboard-repo` Phase 2.x. When `tech_stack:` block is absent, the universal concerns still apply; sibling-specific guidance is skipped until the operator declares the stack.
|
|
45
|
+
|
|
46
|
+
## Refs
|
|
47
|
+
|
|
48
|
+
- Path A pattern from bassclef#1133 (ARCH-T0 stack-leakage audit).
|
|
49
|
+
- WU-10 of bet `docs/iteration-bets/2026-06-18a-public-adopter-leverage-longrun.md` ships this catalog split.
|
|
50
|
+
- Sister Path A: bassclef#1133 WU-5 (schema-management → migration-discipline catalog).
|
|
51
|
+
- Reads from bassclef#1127 (tech_stack vocabulary).
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
---
|
|
2
|
+
tier: lite
|
|
3
|
+
description: When presenting choices for the operator to pick from (shape A vs shape B; option 1 vs option 2; pick a/b/c; tier 1/2/3), labels MUST be characters the operator can easily type…
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Option-label discipline
|
|
7
|
+
|
|
8
|
+
When presenting choices for the operator to pick from (shape A vs shape B; option 1 vs option 2; pick a/b/c; tier 1/2/3), labels MUST be characters the operator can easily type back. Greek letters, special characters, and emoji-as-labels are forbidden because they can't be typed on a standard keyboard — operator has to copy-paste from screen, which wastes turns and disrupts operator-flow at exactly the decision point.
|
|
9
|
+
|
|
10
|
+
## Allowed
|
|
11
|
+
|
|
12
|
+
- **Lowercase Latin letters** — `a`, `b`, `c`, `d`, `e`, `f` (default for ≤6 choices)
|
|
13
|
+
- **Uppercase Latin letters** — `A`, `B`, `C`, `D` (when distinguishing from inline text matters; default to lowercase otherwise)
|
|
14
|
+
- **Numbers** — `1`, `2`, `3`, `4`, `5`, `6`, `7`, `8`, `9` (default for 7+ choices)
|
|
15
|
+
|
|
16
|
+
## Forbidden — and what to use instead
|
|
17
|
+
|
|
18
|
+
- Greek letters as labels (`α`, `β`, `γ`, `δ`, `ε`, `ζ`, `η`, `θ`).
|
|
19
|
+
INSTEAD: use `a`, `b`, `c`, `d`, `e`, `f`, `g`, `h` — same ordinal, typeable.
|
|
20
|
+
- Uppercase Greek letters as labels (`Α`, `Β`, `Γ`, `Δ`).
|
|
21
|
+
INSTEAD: use `A`, `B`, `C`, `D` — visually similar on most fonts, typeable.
|
|
22
|
+
- Special characters as labels (`①`, `❶`, `⓵` circled numbers).
|
|
23
|
+
INSTEAD: use plain `1`, `2`, `3`.
|
|
24
|
+
- Emoji as labels (`🅰`, `🅱`).
|
|
25
|
+
INSTEAD: use plain `a`, `b`.
|
|
26
|
+
- Decorative Unicode boxes as labels (`□`, `■`, `▲`, `▼`).
|
|
27
|
+
INSTEAD: use plain `a`/`b`/`1`/`2` — boxes are decoration, not labels.
|
|
28
|
+
|
|
29
|
+
## Reuse is fine
|
|
30
|
+
|
|
31
|
+
When `a/b/c` was used recently for an earlier decision in the same session, REUSE it for the next decision. Each decision is its own context; operator types `a` referring to the current choice, not the earlier one. The earlier choice's labels do not reserve those letters for the rest of the session.
|
|
32
|
+
|
|
33
|
+
The bad shape: agent feels labels must "differ from earlier" and escalates to Greek/special characters.
|
|
34
|
+
INSTEAD: reuse `a/b/c` freely; if labels MUST differ from a very recent decision (e.g., active comparison still on screen), use uppercase Latin or numbers — never Greek.
|
|
35
|
+
|
|
36
|
+
## When this rule fires
|
|
37
|
+
|
|
38
|
+
Any operator-facing surface where the agent presents N options for the operator to pick:
|
|
39
|
+
|
|
40
|
+
- `/longrun prep` shape proposal tables (per `.claude/skills/longrun/SKILL.md`)
|
|
41
|
+
- `/sprint` next-work proposals (per `.claude/skills/sprint/SKILL.md`)
|
|
42
|
+
- `AskUserQuestion` menus dispatched from any skill
|
|
43
|
+
- Inline operator prompts in agent turn prose ("Want me to do a, b, or c?")
|
|
44
|
+
- Bet-doc scope-shape enumerations
|
|
45
|
+
- Decision-point menus at /longrun checkpoint or closeout
|
|
46
|
+
|
|
47
|
+
This rule does NOT fire on:
|
|
48
|
+
|
|
49
|
+
- Mathematical / physics / chemistry technical content (Greek letters carry domain semantics).
|
|
50
|
+
INSTEAD of forbidding Greek there: the rule pattern matches `(option|shape|pick|tier|approach|step|item|path|alternative)\s+[α-ωΑ-Ω]` — Greek used as label triggers; Greek used in formulas like `α-decay` or `λ = 600 nm` passes.
|
|
51
|
+
- Quoted strings from external sources (verbatim quotes; Greek letters preserved).
|
|
52
|
+
INSTEAD of stripping: quote markers (backticks + code blocks) are stripped from the scan input before the regex runs.
|
|
53
|
+
- Skill / rule / file names that happen to contain Greek letters (e.g., a luminary file `alpha-design.md`).
|
|
54
|
+
INSTEAD of false-positives on filenames: filename references are inside code spans / backticks and get stripped before scan.
|
|
55
|
+
|
|
56
|
+
## Why this rule exists
|
|
57
|
+
|
|
58
|
+
Memory `feedback_keyboard_typeable_options.md` (filed 2026-05-03) documented this discipline. The memory body literally warned about its own failure mode: "I used α/β/γ because a/b/c had been 'burned' on an earlier decision in the same session. Operator: 'how am i supposed to type alpha or beta?'"
|
|
59
|
+
|
|
60
|
+
The memory existed for ~7 weeks. On 2026-06-20, the agent violated it during /longrun prep — labeled the second shape proposal α/β/γ/δ after the first used A/B/C/D. Three-layer failure documented in chronicle 2026-06-20c-validate-and-finish-arc.md:
|
|
61
|
+
|
|
62
|
+
1. Memory loaded into context but a competing local heuristic ("differentiate labels from earlier") won attention at label-pick time
|
|
63
|
+
2. No mechanism — no rule, no wordlist, no hook check
|
|
64
|
+
3. Memory-write didn't audit for mechanization opportunity in 2026-05-03 (the meta-discipline `feedback_memory_save_audit_for_adopter_mechanization` was filed 2026-06-20, propagated backward in time)
|
|
65
|
+
|
|
66
|
+
This rule + the mechanical layer (turn-prose-kiss-check hook scan) close the gap.
|
|
67
|
+
|
|
68
|
+
## Mechanical enforcement
|
|
69
|
+
|
|
70
|
+
`.claude/hooks/turn-prose-kiss-check.sh` Stop hook scans every assistant turn prose for option-label Greek patterns:
|
|
71
|
+
|
|
72
|
+
```
|
|
73
|
+
(option|shape|pick|tier|approach|step|item|path|alternative)[[:space:]]+[α-ωΑ-Ω]
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
When matched, the hook emits a BLOCK finding with the offending phrase. Per the per-place strict escalation rule (bassclef#1171), option-label findings can be configured strict via `.claude/bassclef-configs.jsonc` `prose_discipline.kiss_words_strict_places` (add `option_labels` to the array). Default is advisory.
|
|
77
|
+
|
|
78
|
+
The hook ALSO reads `standards/bassclef-internal-jargon.md` BLOCK terms; the wordlist entry for option-label Greek is operator-readable documentation — the regex scan in the hook is the actual mechanical check.
|
|
79
|
+
|
|
80
|
+
## Override
|
|
81
|
+
|
|
82
|
+
`SKIP_TURN_PROSE_KISS=1 <command>` — per-call (logged via trace-helper). Use only when quoting verbatim text that contains the offending pattern (e.g., quoting a memory file body that includes the literal α/β/γ).
|
|
83
|
+
|
|
84
|
+
INSTEAD of overriding for routine work: rewrite the option labels. The discipline is one of the lowest-cost rules to follow — relabeling takes seconds.
|
|
85
|
+
|
|
86
|
+
## Composes with
|
|
87
|
+
|
|
88
|
+
- `.claude/rules/plain-english-discipline.md` — master plain-English rule; this is one application at the option-label surface
|
|
89
|
+
- `.claude/rules/operator-facing-prose.md` — gloss + /kiss meta-discipline; sister at adjacent surfaces
|
|
90
|
+
- `.claude/hooks/turn-prose-kiss-check.sh` — mechanical enforcement
|
|
91
|
+
- `standards/bassclef-internal-jargon.md` — wordlist (option-label Greek documented as BLOCK)
|
|
92
|
+
- Memory `feedback_keyboard_typeable_options.md` — the original discipline this rule promotes
|
|
93
|
+
- bassclef#1171 — per-place strict escalation pattern
|
|
94
|
+
- bassclef#1027 — turn-prose discipline parent
|
|
95
|
+
|
|
96
|
+
## Refs
|
|
97
|
+
|
|
98
|
+
- bassclef#1286 — this rule's filing ticket
|
|
99
|
+
- Memory `feedback_keyboard_typeable_options.md` — the 7-week-old discipline this rule mechanizes
|
|
100
|
+
- Memory `feedback_hooks_beat_methodology_for_substrate_quality.md` — the pattern this rule's filing instantiates
|
|
101
|
+
- Memory `feedback_methodology_holds_before_mechanical.md` — why the methodology-only state was not enough
|
|
102
|
+
- chronicle 2026-06-20c-validate-and-finish-arc.md — three-layer failure documentation
|
|
103
|
+
|
|
104
|
+
## Retirement condition
|
|
105
|
+
|
|
106
|
+
This rule retires only if bassclef migrates off shell-typeable option labels entirely (e.g., a GUI picker replaces the typed selection). Until then, the discipline of typeable labels persists across every operator-facing surface.
|
|
107
|
+
|
|
108
|
+
Closes bassclef#1286.
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
---
|
|
2
|
+
tier: lite
|
|
3
|
+
description: "Code that instantiates a named pattern from bassclef's catalog (patterns/<shelf>/<source>/<slug>.md) MUST mark itself with an @pattern <catalog-path> annotation."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Pattern Annotation — `@pattern` directive
|
|
7
|
+
|
|
8
|
+
Code that instantiates a named pattern from bassclef's catalog (`patterns/<shelf>/<source>/<slug>.md`) MUST mark itself with an `@pattern <catalog-path>` annotation. This is **Layer 1** of pattern-implementation traceability per bassclef#478.
|
|
9
|
+
|
|
10
|
+
Forward (this code uses this pattern) and reverse (this pattern is used here, here, here) lookups become greppable. Operator surfaces — including the future `/pattern-trace` skill (LR5 Layer 3) — read the annotation as the source of truth.
|
|
11
|
+
|
|
12
|
+
## When this rule fires
|
|
13
|
+
|
|
14
|
+
When writing or editing source code that:
|
|
15
|
+
|
|
16
|
+
- Implements a recognized GoF / Fowler / EIP / POSA / Nygard / Richardson / Vernon DDD pattern, OR
|
|
17
|
+
- Implements a Smarter Patterns AI UX pattern (e.g., Algorithm Effectiveness Rating in a button + tooltip surface), OR
|
|
18
|
+
- Implements any pattern that has a catalog entry under `patterns/<shelf>/<source>/<slug>.md`
|
|
19
|
+
|
|
20
|
+
The annotation goes at the entry-point of the pattern instance: the class declaration for code patterns; the component file's top-level for UX patterns.
|
|
21
|
+
|
|
22
|
+
## Annotation format
|
|
23
|
+
|
|
24
|
+
```typescript
|
|
25
|
+
/**
|
|
26
|
+
* @pattern patterns/code/gof/strategy.md
|
|
27
|
+
*
|
|
28
|
+
* Picks among sort algorithms based on user-selected order.
|
|
29
|
+
*/
|
|
30
|
+
class SortStrategySelector implements SortStrategy { ... }
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
```typescript
|
|
34
|
+
/**
|
|
35
|
+
* @pattern patterns/ux-ai/smarterpatterns/algorithm-effectiveness-rating.md
|
|
36
|
+
*
|
|
37
|
+
* Shows quality prediction next to the Generate Variants button.
|
|
38
|
+
*/
|
|
39
|
+
function VariantQualityRating({ inputArtifact }) { ... }
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Format rules:
|
|
43
|
+
|
|
44
|
+
- **Always in a comment block** at the top of the function/class/component definition (not in a separate doc, not as a runtime decorator)
|
|
45
|
+
- **Path relative to the repo root**, with full extension (`.md`)
|
|
46
|
+
- **One annotation per pattern instance** — if a class implements two patterns, two annotations
|
|
47
|
+
- **Optional one-line description** below the annotation explaining the local application
|
|
48
|
+
|
|
49
|
+
## What NOT to do
|
|
50
|
+
|
|
51
|
+
- **Don't annotate without a catalog entry existing.** INSTEAD: dispatch `/agent-research-spawn "<Pattern Name>" patterns/<shelf>/<source>/` to fill the gap, then annotate.
|
|
52
|
+
- **Don't fabricate catalog paths.** INSTEAD: grep the annotation against existing entries; if the path doesn't exist, the annotation is wrong (CI hook in LR5 will catch this; until then, it's a methodology check).
|
|
53
|
+
- **Don't annotate trivial uses.** INSTEAD: annotate the class/function that EMBODIES the pattern, not every place that calls it. A single Strategy implementation gets annotated; every caller that picks a Strategy doesn't.
|
|
54
|
+
- **Don't annotate framework patterns** (e.g., a React component isn't "a Composite pattern instance" just because React uses Composite internally). INSTEAD: annotate when YOUR code is consciously instantiating the pattern as a design choice.
|
|
55
|
+
|
|
56
|
+
## Why this rule exists
|
|
57
|
+
|
|
58
|
+
Yesterday's POA UX refactor synthesis revealed that bassclef's substrate produces patterns at design time but doesn't know which patterns landed in implementation. The cameo pattern (luminary-as-design-active) only works if the catalog → spec → code → operator-visible chain is intact. Without annotations:
|
|
59
|
+
|
|
60
|
+
- `/pattern-review` operates on grep-against-implementation guesswork
|
|
61
|
+
- The future `/pattern-trace` skill has no source of truth
|
|
62
|
+
- When a luminary "uses Strategy" in a variant, no audit trail confirms the strategy actually shipped
|
|
63
|
+
- Reverse-lookup ("show me everywhere we use Decorator") requires re-reading the codebase
|
|
64
|
+
|
|
65
|
+
The annotation is the inexpensive primitive that makes all of those mechanical.
|
|
66
|
+
|
|
67
|
+
## Layer 2 — `/spec` "Patterns Used" table
|
|
68
|
+
|
|
69
|
+
Specs that drive Construction work (per `.claude/rules/oo-ad-entry-point.md` requiring `/decompose` evidence) include a "Patterns Used" table mapping each named pattern to its catalog path AND to the file/class that will carry the annotation. This is the spec-side mirror of the code annotation — together they form the bidirectional contract.
|
|
70
|
+
|
|
71
|
+
See `templates/spec-template.md` (this PR also amends it).
|
|
72
|
+
|
|
73
|
+
## Layer 3 — deferred to LR5
|
|
74
|
+
|
|
75
|
+
Layer 3 ships in bassclef#478 LR5 work:
|
|
76
|
+
|
|
77
|
+
- `state/pattern-implementations/*.json` — state-spine manifest entries auto-populated from grep over annotations
|
|
78
|
+
- Validation hook — fires on Edit/Write of source files; verifies annotated catalog paths exist
|
|
79
|
+
- `/pattern-trace` skill — operator-callable lookup (forward + reverse + audit)
|
|
80
|
+
|
|
81
|
+
Until Layer 3 ships, this rule is methodology-level. Manual grep is the audit path: `git grep -E '@pattern\s+patterns/' src/`.
|
|
82
|
+
|
|
83
|
+
## Relationship to other rules
|
|
84
|
+
|
|
85
|
+
- `.claude/rules/oo-ad-entry-point.md` — `/decompose` evidence required before Construction; the decomposition output should call out which patterns will be used (feeds Layer 2 table)
|
|
86
|
+
- `.claude/rules/artifact-ingestion.md` — annotations are themselves a "Sources read" surface; the catalog path is a reference the implementation cites
|
|
87
|
+
- `.claude/skills/agent-research-spawn/SKILL.md` — fills catalog gaps when an annotation references a missing entry
|
|
88
|
+
- `.claude/skills/pattern-review/SKILL.md` — reads annotations to focus review on conscious pattern choices
|
|
89
|
+
|
|
90
|
+
## Override
|
|
91
|
+
|
|
92
|
+
`SKIP_PATTERN_ANNOTATION=1` env var (when Layer 3 hook ships) — for migrations and cases where a pattern is implemented but the catalog hasn't yet caught up. Logged to trace per existing bassclef idiom.
|
|
93
|
+
|
|
94
|
+
Until Layer 3, no mechanical override is needed; this is methodology-level enforcement.
|
|
95
|
+
|
|
96
|
+
## Retirement
|
|
97
|
+
|
|
98
|
+
This rule retires only if the catalog substrate itself retires. Annotation format may evolve (e.g., to include version numbers when patterns mature) but the discipline of marking conscious pattern choices in code persists.
|
|
99
|
+
|
|
100
|
+
Closes Layer 1 of bassclef#478.
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
tier: lite
|
|
3
|
-
description: All bassclef writing
|
|
3
|
+
description: All bassclef writing should be plain English at grade 8 with grade 10 as the ceiling for simple technical sentences. Drop bassclef-internal jargon. Keep standard tech vocabulary like API, hook, PR, schema.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Plain-English Discipline
|
|
7
7
|
|
|
8
|
-
All bassclef writing — skills, rules, luminaries, PR bodies, commit messages, chronicles, journal entries, iteration goals — should be plain
|
|
8
|
+
All bassclef writing — skills, rules, luminaries, PR bodies, commit messages, chronicles, journal entries, iteration goals — should be plain English at grade 8. Grade 10 is the ceiling for simple technical sentences. Above grade 10 needs a clear reason grades 8-10 could not carry the point. Keep standard technical vocabulary that any digital team would understand. Drop bassclef-internal jargon. Drive for extreme simplicity.
|
|
9
|
+
|
|
10
|
+
Per ticket #935 target shift — the aim moved from grade 10 to grade 8 with grade 10 as ceiling. Steering hook + `standards/steering-hints/kiss-words.md` already carry the new bar. This rule body now matches.
|
|
9
11
|
|
|
10
12
|
This rule is the master discipline. Other rules cover narrow surfaces:
|
|
11
13
|
|
|
@@ -91,15 +93,15 @@ INSTEAD of trying to scrub every word: focus on the highest-leverage substitutio
|
|
|
91
93
|
| Surface | Bar | Enforcement |
|
|
92
94
|
|---|---|---|
|
|
93
95
|
| Skill description field (frontmatter) | strict (≤280 chars, no jargon, verb-first) | substrate-clarity-gate hook BLOCKs (file-write) |
|
|
94
|
-
| Skill body | grade
|
|
95
|
-
| Rule body | grade
|
|
96
|
-
| Luminary body | grade
|
|
97
|
-
| PR body | grade
|
|
96
|
+
| Skill body | plain English (grade 8 target, ceiling 10); no bassclef jargon | substrate-clarity-gate + skill-body-grade-gate (FKGL 80% at 8-9, ceiling 10) + compound-noun-scrub (blocklist from standards/bassclef-internal-jargon.md per bassclef-upstream#782) — all BLOCK at PreToolUse Edit/Write |
|
|
97
|
+
| Rule body | plain English (grade 8 target, ceiling 10); INSTEAD-block discipline on negations | substrate-clarity-gate + compound-noun-scrub BLOCK at PreToolUse Edit/Write |
|
|
98
|
+
| Luminary body | plain English (grade 8 target, ceiling 10); INSTEAD-block discipline on negations | substrate-clarity-gate hook BLOCKs (file-write) |
|
|
99
|
+
| PR body | plain English (grade 8 target, ceiling 10); no bassclef jargon | bassclef-pr-ci body-clarity advisory job (comments suggestions) |
|
|
98
100
|
| Commit message | conventional-commits format; plain English in body | commit-conventions rule (methodology) |
|
|
99
|
-
| Chronicle | narrative
|
|
101
|
+
| Chronicle | narrative plain English (grade 8 target, ceiling 10) | substrate-clarity-gate hook (advisory; new path matcher in WU-7b) |
|
|
100
102
|
| journal entry | personal/sensory/story-driven voice (per writing voice memory) | advisory only; voice trumps strict rule |
|
|
101
|
-
| Iteration goal body |
|
|
102
|
-
| Agent turn prose to operator | grade
|
|
103
|
+
| Iteration goal body | plain English (grade 8 target, ceiling 10) | substrate-clarity-gate hook (advisory) |
|
|
104
|
+
| Agent turn prose to operator | plain English (grade 8 target, ceiling 10); no bassclef jargon (banned-word list per "Drop bassclef-internal jargon" table above) | Stop hook `turn-prose-kiss-check.sh` scans the most recent assistant message (bassclef#1051). Toggle in `.claude/bassclef-configs.jsonc` (`prose_discipline.kiss_words_turn_prose`): `true` advisory (default), `"strict"` blocks stop, `false` disables. |
|
|
103
105
|
|
|
104
106
|
The hook is the primary backstop. The rule is the reasoning. Skills (`/promote`, `/longrun closeout`, `/chronicle`, `/journal`, `/kiss words`) compose the prevention.
|
|
105
107
|
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
---
|
|
2
|
+
tier: lite
|
|
3
|
+
description: When the agent presents options the operator must pick from or evaluate, the whole proposal opens with a full pitch (claim + 3 reasons) and each option lands as a tweet (claim +…
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Plan Enumeration Needs Value-Props
|
|
7
|
+
|
|
8
|
+
When the agent presents options the operator must pick from or evaluate,
|
|
9
|
+
the whole proposal opens with a full pitch (claim + 3 reasons) and each
|
|
10
|
+
option lands as a tweet (claim + sharpener). **Bare names aren't options.**
|
|
11
|
+
Names are labels; each label needs a value-prop attached.
|
|
12
|
+
|
|
13
|
+
## Why this rule exists
|
|
14
|
+
|
|
15
|
+
Operator scans on mobile + multi-pane desktop. Bare-name enumeration
|
|
16
|
+
("Option A. WU-2", "Option B. #334", "Option C. WU-5") forces the
|
|
17
|
+
operator to ask "what's WU-2?" — a follow-up turn that wouldn't be
|
|
18
|
+
needed if the value-prop sat next to the name.
|
|
19
|
+
|
|
20
|
+
Caught 2026-04-27e during /longrun prep — operator: "you need to land
|
|
21
|
+
value props for each scope choice you propose going forward...we
|
|
22
|
+
probably need to constrain/hook that in some way."
|
|
23
|
+
|
|
24
|
+
The /value-prop skill already provides four compression modes (flash,
|
|
25
|
+
tweet, brief, verbose). This rule wires them into how the agent
|
|
26
|
+
presents enumerations, so plan output is scannable in one read.
|
|
27
|
+
|
|
28
|
+
## When this rule fires
|
|
29
|
+
|
|
30
|
+
Any agent output that enumerates options for the operator — "Pick A or
|
|
31
|
+
B," "scope choices for this /longrun," "which approach do you want,"
|
|
32
|
+
"three sizes:" — fires this rule.
|
|
33
|
+
|
|
34
|
+
Specific surfaces:
|
|
35
|
+
|
|
36
|
+
- `/longrun` (prep + checkpoint) — scope choices for the session
|
|
37
|
+
- `/sprint` — next-work options
|
|
38
|
+
- `/whats-the-plan` — chains of skills the agent intends to run
|
|
39
|
+
- `/shape` — tier alternatives (quick / light / medium / full)
|
|
40
|
+
- `/kiss` — bucket enumerations (MUST / SHOULD / COULD)
|
|
41
|
+
- `/stage` — variant alternatives presented to operator
|
|
42
|
+
- Any ad-hoc agent output where the operator picks among options
|
|
43
|
+
|
|
44
|
+
Does NOT fire on:
|
|
45
|
+
|
|
46
|
+
- Single-action replies (no options to pick from)
|
|
47
|
+
- Tool-output relays (commit messages, test output)
|
|
48
|
+
- Status reports without choice points (e.g., "shipped X")
|
|
49
|
+
- Code content (diffs, file contents)
|
|
50
|
+
|
|
51
|
+
## What the rule requires
|
|
52
|
+
|
|
53
|
+
### The whole proposal opens with a full pitch
|
|
54
|
+
|
|
55
|
+
Per `/value-prop` verbose mode: **claim + 3 reasons (why-it-matters)**.
|
|
56
|
+
|
|
57
|
+
```markdown
|
|
58
|
+
**The /longrun (full pitch):**
|
|
59
|
+
|
|
60
|
+
Make bassclef's roadmap state machine-readable so /sprint and /longrun
|
|
61
|
+
stop reconstructing scope from chronicles + git log.
|
|
62
|
+
|
|
63
|
+
**Why it matters:**
|
|
64
|
+
|
|
65
|
+
1. First-turn orientation drops from "read three chronicles + git log
|
|
66
|
+
+ open PRs + guess" to one read.
|
|
67
|
+
2. Two parallel sessions can't double-claim work — atomic claim/release
|
|
68
|
+
lands as a primitive.
|
|
69
|
+
3. Operator stops manually clearing rescue files every session.
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Three reasons, plain language, scannable.
|
|
73
|
+
|
|
74
|
+
### Each option lands as a tweet
|
|
75
|
+
|
|
76
|
+
Per `/value-prop` tweet mode: **claim + sharpener, ≤280 chars**.
|
|
77
|
+
|
|
78
|
+
```markdown
|
|
79
|
+
**Pick one:**
|
|
80
|
+
|
|
81
|
+
- **A. WU-2 + WU-3 (~50t)** — Roadmap state becomes machine-readable.
|
|
82
|
+
Two parallel sessions can't pick the same work by accident. Claim/
|
|
83
|
+
release primitives ship.
|
|
84
|
+
|
|
85
|
+
- **B. A + #334 (~70t)** — Plus a save-time check that catches agents
|
|
86
|
+
skipping the roadmap. Read-side and write-side determinism in one shot.
|
|
87
|
+
|
|
88
|
+
- **C. Through WU-5 (~100t)** — Plus /sprint and /longrun actually use
|
|
89
|
+
the new reading. End-to-end this session.
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Each option's value-prop sits next to its name. Operator reads, picks.
|
|
93
|
+
|
|
94
|
+
### Bare names aren't options
|
|
95
|
+
|
|
96
|
+
These are NOT acceptable enumeration shapes:
|
|
97
|
+
|
|
98
|
+
```markdown
|
|
99
|
+
Pick:
|
|
100
|
+
- A
|
|
101
|
+
- B
|
|
102
|
+
- C
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
```markdown
|
|
106
|
+
Pick:
|
|
107
|
+
- WU-2
|
|
108
|
+
- #334
|
|
109
|
+
- WU-5
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
```markdown
|
|
113
|
+
Three options: WU-A, WU-B, WU-C.
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Each option needs a value-prop. If the value-prop is so obvious it
|
|
117
|
+
doesn't need stating, the option probably isn't worth enumerating.
|
|
118
|
+
|
|
119
|
+
## What the rule allows
|
|
120
|
+
|
|
121
|
+
- **Plain language preferred** (composes with `/kiss words` — folds in what was the standalone `/grade10words` skill per bassclef#340).
|
|
122
|
+
- **Tables when the options share a comparable axis** — e.g., "Tier / Estimate / Buys you" — but each row still needs the value-prop column populated.
|
|
123
|
+
- **Skipping the full pitch when the options are presented in passing** — e.g., "Want me to ship A, B, or C?" mid-conversation. The full pitch is for proposal moments; the tweet-per-option discipline still applies.
|
|
124
|
+
- **Inline alternatives** — "I'll ship X (or Y if you'd rather; Y trades speed for safety)" is fine; the alternative carries its sharpener inline.
|
|
125
|
+
|
|
126
|
+
## Anti-patterns
|
|
127
|
+
|
|
128
|
+
Direct quotes from sessions where this rule was missing:
|
|
129
|
+
|
|
130
|
+
- "Pick one: A, B, or C" — three letters, no content
|
|
131
|
+
- "WU-2 + WU-3 (~50t)" alone in a list — bare cost without value
|
|
132
|
+
- "We could do this or that" without naming what each buys
|
|
133
|
+
- "Three sizes — pick by how much determinism you want" without saying which size buys what
|
|
134
|
+
|
|
135
|
+
## How the rule composes with existing skills
|
|
136
|
+
|
|
137
|
+
- `/value-prop` is the primitive — flash/tweet/brief/verbose modes the
|
|
138
|
+
rule references directly.
|
|
139
|
+
|
|
140
|
+
INSTEAD of reinventing the format inline: call the skill. The four
|
|
141
|
+
compression modes already exist; reuse them.
|
|
142
|
+
- `/kiss words` (bassclef#340 folded the planned `/grade10words` into `/kiss`) — substitutes plain language for jargon. Composes orthogonally; an option's tweet should already be in plain language by default.
|
|
143
|
+
- `/feynman` — explanation skill. NOT a substitute for tweet-per-
|
|
144
|
+
option; /feynman is for "explain this concept," not "present these
|
|
145
|
+
choices."
|
|
146
|
+
|
|
147
|
+
## Verification cue (self-check before output)
|
|
148
|
+
|
|
149
|
+
Before presenting an enumeration, ask:
|
|
150
|
+
|
|
151
|
+
1. Did I open with a claim + 3 reasons (full pitch)?
|
|
152
|
+
2. Does each option carry a tweet (claim + sharpener)?
|
|
153
|
+
3. Are any options just labels / IDs / bare names?
|
|
154
|
+
4. Plain language? Or am I using "atomic" / "load-bearing" / "blast radius" without justifying?
|
|
155
|
+
|
|
156
|
+
If any answer is wrong, rewrite before posting.
|
|
157
|
+
|
|
158
|
+
## Eat-our-own-dogfood
|
|
159
|
+
|
|
160
|
+
Every PR body that ships a bassclef-evolution change uses this format
|
|
161
|
+
when it presents alternatives ("Out of scope," "Acceptance," "Test
|
|
162
|
+
plan"). Each line earns its place; bare bullet enumerations get
|
|
163
|
+
upgraded to tweets.
|
|
164
|
+
|
|
165
|
+
Iteration-goal docs follow the same discipline in their "Steps
|
|
166
|
+
enumerated" section.
|
|
167
|
+
|
|
168
|
+
## Relationship to other rules
|
|
169
|
+
|
|
170
|
+
- `feedback_lead_with_flash.md` (memory) — the operator-feedback
|
|
171
|
+
precedent; this rule codifies it as substrate
|
|
172
|
+
- `visual-hierarchy.md` — long agent output uses tables/headers/HRs;
|
|
173
|
+
this rule adds the value-prop content discipline that makes the
|
|
174
|
+
hierarchy useful
|
|
175
|
+
- `artifact-ingestion.md` — "Sources read" block discipline; this rule
|
|
176
|
+
is the analogous "options presented" discipline
|
|
177
|
+
- `commit-conventions.md` — commit message format; this rule applies
|
|
178
|
+
to PR bodies, agent dialogue, and skill outputs (not commits — those
|
|
179
|
+
have their own format)
|
|
180
|
+
- `sdlc-gates.md` — methodology-level gates; this rule fires before
|
|
181
|
+
any plan-presentation moment
|
|
182
|
+
|
|
183
|
+
## Enforcement
|
|
184
|
+
|
|
185
|
+
Methodology-level. The rule loads into every session via
|
|
186
|
+
`additionalDirectories`. Agents self-check before posting an enumeration.
|
|
187
|
+
|
|
188
|
+
If post-observation shows agents repeatedly presenting bare-name
|
|
189
|
+
enumerations, a future hook could grep agent output for option-list
|
|
190
|
+
shapes and BLOCK if value-prop content is missing — but the first line
|
|
191
|
+
of defense is the rule loading into every session.
|
|
192
|
+
|
|
193
|
+
## Override path
|
|
194
|
+
|
|
195
|
+
`SKIP_PLAN_ENUMERATION_RULE=1 <command>` — logged to trace per existing
|
|
196
|
+
bassclef hook idiom. Use only when the enumeration is genuinely
|
|
197
|
+
stylistic / casual ("want coffee or tea?") and the value-prop discipline
|
|
198
|
+
would be ceremony.
|
|
199
|
+
|
|
200
|
+
INSTEAD of using the override for production decisions: write the
|
|
201
|
+
value-prop. Production scope choices always carry weight worth
|
|
202
|
+
articulating.
|
|
203
|
+
|
|
204
|
+
## Retirement condition
|
|
205
|
+
|
|
206
|
+
If observed across 6 months with zero operator corrections of
|
|
207
|
+
enumeration formatting, this rule is correctly calibrated. If the
|
|
208
|
+
operator stops asking "what does X buy me?" entirely, the rule has
|
|
209
|
+
done its job.
|
|
210
|
+
|
|
211
|
+
Closes bassclef#339.
|