@evertonferreira96/agents 0.1.3 → 0.1.5

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.
Files changed (35) hide show
  1. package/.claude/agents/api.md +2 -3
  2. package/.claude/agents/app.md +2 -2
  3. package/.claude/agents/product.md +18 -7
  4. package/.claude/agents/quick.md +1 -1
  5. package/.claude/agents/ui.md +1 -1
  6. package/.claude/agents/verifier.md +8 -4
  7. package/.claude/agents/web.md +2 -2
  8. package/.claude/hooks/orchestrator-guard.sh +3 -1
  9. package/.claude/hooks/post-compact.sh +20 -4
  10. package/.claude/hooks/stop-verify.sh +8 -3
  11. package/.claude/rules/adr.md +42 -0
  12. package/.claude/skills/arch-api/references/review.md +17 -0
  13. package/.claude/skills/arch-app/references/review.md +15 -0
  14. package/.claude/skills/arch-db/references/review.md +2 -0
  15. package/.claude/skills/arch-web/references/tests.md +15 -0
  16. package/.claude/skills/brief/SKILL.md +32 -3
  17. package/.claude/skills/domain-modeling/ADR-FORMAT.md +47 -0
  18. package/.claude/skills/domain-modeling/GLOSSARY-FORMAT.md +60 -0
  19. package/.claude/skills/domain-modeling/SKILL.md +74 -0
  20. package/.claude/skills/domain-modeling/agents/openai.yaml +3 -0
  21. package/.claude/skills/grill-with-docs/SKILL.md +10 -16
  22. package/.claude/skills/orchestrate/SKILL.md +20 -13
  23. package/.claude/skills/project-docs/SKILL.md +1 -14
  24. package/.claude/skills/review/SKILL.md +3 -3
  25. package/.claude/skills/wayfinder/SKILL.md +146 -0
  26. package/.claude/skills/wayfinder/agents/openai.yaml +5 -0
  27. package/README.md +18 -14
  28. package/VERSION +1 -1
  29. package/docs/plans/README.md +38 -7
  30. package/package.json +1 -2
  31. package/scripts/bootstrap.mjs +19 -5
  32. package/scripts/check-catalog.mjs +4 -1
  33. package/skills-lock.json +18 -3
  34. package/templates/CLAUDE.project.md +1 -1
  35. package/docs/adr/README.md +0 -31
@@ -0,0 +1,74 @@
1
+ ---
2
+ name: domain-modeling
3
+ description: Build and sharpen a project's domain model. Use when discussing codebase terminology, writing or editing a GLOSSARY.md, or recording or editing an ADR.
4
+ ---
5
+
6
+ # Domain Modeling
7
+
8
+ Actively build and sharpen the project's domain model as you design. This is the *active* discipline: challenging terms, inventing edge-case scenarios, and writing the glossary and decisions down the moment they crystallise. (Merely *reading* `GLOSSARY.md` for vocabulary is not this skill: that's a one-line habit any skill can do. This skill is for when you're changing the model, not just consuming it.)
9
+
10
+ ## File structure
11
+
12
+ Most repos have a single context:
13
+
14
+ ```
15
+ /
16
+ ├── GLOSSARY.md
17
+ ├── docs/
18
+ │ └── adr/
19
+ │ ├── 0001-event-sourced-orders.md
20
+ │ └── 0002-postgres-for-write-model.md
21
+ └── src/
22
+ ```
23
+
24
+ If a `GLOSSARY-MAP.md` exists at the root, the repo has multiple contexts. The map points to where each one lives:
25
+
26
+ ```
27
+ /
28
+ ├── GLOSSARY-MAP.md
29
+ ├── docs/
30
+ │ └── adr/ ← system-wide decisions
31
+ ├── src/
32
+ │ ├── ordering/
33
+ │ │ ├── GLOSSARY.md
34
+ │ │ └── docs/adr/ ← context-specific decisions
35
+ │ └── billing/
36
+ │ ├── GLOSSARY.md
37
+ │ └── docs/adr/
38
+ ```
39
+
40
+ Create files lazily: only when you have something to write. If no `GLOSSARY.md` exists, create one when the first term is resolved. If no `docs/adr/` exists, create it when the first ADR is needed.
41
+
42
+ ## During the session
43
+
44
+ ### Challenge against the glossary
45
+
46
+ When the user uses a term that conflicts with the existing language in `GLOSSARY.md`, call it out immediately. "Your glossary defines 'cancellation' as X, but you seem to mean Y. Which is it?"
47
+
48
+ ### Sharpen fuzzy language
49
+
50
+ When the user uses vague or overloaded terms, propose a precise canonical term. "You're saying 'account': do you mean the Customer or the User? Those are different things."
51
+
52
+ ### Discuss concrete scenarios
53
+
54
+ When domain relationships are being discussed, stress-test them with specific scenarios. Invent scenarios that probe edge cases and force the user to be precise about the boundaries between concepts.
55
+
56
+ ### Cross-reference with code
57
+
58
+ When the user states how something works, check whether the code agrees. If you find a contradiction, surface it: "Your code cancels entire Orders, but you just said partial cancellation is possible. Which is right?"
59
+
60
+ ### Update GLOSSARY.md inline
61
+
62
+ When a term is resolved, update `GLOSSARY.md` right there. Don't batch these up: capture them as they happen. Use the format in [GLOSSARY-FORMAT.md](./GLOSSARY-FORMAT.md).
63
+
64
+ `GLOSSARY.md` should be totally devoid of implementation details. Do not treat `GLOSSARY.md` as a spec, a scratch pad, or a repository for implementation decisions. It is a glossary and nothing else.
65
+
66
+ ### Offer ADRs sparingly
67
+
68
+ Only offer to create an ADR when all three are true:
69
+
70
+ 1. **Hard to reverse**: the cost of changing your mind later is meaningful
71
+ 2. **Surprising without context**: a future reader will wonder "why did they do it this way?"
72
+ 3. **The result of a real trade-off**: there were genuine alternatives and you picked one for specific reasons
73
+
74
+ If any of the three is missing, skip the ADR. Use the format in [ADR-FORMAT.md](./ADR-FORMAT.md).
@@ -0,0 +1,3 @@
1
+ interface:
2
+ display_name: "Domain Modeling"
3
+ short_description: "Build and sharpen a domain model"
@@ -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). Rule `adr` (`.claude/rules/adr.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 rule `adr`, `.claude/rules/adr.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,13 +131,13 @@ 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)
132
138
 
