Compare commits

...
Author SHA1 Message Date
Matt PocockandClaude Opus 4.8 ce908a6220 Add changeset for the self-grilling fix
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-06 13:59:13 +01:00
Matt PocockandClaude Opus 4.8 e5932a7a47 wayfinder/grilling: stop the agent grilling itself
Students reported /wayfinder picking a grilling ticket and grilling
itself instead of turning to the human (confirmed by @_noshit /
@maudova; Matt: "that sounds like a bug"). Root cause: a grilling line
written for the live-human case ("explore the codebase instead") reads
as license to answer questions autonomously once wayfinder runs it in a
resolve-the-ticket frame.

Fix with affirmative framing (no negative-space "don't"):
- grilling: split facts (look up) from decisions (put to the human, wait)
- wayfinder Grilling ticket type: a back-and-forth with the human, who
  answers each question
- wayfinder Invocation: grilling always runs with the human in the loop

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-06 13:57:47 +01:00
Matt PocockandGitHub acf55d88b7 Merge pull request #462 from mattpocock/wayfinder/plan-not-execute
wayfinder: reassert planning-only purpose
2026-07-06 13:55:01 +01:00
Matt PocockandClaude Opus 4.8 7be28cf5e6 wayfinder: planning by default, overridable via Notes; shrink section
Address review: don't preclude execution. Wayfinder is planning by
default, but an effort's Notes can carry execution into the map. Collapse
the section to one paragraph, revert the destination sentence to its
original (which already allowed an executed change), and drop the Task
cross-reference to match.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-06 13:53:59 +01:00
Matt PocockandClaude Opus 4.8 80f29a4f29 wayfinder: reassert planning-only purpose with a leading-word section
Add a "Plan, don't do" section as the single source of truth for the
plan/execute boundary, and bring two passages into line with it:

- Destination is always a set of resolved decisions, never the executed
  change itself (the migration example previously read as execution).
- The Task ticket type now earns its place only by unblocking a decision,
  pointing back to the new section rather than restating the principle.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-06 13:49:33 +01:00
