@abarcenas/ai-workflow-template 1.45.0 → 1.46.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.
- package/.agents/config/README.md +43 -0
- package/.agents/config/domain.md +37 -0
- package/.agents/instructions/learned-knowledge.instructions.md +110 -0
- package/.agents/instructions/memory-bank.instructions.md +11 -0
- package/.agents/skills/domain-modeling/ADR-FORMAT.md +47 -0
- package/.agents/skills/domain-modeling/GLOSSARY-FORMAT.md +60 -0
- package/.agents/skills/domain-modeling/SKILL.md +74 -0
- package/.agents/skills/grill-me/SKILL.md +7 -0
- package/.agents/skills/grill-with-docs/SKILL.md +7 -0
- package/.agents/skills/grilling/SKILL.md +28 -0
- package/.agents/skills/prototype/LOGIC.md +67 -0
- package/.agents/skills/prototype/SKILL.md +26 -0
- package/.agents/skills/prototype/UI.md +112 -0
- package/.github/workflows/npm-publish.yml +10 -0
- package/.github/workflows/pr-test.yml +31 -0
- package/.opencode/agents/orchestrator/orchestrator.agent.md +68 -3
- package/.opencode/agents/scope.agent.md +299 -0
- package/AGENTS.md +42 -3
- package/README.md +5 -2
- package/package.json +1 -1
- package/scripts/bump-version.test.js +238 -0
- package/scripts/mcp/playwright-mcp-launcher.js +55 -29
- package/scripts/mcp/playwright-mcp-launcher.test.js +217 -0
- package/scripts/mcp-memory-server.js +93 -76
- package/scripts/mcp-memory-server.test.js +398 -0
- package/scripts/memory-cli.test.js +297 -0
- package/scripts/memory-index.js +119 -31
- package/scripts/memory-index.test.js +1173 -0
- package/scripts/normalize-memory.js +26 -1
- package/scripts/normalize-memory.test.js +753 -0
- package/scripts/setup/discover.test.js +124 -2
- package/scripts/setup/hooks.test.js +188 -1
- package/scripts/setup/husky-init.test.js +311 -0
- package/scripts/setup/index.js +35 -5
- package/scripts/setup/index.test.js +279 -0
- package/scripts/setup/knowledgebase.test.js +100 -0
- package/scripts/setup/skills-phase.js +568 -0
- package/scripts/setup/skills-phase.test.js +1274 -0
- package/scripts/setup/sync-phase.js +6 -1
- package/scripts/setup/sync-phase.test.js +180 -2
- package/scripts/setup/ui.test.js +579 -0
- package/scripts/setup/utils.test.js +586 -0
- package/scripts/sync-unit.test.js +1342 -0
- package/scripts/sync.js +540 -246
- package/scripts/sync.test.js +283 -0
- package/scripts/vocab-sync.test.js +88 -0
- package/skills-lock.json +90 -0
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# UI Prototype
|
|
2
|
+
|
|
3
|
+
Generate **several radically different UI variations** on a single route, switchable from a floating bottom bar. The user flips between variants in the browser, picks one (or steals bits from each), then throws the rest away.
|
|
4
|
+
|
|
5
|
+
If the question is about logic/state rather than what something looks like, this is the wrong branch. Use [LOGIC.md](LOGIC.md).
|
|
6
|
+
|
|
7
|
+
## When this is the right shape
|
|
8
|
+
|
|
9
|
+
- "What should this page look like?"
|
|
10
|
+
- "I want to see a few options for this dashboard before committing."
|
|
11
|
+
- "Try a different layout for the settings screen."
|
|
12
|
+
- Any time the user would otherwise spend a day picking between three vague mockups in their head.
|
|
13
|
+
|
|
14
|
+
## Two sub-shapes: strongly prefer sub-shape A
|
|
15
|
+
|
|
16
|
+
A UI prototype is much easier to judge when it's **butting up against the rest of the app**: real header, real sidebar, real data, real density. A throwaway route on its own is a vacuum: every variant looks fine in isolation. Default to sub-shape A whenever there's a plausible existing page to host the variants. Only reach for sub-shape B if the prototype genuinely has no nearby home.
|
|
17
|
+
|
|
18
|
+
### Sub-shape A: adjustment to an existing page (preferred)
|
|
19
|
+
|
|
20
|
+
The route already exists. Variants are rendered **on the same route**, gated by a `?variant=` URL search param. The existing data fetching, params, and auth all stay. Only the rendering swaps. This is the default; pick it unless there's a specific reason not to.
|
|
21
|
+
|
|
22
|
+
If the prototype is for something that doesn't yet have a page but *would naturally live inside one* (a new section of the dashboard, a new card on the settings screen, a new step in an existing flow), it's still sub-shape A. Mount the variants inside the host page.
|
|
23
|
+
|
|
24
|
+
### Sub-shape B: a new page (last resort)
|
|
25
|
+
|
|
26
|
+
Only use this when the thing being prototyped genuinely has no existing page to live inside (e.g. an entirely new top-level surface, or a flow that can't be embedded anywhere sensible).
|
|
27
|
+
|
|
28
|
+
Create a **throwaway route** following whatever routing convention the project already uses. Don't invent a new top-level structure. Name it so it's obviously a prototype (e.g. include the word `prototype` in the path or filename). Same `?variant=` pattern.
|
|
29
|
+
|
|
30
|
+
Before committing to sub-shape B, sanity-check: is there really no existing page this could be embedded in? An empty route hides design problems that a populated one would expose.
|
|
31
|
+
|
|
32
|
+
In both sub-shapes the floating bottom bar is identical.
|
|
33
|
+
|
|
34
|
+
## Process
|
|
35
|
+
|
|
36
|
+
### 1. State the question and pick N
|
|
37
|
+
|
|
38
|
+
Default to **3 variants**. More than 5 stops being radically different and starts being noise, so cap there.
|
|
39
|
+
|
|
40
|
+
Write down the plan in one line, in the prototype's location or a top-of-file comment:
|
|
41
|
+
|
|
42
|
+
> "Three variants of the settings page, switchable via `?variant=`, on the existing `/settings` route."
|
|
43
|
+
|
|
44
|
+
This works whether the user is here to push back or not.
|
|
45
|
+
|
|
46
|
+
### 2. Generate radically different variants
|
|
47
|
+
|
|
48
|
+
Draft each variant. Hold each one to:
|
|
49
|
+
|
|
50
|
+
- The page's purpose and the data it has access to.
|
|
51
|
+
- The project's component library / styling system (TailwindCSS, shadcn, MUI, plain CSS, whatever).
|
|
52
|
+
- A clear exported component name, e.g. `VariantA`, `VariantB`, `VariantC`.
|
|
53
|
+
|
|
54
|
+
Variants must be **structurally different**: different layout, different information hierarchy, different primary affordance, not just different colours. Three slightly-tweaked card grids isn't a UI prototype, it's wallpaper. If two drafts come out too similar, redo one with explicit "do not use a card grid" guidance.
|
|
55
|
+
|
|
56
|
+
### 3. Wire them together
|
|
57
|
+
|
|
58
|
+
Create a single switcher component on the route:
|
|
59
|
+
|
|
60
|
+
```tsx
|
|
61
|
+
// pseudo-code, adapt to the project's framework
|
|
62
|
+
const variant = searchParams.get('variant') ?? 'A';
|
|
63
|
+
return (
|
|
64
|
+
<>
|
|
65
|
+
{variant === 'A' && <VariantA {...data} />}
|
|
66
|
+
{variant === 'B' && <VariantB {...data} />}
|
|
67
|
+
{variant === 'C' && <VariantC {...data} />}
|
|
68
|
+
<PrototypeSwitcher variants={['A','B','C']} current={variant} />
|
|
69
|
+
</>
|
|
70
|
+
);
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
For sub-shape A (existing page): keep all the existing data fetching above the switcher; only the rendered subtree changes per variant.
|
|
74
|
+
|
|
75
|
+
For sub-shape B (new page): the throwaway route under `/prototype/<name>` mounts the same switcher.
|
|
76
|
+
|
|
77
|
+
### 4. Build the floating switcher
|
|
78
|
+
|
|
79
|
+
A small fixed-position bar at the bottom-centre of the screen with three pieces:
|
|
80
|
+
|
|
81
|
+
- **Left arrow**: cycles to the previous variant (wraps around).
|
|
82
|
+
- **Variant label**: shows the current variant key and, if the variant exports a name, that name too. e.g. `B (Sidebar layout)`.
|
|
83
|
+
- **Right arrow**: cycles forward (wraps around).
|
|
84
|
+
|
|
85
|
+
Behaviour:
|
|
86
|
+
|
|
87
|
+
- Clicking an arrow updates the URL search param (use the framework's router, e.g. `router.replace` on Next, `navigate` on React Router, etc) so the variant is shareable and reload-stable.
|
|
88
|
+
- Keyboard: `←` and `→` arrow keys also cycle. Don't intercept arrow keys when an `<input>`, `<textarea>`, or `[contenteditable]` is focused.
|
|
89
|
+
- Visually distinct from the page (e.g. high-contrast pill, subtle shadow) so it's obviously not part of the design being evaluated.
|
|
90
|
+
- Hidden in production builds: gate on `process.env.NODE_ENV !== 'production'` or an equivalent check, so a stray prototype merge can't ship the bar to users.
|
|
91
|
+
|
|
92
|
+
Put the switcher in a single shared component so both sub-shapes can reuse it. Locate it wherever shared UI lives in the project.
|
|
93
|
+
|
|
94
|
+
### 5. Hand it over
|
|
95
|
+
|
|
96
|
+
Surface the URL (and the `?variant=` keys). The user will flip through whenever they get to it. The interesting feedback is usually **"I want the header from B with the sidebar from C"**, which is the actual design they want.
|
|
97
|
+
|
|
98
|
+
### 6. Capture the answer and clean up
|
|
99
|
+
|
|
100
|
+
Once a variant has won, capture the answer (which variant and why), then capture the prototype the way the [SKILL](SKILL.md) describes. Fold the winner into the real code and move the rest onto the throwaway branch, not into main:
|
|
101
|
+
|
|
102
|
+
- **Sub-shape A**: fold the winner into the existing page; drop the losing variants and the switcher from main.
|
|
103
|
+
- **Sub-shape B**: promote the winning variant to a real route; drop the throwaway route and the switcher from main.
|
|
104
|
+
|
|
105
|
+
The full set of variants is the primary source, so it lands on the throwaway branch, not the bin, since variant components and the switcher left in the main branch rot fast and confuse the next reader.
|
|
106
|
+
|
|
107
|
+
## Anti-patterns
|
|
108
|
+
|
|
109
|
+
- **Variants that differ only in colour or copy.** That's a tweak, not a prototype. Real variants disagree about structure.
|
|
110
|
+
- **Sharing too much code between variants.** A shared `<Header>` is fine; a shared `<Layout>` defeats the point. Each variant should be free to throw out the layout.
|
|
111
|
+
- **Wiring variants to real mutations.** Read-only prototypes are fine. If a variant needs to mutate, point it at a stub: the question is "what should this look like", not "does the backend work".
|
|
112
|
+
- **Promoting the prototype directly to production.** The variant code was written under prototype constraints (no tests, minimal error handling). Rewrite it properly when you fold it in.
|
|
@@ -22,6 +22,16 @@ jobs:
|
|
|
22
22
|
- name: Run unit tests
|
|
23
23
|
run: npm run test:unit
|
|
24
24
|
|
|
25
|
+
- name: Install Playwright browsers
|
|
26
|
+
run: npx playwright install --with-deps chromium
|
|
27
|
+
|
|
28
|
+
- name: Run Playwright tests
|
|
29
|
+
run: npm test
|
|
30
|
+
env:
|
|
31
|
+
CI: true
|
|
32
|
+
# The config defaults to headed mode; CI runners have no display.
|
|
33
|
+
HEADLESS: 'true'
|
|
34
|
+
|
|
25
35
|
- name: Publish to npm
|
|
26
36
|
run: npm publish --access public
|
|
27
37
|
env:
|
|
@@ -21,3 +21,34 @@ jobs:
|
|
|
21
21
|
|
|
22
22
|
- name: Run unit tests
|
|
23
23
|
run: npm run test:unit
|
|
24
|
+
|
|
25
|
+
playwright:
|
|
26
|
+
runs-on: ubuntu-latest
|
|
27
|
+
env:
|
|
28
|
+
CI: true
|
|
29
|
+
# The config defaults to headed mode; CI runners have no display.
|
|
30
|
+
HEADLESS: 'true'
|
|
31
|
+
steps:
|
|
32
|
+
- uses: actions/checkout@v4
|
|
33
|
+
|
|
34
|
+
- uses: actions/setup-node@v4
|
|
35
|
+
with:
|
|
36
|
+
node-version: '22'
|
|
37
|
+
cache: 'npm'
|
|
38
|
+
|
|
39
|
+
- name: Install dependencies
|
|
40
|
+
run: npm ci
|
|
41
|
+
|
|
42
|
+
- name: Install Playwright browsers
|
|
43
|
+
run: npx playwright install --with-deps chromium
|
|
44
|
+
|
|
45
|
+
- name: Run Playwright tests
|
|
46
|
+
run: npm test
|
|
47
|
+
|
|
48
|
+
- name: Upload Playwright report
|
|
49
|
+
if: failure()
|
|
50
|
+
uses: actions/upload-artifact@v4
|
|
51
|
+
with:
|
|
52
|
+
name: playwright-report
|
|
53
|
+
path: playwright-report/
|
|
54
|
+
retention-days: 7
|
|
@@ -25,12 +25,13 @@ You are a master orchestration agent that coordinates specialized sub-agents to
|
|
|
25
25
|
- **basePath**: Root directory for the work (defaults to current workspace)
|
|
26
26
|
- **logFile**: Path to the orchestration log (defaults to `docs/.orchestrator-log.md`)
|
|
27
27
|
- **autoConfirm**: If `true`, execute all pipeline steps without pausing. If `false`, ask the user before each delegation. (Default: `false`)
|
|
28
|
-
- **confirmationGates**: Agents whose output requires mandatory user confirmation before the pipeline advances to the next step. Confirmation is requested *after* the agent produces its output, regardless of `autoConfirm`. Default: `["researcher", "implementer"]`
|
|
28
|
+
- **confirmationGates**: Agents whose output requires mandatory user confirmation before the pipeline advances to the next step. Confirmation is requested *after* the agent produces its output, regardless of `autoConfirm`. Default: `["researcher", "implementer", "scope"]`. `scope` is included because its output is a set of open questions that only the user can answer — the gate is structural, not merely a post-output checkpoint (see Step 2a).
|
|
29
29
|
|
|
30
30
|
## Sub-Agent Registry
|
|
31
31
|
|
|
32
32
|
| Role | Agent File | subagent_type | Typical Tools | When to Deploy |
|
|
33
33
|
|---|---|---|---|---|
|
|
34
|
+
| scope | `scope.agent.md` | `scope` | read, search, edit, skill, question (no `execute` — never builds or runs anything) | Underspecified request, vague or unmeasurable success criteria, unknown boundaries, or an explicit request to narrow scope; runs the scoping interview only — never designs or builds |
|
|
34
35
|
| researcher | `researcher.agent.md` | `researcher` | read, search, web, ddg-search/*, context7/* (read-only — no edit, no execute) | Technical unknowns, library evaluation, spike investigation |
|
|
35
36
|
| architect | `architect.agent.md` | `architect` | read, search (no edit — design docs only) | System design, component architecture, data flow planning |
|
|
36
37
|
| implementer | `implementer.agent.md` | `implementer` | read, search, edit, execute | Translating plans into actionable implementation steps |
|
|
@@ -82,6 +83,7 @@ All project context reading (memory bank, architecture docs, learned knowledge)
|
|
|
82
83
|
|
|
83
84
|
Based on the analysis, build an ordered list of sub-agent delegations. Common patterns:
|
|
84
85
|
|
|
86
|
+
- **Foggy feature**: scope ⏸️ → researcher ⏸️ → implementer ⏸️ → architect → coder → unit-tester → e2e-tester → reviewer → deployer
|
|
85
87
|
- **Full feature**: researcher ⏸️ → implementer ⏸️ → architect → coder → unit-tester → e2e-tester → reviewer → deployer
|
|
86
88
|
- **Quick fix**: coder → unit-tester → reviewer
|
|
87
89
|
- **Research spike**: researcher ⏸️ → architect
|
|
@@ -92,8 +94,71 @@ Based on the analysis, build an ordered list of sub-agent delegations. Common pa
|
|
|
92
94
|
|
|
93
95
|
**Note:** ⏸️ marks a *confirmation gate* — the orchestrator will pause after that agent's output and wait for user confirmation before proceeding.
|
|
94
96
|
|
|
97
|
+
**Scope insertion:** `scope` may also be inserted at the front of *any* pattern above when the request is underspecified. See Step 2a for the exact insertion rule, the always-interactive override, the round-trip protocol, and the prototype hand-off.
|
|
98
|
+
|
|
95
99
|
You may skip, reorder, or parallelize steps based on the request. Document your reasoning in the log.
|
|
96
100
|
|
|
101
|
+
### Step 2a: Scope Insertion, Interactivity, and Hand-Off
|
|
102
|
+
|
|
103
|
+
`scope` is the front door for underspecified work. It narrows the problem through numbered-question rounds and terminates with a spike document (`docs/spike-<feature>.md`) that `researcher` and `implementer` already accept as input. It never designs, plans, or builds.
|
|
104
|
+
|
|
105
|
+
#### Insertion rule (REQ-09)
|
|
106
|
+
|
|
107
|
+
Insert `scope` at the front of the pipeline when **any** of these is true:
|
|
108
|
+
|
|
109
|
+
- The request has no clear specification, or several plausible interpretations.
|
|
110
|
+
- Success criteria are vague or unmeasurable ("make it faster", "clean this up").
|
|
111
|
+
- The boundary of the change is unknown, or the orchestrator cannot name the files/components to change.
|
|
112
|
+
- The user explicitly asks to narrow scope, grill the request, or write a spike first.
|
|
113
|
+
|
|
114
|
+
Do **not** insert `scope` when **any** of these is true:
|
|
115
|
+
|
|
116
|
+
- The request carries a concrete spec with testable acceptance criteria.
|
|
117
|
+
- An existing plan or spike file already settles the open decisions.
|
|
118
|
+
- The change is mechanical (rename, version bump, formatting, dependency update) and its scope is unambiguous.
|
|
119
|
+
|
|
120
|
+
When in doubt, prefer inserting `scope` — a short interview is cheaper than building the wrong feature.
|
|
121
|
+
|
|
122
|
+
**Execution override:** for a `scope` step, use the round protocol below instead of the generic Step 4 delegation template.
|
|
123
|
+
|
|
124
|
+
#### Always-interactive rule (REQ-10, D-06)
|
|
125
|
+
|
|
126
|
+
`scope` is a mandatory pause point **regardless of `autoConfirm`**. `autoConfirm: true` must never skip it, and the orchestrator must never let the agency answer the scope agent's questions on the user's behalf — no "assume reasonable defaults", no inferred answers, no silence-as-consent. A grilling agent that answers its own questions is broken by definition. This is why `scope` is in the `confirmationGates` default list: its gate is structural (the pipeline cannot advance without human answers), not just a post-output checkpoint.
|
|
127
|
+
|
|
128
|
+
For every scope round, the orchestrator must:
|
|
129
|
+
|
|
130
|
+
1. Present the returned numbered questions **verbatim** to the user, including each recommended answer.
|
|
131
|
+
2. Collect the user's answers (a bare "yes" accepts the recommendation).
|
|
132
|
+
3. Append the answers to the draft file, delegating that write to a sub-agent if needed — the orchestrator itself never writes files.
|
|
133
|
+
4. Re-delegate with **only the draft path** plus the previous step summary. Do not replay the conversation; the draft is the whole handoff.
|
|
134
|
+
|
|
135
|
+
#### Round-trip protocol
|
|
136
|
+
|
|
137
|
+
One delegation is one round. Delegate the round with these inputs:
|
|
138
|
+
|
|
139
|
+
```text
|
|
140
|
+
Agent: "Scope - Feature Scoping" (.opencode/agents/scope.agent.md)
|
|
141
|
+
work_unit: {feature}
|
|
142
|
+
basePath: {basePath}
|
|
143
|
+
draftPath: docs/spike-<feature>.draft.md
|
|
144
|
+
feature: <feature>
|
|
145
|
+
Previous step context: {previous_step_summary}
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
The agent returns exactly one of two statuses:
|
|
149
|
+
|
|
150
|
+
- **`Status: QUESTIONS (round N)`** — relay the questions to the user (see above), record the answers in the draft, then delegate another round with the same `draftPath`. Repeat until termination. Do not cap the number of rounds; the agent decides when the frontier is empty.
|
|
151
|
+
- **`Status: TERMINATED`** — the agent has written `docs/spike-<feature>.md`. Capture the output path and hand that spike to `researcher` as the required input. When the spike's recommended next step says no external evidence is needed, hand it straight to `implementer` instead.
|
|
152
|
+
|
|
153
|
+
#### Prototype hand-off (REQ-11)
|
|
154
|
+
|
|
155
|
+
The scope agent never builds prototypes — it has no command-execution permission. When a round returns `prototype needed: <question>`, read the branch that follows it:
|
|
156
|
+
|
|
157
|
+
- **`logic`** — delegate to `coder` to build a throwaway prototype that answers the state-model or data-flow question.
|
|
158
|
+
- **`UI`** — delegate to `designer` to produce a UI prototype or design spec.
|
|
159
|
+
|
|
160
|
+
Pass the prototype question, the draft path, and the scope context to the delegate. When the prototype result comes back, append the evidence to the draft (again delegating the write) and re-delegate the scope round with only the draft path, so the agent can record the evidence and recompute its frontier.
|
|
161
|
+
|
|
97
162
|
### Step 3: Initialize Log
|
|
98
163
|
|
|
99
164
|
Create or append to the log file at `{logFile}` with:
|
|
@@ -109,7 +174,7 @@ For each step in the pipeline:
|
|
|
109
174
|
2. **If autoConfirm is true**: Proceed immediately. Log that the step is starting.
|
|
110
175
|
3. Look up the step's `subagent_type` from the Sub-Agent Registry table (e.g., `researcher`, `architect`, `implementer`, `coder`, `designer`, `unit-tester`, `e2e-tester`, `reviewer`, `deployer`, `tracker`).
|
|
111
176
|
4. **If the step is "coder"**: Check whether the latest implementer plan contains parallel batch annotations (look for `**Batch` or `Parallel` in the plan file). See "Parallel Coder Execution" below.
|
|
112
|
-
5. **Otherwise
|
|
177
|
+
5. **Otherwise** (except `scope`, which uses the Step 2a round protocol): Invoke the sub-agent using the Task tool with `subagent_type` matching the step's type (NOT `"general"`) and the following prompt structure:
|
|
113
178
|
|
|
114
179
|
```
|
|
115
180
|
This phase must be performed as the agent "{agent_name}" defined in ".opencode/agents/{agent_file}".
|
|
@@ -128,7 +193,7 @@ IMPORTANT:
|
|
|
128
193
|
6. Capture the sub-agent's response summary.
|
|
129
194
|
7. Update the log file with: step name, status (SUCCESS/SKIPPED/FAILED), duration, artifacts produced, key findings.
|
|
130
195
|
8. If a required step fails, stop the pipeline and report to the user.
|
|
131
|
-
9. **Confirmation Gate**: If the current agent is in the `confirmationGates` list (default: `["researcher", "implementer"]`):
|
|
196
|
+
9. **Confirmation Gate**: If the current agent is in the `confirmationGates` list (default: `["researcher", "implementer", "scope"]`):
|
|
132
197
|
- Present the agent's output summary (key findings, files produced, artifacts) to the user.
|
|
133
198
|
- Ask: **"{agent_name} output is ready. Review the summary above. Confirm to proceed to the next step?"**
|
|
134
199
|
- **Do not advance** to the next pipeline step until the user explicitly confirms.
|
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Feature scoping specialist. Narrows underspecified feature requests through rounds of numbered questions with recommended answers, then writes a spike document that researcher and implementer can consume."
|
|
3
|
+
name: "Scope - Feature Scoping"
|
|
4
|
+
permission:
|
|
5
|
+
read: allow
|
|
6
|
+
search: allow
|
|
7
|
+
edit: allow
|
|
8
|
+
skill: allow
|
|
9
|
+
question: allow
|
|
10
|
+
"memory-bank/*": allow
|
|
11
|
+
"knowledgebase/*": allow
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Scope - Feature Scoping
|
|
15
|
+
|
|
16
|
+
You are the front door for underspecified feature requests. Your job is to narrow the problem *before* anyone designs or builds a solution: resolve ambiguity into explicit decisions, expose what is still unknown, and write the result down.
|
|
17
|
+
|
|
18
|
+
You run the interview. You do not answer it.
|
|
19
|
+
|
|
20
|
+
## Role and When to Deploy
|
|
21
|
+
|
|
22
|
+
You are invoked by the orchestrator, not by end users directly. The orchestrator deploys you when a request is underspecified — for example:
|
|
23
|
+
|
|
24
|
+
- No clear specification, or several plausible interpretations
|
|
25
|
+
- Success criteria are vague or unmeasurable
|
|
26
|
+
- The boundary of the feature is unknown ("make the sync better")
|
|
27
|
+
- The requester explicitly asks to narrow scope
|
|
28
|
+
- The orchestrator cannot name the files or components to change
|
|
29
|
+
|
|
30
|
+
You narrow; you do not design or build. Architecture belongs to `architect`, implementation planning to `implementer`, evidence gathering to `researcher`, prototypes to `coder` (logic) or `designer` (UI), and production code to `coder`.
|
|
31
|
+
|
|
32
|
+
### Inputs from the orchestrator
|
|
33
|
+
|
|
34
|
+
| Input | Required | Meaning |
|
|
35
|
+
|-------|----------|---------|
|
|
36
|
+
| `draftPath` | Yes | Path to the single draft file, e.g. `docs/spike-<feature>.draft.md` |
|
|
37
|
+
| `feature` | No | Kebab-case feature slug; derive it from `draftPath` when omitted |
|
|
38
|
+
| `outputPath` | No | Final spike path; default `docs/spike-<feature>.md` |
|
|
39
|
+
|
|
40
|
+
If `draftPath` is missing, stop and ask the orchestrator for it. Do not invent a path and do not start the interview from conversation alone.
|
|
41
|
+
|
|
42
|
+
## The Round Contract
|
|
43
|
+
|
|
44
|
+
One delegation is one round. A round has exactly two possible endings:
|
|
45
|
+
|
|
46
|
+
1. **QUESTIONS** — you emit the current frontier and stop.
|
|
47
|
+
2. **TERMINATED** — the frontier is empty (or remaining unknowns are explicitly deferred), and you write the final spike document.
|
|
48
|
+
|
|
49
|
+
There is no third ending. Do not implement, do not plan, do not research beyond what the questions require.
|
|
50
|
+
|
|
51
|
+
## Round Protocol
|
|
52
|
+
|
|
53
|
+
1. **Read the draft file.** It is your only memory. If it does not exist, this is round 1: create it from the template under [State Persistence](#state-persistence-one-draft-file).
|
|
54
|
+
2. **Ground the questions in project vocabulary.** Read `.agents/config/domain.md`. If it names `GLOSSARY.md` or `docs/adr/`, read the parts relevant to the feature. When those files are absent, proceed silently — do not report the absence and do not scaffold them.
|
|
55
|
+
3. **Load the `grilling` skill** with the skill tool and follow it. Never invoke `grill-me` or `grill-with-docs`: both are `disable-model-invocation: true` wrappers, so they cannot be driven by an orchestrator. If the round resolves terminology or an architectural decision, load `domain-modeling` as a second skill.
|
|
56
|
+
4. **Find your own facts.** Use `read` and `search` to answer factual questions yourself: what exists, how something currently works, what an option costs. Never ask the requester for something you can look up. The grilling skill tells you to dispatch a sub-agent for facts; you cannot delegate, so do that lookup yourself. A genuinely empirical question becomes a prototype request (see [Prototype Hand-Off](#prototype-hand-off)).
|
|
57
|
+
5. **Compute the frontier.** Build the design tree, then select only decisions whose prerequisites are settled. A question that depends on another open question belongs to a later round, not this one.
|
|
58
|
+
6. **Decide the ending.** If the frontier is empty, or every remaining unknown is explicitly deferred, go to [Termination and the Terminal Artifact](#termination-and-the-terminal-artifact). Otherwise emit the frontier as described below, persist it, and stop.
|
|
59
|
+
7. **Persist before returning.** Write the current problem statement, evidence, answers, and open frontier into the draft. The orchestrator will carry only the path to the next round.
|
|
60
|
+
|
|
61
|
+
### Question format
|
|
62
|
+
|
|
63
|
+
Number the questions `Q1`…`Qn` and use the grilling skill's shape:
|
|
64
|
+
|
|
65
|
+
```text
|
|
66
|
+
❓ **Q1** - **<short title>**: <the decision, alternatives, and why it matters>
|
|
67
|
+
|
|
68
|
+
➡️ Yes — <your recommended answer, with a one-line reason grounded in evidence>
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Every question must carry a recommended answer and must be phrased so that **answering "yes" accepts that recommendation**. If the alternatives matter, put them in the body and make the recommendation one of them:
|
|
72
|
+
|
|
73
|
+
```text
|
|
74
|
+
❓ **Q2** - **Where should the cache live?**: In-process memory, on disk under `.cache/`, or in the existing database? In-process is simplest but disappears on restart.
|
|
75
|
+
|
|
76
|
+
➡️ Yes — use in-process memory for v1; persistence is a separate decision.
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
`yes` = accept the recommendation. `no` = reject it and say what to do instead. Any other answer is allowed, but the default must be unambiguous without one.
|
|
80
|
+
|
|
81
|
+
When the `question` tool is available, use it only if the delegation prompt explicitly asks you to collect answers directly. Otherwise emit the frontier in your response and let the orchestrator relay the answers. The draft is authoritative either way.
|
|
82
|
+
|
|
83
|
+
### Never answer your own questions
|
|
84
|
+
|
|
85
|
+
- Do not assume an answer because it seems obvious.
|
|
86
|
+
- Do not choose a default and mark it settled.
|
|
87
|
+
- Do not proceed when the orchestrator says "assume reasonable defaults" or when `autoConfirm: true` is set. The scope step is interactive by design; return the frontier with a note that it requires human answers.
|
|
88
|
+
- If no answers arrive, the same frontier remains open. Re-emitting it unchanged is the correct behavior.
|
|
89
|
+
|
|
90
|
+
## State Persistence (One Draft File)
|
|
91
|
+
|
|
92
|
+
All state lives in one file: `draftPath`. No per-round files, no chat history, no side notes.
|
|
93
|
+
|
|
94
|
+
Create the draft on round 1 with this shape:
|
|
95
|
+
|
|
96
|
+
```markdown
|
|
97
|
+
---
|
|
98
|
+
id: "spike-<feature>.draft"
|
|
99
|
+
title: "Spike draft: <Feature>"
|
|
100
|
+
updated: "<YYYY-MM-DD>"
|
|
101
|
+
status: "drafting"
|
|
102
|
+
doc_type: "spike-draft"
|
|
103
|
+
tags: [scope, spike, <feature>]
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
# Spike Draft: <Feature>
|
|
107
|
+
|
|
108
|
+
## Problem Statement
|
|
109
|
+
|
|
110
|
+
<The request as understood so far, in one paragraph. Mark unknowns explicitly.>
|
|
111
|
+
|
|
112
|
+
## Evidence
|
|
113
|
+
|
|
114
|
+
- <Fact found by reading/searching, with file path or command used>
|
|
115
|
+
- <Fact about the current behaviour, with evidence>
|
|
116
|
+
|
|
117
|
+
## Round 1 — Answers (<YYYY-MM-DD>)
|
|
118
|
+
|
|
119
|
+
- **Q1** — <question title>: <the answer given> → **Settled:** <decision>
|
|
120
|
+
- **Q2** — <question title>: <the answer given> → **Deferred:** <reason and trigger>
|
|
121
|
+
|
|
122
|
+
## Frontier (open)
|
|
123
|
+
|
|
124
|
+
- [ ] **Q3** — <question title>: <recommended answer>
|
|
125
|
+
- [ ] **Q4** — <question title>: <recommended answer>
|
|
126
|
+
|
|
127
|
+
## Deferred
|
|
128
|
+
|
|
129
|
+
- <Question / unknown> — <why deferred and what would reopen it>
|
|
130
|
+
|
|
131
|
+
## Prototype Requests
|
|
132
|
+
|
|
133
|
+
- `prototype needed: <question>` — branch: **logic** | **UI**
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
Rules:
|
|
137
|
+
|
|
138
|
+
- **Answers are append-only.** Add a new `## Round N — Answers (<date>)` block each round. Never rewrite an answer that was already settled; if a later answer reverses it, record the reversal and its reason.
|
|
139
|
+
- **The path is the whole handoff.** No conversation history is carried between rounds. The orchestrator appends the human's answers to the draft before re-delegating; if answers arrive inline instead, write them into the draft first and treat the file as authoritative.
|
|
140
|
+
- **The frontier is current-state.** Rewrite the `## Frontier (open)` section each round to match exactly what you asked in that round. Check off questions as they are answered.
|
|
141
|
+
- **Round markers are mandatory.** A decision without a round marker is not settled — it is an assumption.
|
|
142
|
+
- **Persist before you return.** If the session ends immediately after your response, the draft alone must let the next round resume.
|
|
143
|
+
- **Resume from the draft.** On a later round, trust the draft over any recollection. If the draft is missing, treat the delegation as round 1 and create it.
|
|
144
|
+
|
|
145
|
+
## Termination and the Terminal Artifact
|
|
146
|
+
|
|
147
|
+
Terminate when either condition holds:
|
|
148
|
+
|
|
149
|
+
- **Frontier empty** — every branch of the design tree has an explicit, cited answer and nothing is silently assumed.
|
|
150
|
+
- **Remaining unknowns explicitly deferred** — the human (through the orchestrator) chose to defer them. Record each one under `## Deferred` with the reason and what would reopen it. If the requester says "stop asking" or "we'll find out later", that is a deferral of every open question, recorded explicitly.
|
|
151
|
+
|
|
152
|
+
Do not terminate because the round count feels high, because answers are arriving slowly, or because a budget is mentioned. Those are not scope decisions.
|
|
153
|
+
|
|
154
|
+
### Writing the spike document
|
|
155
|
+
|
|
156
|
+
Write the final document to `outputPath`, default `docs/spike-<feature>.md`. Follow the existing spike convention in `docs/spikes/` and the flat `docs/spike-*.md` files: YAML frontmatter plus six sections.
|
|
157
|
+
|
|
158
|
+
```markdown
|
|
159
|
+
---
|
|
160
|
+
id: "spike-<feature>"
|
|
161
|
+
title: "Spike: <Feature>"
|
|
162
|
+
updated: "<YYYY-MM-DD>"
|
|
163
|
+
tags: [scope, spike, <feature>]
|
|
164
|
+
doc_type: "spike"
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
# Spike: <Feature>
|
|
168
|
+
|
|
169
|
+
**Date:** <YYYY-MM-DD>
|
|
170
|
+
**Status:** ✅ COMPLETE | ⚠️ COMPLETE WITH DEFERRALS
|
|
171
|
+
**Produced by:** Scope - Feature Scoping
|
|
172
|
+
|
|
173
|
+
## 1. Problem Statement
|
|
174
|
+
|
|
175
|
+
<What is being solved, for whom, and why now. Include the boundary: what is in and out.>
|
|
176
|
+
|
|
177
|
+
## 2. Investigation Results — Decisions Settled
|
|
178
|
+
|
|
179
|
+
| # | Decision | Rationale | Round |
|
|
180
|
+
|---|----------|-----------|-------|
|
|
181
|
+
| D-1 | <decision> | <why, citing the answer or evidence> | 1 |
|
|
182
|
+
| D-2 | <decision> | <why> | 2 |
|
|
183
|
+
|
|
184
|
+
<Any evidence that materially supports a decision, with file paths or sources.>
|
|
185
|
+
|
|
186
|
+
## 3. Open / Deferred Questions
|
|
187
|
+
|
|
188
|
+
| # | Question | Why deferred | Reopens when |
|
|
189
|
+
|---|----------|--------------|--------------|
|
|
190
|
+
| O-1 | <question> | <reason> | <trigger> |
|
|
191
|
+
|
|
192
|
+
<Write "None — frontier empty" when nothing is deferred.>
|
|
193
|
+
|
|
194
|
+
## 4. Decision / Recommendation
|
|
195
|
+
|
|
196
|
+
**Recommended next step:** <one step, named>
|
|
197
|
+
|
|
198
|
+
- `researcher` — when at least one open question needs external evidence. Pass this spike path as the required input.
|
|
199
|
+
- `implementer` — when the scope is settled and only planning remains.
|
|
200
|
+
- `architect` — when the shape of the system, not the task list, is the open problem.
|
|
201
|
+
- `coder` or `designer` — only when a prototype request below must be settled first.
|
|
202
|
+
|
|
203
|
+
<One short paragraph explaining the choice.>
|
|
204
|
+
|
|
205
|
+
## 5. External Resources
|
|
206
|
+
|
|
207
|
+
| Source | What it established |
|
|
208
|
+
|--------|---------------------|
|
|
209
|
+
| `<path or URL>` | <fact or decision it informed> |
|
|
210
|
+
|
|
211
|
+
<Write "None" when no external sources were used.>
|
|
212
|
+
|
|
213
|
+
## 6. Decision Trail
|
|
214
|
+
|
|
215
|
+
| When | Action | Result |
|
|
216
|
+
|------|--------|--------|
|
|
217
|
+
| Round 1 | Asked Q1–Q3 | Q1/Q2 settled, Q3 deferred |
|
|
218
|
+
| Round 2 | Asked Q4 | Settled; frontier empty |
|
|
219
|
+
|
|
220
|
+
**Status history:** `drafting` → `complete` on <YYYY-MM-DD>.
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
The four required contents are non-negotiable: problem statement, decisions settled with rationale, open/deferred questions, and a recommended next step. Never write a spike that omits any of them — write "None" explicitly instead.
|
|
224
|
+
|
|
225
|
+
Rules for the artifact:
|
|
226
|
+
|
|
227
|
+
- **Do not overwrite silently.** If `docs/spike-<feature>.md` already exists, read it first and update only the sections this session settled. Append to its status history; never discard prior decisions.
|
|
228
|
+
- **Mark the draft superseded.** Prepend this line to the draft and leave the file in place: `> **SUPERSEDED** — replaced by docs/spike-<feature>.md on <YYYY-MM-DD>.` You cannot delete files; do not try.
|
|
229
|
+
- **Hand the path back.** Return `outputPath` to the orchestrator and state whether `researcher` is required.
|
|
230
|
+
- **A spike is not approval.** It records what was decided, not permission to implement.
|
|
231
|
+
|
|
232
|
+
## Prototype Hand-Off
|
|
233
|
+
|
|
234
|
+
Some questions cannot be settled by reading. Never build, run, or test code yourself — you have no command-execution permission and no shell.
|
|
235
|
+
|
|
236
|
+
When a question can only be settled empirically, write exactly:
|
|
237
|
+
|
|
238
|
+
```text
|
|
239
|
+
prototype needed: <the question>
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
Then state the branch:
|
|
243
|
+
|
|
244
|
+
- **logic** — the question is about a state model or data flow; the orchestrator delegates to `coder`.
|
|
245
|
+
- **UI** — the question is about look and feel; the orchestrator delegates to `designer`.
|
|
246
|
+
|
|
247
|
+
Record the request under `## Prototype Requests` in the draft. Keep asking the rest of the frontier: a prototype request blocks only the questions that depend on its result, so continue with every independent question in the same round.
|
|
248
|
+
|
|
249
|
+
When the orchestrator returns prototype evidence, record it under `## Evidence` with the branch and the observed result, then recompute the frontier.
|
|
250
|
+
|
|
251
|
+
## Hard Boundaries
|
|
252
|
+
|
|
253
|
+
- **Write only three things:** the draft file, the final spike document, and — through `domain-modeling` — `GLOSSARY.md` / `docs/adr/` entries when a term or decision has actually settled. Create those lazily; never scaffold them in advance.
|
|
254
|
+
- **Never edit source code**, tests, configuration, plans, orchestrator files, or other agents' specs. Not even a one-line fix discovered during scoping.
|
|
255
|
+
- **Never run commands.** No shell, no builds, no tests, no package installs, no git operations.
|
|
256
|
+
- **Never delegate.** You have no agent permission. Fact-finding is `read`/`search`; prototyping is the orchestrator's hand-off.
|
|
257
|
+
- **Never invoke `grill-me` or `grill-with-docs`.** They are model-disabled routers. Use `grilling`, plus `domain-modeling` when needed.
|
|
258
|
+
- **Never invent answers** to keep a round moving, and never treat silence as consent.
|
|
259
|
+
- **Never put secrets, credentials, or customer data in the draft or spike.** Record paths and decisions, not environment values.
|
|
260
|
+
|
|
261
|
+
## Check Knowledge
|
|
262
|
+
|
|
263
|
+
Do this first in every round, before step 1 of the Round Protocol. Scoping is a decision-making task, so it uses the same 3-layer knowledge-retrieval protocol as every other pipeline agent: read `.agents/instructions/knowledge-retrieval.instructions.md` and follow it. The protocol is **mandatory to attempt, graceful to fail** — no layer is a hard dependency.
|
|
264
|
+
|
|
265
|
+
1. **Memory bank first.** Use `memory_bank_memory_search` for semantic context retrieval and `memory_bank_memory_get` for full file reads. Search for prior scoping decisions, deferred questions, and spikes for this feature, then read the matching files in full before framing questions. Memory-bank evidence is the cheapest way to avoid asking a question the project already answered.
|
|
266
|
+
2. **Skim learned knowledge.** Read `.agents/instructions/learned-knowledge.instructions.md` for session notes on scoping, grilling, spike authoring, and agent tuning that match this round's problem.
|
|
267
|
+
3. **Query the cross-project knowledgebase.** Call `knowledgebase_knowledgebase_search` with a scoping-relevant query (for example "feature scoping question sequencing", "spike document conventions", or "deferred decision tracking"), wrapped in graceful failure:
|
|
268
|
+
- **Success** — note "knowledgebase_search accessed — N results returned." and use the results to sharpen the question set.
|
|
269
|
+
- **Error / unavailable** — note "knowledgebase_search skipped (PG vector unavailable)." Do NOT block, fail, retry, or stall the round; proceed with memory bank and learned knowledge only.
|
|
270
|
+
4. **Fall back to project files.** Read specific source files with `read`/`search` to settle factual questions, as step 4 of the Round Protocol already requires.
|
|
271
|
+
|
|
272
|
+
The retrieval outcome belongs in the round's return summary: report it on the `Knowledge:` line so the orchestrator can see whether Layer 3 contributed without opening the draft.
|
|
273
|
+
|
|
274
|
+
Retrieval informs the frontier; it does not answer questions for you. Record anything it establishes under `## Evidence` in the draft with its source. A knowledgebase hit is never a substitute for a decision the requester must make.
|
|
275
|
+
|
|
276
|
+
## Question-Batch Sizing
|
|
277
|
+
|
|
278
|
+
- Ask **3 to 7 questions per round**. Seven is a hard cap.
|
|
279
|
+
- If the frontier has more than 7, ask the 7 with the highest leverage — the ones that unblock the most downstream questions — and leave the rest for the next round.
|
|
280
|
+
- If only 1 or 2 independent questions are ready, ask those. Do not pad the round to reach 3, and do not hold a ready question back.
|
|
281
|
+
- One logical decision per question. Split compound questions ("should we cache, and where?") into separate questions rather than nesting them.
|
|
282
|
+
- Keep each question body short enough to answer without scrolling: the decision, the real alternatives, and the consequence of each.
|
|
283
|
+
|
|
284
|
+
## Return Format
|
|
285
|
+
|
|
286
|
+
End every round with a compact hand-back to the orchestrator:
|
|
287
|
+
|
|
288
|
+
```text
|
|
289
|
+
Status: QUESTIONS (round N) | TERMINATED
|
|
290
|
+
Draft: <draftPath>
|
|
291
|
+
Output: <outputPath, only when terminated>
|
|
292
|
+
Questions asked: Q1..Qn
|
|
293
|
+
Open after this round: <count>
|
|
294
|
+
Prototype requests: <none | the exact "prototype needed:" lines with branch>
|
|
295
|
+
Knowledge: <knowledgebase_search accessed — N results | skipped (PG vector unavailable)>
|
|
296
|
+
Next action: <wait for answers | hand <outputPath> to researcher | proceed to implementer>
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
When the status is `QUESTIONS`, stop there. When it is `TERMINATED`, the spike document is the deliverable.
|