133
139
  - After the first `/architect` pass, write its ADR proposal into `docs/plans/<task>.md` under Decisions.
134
- - At DoD, create `docs/adr/NNNN-<slug>.md` from that proposal (template in `docs/adr/README.md`) in the same diff. Grill ADRs already written as `Proposed` become `Accepted` here. This is a docs write and is yours.
140
+ - At DoD, create `docs/adr/NNNN-<slug>.md` from that proposal (template in rule `adr`) in the same diff. Grill ADRs already written as `Proposed` become `Accepted` here. This is a docs write and is yours.
135
141
 
136
142
  ## 12. Commit
137
143
 
@@ -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
 
@@ -278,20 +278,7 @@ Only if you actually operate this (VPS, homelab, side-project prod). Commands th
278
278
 
279
279
  ### ADR (`docs/adr/0001-<slug>.md`)
280
280
 
281
- Use when you chose one option and rejected others. The architecture page stays present-tense; the ADR may narrate the choice.
282
-
283
- ```markdown
284
- # ADR 0001 - <Title>
285
-
286
- - **Status:** accepted
287
- - **Date:** YYYY-MM-DD
288
-
289
- ## Context
290
-
291
- ## Decision
292
-
293
- ## Consequences
294
- ```
281
+ Use when you chose one option and rejected others. The architecture page stays present-tense; the ADR may narrate the choice. Template, numbering and lifecycle: rule `adr` (`.claude/rules/adr.md`), the one every skill and agent uses.
295
282
 
296
283
  ## Freshness (personal scale)
297
284
 
@@ -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, rule `adr` 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 |
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 |
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
+ | **Rules** (10) | Loaded always or by path glob: git, tickets, api, web, mobile, db, ui, graphify, adr, 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 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 belongs to the project and its work: its `README.md`, everything under `docs/adr/` (no README either: the ADR template is rule `.claude/rules/adr.md`), `docs/plans/**` except the plan template `docs/plans/README.md`, `GLOSSARY.md`, `GLOSSARY-MAP.md` and context glossaries, `.claude/handoffs/**`. A `docs/adr/README.md` left by an older version is removed on update when untouched, and kept as yours when edited. 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 |
@@ -255,13 +257,12 @@ your-project/
255
257
  ├── skills-lock.json origin and hash of every vendored skill
256
258
  ├── docs/
257
259
  │ ├── plans/README.md plan template, one plan per task
258
- │ ├── adr/README.md ADR template
259
260
  │ └── brief-template.md
260
261
  ├── scripts/ bootstrap, check-catalog, skills-update
261
262
  └── .claude/
262
263
  ├── agents/ 10 agents
