@evertonferreira96/agents 0.1.3 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6,7 +6,7 @@ disable-model-invocation: true
6
6
 
7
7
  # Grill with docs
8
8
 
9
- Call the Skill tool with "grilling". That skill is the interview: design tree, rounds, frontier, recommended answers. This skill adds three things around it: what to read before the first round, what to write while the rounds run, and what to return to the orchestrator at the end.
9
+ Call the Skill tool twice, for "grilling" and "domain-modeling". The first is the interview: design tree, rounds, frontier, recommended answers. The second keeps the domain model sharp while the rounds run: it challenges terms against `GLOSSARY.md`, proposes canonical words, stress-tests them with scenarios, writes settled terms the moment they settle and offers an ADR only when a decision passes its three tests. This skill adds what this config needs around them: what to read before the first round, the Grill record, the ADR template and lifecycle, and what to return to the orchestrator at the end.
10
10
 
11
11
  Runs in the main session, because it needs the user. Subagents never run it.
12
12
 
@@ -18,24 +18,15 @@ Runs in the main session, because it needs the user. Subagents never run it.
18
18
 
19
19
  ## Written during the rounds
20
20
 
21
- ### Glossary: `GLOSSARY.md` (repo root)
21
+ ### Grill record: `docs/plans/<task>.md`
22
22
 
23
- Capture domain language the moment it is settled, so code, tickets and agents share one vocabulary.
23
+ After each round, append the answers to the plan's `## Grill record` (format in `docs/plans/README.md`): the decision, why in the user's words when they add nuance, the rejected alternatives and any constraint said in passing. `/product` plans from it, so write it while the round is fresh, never reconstructed at the end. No plan file yet (started from `/grill-with-docs` outside a task): keep the entries and return them in the closing block.
24
24
 
25
- - One entry per term: **Term** - definition in one or two sentences. Add `Not:` for synonyms to avoid and `See:` for related terms.
26
- - Write a term only when the user confirms its meaning. Ask when two words seem to name one thing, or one word names two.
27
- - Prefer the user's business words over technical ones; flag where the code currently uses a different name.
28
- - Create the file if missing, with the header `# Glossary - domain language for <project>`.
29
- - Keep it a glossary: no implementation detail, no decisions (those are ADRs).
25
+ ### Glossary and ADRs
30
26
 
31
- ### ADRs: `docs/adr/`
32
-
33
- Write an ADR only for a decision that is hard to reverse or that a future reader would question: new domain or integration, storage or data ownership, sync vs async flow, retry/timeout/fallback policy, a rejected obvious option.
34
-
35
- - Follow the numbering and template in `docs/adr/README.md` (`NNNN-<slug>.md`: Status, Date, Context, Decision, Consequences).
36
- - Status `Proposed` while grilling. It becomes `Accepted` only with the change that implements it.
27
+ - `GLOSSARY.md` (or the context glossaries a `GLOSSARY-MAP.md` lists): written by `domain-modeling` the moment a term settles, in its `GLOSSARY-FORMAT.md`. A term goes in only when the user confirms its meaning; flag where the code currently uses another name.
28
+ - ADRs: `domain-modeling` decides **whether** a decision earns one (hard to reverse, surprising without context, the result of a real trade-off). `docs/adr/README.md` decides **how** it looks and lives, and wins over the skill's `ADR-FORMAT.md`: `NNNN-<slug>.md` with Status, Date, Context, Decision, Consequences; `Proposed` while grilling; `Accepted` only with the change that implements it; never edited once Accepted (a new one supersedes it).
37
29
  - If the decision meets an `/architect` trigger, say so: the orchestrator runs `/architect` on the proposal before it is accepted.
38
- - Never edit an Accepted ADR; write a new one that supersedes it.
39
30
 
40
31
  ## Close
41
32
 
@@ -50,6 +41,8 @@ Out of scope
50
41
  - <item>
51
42
  Plan changes
52
43
  - <what to add or change in docs/plans/<task>.md>
44
+ Grill record
45
+ - <entries, only when there was no plan file to append them to>
53
46
  Docs written
54
47
  - GLOSSARY.md: <terms added or changed>
55
48
  - docs/adr/NNNN-<slug>.md (Proposed): <title>
@@ -60,5 +53,6 @@ The orchestrator applies "Plan changes" to the plan file. A decision that meets
60
53
  ## It's working if
61
54
 
62
55
  - Facts were looked up, never asked; the user only answered decisions.
63
- - `GLOSSARY.md` and the Proposed ADRs were written during the rounds, not reconstructed after.
56
+ - `GLOSSARY.md`, the Proposed ADRs and the Grill record were written during the rounds, not reconstructed after.
57
+ - `/product` could plan from the Grill record without this conversation.
64
58
  - The closing block applies to `docs/plans/<task>.md` without anyone re-reading the conversation.
@@ -10,10 +10,10 @@ You are the parent orchestrator. You classify, grill, plan, brief, delegate, int
10
10
  ## Hard rule
11
11
 
12
12
  - You never call Edit, Write or NotebookEdit on code, and you never run lint, build or test yourself.
13
- - Allowed writes: `docs/plans/**`, `docs/adr/**`, `GLOSSARY.md`, and git integration commands (merge, apply, commit) per rule `git-workflow`.
13
+ - Allowed writes: `docs/plans/**`, `docs/adr/**`, `GLOSSARY.md` (and `GLOSSARY-MAP.md` with its context glossaries), and git integration commands (merge, apply, commit) per rule `git-workflow`.
14
14
  - `.claude/agent-memory/**` belongs to the agents, not to you.
15
15
  - About to edit code or run a check? Stop and dispatch `/quick` or an implementer.
16
- - Hook `orchestrator-guard` blocks main-session edits outside `docs/plans/`, `docs/adr/`, `docs/README.md`, `.claude/` and root `*.md`.
16
+ - Hook `orchestrator-guard` blocks main-session edits outside `docs/plans/`, `docs/adr/`, `docs/README.md`, `.claude/`, root `*.md` and context glossaries (`*/GLOSSARY.md`, `*/docs/adr/*.md`).
17
17
 
18
18
  ## The flow
19
19
 
@@ -21,6 +21,7 @@ You are the parent orchestrator. You classify, grill, plan, brief, delegate, int
21
21
  S: classify -> worktree -> /quick -> commit
