@terreno/agent-plugin 0.0.0-stage → 58.0.0-beta.2
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.
- package/.claude-plugin/plugin.json +32 -0
- package/CHANGELOG.md +2213 -0
- package/LICENSE +21 -0
- package/README.md +57 -2
- package/agents/pre-commit.md +65 -0
- package/agents/ui-verifier.md +93 -0
- package/package.json +32 -4
- package/references/async-review-bots.md +76 -0
- package/references/documentation-contract.md +61 -0
- package/references/execution-state.schema.json +77 -0
- package/references/github-attention-contract.md +165 -0
- package/references/independent-review.md +31 -0
- package/references/lifecycle-contract.md +211 -0
- package/references/loop-engineering.md +125 -0
- package/references/pick-roast-loop.md +112 -0
- package/references/pr-deployments.md +69 -0
- package/references/product-ci.md +164 -0
- package/references/push-ownership.md +91 -0
- package/references/stage-result.schema.json +82 -0
- package/references/subagent-briefing.md +43 -0
- package/references/testing-plan.md +163 -0
- package/references/user-guide.md +171 -0
- package/skills/1-grow/SKILL.md +145 -0
- package/skills/1-grow/references/grilling.md +243 -0
- package/skills/2-pick/SKILL.md +170 -0
- package/skills/2-pick/references/mocking.md +34 -0
- package/skills/2-pick/references/testing.md +43 -0
- package/skills/3-roast/SKILL.md +168 -0
- package/skills/4-brew/SKILL.md +201 -0
- package/skills/5-taste/SKILL.md +311 -0
- package/skills/ai-prompt-governance/SKILL.md +100 -0
- package/skills/attach-pr-media/SKILL.md +89 -0
- package/skills/attach-pr-media/scripts/upload-pr-media.sh +151 -0
- package/skills/backend-test-env/SKILL.md +64 -0
- package/skills/backfill-regression/SKILL.md +101 -0
- package/skills/backfill-user-guide/SKILL.md +96 -0
- package/skills/bootstrap-mcp-server/SKILL.md +244 -0
- package/skills/building-admin-interfaces/SKILL.md +86 -0
- package/skills/building-admin-interfaces/agents/openai.yaml +4 -0
- package/skills/building-admin-interfaces/references/nav-and-shell.md +42 -0
- package/skills/building-admin-interfaces/references/patterns-and-tools.md +74 -0
- package/skills/building-admin-interfaces/references/screens-and-routes.md +50 -0
- package/skills/building-terreno-apps/SKILL.md +294 -0
- package/skills/building-terreno-apps/agents/openai.yaml +4 -0
- package/skills/building-terreno-apps/references/navigation.md +108 -0
- package/skills/building-terreno-apps/references/route-structure.md +104 -0
- package/skills/building-terreno-apps/references/screen-patterns.md +174 -0
- package/skills/debug-syncdb-with-mcp/SKILL.md +75 -0
- package/skills/deploy-gcp/SKILL.md +73 -0
- package/skills/deploy-gcp/references/troubleshooting.md +29 -0
- package/skills/generate-release-announcements/SKILL.md +145 -0
- package/skills/generate-sdk/SKILL.md +165 -0
- package/skills/mongoose-schema-safety/SKILL.md +164 -0
- package/skills/pick-roast-loop/SKILL.md +152 -0
- package/skills/planning-loop/SKILL.md +161 -0
- package/skills/prd/SKILL.md +138 -0
- package/skills/set-up-social-login/SKILL.md +76 -0
- package/skills/store-assets/SKILL.md +221 -0
- package/skills/store-assets/examples/screenshots.yaml +31 -0
- package/skills/store-assets/examples/storeAssets.config.json +44 -0
- package/skills/store-assets/scripts/banner.ts +165 -0
- package/skills/store-assets/scripts/config.ts +255 -0
- package/skills/store-assets/scripts/devClient.ts +635 -0
- package/skills/store-assets/scripts/devices.ts +286 -0
- package/skills/store-assets/scripts/icon.ts +81 -0
- package/skills/store-assets/scripts/maestro/goHome.yaml +21 -0
- package/skills/store-assets/scripts/maestro/login.yaml +27 -0
- package/skills/store-assets/scripts/maestro/openApp.yaml +26 -0
- package/skills/store-assets/scripts/screenshots.ts +848 -0
- package/skills/taste-sweep/SKILL.md +172 -0
- package/skills/terreno-backend-api/SKILL.md +355 -0
- package/skills/terreno-backend-api/agents/openai.yaml +4 -0
- package/skills/terreno-backend-api/references/custom-routes.md +132 -0
- package/skills/terreno-backend-api/references/model-router.md +112 -0
- package/skills/terreno-backend-api/references/server-setup.md +116 -0
- package/skills/terreno-backend-tests/SKILL.md +176 -0
- package/skills/terreno-data-fetching/SKILL.md +288 -0
- package/skills/terreno-data-fetching/agents/openai.yaml +4 -0
- package/skills/terreno-data-fetching/references/auth-and-tokens.md +89 -0
- package/skills/terreno-data-fetching/references/realtime.md +50 -0
- package/skills/terreno-data-fetching/references/sdk-customization.md +55 -0
- package/skills/terreno-frontend-tests/SKILL.md +190 -0
- package/skills/terreno-mobile-tests/SKILL.md +127 -0
- package/skills/terreno-test-setup/SKILL.md +81 -0
- package/skills/terreno-test-setup/references/backend.md +131 -0
- package/skills/terreno-test-setup/references/frontend.md +169 -0
- package/skills/terreno-test-setup/references/mobile.md +134 -0
- package/skills/terreno-ui/SKILL.md +252 -0
- package/skills/terreno-ui/agents/openai.yaml +4 -0
- package/skills/terreno-ui/references/data-display.md +87 -0
- package/skills/terreno-ui/references/feedback.md +122 -0
- package/skills/terreno-ui/references/forms.md +119 -0
- package/skills/terreno-ui/references/layout.md +124 -0
- package/skills/terreno-ui/references/theming.md +87 -0
- package/skills/update-docs/SKILL.md +82 -0
- package/skills/upgrading-terreno/SKILL.md +93 -0
- package/skills/upgrading-terreno/references/ordering.md +40 -0
- 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
|