Pre-computed context
Current user: !gh api user --jq '.login' 2>/dev/null || echo "unknown"
Open maps: !gh issue list --label work-map --state open --json number,title --jq '.[] | "#\(.number) \(.title)"' 2>/dev/null || echo "none"
Variables
Arguments: $ARGUMENTS
Purpose
Some efforts are too big to hold at once AND too foggy to ticket — you can't yet
phrase half the questions, let alone answer them. /interview needs a coherent task;
/planning:plan needs a coherent plan; both presuppose you already know what you're deciding.
/wayfind sits upstream of all of them: it turns a too-big-foggy effort into a shared
decision map on the work-item tracker, then works that map's frontier one decision at a
time until the fog burns off and a real destination (Brief / PRD / PLAN) can be handed onward.
Plan, don't do. A map holds decisions, not build work. Each decision item, once
resolved, either sharpens the map or graduates to the destination. The moment the destination
is coherent, the map closes and the normal pipeline (/interview → /design → /planning:plan → /implement) takes over. Fog-of-war framing adapted from Matt Pocock's wayfinder — this skill
diverges by persisting the map as native tracker primitives, routing each decision to a
first-party skill, and keeping execution artifacts in <memory_dir>/<slug>/ (default
.work/) — the topic-docs convention's memory tier, slug spec and all (see
${CLAUDE_PLUGIN_ROOT}/reference/topic-docs.md)
— rather than the map.
Two modes. chart builds or extends a map (interactive only). work picks one item off
the map's frontier and drives it to resolution. The default action auto-detects: an existing
open map for the topic → work; nothing yet → chart.
The fog test (the one call that governs everything)
For every uncertainty, ask: can I phrase it as a sharp question?
- Sharp (you can state the question, even if you can't answer it yet, even if it's blocked) → it's a decision item on the map (a typed sub-issue).
- Foggy (you can't yet put words to what's uncertain) → it stays prose in the map's Not-yet-specified section. It graduates to a typed item only once working the map has made it sharp enough to phrase.
Sharpness, not blockedness, is the line. A blocked-but-phrasable question is a ticket; an unblocked-but-unphrasable worry is fog. (Ticket-vs-fog distinction: Pocock's wayfinder.)
Action Router
Parse the first token of $ARGUMENTS.
| Argument | Action | When |
|---|---|---|
| (empty) | auto | Open map for the topic exists → work; else → chart |
chart [topic] |
Chart | Build or extend a decision map. Interactive only — refuses non-interactive sessions (charting burns assumptions that need a human) |
work [#map] |
Work | Pick one frontier item and drive it to resolution |
Chart mode
Charting is a human-in-the-loop session. If the session is non-interactive
(CLAUDE_CODE_REMOTE, claude -p, an autonomous loop), STOP and report that charting needs
an interactive session — do not fabricate a map.
- Survey + fog test. Ground in the effort (read any existing
<memory_dir>/<slug>/, recent commits, the topic). Sort every uncertainty through the fog test: sharp → candidate decision item; foggy → Not-yet-specified prose. - Create or extend the map issue. On first use in a repo, verify the wayfind label
taxonomy (
work-map,wayfind: *,needs-human) is present — an unknown--labelfails the create. Honor the consuming repository's declared label ownership. If it names a label-as-code source of truth, STOP and report the exact missing set to that owner; otherwise report the set and ask the user how labels are provisioned. Never create labels ad hoc from this skill. Then create one issue labelled barework-map(+ any repo program labels). Body carries the five sections — Destination (where this is going once the fog clears) / Notes (durable pointers only — PRs, committed docs, prior items, external links; memory-tier<memory_dir>/artifacts are checkout-local, so distill their relevant content inline instead of pointing at paths other readers cannot resolve) / Decisions-so-far (a pointer index — each resolved decision's home is its own item's resolution comment, never recopied here) / Not-yet-specified (fog, prose) / Out-of-scope. Template + exactghcalls:context/tracker-mechanics.md. - Create typed decision items as sub-issues of the map, one per sharp question. Type
label sets the routing target and the default mode (below). Wire
blocked-byedges where one decision genuinely gates another — never invent edges to impose false order. - Materialize the mode on each item at creation: HITL types (
interview,design,prototype) get theneeds-humanlabel;researchomits it (autonomous-capable);taskis per-item. One mechanism — the presence/absence ofneeds-human— carries the mode; no parallelMode:body field. - Hand off to
work. Report the frontier (open, unblocked, unassigned items) and recommend/planning:wayfind workto start resolving.
Work mode
-
Session-start reclaim + map hygiene. Reclaim any of your own stale in-progress items (idempotent). Check the map's invariants: every closed decision has a Decisions-so-far pointer line; no item resolved-in-comment but still open. Fix violations before proceeding.
-
Compute the frontier.
frontier = open ∧ zero OPEN blockers ∧ unassigned(a closed blocker no longer holds an item back — count open blockers, not the raw edge count). In a non-interactive session, further filter OUTneeds-humanitems; if that empties the frontier, STOP with a truthful "all remaining decisions need a human" — never resolve a HITL item by standing in for the human. -
Pick one and claim it (sibling claim model —
@meassignee + claim-comment lease with comment-order collision check, no claim label; seecontext/tracker-mechanics.md). -
Route by type — invoke the target skill directly; its own Q&A supplies the HITL loop:
Type label Mode Routes to wayfind: researchautonomous-capable /discovery:research(falls back to inline research if not installed)wayfind: interviewHITL /planning:interviewwayfind: designHITL /planning:design— or/event-storming:methodology//event-storming:simulationwhen the item is domain/event-model workwayfind: prototypeHITL /prototype:pressure-test(behaviour/feasibility) or/prototype:explore-directions(design/UX) — the item body says whichwayfind: taskper-item Direct decision-unblocking work — no feature code, no PR tie -
Graduate on every resolution. When the decision resolves: post the resolution as a comment on the item, add its one-line pointer to the map's Decisions-so-far index, then close the item (comment → index → close, as one atomic sequence). If the resolution sharpened previously-foggy uncertainty, chart the new sharp items now.
-
Map closure → destination handoff. When the frontier is empty and every decision item is closed, the destination is coherent: close the map issue and hand the destination onward (
/planning:interviewor/planning:prdfor a Brief/PRD;/planning:planfor a PLAN). A map's job ends where the pipeline's begins.
Escalation — pull the user back to charting at choke points
/wayfind's description carries the proactive trigger. The sibling skills carry pull-back
lines: when /interview, /planning:plan, or /implement hits a task that is clearly
too-big-AND-foggy for their stage, they name /planning:wayfind as the better entry —
guiding the user, never auto-switching. Wording lives in each of those skills; this skill
owns the trigger's meaning (too-big + fog, both, not either alone).
Composition
| When | Skill | How it composes |
|---|---|---|
| Effort too big AND foggy to ticket | /planning:wayfind (this) |
Produces a decision map; graduates to a destination |
| A single sharp contract to lock | /planning:interview |
The map's interview-typed items route here; also the graduation target |
| Product intent still fuzzy | /planning:prd |
Graduation target when the destination is a PRD |
| Design-space item | /planning:design, /event-storming:* |
design-typed items route here |
| Feasibility / UX unknown | /prototype:pressure-test, /prototype:explore-directions |
prototype-typed items route here |
| External-evidence item | /discovery:research |
research-typed items route here (autonomous) |
| The plan itself | /planning:plan |
Graduation target when the destination is a PLAN |
What this skill does NOT do
- Does not do build work. A map holds decisions; build items live on the ordinary tracker
(
/work-items) after the map graduates. If a decision resolves into buildable work, that's a graduation, not a map item. - Does not resolve a HITL item for the human.
needs-humanitems are never resolved by an agent standing in for the user (inviolable). Non-interactive frontier filters them out. - Does not chart non-interactively. Charting burns assumptions that need a human in the
loop; the
chartaction refuses non-interactive sessions. - Does not store coordination in the memory tier. The map (coordination) lives on the
tracker;
<memory_dir>/<slug>/(default.work/) holds execution artifacts only (journals, research scratch, evidence). - Does not invent a second claim/mode mechanism. Claims use the sibling
/work-itemsmodel; mode is theneeds-humanlabel — no parallel taxonomy.
Reference
context/tracker-mechanics.md— theghcommands for map creation, typed-item creation, edges, frontier query, and the claim protocolcontext/map-anatomy.md— the map body template, the five sections, and the graduation/closure invariants