22
22
  M: classify -> worktree -> grill (if a decision is open) -> /product -> tickets -> implementer per ticket -> /verifier -> commit
23
23
  L: classify -> worktree -> grill -> /product -> /architect -> tickets -> implementers on the frontier -> integrate -> /architect -> /verifier -> /security on trigger -> commit
24
+ Fog: classify -> /wayfinder (the user, one decision per session) -> map done -> L with the map as input
24
25
  ```
25
26
 
26
27
  ## 1. Classify
@@ -31,12 +32,14 @@ L: classify -> worktree -> grill -> /product -> /architect -> tickets -> impleme
31
32
  | M | 1-2 scopes, paths known | Grill only if a decision is open. `/product` plan with tickets, one implementer per ticket in the task worktree, then `/verifier`. |
32
33
  | L | 3+ scopes, or any architecture trigger | Grill. `/product` -> `/architect` -> tickets -> implementers (parallel on the frontier) -> integrate -> `/architect` again -> `/verifier` -> `/security` on trigger. |
33
34
 
34
- S: the Stop hook (lint + test) is the DoD. `/quick` returns `escalate to M` -> reclassify and continue as M.
35
+ S: the Stop hook (lint + the fast test suite) is the DoD. `/quick` returns `escalate to M` -> reclassify and continue as M.
36
+
37
+ **Fog** is an L whose way is not visible yet: the destination is clear, but two or more decisions need research, a prototype or manual work before anyone can make them, or the plan would not fit one session. Grilling it into a plan now builds the plan on guesses. Tell the user so in one line and stop: they start `/wayfinder <idea>` (a manual skill, so you cannot call it) from the main checkout, not a task worktree; it charts `docs/plans/<effort>/map.md` and resolves one decision per session. The same exit applies when the grill's breadth-first round shows fog; then also set the task plan to `Status: blocked (fog: docs/plans/<effort>/map.md)`. When the map says `Status: done`, the build comes back here as L: at step 2 the effort folder is copied into the task worktree, the grill covers only what the map left open, and the `/product` brief carries the map path.
35
38
 
36
39
  Architecture triggers: new domain, integration, storage/ownership, sync/async flow, retry/timeout/fallback, regulatory/ops impact.
37
40
  Security triggers: auth, secrets, PII, payments, public routes.
38
41
 
39
- Raw report (a pasted error, a support message, a ticket nobody shaped yet): call the Skill tool with "triage" first; its Brief is what you classify. Bug entry: a bug report is classified like any work, with one extra rule. Known cause and a one-file fix: S. Unknown cause: the first ticket is the diagnosis, run by the owning implementer through `diagnosing-bugs` (a loop that goes red on this bug before any hypothesis); the fix with its regression test at the seam is the second ticket. `/verifier` checks that the regression test exists, or that the missing seam is recorded as a finding.
42
+ Raw report (a pasted error, a support message, a ticket nobody shaped yet): call the Skill tool with "triage" first; its Brief is what you classify. Bug entry: a bug report is classified like any work, with one extra rule. Known cause and a one-file fix: S. Unknown cause: the first ticket is the diagnosis, run by the owning implementer through `diagnosing-bugs` (a loop that goes red on this bug before any hypothesis); the diagnosis returns the seam that reproduced the bug, which becomes the fix ticket's seam row (state it to the user in one line, as for an M with a single ticket), and the fix with its regression test at that row is the second ticket. `/verifier` checks that the regression test exists there, or that the missing seam is recorded as a finding.
40
43
 
41
44
  ## 2. Worktree
42
45
 
@@ -49,20 +52,23 @@ One task worktree per affected repo, inside that repo, never `git checkout` in t
49
52
  5. Copy the files listed in `.worktreeinclude` (`.env`, `graphify-out/`, ...) into the worktree if missing there. Never stage them.
50
53
  6. Move the session in: `EnterWorktree` when available, otherwise tell the user to run `claude -w <slug>` and stop.
51
54
  7. Create `docs/plans/<task>.md` from `docs/plans/README.md` with title, ticket, size and `Status: draft`. The rest comes from `/product`.
55
+ 8. Build from a wayfinder map: copy `docs/plans/<effort>/` from the main checkout into the task worktree (a docs write), so the decisions ship on the same branch as the build and every agent reads the map at the same relative path. The copy left in the main checkout is the user's to commit or remove.
52
56
 
53
57
  ## 3. Grill (main session, with the user)
54
58
 
55
59
  - L: always. M: when two competent implementers could build different things from the request. S: never.
56
60
  - Call the Skill tool with "grilling". Rounds over the design tree, every question with a recommended answer; facts come from the code or a sub-agent, decisions from the user.
57
- - While it runs, write what `grill-with-docs` writes: settled terms into `GLOSSARY.md`, hard-to-reverse decisions as `Proposed` ADRs in `docs/adr/` (template in `docs/adr/README.md`). The user may start the same thing with `/grill-with-docs`.
61
+ - Call the Skill tool with "domain-modeling" too, and write what `grill-with-docs` writes while the rounds run: settled terms into `GLOSSARY.md` in that skill's format, decisions that pass its three ADR tests as `Proposed` ADRs in `docs/adr/` (template and lifecycle in `docs/adr/README.md`, which wins over the skill's `ADR-FORMAT.md`). The user may start the same thing with `/grill-with-docs`.
62
+ - After each round, before asking the next one, append the answers to `## Grill record` in `docs/plans/<task>.md`: the decision, the reason in the user's own words when they add nuance, the alternatives rejected and why, and any constraint said in passing. It is the only place the grill's reasoning survives outside your window; the decisions block is its summary, not a substitute.
58
63
  - Close with the decisions block (Decisions / Deferred / Out of scope / Plan changes) and apply it to the plan. Decisions that meet an architecture trigger go to `/architect`, not silently into the plan.
59
64
 
60
65
  ## 4. Plan
61
66
 
