@terreno/agent-plugin 0.0.0-stage → 57.22.0

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 (98) hide show
  1. package/.claude-plugin/plugin.json +32 -0
  2. package/CHANGELOG.md +2155 -0
  3. package/LICENSE +21 -0
  4. package/README.md +57 -2
  5. package/agents/pre-commit.md +65 -0
  6. package/agents/ui-verifier.md +93 -0
  7. package/package.json +32 -4
  8. package/references/async-review-bots.md +76 -0
  9. package/references/documentation-contract.md +61 -0
  10. package/references/execution-state.schema.json +77 -0
  11. package/references/github-attention-contract.md +165 -0
  12. package/references/independent-review.md +31 -0
  13. package/references/lifecycle-contract.md +211 -0
  14. package/references/loop-engineering.md +125 -0
  15. package/references/pick-roast-loop.md +112 -0
  16. package/references/pr-deployments.md +69 -0
  17. package/references/product-ci.md +164 -0
  18. package/references/push-ownership.md +91 -0
  19. package/references/stage-result.schema.json +82 -0
  20. package/references/subagent-briefing.md +43 -0
  21. package/references/testing-plan.md +163 -0
  22. package/references/user-guide.md +171 -0
  23. package/skills/1-grow/SKILL.md +145 -0
  24. package/skills/1-grow/references/grilling.md +243 -0
  25. package/skills/2-pick/SKILL.md +170 -0
  26. package/skills/2-pick/references/mocking.md +34 -0
  27. package/skills/2-pick/references/testing.md +43 -0
  28. package/skills/3-roast/SKILL.md +168 -0
  29. package/skills/4-brew/SKILL.md +201 -0
  30. package/skills/5-taste/SKILL.md +311 -0
  31. package/skills/ai-prompt-governance/SKILL.md +100 -0
  32. package/skills/attach-pr-media/SKILL.md +89 -0
  33. package/skills/attach-pr-media/scripts/upload-pr-media.sh +151 -0
  34. package/skills/backend-test-env/SKILL.md +64 -0
  35. package/skills/backfill-regression/SKILL.md +101 -0
  36. package/skills/backfill-user-guide/SKILL.md +96 -0
  37. package/skills/bootstrap-mcp-server/SKILL.md +244 -0
  38. package/skills/building-admin-interfaces/SKILL.md +83 -0
  39. package/skills/building-admin-interfaces/agents/openai.yaml +4 -0
  40. package/skills/building-admin-interfaces/references/nav-and-shell.md +42 -0
  41. package/skills/building-admin-interfaces/references/patterns-and-tools.md +73 -0
  42. package/skills/building-admin-interfaces/references/screens-and-routes.md +50 -0
  43. package/skills/building-terreno-apps/SKILL.md +280 -0
  44. package/skills/building-terreno-apps/agents/openai.yaml +4 -0
  45. package/skills/building-terreno-apps/references/navigation.md +102 -0
  46. package/skills/building-terreno-apps/references/route-structure.md +91 -0
  47. package/skills/building-terreno-apps/references/screen-patterns.md +191 -0
  48. package/skills/debug-syncdb-with-mcp/SKILL.md +75 -0
  49. package/skills/deploy-gcp/SKILL.md +73 -0
  50. package/skills/deploy-gcp/references/troubleshooting.md +29 -0
  51. package/skills/generate-release-announcements/SKILL.md +145 -0
  52. package/skills/generate-sdk/SKILL.md +156 -0
  53. package/skills/mongoose-schema-safety/SKILL.md +164 -0
  54. package/skills/pick-roast-loop/SKILL.md +152 -0
  55. package/skills/planning-loop/SKILL.md +161 -0
  56. package/skills/prd/SKILL.md +138 -0
  57. package/skills/set-up-social-login/SKILL.md +76 -0
  58. package/skills/store-assets/SKILL.md +221 -0
  59. package/skills/store-assets/examples/screenshots.yaml +31 -0
  60. package/skills/store-assets/examples/storeAssets.config.json +44 -0
  61. package/skills/store-assets/scripts/banner.ts +165 -0
  62. package/skills/store-assets/scripts/config.ts +255 -0
  63. package/skills/store-assets/scripts/devClient.ts +635 -0
  64. package/skills/store-assets/scripts/devices.ts +286 -0
  65. package/skills/store-assets/scripts/icon.ts +81 -0
  66. package/skills/store-assets/scripts/maestro/goHome.yaml +21 -0
  67. package/skills/store-assets/scripts/maestro/login.yaml +27 -0
  68. package/skills/store-assets/scripts/maestro/openApp.yaml +26 -0
  69. package/skills/store-assets/scripts/screenshots.ts +848 -0
  70. package/skills/taste-sweep/SKILL.md +172 -0
  71. package/skills/terreno-backend-api/SKILL.md +355 -0
  72. package/skills/terreno-backend-api/agents/openai.yaml +4 -0
  73. package/skills/terreno-backend-api/references/custom-routes.md +132 -0
  74. package/skills/terreno-backend-api/references/model-router.md +116 -0
  75. package/skills/terreno-backend-api/references/server-setup.md +116 -0
  76. package/skills/terreno-backend-tests/SKILL.md +176 -0
  77. package/skills/terreno-data-fetching/SKILL.md +276 -0
  78. package/skills/terreno-data-fetching/agents/openai.yaml +4 -0
  79. package/skills/terreno-data-fetching/references/auth-and-tokens.md +93 -0
  80. package/skills/terreno-data-fetching/references/realtime.md +45 -0
  81. package/skills/terreno-data-fetching/references/sdk-customization.md +84 -0
  82. package/skills/terreno-frontend-tests/SKILL.md +190 -0
  83. package/skills/terreno-mobile-tests/SKILL.md +127 -0
  84. package/skills/terreno-test-setup/SKILL.md +81 -0
  85. package/skills/terreno-test-setup/references/backend.md +131 -0
  86. package/skills/terreno-test-setup/references/frontend.md +169 -0
  87. package/skills/terreno-test-setup/references/mobile.md +134 -0
  88. package/skills/terreno-ui/SKILL.md +252 -0
  89. package/skills/terreno-ui/agents/openai.yaml +4 -0
  90. package/skills/terreno-ui/references/data-display.md +85 -0
  91. package/skills/terreno-ui/references/feedback.md +122 -0
  92. package/skills/terreno-ui/references/forms.md +119 -0
  93. package/skills/terreno-ui/references/layout.md +124 -0
  94. package/skills/terreno-ui/references/theming.md +87 -0
  95. package/skills/update-docs/SKILL.md +82 -0
  96. package/skills/upgrading-terreno/SKILL.md +86 -0
  97. package/skills/upgrading-terreno/references/ordering.md +40 -0
  98. package/skills/verify-ui-changes/SKILL.md +605 -0
