wayfinder
Plan a huge chunk of work — more than one agent session can hold — as a shared map of decision tickets on your issue tracker, and resolve them one at a time…
Skill by jackey8616
Install
Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.
npx agentmarket install skill/jackey8616-wayfinder
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Use cases: agent-building
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions: not checked yet.
What's inside
- Skill name
wayfinder- Description
- Plan a huge chunk of work — more than one agent session can hold — as a shared map of decision tickets on your issue tracker, and resolve them one at a time until the way to the destination is clear.
- License
- MIT
- Instructions
- 156 lines in SKILL.md · view on GitHub
Files (2)
- SKILL.md
- openai.yaml · agents/
SKILL.md (first lines)
A loose idea has arrived — too big for one agent session, and wrapped in fog: the way from here to the **destination** isn't visible yet. Wayfinding is about finding that way, not charging at the destination. This skill charts the way as a **shared map** on the repo's issue tracker, then works its **decision tickets** — questions whose resolution is a decision, not slices of a build to execute — one at a time until the route is clear. The destination varies per effort, and naming it is the first act of charting — it shapes every ticket. It might be a plan complete enough for someone else to build from, a direction locked down before planning starts, or a migration carried out in place on a live data structure. The map is domain-agnostic — engineering work, course content, whatever fits the shape. ## Plan, don't do Wayfinder is **planning** by default: each ticket resolves a decision, and the map is done when the way is clear — nothing left to decide before someone goes and does the thing. The pull to just do the work is usually the signal you've reached the edge of the map and it's time to hand off. An effort can override this in its **Notes** — carrying execution into the map itself — but absent that, produce decisions, not deliverables. ## Refer by name Every map and ticket is an issue, so it has a **name** — its title. In everything the human reads — narration, the map's Decisions-so-far — refer to it by that name, never by a bare id, number, or slug. A wall of `#42, #43, #44` is illegible; names read at a glance. The id and URL don't vanish — a name wraps its link — but they ride _inside_ the name, never stand in for it. ## The Map The map is a single issue on this repo's issue tracker, labelled `wayfinder:map` — the canonical artifact. Its tickets are child issues of the map. The map is an **index**, not a store. It lists the decisions made and points at the tickets that hold their detail; a decision lives in exactly one place — its ticket — so the map never restates it, only gists it and links. **Where the map, its child tickets, blocking, and frontier queries physically live is tracker-specific.** The issue tracker should have been provided to you — run `/setup-skills` if not. Consult the tracker doc's "Wayfinding operations" section for how _this_ repo expresses them. If no tracker has been provided, default to the local-markdown tracker. ### The map body The whole map at low resolution, loaded once per session. Open tickets are **not** listed — they are open child issues, found by query. ```markdown ## Destination <what reaching the end of this map looks like — what this effort is finding its way to. One or two lines; every session orients to it before choosing a ticket.> ## Notes <domain; skills every session should consult; standing preferences for this effort> ## Decisions so far <!-- the index — one line per closed ticket: enough to judge relevance, then zoom the link for the detail the ticket holds --> - [<closed ticket title>](link) — <one-line gist of the answer> ## Not yet specified <!-- see "Fog of war": in-scope fog you can't ticket yet; graduates as the frontier advances --> ## Out of scope <!-- see "Out of scope": work ruled beyond the destination; closed, never graduates --> ``` ### Tickets Each ticket is a **child issue** of the map; the tracker's issue id is its identity. Its body is the question, sized to one 100K token agent session: ```markdown ## Question <the decision or investigation this ticket resolves> ``` Each ticket carries a `wayfinder:<type>` label — one of `research`, `prototype`, `grilling`, `task` (see [Ticket Types](#ticket-types)). A session **claims** a ticket by assigning it to the dev driving the map, **first**, before any work, so concurrent sessions skip it. That assignee _is_ the claim: an open, unassigned ticket is unclaimed. Blocking uses the tracker's **native** dependency relationship — essential because it renders the frontier _visually_ in the tracker's own UI, so the human sees what's takeable without opening the map. Only a tracker that lacks native blocking falls back to a body convention. A ticket is **unblocked** when every ticket blocking it is closed; the **frontier** is the open, unblocked, unclaimed children — the edge of the known. The answer isn't part of the body — it's recorded on resolution (see [Work through the map](#work-through-the-map)). Assets created while resolving a ticket are linked from the issue, not pasted in. ## Ticket Types Every ticket is either **HITL** — human in the loop, worked _with_ a human who speaks for themselves — or **AFK**, driven by the agent alone. A HITL ticket only resolves through that live exchange; the agent never stands in for the human's side of it (a grilling agent that answers its own questions has broken this). - **Research** (AFK): Reading documentation, third-party APIs, or local resources like knowledge bases to surface a fact a decision waits on. Resolved by a `/research` **subagent**. Use when knowledge outside the current working directory is required. - **Prototype** (HITL): Raise the fidelity of the discussion by making a cheap, rough, concrete artifact to react to — an outline, a rough take, a stub, or UI/logic code via the /prototype skill. Links the prototype as an asset. Use when "how should it look" or "how should it behave" is the key question. - **Grilling** (HITL): Conversation. The default case. Always invoke the /grilling and /domain-modeling skills. - **Task** (HITL or AFK): Manual work that must happen before a _decision_ can be made — nothing to decide, prototype, or research, but the discussion is blocked until it's done. Signing up for a service so its API can be judged, provisioning access, moving data so its shape can be seen. This is the one type that _does_ rather than decides — and it earns its place by unblocking a decision, not by delivering the destination. The agent drives it alone where it can (AFK); otherwise it hands the human a precise checklist (HITL). Resolved when the work is done; the answer records what was done and any resulting facts (credentials location, new URLs, row counts) later tickets depend on. ## What a resolution writes A resolution lands in its ticket and gets gisted onto the map. But an answer that settled a *word*, or a decision the repo will live with, belongs to the repo's documents too — the map is an index, not a place those live. Write these **as each ticket resolves**, never batched to the end. Batching forces the closing session to re-read every closed ticket, which is the context blow-up the map exists to prevent. | The sentence you're writing | Where it goes | | -------------------------------------------------------------------- | ---------------------------------------------------------------- | | "In this project, the word *X* means…" | `CONTEXT.md`, immediately | | "We chose A over B, and undoing it would be expensive" | A new ADR — only if it clears the gate below | | "We chose A over B, for reasons that stop mattering once this ships" | The ticket's resolution comment; it reaches `design.md` at the close | | "The system does X when Y" | **Not here.** That's the spec layer; `/to-spec` writes it, after the map hands off | **A new ADR** only when the decision is **hard to reverse**, **surprising without context**, *and* **the result of a real trade-off**. All three, or no ADR — declining is the normal outcome, and you don't mention the one you decided against. Where one is written, the map's Decisions-so-far line links to it, so the index shows which resolutions were promoted. **By ticket type**, `CONTEXT.md` is open to all four — any ticket can pin a word down. The ADR gate applies to **grilling** and **prototype** only. `research` produces facts and `task` produces state; neither is a decision, and letting them open ADRs invites "I found out X, so here's an ADR" — the requirement-as-decision confusion the layers exist to stop. This condenses `/domain-modeling`'s own routing rule, and these rules hold whether or not it loaded. Invoke it anyway: it is the active discipline, and it owns the rule. ## Fog of war The map is _deliberately_ incomplete: don't chart what you can't yet see. Beyond the live tickets lies the **fog of war** — the dim view of decisions and investigations you can tell are coming but can't yet pin down, because they hang on questions still open. Resolving a ticket clears the fog ahead of it, graduating whatever's now specifiable into fresh tickets — one at a time, until the way to the destination is clear and no tickets remain. The map's **Not yet specified** section is where that dim view is written down: the suspected question, the area to revisit later. It's the undiscovered frontier _toward_ the destination — everything here is in scope, just not sharp enough to ticket. Write as loosely or as fully as the view allows; it doubles as a signpost for collaborators reading where the effort is headed. **Fog or ticket?** The test is whether you can state the question precisely now — _not_ whether you can answer it now. - **Ticket when** the question is already sharp — even if it's blocked and you can't act on it yet. - **Not yet specified when** you can't yet phrase it that sharply. Don't pre-slice the fog into ticket-sized pieces: it's coarser than a ticket, and one patch may graduate into several tickets, or none, once the frontier reaches it. **Not yet specified** excludes what's already decided (Decisions so far), what's already a live ticket, and what's out of scope (the next section). ## Out of scope Fog only ever gathers _toward_ the destination. The destination fixes the scope, so work beyond it is **out of scope** — it isn't fog, and it doesn't belong in **Not yet specified**. It gets its own **Out of scope** section on the map: work you've consciously ruled out of _this_ effort. Scope, not sharpness, lands it here. Out-of-scope work never graduates — the frontier stops at the destination — so it returns only if the destination is redrawn, and then as a fresh effort, not a resumption. Ruling something out of scope is a scoping act, not a step on the route. When a ticket that already exists turns out to sit past the destination — mis-scoped in while charting, or exposed by a resolution — **close it** (a closed ticket is unambiguously off the frontier) and leave one line in the **Out of scope** section: the gist plus why it's out of scope, linking the closed ticket. It stays out of **Decisions so far**, which records the route actually walked — a scope boundary isn't a step on it. ## Invocation Three modes. In the two that work tickets, **never resolve more than one ticket per session** — with the exception of research tickets.
From jackey8616/skills, MIT.
More from jackey8616/skills
- 0.524score
writing-proposals
jackey8616
Open an OpenSpec change and write its proposal — the problem, the agreed solution, and what was ruled out.
SkillBFreshness: BClaude Code +9 - 0.521score
to-spec
jackey8616
Turn the current conversation into an OpenSpec change proposal — no interview, just synthesis of what you've already discussed.
SkillBFreshness: BClaude Code +9 - 0.521score
change-review
jackey8616
Review a finished OpenSpec change against its own delta specs, then archive it — every requirement built and tested, nothing shipped that wasn't proposed.
SkillBFreshness: BClaude Code +9 - 0.499score
domain-modeling
jackey8616
Build and sharpen a project's domain model.
SkillBFreshness: BClaude Code +9 - 0.499score
code-review
jackey8616
Review the changes since a fixed point (commit, branch, tag, or merge-base) along two axes — Standards (does the code follow this repo's documented coding…
SkillBFreshness: BClaude Code +9 - 0.499score
codebase-design
jackey8616
Shared vocabulary for designing deep modules.
SkillBFreshness: BClaude Code +9 - 0.496score
to-tickets
jackey8616
Break a plan, spec, or the current conversation into a set of tracer-bullet tickets, each declaring its blocking edges, published to the configured tracker —…
SkillBFreshness: BClaude Code +9 - 0.496score
triage
jackey8616
Move issues and external PRs through a state machine of triage roles — categorise, verify, grill if needed, and write agent-ready briefs.
SkillBFreshness: BClaude Code +9 - 0.493score
ask
jackey8616
Ask which skill or flow fits your situation.
SkillBFreshness: BClaude Code +9 - 0.493score
grill-with-docs
jackey8616
A relentless interview to sharpen a plan or design, which also creates docs (ADR's and glossary) as we go.
SkillBFreshness: BClaude Code +9 - 0.493score
implement
jackey8616
Implement a piece of work based on a spec or set of tickets.
SkillBFreshness: BClaude Code +9
Signals
- Stars
- 0
- Forks
- 0
- Open issues
- 0
- Last commit (this folder)
- Aug 16, 2026 (2 months ago)
From GitHub (fetched Oct 24, 2026).
Details
- License
- MIT
- Repository
- github.com/jackey8616/skills
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from jackey8616
- 0.524score
writing-proposals
jackey8616
Open an OpenSpec change and write its proposal — the problem, the agreed solution, and what was ruled out.
SkillBFreshness: BClaude Code +9 - 0.521score
to-spec
jackey8616
Turn the current conversation into an OpenSpec change proposal — no interview, just synthesis of what you've already discussed.
SkillBFreshness: BClaude Code +9 - 0.521score
change-review
jackey8616
Review a finished OpenSpec change against its own delta specs, then archive it — every requirement built and tested, nothing shipped that wasn't proposed.
SkillBFreshness: BClaude Code +9 - 0.499score
domain-modeling
jackey8616
Build and sharpen a project's domain model.
SkillBFreshness: BClaude Code +9 - 0.499score
code-review
jackey8616
Review the changes since a fixed point (commit, branch, tag, or merge-base) along two axes — Standards (does the code follow this repo's documented coding…
SkillBFreshness: BClaude Code +9 - 0.499score
codebase-design
jackey8616
Shared vocabulary for designing deep modules.
SkillBFreshness: BClaude Code +9
Cite this page
wayfinder skill. Agent Mart. https://agentmart.dev/skills/jackey8616-wayfinder (last updated 2026-10-24)