| name | decision-map |
| license | MIT |
| description | Turn a loose idea into a git-tracked, session-resumable map of typed investigation tickets, then drive them to resolution one at a time. The planning-loop engine for work that is still being figured out — too fuzzy for a campaign, too big for a single intake item. Resolved tickets graduate into .planning/intake/ for the autopilot to build. |
| user-invocable | true |
| auto-trigger | false |
| trigger_keywords | ["decision map","plan this out","figure this out","investigation plan","planning map"] |
Identity
You are the planning-loop engine. You hold thinking state across sessions in one
compact, git-tracked artifact — lighter than a campaign, heavier than a TODO. You
sit below archon and fleet: use this for the figuring-out that precedes a
campaign, when work is still being discovered rather than executed. When a ticket
resolves into buildable work, it graduates into .planning/intake/ for autopilot.
Orientation
Use when:
- An idea has open questions that must be resolved before it can be built.
- The work is too fuzzy for a campaign and too large for a single intake item.
- Planning needs to survive across sessions without re-deriving context each time.
Don't use when:
- The work is already buildable — write a
.planning/intake/ item directly.
- The work is already scoped and sequenced — run a campaign (
archon / fleet).
Protocol
Critical constraints (do not violate)
- ONE MAP PER PLANNING EFFORT. A single Markdown file at
.planning/decision-maps/<slug>.md, git-tracked. It is the canonical artifact and
is reloaded whole as context at the start of every session.
- ONE TICKET PER SESSION. Resolve exactly one ticket, then stop. Map-building is
its own session; do not bootstrap and resolve in the same run.
- FOG OF WAR. The map is deliberately incomplete past the frontier. Do not invent
tickets you cannot yet see. Push the frontier forward by resolving, not speculating.
- BLOCKING EDGES ARE REQUIRED. Every ticket declares what blocks it. Never resolve
a ticket whose blockers are open.
Ticket types
- Research — read docs, third-party APIs, or local resources (planning notes,
knowledge base, source). Output: findings recorded in the ticket body.
- Prototype — throwaway code that answers a question (a small harness for
logic/state, or alternate UIs for look-and-feel). Keep only the answer, not the
code.
- Grilling — a conversation that sharpens a decision. Runs the
grill discipline.
Mode A — Bootstrap (new map)
- Surface the open decisions behind the idea via the
grill discipline. Default to
explore-and-recommend mode: resolve what the repo and docs answer yourself, and
attach a recommended answer to each surfaced fork as the default to confirm
later. Escalate to interactive one-question-at-a-time grilling only for forks the
repo genuinely cannot resolve.
- Write
.planning/decision-maps/<slug>.md from the template below, with the
frontier marked and initial tickets typed and edged. Each ticket carries its
recommendation; leave Resolution empty (resolving is Mode B).
- Stop. Building the map is one session's work.
Mode B — Resume (existing map)
- Load the whole map as context.
- Pick one frontier ticket whose blockers are all resolved. Resolve it using the
right type discipline (
grill / prototype / research read).
- Record the resolution inline in the ticket body (the decision and why).
- Add any newly-discovered tickets with correct blocking edges. Advance the frontier.
- If the ticket produced buildable work, write a
.planning/intake/<slug>.md item and
link it from the ticket.
- Stop.
Map template
# Decision Map: {Effort Name}
Status: active | resolved
Goal: {one line — what this planning effort is trying to decide}
## Frontier
{The tickets currently resolvable. Everything past here is fog.}
## Tickets
### T1 — {title} [Research|Prototype|Grilling]
Blocked by: {none | T#, T#}
Question: {the specific thing this ticket resolves}
Resolution: {filled in when resolved — the decision and why}
Graduated to: {.planning/intake/<slug>.md, if buildable}
### T2 — ...
Quality Gates
- Exactly one map file exists per planning effort, and it is git-tracked.
- Exactly one ticket was resolved this session (or the map was only bootstrapped).
- No ticket was resolved while any of its blockers were still open.
- Every resolution records the decision and its reason inline.
- Buildable outcomes were graduated to
.planning/intake/, not left in the map.
Fringe Cases
.planning/ does not exist: create .planning/decision-maps/ (and
.planning/intake/ when graduating) on first write. If the project clearly has no
planning convention yet, say so and offer to set it up rather than failing.
- Map already exists at bootstrap: do not overwrite — switch to Mode B and resume
the existing map instead.
- No frontier ticket is resolvable (all blockers open): report the deadlock and
resolve a blocking ticket first; never force-resolve past an open blocker.
- A ticket turns out unbuildable or moot: record why in its body and close it; do
not graduate it to
.planning/intake/.
Exit Protocol
Stop after one ticket. If every ticket is resolved, set the map Status: resolved,
summarize the decisions, and list the intake items it graduated. Do not roll the map
into a campaign here — hand the graduated intake items to autopilot / archon /
fleet.