@@ -0,0 +1,171 @@
1
+ # User guide
2
+
3
+ Every IP says which user guide pages its feature adds, changes, or retires, so the guide
4
+ grows with the app instead of being written once and left to rot. A page explains one
5
+ feature in the words a user sees on screen: what it does, how to use it, and what it is
6
+ meant for. Chat agents read these pages to answer "how do I…" questions about the app, so
7
+ a page describes shipped behavior only. Grow plans the rows. Later stages read them; they
8
+ do not invent rows.
9
+
10
+ ## Standardized spot
11
+
12
+ | Key | Default | What it holds |
13
+ | --- | --- | --- |
14
+ | `User guide` | `docs/user-guide/` | One page per feature at `<area>/<feature>.md`, plus a `README.md` index |
15
+
16
+ A repository whose layout differs, or that keeps no user guide, overrides the default with
17
+ a `## User guide conventions` table in its agent instructions (AGENTS.md or CLAUDE.md):
18
+
19
+ ```markdown
20
+ ## User guide conventions
21
+
22
+ | Key | Value |
23
+ | --- | --- |
24
+ | User guide | docs/help/ |
25
+ ```
26
+
27
+ Resolve the key once: the table's value when the table names it, otherwise the default.
28
+
29
+ ### Opting out
30
+
31
+ A repository with no end users (a library, a CLI, an internal tool) opts out with the
32
+ value `none`, optionally followed by a reason:
33
+
34
+ ```markdown
35
+ | User guide | none — command-line tool with no in-app users |
36
+ ```
37
+
38
+ When the resolved value is `none`, the user guide is off: Grow writes
39
+ `## User guide` as `None — user guide off`, and every other stage, check, and backfill
40
+ skips the section without failing. Opting out is the only way to skip it; a missing
41
+ directory at the resolved path is not an opt-out. When no guide exists at a resolved
42
+ path, the first IP that needs a page creates the directory and its `README.md` index.
43
+
44
+ ## Page format
45
+
46
+ One file per feature at `<User guide>/<area>/<feature>.md`. `<area>` and `<feature>` are
47
+ kebab-case. The page opens with frontmatter, then three fixed sections in this order:
48
+
49
+ ```markdown
50
+ ---
51
+ title: Set a due date on a todo
52
+ area: todos
53
+ audience: user
54
+ platforms: [web, ios, android]
55
+ questions:
56
+ - How do I set a due date on a todo?
57
+ - Can I change or remove a due date?
58
+ screens:
59
+ - "app/(tabs)/index.tsx"
60
+ added: todos-due-date
61
+ ---
62
+
63
+ # Set a due date on a todo
64
+
65
+ ## What it does
66
+
67
+ A due date shows when a todo should be done. Todos with a date show it under the title.
68
+
69
+ ## How to use it
70
+
71
+ 1. On **Todos**, tap a todo.
72
+ 2. Tap **Due date** and pick a day.
73
+ 3. Tap **Save**.
74
+
75
+ To remove the date, open the todo, tap **Due date**, then tap **Clear**.
76
+
77
+ ## Intended use
78
+
79
+ Use due dates for todos that must happen by a certain day. A due date does not send a
80
+ reminder.
81
+ ```
82
+
83
+ | Field | Rule |
84
+ | --- | --- |
85
+ | `title` | The task in the user's words, usually a verb phrase. Matches the `#` heading. |
86
+ | `area` | The page's directory name. |
87
+ | `audience` | Who can reach the feature: `user`, `admin`, or `staff`. A chat agent never describes a page to someone outside its audience. |
88
+ | `platforms` | Where the feature ships: any of `web`, `ios`, `android`. |
89
+ | `questions` | One to five "how do I…" or "can I…" questions a user would type that this page answers. Retrieval matches on these. |
90
+ | `screens` | Optional. Repository-relative source paths of the screens the steps visit, as a block list of quoted strings, since paths such as `[id].tsx` break inline YAML lists. |
91
+ | `added` | The slug of the IP that added the page, or `user-guide-backfill`. |
92
+ | `updated` | Optional. The slug of the latest IP that changed the page. |
93
+
94
+ Sections:
95
+
96
+ - `## What it does`: one to three sentences on what the feature does for the user.
97
+ - `## How to use it`: numbered steps a user can follow without guessing, naming on-screen
98
+ labels in **bold**. Follow-up variations go in short paragraphs after the steps.
99
+ - `## Intended use`: what the feature is for, and what it is not for or does not do.
100
+ This is where a chat agent learns to say "that's not what this is for".
101
+ - Optional `## Related`: links to other guide pages, by relative path.
102
+
103
+ ## Guide-entry bar
104
+
105
+ Every page meets this bar:
106
+
107
+ - It describes behavior that ships in this change or is already shipped. No roadmap, no
108
+ "coming soon".
109
+ - It uses the words a user sees: screen titles, button labels, menu names. No code,
110
+ component names, routes, model or field names, test IDs, or internal jargon.
111
+ - Each step names where the user is and what they press or enter, and the steps reach
112
+ the outcome `## What it does` promises.
113
+ - It holds no personal or health information, real names, real accounts, secrets,
114
+ internal URLs, or staff-only procedures on a `user` page. Examples use obviously fake
115
+ data.
116
+ - `audience` and `platforms` match who can actually reach the feature.
117
+
118
+ "Use the feature as needed", steps that skip a screen, or text that restates the title
119
+ does not meet the bar.
120
+
121
+ ## IP table
122
+
123
+ Every IP has a `## User guide` section. It may be `None — <reason>`, but it may not be
124
+ missing. `None — no user-visible change` is the usual entry for backend-only, refactor, or
125
+ tooling work.
126
+
127
+ | ID | Page | Change | Audience | Written in |
128
+ | --- | --- | --- | --- | --- |
129
+ | G1 | `docs/user-guide/todos/due-dates.md` | new | user | T2 |
130
+
131
+ - `ID` is `G<n>`, unique within the IP.
132
+ - `Page` is the repository-relative page path under the resolved `User guide`.
133
+ - `Change` is `new`, `update`, or `retire`. `retire` deletes the page and its index entry
134
+ when the feature is removed.
135
+ - `Audience` is the page's `audience` value.
136
+ - `Written in` is the one task that delivers the behavior. That task writes the page.
137
+
138
+ Every acceptance criterion that changes what a user sees or does maps to a row, or the IP
139
+ gives the reason it does not (for example: covered by an existing page, which is named).
140
+
141
+ ## Index
142
+
143
+ `<User guide>/README.md` lists every page in one table, grouped by area:
144
+
145
+ ```markdown
146
+ | Area | Page | Audience | Title |
147
+ | --- | --- | --- | --- |
148
+ | todos | [due-dates.md](todos/due-dates.md) | user | Set a due date on a todo |
149
+ ```
150
+
151
+ A stage that adds, renames, or retires a page updates this table in the same commit.
152
+
153
+ ## Stage duties
154
+
155
+ | Stage | Duty |
156
+ | --- | --- |
157
+ | Grow | Plans the `## User guide` rows, or `None — <reason>`. |
158
+ | Pick | Writes or edits each page whose row names the current task, in that task, at the row's path, and updates the index. |
159
+ | Roast | Checks each page this task owns against the guide-entry bar and against the shipped screens: every label a step names exists, and the steps reach the outcome. Walks the steps in a browser when it can reach one. |
160
+ | Brew | Confirms every row's page exists (or is gone, for `retire`), the index matches, and the repository's guide check passes. Sets `updated` on changed pages. |
161
+ | Taste | After a fix that changes user-visible behavior, updates the affected pages in place before the push. |
162
+
163
+ A page whose steps no longer match the shipped screens is a failing row, the same as a
164
+ failing test.
165
+
166
+ ## Legacy rule
167
+
168
+ An IP approved before this contract that lacks `## User guide` is read as `None —
169
+ predates contract`. Stages warn once in their result and do not fail. A revised legacy IP
170
+ gains the section in the Grow invocation that revises it. Features shipped before the
171
+ contract are covered by the `backfill-user-guide` skill.
@@ -0,0 +1,145 @@
1
+ ---
2
+ name: 1-grow
3
+ description: Research, clarify, shape, and approve an implementation-ready IP and task list. Use whenever the user asks to plan, shape, spec, or scope substantial work ("help me plan X", "how should we build Y") or to revise an existing plan; not for implementation or PR operations.
4
+ ---
5
+
6
+ # Grow — shape
7
+
8
+ Turn a request, ticket, or specification into approved artifacts a fresh Pick agent can
9
+ execute without conversation history.
10
+
11
+ Read the shared [`lifecycle contract`](../../references/lifecycle-contract.md),
12
+ [`documentation contract`](../../references/documentation-contract.md),
13
+ [`PR deployments`](../../references/pr-deployments.md),
14
+ [`testing plan`](../../references/testing-plan.md),
15
+ [`user guide`](../../references/user-guide.md), and
16
+ [`grilling procedure`](references/grilling.md) before acting. Follow grilling for every
17
+ human decision until the answer is executable.
18
+
19
+ ## Preconditions
20
+
21
+ - A request/spec/ticket and repository are available.
22
+ - This invocation owns shaping only. After `PASS`, Pick and Roast run the inner loop.
23
+
24
+ ## Inputs
25
+
26
+ - Request/spec/ticket and linked context
27
+ - Existing IP/task files, if revising
28
+ - Repository instructions, code, tests, history, and available project skills
29
+ - Execution state and prior result, when present
30
+
31
+ ## Procedure
32
+
33
+ 1. **Reconstruct.** Resolve the repository's existing IP/task conventions from its
34
+ instructions and nearby artifacts. If none exists, choose a colocated IP/task pair,
35
+ record the new convention, and avoid creating a shared mutable index. Read prior state
36
+ and verify it against repository reality. Resolve the testing spot: the e2e guide,
37
+ the regression-suite directory, and the smoke command, from the agent instructions'
38
+ `## Testing conventions` table or the testing-plan defaults. Read the e2e guide and
39
+ the suite files for the affected areas. When `Regression suites` is `none`, follow
40
+ the testing-plan opt-out: no regression cases. Resolve the `User guide` spot from the
41
+ `## User guide conventions` table or the user-guide default, and read the guide pages
42
+ for the affected areas unless the repository opts out.
43
+ 2. **Read architecture docs.** Load the repository's architecture, domain, and operator
44
+ docs for the affected area. Treat them as the current design. If docs are missing or
45
+ contradict the code, the IP must resolve that in this invocation.
46
+ 3. **Discover supporting skills.** Inspect available repository/project skills and load
47
+ those relevant to the affected domains, including documentation skills. Record
48
+ selected skills for downstream stages.
49
+ 4. **Research before asking.** Classify uncertainty:
50
+ - **Human decision:** product, architecture, security, data ownership, compatibility,
51
+ rollout, destructive change, or scope → grill and block until answered.
52
+ - **Discoverable fact:** repository convention, library behavior, ownership, tests →
53
+ investigate it.
54
+ - **Low-risk implementation detail:** strongly implied by convention → choose it and
55
+ record the assumption.
56
+ 5. **Grill.** Follow the grilling procedure. Work the current decision frontier in rounds
57
+ of selectable options with a recommended default, using the harness's structured
58
+ question tool when it has one. Get to the bottom of each reply: vague,
59
+ partial, or conflicting answers stay on the frontier. Wait for explicit
60
+ shared-understanding confirmation before writing. Every wait-for-human or done
61
+ message closes with PR deployment URLs when a PR has them.
62
+ 6. **Shape.** Prefer contracts/models/APIs before implementation detail where applicable.
63
+ Define scope, non-scope, architecture decisions, risks, human gates, rollout, and
64
+ dependencies.
65
+ 7. **Specify proof.** Make every acceptance criterion observable and pair it with a
66
+ verification method (test, build, runtime/API/database probe, UI exercise, artifact,
67
+ compatibility/regression case). When the input is a PRD from `prd`, carry
68
+ each success metric and guardrail into an acceptance criterion, grill each `TBD` as a
69
+ human decision, and do not re-ask product decisions the PRD already settled.
70
+ Pair each UI or cross-process criterion with a planned e2e spec at the path and layer
71
+ the e2e guide prescribes, or record why it needs none. Automate first: anything a
72
+ guide layer can drive and assert is an e2e row. Regression cases are usually `None`:
73
+ add one only for a change a developer or QA must check by hand (push notifications
74
+ and other hardware or OS behavior, a full cross-device flow, feel) that no existing
75
+ case covers, each meeting the testing-plan regression-step bar. Pair each criterion
76
+ that changes what a user sees or does with a `## User guide` row (new, update, or
77
+ retire) at the page path the user-guide contract prescribes, or record why it needs
78
+ none.
79
+ 8. **Write.** Produce the IP and a dependency-aware tracer-bullet task list. Each task
80
+ names files/seams, acceptance criteria, blockers, verification, docs to create or
81
+ update, and relevant supporting skills when discoverable. Docs updates follow the
82
+ documentation contract and are not deferred. The IP always has both testing-plan
83
+ sections, `## E2E tests` and `## Regression cases`, in the testing-plan table
84
+ formats; either may be `None — <reason>`, neither may be missing. Every E2E row
85
+ names the task that writes it. When no file exists at the resolved e2e guide path,
86
+ add a task that writes it there, ahead of every task that writes a planned spec.
87
+ The IP also always has the `## User guide` section in the user-guide table format,
88
+ or `None — <reason>`; it may not be missing. Every guide row names the task that
89
+ writes its page. A repository that opts out writes `None — user guide off`.
90
+ 9. **Approve.** Post the standalone approval brief from grilling: an orientation
91
+ paragraph on where the repository is and where this change takes it, optional
92
+ background on current state, the idea, the plan with its `E2E:`, `Regression:`, and
93
+ `User guide:` lines, then the unbounded Decisions table
94
+ pairing each settled human decision with the question that prompted it. Skip that
95
+ table when grilling settled none. The brief must be readable without the IP, the
96
+ ticket, or the grilling history. Set the repository's approved status only after human
97
+ confirmation. Update execution state and emit the stage result collapsed per the
98
+ lifecycle contract.
99
+
100
+ ## Supporting skills
101
+
102
+ Follow the shared discovery procedure. Supporting skills may cover API/UI architecture,
103
+ data access, schemas, prompts, deployment, testing, or safety. Names are repository-defined;
104
+ none is universally required.
105
+
106
+ ## Evidence produced
107
+
108
+ - Approved IP path and task-file path
109
+ - Standalone approval brief: orientation paragraph, background when needed, idea, plan
110
+ - Research findings and recorded assumptions (not chain-of-thought)
111
+ - Decision log/human gates, listed in full with their prompting questions when any exist
112
+ - Acceptance-criterion → verification mapping
113
+ - `## E2E tests` and `## Regression cases` sections, each with rows or `None — <reason>`
114
+ - `## User guide` section with rows or `None — <reason>`
115
+ - Selected supporting skills
116
+ - Docs files named on each task
117
+ - Updated execution state and structured Grow result
118
+
119
+ ## Success conditions
120
+
121
+ - IP/task artifacts are approved, implementation-ready, dependency-aware, and testable.
122
+ - The IP has both testing-plan sections, and every E2E row names its writing task.
123
+ - The IP has a `## User guide` section, and every guide row names its writing task.
124
+ - A fresh Pick invocation can identify the next unblocked task, applicable criteria,
125
+ decisions, supporting skills, and risks from durable artifacts.
126
+ - A reviewer with no prior context can approve or push back from the brief alone.
127
+ - Emit `PASS` with `next: pick`.
128
+
129
+ ## Failure conditions
130
+
131
+ Malformed or contradictory artifacts emit `FAIL` with exact defects,
132
+ `next: grow`, and a focused Grow retry. Do not pass incomplete criteria
133
+ to Pick.
134
+
135
+ ## Blocked conditions
136
+
137
+ Unresolved human decisions, unavailable required evidence/access, or unsafe ambiguity emit
138
+ `BLOCKED` with `next: null`, options, tradeoffs, and a recommended
139
+ default when appropriate.
140
+
141
+ ## Recommended next stage
142
+
143
+ - `PASS` → Pick
144
+ - `FAIL` → Grow with defect evidence
145
+ - `BLOCKED` → outer loop routes the named human/external gate
@@ -0,0 +1,243 @@
1
+ # Grilling — interactive design interview
2
+
3
+ Use this during Grow instead of dumping every unknown in one list.
4
+
5
+ Goal: shared understanding with the user, then write. Do not write the IP, task list, or
6
+ code until the user confirms the last round left no open questions.
7
+
8
+ Adapted from [grilling](https://github.com/mattpocock/skills/blob/main/skills/productivity/grilling/SKILL.md).
9
+ Do not copy tracker setup from that skill. Follow the consuming repository's artifact and
10
+ tracking conventions.
11
+
12
+ ## Map a design tree, not a questionnaire
13
+
14
+ Every request has a tree:
15
+
16
+ - **Root:** the destination (what exists when this is done)
17
+ - **Branches:** decisions that change the design
18
+ - **Leaves:** facts (how the repo already works)
19
+
20
+ Work in **rounds**. Each round asks only the current **frontier**: questions whose
21
+ prerequisites are already settled. Deeper questions wait until their parent is decided.
22
+
23
+ Example: do not ask "which tracker project?" before "do we track this externally?".
24
+ Do not ask "which test double?" before "which public seam is the tracer bullet?".
25
+
26
+ ## Agent vs user
27
+
28
+ | Kind | Who | How |
29
+ | ---- | --- | ---- |
30
+ | **Fact** | Agent | Look it up. Spawn explore/generalPurpose sub-agents. Read the repo. |
31
+ | **Decision** | User | Ask. Never invent product, scope, or UX choices. |
32
+
33
+ Do not ask the user anything a sub-agent can answer from the repo, docs, or git history.
34
+ If a lookup fails, say what you searched and ask one targeted question.
35
+
36
+ ## Get to the bottom
37
+
38
+ A reply is not done until Pick can execute it without guessing.
39
+
40
+ After each user message:
41
+
42
+ 1. Record what was actually chosen, not the wording of the reply.
43
+ 2. If the answer is vague, partial, "sure", "yes", "whatever you think", or only restates
44
+ the question, stay on that decision. Ask the missing concrete: who, which API, which
45
+ UX, which data owner, which compatibility promise, what is out of scope.
46
+ 3. If two answers conflict, name the conflict and re-ask the parent before unlocking
47
+ children.
48
+ 4. If a recommendation had sub-choices and they accepted it without picking one, grill
49
+ the sub-choices.
50
+ 5. Unlock children only when the parent is executable.
51
+
52
+ Do not treat a recommended answer as accepted unless the user confirmed it. Do not write
53
+ from inferred agreement.
54
+
55
+ ## Round loop
56
+
57
+ 1. Research in parallel (sub-agents). Update the tree.
58
+ 2. Compute the frontier (undecided questions whose parents are settled).
59
+ 3. If the frontier is empty, state shared understanding in one short block and wait for
60
+ confirmation. Then write.
61
+ 4. If the frontier is not empty, ask **every frontier question in this round**, in one
62
+ message. Number them. Recommend an answer for each. Then **stop and wait**.
63
+
64
+ Never ask only the first question when three are unblocked. Never proceed to the next
65
+ round from inferred answers. The user may answer a subset; unanswered items stay on the
66
+ frontier.
67
+
68
+ ### Ask with selectable options, not typed replies
69
+
70
+ Every frontier round must be answerable by clicking, not by typing `Q1: xyz`.
71
+
72
+ If the harness has a structured question tool that renders selectable choices
73
+ (Cursor `AskQuestion`, Claude Code `AskUserQuestion`, or equivalent), use it for the whole
74
+ round instead of listing the questions in prose:
75
+
76
+ - One tool question per frontier decision; send the round in a single call.
77
+ - Cap a structured-tool round at **four** questions. Claude Code `AskUserQuestion` rejects
78
+ calls with more than four, so the fifth frontier question waits for the next round
79
+ instead of being appended. Do not split one round across two calls.
80
+ - Put the recommended option **first** and suffix its label with `(Recommended)`.
81
+ - Give every question 2–4 concrete, mutually exclusive options. Option labels are the
82
+ actual choice ("Better Auth session cookie", "Existing JWT middleware"), never "Yes"/
83
+ "Option A"/"Your call". The harness always offers a free-text escape, so do not add an
84
+ "Other" option yourself.
85
+ - Set multi-select only when the decision genuinely accepts several answers at once.
86
+ - Keep the shaping context in the question prompt, one or two sentences, so the option
87
+ labels stay short.
88
+ - Do not also repeat the same questions as numbered prose; the tool is the round.
89
+
90
+ Only when no such tool exists, fall back to the markdown shape below.
91
+
92
+ ### Fallback message shape (no structured question tool)
93
+
94
+ Lead with one line: what this round is deciding.
95
+
96
+ Then for each frontier question:
97
+
98
+ ```markdown
99
+ ❓ **Q1** — **<short title>**: <context in one or two sentences>
100
+ Options (if they help): A / B / C
101
+ ➡️ Recommend: <your answer, with one-line why>
102
+ ---
103
+ ```
104
+
105
+ Rules for the body:
106
+
107
+ - One decision per question.
108
+ - Recommend a default every time. The user can override in a word.
109
+ - Do not ask for facts you already looked up. Cite the finding in the question if it
110
+ informs the decision.
111
+ - Cap the round at **five** questions. Park the rest as "later, after these".
112
+ - End the message. Do not write files, do not start Pick, do not summarize the whole
113
+ plan yet. If this branch already has a PR with GitHub Deployments, the last visible
114
+ section is Demo (see the PR deployments procedure).
115
+
116
+ Round caps, one decision per question: **four** with a structured question tool (the
117
+ Claude Code `AskUserQuestion` limit), **five** for the markdown fallback. Anything past the
118
+ cap stays on the frontier for the next round.
119
+
120
+ ### After the user replies
121
+
122
+ 1. Record answers on the tree.
123
+ 2. Get to the bottom of each answered item before treating it as settled.
124
+ 3. Unlock children. Drop questions the answers made irrelevant.
125
+ 4. Research any new facts those answers created.
126
+ 5. Next round, or confirm-and-write if the frontier is empty.
127
+
128
+ ## Confirm-and-write
129
+
130
+ When the frontier is empty, send **only** this, then wait:
131
+
132
+ ```markdown
133
+ Shared understanding:
134
+ - Destination: <one sentence>
135
+ - In: <comma-separated>
136
+ - Out: <comma-separated>
137
+ - Tracer: <collection / route / hook / CLI>
138
+ - Open risks: <none | one line>
139
+
140
+ Confirm and I will write the plan. Change any bullet if I have it wrong.
141
+ ```
142
+
143
+ When the harness has a structured question tool, send that block and pair it with one
144
+ selectable question ("Confirm this understanding?") offering `Write the plan
145
+ (Recommended)` and `Change something` so confirmation is a click too.
146
+
147
+ If a PR on this branch has GitHub Deployments, print those Demo URLs after this block,
148
+ then wait. Do not write the IP until they confirm.
149
+
150
+ ## Approval brief
151
+
152
+ After writing the IP and task list, post one **approval brief**. It is a standalone
153
+ document: a reviewer who never saw the grilling rounds, the ticket, or the repository
154
+ can read it top to bottom and approve or push back without opening another file.
155
+
156
+ Write it in this order. Orientation first, then the proposal, then the plan, then the
157
+ decisions that shaped them, then the pointers.
158
+
159
+ ```markdown
160
+ # <Change title>
161
+
162
+ <Orientation paragraph. Three to five sentences covering where the repository is today,
163
+ where this change takes it, and why that is worth doing now. Name the user or operator
164
+ who feels the difference. No file paths, no task IDs, no lifecycle jargon.>
165
+
166
+ ## Background
167
+
168
+ <Current state a reviewer needs before the proposal makes sense: how the affected area
169
+ works today, the constraint or gap driving the change, and any research finding that
170
+ overturned an obvious approach. Cite the code, docs, or history you read. Omit this
171
+ whole section when the orientation paragraph already carries the reader.>
172
+
173
+ ## The idea
174
+
175
+ <The shape of the solution in a short paragraph or a few bullets: the contract, model,
176
+ API, or seam that changes, and what is observably different afterwards. State the
177
+ alternative you rejected and why in one line when a reviewer would otherwise ask.>
178
+
179
+ ## The plan
180
+
181
+ | # | Task | Lands in | Proves it |
182
+ | --- | --- | --- | --- |
183
+ | T1 | <task title> | <files or seam> | <test, probe, artifact, or UI exercise> |
184
+
185
+ Tracer: <public seam the first task cuts through>
186
+ E2E: <planned specs and layers, e.g. "2 specs (browser, http)"; or "None — reason">
187
+ Regression: <provisional case IDs and destination suite; or "None — reason">
188
+ User guide: <guide pages added, updated, or retired; or "None — reason">
189
+ Order: <frontier task IDs; blocked task IDs and what unblocks them>
190
+ Out of scope: <short tags>
191
+ Open risks: <none, or one line each>
192
+
193
+ ## Decisions
194
+
195
+ | ID | Question asked | Answer | What it changes |
196
+ | --- | --- | --- | --- |
197
+ | Q1 | <the question as it was asked> | <the settled choice, not a paraphrase of the reply> | <the design consequence a reviewer should check> |
198
+
199
+ ## Artifacts
200
+
201
+ - Plan: <path>
202
+ - Tasks: <path>
203
+ - Supporting skills: <names, or none found>
204
+
205
+ Next: approve → Pick
206
+ ```
207
+
208
+ Rules for the brief:
209
+
210
+ - The first paragraph is the whole change in prose. A reviewer who reads only that
211
+ paragraph should know the destination and the reason.
212
+ - Background is optional; everything else is required. Drop Background when the change
213
+ is self-explanatory rather than padding it.
214
+ - The idea and the plan come **before** the Decisions table. Decisions justify the plan;
215
+ they are not the pitch.
216
+ - The Decisions table has **no row limit**. List every settled human decision with the
217
+ question that prompted it, so the reviewer can see what was asked and what was chosen.
218
+ Skip the table entirely when grilling settled none; do not mention decisions, an empty
219
+ table, or "none".
220
+ - Every acceptance criterion in the plan table names how it is proved. "Manual check" is
221
+ not a verification method.
222
+ - The `E2E:`, `Regression:`, and `User guide:` lines summarize the IP's `## E2E tests`,
223
+ `## Regression cases`, and `## User guide` sections. They stay lines under the plan
224
+ table, not new headings.
225
+ - Do not restate the IP. The brief orients and points; the IP holds the detail.
226
+ - If a PR has GitHub Deployments, print those Demo URLs after the brief.
227
+
228
+ ## Anti-patterns
229
+
230
+ - One giant question dump at the start
231
+ - Prose-only rounds that force typed replies like `Q1: xyz` when the harness can render
232
+ selectable options
233
+ - Selectable options that are not real choices ("Yes"/"No"/"Your call") or that duplicate
234
+ the harness's built-in free-text escape
235
+ - Asking repository facts ("where is this route defined?")
236
+ - Acting on a recommended answer the user has not accepted
237
+ - Accepting a vague "yes" as a finished decision
238
+ - Recapping the entire interview at the end of every round
239
+ - Writing the IP in the same turn as unanswered questions
240
+ - Hiding decisions in a one-line `Q#=choice` summary
241
+ - An approval brief that opens with file paths or task IDs instead of the destination
242
+ - A Decisions table that lists choices without the questions that prompted them
243
+ - A brief a reviewer cannot act on without opening the IP