idea-forge
${var} — Selector
mode [theme/constraint]. First token picks the mode:generate(default) collides the zeitgeist with the capability surface into ranked wedges;validatescreens the existing backlog for viability;memowrites 2 rigorous evidence-backed startup memos. Anything after the mode is a theme/constraint bias. A bare theme with no mode keyword (e.g.payments,crypto) =generatebiased to that theme.dry-runanywhere skips the notify. Examples: `` (empty → generate, open-ended) ·simulation(generate, themed) ·validate crypto(screen crypto ideas) ·memo solo founder(memos under a constraint) ·generate payments dry-run(generate, no notify). Apick:<id|name>value (from the "build next?" force-reply — e.g.pick:Onchain reputation) is intercepted before mode dispatch: it marks that idea as chosen-to-build in the shared backlog and ends — see "Force-reply interception" below.
Today is ${today}. Read soul/SOUL.md + soul/STYLE.md + STRATEGY.md first and read them closely — this skill thinks as the operator, in their worldview, not about them. If soul/ is the empty template, ground purely on STRATEGY.md + the capability surface and write in a clear, direct tone. Then read memory/MEMORY.md for current goals and active topics. Each mode below names its own memory/logs/ scan window for dedup — honor it.
Force-reply interception — pick:<idea> (run FIRST, before mode dispatch)
Before tokenizing ${var} for the mode, check it. If ${var} starts with pick:, this run is the operator answering the "which idea to build next?" force-reply — do not run generate/validate/memo. Handle it and end. This is behaviorally identical to idea-pipeline's step 0 (same backlog, same marking convention), so a pick reply works whichever skill it routes to:
- Strip the prefix:
sel="${var#pick:}", then trim whitespace (the remainder may contain colons/spaces — keep them). - If
selis empty →./notify "Which idea should I mark as next to build? Reply with its name or backlog number."and end. - Read the shared backlog
memory/topics/startup-ideas.md. If missing or no idea rows →./notify "No idea backlog yet — nothing to mark. Run generate first to fill it."and end. - Resolve
selto exactly one row in the table (| date | name | one-liner | fit | T+F+E |):- By name (preferred): case-insensitive exact match on the
namecell; else fuzzy — most significant-word overlap, orsela substring of the name (or vice-versa). Require one clear best match. - By number: a bare integer N with no name match → the Nth data row (1-based, in file order).
- No match / ambiguous tie →
./notify "Couldn't find an idea matching \"<sel>\". Reply with the exact name or backlog number. Candidates: <name1>, <name2>, <name3>."and end.
- By name (preferred): case-insensitive exact match on the
- Mark it chosen-to-build — the shared marking convention, identical to idea-pipeline: append
✓ selected ${today}to the end of that row'snamecell, keeping the table pipes intact. If already marked, leave it (idempotent). - Confirm with a short
./notify(keep it clean — notest/trace/ping/debugsubstrings):./notify "Marked \"<idea name>\" as next to build — flagged in the backlog. Run /feature or /deploy-prototype on it when you're ready."Do not auto-dispatch any skill — marking chosen is the safe action. - Log under a
### idea-forgeheading inmemory/logs/${today}.md: a- Mode: pickline, then- IDEA_FORGE_PICK: marked "<idea name>" as chosen-to-build (from a pick: reply). - End the run — do not run mode dispatch.