keel-wayfind
Skill0 starsChanged 57 days agoMITView on GitHub
Use when a piece of work is too big for one session AND the route to it is still foggy — chart it as a local map of decision tickets, then resolve them one per session until the way is clear. Pre-stage of the keel pipeline; hands off to keel-discover or keel-plan once the fog is gone.
In this repository9 other files it gives its agents.
- keel-auditSkill
- security-auditSkill
- keel-debugSkill
- keel-discoverSkill
- keel-executeSkill
- keel-finishSkill
- keel-plan-reviewSkill
- keel-planSkill
- keel-workflowSkill
The file
We split this skill into the rules it gives an agent
6 rules. About 0 are common, 1 is distinctive, and 5 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈1
Distinctive · estimate
This author's own choices. Worth a look.
5
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 30
Plan, don't do: Every ticket resolves a decision.
- Very specific: line 36
When NOT to use: if one keel-discover session could plausibly settle all open questions, skip the map — this skill's overhead only pays off …
- Distinctive: line 161
Stop. Charting is one session's work.
- Very specific: line 163
Do not pass a model override at the call site — each agent file pins its own.
- Very specific: line 168
Read MAP.md first — not every ticket body.
- Very specific: line 177
If no open tickets remain and the fog sections are empty → the way is clear: exit to keel-discover (or keel-plan), linking the map as input.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
keel-wayfind — Decision Maps for Oversized Work
INPUT an idea too large for one session whose route is still unclear —
fog, not just size
OUTPUT docs/maps/<topic>/MAP.md with zero open tickets and no fogged
section, exiting to keel-discover or keel-planMissing INPUT → BLOCKED: 缺 <foggy oversized idea> → 退回 the requester.
In practice the miss is the other way round: this is the wrong stage. Work that is merely large but whose
route is visible goes straight to keel-discover; the fog is the entry
condition, not the size.
A loose idea has arrived — too big for one session, and wrapped in fog: the route from here to the destination isn't visible yet. Wayfinding charts that route as a map of decision tickets — questions whose resolution is a decision, not slices of a build — and resolves them one at a time.
Plan, don't do. Every ticket resolves a decision. The map is done when nothing is left to decide — then the effort exits to keel-discover (spec the now-clear work) or keel-plan (if the decisions already amount to a spec). Feeling the pull to just start building is the signal you've reached the map's edge and it's time to exit, not to code inside the map.
When NOT to use: if one keel-discover session could plausibly settle all open questions, skip the map — this skill's overhead only pays off when the deciding itself spans sessions.
On session start or after compaction: re-read MAP.md and the open
tickets FIRST. The map is the only truth about which decisions are made
and which are still fogged; a recollection of ticket state is not. MAP.md is
designed to be loaded every session anyway — compaction just makes the
re-read non-optional.
File layout
docs/maps/<topic>/
├── MAP.md ← the map: low-res view, loaded every session
└── tickets/
├── 01-<slug>.md
└── 02-<slug>.mdMAP.md
# Map: <topic>
## Destination
<what reaching the end looks like — the spec, decision, or change this
effort is finding its way to. 1-2 lines; every session orients here first.>
## Notes
<domain background; skills every session should consult; standing
preferences for this effort>
## Decisions so far
<!-- index only — one line per resolved ticket; detail stays in the ticket -->
- [01 — <ticket title>](tickets/01-<slug>.md) — <one-line gist of the answer>
## Not yet specified
<!-- fog of war: in-scope questions you can't phrase sharply yet -->
## Out of scope
<!-- consciously ruled out; never graduates unless the destination is redrawn -->Ticket file
# <NN> — <title>
**Type:** research | prototype | grilling | task
**Status:** open | resolved | out-of-scope
**Blocked by:** <NN list, or "none">
## Question
<the decision or investigation this ticket resolves — sized to one session>
## Resolution
<empty until resolved; then the answer, and links to any assets produced>Ticket types
Each is HITL (worked with the user live) or AFK (agent alone). A HITL ticket only resolves through that exchange — never answer the user's side yourself.
- research (AFK) — surface a fact a decision waits on: docs, third-party APIs, the codebase. Resolvable by a background subagent; findings land in the Resolution section with citations.
- prototype (HITL) — raise the fidelity of the discussion with a cheap
concrete artifact to react to. A prototype is throwaway code that
answers a question (from mattpocock prototype) — discipline:
- Logic question → a pure reducer/state-machine with a throwaway shell (CLI/TUI) calling into it; nothing flows the other direction. The pure core may graduate to production later; the shell always dies.
- UI question → radically different variants mounted inside the real
page behind a
?variant=switcher — a standalone demo page is a vacuum, reactions there don't transfer. - Capture: commit the prototype to a throwaway branch; only the decision reaches the ticket's Resolution (plus decision-rich snippets — a state machine, a schema — inlined there). A prototype that starts growing features is violating plan-don't-do: stop, extract the decision, delete.
- grilling (HITL) — the default: one-question-at-a-time interview (keel-discover's step-3 discipline, including the domain-language rules) until the question is decided.
- task (either) — manual work that must happen before a decision can be made: provision access, sign up for a service, move data so its shape can be seen. The one type that does rather than decides — it earns its place by unblocking a decision. Resolution records what was done and the facts later tickets depend on.
Fog of war
Chart only what you can see. The test for ticket vs fog: can you state the question precisely now? (Not: can you answer it.)
- Sharp question → ticket, even if blocked.
- Can't phrase it sharply → one loose line in Not yet specified. Don't pre-slice fog into ticket-sized pieces; one patch may become several tickets, or none, once the frontier reaches it.
- Beyond the destination → Out of scope, with one line on why. A mis-scoped existing ticket gets Status: out-of-scope and a line there — it never enters Decisions so far.
Invocation
Two modes. Either way: resolve at most ONE ticket per session — research tickets excepted (they may run in parallel as background subagents).
Chart the map (first session)
- Name the destination — grill the user (one question at a time) until the destination is 1-2 lines sharp. It fixes the scope, so it's first.
- Map the frontier — grill again, breadth-first across the whole space, surfacing open decisions. If this surfaces no fog, you don't need a map: exit to keel-discover directly.
- Create
MAP.mdand the tickets you can state sharply now, numbered in dependency order,Blocked bywired. Everything else → fog sections. - Fire
keel-wayfind-researchersubagents for any research tickets (nevergeneral-purpose, no model override); wire their Resolutions in as they land, and broadcast each as it returns. Cap concurrent researchers at 8. A ticket that turns out to need the user's preference rather than an external fact was mis-typed — retype it as HITL, don't let a researcher guess an answer that then reads as fact in later sessions. - Stop. Charting is one session's work.
Do not pass a model override at the call site — each agent file pins its own.
Name the agent, not the role: announce each dispatch before it runs and broadcast each result when it lands, both using the agent's literal keel-* name.
Work the map (every later session)
- Read
MAP.mdfirst — not every ticket body. The frontier = open tickets whose blockers are all resolved. - Pick the ticket: the user's named one, else the first frontier ticket.
- Resolve it by its type. Zoom into related resolved tickets on demand.
- Record: fill the ticket's Resolution, flip Status to resolved, append the one-line gist to Decisions so far.
- Tend the map: graduate any fog the answer sharpened into new tickets (removing it from Not yet specified), rule newly-revealed out-of-scope items out, update or drop tickets the decision invalidated.
- If no open tickets remain and the fog sections are empty → the way is clear: exit to keel-discover (or keel-plan), linking the map as input.
Red flags
- Writing implementation code inside a wayfind session → the map plans; exit to the pipeline to build
- A ticket whose resolution is "we built it" → that was a build slice, not a decision
- Ticketing something you can't yet phrase sharply → that's fog, leave it in Not yet specified
- Resolving three tickets in one sitting because they "seemed quick" → depth per decision is the point; one per session
- Answering a grilling ticket's questions yourself because the user is away → HITL means the user decides; park it and take a research/task ticket instead
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