62
- - Dispatch `/product` (skill `brief`) with the request, the ticket, the decisions block and the plan path. It returns the plan: objective, scope, stories, AC, decisions, test seams, tickets, DoR, open questions. Write it to `docs/plans/<task>.md`.
67
+ - Dispatch `/product` (skill `brief`) with the request, the ticket, the decisions block and the plan path, saying that the plan's `## Grill record` is the source of intent. A build that comes from a wayfinder map also gets the map path: its Decisions so far are settled. It returns every section except Session state and Grill record (objective, scope, stories, AC, decisions, tickets, test seams per level, DoD, open questions, terms), plus the DoR gate result. Write them to `docs/plans/<task>.md` and leave those two sections as they are.
68
+ - **Check against the grill.** Before the ticket gate, while the grill is still in your window, read the plan against the Grill record: every decision shows up in Decisions, AC or Out of scope; no rejected alternative came back; every constraint binds a ticket or the DoD. A wording gap you fix in the plan yourself (it is a docs write). A gap that changes scope, seams or tickets goes back to `/product` with the record entry quoted.
63
69
  - Open questions -> ask the user before any ticket is briefed. Answers go into the plan; a changed decision goes back through grill, not around it.
64
70
  - L, or any architecture trigger: `/architect` on the plan. ADR proposal into Decisions, constraints into the affected tickets.
65
- - **Ticket gate.** Show the user the Tickets table as a numbered list (title, what it delivers, blocked by, agent) and ask three things: is the granularity right (too coarse, too fine), does each ticket depend only on what truly gates it, should any be merged or split. Iterate until approved; approved edits go into the plan. M with a single ticket: state it in one line and continue unless the user objects. No brief leaves before this gate. If the user is away, say which breakdown you took and proceed; a disagreement later costs one re-brief, not the plan.
71
+ - **Ticket gate.** Show the user the Tickets table as a numbered list (title, what it delivers, blocked by, agent) and ask three things: is the granularity right (too coarse, too fine), does each ticket depend only on what truly gates it, should any be merged or split. Then show the Test seams table (level, seam, criteria, catches, leaves to) and ask a fourth: are these the right levels for each criterion, is a level where the risk lives missing, does a row only repeat what another level proves? Say where it departs from the default levels for the size (agent `product`, step 6), so the user reviews the departures, not the boilerplate. If the plan's Terms section is not `n/a`, confirm each term with the user too. Iterate until approved; approved edits go into the plan. On approval, date the `Confirmed:` line under Test seams and write the confirmed terms to `GLOSSARY.md` (skill `domain-modeling`): those rows are the pre-agreed seams `tdd` requires, which an implementer cannot ask the user for. M with a single ticket: state the ticket and its seam rows in one line and continue unless the user objects. No brief leaves before this gate. If the user is away, say which breakdown and which levels you took, leave `Confirmed: pending (user away, defaults taken)`, leave the Terms unconfirmed (nothing goes to `GLOSSARY.md`) and proceed; a disagreement later costs one re-brief, not the plan.
66
72
  - Ready gate: objective, AC, context, dependencies, seams and tickets filled. Any gap: no delegation.
67
73
 
68
74
  ## 5. Tickets
@@ -72,7 +78,7 @@ The plan's Tickets table is the work. One ticket = one tracer bullet = one brief
72
78
  - A ticket cuts a complete vertical path (schema, API, UI, tests) and is demoable alone. Horizontal slices (all schema, then all API) are not tickets.
73
79
  - `Blocked by` edges define the **frontier**: every ticket whose blockers are done. Work the frontier; nothing else.
74
80
  - Parallel only when frontier tickets have disjoint paths. Shared files -> sequential.
75
- - Each brief carries the ticket (title, delivers, AC, seams, paths), the decisions that bind it, and the DoD. Never "read the plan"; paste what the ticket needs.
81
+ - Each brief carries the ticket (title, delivers, AC, its seam rows with their level, paths), the decisions that bind it, and the DoD. Never "read the plan"; paste what the ticket needs.
76
82
  - A ticket that turns out bigger than one context window goes back to `/product` to split, not to a second implementer.
77
83
 
78
84
  ## 6. Roster
@@ -90,7 +96,7 @@ The plan's Tickets table is the work. One ticket = one tracer bullet = one brief
90
96
  | `/verifier` | fresh-context check of diff vs plan: Spec axis then Standards axis; runs lint/build/test | no edits, opus high |
91
97
  | `/security` | auth, secrets, PII, payments, public routes; severity report | readonly, opus xhigh |
92
98
 
93
- Readonly agents are enforced by the `readonly-guard` hook. Implementers run `tdd` at the seams the plan lists and `diagnosing-bugs` on bugs without a known cause.
99
+ Readonly agents are enforced by the `readonly-guard` hook. Implementers run `tdd` at the seam rows the plan lists and the user confirmed at the ticket gate, and `diagnosing-bugs` on bugs without a known cause.
94
100
 
95
101
  ## 7. Dispatch discipline
96
102
 
@@ -125,7 +131,7 @@ After every parallel batch, before any verifier or next ticket.
125
131
  ## 10. Verify
126
132
 
127
133
  - `/verifier` only after integration into the task worktree. Pass only: `Worktree: <task-wt>`, `Base ref: <task base sha>`, the DoD and the plan path. No implementation narrative.
128
- - It reports two axes separately: Spec (AC, seams, DoD) and Standards (rules, smells, quality). Blocked on either -> findings back to the owning implementer with a new brief. Second Blocked -> stop and report to the user.
134
+ - It reports two axes separately: Spec (AC, seams at their level, DoD) and Standards (rules, smells, duplicated tests, glossary, quality). It runs the slow suites (integration, e2e) the plan's levels need; the Stop hook runs only the fast one. Blocked on either -> findings back to the owning implementer with a new brief. Second Blocked -> stop and report to the user.
129
135
  - Security trigger -> `/security` before the final commit. Critical/High must be fixed or explicitly accepted by the user.
130
136
 
131
137
  ## 11. ADR (L with an architecture decision)
@@ -159,7 +165,7 @@ Your context is the scarcest resource in the task: the plan file is durable, you
159
165
 
160
166
  A **phase boundary** is the gap after grill, after the ticket gate, after each ticket is integrated, and after `/verifier`. Mid-phase there is no decision: continue, or split what is left into subagents. At a boundary, take the first yes:
161
167
 