Matt PocockandGitHub 5a7f7e5c2a Merge pull request #460 from mattpocock/wayfinder-no-fog-early-exit
wayfinder: restore no-fog early exit
2026-07-06 13:42:16 +01:00
Matt PocockandClaude Opus 4.8 9b43c3359b wayfinder: simpler no-fog wording — 'you don't need a map'
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-06 13:40:26 +01:00
Matt PocockandClaude Opus 4.8 ad99c73a2d wayfinder: reframe no-fog exit as too-small-for-a-map
Not "implement directly" — the point is the journey fits one session and
doesn't justify a map. Stop and ask the user how to proceed.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-06 13:38:59 +01:00
Matt PocockandClaude Opus 4.8 55511cea24 wayfinder: restore no-fog early exit
Bring back the "skip the map when there's no fog" branch that was
collateral-deleted with the Handoff section. Co-located in Chart the
map step 2, where the fog/no-fog outcome is determined: if breadth-first
grilling surfaces no fog, offer to skip the map and implement directly.
The offer (ask, don't auto-skip) is preserved from the original.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-06 13:36:44 +01:00
Matt PocockandGitHub d11147daaf Merge pull request #459 from mattpocock/to-issues-sub-issues-and-prototype
to-issues: prefer native sub-issues; reference /prototype code explicitly
2026-07-06 13:35:18 +01:00
Matt PocockandClaude Opus 4.8 0172e61e57 to-issues: prefer native sub-issues; reference /prototype code explicitly
Two minimal edits to the to-issues skill:

- The "What to build" template now points explicitly at the `/prototype`
  skill's code as the source of an inlined decision snippet, rather than
  gesturing at "a prototype".
- Publishing now prefers the tracker's native sub-issues (parent → slice)
  and native blocking edges (Blocked by) where supported — mechanics
  already documented in the issue-tracker doc — keeping the `## Parent`
  and `## Blocked by` body sections as the fallback.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-06 13:33:44 +01:00
Matt PocockandGitHub 66f92b61f5 Merge pull request #456 from mattpocock/wayfinder-deferred-section
wayfinder: split the map catch-all into Not yet specified / Out of scope
2026-07-05 18:37:09 +01:00
6 changed files with 40 additions and 8 deletions
@@ -0,0 +1,5 @@
---
"mattpocock-skills": minor
---
Sharpen how the **`to-issues`** skill records structure. The "What to build" template now adds a context pointer to where the **`/prototype`** skill's code lives, rather than inlining a snippet from it. And publishing now prefers the tracker's **native sub-issues** for parent → slice and **native blocking edges** for `Blocked by` where the tracker supports them (mechanics already live in the issue-tracker doc), keeping the `## Parent` / `## Blocked by` body sections as the fallback.
+12
View File
@@ -0,0 +1,12 @@
---
"mattpocock-skills": patch
---
Stop **`wayfinder`** grilling *itself* instead of the human, and classify ticket types by **HITL** / **AFK**.
Students reported `/wayfinder` picking a **grilling** ticket and answering its own questions rather than turning to the human. Root cause: **`grilling`** carried a line written for the live-human case — "If a question can be answered by exploring the codebase, explore the codebase instead" — which, once `wayfinder` runs grilling inside a resolve-the-ticket frame, reads as license to answer questions autonomously and race the ticket to "resolved".
Two changes:
- **`grilling`** now splits *facts* (look them up) from *decisions* (put each one to the human and wait for their answer).
- **`wayfinder`** labels every ticket type **HITL** (human in the loop — Prototype, Grilling) or **AFK** (agent alone — Research; Task is either). A HITL ticket only resolves through the live exchange, so the "wait for the human" behaviour falls out of the label instead of being spelled out per type — a grilling agent that answers its own questions has, by definition, broken HITL.
@@ -0,0 +1,9 @@
---
"mattpocock-skills": patch
---
Restore **`wayfinder`**'s early exit when the frontier grilling turns up no fog.
The skill used to have a **Skipping The Decision Map** section: if the opening grilling surfaced no fog of war, there was no map to build, so it offered to skip straight to implementing. That clause was demoted to a parenthetical inside the Handoff section, then deleted as collateral when Handoff was removed — never an intentional cut.
It's back, co-located in **Chart the map** step 2 (Map the frontier), where the fog/no-fog outcome is actually determined: if breadth-first grilling surfaces no fog — the journey is small enough for one session — you don't need a map, so stop and ask the user how they'd like to proceed. The ask, rather than an auto-skip, is preserved from the original.
+2 -2
View File
@@ -54,7 +54,7 @@ Iterate until the user approves the breakdown.
For each approved slice, publish a new issue to the issue tracker. Use the issue body template below. These issues are considered ready for AFK agents, so publish them with the correct triage label unless instructed otherwise.
Publish issues in dependency order (blockers first) so you can reference real issue identifiers in the "Blocked by" field.
Publish issues in dependency order (blockers first) so you can reference real issue identifiers. Where the tracker supports it, link each slice to its parent as a native **sub-issue** and wire each blocker as a native **blocking edge** (mechanics in the issue-tracker doc); the `## Parent` and `## Blocked by` body sections are the fallback otherwise.
<issue-template>
## Parent
@@ -65,7 +65,7 @@ A reference to the parent issue on the issue tracker (if the source was an exist
A concise description of this vertical slice. Describe the end-to-end behavior, not layer-by-layer implementation.
Avoid specific file paths or code snippets — they go stale fast. Exception: if a prototype produced a snippet that encodes a decision more precisely than prose can (state machine, reducer, schema, type shape), inline it here and note briefly that it came from a prototype. Trim to the decision-rich parts — not a working demo, just the important bits.
Avoid specific file paths or code snippets — they go stale fast. Exception: if the `/prototype` skill produced code that encodes a decision more precisely than prose can (state machine, reducer, schema, type shape), add a context pointer to where that prototype code lives rather than inlining it.
## Acceptance criteria
+11 -5
View File
@@ -7,6 +7,10 @@ A loose idea has arrived — too big for one agent session, and wrapped in fog:
The destination varies per effort, and naming it is the first act of charting — it shapes every ticket. It might be a spec to hand off and iterate on, a decision to lock before planning starts, or a change made in place like a data-structure migration. 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.
@@ -67,10 +71,12 @@ The answer isn't part of the body — it's recorded on resolution (see [Work thr
## Ticket Types
- **Research**: Reading documentation, third-party APIs, or local resources like knowledge bases. Creates a markdown summary as a linked asset. Use when knowledge outside the current working directory is required.
- **Prototype**: 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**: Conversation with the agent. Uses the /grilling and /domain-modeling skills. Asks one question at a time. The default case.
- **Task**: Literal manual work that must be done before the discussion can move forward — nothing to decide, prototype, or research. Moving data, signing up for a service, provisioning access. The agent automates it where it can; otherwise it hands the human a precise checklist. 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.
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. Creates a markdown summary as a linked asset. 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 via the /grilling and /domain-modeling skills, one question at a time. The default case.
- **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.
## Fog of war
@@ -102,7 +108,7 @@ Two modes. Either way, **never resolve more than one ticket per session.**
User invokes with a loose idea.
1. **Name the destination.** Run a `/grilling` and `/domain-modeling` session to pin down what this map is finding its way to — the spec, decision, or change. The destination fixes the scope, so it's settled first.
2. **Map the frontier.** Grill again, **breadth-first** this time: fan out across the whole space rather than deep on any one thread, surfacing the open decisions and the first steps takeable now.
2. **Map the frontier.** Grill again, **breadth-first** this time: fan out across the whole space rather than deep on any one thread, surfacing the open decisions and the first steps takeable now. **If this surfaces no fog** — the way to the destination is already clear, the whole journey small enough for one session — you don't need a map. Stop and ask the user how they'd like to proceed.
3. **Create the map** (label `wayfinder:map`): Destination and Notes filled in, Decisions-so-far empty, the fog sketched into **Not yet specified**.
4. **Create the tickets you can specify now** as child issues of the map — then wire blocking edges in a **second pass** (issues need ids before they can reference each other). Wiring sorts them into the frontier and the blocked; everything you can't yet specify stays in the fog — the **Not yet specified** section.
5. Stop — charting the map is one session's work; do not also resolve tickets.
+1 -1
View File
@@ -7,6 +7,6 @@ Interview me relentlessly about every aspect of this plan until we reach a share
Ask the questions one at a time, waiting for feedback on each question before continuing. Asking multiple questions at once is bewildering.
If a question can be answered by exploring the codebase, explore the codebase instead.
If a *fact* can be found by exploring the codebase, look it up rather than asking me. The *decisions*, though, are mine — put each one to me and wait for my answer.
Do not enact the plan until I confirm we have reached a shared understanding.