263
- ├── skills/ 37 skills
264
- ├── rules/ 9 rules
264
+ ├── skills/ 39 skills
265
+ ├── rules/ 10 rules (rule adr is the ADR template)
265
266
  ├── hooks/ 8 hooks
266
267
  ├── settings.json hook wiring, worktree base, context limits
267
268
  ├── config-manifest.json hash of every installed file (commit it)
@@ -282,14 +283,17 @@ flowchart TD
282
283
  TRI --> CLS
283
284
 
284
285
  CLS -- "S: one file,<br/>one-sentence diff" --> QK["quick agent"]
285
- QK --> STOP["Stop hook<br/>lint and tests"]
286
+ QK --> STOP["Stop hook<br/>lint and unit tests"]
287
+
288
+ CLS -- "fog: decisions need<br/>research or a prototype" --> WF["wayfinder<br/>one decision per session"]
289
+ WF -- "map done" --> WT
286
290
 
287
291
  CLS -- "M or L" --> WT["Task worktree<br/>.claude/worktrees/slug"]
288
292
  WT --> GRL["Grill with you<br/>L always, M on open decisions"]
289
- GRL --> PRD["product agent<br/>scope, AC, test seams, tickets"]
293
+ GRL --> PRD["product agent<br/>scope, AC, test seams per level, tickets"]
290
294
  PRD -- "L or architecture trigger" --> ARC["architect agent"]
291
295
  PRD -- M --> GATE
292
- ARC --> GATE{"You approve<br/>the tickets"}
296
+ ARC --> GATE{"You approve the tickets,<br/>test levels and terms"}
293
297
  GATE --> IMP["One implementer per ticket<br/>api, web, app, infra, ui<br/>test-first with tdd"]
294
298
  IMP --> INT["Integrate"]
295
299
  INT --> VER["verifier agent<br/>Spec axis, then Standards axis"]
@@ -301,7 +305,7 @@ flowchart TD
301
305
  classDef you fill:#fef3c7,stroke:#d97706,color:#78350f
302
306
  classDef agent fill:#dbeafe,stroke:#2563eb,color:#1e3a8a
303
307
  classDef guard fill:#dcfce7,stroke:#16a34a,color:#14532d
304
- class GRL,GATE you
308
+ class GRL,GATE,WF you
305
309
  class QK,PRD,ARC,IMP,VER,SEC agent
306
310
  class STOP guard
307
311
  ```
@@ -311,14 +315,14 @@ flowchart TD
311
315
  | Agent | Does | Mode |
312
316
  |---|---|---|
313
317
  | `quick` | S work: one file, one-sentence diff | writes |
314
- | `product` | Plan: scope, stories, acceptance criteria, test seams, tickets | read-only |
318
+ | `product` | Plan: scope, stories, acceptance criteria, test seams per level, terms, tickets | read-only |
315
319
  | `architect` | Boundaries, contracts, failure modes; verdict and ADR proposal | read-only |
316
320
  | `api` | Server side: APIs, domain, persistence, workers (`arch-api`, `arch-db`, `tdd`) | writes |
317
321
  | `web` | Next.js app (`arch-web`, `tdd`) | writes |
318
322
  | `app` | React Native / Expo app (`arch-app`, `tdd`) | writes |
319
323
  | `infra` | Terraform, CI, deploy, observability; never applies | writes |
320
324
  | `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 |
325
+ | `verifier` | Fresh-context check of the diff against the plan; runs lint, build and every test suite, integration and e2e included | no edits |
322
326
  | `security` | Auth, secrets, PII, payments, public routes; severity report | read-only |
323
327
 
324
328
  **Guardrails enforced by hooks**
@@ -328,9 +332,9 @@ flowchart TD
328
332
  | `guard-bash` | Blocks `git push`, `git add -A` / `.`, staging `.env*`, `--no-verify`, `reset --hard`, `clean -f`, PR and issue writes |
329
333
  | `orchestrator-guard` | The main session can edit plans, ADRs and docs, never code |
330
334
  | `readonly-guard` | Read-only agents can only write their own memory |
331
- | `stop-verify` | Lint and tests on Stop when the tree changed |
335
+ | `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
336
  | `context-budget` | Warns at 60k, 90k and 110k tokens; compaction at 120k |
333
- | `post-compact` | Re-injects the active plan after compaction |
337
+ | `post-compact` | Re-injects the active plan, and the active wayfinder map, after compaction |
334
338
  | `graphify-update` | Refreshes the code graph after edits, when one exists |
335
339
  | `config-update-check` | One line at session start when a local-clone install has a newer version |
336
340
 
package/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.3
1
+ 0.1.5