@thebassclef/lite 1.0.4 → 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.
- package/dist/cli.cjs +65 -0
- package/dist/cli.js +65 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/lite/.claude/agents/architect.md +70 -0
- package/dist/lite/.claude/agents/builder.md +114 -0
- package/dist/lite/.claude/agents/designer.md +156 -0
- package/dist/lite/.claude/agents/reviewer.md +88 -0
- package/dist/lite/.claude/hooks/bassclef-sync.sh +85 -27
- package/dist/lite/.claude/hooks/longrun-prep-compounding-axis-check.sh +492 -0
- package/dist/lite/.claude/hooks/longrun-prep-render-check.sh +236 -0
- package/dist/lite/.claude/hooks/persona-name-scrub-check.sh +105 -0
- package/dist/lite/.claude/hooks/skill-step-list-check.sh +171 -0
- package/dist/lite/.claude/luminaries/alan-cooper.md +170 -0
- package/dist/lite/.claude/luminaries/alistair-cockburn.md +140 -0
- package/dist/lite/.claude/luminaries/amazon-pr-faq.md +34 -0
- package/dist/lite/.claude/luminaries/andreas-zeller.md +74 -0
- package/dist/lite/.claude/luminaries/ash-maurya.md +121 -0
- package/dist/lite/.claude/luminaries/bill-buxton.md +210 -0
- package/dist/lite/.claude/luminaries/charles-sanders-peirce.md +150 -0
- package/dist/lite/.claude/luminaries/david-ogilvy.md +192 -0
- package/dist/lite/.claude/luminaries/don-norman.md +173 -0
- package/dist/lite/.claude/luminaries/edward-tufte.md +179 -0
- package/dist/lite/.claude/luminaries/eric-evans.md +160 -0
- package/dist/lite/.claude/luminaries/frederick-brooks.md +50 -0
- package/dist/lite/.claude/luminaries/gang-of-four.md +157 -0
- package/dist/lite/.claude/luminaries/glenford-myers.md +230 -0
- package/dist/lite/.claude/luminaries/hunt-thomas.md +115 -0
- package/dist/lite/.claude/luminaries/hyrum-wright.md +94 -0
- package/dist/lite/.claude/luminaries/jason-fried-dhh.md +46 -0
- package/dist/lite/.claude/luminaries/jesse-james-garrett.md +154 -0
- package/dist/lite/.claude/luminaries/john-ousterhout.md +94 -0
- package/dist/lite/.claude/luminaries/karl-popper.md +132 -0
- package/dist/lite/.claude/luminaries/kent-beck.md +168 -0
- package/dist/lite/.claude/luminaries/linus-torvalds.md +218 -0
- package/dist/lite/.claude/luminaries/martin-fowler.md +164 -0
- package/dist/lite/.claude/luminaries/michael-feathers.md +125 -0
- package/dist/lite/.claude/luminaries/michael-nygard.md +118 -0
- package/dist/lite/.claude/luminaries/robert-c-martin.md +164 -0
- package/dist/lite/.claude/luminaries/saltzer-schroeder.md +194 -0
- package/dist/lite/.claude/luminaries/sophia-prater.md +193 -0
- package/dist/lite/.claude/luminaries/stephen-toulmin.md +131 -0
- package/dist/lite/.claude/luminaries/tony-hoare.md +170 -0
- package/dist/lite/.claude/luminaries/vaughn-vernon.md +50 -0
- package/dist/lite/.claude/luminaries/w-edwards-deming.md +158 -0
- package/dist/lite/.claude/rules/accessor-library-discipline.md +110 -0
- package/dist/lite/.claude/rules/adr-discipline.md +96 -0
- package/dist/lite/.claude/rules/api-conventions.md +115 -0
- package/dist/lite/.claude/rules/artifact-ingestion.md +137 -0
- package/dist/lite/.claude/rules/assert-only-after-verify.md +111 -0
- package/dist/lite/.claude/rules/blocked-items.md +139 -0
- package/dist/lite/.claude/rules/bootstrap-pair-discipline.md +106 -0
- package/dist/lite/.claude/rules/branching.md +28 -0
- package/dist/lite/.claude/rules/cold-adopter-harness-discipline.md +93 -0
- package/dist/lite/.claude/rules/commit-conventions.md +22 -0
- package/dist/lite/.claude/rules/compounding-axis-fresh-analysis.md +173 -0
- package/dist/lite/.claude/rules/compounding-sequence-fresh-analysis.md +173 -0
- package/dist/lite/.claude/rules/context-engineering.md +155 -0
- package/dist/lite/.claude/rules/context-management.md +85 -0
- package/dist/lite/.claude/rules/defensive-bash.md +52 -0
- package/dist/lite/.claude/rules/deferred-actions.md +233 -0
- package/dist/lite/.claude/rules/destructive-operations.md +69 -0
- package/dist/lite/.claude/rules/diagnosis.md +38 -0
- package/dist/lite/.claude/rules/github-issue-flash-tweet.md +114 -0
- package/dist/lite/.claude/rules/guardrails.md +73 -0
- package/dist/lite/.claude/rules/hook-wire-on-author.md +77 -0
- package/dist/lite/.claude/rules/identifier-leak-prevention.md +73 -0
- package/dist/lite/.claude/rules/iteration-bet-brief-completeness.md +43 -0
- package/dist/lite/.claude/rules/lite-manifest-schema-change-discipline.md +79 -0
- package/dist/lite/.claude/rules/longrun-prep-plan-doc-compression.md +77 -0
- package/dist/lite/.claude/rules/loop-discipline.md +71 -0
- package/dist/lite/.claude/rules/manual-prod-approval.md +100 -0
- package/dist/lite/.claude/rules/marker-enrichment-discipline.md +72 -0
- package/dist/lite/.claude/rules/mobile-ephemeral-session.md +109 -0
- package/dist/lite/.claude/rules/new-dependency-check.md +44 -0
- package/dist/lite/.claude/rules/oo-ad-entry-point.md +95 -0
- package/dist/lite/.claude/rules/operator-facing-prose.md +177 -0
- package/dist/lite/.claude/rules/option-label-discipline.md +82 -0
- package/dist/lite/.claude/rules/pattern-annotation.md +83 -0
- package/dist/lite/.claude/rules/persona-name-leak-scrub.md +90 -0
- package/dist/lite/.claude/rules/plain-english-discipline.md +132 -0
- package/dist/lite/.claude/rules/plan-enumeration-needs-value-props.md +177 -0
- package/dist/lite/.claude/rules/pr-body-shape.md +195 -0
- package/dist/lite/.claude/rules/pr-strategy.md +142 -0
- package/dist/lite/.claude/rules/pr-title-shape.md +90 -0
- package/dist/lite/.claude/rules/prototype-workflow.md +53 -0
- package/dist/lite/.claude/rules/reserved-skill-names.md +103 -0
- package/dist/lite/.claude/rules/schema-management.md +42 -0
- package/dist/lite/.claude/rules/sdlc-gates.md +149 -0
- package/dist/lite/.claude/rules/security.md +37 -0
- package/dist/lite/.claude/rules/session-artifacts.md +236 -0
- package/dist/lite/.claude/rules/skill-composition-declarations.md +105 -0
- package/dist/lite/.claude/rules/skill-description-clarity.md +196 -0
- package/dist/lite/.claude/rules/skill-procedure-step-list.md +119 -0
- package/dist/lite/.claude/rules/sprint-prep-preset-picker.md +76 -0
- package/dist/lite/.claude/rules/state-schema-validation.md +156 -0
- package/dist/lite/.claude/rules/stuck-signal-diagnostic.md +111 -0
- package/dist/lite/.claude/rules/substrate-config-schema.md +85 -0
- package/dist/lite/.claude/rules/test-list-discipline.md +129 -0
- package/dist/lite/.claude/rules/test-sufficiency.md +186 -0
- package/dist/lite/.claude/rules/testing-tier-config.md +125 -0
- package/dist/lite/.claude/rules/testing.md +38 -0
- package/dist/lite/.claude/rules/turn-estimate-grounding.md +82 -0
- package/dist/lite/.claude/rules/visual-hierarchy.md +427 -0
- package/dist/lite/.claude/rules/we-dont-break-adopters.md +103 -0
- package/dist/lite/.claude/rules/whereami-load-bearing.md +184 -0
- package/dist/lite/.claude/rules/writing-craft-discipline.md +72 -0
- package/dist/lite/.claude/rules/wu-sequencing-compounds.md +119 -0
- package/dist/lite/.claude/skills/build/SKILL.md +640 -0
- package/dist/lite/.claude/skills/chronicle/SKILL.md +55 -0
- package/dist/lite/.claude/skills/clean-artifacts/SKILL.md +249 -0
- package/dist/lite/.claude/skills/decompose/SKILL.md +280 -0
- package/dist/lite/.claude/skills/diagnose/SKILL.md +297 -0
- package/dist/lite/.claude/skills/feynman/SKILL.md +90 -0
- package/dist/lite/.claude/skills/howdoi/SKILL.md +105 -0
- package/dist/lite/.claude/skills/ia-model/SKILL.md +108 -0
- package/dist/lite/.claude/skills/interaction-design/SKILL.md +112 -0
- package/dist/lite/.claude/skills/interpret-input/SKILL.md +180 -0
- package/dist/lite/.claude/skills/journal/SKILL.md +209 -0
- package/dist/lite/.claude/skills/kiss/SKILL.md +449 -0
- package/dist/lite/.claude/skills/launch/SKILL.md +915 -0
- package/dist/lite/.claude/skills/lean-canvas/SKILL.md +332 -0
- package/dist/lite/.claude/skills/longrun/SKILL.md +512 -0
- package/dist/lite/.claude/skills/luminary/SKILL.md +481 -0
- package/dist/lite/.claude/skills/ogilvy-writing-audit/SKILL.md +177 -0
- package/dist/lite/.claude/skills/onboard-repo/SKILL.md +1640 -0
- package/dist/lite/.claude/skills/pattern-review/SKILL.md +99 -0
- package/dist/lite/.claude/skills/personas/SKILL.md +207 -0
- package/dist/lite/.claude/skills/promote/SKILL.md +283 -0
- package/dist/lite/.claude/skills/requirement/SKILL.md +98 -0
- package/dist/lite/.claude/skills/retro/SKILL.md +117 -0
- package/dist/lite/.claude/skills/riff/SKILL.md +114 -0
- package/dist/lite/.claude/skills/roadmap-reconcile/SKILL.md +163 -0
- package/dist/lite/.claude/skills/session-end/SKILL.md +309 -0
- package/dist/lite/.claude/skills/session-log/SKILL.md +299 -0
- package/dist/lite/.claude/skills/skills/SKILL.md +228 -0
- package/dist/lite/.claude/skills/spec/SKILL.md +105 -0
- package/dist/lite/.claude/skills/sprint/SKILL.md +418 -0
- package/dist/lite/.claude/skills/stage/SKILL.md +384 -0
- package/dist/lite/.claude/skills/state-a-problem/SKILL.md +185 -0
- package/dist/lite/.claude/skills/temperance/SKILL.md +108 -0
- package/dist/lite/.claude/skills/use-case/SKILL.md +417 -0
- package/dist/lite/.claude/skills/user-stories/SKILL.md +268 -0
- package/dist/lite/.claude/skills/value-prop/SKILL.md +251 -0
- package/dist/lite/.claude/skills/verify/SKILL.md +160 -0
- package/dist/lite/.claude/skills/visual-review/SKILL.md +503 -0
- package/dist/lite/.claude/skills/whats-the-plan/SKILL.md +202 -0
- package/dist/lite/.claude/skills/whereami/SKILL.md +307 -0
- package/dist/lite/AGENTS.md +79 -0
- package/dist/lite/CLAUDE-lite.md +85 -0
- package/dist/lite/CODE_OF_CONDUCT.md +28 -0
- package/dist/lite/CONTRIBUTING.md +177 -0
- package/dist/lite/README.md +173 -0
- package/dist/lite/SECURITY.md +19 -0
- package/dist/lite/architecture/decisions/ADR-029-release-pipeline.md +79 -0
- package/dist/lite/architecture/decisions/ADR-031-non-breaking-changes-adopter-discipline.md +139 -0
- package/dist/lite/architecture/decisions/ADR-032-adopter-sync-dispatcher-architecture.md +192 -0
- package/dist/lite/architecture/decisions/ADR-039-release-tagging-scheme.md +145 -0
- package/dist/lite/architecture/decisions/ADR-040-planning-skill-vocabulary-and-lite-profile.md +155 -0
- package/dist/lite/architecture/decisions/ADR-044-unified-skill-body-template.md +162 -0
- package/dist/lite/lib/clean-artifacts-sweep.sh +112 -0
- package/dist/lite/lib/code-comment-discipline.sh +144 -0
- package/dist/lite/lib/composer-preflight.sh +459 -0
- package/dist/lite/lib/deferred-actions.sh +146 -0
- package/dist/lite/lib/hook-header-parser.sh +61 -0
- package/dist/lite/lib/hook-heartbeat.sh +152 -0
- package/dist/lite/lib/hook-inject.sh +255 -0
- package/dist/lite/lib/hook-installer.sh +195 -0
- package/dist/lite/lib/luminary-pick.sh +96 -0
- package/dist/lite/lib/output-discipline.sh +143 -0
- package/dist/lite/lib/prose-scan-boundary.sh +171 -0
- package/dist/lite/lib/rewrite-check.sh +214 -0
- package/dist/lite/lib/session-rescue.sh +151 -0
- package/dist/lite/lib/source-graph-walker.sh +277 -0
- package/dist/lite/lib/state.sh +1372 -0
- package/dist/lite/lib/telemetry.sh +205 -0
- package/dist/lite/lib/tier-check.sh +187 -0
- package/dist/lite/lib/tier-dependency-audit.sh +1088 -0
- package/dist/lite/presence/install/bassclef-hook-connect.sh +178 -0
- package/dist/lite/presence/install/bassclef-sync.dispatcher.template.sh +841 -0
- package/dist/lite/presence/install/bassclef-sync.template.sh +2278 -0
- package/dist/lite/presence/install/schedule-auto-save.cron.sh +88 -0
- package/dist/lite/presence/install/schedule-auto-save.taskscheduler.md +122 -0
- package/dist/lite/scripts/aggregate-telemetry.sh +217 -0
- package/dist/lite/scripts/analyze-tier-dependencies.sh +239 -0
- package/dist/lite/scripts/generate-lite-manifest.sh +505 -0
- package/dist/lite/scripts/generate-tier-manifest.sh +28 -0
- package/dist/lite/scripts/intent-drift-check.sh +456 -0
- package/dist/lite/scripts/lite-manifest-drift-check.sh +146 -0
- package/dist/lite/scripts/render-lite-manifest-doc.sh +150 -0
- package/dist/lite/standards/adr-template.md +86 -0
- package/dist/lite/standards/api-conventions/nextjs.md +84 -0
- package/dist/lite/standards/artifact-composition.md +209 -0
- package/dist/lite/standards/bash-hook-safety.md +246 -0
- package/dist/lite/standards/bassclef-configs-schema.md +232 -0
- package/dist/lite/standards/bassclef-evolution.md +143 -0
- package/dist/lite/standards/bassclef-internal-jargon.md +244 -0
- package/dist/lite/standards/bassclef-managed-sentinel.md +96 -0
- package/dist/lite/standards/bassclef-source-config.md +228 -0
- package/dist/lite/standards/branch-stacking.md +408 -0
- package/dist/lite/standards/code-safety-principles.md +176 -0
- package/dist/lite/standards/composer-prerequisites.md +155 -0
- package/dist/lite/standards/deferred-actions-schema.md +204 -0
- package/dist/lite/standards/dependency-discipline/cargo.md +39 -0
- package/dist/lite/standards/dependency-discipline/gem.md +43 -0
- package/dist/lite/standards/dependency-discipline/go-mod.md +41 -0
- package/dist/lite/standards/dependency-discipline/npm.md +42 -0
- package/dist/lite/standards/dependency-discipline/pip.md +42 -0
- package/dist/lite/standards/deployment-topology/ec2-tailscale.md +225 -0
- package/dist/lite/standards/deployment-topology.md +69 -0
- package/dist/lite/standards/docs-sync-allowlist.md +76 -0
- package/dist/lite/standards/domain-and-dns.md +145 -0
- package/dist/lite/standards/frontend-stack.md +67 -0
- package/dist/lite/standards/frontmatter-schema.md +154 -0
- package/dist/lite/standards/graceful-exit.md +227 -0
- package/dist/lite/standards/hook-idempotency.md +102 -0
- package/dist/lite/standards/hook-injection-discipline.md +202 -0
- package/dist/lite/standards/hook-install-class.md +215 -0
- package/dist/lite/standards/input-handler-interface.md +152 -0
- package/dist/lite/standards/lite-manifest-schema-changes.md +180 -0
- package/dist/lite/standards/lite-manifest.json +2797 -0
- package/dist/lite/standards/luminary-matching.md +105 -0
- package/dist/lite/standards/luminary-problem-patterns.md +481 -0
- package/dist/lite/standards/migration-discipline/active-record.md +50 -0
- package/dist/lite/standards/migration-discipline/alembic.md +43 -0
- package/dist/lite/standards/migration-discipline/gorm.md +50 -0
- package/dist/lite/standards/migration-discipline/prisma.md +53 -0
- package/dist/lite/standards/migration-discipline/sqlalchemy.md +51 -0
- package/dist/lite/standards/mobile-ephemeral-session.md +167 -0
- package/dist/lite/standards/model-routing-discipline.md +160 -0
- package/dist/lite/standards/ogilvy-writing-rules.md +225 -0
- package/dist/lite/standards/opener-discipline.md +96 -0
- package/dist/lite/standards/operator-facing-prose-discipline.md +201 -0
- package/dist/lite/standards/persona-schema.md +229 -0
- package/dist/lite/standards/pluggable-luminaries.md +323 -0
- package/dist/lite/standards/pr-body-discipline.md +115 -0
- package/dist/lite/standards/preview-state-schema.md +189 -0
- package/dist/lite/standards/project-directory-layout.md +276 -0
- package/dist/lite/standards/release-tagging.md +137 -0
- package/dist/lite/standards/reserved-skill-names.md +120 -0
- package/dist/lite/standards/scannable-multi-option-output.md +265 -0
- package/dist/lite/standards/sdlc-compliance.md +286 -0
- package/dist/lite/standards/sdlc-gates/typescript.md +57 -0
- package/dist/lite/standards/secrets-lifecycle.md +210 -0
- package/dist/lite/standards/security-scanner-adapter.md +145 -0
- package/dist/lite/standards/session-board.md +256 -0
- package/dist/lite/standards/skill-output-discipline.md +121 -0
- package/dist/lite/standards/state-spine-contract.md +255 -0
- package/dist/lite/standards/state-spine.md +511 -0
- package/dist/lite/standards/steering-hints/kiss-words.md +11 -0
- package/dist/lite/standards/substrate-config-schema.md +267 -0
- package/dist/lite/standards/tech-stack-config.md +109 -0
- package/dist/lite/standards/tier-dependency-analysis.md +167 -0
- package/dist/lite/standards/tier-runtime-deps/lite.md +57 -0
- package/dist/lite/standards/tier-tag-schema.md +155 -0
- package/dist/lite/standards/two-layer-config.md +99 -0
- package/dist/lite/standards/use-case-format.md +292 -0
- package/dist/lite/standards/user-story-invest.md +268 -0
- package/dist/lite/standards/velocity-and-appetite.md +229 -0
- package/dist/lite/standards/voice-input-pattern.md +119 -0
- package/dist/lite/standards/whereami-schema.md +301 -0
- package/dist/lite/standards/worktree-management.md +211 -0
- package/dist/lite/standards/writing-guide.md +213 -0
- package/dist/lite/templates/chronicle-template.md +75 -0
- package/dist/lite/templates/deferred-action-template.md +45 -0
- package/dist/lite/templates/memory-proposal-template.md +77 -0
- package/dist/lite/templates/persona-template.md +200 -0
- package/dist/lite/templates/pr-faq.md +45 -0
- package/dist/lite/templates/secret-rotation-template.md +162 -0
- package/dist/lite/templates/spec-template.md +131 -0
- package/dist/lite/templates/use-case-template.md +194 -0
- package/dist/lite/templates/user-story-template.md +107 -0
- package/dist/lite/templates/whereami-template.md +101 -0
- package/package.json +1 -1
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
---
|
|
2
|
+
tier: lite
|
|
3
|
+
description: Validation rules for user stories produced by /user-stories.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# User Story INVEST Standard
|
|
7
|
+
|
|
8
|
+
Validation rules for user stories produced by `/user-stories`. INVEST
|
|
9
|
+
(Bill Wake, 2003) is the bassclef heuristic for backlog-ready story
|
|
10
|
+
quality. This standard codifies the rules + pass/warn/fail semantics.
|
|
11
|
+
|
|
12
|
+
Skill: `.claude/skills/user-stories/SKILL.md`.
|
|
13
|
+
Template: `templates/user-story-template.md`.
|
|
14
|
+
|
|
15
|
+
## Why this standard exists
|
|
16
|
+
|
|
17
|
+
User stories are conversation tokens, not specifications. Without
|
|
18
|
+
quality gates, "story" devolves into "any sentence formatted with
|
|
19
|
+
'As a / I want / So that.'" The result: bloated stories that take
|
|
20
|
+
weeks, vague stories that can't be estimated, dependent stories that
|
|
21
|
+
block release planning, technical-debt stories disguised as user
|
|
22
|
+
value.
|
|
23
|
+
|
|
24
|
+
INVEST is six load-bearing tests every story passes before it enters
|
|
25
|
+
the backlog. Stories that fail multiple letters require rewrite.
|
|
26
|
+
Stories that fail one letter get WARN with a path to resolution.
|
|
27
|
+
|
|
28
|
+
## The six tests
|
|
29
|
+
|
|
30
|
+
### I — Independent
|
|
31
|
+
|
|
32
|
+
**Test**: Can this story ship to production without any other story
|
|
33
|
+
shipping first?
|
|
34
|
+
|
|
35
|
+
**Why**: dependent stories couple release planning. If A depends on
|
|
36
|
+
B which depends on C, you can't ship A early or skip C. Independent
|
|
37
|
+
stories let the team reorder, kill, or ship in any sequence.
|
|
38
|
+
|
|
39
|
+
**Acceptable dependencies**:
|
|
40
|
+
- Infrastructure that's already in place (no story dependency, just
|
|
41
|
+
platform reality)
|
|
42
|
+
- Optional enhancement: "this story is BETTER if X is also shipped,
|
|
43
|
+
but ships valuable on its own"
|
|
44
|
+
|
|
45
|
+
**Not acceptable**:
|
|
46
|
+
- "Need US-002 before US-001 makes sense" — merge or resequence
|
|
47
|
+
- Implicit dependencies hidden in acceptance criteria — surface them
|
|
48
|
+
|
|
49
|
+
**Resolution if fail**:
|
|
50
|
+
- Merge dependent stories into one
|
|
51
|
+
- Resequence so the prerequisite ships as its own story first
|
|
52
|
+
- Re-scope so this story doesn't NEED the prerequisite (deliver lesser
|
|
53
|
+
but standalone value)
|
|
54
|
+
|
|
55
|
+
### N — Negotiable
|
|
56
|
+
|
|
57
|
+
**Test**: Is this story a starting-point for conversation, or a
|
|
58
|
+
contract that mandates exact wording?
|
|
59
|
+
|
|
60
|
+
**Why**: stories are tokens for conversation between PO + dev + UX,
|
|
61
|
+
not specs. A story that locks in "must be a left-side panel" loses
|
|
62
|
+
the design negotiation that should happen at sprint planning. Stories
|
|
63
|
+
say WHAT outcome the persona gets; teams negotiate HOW during
|
|
64
|
+
implementation.
|
|
65
|
+
|
|
66
|
+
**Acceptable**:
|
|
67
|
+
- Constraints when they're load-bearing: "must be accessible per WCAG
|
|
68
|
+
AA" (this isn't negotiable for legal/ethical reasons, mark it
|
|
69
|
+
explicit)
|
|
70
|
+
- Acceptance criteria that pin down outcomes (those ARE the contract)
|
|
71
|
+
|
|
72
|
+
**Not acceptable**:
|
|
73
|
+
- Implementation prescription in the story body (move to acceptance
|
|
74
|
+
criteria or out of story entirely)
|
|
75
|
+
- "Must use [framework/library]" — that's an architecture decision,
|
|
76
|
+
not a story
|
|
77
|
+
|
|
78
|
+
**Resolution if fail**:
|
|
79
|
+
- Move prescriptive content to acceptance criteria
|
|
80
|
+
- Move architecture/library mandates to ADRs
|
|
81
|
+
- Rewrite story body in user-outcome terms
|
|
82
|
+
|
|
83
|
+
### V — Valuable
|
|
84
|
+
|
|
85
|
+
**Test**: Does the named persona get observable, demonstrable value
|
|
86
|
+
when this story ships?
|
|
87
|
+
|
|
88
|
+
**Why**: stories that exist for internal reasons (refactor, tech-debt,
|
|
89
|
+
infrastructure) aren't user stories — they're technical tasks. They
|
|
90
|
+
belong in a separate backlog or as enabler stories with explicit
|
|
91
|
+
"this enables future user value" framing. Confusing tech-tasks with
|
|
92
|
+
user-stories pollutes the backlog and obscures actual user work.
|
|
93
|
+
|
|
94
|
+
**Acceptable**:
|
|
95
|
+
- Direct value: persona uses the new behavior
|
|
96
|
+
- Indirect value: persona experiences a quality improvement
|
|
97
|
+
(faster, more reliable, more secure)
|
|
98
|
+
- Enabler value: explicit framing — "enables US-NNN which delivers
|
|
99
|
+
user value"
|
|
100
|
+
|
|
101
|
+
**Not acceptable**:
|
|
102
|
+
- "Refactor X" with no user-facing change
|
|
103
|
+
- "Pay down tech debt in module Y" — this is a tech task
|
|
104
|
+
- "Add observability" — unless persona is operator/SRE, this is
|
|
105
|
+
internal
|
|
106
|
+
|
|
107
|
+
**Resolution if fail**:
|
|
108
|
+
- Reclassify as tech-debt task; move to engineering backlog
|
|
109
|
+
- Reframe as enabler story tied to a user-facing story
|
|
110
|
+
- If genuinely user-valuable but value is hard to articulate, the
|
|
111
|
+
value isn't there — kill the story
|
|
112
|
+
|
|
113
|
+
### E — Estimable
|
|
114
|
+
|
|
115
|
+
**Test**: Can the team estimate this story (in story points,
|
|
116
|
+
t-shirt size, or hours) within ~30 minutes of refinement?
|
|
117
|
+
|
|
118
|
+
**Why**: unestimable stories indicate hidden complexity, missing
|
|
119
|
+
context, or unfamiliar territory. Either the story needs more
|
|
120
|
+
discovery (research spike), or it needs to be split until the parts
|
|
121
|
+
are estimable.
|
|
122
|
+
|
|
123
|
+
**Common reasons stories aren't estimable**:
|
|
124
|
+
- Unknown technical territory (need spike)
|
|
125
|
+
- Unclear acceptance criteria (need refinement)
|
|
126
|
+
- Unknown user behavior (need research)
|
|
127
|
+
- Too big to fit estimation in one head (split)
|
|
128
|
+
|
|
129
|
+
**Resolution if fail**:
|
|
130
|
+
- Schedule a research spike for unknowns (timeboxed, separate story)
|
|
131
|
+
- Refine acceptance criteria
|
|
132
|
+
- Split the story until parts are estimable
|
|
133
|
+
|
|
134
|
+
### S — Small
|
|
135
|
+
|
|
136
|
+
**Test**: Does this story fit in one iteration / sprint?
|
|
137
|
+
|
|
138
|
+
**Why**: stories that span multiple sprints become epics. Epics are
|
|
139
|
+
fine as containers but they're not stories. A story that takes 3
|
|
140
|
+
weeks misses every benefit of incremental delivery — no early
|
|
141
|
+
feedback, no early value, no early risk discovery.
|
|
142
|
+
|
|
143
|
+
**Heuristic**: a story should be doable in 1-5 days by one or two
|
|
144
|
+
developers with normal context. If 6+ days, split it.
|
|
145
|
+
|
|
146
|
+
**Splitting strategies** (Patton, Cohn):
|
|
147
|
+
- By workflow step (extract a single step into its own story)
|
|
148
|
+
- By data type (one story per data variant)
|
|
149
|
+
- By acceptance criterion (one criterion per story)
|
|
150
|
+
- By user role (different personas as different stories)
|
|
151
|
+
- By happy path vs. edge cases (ship happy path first, edges later)
|
|
152
|
+
- By UI vs. backend (when independently shippable; risky if not)
|
|
153
|
+
|
|
154
|
+
**Resolution if fail**: split. The most common letter to fail.
|
|
155
|
+
|
|
156
|
+
### T — Testable
|
|
157
|
+
|
|
158
|
+
**Test**: Are the acceptance criteria concrete enough to write
|
|
159
|
+
automated tests against?
|
|
160
|
+
|
|
161
|
+
**Why**: untestable stories ship as "looks done" — and "looks done"
|
|
162
|
+
ships bugs. Acceptance criteria that read "works well" or "is
|
|
163
|
+
intuitive" aren't testable. Criteria that read "loads in <2s on 4G"
|
|
164
|
+
or "all form fields validate before submit" are.
|
|
165
|
+
|
|
166
|
+
**Testable criteria**:
|
|
167
|
+
- Pin specific observable behaviors
|
|
168
|
+
- Include thresholds for non-functional concerns (performance, a11y)
|
|
169
|
+
- Cover happy path + at least one edge case
|
|
170
|
+
- Map to test types (unit / integration / e2e)
|
|
171
|
+
|
|
172
|
+
**Not testable**:
|
|
173
|
+
- "Looks good" / "feels fast" / "is intuitive"
|
|
174
|
+
- "Standard behavior" without defining what standard means
|
|
175
|
+
- Implementation assertions ("uses Redis cache") rather than behavior
|
|
176
|
+
|
|
177
|
+
**Resolution if fail**: rewrite criteria. Each criterion = one test
|
|
178
|
+
assertion. If you can't write the test, the criterion isn't done.
|
|
179
|
+
|
|
180
|
+
## Pass / Warn / Fail semantics
|
|
181
|
+
|
|
182
|
+
Per-story status is computed from the six tests:
|
|
183
|
+
|
|
184
|
+
| INVEST score | Status | Meaning |
|
|
185
|
+
|--------------|--------|---------|
|
|
186
|
+
| 6 PASS | **PASS** | Backlog-ready |
|
|
187
|
+
| 5 PASS / 1 WARN | **PASS-WARN** | Backlog-ready; resolve warning at refinement |
|
|
188
|
+
| 4 PASS / 2 WARN | **WARN** | Refine before sprint planning |
|
|
189
|
+
| ≤3 PASS or any FAIL | **FAIL** | Rewrite required |
|
|
190
|
+
|
|
191
|
+
Aggregate iteration health:
|
|
192
|
+
|
|
193
|
+
```markdown
|
|
194
|
+
**INVEST aggregate**: N PASS / M PASS-WARN / K WARN / J FAIL
|
|
195
|
+
**Backlog-ready ratio**: (PASS + PASS-WARN) / total
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
Target ratio: ≥85%. Below 70% = backlog-quality systemic issue
|
|
199
|
+
(refinement discipline missing, scope confusion, persona inflation).
|
|
200
|
+
|
|
201
|
+
## Validation procedure (`/user-stories validate`)
|
|
202
|
+
|
|
203
|
+
`/user-stories validate` walks every story under `docs/user-stories/`
|
|
204
|
+
(or `docs/user-stories/[iteration]/`) and reports per-story status.
|
|
205
|
+
|
|
206
|
+
```markdown
|
|
207
|
+
## Story validation — [iteration]
|
|
208
|
+
|
|
209
|
+
| Story | I | N | V | E | S | T | Status | Notes |
|
|
210
|
+
|-------|---|---|---|---|---|---|--------|-------|
|
|
211
|
+
| US-001 | ✅ | ✅ | ✅ | ✅ | ⚠️ | ✅ | PASS-WARN | S: 5-day estimate at upper bound; consider split |
|
|
212
|
+
| US-002 | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | FAIL | I: depends on US-005 not yet in backlog |
|
|
213
|
+
| ... | ... | ... | ... | ... | ... | ... | ... | ... |
|
|
214
|
+
|
|
215
|
+
**Aggregate**: 8 PASS / 3 PASS-WARN / 2 WARN / 1 FAIL
|
|
216
|
+
**Backlog-ready ratio**: 11/14 = 79% (below 85% target — refine)
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
## Traceability rules
|
|
220
|
+
|
|
221
|
+
Every story carries a traceability block linking to upstream artifacts:
|
|
222
|
+
|
|
223
|
+
| Field | Required? | When absent |
|
|
224
|
+
|-------|-----------|-------------|
|
|
225
|
+
| Persona | MUST | FAIL — every story names a persona slug |
|
|
226
|
+
| JTBD | MUST | FAIL — story without JTBD is solution-looking-for-problem |
|
|
227
|
+
| VPC entry | SHOULD | WARN — benefit clause is weaker without VPC grounding |
|
|
228
|
+
| Use-case line | SHOULD when /use-case exists | WARN — coverage gap on use-case |
|
|
229
|
+
|
|
230
|
+
A story with no JTBD trace is a **red flag**: it's likely a feature
|
|
231
|
+
request from operator intuition rather than user need. Either find
|
|
232
|
+
the JTBD (which means /jtbd-tasks needs another pass) or kill the
|
|
233
|
+
story.
|
|
234
|
+
|
|
235
|
+
## What this standard does NOT cover
|
|
236
|
+
|
|
237
|
+
- **Story estimation methodology** (story points vs. t-shirt vs. hours)
|
|
238
|
+
— team choice, not standard concern
|
|
239
|
+
- **Sprint composition rules** — separate concern (`/sprint` skill)
|
|
240
|
+
- **Acceptance test format** — Given/When/Then BDD or assertion-style
|
|
241
|
+
both fine; team picks
|
|
242
|
+
- **Task breakdown within a story** — implementation detail, not
|
|
243
|
+
story-level
|
|
244
|
+
|
|
245
|
+
## Relationship to other standards + rules
|
|
246
|
+
|
|
247
|
+
| Related | Connection |
|
|
248
|
+
|---------|-----------|
|
|
249
|
+
| `standards/persona-schema.md` | Personas referenced in `<As a>` clause must validate against schema |
|
|
250
|
+
| `.claude/rules/artifact-ingestion.md` | Stories trace to upstream artifacts; same "cite before claim" discipline |
|
|
251
|
+
| `standards/vpc-fit-validation.md` | VPC Pain-Relievers + Gain-Creators ground story `<benefit>` clause |
|
|
252
|
+
| `.claude/skills/user-stories/SKILL.md` | The skill that produces stories validated by this standard |
|
|
253
|
+
| `.claude/skills/spec/SKILL.md` | Downstream — spec consumes stories as input scope |
|
|
254
|
+
|
|
255
|
+
## When to revisit
|
|
256
|
+
|
|
257
|
+
- Backlog-ready ratio drops below 70% repeatedly (refinement issue OR
|
|
258
|
+
the standard is too strict)
|
|
259
|
+
- A team consistently fails one letter (might indicate a process gap
|
|
260
|
+
worth surfacing, e.g., "always failing E means we don't have
|
|
261
|
+
estimation rigor")
|
|
262
|
+
- New bassclef artifact upstream of stories (e.g., when /use-case
|
|
263
|
+
lands, traceability rule adds use-case-line as MUST when present)
|
|
264
|
+
|
|
265
|
+
## Closes
|
|
266
|
+
|
|
267
|
+
- bassclef #208 (paired with skill)
|
|
268
|
+
- Part of follow-up to iteration `2026-04-19e-persona-vpc-promotions`
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
---
|
|
2
|
+
tier: lite
|
|
3
|
+
description: How work is estimated, measured, and calibrated in agent-driven SDLC.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Velocity and Time Budget Standard
|
|
7
|
+
|
|
8
|
+
How work is estimated, measured, and calibrated in agent-driven SDLC.
|
|
9
|
+
|
|
10
|
+
(Formerly `Velocity and Appetite` per ADR-040 D1 rename 2026-07-17.
|
|
11
|
+
The filename stays `velocity-and-appetite.md` for backward compat via
|
|
12
|
+
`standards/vocabulary-migration.json`. Shape Up's original term is
|
|
13
|
+
`appetite`; bassclef calls it "time budget" in operator-facing prose.)
|
|
14
|
+
|
|
15
|
+
Based on Ryan Singer's Shape Up (Basecamp). Core insight: don't estimate
|
|
16
|
+
how long things will take — set how much time you're willing to spend,
|
|
17
|
+
then scope to fit. Fixed budget, variable scope.
|
|
18
|
+
|
|
19
|
+
This matters more for agents than for humans. A human developer gets
|
|
20
|
+
tired, checks the clock, pushes back on scope. An agent will happily
|
|
21
|
+
expand forever. The time budget is the constraint that prevents infinite work.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## Feynman Explanation
|
|
26
|
+
|
|
27
|
+
Imagine you're renovating a bathroom. The traditional approach: get an
|
|
28
|
+
estimate ("it'll take 3 weeks"), then discover it takes 6. The Shape Up
|
|
29
|
+
approach: "I'm willing to spend 2 weeks on this bathroom. What can I get
|
|
30
|
+
done in 2 weeks?" Maybe you skip the heated floors. Maybe you use
|
|
31
|
+
off-the-shelf tile instead of custom. The *scope flexes to fit the budget.*
|
|
32
|
+
|
|
33
|
+
Now imagine the contractor is a robot that never gets tired and thinks
|
|
34
|
+
every detail is equally important. Without a ceiling, it'll spend 3 weeks
|
|
35
|
+
on grout patterns. That's an agent without a time budget. The time budget says: "you
|
|
36
|
+
have 40 turns. Ship something real. Cut what doesn't fit."
|
|
37
|
+
|
|
38
|
+
The magic is in the closeout. After the work, you write down: "I budgeted
|
|
39
|
+
40 turns, it took 15." Next time something similar comes up, you budget 20.
|
|
40
|
+
The system learns. After a few iterations, your estimates converge on
|
|
41
|
+
reality — not because you got better at estimating, but because you have
|
|
42
|
+
data.
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## Key Terms
|
|
47
|
+
|
|
48
|
+
### Round-trip (aka "turn")
|
|
49
|
+
|
|
50
|
+
One round-trip: you send a message, the agent responds. That's one.
|
|
51
|
+
This is the atomic unit of work in agent-driven development.
|
|
52
|
+
|
|
53
|
+
A round-trip can be trivial ("read this file") or substantial ("implement
|
|
54
|
+
the entire scoring module"). Not all round-trips are equal, but over
|
|
55
|
+
enough iterations, round-trips-per-issue averages out into a useful signal.
|
|
56
|
+
|
|
57
|
+
**Why round-trips, not hours?** Hours measure clock time, which is
|
|
58
|
+
meaningless for agents. An agent that takes 3 minutes of wall time but
|
|
59
|
+
50 round-trips of back-and-forth consumed more resources than one that
|
|
60
|
+
took 10 minutes but 8 round-trips. Round-trips are the actual unit of
|
|
61
|
+
consumption.
|
|
62
|
+
|
|
63
|
+
**Notation**: The frontmatter field is `turns:` (Claude Code's internal
|
|
64
|
+
term). Exact when known (`turns: 15`), approximate with tilde when
|
|
65
|
+
estimated (`turns: ~40`). In prose and metrics output, use "round-trips"
|
|
66
|
+
for clarity.
|
|
67
|
+
|
|
68
|
+
### Time Budget
|
|
69
|
+
|
|
70
|
+
(Bassclef's name for Shape Up's `appetite` concept per Ryan Singer + Basecamp.
|
|
71
|
+
Renamed per ADR-040 D1 2026-07-17.)
|
|
72
|
+
|
|
73
|
+
How many turns you're willing to spend on an iteration. The budget
|
|
74
|
+
ceiling. Set *before* work begins in the iteration goal.
|
|
75
|
+
|
|
76
|
+
The time budget is **not an estimate**. An estimate says "I think this will
|
|
77
|
+
take 40 turns." The time budget says "I'm willing to spend 40 turns on this.
|
|
78
|
+
If it can't fit in 40, descope or split."
|
|
79
|
+
|
|
80
|
+
**How the time budget is set:**
|
|
81
|
+
|
|
82
|
+
1. **By phase** — different phases consume turns at different rates:
|
|
83
|
+
|
|
84
|
+
| Phase | Typical time budget | Why |
|
|
85
|
+
|-------|-----------------|-----|
|
|
86
|
+
| Inception | 30–50 turns | Thinking artifacts (canvas, shaping) — more back-and-forth |
|
|
87
|
+
| Elaboration | 30–40 turns | Design + architecture — moderate depth |
|
|
88
|
+
| Construction | 20–30 turns per branch | Code + tests — focused, less ambiguity |
|
|
89
|
+
| Transition | 15–20 turns | Deploy + verify — mechanical |
|
|
90
|
+
|
|
91
|
+
2. **By calibration** — closeout data from previous iterations:
|
|
92
|
+
- First iteration: use the phase defaults above. You're guessing.
|
|
93
|
+
- Second iteration: adjust based on the first closeout's delta.
|
|
94
|
+
- Third+ iteration: your estimates converge. Trust the data.
|
|
95
|
+
|
|
96
|
+
3. **By scope complexity** — more files touched, more integration points,
|
|
97
|
+
more unknowns = higher time budget. But prefer splitting into multiple
|
|
98
|
+
smaller iterations over inflating a single time budget.
|
|
99
|
+
|
|
100
|
+
4. **By confidence** — "I've done this exact thing before" = lower time budget.
|
|
101
|
+
"This is novel and uncertain" = higher time budget or spike first.
|
|
102
|
+
|
|
103
|
+
**The rule**: when the time budget is exhausted, descope. Don't extend. If the
|
|
104
|
+
work can't fit, the scope was wrong — split it, defer the tail, ship what
|
|
105
|
+
fits. This is how fixed budget / variable scope works.
|
|
106
|
+
|
|
107
|
+
### Actuals
|
|
108
|
+
|
|
109
|
+
How many turns the work actually consumed. Measured at closeout from
|
|
110
|
+
chronicle timing data (`turns` field in frontmatter).
|
|
111
|
+
|
|
112
|
+
Actuals are always approximate — counting exact conversation turns is
|
|
113
|
+
fragile. The value is in the *trend*, not the precision. A closeout
|
|
114
|
+
that says "time budget 40, actual ~15" tells you the time budget was 2.5x
|
|
115
|
+
too generous. That's useful even if the actual was really 18.
|
|
116
|
+
|
|
117
|
+
### Delta
|
|
118
|
+
|
|
119
|
+
The difference between the time budget and actuals, expressed as a percentage.
|
|
120
|
+
|
|
121
|
+
```
|
|
122
|
+
Delta = (Actuals - Time Budget) / Time Budget × 100
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
- **Negative delta** (e.g., -62%): under budget. Time budget was generous.
|
|
126
|
+
Next similar iteration: lower the time budget.
|
|
127
|
+
- **Zero delta**: perfect calibration. Unlikely but ideal.
|
|
128
|
+
- **Positive delta** (e.g., +30%): over budget. Scope was underestimated
|
|
129
|
+
or complexity was higher than expected. Check: was the scope too big,
|
|
130
|
+
or was there unexpected rework?
|
|
131
|
+
|
|
132
|
+
### Iteration Goal
|
|
133
|
+
|
|
134
|
+
(Bassclef's name for Shape Up's `iteration bet` per ADR-040 D1 rename 2026-07-17.
|
|
135
|
+
The goal doc filename stays under `docs/iteration-bets/` for backward compat.)
|
|
136
|
+
|
|
137
|
+
A scoped piece of work with a thesis, acceptance criteria, and time budget.
|
|
138
|
+
The unit of planning. Lives at `docs/iteration-bets/YYYY-MM-DD-slug.md`.
|
|
139
|
+
|
|
140
|
+
An iteration goal declares:
|
|
141
|
+
- **What** we're building (scope)
|
|
142
|
+
- **Why** it matters (risk retired, value proved)
|
|
143
|
+
- **How much** we're willing to spend (time budget in turns + cost ceiling)
|
|
144
|
+
- **How we'll know** it worked (acceptance criteria, lovability/viability signals)
|
|
145
|
+
|
|
146
|
+
The goal metaphor comes from Shape Up's `bet` framing (Ryan Singer, Basecamp):
|
|
147
|
+
you're wagering that this scope, at this time budget, will produce value.
|
|
148
|
+
Sometimes you lose — the scope was wrong, the approach was wrong, or the
|
|
149
|
+
time budget was too tight. That's information, not failure.
|
|
150
|
+
|
|
151
|
+
### Closeout
|
|
152
|
+
|
|
153
|
+
The section appended to an iteration goal when the work completes (or is
|
|
154
|
+
explicitly abandoned). Records what actually happened vs what was planned.
|
|
155
|
+
|
|
156
|
+
A closeout contains:
|
|
157
|
+
- **Actuals vs time budget table**: turns, duration, issues closed — with deltas
|
|
158
|
+
- **Gate compliance summary**: which gates fired, which were skipped, why
|
|
159
|
+
- **Calibration notes**: what was over/underscoped, guidance for next time
|
|
160
|
+
|
|
161
|
+
The closeout is the feedback loop. Without it, the time budget is just a guess
|
|
162
|
+
that never improves. With it, each iteration makes the next estimate
|
|
163
|
+
better.
|
|
164
|
+
|
|
165
|
+
**When to write**: when all acceptance criteria are met (or explicitly
|
|
166
|
+
deferred). Before the final chronicle. See `standards/sdlc-compliance.md`
|
|
167
|
+
for the closeout format.
|
|
168
|
+
|
|
169
|
+
### Velocity
|
|
170
|
+
|
|
171
|
+
Issues closed per turns consumed, measured across iterations. Not a target
|
|
172
|
+
to maximize — a diagnostic to understand.
|
|
173
|
+
|
|
174
|
+
High velocity + low quality (many fix: branches after feat: branches) =
|
|
175
|
+
shipping too fast, cutting corners. Low velocity + high quality (no
|
|
176
|
+
rework) = possibly over-engineering, or just hard problems. The metrics
|
|
177
|
+
script shows both together so you can read the signal.
|
|
178
|
+
|
|
179
|
+
### Calibration
|
|
180
|
+
|
|
181
|
+
The process of using closeout data to improve future time budget estimates.
|
|
182
|
+
Not a manual exercise — it happens naturally when you read previous
|
|
183
|
+
closeouts before setting the next time budget.
|
|
184
|
+
|
|
185
|
+
**Calibration pattern**:
|
|
186
|
+
1. First iteration: time budget 40 (guess from phase defaults)
|
|
187
|
+
2. Closeout: actual 15, delta -62%. Note: "spec already existed"
|
|
188
|
+
3. Second iteration (similar scope): time budget 20
|
|
189
|
+
4. Closeout: actual 18, delta -10%. Converging.
|
|
190
|
+
5. Third iteration: time budget 20 is now a validated default for this type
|
|
191
|
+
|
|
192
|
+
The calibration notes in the closeout capture *why* the delta happened,
|
|
193
|
+
not just the number. "Spec already existed" vs "unexpected schema migration"
|
|
194
|
+
are both -62% but mean completely different things for future estimates.
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
## Relationship to Metrics
|
|
199
|
+
|
|
200
|
+
The `scripts/metrics.sh --iteration` view aggregates closeout data across
|
|
201
|
+
all iteration goals. The `--overall` view rolls up velocity, throughput,
|
|
202
|
+
quality, and DORA into a single dashboard. Both read from artifacts that
|
|
203
|
+
already exist — no separate tracking system.
|
|
204
|
+
|
|
205
|
+
| Term | Where it lives | Who writes it |
|
|
206
|
+
|------|---------------|---------------|
|
|
207
|
+
| Time budget | Iteration goal (set at start) | Operator + agent during `/autonomous start` |
|
|
208
|
+
| Turns | Chronicle frontmatter (`turns:` field) | Agent at session-end (Must tier) |
|
|
209
|
+
| Actuals | Iteration goal closeout | Agent when iteration completes |
|
|
210
|
+
| Delta | Iteration goal closeout (computed) | Agent when writing closeout |
|
|
211
|
+
| Velocity | `scripts/metrics.sh --iteration` (computed) | Script, on demand |
|
|
212
|
+
| Calibration | Closeout "calibration notes" section | Agent, informed by previous closeouts |
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
## What This Is Not
|
|
217
|
+
|
|
218
|
+
- **Not story points.** Story points estimate relative complexity. The time budget
|
|
219
|
+
sets absolute budget. Points ask "how hard is this?" The time budget asks "how
|
|
220
|
+
much am I willing to spend?" Different question, different answer.
|
|
221
|
+
|
|
222
|
+
- **Not time tracking.** Duration (minutes) is captured in chronicles for
|
|
223
|
+
context, but turns are the primary unit. An agent that finishes in 5
|
|
224
|
+
minutes but takes 50 turns consumed more than one that takes 30 minutes
|
|
225
|
+
but 10 turns.
|
|
226
|
+
|
|
227
|
+
- **Not a productivity target.** "Increase velocity" is not a goal. The
|
|
228
|
+
goal is calibration — estimates that match reality. If velocity drops
|
|
229
|
+
because the work got harder, that's information, not a problem.
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
---
|
|
2
|
+
tier: lite
|
|
3
|
+
description: How bassclef handles voice as input to skill dispatches.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Voice Input Pattern
|
|
7
|
+
|
|
8
|
+
How bassclef handles voice as input to skill dispatches. Phase V Hey-Alexa MVD uses macOS native dictation (Fn-Fn keyboard shortcut) into a Claude Code prompt. Hands-free voice listener is V2 (deferred).
|
|
9
|
+
|
|
10
|
+
## When this fires
|
|
11
|
+
|
|
12
|
+
Operator dictates intent into a Claude Code session instead of typing it. Skills downstream (especially `/preview-build`) treat the resulting text as voice-originated + apply tolerant intent extraction.
|
|
13
|
+
|
|
14
|
+
## The pattern (V1 — MVD)
|
|
15
|
+
|
|
16
|
+
### 1. Operator-side: macOS dictation
|
|
17
|
+
|
|
18
|
+
Operator presses **Fn-Fn** on a Mac with dictation enabled (System Settings → Keyboard → Dictation → On). macOS captures audio + transcribes to the active text field.
|
|
19
|
+
|
|
20
|
+
Operator speaks the intent. Operator releases Fn-Fn (dictation stops). Transcribed text appears in the Claude Code prompt input.
|
|
21
|
+
|
|
22
|
+
Operator submits the prompt. The transcribed text flows to bassclef's skills like any text input.
|
|
23
|
+
|
|
24
|
+
### 2. bassclef-side: voice-input mode
|
|
25
|
+
|
|
26
|
+
`/launch` (and chained skills) accept the input. The transcribed text is treated as the operator's intent paragraph — conversational shape (fragments, restarts, filler) is preserved verbatim and flows through `/interpret-input` like any keyboard-typed text.
|
|
27
|
+
|
|
28
|
+
The mode is signaled via:
|
|
29
|
+
- Explicit flag: `/launch --voice-input` (operator dispatch convenience)
|
|
30
|
+
- Auto-detection heuristics (optional V2): text shape suggests spoken vs typed origin
|
|
31
|
+
|
|
32
|
+
V1 ships explicit flag only. Auto-detection is a polish-shelf concern.
|
|
33
|
+
|
|
34
|
+
### 3. Downstream chain
|
|
35
|
+
|
|
36
|
+
After the text lands, the rest of the pipeline is unchanged:
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
voice → text (macOS dictation)
|
|
40
|
+
↓
|
|
41
|
+
text → InputArtifact (/interpret-input — text mode)
|
|
42
|
+
↓
|
|
43
|
+
InputArtifact → variants (existing /launch Phase 4 — deterministic luminary round-robin)
|
|
44
|
+
↓
|
|
45
|
+
variant → repo (existing /build)
|
|
46
|
+
↓
|
|
47
|
+
repo → live URL (existing /launch-preview + Amplify)
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
The chain composes existing bassclef skills. Voice is a thin front-end on top.
|
|
51
|
+
|
|
52
|
+
## The pattern (V2 — hands-free, future)
|
|
53
|
+
|
|
54
|
+
Phase V's roadmap entry says "voice → Bandleader → polished output → live URL." V2 adds:
|
|
55
|
+
|
|
56
|
+
- **Standalone voice listener** — daemon captures audio without Claude Code prompt step
|
|
57
|
+
- **Whisper API or similar** — offline + accuracy beyond macOS dictation
|
|
58
|
+
- **Bandleader orchestration** — voice → intent → multi-agent dispatch (Phase IV)
|
|
59
|
+
- **Hands-free flow** — operator never touches keyboard during demo
|
|
60
|
+
|
|
61
|
+
V1 (this standard) ships the MVD. V2 unblocks the full Phase V vision when Phase IV Bandleader lands.
|
|
62
|
+
|
|
63
|
+
## Why macOS dictation for V1
|
|
64
|
+
|
|
65
|
+
- **Already on operator's machine** — no new substrate primitive needed
|
|
66
|
+
- **Works offline** (macOS local processing) — no API dependency
|
|
67
|
+
- **Latency low** — real-time transcription
|
|
68
|
+
- **Cross-app** — works in any text field including Claude Code's
|
|
69
|
+
- **Operator already knows it** — Fn-Fn muscle memory
|
|
70
|
+
|
|
71
|
+
The tradeoff: requires operator to press Fn-Fn (not hands-free). MVD accepts this trade.
|
|
72
|
+
|
|
73
|
+
## Operator setup checklist (V1)
|
|
74
|
+
|
|
75
|
+
Before the demo:
|
|
76
|
+
|
|
77
|
+
- [ ] System Settings → Keyboard → Dictation → ON
|
|
78
|
+
- [ ] Dictation language matches operator's spoken English
|
|
79
|
+
- [ ] Test: press Fn-Fn in any text field; speak a short phrase; verify transcription
|
|
80
|
+
- [ ] Claude Code session active in target directory
|
|
81
|
+
- [ ] bassclef-sync has run (bassclef's substrate up-to-date in target repo)
|
|
82
|
+
|
|
83
|
+
## Why bassclef core preserves the text as-is
|
|
84
|
+
|
|
85
|
+
Bassclef core does not run intent extraction against an embedding model + LLM judge. The voice-transcribed text is treated as the operator's intent paragraph and passed through `/interpret-input` unchanged. Downstream phases use it the same way they use keyboard-typed text.
|
|
86
|
+
|
|
87
|
+
Bassclef-private adopters who want intent-grounded matching can layer their own `/extract-intent` skill via `additionalDirectories` injection. That skill consumes the voice-originated text the same way it consumes typed text; tolerance for conversational shape (fragments, restarts) is the adapter's concern, not bassclef's.
|
|
88
|
+
|
|
89
|
+
## What this does NOT cover
|
|
90
|
+
|
|
91
|
+
- Voice in audio-only contexts (telephony, smart speakers) — V3+ scope
|
|
92
|
+
- Multi-speaker scenarios (transcription disambiguation) — V3+
|
|
93
|
+
- Languages other than operator's spoken language — V2+
|
|
94
|
+
- Real-time streaming intent extraction — V2+ (today's pattern is batch: speak → submit → process)
|
|
95
|
+
|
|
96
|
+
## Distinct from
|
|
97
|
+
|
|
98
|
+
- `standards/bassclef-test-repos.md` — test ground for substrate validation; foobar exists for bassclef's tests, NOT as the demo target
|
|
99
|
+
- `.claude/skills/launch/SKILL.md` — composes the input → variants chain; voice-input mode is an addition to existing surface
|
|
100
|
+
|
|
101
|
+
## When this retires
|
|
102
|
+
|
|
103
|
+
This standard retires if:
|
|
104
|
+
- Hands-free voice listener (V2) replaces the Fn-Fn pattern as the primary mode
|
|
105
|
+
- Phase IV Bandleader supersedes the operator-driven dispatch model
|
|
106
|
+
- Bassclef evolves to a different voice-input convention
|
|
107
|
+
|
|
108
|
+
Until V2 ships, this is SENTINEL_the_bassclef_V1_pattern for "speak out loud → app lands in cloud."
|
|
109
|
+
|
|
110
|
+
## Sources read
|
|
111
|
+
|
|
112
|
+
- `docs/iteration-bets/2026-05-12-phase-v-hey-alexa-mvd.md` — parent bet
|
|
113
|
+
- `docs/roadmaps/2026-05-07-7-phase-staircase.md` Phase V entry (voice → app on live URL)
|
|
114
|
+
- `.claude/skills/launch/SKILL.md` — downstream consumer of voice-originated text
|
|
115
|
+
- bassclef#944 — Voyage matcher excision from bassclef core
|
|
116
|
+
|
|
117
|
+
## Closes
|
|
118
|
+
|
|
119
|
+
WU-1 of Phase V Hey-Alexa MVD bet. bassclef#944 cleared the embed+LLM coupling so voice-input mode now flows through bassclef core's deterministic luminary path.
|