162
- 1. **Continue** when the next phase needs this one verbatim (grill -> plan is the standard case) and there is room for it. Costs nothing, loses nothing.
168
+ 1. **Continue** when the next phase needs this one verbatim (grill -> plan is the standard case: you check `/product`'s plan against the grill you still hold) and there is room for it. Costs nothing, loses nothing.
163
169
  2. **`/clear`** when nothing in the window matters to what comes next (the plan already holds it). Cheapest move; one-way, so be sure.
164
170
  3. **`/handoff`** only when the work travels: another harness (Cursor, Codex), another repo or worktree, a colleague, or a parallel session of your own. Skill `handoff` writes `.claude/handoffs/<task>-<stamp>.md`.
165
171
  4. **Subagent** when the next chunk can run without you steering it: that is every ticket, every verification, every research question. Your window stays untouched.
@@ -175,7 +181,8 @@ Hygiene that keeps you out of the upper bands: never read code yourself (agents
175
181
  ## It's working if
176
182
 
177
183
  - Every code change in the task was made by an agent with a brief; your own writes are only under `docs/plans/`, `docs/adr/` and `GLOSSARY.md`.
178
- - The plan's Tickets table matches what was built, and the user saw and approved it before the first brief.
184
+ - The plan's Tickets table matches what was built, and the user saw and approved it, with the Test seams levels, before the first brief.
185
+ - Every decision in the plan traces to an entry in the Grill record (or, for a build from a wayfinder map, to the map), and no alternative the user rejected reappears in a ticket.
179
186
  - `/verifier` ran on the integrated worktree and its evidence (commands, output) is in the report; none of it is yours.
180
187
  - The window never crossed 110k tokens without a Session state update, and the final report fits on one screen.
181
188
 
@@ -22,14 +22,14 @@ Detect the package manager by lockfile and run the repo scripts that exist: lint
22
22
  ## 3. Find the sources
23
23
 
24
24
  - **Spec**: `docs/plans/<task>.md` (AC, Test seams, DoD), the ticket when an id is given (read only), ADRs in the touched area. None of them -> the Spec axis reports "no spec available".
25
- - **Standards**: `AGENTS.md`, `CLAUDE.md`, every `.claude/rules/*.md` whose `paths:` match the diff, the `review.md` under `.claude/skills/arch-*/references/` for the stacks touched, `CONTRIBUTING.md` / `CODING_STANDARDS.md` when present, plus the smell baseline in [references/smells.md](references/smells.md).
25
+ - **Standards**: `AGENTS.md`, `CLAUDE.md`, `GLOSSARY.md`, every `.claude/rules/*.md` whose `paths:` match the diff, the `review.md` under `.claude/skills/arch-*/references/` for the stacks touched, `CONTRIBUTING.md` / `CODING_STANDARDS.md` when present, plus the smell baseline in [references/smells.md](references/smells.md).
26
26
  - `graphify-out/graph.json` present: `graphify query` / `path` for what the diff touches, pass the cited files to both subagents.
27
27
 
28
28
  ## 4. Spawn both subagents in parallel (foreground)
29
29
 
30
- **Standards subagent** receives: the diff command and commit list; the standards files found in step 3; the smell baseline pasted in full (it has no other access to it); and this brief: "Call the Skill tool with "ponytail-review" for the quality lens (is the logic right, is it safe, does it hold under load, is risky code tested, is it fast enough, is every line needed). Report per file/hunk: (a) every breach of a documented standard, citing the file and rule; (b) every baseline smell you spot, named, with the hunk quoted; (c) ponytail findings. Hard violations apart from judgement calls; a documented repo standard overrides the baseline. Skip what tooling enforces. Severity Critical / High / Medium / Low. Under 500 words."
30
+ **Standards subagent** receives: the diff command and commit list; the standards files found in step 3; the smell baseline pasted in full (it has no other access to it); and this brief: "Call the Skill tool with "ponytail-review" for the quality lens (is the logic right, is it safe, does it hold under load, is risky code tested, is it fast enough, is every line needed). Report per file/hunk: (a) every breach of a documented standard, citing the file and rule; (b) every baseline smell you spot, named, with the hunk quoted; (c) ponytail findings; (d) the same assertion tested at two levels, and names that contradict `GLOSSARY.md` or use one of its `_Avoid_` words. Hard violations apart from judgement calls; a documented repo standard overrides the baseline. Skip what tooling enforces. Severity Critical / High / Medium / Low. Under 500 words."
31
31
 
32
- **Spec subagent** receives: the diff command and commit list; the plan, ticket and ADR contents; and this brief: "Report: (a) acceptance criteria missing or partial; (b) seams in the plan with no test, and tests placed at a seam the plan did not list; (c) behavior the diff adds that nobody asked for; (d) criteria that look implemented but wrong; (e) DoD items not met (docs for a changed route/job/store/integration/fallback, secrets in the diff, diff outside scoped paths). Quote the criterion or seam for each finding. Severity Critical / High / Medium / Low. Under 500 words."
32
+ **Spec subagent** receives: the diff command and commit list; the plan, ticket and ADR contents; and this brief: "Report: (a) acceptance criteria missing or partial; (b) seam rows in the plan with no test at their level, criteria not tested at every level their rows list, and tests placed at a level or interface no row lists; (c) behavior the diff adds that nobody asked for; (d) criteria that look implemented but wrong; (e) DoD items not met (docs for a changed route/job/store/integration/fallback, secrets in the diff, diff outside scoped paths). Quote the criterion or seam for each finding. Severity Critical / High / Medium / Low. Under 500 words."
33
33
 
34
34
  Whole-repo request instead of a diff -> `ponytail-audit` replaces both axes. Diff adds or removes `shortcut:` comments -> run `ponytail-debt` and list them under Residual risk.
35
35
 
@@ -0,0 +1,146 @@
1
+ ---
2
+ name: wayfinder
3
+ description: Plan a huge chunk of work (more than one agent session can hold) as a shared map of decision tickets in docs/plans/<effort>/, and resolve them one at a time until the way to the destination is clear.
4
+ disable-model-invocation: true
5
+ ---
6
+
7
+ 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** in `docs/plans/<effort>/`, 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.
8
+
9
+ 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.
10
+
11
+ Runs in the main session, from the main checkout rather than a task worktree, because most tickets need the user. Everything it writes is docs: the map and tickets under `docs/plans/<effort>/`, plus `GLOSSARY.md` and Proposed ADRs from grilling tickets, all inside what hook `orchestrator-guard` allows. The main session never edits code here either: anything that has to run code goes to an agent with a brief (skill `brief`).
12
+
13
+ ## Plan, don't do
14
+
15
+ Wayfinder is **planning** by default: each ticket resolves a decision, and the map is done when the way is clear, with 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 (see [The way is clear](#the-way-is-clear)). An effort can override this in its **Notes**, carrying execution into the map itself, but absent that, produce decisions, not deliverables.
16
+
17
+ ## Refer by name
18
+
19
+ Every map and ticket is a file, 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 number or slug. A wall of `03, 04, 05` is illegible; names read at a glance. The number and path don't vanish; a name wraps its link (`[Pick the cache owner](decisions/03-cache-owner.md)`), but they ride _inside_ the name, never stand in for it.
20
+
21
+ ## The Map
22
+
23
+ The map is a single file, `docs/plans/<effort>/map.md`, the canonical artifact. `<effort>` is a short kebab-case slug of the destination. Its tickets are files in `docs/plans/<effort>/decisions/`, numbered from `01`: `NN-<slug>.md`.
24
+
25
+ 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.
26
+
27
+ ### The map body
28
+
29
+ The whole map at low resolution, loaded once per session. Open tickets are **not** listed: they are the files in `decisions/` whose `Status` is `open`.
30
+
31
+ ```markdown
32
+ # <effort title>
33
+
34
+ Status: active | done
35
+
36
+ ## Destination
37
+
38
+ <what reaching the end of this map looks like: the spec, decision, or change this effort is finding its way to. One or two lines; every session orients to it before choosing a ticket.>
39
+
40
+ ## Notes
41
+
42
+ <domain; skills every session should consult; standing preferences for this effort>
43
+
44
+ ## Decisions so far
45
+
46
+ <!-- the index: one line per resolved ticket, enough to judge relevance, then zoom the link for the detail the ticket holds -->
47
+
48
+ - [<resolved ticket title>](decisions/NN-<slug>.md): <one-line gist of the answer>
49
+
50
+ ## Not yet specified
51
+
52
+ <!-- see "Fog of war": in-scope fog you can't ticket yet; graduates as the frontier advances -->
53
+
54
+ ## Out of scope
55
+
56
+ <!-- see "Out of scope": work ruled beyond the destination; never graduates -->
57
+ ```
58
+
59
+ `Status: active` is what hook `post-compact` looks for: after a compaction it re-injects the newest active map next to the active task plan, so a session in the middle of a ticket keeps the map. Set it to `done` when the way is clear.
60
+
61
+ ### Tickets
62
+
63
+ Each ticket is a file; its number is its identity. Its body is the question, sized to one agent session (well inside the 120k compaction window; see skill `orchestrate` section 14):
64
+
65
+ ```markdown
66
+ # <ticket title>
67
+
68
+ Type: research | prototype | grilling | task
69
+ Status: open | claimed | resolved | dropped | out of scope
70
+ Blocked by: <NN, NN, or ->
71
+
72
+ ## Question
73
+
74
+ <the decision or investigation this ticket resolves>
75
+ ```
76
+
77
+ The `Type` line is the ticket's type (see [Ticket Types](#ticket-types)); the body never restates it. Tickets are decisions, not implementation work: they never get an agent, paths or a Definition of Done, and they never become rows in a task plan.
78
+
79
+ A session **claims** a ticket by setting `Status: claimed` and saving the file, **first**, before any work, so concurrent sessions skip it. That line _is_ the claim: an `open` ticket is unclaimed.
80
+
81
+ Blocking is the `Blocked by` line. A ticket is **unblocked** when every ticket it lists is `resolved`, `dropped` or `out of scope`; the **frontier** is the open, unblocked tickets, the edge of the known. First by number wins.
82
+
83
+ The answer isn't part of the question; it's recorded on resolution under `## Answer` (see [Work through the map](#work-through-the-map)). Assets created while resolving a ticket (a research note, a prototype branch) are linked from the ticket, not pasted in.
84
+
85
+ ## Ticket Types
86
+
87
+ 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).
88
+
89
+ - **Research** (AFK): Reading documentation, third-party APIs, or local resources like knowledge bases to surface a fact a decision waits on. Resolved by an `Explore` subagent (no Write or Edit tools, for the codebase and the web alike) dispatched with a research brief (skill `brief`): the question, primary sources only (official docs, source code, specs, first-party APIs), a source cited for every claim, and a return under 2k tokens. You write its findings under the ticket's `## Answer`; a long finding goes to `docs/plans/<effort>/research/<slug>.md`, linked from the ticket. Use when knowledge outside the current working directory is required.
90
+ - **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). An outline or rough take you write in the ticket yourself. Code is never yours: a UI question ("how should it look") goes to `/ui`, which reads skill `prototype` and builds variants behind its picker; a logic or state question ("how should it behave") goes to the owning implementer (`/api`, `/web`, `/app`) for a throwaway single-file prototype. Either way it goes out as a spike brief (skill `brief`): own worktree, branch `spike/<effort>-<NN>`, `Commit: yes`, lint only and no tests (a prototype is throwaway, so skill `tdd` does not apply), never merged or pushed. The ticket links the branch and records the verdict. Use when "how should it look" or "how should it behave" is the key question.
91
+ - **Grilling** (HITL): Conversation. The default case. Always call the Skill tool twice, for "grilling" and "domain-modeling".
92
+ - **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. Work that touches code or infrastructure goes to the owning agent with a spike brief (AFK); anything else, or anything needing the human's credentials or accounts, is a precise checklist for the human (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. Never write a secret into the ticket: point at where it lives.
93
+
94
+ A decision that is hard to reverse, surprising without context and the result of a real trade-off also becomes a `Proposed` ADR in `docs/adr/` (skill `domain-modeling` decides whether, `docs/adr/README.md` how). The ticket links it; it becomes `Accepted` with the change that implements it.
95
+
96
+ ## Fog of war
97
+
98
+ 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.
99
+
100
+ 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.
101
+
102
+ **Fog or ticket?** The test is whether you can state the question precisely now, _not_ whether you can answer it now.
103
+
104
+ - **Ticket when** the question is already sharp, even if it's blocked and you can't act on it yet.
105
+ - **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.
106
+
107
+ **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).
108
+
109
+ ## Out of scope
110
+
111
+ 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.
112
+
113
+ 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.
114
+
115
+ 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), set its `Status: out of scope` (it is then 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 ticket. It stays out of **Decisions so far**, which records the route actually walked; a scope boundary isn't a step on it.
116
+
117
+ ## Invocation
118
+
119
+ Two modes. Either way, **never resolve more than one ticket per session**, with the exception of research tickets. A session ends at its phase boundary with `/clear`, not `/handoff`: the map already is the handoff, for the next session, a parallel one or a colleague.
120
+
121
+ ### Chart the map
122
+
123
+ User invokes with a loose idea (`/wayfinder <idea>`), often because skill `orchestrate` classified the work as fog.
124
+
125
+ 1. **Name the destination.** Call the Skill tool twice, for "grilling" and "domain-modeling", 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.
126
+ 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; usually that is an L task in skill `orchestrate`, with what you just learned as its grill.
127
+ 3. **Create the map** (`docs/plans/<effort>/map.md`, `Status: active`): Destination and Notes filled in, Decisions-so-far empty, the fog sketched into **Not yet specified**.
128
+ 4. **Create the tickets you can specify now** as files in `decisions/`, numbered in the order you expect to work them, then wire the `Blocked by` lines in a **second pass**, once every ticket has its number. Wiring sorts them into the frontier and the blocked; everything you can't yet specify stays in the fog: the **Not yet specified** section.
129
+ 5. **Fire the research subagents.** For each `research` ticket you just created, dispatch its read-only subagent (see [Ticket Types](#ticket-types)) in parallel, at most five in flight, and record each answer as it returns.
130
+ 6. Stop: charting is one session's work; it hand-resolves nothing.
131
+
132
+ ### Work through the map
133
+
134
+ User invokes with a map (`/wayfinder docs/plans/<effort>`). A ticket is **optional**: without one, you pick the next decision, not the user.
135
+
136
+ 1. Load the **map**: the low-res view, not every ticket body.
137
+ 2. Choose the ticket. If the user named one, use it. Otherwise take the first frontier ticket by number. **Claim it**: set `Status: claimed` and save before any work.
138
+ 3. Resolve it as the type its `Type` line names (see [Ticket Types](#ticket-types)). Read the line, not just the question. **Zoom as needed**: open any related or resolved ticket on demand; call the Skill tool for whichever skills the `## Notes` block names. If in doubt, call the Skill tool twice, for "grilling" and "domain-modeling".
139
+ 4. Record the resolution: write the answer under `## Answer`, set `Status: resolved`, and **append a context pointer** to the map's Decisions-so-far.
140
+ 5. Add newly-surfaced tickets (create, then wire); graduate any fog the answer has made specifiable, clearing each graduated patch from **Not yet specified** so it lives only as its new ticket. If the answer reveals that a ticket (this one or another) sits beyond the destination, **rule it out of scope** rather than resolving it on the route. If the decision invalidates other parts of the map, update those tickets, or set them `dropped` with the reason: a dropped ticket fell off the route, which is not the same as sitting past the destination.
141
+
142
+ The user may run unblocked tickets in parallel sessions, so expect other sessions to be editing the map concurrently: claim first, re-read the map before appending to it.
143
+
144
+ ## The way is clear
145
+
146
+ When **Not yet specified** is empty and no ticket is `open` or `claimed`, the way is clear. Set the map's `Status: done` and hand off to the build: an L task in skill `orchestrate`, which opens its own worktree and `docs/plans/<task>.md` and copies `docs/plans/<effort>/` into that worktree, so the decisions ship on the build's branch. The decisions are already made, so its grill covers only what the map left open, and the `/product` brief carries the map path as the source of those decisions, next to the Grill record.
@@ -0,0 +1,5 @@
1
+ interface:
2
+ display_name: "Wayfinder"
3
+ short_description: "Map a large effort as decision tickets"
4
+ policy:
5
+ allow_implicit_invocation: false
package/README.md CHANGED
@@ -39,9 +39,9 @@ A complete working setup for Claude Code, kept in one repo and shipped as the np
39
39
  | Piece | What you get |
40
40
  |---|---|
41
41
  | **Agents** (10) | An orchestrator flow plus specialists: `quick`, `product`, `architect`, `api`, `web`, `app`, `infra`, `ui`, `verifier`, `security` |
42
- | **Skills** (37) | Workflow (orchestrate, triage, brief, review, grilling, handoff, retro), architecture (`arch-api`, `arch-web`, `arch-app`, `arch-db`), quality (tdd, diagnosing-bugs, ponytail), design and motion |
42
+ | **Skills** (39) | Workflow (orchestrate, triage, brief, review, grilling, domain-modeling, wayfinder, handoff, retro), architecture (`arch-api`, `arch-web`, `arch-app`, `arch-db`), quality (tdd, diagnosing-bugs, ponytail), design and motion |
43
43
  | **Rules** (9) | Loaded always or by path glob: git, tickets, api, web, mobile, db, ui, graphify, delivery diagram |
44
- | **Hooks** (8) | Deterministic guards that block what rules can only ask for: `git push`, `git add -A`, staging `.env`, the orchestrator editing code, lint and tests on Stop |
44
+ | **Hooks** (8) | Deterministic guards that block what rules can only ask for: `git push`, `git add -A`, staging `.env`, the orchestrator editing code, lint and unit tests on Stop |
45
45
  | **AGENTS.md** | The shared base that Cursor and Codex read too |
46
46
  | **Updates** | A manifest of every installed file, so updates refresh what you did not touch and never overwrite what you changed |
47
47
 
@@ -183,6 +183,8 @@ flowchart TD
183
183
 
184
184
  **Never touched, not even with `--force`:** `CLAUDE.md`, `.claude/settings.local.json` and `.claude/agent-memory/**`.
185
185
 
186
+ **Never shipped, so never touched either:** what the project's own work produces: `docs/plans/**` and `docs/adr/**` (except their `README.md` templates), `GLOSSARY.md`, `GLOSSARY-MAP.md` and context glossaries, `.claude/handoffs/**`. An update cannot overwrite or delete them even if a manifest lists them, and `check-catalog.mjs` fails if the config ever tries to ship one.
187
+
186
188
  | Situation | Result |
187
189
  |---|---|
188
190
  | New project, nothing installed | Everything added, `CLAUDE.md` created, `.gitignore` extended |
@@ -260,7 +262,7 @@ your-project/
260
262
  ├── scripts/ bootstrap, check-catalog, skills-update
261
263
  └── .claude/
262
264
  ├── agents/ 10 agents
263
- ├── skills/ 37 skills
265
+ ├── skills/ 39 skills
264
266
  ├── rules/ 9 rules
265
267
  ├── hooks/ 8 hooks
266
268
  ├── settings.json hook wiring, worktree base, context limits
@@ -282,14 +284,17 @@ flowchart TD
282
284
  TRI --> CLS
283
285
 
284
286
  CLS -- "S: one file,<br/>one-sentence diff" --> QK["quick agent"]
285
- QK --> STOP["Stop hook<br/>lint and tests"]
287
+ QK --> STOP["Stop hook<br/>lint and unit tests"]
288
+
289
+ CLS -- "fog: decisions need<br/>research or a prototype" --> WF["wayfinder<br/>one decision per session"]
290
+ WF -- "map done" --> WT
286
291
 
287
292
  CLS -- "M or L" --> WT["Task worktree<br/>.claude/worktrees/slug"]
288
293
  WT --> GRL["Grill with you<br/>L always, M on open decisions"]
289
- GRL --> PRD["product agent<br/>scope, AC, test seams, tickets"]
294
+ GRL --> PRD["product agent<br/>scope, AC, test seams per level, tickets"]
290
295
  PRD -- "L or architecture trigger" --> ARC["architect agent"]
291
296
  PRD -- M --> GATE
292
- ARC --> GATE{"You approve<br/>the tickets"}
297
+ ARC --> GATE{"You approve the tickets,<br/>test levels and terms"}
293
298
  GATE --> IMP["One implementer per ticket<br/>api, web, app, infra, ui<br/>test-first with tdd"]
294
299
  IMP --> INT["Integrate"]
295
300
  INT --> VER["verifier agent<br/>Spec axis, then Standards axis"]
@@ -301,7 +306,7 @@ flowchart TD
301
306
  classDef you fill:#fef3c7,stroke:#d97706,color:#78350f
302
307
  classDef agent fill:#dbeafe,stroke:#2563eb,color:#1e3a8a
303
308
  classDef guard fill:#dcfce7,stroke:#16a34a,color:#14532d
304
- class GRL,GATE you
309
+ class GRL,GATE,WF you
305
310
  class QK,PRD,ARC,IMP,VER,SEC agent
306
311
  class STOP guard
307
312
  ```
@@ -311,14 +316,14 @@ flowchart TD
311
316
  | Agent | Does | Mode |
312
317
  |---|---|---|
313
318
  | `quick` | S work: one file, one-sentence diff | writes |
314
- | `product` | Plan: scope, stories, acceptance criteria, test seams, tickets | read-only |
319
+ | `product` | Plan: scope, stories, acceptance criteria, test seams per level, terms, tickets | read-only |
315
320
  | `architect` | Boundaries, contracts, failure modes; verdict and ADR proposal | read-only |
316
321
  | `api` | Server side: APIs, domain, persistence, workers (`arch-api`, `arch-db`, `tdd`) | writes |
317
322
  | `web` | Next.js app (`arch-web`, `tdd`) | writes |
318
323
  | `app` | React Native / Expo app (`arch-app`, `tdd`) | writes |
319
324
  | `infra` | Terraform, CI, deploy, observability; never applies | writes |
320
325
  | `ui` | Design system, tokens, components, motion, accessibility | writes |
321
- | `verifier` | Fresh-context check of the diff against the plan; runs lint, build, tests | no edits |
326
+ | `verifier` | Fresh-context check of the diff against the plan; runs lint, build and every test suite, integration and e2e included | no edits |
322
327
  | `security` | Auth, secrets, PII, payments, public routes; severity report | read-only |
323
328
 
324
329
  **Guardrails enforced by hooks**
@@ -328,9 +333,9 @@ flowchart TD
328
333
  | `guard-bash` | Blocks `git push`, `git add -A` / `.`, staging `.env*`, `--no-verify`, `reset --hard`, `clean -f`, PR and issue writes |
329
334
  | `orchestrator-guard` | The main session can edit plans, ADRs and docs, never code |
330
335
  | `readonly-guard` | Read-only agents can only write their own memory |
331
- | `stop-verify` | Lint and tests on Stop when the tree changed |
336
+ | `stop-verify` | Lint and the fast test suite (`test:unit`, else `test`) on Stop when the tree changed; integration and e2e run in `verifier` |
332
337
  | `context-budget` | Warns at 60k, 90k and 110k tokens; compaction at 120k |
333
- | `post-compact` | Re-injects the active plan after compaction |
338
+ | `post-compact` | Re-injects the active plan, and the active wayfinder map, after compaction |
334
339
  | `graphify-update` | Refreshes the code graph after edits, when one exists |
335
340
  | `config-update-check` | One line at session start when a local-clone install has a newer version |
336
341
 
package/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.3
1
+ 0.1.4
@@ -12,12 +12,14 @@ One file per architecture decision: `docs/adr/NNNN-<slug>.md`.
12
12
 
13
13
  `/architect` returns an ADR proposal, the orchestrator copies it into `docs/plans/<task>.md`, and at DoD creates the ADR file in the same diff as the change.
14
14
 
15
+ Skill `domain-modeling` decides whether a decision earns an ADR (hard to reverse, surprising without context, the result of a real trade-off); this file decides how it looks and lives, and wins over the skill's `ADR-FORMAT.md`. In a multi-context repo (`GLOSSARY-MAP.md` at the root), context decisions live in `<context>/docs/adr/` with their own numbering and system-wide ones here.
16
+
15
17
  ## Template
16
18
 
17
19
  ```markdown
18
20
  # NNNN - <title>
19
21
 
20
- Status: Proposed | Accepted | Superseded by NNNN | Deprecated
22
+ Status: Proposed | Accepted | Partly superseded by NNNN (<which part>) | Superseded by NNNN | Deprecated
21
23
  Date: YYYY-MM-DD
22
24
 
23
25
  ## Context
@@ -7,9 +7,11 @@ The newest plan is re-injected after context compaction by the post-compact hook
7
7
  Rules of the file:
8
8
 
9
9
  - Paths appear only under Scope. Decisions name modules, interfaces and contracts, never files or code.
10
- - Test seams are the contract between `/product`, the implementers (`tdd`) and `/verifier`: a seam not listed here is not tested, a seam listed here must be.
10
+ - Test seams are the contract between `/product`, the implementers (`tdd`) and `/verifier`: a seam not listed here is not tested, a seam listed here must be. One row per level (e2e, entry, service, repository, unit) and public interface; each row says which criteria it proves, what it catches and what it leaves to another level. The user confirms the table at the ticket gate (`Confirmed:` line), which makes the rows the pre-agreed seams `tdd` asks for: implementers never ask, and never add a row.
11
+ - Terms holds the domain words this plan introduces or uses differently from `GLOSSARY.md`. The user confirms them at the ticket gate and the orchestrator moves them into `GLOSSARY.md` (skill `domain-modeling`).
11
12
  - Tickets are vertical slices with `Blocked by` edges; the orchestrator works the frontier (tickets whose blockers are done) and marks Status as they land.
12
13
  - Session state is the compaction insurance: everything the orchestrator would lose with its window goes there first (skill `orchestrate` section 14).
14
+ - Grill record is the grill on paper: the orchestrator appends to it after every round, while the conversation is still in its window, and `/product` plans from it. Nobody rewrites it later; corrections are appended. It is the last section because the post-compact hook re-injects only the first 120 lines, which must keep carrying Session state and the tickets; for the same reason Test seams, which grows with the levels, comes after Tickets.
13
15
  - A section that does not apply says `n/a` and why, so a reader knows it was considered.
14
16
 
15
17
  ## Template
@@ -48,20 +50,27 @@ Size: S | M | L
48
50
  ## Decisions
49
51
  - <decision> - <why> (modules, interfaces, schema, contracts; architect verdict and constraints)
50
52
 
51
- ## Test seams
52
- | Seam | Catches | Misses | Prior art |
53
- |------|---------|--------|-----------|
54
- | S1: <public interface> | <behavior it proves> | <what it cannot see> | <existing test, or none> |
55
-
56
53
  ## Tickets
57
54
  <one ticket = one tracer bullet = one brief = one agent = one context window>
58
55
  | # | Ticket | Delivers | Blocked by | Agent | Paths | Seams | Status |
59
56
  |---|--------|----------|------------|-------|-------|-------|--------|
60
57
  | 1 | <title> | <end-to-end behavior, from the user's perspective> | - | /api | <globs> | S1 | todo |
61
58
 
59
+ ## Test seams
60
+ <one row per level and public interface; default levels per size in agent `product` (step 6); levels per stack in the `arch-*` testing references>
61
+ Confirmed: <YYYY-MM-DD at the ticket gate | pending>
62
+ | # | Level | Seam (public interface) | ACs | Catches | Leaves to | Prior art |
63
+ |---|-------|-------------------------|-----|---------|-----------|-----------|
64
+ | S1 | e2e | <flow: create -> approve -> list> | AC1, AC2 | <the flow end to end, happy path and the failures that hurt most> | <rule detail: S3, S5> | <existing test, or none> |
65
+ | S2 | entry | <POST /invoices> | AC1 | <contract, validation, authorization, error codes> | <business rule: S3> | <...> |
66
+ | S3 | service | <CreateInvoice use case> | AC3 | <business rules and decisions, ports faked> | <SQL: S4> | <...> |
67
+ | S4 | repository | <invoices repository adapter> | AC4 | <SQL, mapping, constraints, pagination, real database> | <-> | <...> |
68
+ | S5 | unit | <invoice rules> | AC3 | <every edge case of the pure rule> | <-> | <...> |
69
+
62
70
  ## Definition of Done
63
71
  - [ ] lint, build, tests green (evidence pasted)
64
- - [ ] a test exists at every seam listed above
72
+ - [ ] a test exists at every seam listed above, at its level
73
+ - [ ] the slow suites (integration, e2e) ran in `/verifier`; the Stop hook runs only the fast one
65
74
  - [ ] diff only inside scoped paths
66
75
  - [ ] docs updated if route/job/store/integration/fallback changed
67
76
  - [ ] no secrets in diff
@@ -70,4 +79,26 @@ Size: S | M | L
70
79
 
71
80
  ## Open questions
72
81
  - ...
82
+
83
+ ## Terms
84
+ <domain words this plan introduces or uses differently from GLOSSARY.md, confirmed by the user at the ticket gate and then written to GLOSSARY.md; n/a when the plan uses only glossary terms>
85
+ - **<Term>**: <one or two sentences: what it is> _Avoid_: <synonyms> - new | conflicts with GLOSSARY.md (<entry>) | confirmed
86
+
87
+ ## Grill record
88
+ <appended by the orchestrator after every grill round; never rewritten, corrections appended; n/a when no grill ran (S, or M with no open decision)>
89
+ - Q<n> <question title>: <decision> - why: <reason, in the user's words when they add nuance>
90
+ - Rejected: <alternative> - <why not>
91
+ - Constraint: <anything said in passing that binds the work>
73
92
  ```
93
+
94
+ ## Wayfinder efforts
95
+
96
+ Work too big and too foggy for one plan (the destination is clear, the way is not) is charted by skill `wayfinder` in its own folder, one level down so the post-compact hook never mistakes it for a task plan:
97
+
98
+ ```
99
+ docs/plans/<effort>/
100
+ map.md Status, Destination, Notes, Decisions so far, Not yet specified, Out of scope
101
+ decisions/NN-<slug>.md one question per file: Type, Status, Blocked by, ## Question, ## Answer
102
+ ```
103
+
104
+ The map is an index: a decision lives in its ticket, and the map only gists it and links. When the map is done, the build starts as an L task with its own `docs/plans/<task>.md`, and `/product` reads the map as the source of the decisions already made.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@evertonferreira96/agents",
3
- "version": "0.1.3",
3
+ "version": "0.1.4",
4
4
  "description": "Personal agents, rules, hooks and skills for Claude Code (portable to Cursor and Codex through AGENTS.md), installable into any project.",
5
5
  "type": "module",
6
6
  "bin": {