@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.
Files changed (135) hide show
  1. package/dist/cli.cjs +258 -63
  2. package/dist/cli.js +258 -63
  3. package/dist/index.cjs +1 -1
  4. package/dist/index.d.ts +1 -1
  5. package/dist/index.js +1 -1
  6. package/dist/lite/.claude/bassclef-configs.jsonc +56 -0
  7. package/dist/lite/.claude/bassclef-orientation.md +120 -0
  8. package/dist/lite/.claude/hooks/adr-discipline-check.sh +132 -0
  9. package/dist/lite/.claude/hooks/atomic-pr-check.sh +169 -0
  10. package/dist/lite/.claude/hooks/auto-save-idle.sh +51 -0
  11. package/dist/lite/.claude/hooks/bassclef-sync.sh +51 -13
  12. package/dist/lite/.claude/hooks/bet-doc-gate.sh +283 -0
  13. package/dist/lite/.claude/hooks/bug-diagnosis.sh +64 -0
  14. package/dist/lite/.claude/hooks/destructive-command-guard.sh +136 -0
  15. package/dist/lite/.claude/hooks/file-rename-discipline-check.sh +147 -0
  16. package/dist/lite/.claude/hooks/hook-classifier-canary.sh +158 -0
  17. package/dist/lite/.claude/hooks/kiss-default-check.sh +129 -0
  18. package/dist/lite/.claude/hooks/multi-tenancy-check.sh +83 -0
  19. package/dist/lite/.claude/hooks/oo-ad-entry-point-check.sh +216 -0
  20. package/dist/lite/.claude/hooks/operator-private-path-check.sh +203 -0
  21. package/dist/lite/.claude/hooks/pattern-annotation-validate.sh +142 -0
  22. package/dist/lite/.claude/hooks/plain-english-steering.sh +15 -1
  23. package/dist/lite/.claude/hooks/post-write-trace.sh +66 -0
  24. package/dist/lite/.claude/hooks/pr-body-scrub-check.sh +446 -0
  25. package/dist/lite/.claude/hooks/pre-commit-identifier-leak-scrub.sh +137 -0
  26. package/dist/lite/.claude/hooks/pre-gh-pr-body-scrub.sh +192 -0
  27. package/dist/lite/.claude/hooks/pre-gh-pr-title-scrub.sh +172 -0
  28. package/dist/lite/.claude/hooks/role-entry-gate.sh +115 -0
  29. package/dist/lite/.claude/hooks/save-state.sh +268 -0
  30. package/dist/lite/.claude/hooks/session-reflection.d/08-settings-drift.sh +8 -1
  31. package/dist/lite/.claude/hooks/session-reflection.d/10-abrupt-stop-recovery.sh +52 -0
  32. package/dist/lite/.claude/hooks/session-reflection.d/55-orientation-gate.sh +40 -4
  33. package/dist/lite/.claude/hooks/session-reflection.d/80-hook-heartbeat-check.sh +12 -5
  34. package/dist/lite/.claude/hooks/session-reflection.d/81-hook-manifest-staleness.sh +18 -2
  35. package/dist/lite/.claude/hooks/session-reflection.d/91-npm-version-drift.sh +54 -0
  36. package/dist/lite/.claude/hooks/session-reflection.d/tests/10-abrupt-stop-recovery.test.sh +95 -0
  37. package/dist/lite/.claude/hooks/session-reflection.sh +62 -15
  38. package/dist/lite/.claude/hooks/tool-failure-diagnosis.sh +50 -0
  39. package/dist/lite/.claude/luminaries/andrej-karpathy.md +165 -0
  40. package/dist/lite/.claude/luminaries/dave-gray.md +155 -0
  41. package/dist/lite/.claude/luminaries/gary-klein.md +166 -0
  42. package/dist/lite/.claude/luminaries/kaoru-ishikawa.md +162 -0
  43. package/dist/lite/.claude/luminaries/lean-product-canvas.md +33 -0
  44. package/dist/lite/.claude/luminaries/luke-wroblewski.md +224 -0
  45. package/dist/lite/.claude/luminaries/ryan-singer.md +113 -0
  46. package/dist/lite/.claude/luminaries/steve-krug.md +168 -0
  47. package/dist/lite/.claude/luminaries/tony-ulwick.md +134 -0
  48. package/dist/lite/.claude/rules/arc-level-orientation-before-leaf.md +60 -0
  49. package/dist/lite/.claude/rules/architect-review-discipline.md +71 -0
  50. package/dist/lite/.claude/rules/auto-fix-criteria.md +126 -0
  51. package/dist/lite/.claude/rules/bassclef-hook-drift-blocker.md +144 -0
  52. package/dist/lite/.claude/rules/bassclef-models-discovery.md +107 -0
  53. package/dist/lite/.claude/rules/bassclef-workflow-parity.md +104 -0
  54. package/dist/lite/.claude/rules/cost-governance.md +154 -0
  55. package/dist/lite/.claude/rules/file-rename-discipline.md +95 -0
  56. package/dist/lite/.claude/rules/mechanism-fidelity.md +88 -0
  57. package/dist/lite/.claude/rules/prototype-production-coupling.md +125 -0
  58. package/dist/lite/.claude/rules/quick-fix-criteria.md +90 -0
  59. package/dist/lite/.claude/rules/session-artifacts.md +30 -0
  60. package/dist/lite/.claude/rules/sibling-smoke-after-substrate-change.md +107 -0
  61. package/dist/lite/.claude/rules/substrate-as-system.md +67 -0
  62. package/dist/lite/.claude/rules/usability.md +22 -0
  63. package/dist/lite/.claude/settings.json +20 -0
  64. package/dist/lite/.claude/skills/agent-research-spawn/SKILL.md +100 -0
  65. package/dist/lite/.claude/skills/architect-review/SKILL.md +201 -0
  66. package/dist/lite/.claude/skills/auto-fix/SKILL.md +297 -0
  67. package/dist/lite/.claude/skills/autonomous/SKILL.md +300 -0
  68. package/dist/lite/.claude/skills/bind-subdomain/SKILL.md +232 -0
  69. package/dist/lite/.claude/skills/canvas/SKILL.md +41 -0
  70. package/dist/lite/.claude/skills/deploy-prod/SKILL.md +106 -0
  71. package/dist/lite/.claude/skills/docs-sync/SKILL.md +188 -0
  72. package/dist/lite/.claude/skills/eisenhower/SKILL.md +273 -0
  73. package/dist/lite/.claude/skills/empathy-map/SKILL.md +168 -0
  74. package/dist/lite/.claude/skills/frontend-design/SKILL.md +53 -0
  75. package/dist/lite/.claude/skills/interview-me/SKILL.md +171 -0
  76. package/dist/lite/.claude/skills/journal-export/SKILL.md +293 -0
  77. package/dist/lite/.claude/skills/jtbd-tasks/SKILL.md +203 -0
  78. package/dist/lite/.claude/skills/objectory-decompose/SKILL.md +256 -0
  79. package/dist/lite/.claude/skills/pick-luminaries/SKILL.md +100 -0
  80. package/dist/lite/.claude/skills/pre-mortem/SKILL.md +180 -0
  81. package/dist/lite/.claude/skills/prototype-gallery/SKILL.md +264 -0
  82. package/dist/lite/.claude/skills/provision-deploy-host/SKILL.md +257 -0
  83. package/dist/lite/.claude/skills/quick-fix/SKILL.md +273 -0
  84. package/dist/lite/.claude/skills/release/SKILL.md +311 -0
  85. package/dist/lite/.claude/skills/release-notes/SKILL.md +202 -0
  86. package/dist/lite/.claude/skills/rfc/SKILL.md +222 -0
  87. package/dist/lite/.claude/skills/riff-prototypes/SKILL.md +637 -0
  88. package/dist/lite/.claude/skills/secrets-bootstrap/SKILL.md +209 -0
  89. package/dist/lite/.claude/skills/skill/SKILL.md +304 -0
  90. package/dist/lite/.claude/skills/smoke-test/SKILL.md +100 -0
  91. package/dist/lite/.claude/skills/state/SKILL.md +204 -0
  92. package/dist/lite/.claude/skills/substrate-check/SKILL.md +218 -0
  93. package/dist/lite/.claude/skills/synthetic-user/SKILL.md +381 -0
  94. package/dist/lite/.claude/skills/task-scenarios/SKILL.md +105 -0
  95. package/dist/lite/.claude/skills/tier-dependency-audit/SKILL.md +139 -0
  96. package/dist/lite/.claude/skills/ux-migration/SKILL.md +424 -0
  97. package/dist/lite/.claude/skills/value-prop-canvas/SKILL.md +297 -0
  98. package/dist/lite/README.md +5 -1
  99. package/dist/lite/gitignore +6 -0
  100. package/dist/lite/lib/bassclef-dir-resolver.sh +85 -0
  101. package/dist/lite/lib/clone-failure-classifier.sh +59 -0
  102. package/dist/lite/lib/fixture-builder.sh +190 -0
  103. package/dist/lite/lib/fresh-install-check.sh +49 -0
  104. package/dist/lite/lib/hook-heartbeat.sh +0 -1
  105. package/dist/lite/lib/mechanism-fidelity.sh +569 -0
  106. package/dist/lite/lib/npm-version-check.sh +112 -0
  107. package/dist/lite/lib/preview-state.sh +229 -0
  108. package/dist/lite/lib/session-rescue.sh +0 -1
  109. package/dist/lite/scripts/generate-lite-manifest.sh +145 -4
  110. package/dist/lite/scripts/lite-manifest-drift-check.sh +5 -1
  111. package/dist/lite/standards/architect-review-discipline.md +222 -0
  112. package/dist/lite/standards/bassclef-platform.md +249 -0
  113. package/dist/lite/standards/bassclef-test-repos.md +97 -0
  114. package/dist/lite/standards/bassclef-wiring-manifest.json +25 -1
  115. package/dist/lite/standards/cold-adopter-harness.md +205 -0
  116. package/dist/lite/standards/data-management.md +135 -0
  117. package/dist/lite/standards/frontend-stack/nextjs-prisma.md +124 -0
  118. package/dist/lite/standards/lite-manifest-schema-changes.md +27 -0
  119. package/dist/lite/standards/lite-manifest.json +1456 -14
  120. package/dist/lite/standards/mechanism-fidelity.md +205 -0
  121. package/dist/lite/standards/operator-private-discipline.md +200 -0
  122. package/dist/lite/standards/operator-to-public-flow.md +195 -0
  123. package/dist/lite/standards/prototype-gallery.md +251 -0
  124. package/dist/lite/standards/pseudonym-key-schema.md +109 -0
  125. package/dist/lite/standards/sibling-validation-checklist.md +181 -0
  126. package/dist/lite/standards/slack-notifications.md +161 -0
  127. package/dist/lite/standards/synthetic-user-testing.md +173 -0
  128. package/dist/lite/standards/vendor-bindings.md +165 -0
  129. package/dist/lite/standards/vendor-plugins/frontend-design.md +66 -0
  130. package/dist/lite/standards/vpc-fit-validation.md +167 -0
  131. package/dist/lite/templates/gallery-yml.md +113 -0
  132. package/dist/lite/templates/product-canvas.md +169 -0
  133. package/dist/lite/templates/value-prop-canvas.md +180 -0
  134. package/package.json +12 -5
  135. /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.