@thebassclef/lite 1.1.0 → 1.2.0-alpha.1
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 +258 -63
- package/dist/cli.js +258 -63
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/lite/.claude/bassclef-configs.jsonc +56 -0
- package/dist/lite/.claude/bassclef-orientation.md +120 -0
- package/dist/lite/.claude/hooks/adr-discipline-check.sh +132 -0
- package/dist/lite/.claude/hooks/atomic-pr-check.sh +169 -0
- package/dist/lite/.claude/hooks/auto-save-idle.sh +51 -0
- package/dist/lite/.claude/hooks/bassclef-sync.sh +51 -13
- package/dist/lite/.claude/hooks/bet-doc-gate.sh +283 -0
- package/dist/lite/.claude/hooks/bug-diagnosis.sh +64 -0
- package/dist/lite/.claude/hooks/destructive-command-guard.sh +136 -0
- package/dist/lite/.claude/hooks/file-rename-discipline-check.sh +147 -0
- package/dist/lite/.claude/hooks/hook-classifier-canary.sh +158 -0
- package/dist/lite/.claude/hooks/kiss-default-check.sh +129 -0
- package/dist/lite/.claude/hooks/multi-tenancy-check.sh +83 -0
- package/dist/lite/.claude/hooks/oo-ad-entry-point-check.sh +216 -0
- package/dist/lite/.claude/hooks/operator-private-path-check.sh +203 -0
- package/dist/lite/.claude/hooks/pattern-annotation-validate.sh +142 -0
- package/dist/lite/.claude/hooks/plain-english-steering.sh +15 -1
- package/dist/lite/.claude/hooks/post-write-trace.sh +66 -0
- package/dist/lite/.claude/hooks/pr-body-scrub-check.sh +446 -0
- package/dist/lite/.claude/hooks/pre-commit-identifier-leak-scrub.sh +137 -0
- package/dist/lite/.claude/hooks/pre-gh-pr-body-scrub.sh +192 -0
- package/dist/lite/.claude/hooks/pre-gh-pr-title-scrub.sh +172 -0
- package/dist/lite/.claude/hooks/role-entry-gate.sh +115 -0
- package/dist/lite/.claude/hooks/save-state.sh +268 -0
- package/dist/lite/.claude/hooks/session-reflection.d/08-settings-drift.sh +8 -1
- package/dist/lite/.claude/hooks/session-reflection.d/10-abrupt-stop-recovery.sh +52 -0
- package/dist/lite/.claude/hooks/session-reflection.d/55-orientation-gate.sh +40 -4
- package/dist/lite/.claude/hooks/session-reflection.d/80-hook-heartbeat-check.sh +12 -5
- package/dist/lite/.claude/hooks/session-reflection.d/81-hook-manifest-staleness.sh +18 -2
- package/dist/lite/.claude/hooks/session-reflection.d/91-npm-version-drift.sh +54 -0
- package/dist/lite/.claude/hooks/session-reflection.d/tests/10-abrupt-stop-recovery.test.sh +95 -0
- package/dist/lite/.claude/hooks/session-reflection.sh +62 -15
- package/dist/lite/.claude/hooks/tool-failure-diagnosis.sh +50 -0
- package/dist/lite/.claude/luminaries/andrej-karpathy.md +165 -0
- package/dist/lite/.claude/luminaries/dave-gray.md +155 -0
- package/dist/lite/.claude/luminaries/gary-klein.md +166 -0
- package/dist/lite/.claude/luminaries/kaoru-ishikawa.md +162 -0
- package/dist/lite/.claude/luminaries/lean-product-canvas.md +33 -0
- package/dist/lite/.claude/luminaries/luke-wroblewski.md +224 -0
- package/dist/lite/.claude/luminaries/ryan-singer.md +113 -0
- package/dist/lite/.claude/luminaries/steve-krug.md +168 -0
- package/dist/lite/.claude/luminaries/tony-ulwick.md +134 -0
- package/dist/lite/.claude/rules/arc-level-orientation-before-leaf.md +60 -0
- package/dist/lite/.claude/rules/architect-review-discipline.md +71 -0
- package/dist/lite/.claude/rules/auto-fix-criteria.md +126 -0
- package/dist/lite/.claude/rules/bassclef-hook-drift-blocker.md +144 -0
- package/dist/lite/.claude/rules/bassclef-models-discovery.md +107 -0
- package/dist/lite/.claude/rules/bassclef-workflow-parity.md +104 -0
- package/dist/lite/.claude/rules/cost-governance.md +154 -0
- package/dist/lite/.claude/rules/file-rename-discipline.md +95 -0
- package/dist/lite/.claude/rules/mechanism-fidelity.md +88 -0
- package/dist/lite/.claude/rules/prototype-production-coupling.md +125 -0
- package/dist/lite/.claude/rules/quick-fix-criteria.md +90 -0
- package/dist/lite/.claude/rules/session-artifacts.md +30 -0
- package/dist/lite/.claude/rules/sibling-smoke-after-substrate-change.md +107 -0
- package/dist/lite/.claude/rules/substrate-as-system.md +67 -0
- package/dist/lite/.claude/rules/usability.md +22 -0
- package/dist/lite/.claude/settings.json +20 -0
- package/dist/lite/.claude/skills/agent-research-spawn/SKILL.md +100 -0
- package/dist/lite/.claude/skills/architect-review/SKILL.md +201 -0
- package/dist/lite/.claude/skills/auto-fix/SKILL.md +297 -0
- package/dist/lite/.claude/skills/autonomous/SKILL.md +300 -0
- package/dist/lite/.claude/skills/bind-subdomain/SKILL.md +232 -0
- package/dist/lite/.claude/skills/canvas/SKILL.md +41 -0
- package/dist/lite/.claude/skills/deploy-prod/SKILL.md +106 -0
- package/dist/lite/.claude/skills/docs-sync/SKILL.md +188 -0
- package/dist/lite/.claude/skills/eisenhower/SKILL.md +273 -0
- package/dist/lite/.claude/skills/empathy-map/SKILL.md +168 -0
- package/dist/lite/.claude/skills/frontend-design/SKILL.md +53 -0
- package/dist/lite/.claude/skills/interview-me/SKILL.md +171 -0
- package/dist/lite/.claude/skills/journal-export/SKILL.md +293 -0
- package/dist/lite/.claude/skills/jtbd-tasks/SKILL.md +203 -0
- package/dist/lite/.claude/skills/objectory-decompose/SKILL.md +256 -0
- package/dist/lite/.claude/skills/pick-luminaries/SKILL.md +100 -0
- package/dist/lite/.claude/skills/pre-mortem/SKILL.md +180 -0
- package/dist/lite/.claude/skills/prototype-gallery/SKILL.md +264 -0
- package/dist/lite/.claude/skills/provision-deploy-host/SKILL.md +257 -0
- package/dist/lite/.claude/skills/quick-fix/SKILL.md +273 -0
- package/dist/lite/.claude/skills/release/SKILL.md +311 -0
- package/dist/lite/.claude/skills/release-notes/SKILL.md +202 -0
- package/dist/lite/.claude/skills/rfc/SKILL.md +222 -0
- package/dist/lite/.claude/skills/riff-prototypes/SKILL.md +637 -0
- package/dist/lite/.claude/skills/secrets-bootstrap/SKILL.md +209 -0
- package/dist/lite/.claude/skills/skill/SKILL.md +304 -0
- package/dist/lite/.claude/skills/smoke-test/SKILL.md +100 -0
- package/dist/lite/.claude/skills/state/SKILL.md +204 -0
- package/dist/lite/.claude/skills/substrate-check/SKILL.md +218 -0
- package/dist/lite/.claude/skills/synthetic-user/SKILL.md +381 -0
- package/dist/lite/.claude/skills/task-scenarios/SKILL.md +105 -0
- package/dist/lite/.claude/skills/tier-dependency-audit/SKILL.md +139 -0
- package/dist/lite/.claude/skills/ux-migration/SKILL.md +424 -0
- package/dist/lite/.claude/skills/value-prop-canvas/SKILL.md +297 -0
- package/dist/lite/README.md +5 -1
- package/dist/lite/gitignore +6 -0
- package/dist/lite/lib/bassclef-dir-resolver.sh +85 -0
- package/dist/lite/lib/clone-failure-classifier.sh +59 -0
- package/dist/lite/lib/fixture-builder.sh +190 -0
- package/dist/lite/lib/fresh-install-check.sh +49 -0
- package/dist/lite/lib/hook-heartbeat.sh +0 -1
- package/dist/lite/lib/mechanism-fidelity.sh +569 -0
- package/dist/lite/lib/npm-version-check.sh +112 -0
- package/dist/lite/lib/preview-state.sh +229 -0
- package/dist/lite/lib/session-rescue.sh +0 -1
- package/dist/lite/scripts/generate-lite-manifest.sh +145 -4
- package/dist/lite/scripts/lite-manifest-drift-check.sh +5 -1
- package/dist/lite/standards/architect-review-discipline.md +222 -0
- package/dist/lite/standards/bassclef-platform.md +249 -0
- package/dist/lite/standards/bassclef-test-repos.md +97 -0
- package/dist/lite/standards/bassclef-wiring-manifest.json +25 -1
- package/dist/lite/standards/cold-adopter-harness.md +205 -0
- package/dist/lite/standards/data-management.md +135 -0
- package/dist/lite/standards/frontend-stack/nextjs-prisma.md +124 -0
- package/dist/lite/standards/lite-manifest-schema-changes.md +27 -0
- package/dist/lite/standards/lite-manifest.json +1456 -14
- package/dist/lite/standards/mechanism-fidelity.md +205 -0
- package/dist/lite/standards/operator-private-discipline.md +200 -0
- package/dist/lite/standards/operator-to-public-flow.md +195 -0
- package/dist/lite/standards/prototype-gallery.md +251 -0
- package/dist/lite/standards/pseudonym-key-schema.md +109 -0
- package/dist/lite/standards/sibling-validation-checklist.md +181 -0
- package/dist/lite/standards/slack-notifications.md +161 -0
- package/dist/lite/standards/synthetic-user-testing.md +173 -0
- package/dist/lite/standards/vendor-bindings.md +165 -0
- package/dist/lite/standards/vendor-plugins/frontend-design.md +66 -0
- package/dist/lite/standards/vpc-fit-validation.md +167 -0
- package/dist/lite/templates/gallery-yml.md +113 -0
- package/dist/lite/templates/product-canvas.md +169 -0
- package/dist/lite/templates/value-prop-canvas.md +180 -0
- package/package.json +12 -5
- /package/dist/lite/{whereami.md → docs/whereami.md} +0 -0
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
---
|
|
2
|
+
tier: lite
|
|
3
|
+
name: docs-sync
|
|
4
|
+
description: "Sync adopter-facing bassclef docs to the GitHub Wiki. Mirrors the bassclef-docs-sync.yml workflow locally. Use when the workflow is wedged or the operator wants a manual full-sync."
|
|
5
|
+
problem: "Adopter-facing bassclef docs drift from source. Wiki gets stale."
|
|
6
|
+
value: "Syncs adopter-facing bassclef docs to the GitHub Wiki. Mirrors the bassclef-docs-sync.yml workflow."
|
|
7
|
+
inputs: [Optional --dry-run flag]
|
|
8
|
+
outputs: [Wiki pages updated, Diff report, Sync log]
|
|
9
|
+
user_invocable: true
|
|
10
|
+
disable_model_invocation: false
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# `/docs-sync` — Operator-invocable wiki sync
|
|
14
|
+
|
|
15
|
+
The `bassclef-docs-sync.yml` workflow fires automatically on push-to-main when allowlisted paths change. This skill is the manual escape hatch: invoke locally to sync the wiki without pushing, or to force a full re-sync when the workflow is stuck.
|
|
16
|
+
|
|
17
|
+
## When to invoke
|
|
18
|
+
|
|
19
|
+
- The bassclef-docs-sync workflow is wedged (rare; surfaces via `80-workflow-staleness.sh` once it's re-armed)
|
|
20
|
+
- Operator wants to validate wiki state without waiting for the next push
|
|
21
|
+
- Doing a force full-sync after wiki was manually reorganized
|
|
22
|
+
- Initial wiki bootstrap (workflow exits clean if wiki not initialized; this skill walks the operator through init)
|
|
23
|
+
|
|
24
|
+
## When NOT to invoke
|
|
25
|
+
|
|
26
|
+
- Routine — let the workflow do its job; don't double-sync
|
|
27
|
+
- Inside an autonomous /longrun (the workflow fires anyway when the step's PR merges)
|
|
28
|
+
- For non-allowlisted files (out of scope; if it should be synced, edit `standards/docs-sync-allowlist.md` and add the path to the workflow)
|
|
29
|
+
|
|
30
|
+
## Procedure
|
|
31
|
+
|
|
32
|
+
### Step 1 — Read the allowlist + confirm scope
|
|
33
|
+
|
|
34
|
+
Read `standards/docs-sync-allowlist.md`. Decide whether this run is:
|
|
35
|
+
- **changed-only** (default): sync files modified since the wiki's `HEAD` commit
|
|
36
|
+
- **full-sync**: sync every allowlisted file regardless of mtime
|
|
37
|
+
|
|
38
|
+
State the choice in agent output before proceeding.
|
|
39
|
+
|
|
40
|
+
### Step 2 — Verify wiki repo exists
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
gh api repos/sunj-labs/bassclef/wiki 2>&1 | head -5
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
If wiki not initialized: stop. Tell operator to open the Wiki tab once on GitHub UI, then re-invoke this skill. Don't attempt to create it via API; the bootstrap requires UI interaction once per repo.
|
|
47
|
+
|
|
48
|
+
### Step 3 — Clone wiki locally
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
git clone https://github.com/sunj-labs/bassclef.wiki.git /tmp/bassclef-wiki
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
If clone fails with auth error, stop. Operator needs to ensure their `gh` is authenticated with `repo` scope.
|
|
55
|
+
|
|
56
|
+
### Step 4 — Identify files to sync
|
|
57
|
+
|
|
58
|
+
For changed-only:
|
|
59
|
+
```bash
|
|
60
|
+
cd /tmp/bassclef-wiki
|
|
61
|
+
LAST_WIKI_COMMIT_TS=$(git log -1 --format=%ct)
|
|
62
|
+
cd $REPO_ROOT
|
|
63
|
+
git log --since="@$LAST_WIKI_COMMIT_TS" --name-only --pretty=format: | sort -u | grep -E "(standards/project-directory-layout|docs/bassclef-mental-model|docs/bassclef-overview|^README|docs/hooks-index|standards/bassclef-source-config|standards/vendor-bindings|architecture/decisions/ADR-|.claude/skills/.*/SKILL|.claude/rules/.*\.md)"
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
For full-sync: enumerate every file matching the allowlist patterns.
|
|
67
|
+
|
|
68
|
+
### Step 5 — Map source paths to wiki page names
|
|
69
|
+
|
|
70
|
+
Mirror the workflow's mapping (see `.github/workflows/bassclef-docs-sync.yml` for the authoritative case statement):
|
|
71
|
+
|
|
72
|
+
| Source | Wiki page |
|
|
73
|
+
|---|---|
|
|
74
|
+
| `standards/project-directory-layout.md` | `Directory-Layout.md` |
|
|
75
|
+
| `docs/bassclef-mental-model.md` | `Mental-Model.md` |
|
|
76
|
+
| `docs/bassclef-overview.md` | `Overview.md` |
|
|
77
|
+
| `README.md` | `Home.md` |
|
|
78
|
+
| `docs/hooks-index.md` | `Hooks-Index.md` |
|
|
79
|
+
| `standards/bassclef-source-config.md` | `Bassclef-Source-Config.md` |
|
|
80
|
+
| `standards/vendor-bindings.md` | `Vendor-Bindings.md` |
|
|
81
|
+
| `architecture/decisions/ADR-NNN-*.md` | `ADR-NNN-*.md` (preserve filename) |
|
|
82
|
+
| `.claude/skills/<name>/SKILL.md` | `Skill-<name>.md` |
|
|
83
|
+
| `.claude/rules/<name>.md` | `Rule-<name>.md` |
|
|
84
|
+
|
|
85
|
+
### Step 6 — Strip frontmatter + write to wiki
|
|
86
|
+
|
|
87
|
+
For each file, strip YAML frontmatter only if present (first line is `---`); otherwise pass through unchanged. Many files (most ADRs, some skills, some rules) start with `# Title` and have no frontmatter — passing them through `awk 'BEGIN{fm=0} /^---$/{fm++; next} fm<2{next} {print}'` produces empty content because `fm` never reaches 2.
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
SRC=$REPO_ROOT/<source>
|
|
91
|
+
DST=/tmp/bassclef-wiki/<wiki-page>
|
|
92
|
+
if head -1 "$SRC" | grep -q '^---$'; then
|
|
93
|
+
awk 'BEGIN{fm=0} /^---$/{fm++; next} fm<2{next} {print}' "$SRC" > "$DST"
|
|
94
|
+
else
|
|
95
|
+
cp "$SRC" "$DST"
|
|
96
|
+
fi
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Step 7 — Commit + push wiki
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
cd /tmp/bassclef-wiki
|
|
103
|
+
git config user.name "operator"
|
|
104
|
+
git config user.email "$(git config --global user.email)"
|
|
105
|
+
git add -A
|
|
106
|
+
git commit -m "docs-sync: manual sync from main@$(cd $REPO_ROOT && git rev-parse --short HEAD)"
|
|
107
|
+
git push
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### Step 8 — Report what synced
|
|
111
|
+
|
|
112
|
+
Output a flash + tweet summary naming each synced file + its wiki page. Operator returns to a scannable list.
|
|
113
|
+
|
|
114
|
+
### Step 9 — Cleanup
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
rm -rf /tmp/bassclef-wiki
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
Stateless skill; no local artifacts persist.
|
|
121
|
+
|
|
122
|
+
## Output format
|
|
123
|
+
|
|
124
|
+
```markdown
|
|
125
|
+
## /docs-sync — [changed-only OR full-sync]
|
|
126
|
+
|
|
127
|
+
**Flash:** [synced N pages | wiki not initialized | no changes detected]
|
|
128
|
+
|
|
129
|
+
**Tweet:** [one-line sharpener about what happened]
|
|
130
|
+
|
|
131
|
+
### Synced
|
|
132
|
+
- source-path → wiki-page-name
|
|
133
|
+
- source-path → wiki-page-name
|
|
134
|
+
|
|
135
|
+
### Skipped (non-allowlisted)
|
|
136
|
+
- source-path — reason
|
|
137
|
+
|
|
138
|
+
### Cross-references (advisory)
|
|
139
|
+
- file-X references file-Y; both synced
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
## Rules
|
|
143
|
+
|
|
144
|
+
- **Never modify wiki content beyond mapped source paths.** If a wiki page exists for a file not in the allowlist, leave it alone — that page was manually authored and isn't bassclef's concern.
|
|
145
|
+
- **Never sync frontmatter.** The frontmatter is parser-targeted metadata, not operator narrative. Strip before writing.
|
|
146
|
+
- **Don't delete wiki pages.** Even if a source file is deleted, leave the wiki page in place. Operator decides whether to delete it via the Wiki UI.
|
|
147
|
+
- **Don't run inside /longrun.** The GHA fires on each step's merge anyway. Manual invocation inside an active /longrun is redundant.
|
|
148
|
+
|
|
149
|
+
## Adopter mode (per bassclef#1265)
|
|
150
|
+
|
|
151
|
+
Adopters that opt in via `.claude/bassclef-configs.jsonc` `wiki_sync.enabled: true` get this skill PLUS a vendored workflow + allowlist. The skill reads the config block at runtime and adapts:
|
|
152
|
+
|
|
153
|
+
- `wiki_sync.enabled: false` (default) — skill warns "wiki_sync disabled in bassclef-configs.jsonc; no sync target. Enable + re-vendor templates first."
|
|
154
|
+
- `wiki_sync.enabled: true` + workflow + allowlist present — skill works as documented above against the adopter's own allowlist
|
|
155
|
+
- `wiki_sync.enabled: true` + workflow missing — skill surfaces BLOCK: "wiki_sync enabled but `.github/workflows/bassclef-docs-sync.yml` not vendored; run /onboard-repo refresh to install."
|
|
156
|
+
|
|
157
|
+
Templates to vendor (one-time per adopter):
|
|
158
|
+
|
|
159
|
+
- `presence/install/bassclef-docs-sync.template.yml` → adopter's `.github/workflows/bassclef-docs-sync.yml`
|
|
160
|
+
- `presence/install/docs-sync-allowlist.template.md` → adopter's `standards/docs-sync-allowlist.md`
|
|
161
|
+
|
|
162
|
+
After vendoring, adopters edit three surfaces in the workflow to match their repo's paths (the `on.push.paths` glob, the Filter step's case-glob, the Sync step's source-path → wiki-page mapping). The allowlist file is the operator-readable source-of-truth alongside.
|
|
163
|
+
|
|
164
|
+
## Composes with
|
|
165
|
+
|
|
166
|
+
- `bassclef-docs-sync.yml` workflow (this skill's authoritative twin)
|
|
167
|
+
- `standards/docs-sync-allowlist.md` (the allowlist contract)
|
|
168
|
+
- `presence/install/bassclef-docs-sync.template.yml` (adopter-vendored workflow per bassclef#1265)
|
|
169
|
+
- `presence/install/docs-sync-allowlist.template.md` (adopter-vendored allowlist seed per bassclef#1265)
|
|
170
|
+
- `.claude/bassclef-configs.jsonc` § `wiki_sync` (config block read at runtime)
|
|
171
|
+
- `.claude/rules/session-artifacts.md` § Wiki-as-we-go discipline (methodology rule the workflow enforces)
|
|
172
|
+
- Future `/hooks` skill (also reads from an allowlist)
|
|
173
|
+
|
|
174
|
+
## Sources read
|
|
175
|
+
|
|
176
|
+
- `.github/workflows/bassclef-docs-sync.yml` — workflow this skill mirrors
|
|
177
|
+
- `standards/docs-sync-allowlist.md` — allowlist contract
|
|
178
|
+
- `docs/iteration-bets/2026-05-13-s3-retirement-docs-sync-hooks-index.md` — parent goal (c-package WU-5)
|
|
179
|
+
- `docs/iteration-bets/2026-06-20b-cold-adopter-mechanism-inheritance.md` — WU-2 of follow-on goal (bassclef#1265 adopter inheritance)
|
|
180
|
+
|
|
181
|
+
## Closes
|
|
182
|
+
|
|
183
|
+
- WU-5 of c-package bet — provides manual fallback when the GHA can't fire
|
|
184
|
+
- WU-2 of bet 2026-06-20b (bassclef#1265) — adds adopter-mode awareness so the skill works for adopters that opt in via `wiki_sync` config
|
|
185
|
+
|
|
186
|
+
## Output discipline
|
|
187
|
+
|
|
188
|
+
Dispatch `/kiss words --rewrite` on your skill output before you return it. See `standards/skill-output-discipline.md` for the contract.
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: eisenhower
|
|
3
|
+
description: "Turn open tickets and PRs into a scored Eisenhower matrix \u2014 do, schedule, delegate, delete. Anchors 'important' to a goal you name first, so the sort has meaning. Two modes: default (current repo) and --cross-repo."
|
|
4
|
+
problem: "Backlog fills with tickets and PRs. Priorities blur. What to do first is unclear."
|
|
5
|
+
value: "Turns open tickets and PRs into a scored Eisenhower matrix \u2014 do or schedule or delegate or delete."
|
|
6
|
+
inputs: [Optional persona ref or launch goal]
|
|
7
|
+
outputs: [4-quadrant matrix, Score per ticket, Recommended pickup order]
|
|
8
|
+
tier: lite
|
|
9
|
+
maturity: alpha
|
|
10
|
+
user_invocable: true
|
|
11
|
+
disable_model_invocation: false
|
|
12
|
+
modes: [default, --cross-repo, --dry-run]
|
|
13
|
+
composes_with: [value-prop, kiss, sprint, longrun, promote, personas]
|
|
14
|
+
depends_on: []
|
|
15
|
+
authoring_luminaries:
|
|
16
|
+
primary:
|
|
17
|
+
- ryan-singer
|
|
18
|
+
- alan-cooper
|
|
19
|
+
- tony-ulwick
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
# /eisenhower
|
|
23
|
+
|
|
24
|
+
## What you get
|
|
25
|
+
|
|
26
|
+
A scored list of your open tickets and PRs. Four buckets. Q1 fires today. Q2 goes on the calendar with a time budget. Q3 items batch up. You automate them or hand them off. Q4 gets closed. The scoring anchors to a goal you name first. No anchor, no score.
|
|
27
|
+
|
|
28
|
+
## When to use it
|
|
29
|
+
|
|
30
|
+
- Sprint planning — you have 50+ open items and need to pick 5
|
|
31
|
+
- Backlog audit — the queue has drifted from any current goal
|
|
32
|
+
- After a strategy pivot — re-score against the new target
|
|
33
|
+
- Before a long solo session — decide what to skip first
|
|
34
|
+
|
|
35
|
+
## When NOT to use
|
|
36
|
+
|
|
37
|
+
- Under 5 open items — the sort adds ceremony without payoff. INSTEAD: pick the top item and start.
|
|
38
|
+
- Emergency prod fire — fix it now, score after. INSTEAD: run `/diagnose` and ship the fix.
|
|
39
|
+
- Group brainstorm — this is a solo scoring pass, not a group tool. INSTEAD: run a workshop with sticky notes.
|
|
40
|
+
- No stated goal — the matrix collapses without an anchor. INSTEAD: run `/state-a-problem` first, then come back.
|
|
41
|
+
|
|
42
|
+
## FAQ
|
|
43
|
+
|
|
44
|
+
### How is this different from just sorting my backlog?
|
|
45
|
+
|
|
46
|
+
Sorting alone tells you nothing about WHY one item ranks higher. This skill anchors the sort to a goal you state first. The same ticket can land in Q2 for "ship v1" and Q4 for "reduce tech debt." Without the anchor, "important" becomes personal taste.
|
|
47
|
+
|
|
48
|
+
### What if I have no stated goal?
|
|
49
|
+
|
|
50
|
+
The skill stops and asks for one. Three shapes work. An active goal from your state file. A persona target. Or a custom sentence like "cut infra bill by half." Silence returns no score.
|
|
51
|
+
|
|
52
|
+
### How does the skill decide urgent vs important?
|
|
53
|
+
|
|
54
|
+
Urgent means: does this block prod, revenue, or a hard deadline? Important means: does this move the stated goal forward? A ticket can be urgent but not important. That is Q3, delegate. Or important but not urgent — Q2, schedule.
|
|
55
|
+
|
|
56
|
+
### Does it write anywhere?
|
|
57
|
+
|
|
58
|
+
Default is read only. It prints the sorted table to your terminal. The `--dry-run` mode is explicit no-write. Optional follow-on: if 5+ items in Q3 share a shape, the skill can propose one `/promote` ticket to automate the class.
|
|
59
|
+
|
|
60
|
+
### What time budget goes on Q2 items?
|
|
61
|
+
|
|
62
|
+
You set it. The skill borrows Ryan Singer's Shape Up rule. Q2 items get a fixed time budget with variable scope. If a Q2 item cannot fit in a fair budget, it is Q4 in disguise. Too big to schedule. Not worth shaping.
|
|
63
|
+
|
|
64
|
+
### Can I re-score without restarting?
|
|
65
|
+
|
|
66
|
+
Yes — call the skill again with a new goal. The frame changes what "important" means. The same tickets can re-sort. Useful when you shift from "polish for launch" to "recover from incident" mid-cycle.
|
|
67
|
+
|
|
68
|
+
## Details below the fold
|
|
69
|
+
|
|
70
|
+
### Step 1 — Anchor the goal
|
|
71
|
+
|
|
72
|
+
The skill prompts you with three shapes:
|
|
73
|
+
|
|
74
|
+
```
|
|
75
|
+
Before I score, name the goal I'm scoring against. Pick one:
|
|
76
|
+
|
|
77
|
+
1. Current in-flight goal — read from your state file if present
|
|
78
|
+
2. Persona target — which user does this cycle's work serve?
|
|
79
|
+
3. Custom sentence — you type it. Examples:
|
|
80
|
+
- "ship v1.0 by end of Q1"
|
|
81
|
+
- "reduce onboarding drop-off from 40% to 20%"
|
|
82
|
+
- "cut infra bill by half"
|
|
83
|
+
|
|
84
|
+
The frame decides what "important" means. A ticket that is Q2 for
|
|
85
|
+
"onboard the first paying customer" may be Q4 for "clean up tech
|
|
86
|
+
debt". Silence here means no score — I stop and ask again.
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
If a state file exists, the skill reads it. Adopters may have `PLAN.md`, `ROADMAP.md`, or a bassclef `docs/whereami.md`. The skill offers the top item as a default. You can accept, override, or type a fresh goal.
|
|
90
|
+
|
|
91
|
+
INSTEAD of moving on without a goal: the skill blocks. Silence at this step returns exit 1.
|
|
92
|
+
|
|
93
|
+
### Step 2 — Pull the work
|
|
94
|
+
|
|
95
|
+
Reads open items from the sources you have:
|
|
96
|
+
|
|
97
|
+
- `gh issue list --state open --limit 200` (current repo default)
|
|
98
|
+
- `gh pr list --state open --limit 100` (current repo default)
|
|
99
|
+
- Under `--cross-repo`, it prompts for the repo list
|
|
100
|
+
- Fallback when `gh` is not authed: reads a paths list you provide
|
|
101
|
+
|
|
102
|
+
Each item captures number, title, labels, age, last activity, and comment count.
|
|
103
|
+
|
|
104
|
+
### Step 3 — Score each item
|
|
105
|
+
|
|
106
|
+
For each item, the skill asks two questions:
|
|
107
|
+
|
|
108
|
+
- **Urgent?** Does this block prod, revenue, security, or a hard deadline in the next 2 weeks?
|
|
109
|
+
- **Important?** Does this move the anchor goal from Step 1 forward?
|
|
110
|
+
|
|
111
|
+
The scoring rule per eisenhowermatrix.com:
|
|
112
|
+
|
|
113
|
+
```
|
|
114
|
+
if (blocks_prod OR blocks_revenue OR hard_deadline_2wk) urgent++;
|
|
115
|
+
if (advances_stated_goal) important++;
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
Quadrant assignment:
|
|
119
|
+
|
|
120
|
+
| Urgent | Important | Quadrant | Action |
|
|
121
|
+
|---|---|---|---|
|
|
122
|
+
| Yes | Yes | Q1 | DO NOW |
|
|
123
|
+
| No | Yes | Q2 | SCHEDULE (with time budget per Ryan Singer) |
|
|
124
|
+
| Yes | No | Q3 | DELEGATE, BATCH, or AUTOMATE |
|
|
125
|
+
| No | No | Q4 | CLOSE — leave off the calendar |
|
|
126
|
+
|
|
127
|
+
One line of rationale per item. Ties get flagged for your review, not split.
|
|
128
|
+
|
|
129
|
+
### Step 4 — Emit the scan table
|
|
130
|
+
|
|
131
|
+
Output format:
|
|
132
|
+
|
|
133
|
+
```
|
|
134
|
+
GOAL: <the anchor you stated at Step 1>
|
|
135
|
+
SCORED: <N> items across <M> repos
|
|
136
|
+
|
|
137
|
+
## Q1 — Do now (X items)
|
|
138
|
+
- #123 — title — <one line why urgent + important>
|
|
139
|
+
- #124 — title — ...
|
|
140
|
+
|
|
141
|
+
## Q2 — Schedule (Y items)
|
|
142
|
+
- #125 — title — time budget: <duration> — <why important>
|
|
143
|
+
|
|
144
|
+
## Q3 — Delegate / batch / automate (Z items collapsed)
|
|
145
|
+
Shape 1: <N items> all doing <shape> — automation candidate
|
|
146
|
+
Shape 2: <M items> all needing <owner> — delegate as a batch
|
|
147
|
+
Individual items: ...
|
|
148
|
+
|
|
149
|
+
## Q4 — Close (W items)
|
|
150
|
+
- #126 — title — 87 days old, no comments — CLOSE with rationale
|
|
151
|
+
- #127 — title — no path to advance the goal — CLOSE
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### Step 5 — Optional follow-on
|
|
155
|
+
|
|
156
|
+
If Q3 surfaces 5+ items in the same shape, the skill offers to draft one `/promote` ticket. That ticket proposes automating the class. You accept, edit, or skip.
|
|
157
|
+
|
|
158
|
+
The skill leaves ticket closure to the operator. All actions need your confirmation.
|
|
159
|
+
|
|
160
|
+
INSTEAD of closing tickets on your behalf: the skill prints Q4 items as hints for your review.
|
|
161
|
+
|
|
162
|
+
### Modes
|
|
163
|
+
|
|
164
|
+
| Mode | What it does |
|
|
165
|
+
|---|---|
|
|
166
|
+
| `default` | Score open items in the current repo |
|
|
167
|
+
| `--cross-repo` | Prompts for repo list, scores across all named repos, unified table |
|
|
168
|
+
| `--dry-run` | Same as default but suppresses the optional `/promote` follow-on offer |
|
|
169
|
+
|
|
170
|
+
## Examples
|
|
171
|
+
|
|
172
|
+
### Input
|
|
173
|
+
|
|
174
|
+
```
|
|
175
|
+
$ /eisenhower
|
|
176
|
+
|
|
177
|
+
Before I score, name the goal I'm scoring against. Pick one:
|
|
178
|
+
> ship v1.0 by end of Q1
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
### Output
|
|
182
|
+
|
|
183
|
+
```
|
|
184
|
+
GOAL: ship v1.0 by end of Q1
|
|
185
|
+
SCORED: 42 items across 1 repo
|
|
186
|
+
|
|
187
|
+
## Q1 — Do now (2 items)
|
|
188
|
+
- #234 — payments fail on Safari — blocks revenue, ships in v1.0 path
|
|
189
|
+
- #241 — auth session leak — security, blocks v1.0 launch
|
|
190
|
+
|
|
191
|
+
## Q2 — Schedule (8 items)
|
|
192
|
+
- #189 — new checkout flow — time budget: 2 weeks — v1.0 core value
|
|
193
|
+
- #198 — landing page rewrite — time budget: 1 week — v1.0 launch surface
|
|
194
|
+
[...]
|
|
195
|
+
|
|
196
|
+
## Q3 — Delegate / batch / automate (12 items collapsed)
|
|
197
|
+
Shape 1: 6 items all "update dependency X" — automation candidate (dependabot)
|
|
198
|
+
Shape 2: 4 items all customer support requests — delegate to support team
|
|
199
|
+
|
|
200
|
+
## Q4 — Close (20 items)
|
|
201
|
+
- #45 — refactor color palette — 127 days old, no comments, unrelated to v1.0
|
|
202
|
+
- #67 — try new logging library — exploration, off the v1.0 path
|
|
203
|
+
[...]
|
|
204
|
+
|
|
205
|
+
5 items in Q3 share the "update dependency" shape. Draft a /promote for
|
|
206
|
+
automation? (y/n)
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
## Anti-patterns and INSTEAD
|
|
210
|
+
|
|
211
|
+
| Anti-pattern | INSTEAD |
|
|
212
|
+
|---|---|
|
|
213
|
+
| Score without an anchor goal — "important" becomes personal taste | Stop and ask for the goal. Silence at Step 1 returns exit 1. |
|
|
214
|
+
| Score against "engineering excellence" or "code quality" — too broad to sort by | Pick a concrete outcome. A launch. A metric. A customer commitment. |
|
|
215
|
+
| Treat every backlog item as Q2 because closing feels wrong | Q4 exists for a reason. Old tickets with no goal-fit go to CLOSE hints. |
|
|
216
|
+
| Auto-close Q4 items on the operator's behalf | The skill only prints hints. Q4 output waits for your review. |
|
|
217
|
+
| Skip the time budget on Q2 items | A Q2 item without a budget is Q4 in disguise. INSTEAD: assign a budget or move it. |
|
|
218
|
+
|
|
219
|
+
## Composes with
|
|
220
|
+
|
|
221
|
+
- `/value-prop` — the anchor goal is often the value prop for a launch or milestone
|
|
222
|
+
- `/kiss` — the output stays plain English; `/kiss words --rewrite` runs on the final table
|
|
223
|
+
- `/sprint` — sprint proposals read the Eisenhower sort to pick the top N items
|
|
224
|
+
- `/longrun` — long-session prep uses quadrant scoring to shape scope options
|
|
225
|
+
- `/promote` — Q3 pattern batches become promote tickets
|
|
226
|
+
- `/personas` — the persona-target shape at Step 1 reads persona files if present
|
|
227
|
+
|
|
228
|
+
## Distinct from
|
|
229
|
+
|
|
230
|
+
- `/sprint` — proposes NEXT WORK based on state; this skill SCORES ALL OPEN WORK by goal fit
|
|
231
|
+
- `/roadmap-reconcile` — reconciles roadmap docs against shipping reality; this skill scores tickets against a goal
|
|
232
|
+
- `/state-a-problem` — drafts a problem statement (an anchor goal input); this skill CONSUMES that anchor
|
|
233
|
+
- `/value-prop` — drafts value proposition prose (an anchor goal input); this skill CONSUMES it
|
|
234
|
+
- Manual backlog grooming — same shape but without the goal anchor, so it drifts into personal taste
|
|
235
|
+
|
|
236
|
+
## Rules
|
|
237
|
+
|
|
238
|
+
- Skill requires a stated goal before scoring. Silence at Step 1 returns exit 1.
|
|
239
|
+
- Skill leaves ticket closure to the operator. Q4 output is a hint for review.
|
|
240
|
+
- Skill stays read-only in default mode. Optional `/promote` follow-on needs explicit "yes."
|
|
241
|
+
- Skill shows the anchor goal at the top of the output. Every reader sees the frame.
|
|
242
|
+
- Skill attaches a one-line rationale per item. Silent quadrant assignment is a bug.
|
|
243
|
+
- Skill treats tickets over 60 days old with no comment activity as strong Q4 hints unless the goal frames them otherwise.
|
|
244
|
+
|
|
245
|
+
## Test cases
|
|
246
|
+
|
|
247
|
+
- **Empty backlog** — 0 open items → output "no items to score" and exit 0
|
|
248
|
+
- **No stated goal** — operator sends empty response at Step 1 → exit 1 with "no score without goal"
|
|
249
|
+
- **All Q1** — 10 items, all urgent + important → output flags "everything cannot be Q1" and asks for a re-score
|
|
250
|
+
- **Goal shift mid-cycle** — same 42 tickets scored against "launch v1" then "recover from incident" → sort differs
|
|
251
|
+
- **Q3 pattern surfacing** — 6 tickets all "update dep X" → skill offers a `/promote` for automation
|
|
252
|
+
- **No `gh` auth** — falls back to paths list from operator; scoring still works
|
|
253
|
+
- **Persona target shape** — operator says "onboarding new users" → skill loads persona file if present, uses persona goal as anchor
|
|
254
|
+
|
|
255
|
+
## Sources read
|
|
256
|
+
|
|
257
|
+
- eisenhowermatrix.com/templates/eisenhower-matrix-for-software-developers — Q1-Q4 shape and scoring rule
|
|
258
|
+
- `.claude/luminaries/ryan-singer.md` — time budget with variable scope for Q2 items
|
|
259
|
+
- `.claude/luminaries/alan-cooper.md` — persona-first anchor for the goal statement
|
|
260
|
+
- `.claude/luminaries/tony-ulwick.md` — outcome baseline for measuring "important"
|
|
261
|
+
- Memory `feedback_eisenhower_test_against_persona_launch.md` — "important" scoped to market goal, not general engineering hygiene
|
|
262
|
+
|
|
263
|
+
## Why this skill exists
|
|
264
|
+
|
|
265
|
+
Every backlog audit collapses without a stated goal. "Important" has no meaning unless anchored. The failure mode is quiet. Operators score tickets by personal taste. Or by engineering aesthetics. Or by whichever conversation happened last. Not by fit to a stated target. The scored list looks clean. It reflects the scorer, not the goal.
|
|
266
|
+
|
|
267
|
+
The Eisenhower matrix is 70 years old. The four quadrants are well known. What operators miss is that the frame decides the sort. A ticket that is Q2 for one goal is Q4 for another. Without the anchor, the matrix ships noise.
|
|
268
|
+
|
|
269
|
+
This skill mechanizes the anchor. Step 1 blocks until you name the goal. The rest runs the sort against that goal. If you shift the goal, you re-run. The matrix stays honest because the anchor stays visible.
|
|
270
|
+
|
|
271
|
+
## Output discipline
|
|
272
|
+
|
|
273
|
+
Dispatch `/kiss words --rewrite` on the final scored table before you return it. See `standards/skill-output-discipline.md` for the contract.
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
---
|
|
2
|
+
tier: lite
|
|
3
|
+
name: empathy-map
|
|
4
|
+
description: "Draft Dave Gray's 7-section empathy map for one persona (Goal, See, Say, Do, Hear, Think and Feel, Pains, Gains). Two modes: light (5 min per band, workshop pace) and deep (15 min per band, research pace). Cite transcript lines."
|
|
5
|
+
problem: "Personas ship without lived context. Downstream product decisions miss what the user sees or feels."
|
|
6
|
+
value: "Dave Gray's 7-section empathy map for one persona. Goal + See + Say + Do + Hear + Think + Pain plus Gain."
|
|
7
|
+
inputs: [A persona name from the personas file]
|
|
8
|
+
outputs: [Empathy map with 7 sections filled, Persona insight anchors]
|
|
9
|
+
user_invocable: true
|
|
10
|
+
disable_model_invocation: false
|
|
11
|
+
modes: [light, deep]
|
|
12
|
+
composes_baseline: [dave-gray, alex-osterwalder]
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# /empathy-map — Persona empathy map (Dave Gray canvas)
|
|
16
|
+
|
|
17
|
+
Draft the empathy map for one persona. Sensor bands (See, Say, Do, Hear) are populated from real interview or observation data. Inference bands (Think and Feel) sit on top of the sensor bands with each inference citing the sensor line it rests on. Pains and Gains close the map.
|
|
18
|
+
|
|
19
|
+
Two modes on a single axis: how much time you have per band.
|
|
20
|
+
|
|
21
|
+
- **light** (default): 5 minutes per band, workshop pace. Good for a solo operator sitting with fresh interview notes and 45 minutes of writing time. Produces a scannable map ready for downstream skills (`/interview-me`, `/lean-canvas`, `/pre-mortem`).
|
|
22
|
+
- **deep**: 15 minutes per band, research pace. Full interview-transcript walkthrough with per-quote timestamps. Produces a research-grade artifact suitable for adopter-persona docs and downstream design decisions.
|
|
23
|
+
|
|
24
|
+
## Sources read
|
|
25
|
+
|
|
26
|
+
- `.claude/luminaries/dave-gray.md` — full luminary with 2017 updated canvas + signature quote + anti-patterns
|
|
27
|
+
- `.claude/luminaries/tony-ulwick.md` — JTBD complement (Ulwick asks WHAT the user is trying to accomplish; Gray asks WHO the user IS while trying)
|
|
28
|
+
- Operator direction 2026-07-07 evening — split empathy-map from `/interview-me` per composability; standalone skill callable from multiple upstreams
|
|
29
|
+
|
|
30
|
+
Note: `.claude/luminaries/alex-osterwalder.md` is declared in `composes_baseline` but has not yet shipped as a full-depth luminary file. When it ships, this skill will read from it for the Value Proposition Design incorporation reference.
|
|
31
|
+
|
|
32
|
+
## Sources used
|
|
33
|
+
|
|
34
|
+
### Dave Gray — Empathy Map Canvas (2017 updated)
|
|
35
|
+
|
|
36
|
+
Seven sections in clockwise order [ref: `.claude/luminaries/dave-gray.md` §Core methods]:
|
|
37
|
+
|
|
38
|
+
1. **Goal** — WHO is the map about + what specific goal or observable behavior
|
|
39
|
+
2. **See** — environmental observations; what the persona sees around them
|
|
40
|
+
3. **Say** — verbatim quotes from interviews or field notes
|
|
41
|
+
4. **Do** — observable actions and behaviors
|
|
42
|
+
5. **Hear** — what others tell the persona (boss, team, market)
|
|
43
|
+
6. **Think and Feel** — inferred cognitive and emotional state; each inference cites a sensor band
|
|
44
|
+
7. **Pains** — frustrations, blockers, measures of failure
|
|
45
|
+
8. **Gains** — desired outcomes, measures of success
|
|
46
|
+
|
|
47
|
+
(The "8 sections" count reflects Pains and Gains as separate bands; Gray's canvas visualizes them as two bottom bands under the central rectangle.)
|
|
48
|
+
|
|
49
|
+
### Alex Osterwalder — Value Proposition Design (2014)
|
|
50
|
+
|
|
51
|
+
The Value Proposition Canvas incorporates the empathy map as the customer-profile half. Jobs / Pains / Gains framing maps directly to Gray's Pains and Gains bands. When `/empathy-map` output feeds `/lean-canvas` or a value-proposition workshop, the Pains and Gains bands become the customer-profile input.
|
|
52
|
+
|
|
53
|
+
## When to use
|
|
54
|
+
|
|
55
|
+
- **You just finished interviews** — synthesize the transcripts before design decisions rot
|
|
56
|
+
- **A design argument is stuck** — the team is arguing "what users want" without evidence; fill the map together and see what surfaces
|
|
57
|
+
- **You're kicking off a new adopter** — pair with `/interview-me` to walk the discovery flow end-to-end
|
|
58
|
+
- **You're running `/pre-mortem` and need a persona-affected-by-failure lens** — fill an empathy map for the user who suffers when the ship goes wrong
|
|
59
|
+
|
|
60
|
+
INSTEAD of running the skill without interview data: interview first. An empathy map filled from imagination is a persona sketch, not a research artifact. Sarah Gibbons at NN/g: "Sparse maps signal more research is owed" — the empty band is the finding.
|
|
61
|
+
|
|
62
|
+
## Procedure
|
|
63
|
+
|
|
64
|
+
### Common to both modes
|
|
65
|
+
|
|
66
|
+
1. **Ask for the Goal** — one sentence: WHO is the map about + what specific outcome anchors the map (e.g., "small-team CTO shipping an internal ops tool in 6 weeks")
|
|
67
|
+
2. **Ask for input source** — pasted interview notes, transcript timestamps, observation log, or "I only have my own knowledge from working with them" (flag this openly and continue with the sensor-band-empty finding)
|
|
68
|
+
3. **Walk sections in clockwise order** — Goal → See → Say → Do → Hear → Think and Feel → Pains → Gains
|
|
69
|
+
4. **Enforce sensor-band-first discipline** — inference bands (Think and Feel) filled AFTER sensor bands carry evidence
|
|
70
|
+
|
|
71
|
+
### Light mode (5 min per band)
|
|
72
|
+
|
|
73
|
+
- Ask 3-5 open-ended questions per sensor band
|
|
74
|
+
- Take operator answers verbatim; capture quotes in Say without paraphrase
|
|
75
|
+
- For Think and Feel, ask "based on what you just wrote in See/Say/Do/Hear, what do you infer about their internal state?" — capture and cite the sensor line
|
|
76
|
+
- For Pains and Gains, ask "what did they name as frustrations?" and "what did they name as measures of success?"
|
|
77
|
+
- Total time: ~45 minutes
|
|
78
|
+
|
|
79
|
+
### Deep mode (15 min per band)
|
|
80
|
+
|
|
81
|
+
- Ask 8-12 open-ended questions per sensor band with follow-up probes ("can you say more about that? what was the context?")
|
|
82
|
+
- For Say, tag each quote with a transcript timestamp or field-note reference
|
|
83
|
+
- For Do, distinguish "observed once" from "observed as a pattern"
|
|
84
|
+
- For Think and Feel, require every inference to cite the specific sensor line(s) it rests on
|
|
85
|
+
- For Pains and Gains, distinguish "named by the persona" from "inferred by the researcher" — mark the difference
|
|
86
|
+
- Total time: ~2 hours
|
|
87
|
+
|
|
88
|
+
## Output
|
|
89
|
+
|
|
90
|
+
Structured markdown artifact saved at `docs/personas/<slug>-empathy-map.md`:
|
|
91
|
+
|
|
92
|
+
```markdown
|
|
93
|
+
---
|
|
94
|
+
persona_slug: small-team-cto
|
|
95
|
+
goal: "Ship a working ops tool in 6 weeks that the team actually uses."
|
|
96
|
+
input_source: "45-min interview 2026-07-07; transcript at docs/interviews/2026-07-07-cto.md"
|
|
97
|
+
mode: light
|
|
98
|
+
date: 2026-07-07
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
# Empathy map — small-team CTO
|
|
102
|
+
|
|
103
|
+
## Goal
|
|
104
|
+
Ship a working ops tool in 6 weeks that the team actually uses.
|
|
105
|
+
|
|
106
|
+
## See
|
|
107
|
+
- Open-plan office; other engineers' screens visible all day
|
|
108
|
+
- Slack messages piling up during focus blocks
|
|
109
|
+
- Ops team using a spreadsheet for the current process
|
|
110
|
+
|
|
111
|
+
## Say
|
|
112
|
+
- "We ship Friday." [interview 12:34]
|
|
113
|
+
- "I keep watching other CTOs move faster with worse code." [interview 22:10]
|
|
114
|
+
|
|
115
|
+
## Do
|
|
116
|
+
- Opens sandbox at start of every workday
|
|
117
|
+
- Reviews yesterday's shipping metrics before standup
|
|
118
|
+
- Deploys 3-5 times per day
|
|
119
|
+
|
|
120
|
+
## Hear
|
|
121
|
+
- Team asks for X
|
|
122
|
+
- PM asks for Y
|
|
123
|
+
- Board asks for Z (three demands often conflict)
|
|
124
|
+
|
|
125
|
+
## Think and Feel
|
|
126
|
+
- Worries the team will hit rate limits mid-quarter [inferred from Say 22:10 + Hear "board asks for Z"]
|
|
127
|
+
- Feels responsible for both technical and product direction [inferred from Do "deploys 3-5 times per day" + Hear "PM asks for Y"]
|
|
128
|
+
|
|
129
|
+
## Pains
|
|
130
|
+
- Every new tool requires an onboarding session; loses 2 days per new hire (named)
|
|
131
|
+
- Watches other CTOs ship faster with worse code (named)
|
|
132
|
+
|
|
133
|
+
## Gains
|
|
134
|
+
- Wants team velocity to compound (named)
|
|
135
|
+
- Wants to spend more time on architecture and less on triage (named)
|
|
136
|
+
- Wants tools that work on day one (named)
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
## Called by
|
|
140
|
+
|
|
141
|
+
`/empathy-map` is a leaf skill. Larger skills call it as a step:
|
|
142
|
+
|
|
143
|
+
- `/interview-me` — Step 3 (empathy map fills pains/gains/needs from interview data)
|
|
144
|
+
- `/lean-canvas` — customer-segment and problem boxes read from Pains and Gains
|
|
145
|
+
- `/pre-mortem` — persona-affected-by-failure lens uses this map to imagine who suffers when the ship goes wrong
|
|
146
|
+
- `/personas` (if it exists) — the empathy map is the underlying research shape for an adopter-persona doc
|
|
147
|
+
|
|
148
|
+
## Anti-patterns it prevents
|
|
149
|
+
|
|
150
|
+
Per `.claude/luminaries/dave-gray.md` §Anti-patterns:
|
|
151
|
+
|
|
152
|
+
- **Fiction in the Say band** — skill refuses to write in Say without a transcript or field-note reference. INSTEAD: if operator supplies none, the band stays empty and the emptiness is flagged as the finding.
|
|
153
|
+
- **"I know the user" skip** — light mode default asks operator to write down tacit knowledge in the sensor bands. INSTEAD of skipping: if the writing surfaces claims operator cannot cite, that IS the finding.
|
|
154
|
+
- **Persona-mapping without interviews** — if operator names "I have not interviewed this persona." INSTEAD: skill produces sensor bands marked "research needed" and downstream skills read the flag.
|
|
155
|
+
- **Inference-only maps** — Think and Feel section requires sensor-band citations. INSTEAD of filling inference first: fill sensor bands from observation; then infer with each inference citing the sensor evidence it rests on.
|
|
156
|
+
|
|
157
|
+
## Refs
|
|
158
|
+
|
|
159
|
+
- Ticket #657 — this skill's filing
|
|
160
|
+
- Ticket #653 — `/interview-me` (composes with this skill)
|
|
161
|
+
- Ticket #655 — `/pre-mortem` (may compose with this skill)
|
|
162
|
+
- Bet 2026-07-07a — this skill's ship vehicle
|
|
163
|
+
- Luminary file `.claude/luminaries/dave-gray.md` — full-depth anchor
|
|
164
|
+
- Rule `.claude/rules/skill-composition-declarations.md` — the composability discipline this skill honors
|
|
165
|
+
|
|
166
|
+
## Output discipline
|
|
167
|
+
|
|
168
|
+
Dispatch `/kiss words --rewrite` on your skill output before you return it. See `standards/skill-output-discipline.md` for the contract.
|