@heart-of-gold/toolkit 0.1.43 → 0.1.45
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/.claude-plugin/marketplace.json +1 -1
- package/README.md +5 -4
- package/package.json +1 -1
- package/plugins/deep-thought/.claude-plugin/plugin.json +1 -1
- package/plugins/deep-thought/README.md +4 -1
- package/plugins/deep-thought/knowledge/strategy-dashboard-spec.md +160 -0
- package/plugins/deep-thought/skills/improbable-futures/SKILL.md +513 -0
- package/plugins/guide/.claude-plugin/plugin.json +1 -1
- package/plugins/guide/scripts/fetch-anthropic-news.py +163 -0
- package/plugins/guide/scripts/run-pipeline-fetch.sh +7 -1
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> **Don't Panic.**
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
32 skills for AI coding agents. Five plugins. Works with **Claude Code, Codex, OpenCode, Pi**, and any tool supporting the [agentskills.io](https://agentskills.io) standard. Named after *The Hitchhiker's Guide to the Galaxy* because the universe is absurd and your tools should at least have personality.
|
|
6
6
|
|
|
7
7
|
## Installation
|
|
8
8
|
|
|
@@ -79,11 +79,11 @@ Treat skills and helper scripts as executable automation, not passive text. Revi
|
|
|
79
79
|
|
|
80
80
|
### [Deep Thought](plugins/deep-thought/) — The Answer Computer
|
|
81
81
|
|
|
82
|
-
|
|
82
|
+
Ten ways to think clearly about hard problems.
|
|
83
83
|
|
|
84
|
-
Brainstorm before you plan. Plan before you build. Investigate when something breaks. Review when it ships. And when the stakes are high, simulate an expert panel that argues with itself until the right answer falls out.
|
|
84
|
+
Brainstorm before you plan. Plan before you build. Investigate when something breaks. Review when it ships. Map where it could go when you can't see the futures yet. And when the stakes are high, simulate an expert panel that argues with itself until the right answer falls out.
|
|
85
85
|
|
|
86
|
-
|
|
86
|
+
10 skills · 9 agents · 16 knowledge files
|
|
87
87
|
|
|
88
88
|
```
|
|
89
89
|
/deep-thought:brainstorm # explore before committing
|
|
@@ -95,6 +95,7 @@ Brainstorm before you plan. Plan before you build. Investigate when something br
|
|
|
95
95
|
/deep-thought:architecture-review # failure modes, scaling, ADRs
|
|
96
96
|
/deep-thought:cto # strategic CTO advisor (grounded in the leadership canon)
|
|
97
97
|
/deep-thought:craft-skill # meta: generate SKILL.md files
|
|
98
|
+
/deep-thought:improbable-futures # product cartography — three lovable futures + visual map
|
|
98
99
|
```
|
|
99
100
|
|
|
100
101
|
### [Marvin](plugins/marvin/) — The Paranoid Android
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
> "The Answer to the Great Question... Of Life, the Universe and Everything... Is... Forty-two."
|
|
4
4
|
> But the question matters more. That's what this plugin is for.
|
|
5
5
|
|
|
6
|
-
A reasoning plugin for Claude Code.
|
|
6
|
+
A reasoning plugin for Claude Code. Ten skills for thinking clearly about hard problems — from early-stage brainstorming through architectural review and strategic CTO decisions.
|
|
7
7
|
|
|
8
8
|
## Skills
|
|
9
9
|
|
|
@@ -39,6 +39,9 @@ Strategic CTO advisor grounded in the leadership canon (Larson, Fournier, Majors
|
|
|
39
39
|
### `/deep-thought:craft-skill`
|
|
40
40
|
Meta-skill — generates and refines SKILL.md files for Claude Code. Use it to create new skills with proper structure, boundaries, and validation criteria.
|
|
41
41
|
|
|
42
|
+
### `/deep-thought:improbable-futures`
|
|
43
|
+
Product cartography for any project. Reads current state, sketches three lovable futures worth chasing — each with a named user's love-letter from six months ahead, the capability that future demands, and the first moves toward it. Adds wild-card branches and hands off to `/babel-fish:visualize` for the visual map.
|
|
44
|
+
|
|
42
45
|
## Agents
|
|
43
46
|
|
|
44
47
|
Nine specialized agents available for subagent delegation:
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
# Strategy Dashboard Spec
|
|
2
|
+
|
|
3
|
+
Reference for `/deep-thought:improbable-futures` Phase 5h (structured data in output frontmatter) and Phase 8 (visual brief passed to `/babel-fish:visualize`). Extracted from the SKILL.md to keep the skill file under the 500-line threshold.
|
|
4
|
+
|
|
5
|
+
The skill file references this knowledge; the skill does not work without it. Do not delete without updating the SKILL.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Why this exists
|
|
10
|
+
|
|
11
|
+
`/babel-fish:visualize` is a generalist designer. Without explicit direction, it produces "prose with one decorative SVG" and the strategic argument stays locked in paragraphs. The structured data blocks below give the visualizer the raw material for real visual components; the visual brief below tells it exactly what to build.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Structured data blocks (Phase 5h output frontmatter)
|
|
16
|
+
|
|
17
|
+
The skill's output markdown must carry four YAML blocks in the frontmatter. These are machine-readable — visualizers scan them to build components.
|
|
18
|
+
|
|
19
|
+
### `comparison_dimensions` — the scannable matrix
|
|
20
|
+
|
|
21
|
+
4–6 dimensions × 3 futures. Each cell is one short phrase. This is the single most important visual in the artifact — it lets a reader scan the strategic shape of all three futures in ~10 seconds.
|
|
22
|
+
|
|
23
|
+
**Dimensions must reveal tradeoffs, not describe features.** Good: "Identity you become." "What you leave behind." "What this kills." Bad: "Has a CLI." "Uses Python." "Pricing tiers available."
|
|
24
|
+
|
|
25
|
+
```yaml
|
|
26
|
+
comparison_dimensions:
|
|
27
|
+
- name: "Identity you become"
|
|
28
|
+
future_1: "Software vendor"
|
|
29
|
+
future_2: "Embedded consultant"
|
|
30
|
+
future_3: "Standards author"
|
|
31
|
+
- name: "Revenue model"
|
|
32
|
+
future_1: "Org-layer licensing"
|
|
33
|
+
future_2: "€60k × 6 residencies/year"
|
|
34
|
+
future_3: "Books, talks, reputation"
|
|
35
|
+
- name: "What you leave behind"
|
|
36
|
+
future_1: "A daemon that runs without you"
|
|
37
|
+
future_2: "A customised harness in one codebase"
|
|
38
|
+
future_3: "A spec other people teach from"
|
|
39
|
+
- name: "What this kills"
|
|
40
|
+
future_1: "Workshops, residency, claim to own the spec"
|
|
41
|
+
future_2: "Daemon, scaling, canonical authorship"
|
|
42
|
+
future_3: "Brand dominance, premium-vendor identity"
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### `timeline_waypoints` — per-future journey
|
|
46
|
+
|
|
47
|
+
3–4 waypoints per future from "now" to 6 months. Each waypoint is a specific move at a specific time. These power the side-by-side journey timeline visuals.
|
|
48
|
+
|
|
49
|
+
Waypoints are directions, not milestones. "Ship harness verify MVP" — good. "Sprint 1: scope MVP" — bad.
|
|
50
|
+
|
|
51
|
+
```yaml
|
|
52
|
+
timeline_waypoints:
|
|
53
|
+
future_1:
|
|
54
|
+
- { when: "Week 2", move: "Ship harness verify CLI to 3 trusted engineers" }
|
|
55
|
+
- { when: "Week 6", move: "Three skills live" }
|
|
56
|
+
- { when: "Month 3", move: "Cancel remaining workshops" }
|
|
57
|
+
- { when: "Month 6", move: "Petr's letter arrives" }
|
|
58
|
+
future_2: [ ... ]
|
|
59
|
+
future_3: [ ... ]
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### `research_timing` — the urgency visual
|
|
63
|
+
|
|
64
|
+
Dated events in the category plus the "YOU ARE HERE" pin and the "WINDOW CLOSES" marker. This makes the timing argument *visible* rather than buried in thesis prose.
|
|
65
|
+
|
|
66
|
+
The YOU ARE HERE and WINDOW CLOSES markers are mandatory. Without them, the urgency is implicit rather than visual.
|
|
67
|
+
|
|
68
|
+
```yaml
|
|
69
|
+
research_timing:
|
|
70
|
+
- { date: "2025-07", source: "Manus", event: "Context Engineering for AI Agents" }
|
|
71
|
+
- { date: "2025-09", source: "Anthropic", event: "Effective Context Engineering" }
|
|
72
|
+
- { date: "2026-04-02", source: "Böckeler", event: "Harness Engineering defined" }
|
|
73
|
+
- { date: "2026-04-15", source: "ThoughtWorks Radar", event: "Cognitive Debt named" }
|
|
74
|
+
- { date: "2026-04-16", source: "YOU ARE HERE", event: "This map" }
|
|
75
|
+
- { date: "2027-04", source: "WINDOW CLOSES", event: "Spec-maintainer position claimed by someone" }
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### `naming_landscape` — competing frames (optional)
|
|
79
|
+
|
|
80
|
+
Positions competing terms/vocabularies against each other so the reader can see where this project's claim fits. Include when the category is mid-naming-fight; skip when the category's vocabulary is settled.
|
|
81
|
+
|
|
82
|
+
```yaml
|
|
83
|
+
naming_landscape:
|
|
84
|
+
- term: "context engineering"
|
|
85
|
+
backers: ["Anthropic", "Manus"]
|
|
86
|
+
scope: "What goes into the model — tokens, memory, tools"
|
|
87
|
+
position: "narrower"
|
|
88
|
+
- term: "harness engineering"
|
|
89
|
+
backers: ["Böckeler / Fowler", "harness-lab claim"]
|
|
90
|
+
scope: "The full loop — context PLUS verification PLUS workflow"
|
|
91
|
+
position: "wider — operationalises context engineering"
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### `visual_brief` — the directive header
|
|
95
|
+
|
|
96
|
+
Lists required components so the visualizer knows what to build.
|
|
97
|
+
|
|
98
|
+
```yaml
|
|
99
|
+
visual_brief:
|
|
100
|
+
artifact_family: "strategy-dashboard"
|
|
101
|
+
primary_components:
|
|
102
|
+
- "comparison_matrix"
|
|
103
|
+
- "journey_timelines"
|
|
104
|
+
- "urgency_timeline"
|
|
105
|
+
- "naming_landscape"
|
|
106
|
+
secondary_components:
|
|
107
|
+
- "strategy_thesis_hero"
|
|
108
|
+
- "letter_cards"
|
|
109
|
+
- "agent_command_ctas"
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## The visual brief — pass verbatim to `/babel-fish:visualize`
|
|
115
|
+
|
|
116
|
+
> Treat this as a strategy dashboard, not a stylised document. The source markdown carries a `visual_brief` frontmatter listing required visual components and structured data blocks (`comparison_dimensions`, `timeline_waypoints`, `research_timing`, `naming_landscape`) that supply the data those components need.
|
|
117
|
+
>
|
|
118
|
+
> Implement each primary component as a distinct visual object with real visual weight — at least 4 prose-free or prose-light components above the fold:
|
|
119
|
+
>
|
|
120
|
+
> 1. **Comparison matrix** — render `comparison_dimensions` as a scannable 3-column × N-row grid at the top of the page. Use color/chips/spacing per cell so a reader can compare across futures in 10 seconds. Not a wall of text. This is the single most important visual on the page.
|
|
121
|
+
> 2. **Journey timelines** — render `timeline_waypoints` as three side-by-side vertical timelines, each with date markers and one-line moves. Visual rhythm matters more than detail.
|
|
122
|
+
> 3. **Urgency timeline** — render `research_timing` as a **vertical** timeline with one event per row (date column + label column). Do not use horizontal timelines with absolute-positioned labels — they collide whenever events cluster within a few weeks. The "YOU ARE HERE" row gets a larger, accent-coloured pin. The "WINDOW CLOSES" row gets the danger colour.
|
|
123
|
+
> 4. **Naming landscape** (when present) — render `naming_landscape` as a position map showing where the project's claim fits among competing terms.
|
|
124
|
+
>
|
|
125
|
+
> Secondary components: render love-letters as styled letter objects (with date, signature, mild paper texture) — not as blockquotes. Render agent-commands as primary CTAs per future, distinctly stylised, copy-able.
|
|
126
|
+
>
|
|
127
|
+
> Anti-goals: do not produce a document with one SVG at top. Do not put the comparison matrix as bullet points. Do not let prose dominate the layout. The 10-second-scan test: a reader should see the strategic shape (three futures, their key differences, the timing pressure) without reading any paragraph.
|
|
128
|
+
>
|
|
129
|
+
> Use the agent-authored HTML path. Do not delegate the whole job to the smart-render fallback.
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## UI quality rules — non-negotiable
|
|
134
|
+
|
|
135
|
+
These rules exist because past runs failed on each one.
|
|
136
|
+
|
|
137
|
+
- **Label collisions are bugs, not aesthetics.** If two text labels could overlap at any common viewport (1024 / 1280 / 1440 / 1920px wide), the layout is wrong. Default to vertical layouts for any timeline with ≥4 events or any cluster of events within 8% of axis distance.
|
|
138
|
+
- **Absolute positioning is a smell on dense data.** Prefer flex/grid layouts that auto-space. Use absolute positioning only when the visual semantics demand it (e.g., a 2D scatter plot) AND when label collision is mathematically impossible.
|
|
139
|
+
- **Every interactive component must work at 760px wide.** Test mentally: stacked single-column on mobile, multi-column on desktop. Add `@media (max-width: 760px)` collapses for every grid.
|
|
140
|
+
- **Long labels must wrap or truncate predictably.** No `white-space: nowrap` on labels longer than 30 characters unless you've measured the available space.
|
|
141
|
+
- **Color-coded futures must keep their colour everywhere.** Future 1 = accent (purple in default theme). Future 2 = accent-2 (teal). Future 3 = accent-3 (amber). Use these consistently across matrix, timelines, letters, CTAs.
|
|
142
|
+
- **The danger colour is reserved for "what this kills" / "deadline" / "risk."** Do not use it decoratively.
|
|
143
|
+
- **No more than one hero-scale element above the fold.** The thesis hero IS that element. The comparison matrix can be visually heavy but must not compete for primacy.
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## Browser self-verification (when tools allow)
|
|
148
|
+
|
|
149
|
+
If the agent executing the skill has Chrome / browser tooling available (e.g., `mcp__claude-in-chrome__*`, `mcp__plugin_chrome-devtools-mcp_chrome-devtools__*`, Playwright, or equivalent), use it to verify the published artifact before declaring success.
|
|
150
|
+
|
|
151
|
+
After publishing, navigate to the published URL and:
|
|
152
|
+
|
|
153
|
+
1. **Take a full-page screenshot at 1440px viewport.** Inspect for: overlapping text, broken grid alignment, wild whitespace gaps, components that render as raw markdown, missing visual elements from the brief.
|
|
154
|
+
2. **Take a second screenshot at 760px viewport.** Inspect for: horizontal scroll, broken stacking, illegible text, cramped components.
|
|
155
|
+
3. **If issues found:** describe the issue in one sentence, edit the artifact HTML, republish, re-verify. Cap iterations at 3 — beyond that, surface to the user with screenshots and ask for direction.
|
|
156
|
+
4. **If clean:** report the URL to the user with a one-line verification note ("verified at 1440px and 760px — no collisions, all components render").
|
|
157
|
+
|
|
158
|
+
If browser tools are not available, state that explicitly in the handoff note ("visual verification skipped — no browser tooling available") so the user knows to eyeball the result.
|
|
159
|
+
|
|
160
|
+
The cost of an extra round-trip is small. The cost of shipping a broken visual that the user has to point out is large.
|
|
@@ -0,0 +1,513 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: improbable-futures
|
|
3
|
+
description: >
|
|
4
|
+
Strategy-forward product cartography. Articulates the goal, grounds the analysis in domain
|
|
5
|
+
research, commits to a strategic thesis, then maps three mutually-exclusive futures that
|
|
6
|
+
execute it — each with a user's love-letter, required capability, what it excludes, and a
|
|
7
|
+
next move you can hand to your agent. Auto-invokes /babel-fish:visualize for the visual map.
|
|
8
|
+
Use when exploring "where could this go," forcing a strategic commitment, or stress-testing
|
|
9
|
+
a product idea for lovability. Triggers: improbable futures, product futures, where could
|
|
10
|
+
this go, map my project, lovable product, cartographer, product atlas, product strategy.
|
|
11
|
+
allowed-tools:
|
|
12
|
+
- Read
|
|
13
|
+
- Grep
|
|
14
|
+
- Glob
|
|
15
|
+
- Write
|
|
16
|
+
- Agent
|
|
17
|
+
- AskUserQuestion
|
|
18
|
+
- WebSearch
|
|
19
|
+
- WebFetch
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
# Improbable Futures
|
|
23
|
+
|
|
24
|
+
Most product advice asks "is this good?" This skill asks better questions: **"what is the goal? what strategy serves it? where could that strategy take you, and what does each path cost?"**
|
|
25
|
+
|
|
26
|
+
You are a cartographer and a strategist. Read the project as it actually is. Name the goal — explicitly. Ground the analysis in real domain research, not vibes. Commit to a single strategic thesis. Then sketch three futures that execute that thesis differently — each genuinely improbable, each mutually exclusive with the other two. Pin a love-letter from a named user six months ahead to each future. Surface wild cards. Hand the builder a map AND a next move they can give to their agent.
|
|
27
|
+
|
|
28
|
+
Think of it as the Improbability Drive for product strategy: not three options that look similar, but three commitments that look mutually unreachable until you land in one of them.
|
|
29
|
+
|
|
30
|
+
## Boundaries
|
|
31
|
+
|
|
32
|
+
**This skill MAY:** read project files, scan repos, ask the user for goal and pitch when context is thin, run targeted web research for domain best-practices and strategic-move patterns, generate a strategy + map markdown, auto-invoke `/babel-fish:visualize` on the output.
|
|
33
|
+
**This skill MAY NOT:** edit code, run builds, write implementation plans, produce verdicts or scorecards, generate pitch-deck copy, do TAM/SAM/SOM market sizing, name real clients, attribute opinions to specific named people.
|
|
34
|
+
|
|
35
|
+
**This is a strategy AND a map, not a plan. Commit to a thesis — do not implement it. Hand the next move to the user's agent — do not execute it.**
|
|
36
|
+
|
|
37
|
+
## Common Rationalizations
|
|
38
|
+
|
|
39
|
+
| Shortcut | Why It Fails | The Cost |
|
|
40
|
+
|----------|-------------|----------|
|
|
41
|
+
| "Skip research — generate the futures from the project signal alone" | Without grounded reference to what works in this category, you produce vibe-strategy. Three futures that read smart but match no real strategic move pattern. | Smoothie output that the builder closes without aching |
|
|
42
|
+
| "Skip the goal — work from what the project clearly is" | Projects rarely make the goal explicit. If you guess wrong, every future executes the wrong strategy. The map is geometrically correct and pointed at nothing. | Builder reads three "interesting" futures and feels none of them. The goal mismatch is silent until the futures land flat |
|
|
43
|
+
| "Three plausible futures is enough" | Plausible is the enemy. The brief asks for IMPROBABLE futures that are mutually exclusive — not three reasonable variations the founder could pursue in parallel. | "Pick one and lose the others" turns into "pick whichever, do all three eventually" — no commitment, no map |
|
|
44
|
+
| "Love-letters can sound similar across futures — same author, same project" | If all three letters read like the same person wrote them, you've written articles, not letters. Real letters have distinct voices, distinct ticks, distinct silences. | Reader skims the letters as decoration. The ache that should drive choice never lands |
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## Phase 0: Detect Input Shape
|
|
49
|
+
|
|
50
|
+
**Entry:** User invoked `/deep-thought:improbable-futures` with a path, a pitch, or nothing.
|
|
51
|
+
|
|
52
|
+
**Case A — path to a repo or directory:** Note the path. Proceed to Phase 1.
|
|
53
|
+
|
|
54
|
+
**Case B — inline pitch:** Note the pitch. Ask: "Is there a repo or docs I should read too, or should I work from this pitch alone?" If a path is offered, add it. Proceed.
|
|
55
|
+
|
|
56
|
+
**Case C — nothing, or near-empty repo:** Use **AskUserQuestion** once. Header: "Improbable Futures". Question: "Give me one paragraph: what is this project, who is it for, and what's the nearest win you're imagining?" Conversational, not a form.
|
|
57
|
+
|
|
58
|
+
**Exit:** You have a path, a pitch, or both.
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## Phase 1: Read Current State
|
|
63
|
+
|
|
64
|
+
**Entry:** Phase 0 complete.
|
|
65
|
+
|
|
66
|
+
Read the signal-dense surface only:
|
|
67
|
+
|
|
68
|
+
- `README.md`, `README` (root)
|
|
69
|
+
- `package.json`, `pyproject.toml`, `Cargo.toml`, `go.mod`
|
|
70
|
+
- Top-level `docs/` — especially `brainstorms/`, `plans/`, dated last 90 days
|
|
71
|
+
- One representative source file per major surface
|
|
72
|
+
- `CLAUDE.md`, `AGENTS.md` at the root
|
|
73
|
+
|
|
74
|
+
**Anti-pattern:** opening a tenth file. Stop — you have enough.
|
|
75
|
+
|
|
76
|
+
Synthesize internally (not yet output): what the project actually is (the thing, not the pitch), who it's for, what it's orbiting (the unstated gravity well).
|
|
77
|
+
|
|
78
|
+
**Exit:** You could describe the project in two to three honest sentences — its shape, not its copy.
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## Phase 2: Articulate the Goal
|
|
83
|
+
|
|
84
|
+
**Entry:** You understand the project's shape.
|
|
85
|
+
|
|
86
|
+
**Why this phase exists:** Most builders haven't named their goal explicitly. They have a project. They know what they're working on. They haven't said out loud what success looks like, on what time horizon, in what shape. Without a named goal, the futures aim at nothing.
|
|
87
|
+
|
|
88
|
+
**Step 1 — try to extract the goal from signal.** Read recent brainstorms, READMEs, plans, and any `goals.md` / `roadmap.md` style files. Look for explicit statements of intent. Synthesize one sentence: "The goal of this project, as far as the signal shows, is [X by Y]."
|
|
89
|
+
|
|
90
|
+
**Step 2 — confirm or correct via AskUserQuestion.**
|
|
91
|
+
- header: "Goal"
|
|
92
|
+
- question: "I read your goal as: '[X]'. Adjust?"
|
|
93
|
+
- options: `Yes, that's it`, `Close — let me edit`, `No — let me restate`, `I haven't articulated a goal yet`
|
|
94
|
+
|
|
95
|
+
**Step 3 — handle "no goal yet."** If the user picks the last option, ask one focused question: "What does success look like for this project six to twelve months from now? One sentence. If you don't know yet, say so — we'll work from a placeholder and the futures will surface what the goal should be." Use the answer (or "no goal yet" placeholder) as the goal of record.
|
|
96
|
+
|
|
97
|
+
**Why goal precedes strategy:** A future is a way to execute a strategy. A strategy is a way to pursue a goal. If the goal is unclear, every future is shooting at fog. If the user doesn't have a goal yet, the futures themselves can become a goal-articulation tool — but only if you name that explicitly in the output.
|
|
98
|
+
|
|
99
|
+
**Exit:** A single-sentence goal of record. Could be a placeholder. Either way, you can quote it.
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## Phase 3: Stage Detection
|
|
104
|
+
|
|
105
|
+
**Entry:** Goal of record exists.
|
|
106
|
+
|
|
107
|
+
Guess the stage from signals:
|
|
108
|
+
|
|
109
|
+
| Stage | Signals |
|
|
110
|
+
|---|---|
|
|
111
|
+
| **Idea** | Pitch only, empty repo, no deployed surface |
|
|
112
|
+
| **Mid-build** | Active commits, partial features, plans present, no public launch signal |
|
|
113
|
+
| **Pre-launch** | Feature-complete signals, landing/waitlist language, launch references |
|
|
114
|
+
| **Live** | Users referenced, usage metrics, post-launch docs, support files |
|
|
115
|
+
|
|
116
|
+
Confirm with **AskUserQuestion** (header: "Stage"; question: "I read this as [stage]. Adjust?"; options: Idea / Mid-build / Pre-launch / Live / Mix).
|
|
117
|
+
|
|
118
|
+
Stage shapes the weight of each section in Phase 5 — do not add new sections. Idea-stage futures are wider; live-stage futures must reckon with what already exists.
|
|
119
|
+
|
|
120
|
+
**Exit:** Stage agreed.
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## Phase 4: Research Grounding
|
|
125
|
+
|
|
126
|
+
**Entry:** Goal and stage agreed.
|
|
127
|
+
|
|
128
|
+
The futures must be grounded in what actually works in this category — not generated from vibes. Use the tier system below to pick the highest available source of grounding.
|
|
129
|
+
|
|
130
|
+
### Grounding tiers
|
|
131
|
+
|
|
132
|
+
**Tier 1 — User-provided references (highest fidelity).** If the project root contains a `references/futures/` directory or the user passed `--references <path>`, read those files first. Treat them as authoritative for the domain.
|
|
133
|
+
|
|
134
|
+
**Tier 2 — Targeted web research (default).** Use **WebSearch** + **WebFetch** to pull 3–5 sources on:
|
|
135
|
+
- Strategic-move patterns for projects in this category (e.g., "open-source workshop businesses how they scale," "developer tools community to commercial product")
|
|
136
|
+
- Recent (≤24 months) writing from category practitioners — not generic advice, but specific case studies, post-mortems, founder essays
|
|
137
|
+
- Best-practice frameworks the user's domain references (e.g., for a workshop business: pricing models, productisation patterns, embedded-residency models)
|
|
138
|
+
|
|
139
|
+
Cite each source you use in the output's `Research Sources` section. If a source contradicts a future, surface the contradiction in that future's "What you'd have to believe" section.
|
|
140
|
+
|
|
141
|
+
**Tier 3 — Training-data only (fallback).** If web access is unavailable or the user passes `--no-research`, state explicitly in the output: "Grounding tier: training-data only. Specific concepts applied: [list named frameworks or patterns]."
|
|
142
|
+
|
|
143
|
+
### What to research, concretely
|
|
144
|
+
|
|
145
|
+
Generate 3–5 search queries, then dispatch a parallel research subagent. Sample brief:
|
|
146
|
+
|
|
147
|
+
> Research strategic-move patterns and case studies for [category]. Focus on:
|
|
148
|
+
> - Real founder-written accounts (not advice columns)
|
|
149
|
+
> - Post-mortems and pivots — what worked, what failed
|
|
150
|
+
> - Specific products in this category that took unusual or improbable paths
|
|
151
|
+
> - The 2–3 most-cited frameworks in this category (and their critics)
|
|
152
|
+
> Return: 5–8 specific patterns or moves, each with one citation.
|
|
153
|
+
|
|
154
|
+
**Anti-pattern:** generic "product strategy" advice from generalist business sites. Reject if the source isn't category-specific or doesn't cite a real product.
|
|
155
|
+
|
|
156
|
+
**Exit:** A short internal brief: 5–8 grounded patterns, each citable. The futures in Phase 5 will be tested against these.
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
## Phase 5: Generate the Strategy Thesis and Map
|
|
161
|
+
|
|
162
|
+
**Entry:** Phases 0–4 complete.
|
|
163
|
+
|
|
164
|
+
This phase produces seven internal drafts. Do not write the file yet — Phase 6 reviews them first.
|
|
165
|
+
|
|
166
|
+
### 5a. You are here — the diagnostic
|
|
167
|
+
|
|
168
|
+
Two to four sentences. Quiet observation of the gravity well the project is already orbiting. No verdict. Specific. End with the tension the project is currently living inside (e.g., "right now you're trying to be both, which is the most expensive way to be either").
|
|
169
|
+
|
|
170
|
+
### 5b. Strategy thesis — a single committed direction
|
|
171
|
+
|
|
172
|
+
One paragraph, 3–5 sentences. Format:
|
|
173
|
+
|
|
174
|
+
> Given the goal — **[quoted goal]** — your strategic thesis is **[single, committed direction grounded in research]**. The three futures below are not three different goals; they are three mutually-exclusive ways to execute this one thesis. Pick one and the others become unreachable.
|
|
175
|
+
|
|
176
|
+
This is the load-bearing part. The thesis must:
|
|
177
|
+
- Reference the goal verbatim
|
|
178
|
+
- Commit to a single direction (not "explore options")
|
|
179
|
+
- Be grounded in at least one Phase 4 research finding (cite inline)
|
|
180
|
+
- Make the mutual-exclusivity of the futures intelligible — three executions of one thesis, not three different theses
|
|
181
|
+
|
|
182
|
+
### 5c. Three mutually-exclusive futures
|
|
183
|
+
|
|
184
|
+
Exactly three. Each a different execution of the thesis. For each, produce:
|
|
185
|
+
|
|
186
|
+
1. **One-line bet** — specific, committal. Not a category ("a SaaS version"); a thing ("a small daemon installed in your repo that exposes three skills").
|
|
187
|
+
2. **Stance paragraph** — 3–5 sentences explaining what this future actually is, what the builder becomes if they pick it, and what they stop being.
|
|
188
|
+
3. **Required capability** — one sentence. The single thing that must exist for the love-letter to be possible.
|
|
189
|
+
4. **This excludes** — one sentence. What picking this future kills. Naming the kill is what makes it mutually exclusive.
|
|
190
|
+
|
|
191
|
+
**Improbability test (apply to every future before keeping it):**
|
|
192
|
+
- Would a smart founder in this category have considered this option? If yes — push harder. The future is too obvious.
|
|
193
|
+
- Is this a textbook scaling move (named-discipline play, productised-self-serve play, geographic-specialisation play)? If yes — regenerate.
|
|
194
|
+
- Does this future, if pursued, kill the other two? If no — they're not mutually exclusive; they're parallel options. Regenerate.
|
|
195
|
+
|
|
196
|
+
### 5d. Love-letters — one per future, distinct voices, with ache
|
|
197
|
+
|
|
198
|
+
Each letter: 4–7 sentences from a named user, six months after they live in this future. Attribution line at the end.
|
|
199
|
+
|
|
200
|
+
**Voice rules:**
|
|
201
|
+
- Each letter must read like a different person wrote it. Different sentence rhythm, different vocabulary, different tics.
|
|
202
|
+
- After drafting, re-read the three letters back-to-back. If two of them could trade signatures and nobody would notice, regenerate at least one.
|
|
203
|
+
|
|
204
|
+
**Ache rules — every letter must contain at least two of these:**
|
|
205
|
+
- A contradiction or longing (something they miss or didn't get, even though they love this)
|
|
206
|
+
- A specific physical detail (time of day, what they were holding, the silence in the room)
|
|
207
|
+
- An unresolved question or concern they tell only the recipient
|
|
208
|
+
- A mild request (don't water this down, please don't change X, tell people in [place])
|
|
209
|
+
- A sentence that wouldn't make sense in a testimonial reel
|
|
210
|
+
|
|
211
|
+
**Anti-test:** Could this letter appear unmodified on a SaaS landing page as a customer quote? If yes — it's marketing copy. Regenerate.
|
|
212
|
+
|
|
213
|
+
### 5e. Wild cards
|
|
214
|
+
|
|
215
|
+
Three to five one-line branches. Genuinely improbable — not variations on the three futures.
|
|
216
|
+
|
|
217
|
+
**Test:** would a "wild" card slot into one of the three futures as a feature? If yes, it's not wild. Regenerate.
|
|
218
|
+
|
|
219
|
+
Each wild card should be a left turn the project could (improbably) take. Tactile, weird, anti-software, anti-scale, accidentally institutional — these are good directions. Variation of "another revenue stream" — bad direction.
|
|
220
|
+
|
|
221
|
+
### 5f. Paths and required beliefs (per future)
|
|
222
|
+
|
|
223
|
+
For each future:
|
|
224
|
+
|
|
225
|
+
**Paths — first 2–3 moves.** Directions, not milestones. If you're writing "Sprint 1" or "Milestone 1", stop — that's `/plan`'s job.
|
|
226
|
+
|
|
227
|
+
**What you'd have to believe — 2–4 assumptions.** Concrete bets, not vague "market exists" statements. Each belief is a place where you and a smart competitor could disagree and only time would tell who's right.
|
|
228
|
+
|
|
229
|
+
### 5g. Agent-actionable next moves
|
|
230
|
+
|
|
231
|
+
For each future, draft a single command the user can hand to their coding agent verbatim. Format:
|
|
232
|
+
|
|
233
|
+
```
|
|
234
|
+
/deep-thought:plan "[future-specific brief in one sentence]"
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
or, when more brainstorming is needed:
|
|
238
|
+
|
|
239
|
+
```
|
|
240
|
+
/deep-thought:brainstorm "[narrow exploration question]"
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
These commands appear in two places in the output:
|
|
244
|
+
- In the YAML frontmatter as a structured `next_moves:` block (machine-readable)
|
|
245
|
+
- In a "Hand this to your agent" section at the bottom of the output (human-readable)
|
|
246
|
+
|
|
247
|
+
### 5h. Structured data for the visual (mandatory)
|
|
248
|
+
|
|
249
|
+
The output markdown must carry structured data blocks in frontmatter that `/babel-fish:visualize` reads to build real components — not stylised prose. Without these blocks, the downstream visualizer falls back to "prose with one decorative SVG."
|
|
250
|
+
|
|
251
|
+
Produce four (sometimes five) frontmatter blocks:
|
|
252
|
+
|
|
253
|
+
- **`comparison_dimensions`** — 4–6 tradeoff-revealing dimensions × 3 futures. The single most important visual.
|
|
254
|
+
- **`timeline_waypoints`** — 3–4 specific moves per future, dated.
|
|
255
|
+
- **`research_timing`** — category events plus "YOU ARE HERE" and "WINDOW CLOSES" markers (both mandatory).
|
|
256
|
+
- **`naming_landscape`** — competing vocabularies positioned (include when the category is mid-naming-fight).
|
|
257
|
+
- **`visual_brief`** — directive header listing required components.
|
|
258
|
+
|
|
259
|
+
**See `../knowledge/strategy-dashboard-spec.md`** for the exact YAML shape of each block, tradeoff-vs-feature examples, and the reasoning behind each field. That knowledge file is the authoritative spec; the skill must produce frontmatter that matches it.
|
|
260
|
+
|
|
261
|
+
**Exit:** Seven internal drafts ready plus the structured visual blocks above. Nothing written yet.
|
|
262
|
+
|
|
263
|
+
---
|
|
264
|
+
|
|
265
|
+
## Phase 6: Self-Review Against Rejection Criteria
|
|
266
|
+
|
|
267
|
+
**Entry:** Phase 5 drafts complete.
|
|
268
|
+
|
|
269
|
+
Walk this checklist honestly. Look for reasons the map is wrong, not reasons to ship it.
|
|
270
|
+
|
|
271
|
+
**Rejection checklist (the output is wrong if any item is true):**
|
|
272
|
+
|
|
273
|
+
Strategic content:
|
|
274
|
+
- [ ] The strategy thesis does not quote the goal of record verbatim
|
|
275
|
+
- [ ] The thesis does not cite at least one research finding
|
|
276
|
+
- [ ] Any future could be pursued in parallel with another — they are not mutually exclusive
|
|
277
|
+
- [ ] Any future is a textbook category-conventional move (named-discipline / productised-self-serve / geographic-specialisation / "go enterprise")
|
|
278
|
+
- [ ] The "This excludes" line for any future is vague or polite — it should name what you kill
|
|
279
|
+
- [ ] Any love-letter could appear unmodified on a SaaS landing page as a customer quote
|
|
280
|
+
- [ ] Two or more love-letters could trade signatures and nobody would notice
|
|
281
|
+
- [ ] Any love-letter has zero of the ache markers (contradiction, physical detail, unresolved question, request, non-testimonial sentence)
|
|
282
|
+
- [ ] Any wild card could slot into one of the three futures as a feature — it isn't wild
|
|
283
|
+
- [ ] "You are here" praises or criticises instead of observing
|
|
284
|
+
- [ ] Any "Path" reads as an implementation plan (Sprint 1, Milestone, etc.)
|
|
285
|
+
- [ ] Any "What you'd have to believe" item is vague ("market exists") instead of a concrete bet
|
|
286
|
+
- [ ] Drafts collectively exceed three futures, five wild cards, or seven sections
|
|
287
|
+
- [ ] Pitch-deck vocabulary is present (TAM, SAM, SOM, value prop, positioning, ICP)
|
|
288
|
+
- [ ] Any agent-actionable command is generic — it must be future-specific and verbatim-runnable
|
|
289
|
+
- [ ] A contributor or client name appears anywhere
|
|
290
|
+
|
|
291
|
+
Structured visual data (Phase 5h):
|
|
292
|
+
- [ ] `comparison_dimensions` block has fewer than 4 dimensions, or any dimension is descriptive rather than tradeoff-revealing ("Has feature X" — wrong; "Identity you become" — right)
|
|
293
|
+
- [ ] `timeline_waypoints` has fewer than 3 waypoints per future, or any waypoint reads as a milestone rather than a specific move
|
|
294
|
+
- [ ] `research_timing` is missing the "YOU ARE HERE" pin or the "WINDOW CLOSES" marker — the urgency must be visible
|
|
295
|
+
- [ ] Any structured block is in the prose body rather than the frontmatter — visualizers cannot scan prose for structure
|
|
296
|
+
|
|
297
|
+
If any box is ticked, revise the affected draft. If the same box keeps getting ticked on rewrites, the signal for that part is too thin — ask one more clarifying question or drop the offending future and regenerate from the thesis.
|
|
298
|
+
|
|
299
|
+
**Exit:** Every box unticked.
|
|
300
|
+
|
|
301
|
+
---
|
|
302
|
+
|
|
303
|
+
## Phase 7: Write the Output
|
|
304
|
+
|
|
305
|
+
**Entry:** Drafts have passed self-review.
|
|
306
|
+
|
|
307
|
+
**Output path:** `docs/futures/YYYY-MM-DD-{kebab-project}-improbable-futures.md`
|
|
308
|
+
|
|
309
|
+
Write this skeleton exactly — heading depths are what `/babel-fish:visualize` reads as hierarchy.
|
|
310
|
+
|
|
311
|
+
```markdown
|
|
312
|
+
---
|
|
313
|
+
title: "Improbable Futures: {project}"
|
|
314
|
+
type: improbable-futures
|
|
315
|
+
date: YYYY-MM-DD
|
|
316
|
+
stage: {idea | mid-build | pre-launch | live}
|
|
317
|
+
goal: "{goal of record, verbatim}"
|
|
318
|
+
grounding_tier: {1 | 2 | 3}
|
|
319
|
+
research_sources:
|
|
320
|
+
- "{url or citation 1}"
|
|
321
|
+
- "{url or citation 2}"
|
|
322
|
+
next_moves:
|
|
323
|
+
future_1:
|
|
324
|
+
direction: "{one-line summary}"
|
|
325
|
+
suggested_command: "/deep-thought:plan ..."
|
|
326
|
+
future_2: { direction: "...", suggested_command: "..." }
|
|
327
|
+
future_3: { direction: "...", suggested_command: "..." }
|
|
328
|
+
comparison_dimensions:
|
|
329
|
+
- { name: "Identity", future_1: "...", future_2: "...", future_3: "..." }
|
|
330
|
+
- { name: "Revenue model", future_1: "...", future_2: "...", future_3: "..." }
|
|
331
|
+
- { name: "What you leave", future_1: "...", future_2: "...", future_3: "..." }
|
|
332
|
+
- { name: "What it costs", future_1: "...", future_2: "...", future_3: "..." }
|
|
333
|
+
# 4–6 dimensions, each tradeoff-revealing
|
|
334
|
+
timeline_waypoints:
|
|
335
|
+
future_1:
|
|
336
|
+
- { when: "Week 2", move: "..." }
|
|
337
|
+
- { when: "Week 8", move: "..." }
|
|
338
|
+
- { when: "Month 3", move: "..." }
|
|
339
|
+
- { when: "Month 6", move: "...'s letter arrives" }
|
|
340
|
+
future_2: [ ... ]
|
|
341
|
+
future_3: [ ... ]
|
|
342
|
+
research_timing:
|
|
343
|
+
- { date: "YYYY-MM", source: "...", event: "..." }
|
|
344
|
+
- { date: "YYYY-MM-DD", source: "YOU ARE HERE", event: "This map" }
|
|
345
|
+
- { date: "YYYY-MM", source: "WINDOW CLOSES", event: "..." }
|
|
346
|
+
naming_landscape:
|
|
347
|
+
- { term: "...", backers: ["..."], scope: "..." }
|
|
348
|
+
visual_brief:
|
|
349
|
+
artifact_family: "strategy-dashboard"
|
|
350
|
+
primary_components:
|
|
351
|
+
- "comparison_matrix" # from comparison_dimensions — top of page
|
|
352
|
+
- "journey_timelines" # from timeline_waypoints — three side-by-side
|
|
353
|
+
- "urgency_timeline" # from research_timing — single horizontal axis
|
|
354
|
+
- "naming_landscape" # from naming_landscape — when present
|
|
355
|
+
secondary_components:
|
|
356
|
+
- "strategy_thesis_hero"
|
|
357
|
+
- "letter_cards" # love-letters as letter-styled objects, not blockquotes
|
|
358
|
+
- "agent_command_ctas" # primary call-to-action per future
|
|
359
|
+
---
|
|
360
|
+
|
|
361
|
+
# Improbable Futures: {project}
|
|
362
|
+
|
|
363
|
+
## You are here
|
|
364
|
+
|
|
365
|
+
{2–4 sentences from 5a.}
|
|
366
|
+
|
|
367
|
+
## Strategy thesis
|
|
368
|
+
|
|
369
|
+
{Single paragraph from 5b. Quotes the goal. Cites a research finding.}
|
|
370
|
+
|
|
371
|
+
## Three futures worth chasing
|
|
372
|
+
|
|
373
|
+
Each future is a way to execute the thesis above. Pick one and the other two stop being available.
|
|
374
|
+
|
|
375
|
+
### Future 1: {one-line bet}
|
|
376
|
+
|
|
377
|
+
{Stance paragraph.}
|
|
378
|
+
|
|
379
|
+
> {Love-letter, 4–7 sentences.}
|
|
380
|
+
>
|
|
381
|
+
> — {Named user, role, six months in}
|
|
382
|
+
|
|
383
|
+
**Required capability:** {one sentence}
|
|
384
|
+
|
|
385
|
+
**This excludes:** {one sentence — what picking this future kills}
|
|
386
|
+
|
|
387
|
+
**Hand to your agent:** `/deep-thought:plan "..."`
|
|
388
|
+
|
|
389
|
+
<details>
|
|
390
|
+
<summary>First moves and what you'd have to believe</summary>
|
|
391
|
+
|
|
392
|
+
**First moves**
|
|
393
|
+
- {Direction 1}
|
|
394
|
+
- {Direction 2}
|
|
395
|
+
- {Direction 3}
|
|
396
|
+
|
|
397
|
+
**What you'd have to believe**
|
|
398
|
+
- {Belief 1}
|
|
399
|
+
- {Belief 2}
|
|
400
|
+
|
|
401
|
+
</details>
|
|
402
|
+
|
|
403
|
+
### Future 2: {one-line bet}
|
|
404
|
+
|
|
405
|
+
{Same shape as Future 1.}
|
|
406
|
+
|
|
407
|
+
### Future 3: {one-line bet}
|
|
408
|
+
|
|
409
|
+
{Same shape as Future 1.}
|
|
410
|
+
|
|
411
|
+
## Wild cards
|
|
412
|
+
|
|
413
|
+
- **{Title}** — {one-line description}
|
|
414
|
+
- {3–5 wild cards total}
|
|
415
|
+
|
|
416
|
+
## Hand this to your agent
|
|
417
|
+
|
|
418
|
+
If you've picked a future — even tentatively — the next move is not another brainstorm. It's a plan.
|
|
419
|
+
|
|
420
|
+
- **Future 1 ({direction}):** `/deep-thought:plan "..."`
|
|
421
|
+
- **Future 2 ({direction}):** `/deep-thought:brainstorm "..."`
|
|
422
|
+
- **Future 3 ({direction}):** `/deep-thought:plan "..."`
|
|
423
|
+
|
|
424
|
+
If you haven't picked one, sit with the love-letters one more time. The one you ached at is the one to chase.
|
|
425
|
+
|
|
426
|
+
## Research sources
|
|
427
|
+
|
|
428
|
+
- {Source 1 with citation}
|
|
429
|
+
- {Source 2 with citation}
|
|
430
|
+
- Grounding tier: {1, 2, or 3}
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
**Exit:** File written.
|
|
434
|
+
|
|
435
|
+
---
|
|
436
|
+
|
|
437
|
+
## Phase 8: Auto-Visualize with Explicit Brief, Then Handoff
|
|
438
|
+
|
|
439
|
+
**Entry:** Output file written.
|
|
440
|
+
|
|
441
|
+
The visual is a first-class part of this skill, not an option. Do not ask whether to visualize — invoke it. And do not invoke it without a brief — `/babel-fish:visualize` is a generalist; without explicit direction it produces "prose with one decorative SVG" and the strategic argument stays locked in paragraphs.
|
|
442
|
+
|
|
443
|
+
### Step 1 — invoke visualize with the strategy-dashboard brief
|
|
444
|
+
|
|
445
|
+
Call the Skill tool with `babel-fish:visualize`. Pass the output path as the primary argument and append the **strategy-dashboard brief from `../knowledge/strategy-dashboard-spec.md`** as additional context (concatenate verbatim to the args string after the path).
|
|
446
|
+
|
|
447
|
+
Why the brief: the visualizer is a generalist. Without explicit direction it produces "prose with one decorative SVG." The knowledge file tells it exactly which components to build, enforces the UI quality rules (no label collisions, colour consistency, 760px mobile behaviour, danger-colour reserved for risk), and includes a browser-self-verification protocol for agents with Chrome tooling available. Read the knowledge file and pass it along.
|
|
448
|
+
|
|
449
|
+
Surface three things after the call returns:
|
|
450
|
+
- the markdown path: `docs/futures/YYYY-MM-DD-{kebab-project}-improbable-futures.md`
|
|
451
|
+
- the published URL from visualize
|
|
452
|
+
- verification status — if the executing agent has browser tools, the 1440px / 760px screenshot check per `strategy-dashboard-spec.md`; otherwise an explicit note that verification was skipped
|
|
453
|
+
|
|
454
|
+
If `/babel-fish:visualize` fails, report plainly, leave the markdown in place, and tell the user how to retry (`/babel-fish:visualize {output-path}` plus the brief from the knowledge file). Do not silently fall back to a menu without the visual.
|
|
455
|
+
|
|
456
|
+
### Step 2 — post-visual handoff
|
|
457
|
+
|
|
458
|
+
Present the post-visual menu (prefer the harness's structured choice UI if available):
|
|
459
|
+
|
|
460
|
+
1. **Review and refine** — Tell me what reads off; I'll rewrite the affected sections and republish
|
|
461
|
+
2. **Plan a future** — Pick 1, 2, or 3; I'll suggest `/deep-thought:plan` with the agent-command from the output
|
|
462
|
+
3. **Done for now** — Markdown and visual are both saved
|
|
463
|
+
|
|
464
|
+
If "Review and refine": ask which section, rewrite through Phases 5–6, rewrite the file, re-invoke visualize with the same brief, return here.
|
|
465
|
+
If "Plan a future": surface the matching `next_moves[future_N].suggested_command` from the frontmatter.
|
|
466
|
+
If "Done": confirm both paths and exit.
|
|
467
|
+
|
|
468
|
+
**Why the brief, not just the path.** The visualizer is a generalist designer who's never met this skill. Handing it a markdown file alone is like handing a designer a brief that says "make something nice with this content." This skill knows what makes an improbable-futures map land — the visual brief is how that knowledge survives the handoff.
|
|
469
|
+
|
|
470
|
+
---
|
|
471
|
+
|
|
472
|
+
## Validate
|
|
473
|
+
|
|
474
|
+
Before delivering the map, verify:
|
|
475
|
+
|
|
476
|
+
- [ ] Phase 0–1 detected input shape and synthesized the project in 2–3 honest sentences
|
|
477
|
+
- [ ] Phase 2 surfaced a goal of record (or an explicit "no goal yet" placeholder) — confirmed with the user
|
|
478
|
+
- [ ] Phase 3 confirmed stage with the user
|
|
479
|
+
- [ ] Phase 4 grounding tier is declared in the output frontmatter; sources cited if Tier 2
|
|
480
|
+
- [ ] Phase 5b strategy thesis quotes the goal verbatim and cites a research finding
|
|
481
|
+
- [ ] Three mutually-exclusive futures — each with bet, stance, capability, "this excludes," love-letter, paths, beliefs, agent-command
|
|
482
|
+
- [ ] Each love-letter passes the voice-distinctness test (could the letters trade signatures? — no) and the ache test (≥2 ache markers per letter)
|
|
483
|
+
- [ ] Each future has a "This excludes" line that names what is killed by picking this future
|
|
484
|
+
- [ ] 3–5 genuinely-wild wild cards, each one line
|
|
485
|
+
- [ ] `next_moves:` block in frontmatter has all three futures with verbatim-runnable commands
|
|
486
|
+
- [ ] "Hand this to your agent" section appears in the output body
|
|
487
|
+
- [ ] Phase 6 rejection checklist was walked — every box unticked
|
|
488
|
+
- [ ] Output file exists at `docs/futures/YYYY-MM-DD-{kebab-project}-improbable-futures.md`
|
|
489
|
+
- [ ] Frontmatter contains all four structured visual blocks (`comparison_dimensions`, `timeline_waypoints`, `research_timing`, `visual_brief`); `naming_landscape` present when relevant
|
|
490
|
+
- [ ] `comparison_dimensions` has 4–6 tradeoff-revealing dimensions (not feature lists)
|
|
491
|
+
- [ ] `research_timing` includes the "YOU ARE HERE" pin and "WINDOW CLOSES" marker
|
|
492
|
+
- [ ] `/babel-fish:visualize` was auto-invoked **with the explicit strategy-dashboard brief** — not a bare path
|
|
493
|
+
- [ ] Published artifact passes the 10-second-scan test: the three futures and their key differences are visible without reading paragraphs
|
|
494
|
+
- [ ] Published artifact has at least 4 distinct prose-light visual components above the fold
|
|
495
|
+
- [ ] Comparison matrix renders as a scannable grid (not bullet points)
|
|
496
|
+
- [ ] Timelines with dense events use vertical layout (no horizontal label collision)
|
|
497
|
+
- [ ] Browser self-verification completed (1440px + 760px screenshots) OR explicit note that tooling is unavailable
|
|
498
|
+
- [ ] No contributor names, no client names, no pitch-deck vocabulary, no MBA vocabulary
|
|
499
|
+
|
|
500
|
+
## What Makes This Heart of Gold
|
|
501
|
+
|
|
502
|
+
- **Problem Reframing (1.4):** Refuses the verdict trap. Asks "what is the goal, what strategy serves it, and what futures execute it?" — not "is this good?"
|
|
503
|
+
- **AI-Augmented Discovery (1.3):** Phase 4 grounds the futures in real category research — case studies, founder writing, post-mortems — so the strategy thesis is not vibes.
|
|
504
|
+
- **AI Curiosity (1.1):** Three mutually-exclusive futures plus wild cards — structurally biased toward widening the option space before forcing commitment. The "This excludes" line is what turns options into commitment.
|
|
505
|
+
- **Opportunity Recognition (1.2):** The named-user love-letter surfaces the smallest unit of "why this should exist" — a specific person on a specific Tuesday — instead of the generic "market opportunity" abstraction.
|
|
506
|
+
|
|
507
|
+
## Knowledge References
|
|
508
|
+
|
|
509
|
+
- `../knowledge/strategy-dashboard-spec.md` — **authoritative spec for Phase 5h structured data and the Phase 8 visual brief.** Referenced by both phases; the skill will not produce a coherent dashboard without it.
|
|
510
|
+
- `../knowledge/discovery-patterns.md` — AskUserQuestion usage, thin-context handling, goal articulation
|
|
511
|
+
- `../knowledge/socratic-patterns.md` — evidence grounding for Phase 6 self-review
|
|
512
|
+
- `../knowledge/twelve-techniques.md` — technique checklist this skill applies (few-shot examples, negative prompting, format specification, reflection, RAG via Phase 4 research)
|
|
513
|
+
- `../knowledge/strategic-decomposition.md` — strategy-thesis framing (referenced by Phase 5b)
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
fetch-anthropic-news.py — Fetch Anthropic news posts from sitemap.xml as signals.
|
|
4
|
+
|
|
5
|
+
Anthropic publishes no RSS feed, but anthropic.com/sitemap.xml lists every
|
|
6
|
+
/news/ post with a <lastmod> timestamp. We parse that, filter by freshness,
|
|
7
|
+
fetch each recent page for its <title> + meta description, and emit signals
|
|
8
|
+
in the same schema as fetch-rss.py.
|
|
9
|
+
|
|
10
|
+
Usage:
|
|
11
|
+
python3 fetch-anthropic-news.py --config <path-to-config.yaml>
|
|
12
|
+
|
|
13
|
+
Config (under sources.anthropic_news):
|
|
14
|
+
enabled: true
|
|
15
|
+
freshness_hours: 168
|
|
16
|
+
max_items: 5
|
|
17
|
+
"""
|
|
18
|
+
import argparse
|
|
19
|
+
import json
|
|
20
|
+
import re
|
|
21
|
+
import sys
|
|
22
|
+
import urllib.error
|
|
23
|
+
import urllib.parse
|
|
24
|
+
import urllib.request
|
|
25
|
+
from datetime import datetime, timedelta, timezone
|
|
26
|
+
from xml.etree import ElementTree as ET
|
|
27
|
+
|
|
28
|
+
import yaml
|
|
29
|
+
|
|
30
|
+
SITEMAP_URL = "https://www.anthropic.com/sitemap.xml"
|
|
31
|
+
PATH_PREFIX = "/news/"
|
|
32
|
+
USER_AGENT = "heart-of-gold-pipeline/1.0"
|
|
33
|
+
FETCH_TIMEOUT = 10
|
|
34
|
+
SITEMAP_NS = "{http://www.sitemaps.org/schemas/sitemap/0.9}"
|
|
35
|
+
|
|
36
|
+
TITLE_RE = re.compile(r"<title[^>]*>([^<]*)</title>", re.IGNORECASE)
|
|
37
|
+
META_DESC_RES = [
|
|
38
|
+
re.compile(
|
|
39
|
+
r'<meta[^>]+name=["\']description["\'][^>]*content=["\']([^"\']*)["\']',
|
|
40
|
+
re.IGNORECASE,
|
|
41
|
+
),
|
|
42
|
+
re.compile(
|
|
43
|
+
r'<meta[^>]+content=["\']([^"\']*)["\'][^>]*name=["\']description["\']',
|
|
44
|
+
re.IGNORECASE,
|
|
45
|
+
),
|
|
46
|
+
re.compile(
|
|
47
|
+
r'<meta[^>]+property=["\']og:description["\'][^>]*content=["\']([^"\']*)["\']',
|
|
48
|
+
re.IGNORECASE,
|
|
49
|
+
),
|
|
50
|
+
]
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def fetch_url(url, timeout=FETCH_TIMEOUT):
|
|
54
|
+
req = urllib.request.Request(url, headers={"User-Agent": USER_AGENT})
|
|
55
|
+
with urllib.request.urlopen(req, timeout=timeout) as resp:
|
|
56
|
+
return resp.read().decode("utf-8", errors="replace")
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def parse_sitemap_urls(xml_text, path_prefix, cutoff):
|
|
60
|
+
root = ET.fromstring(xml_text)
|
|
61
|
+
entries = []
|
|
62
|
+
for url_elem in root.findall(f"{SITEMAP_NS}url"):
|
|
63
|
+
loc = (url_elem.findtext(f"{SITEMAP_NS}loc") or "").strip()
|
|
64
|
+
lastmod = (url_elem.findtext(f"{SITEMAP_NS}lastmod") or "").strip()
|
|
65
|
+
if not loc:
|
|
66
|
+
continue
|
|
67
|
+
path = urllib.parse.urlparse(loc).path
|
|
68
|
+
if not path.startswith(path_prefix) or path == path_prefix:
|
|
69
|
+
continue
|
|
70
|
+
if not lastmod:
|
|
71
|
+
continue
|
|
72
|
+
try:
|
|
73
|
+
dt = datetime.fromisoformat(lastmod.replace("Z", "+00:00"))
|
|
74
|
+
except ValueError:
|
|
75
|
+
continue
|
|
76
|
+
if dt < cutoff:
|
|
77
|
+
continue
|
|
78
|
+
entries.append((loc, dt))
|
|
79
|
+
return entries
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def extract_meta(html):
|
|
83
|
+
title = ""
|
|
84
|
+
m = TITLE_RE.search(html)
|
|
85
|
+
if m:
|
|
86
|
+
title = m.group(1).strip()
|
|
87
|
+
description = ""
|
|
88
|
+
for pattern in META_DESC_RES:
|
|
89
|
+
m = pattern.search(html)
|
|
90
|
+
if m:
|
|
91
|
+
description = m.group(1).strip()
|
|
92
|
+
break
|
|
93
|
+
return title, description
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def slug_to_title(url):
|
|
97
|
+
slug = urllib.parse.urlparse(url).path.rstrip("/").rsplit("/", 1)[-1]
|
|
98
|
+
return slug.replace("-", " ").title()
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def main():
|
|
102
|
+
parser = argparse.ArgumentParser(description="Fetch Anthropic news signals from sitemap")
|
|
103
|
+
parser.add_argument("--config", required=True)
|
|
104
|
+
args = parser.parse_args()
|
|
105
|
+
|
|
106
|
+
try:
|
|
107
|
+
with open(args.config) as f:
|
|
108
|
+
config = yaml.safe_load(f)
|
|
109
|
+
except Exception as e:
|
|
110
|
+
print(f"Error reading config: {e}", file=sys.stderr)
|
|
111
|
+
sys.exit(1)
|
|
112
|
+
|
|
113
|
+
src = (config.get("sources") or {}).get("anthropic_news") or {}
|
|
114
|
+
if not src.get("enabled", False):
|
|
115
|
+
print("[]")
|
|
116
|
+
sys.exit(0)
|
|
117
|
+
|
|
118
|
+
freshness_hours = src.get("freshness_hours", 168)
|
|
119
|
+
max_items = src.get("max_items", 5)
|
|
120
|
+
|
|
121
|
+
cutoff = datetime.now(timezone.utc) - timedelta(hours=freshness_hours)
|
|
122
|
+
|
|
123
|
+
try:
|
|
124
|
+
sitemap_xml = fetch_url(SITEMAP_URL)
|
|
125
|
+
except (urllib.error.URLError, TimeoutError) as e:
|
|
126
|
+
print(f"Error fetching sitemap: {e}", file=sys.stderr)
|
|
127
|
+
print("[]")
|
|
128
|
+
sys.exit(0)
|
|
129
|
+
|
|
130
|
+
try:
|
|
131
|
+
entries = parse_sitemap_urls(sitemap_xml, PATH_PREFIX, cutoff)
|
|
132
|
+
except ET.ParseError as e:
|
|
133
|
+
print(f"Error parsing sitemap: {e}", file=sys.stderr)
|
|
134
|
+
print("[]")
|
|
135
|
+
sys.exit(0)
|
|
136
|
+
|
|
137
|
+
entries.sort(key=lambda x: x[1], reverse=True)
|
|
138
|
+
entries = entries[:max_items]
|
|
139
|
+
|
|
140
|
+
signals = []
|
|
141
|
+
for url, lastmod in entries:
|
|
142
|
+
try:
|
|
143
|
+
html = fetch_url(url)
|
|
144
|
+
title, description = extract_meta(html)
|
|
145
|
+
except (urllib.error.URLError, TimeoutError) as e:
|
|
146
|
+
print(f"Warn: could not fetch {url}: {e}", file=sys.stderr)
|
|
147
|
+
title, description = "", ""
|
|
148
|
+
|
|
149
|
+
signals.append({
|
|
150
|
+
"source": "rss",
|
|
151
|
+
"title": title or slug_to_title(url),
|
|
152
|
+
"url": url,
|
|
153
|
+
"content": description,
|
|
154
|
+
"published_at": lastmod.isoformat(),
|
|
155
|
+
"metadata": {"source_name": "anthropic-news"},
|
|
156
|
+
})
|
|
157
|
+
|
|
158
|
+
print(json.dumps(signals, indent=2))
|
|
159
|
+
sys.exit(0)
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
if __name__ == "__main__":
|
|
163
|
+
main()
|
|
@@ -172,6 +172,12 @@ if [[ "$EVENTS_ENABLED" == "true" ]]; then
|
|
|
172
172
|
run_source "events" "python3 '$SCRIPTS_DIR/fetch-events.py' --config '$CONFIG_PATH'"
|
|
173
173
|
fi
|
|
174
174
|
|
|
175
|
+
# 5. Anthropic news (sitemap-driven)
|
|
176
|
+
ANTHROPIC_NEWS_ENABLED=$(echo "$CONFIG_JSON" | python3 -c "import json,sys; d=json.load(sys.stdin); print('true' if d['sources'].get('anthropic_news',{}).get('enabled',False) else 'false')")
|
|
177
|
+
if [[ "$ANTHROPIC_NEWS_ENABLED" == "true" ]]; then
|
|
178
|
+
run_source "anthropic_news" "python3 '$SCRIPTS_DIR/fetch-anthropic-news.py' --config '$CONFIG_PATH'"
|
|
179
|
+
fi
|
|
180
|
+
|
|
175
181
|
# ── Combine and normalize ─────────────────────────────────────────────────────
|
|
176
182
|
|
|
177
183
|
echo " · Combining signals..." >&2
|
|
@@ -183,7 +189,7 @@ sys.path.insert(0, '$SCRIPTS_DIR')
|
|
|
183
189
|
from pipeline_utils import combine_signals, validate_signal, next_pipeline_path, normalize_score
|
|
184
190
|
|
|
185
191
|
# Read all source outputs
|
|
186
|
-
source_files = ['rss', 'hn', 'gmail', 'events']
|
|
192
|
+
source_files = ['rss', 'hn', 'gmail', 'events', 'anthropic_news']
|
|
187
193
|
all_signals = []
|
|
188
194
|
for name in source_files:
|
|
189
195
|
path = '$WORK_DIR/' + name + '.json'
|