@jabworks/condux 0.24.1 → 0.25.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/package.json +1 -1
- package/skills/discovery/SKILL.md +74 -7
- package/skills/discovery/evals/trigger_eval.json +4 -0
- package/skills/discovery/references/design-template.md +12 -0
- package/skills/discovery/references/spec-integration.md +8 -3
- package/skills/preflight/SKILL.md +1 -0
- package/skills/technical-spec/SKILL.md +18 -5
- package/skills/technical-spec/evals/trigger_eval.json +3 -0
- package/skills/technical-spec/references/templates.md +68 -0
- package/skills/workflow/SKILL.md +2 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jabworks/condux",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.25.0",
|
|
4
4
|
"description": "OpenCode plugin for the condux workflow toolkit — bundles the condux skills and injects the specialist agents (coder, explorer, planner, researcher) plus an opt-in plan-review listener.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"publishConfig": {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: discovery
|
|
3
|
-
description: "Refine a rough idea into a signed-off design, presented in sections for sign-off before any planning or code begins.
|
|
3
|
+
description: "Refine a rough idea into a signed-off design, presented in sections for sign-off before any planning or code begins. Opens with the requirements — the feature PRD — and feeds the tech spec, written via technical-spec at sign-off. Trigger for LARGE tasks, when scope is unclear, or when the user wants to brainstorm or explore a rough idea — or to pin requirements first: \"write a PRD\", \"product requirements\", \"what are we building and why\". Also when resuming an existing design or design doc — the existing-design check offers resume-or-fresh. A soft gate before /draft-plan: if discovery has not run, ask whether to skip it consciously."
|
|
4
4
|
argument-hint: "<rough idea or feature description>"
|
|
5
5
|
effort: high
|
|
6
6
|
---
|
|
@@ -31,6 +31,13 @@ exists, read its frontmatter `status` and offer accordingly:
|
|
|
31
31
|
|
|
32
32
|
Accept either answer, same as any other soft gate in this skill.
|
|
33
33
|
|
|
34
|
+
**Requirements on disk.** The same two-scope lookup finds
|
|
35
|
+
`specs/<slug>/prd.md`. When it exists, read it before Step 1 and say so —
|
|
36
|
+
"Requirements loaded from `<path>`" — then treat its sections as already
|
|
37
|
+
answered: the goal round asks only for the ones that are empty (The
|
|
38
|
+
Requirements Card, below). A spec with no `prd.md` is the normal case, not a
|
|
39
|
+
gap — say nothing.
|
|
40
|
+
|
|
34
41
|
```
|
|
35
42
|
┌──────────────────────────────────────────────────────────────────┐
|
|
36
43
|
│ DISCOVERY │
|
|
@@ -42,6 +49,9 @@ Accept either answer, same as any other soft gate in this skill.
|
|
|
42
49
|
│ - Is the request already well-defined (ticket, spec doc)? │
|
|
43
50
|
│ → Ask: "This looks well-defined. Skip discovery and │
|
|
44
51
|
│ go straight to planning?" │
|
|
52
|
+
│ → If discovery goes ahead: a PRD, ticket or product doc │
|
|
53
|
+
│ they brought is requirements, not a design — it feeds │
|
|
54
|
+
│ §0 (below); it never stands in for the design │
|
|
45
55
|
│ - Is the scope genuinely unclear? │
|
|
46
56
|
│ → Proceed to Step 2 │
|
|
47
57
|
│ │
|
|
@@ -50,10 +60,15 @@ Accept either answer, same as any other soft gate in this skill.
|
|
|
50
60
|
│ Focus on: goals, constraints, what "done" looks like, │
|
|
51
61
|
│ known unknowns, and what should explicitly NOT be built. │
|
|
52
62
|
│ No implementation detail yet — that's Step 4's job. │
|
|
63
|
+
│ The batch covers the six PRD sections — problem, users, │
|
|
64
|
+
│ goals and non-goals, success metrics, scope, open │
|
|
65
|
+
│ questions — skipping any a loaded PRD already answers. │
|
|
53
66
|
│ │
|
|
54
67
|
│ Step 3: PROPOSE │
|
|
55
68
|
│ Announce the section list, then create the design file │
|
|
56
69
|
│ (status: in-progress) and open the live preview. │
|
|
70
|
+
│ First card is §0 · requirements — the goal round in │
|
|
71
|
+
│ prd.md's six headings (The Requirements Card, below). │
|
|
57
72
|
│ Present one section at a time in the card shape, get │
|
|
58
73
|
│ acknowledgment, append the agreed section to the file. │
|
|
59
74
|
│ §1 is approaches-and-tradeoffs; the rest follow the design. │
|
|
@@ -82,6 +97,8 @@ Accept either answer, same as any other soft gate in this skill.
|
|
|
82
97
|
│ ✓ No subsystems that should be separate tasks │
|
|
83
98
|
│ ✓ Every contract, mapping, or edge case named in the │
|
|
84
99
|
│ design has a home in a spec concern file │
|
|
100
|
+
│ ✓ §0 invents nothing — an unanswered PRD section is an │
|
|
101
|
+
│ open question, never a filled-in guess │
|
|
85
102
|
│ ✓ Unanswered detail questions surface as open questions, │
|
|
86
103
|
│ never silently dropped │
|
|
87
104
|
│ │
|
|
@@ -94,8 +111,9 @@ Accept either answer, same as any other soft gate in this skill.
|
|
|
94
111
|
│ every agreed section is in it. Flip its frontmatter │
|
|
95
112
|
│ status: in-progress → signed-off. That flip is what │
|
|
96
113
|
│ /draft-plan's gate check reads. │
|
|
97
|
-
│ Spec write-back is default-on: persist the concern files
|
|
98
|
-
│
|
|
114
|
+
│ Spec write-back is default-on: persist the concern files — │
|
|
115
|
+
│ prd.md from §0, then the rest (Spec Integration below) — │
|
|
116
|
+
│ unless the user opts out. │
|
|
99
117
|
│ The preview is already running — reuse it (Design Review │
|
|
100
118
|
│ Loop); never launch a second server or open a second tab. │
|
|
101
119
|
└──────────────────────────────────────────────────────────────────┘
|
|
@@ -160,6 +178,8 @@ Accept either answer. Never block. Never lecture.
|
|
|
160
178
|
✗ Proceeding to planning without explicit sign-off
|
|
161
179
|
✗ Treating a well-defined ticket as needing full discovery
|
|
162
180
|
✗ Widening past the named target surface without saying so
|
|
181
|
+
✗ Inventing users, metrics, or scope to complete §0
|
|
182
|
+
✗ Writing prd.md before sign-off
|
|
163
183
|
✗ A section card that runs past one screen, or a paragraph past three lines
|
|
164
184
|
✗ Launching a second preview server, or opening a tab the user didn't ask for
|
|
165
185
|
```
|
|
@@ -211,6 +231,51 @@ the path as the label, and nothing degrades without a server. Never write a
|
|
|
211
231
|
git-root-relative href (it cannot resolve against the served root), and
|
|
212
232
|
never inline a copy of the diagram beside the artifact.
|
|
213
233
|
|
|
234
|
+
## The Requirements Card (§0)
|
|
235
|
+
|
|
236
|
+
The goal round has always collected requirements — goals, what done looks
|
|
237
|
+
like, what not to build — and then compressed them into a three-line why-line,
|
|
238
|
+
where they were lost. §0 keeps them. It is the first card of Step 3, presented
|
|
239
|
+
once for acknowledgment before §1, and it is the feature's PRD in draft.
|
|
240
|
+
|
|
241
|
+
**Shape.** §0 uses `prd.md`'s six headings verbatim — *Problem · Users · Goals
|
|
242
|
+
and non-goals · Success metrics · Scope · Open questions* — each a table or a
|
|
243
|
+
short list (technical-spec's `references/templates.md` has the template). Same
|
|
244
|
+
one-screen rule as any card; overflow goes in the design file.
|
|
245
|
+
|
|
246
|
+
**§0 sits outside the count.** The section list announced before §1 names the
|
|
247
|
+
*design* sections — "4 sections: approach · …" — and cards stay `§n of N`
|
|
248
|
+
against that N. Announce §0 separately, first: *"Requirements first (§0), then
|
|
249
|
+
4 sections: …"*.
|
|
250
|
+
|
|
251
|
+
**Three ways in, one card out:**
|
|
252
|
+
|
|
253
|
+
| Arriving with | What §0 is built from |
|
|
254
|
+
|---|---|
|
|
255
|
+
| nothing | the goal round — one batch, six slots |
|
|
256
|
+
| `specs/<slug>/prd.md` on disk | that file; ask only for empty sections |
|
|
257
|
+
| a ticket, product doc, or pasted PRD | that document, mapped onto the six headings, gaps marked |
|
|
258
|
+
|
|
259
|
+
**Rules underneath it:**
|
|
260
|
+
|
|
261
|
+
| Rule | Why |
|
|
262
|
+
|---|---|
|
|
263
|
+
| An unanswered section is asked once, then written under *Open questions* — never filled in | a six-slot shape creates pressure to complete it; invented users and metrics read as facts forever after |
|
|
264
|
+
| Content from the user's document that fits no heading goes under *Open questions*, in its original wording | losing what they wrote to fit the shape is worse than an untidy list |
|
|
265
|
+
| A later design section that changes scope, goals, or users updates §0 visibly, and names the change | `prd.md` and `decisions.md` describe one feature; preflight's drift check reads both |
|
|
266
|
+
| `prd.md` is written at Step 7, never at §0 | a PRD in `specs/` for a discovery nobody signed off is a durable file making unsigned claims |
|
|
267
|
+
| The design's why-line is derived from §0's *Problem* | one fact, one home — never a second copy that can disagree |
|
|
268
|
+
|
|
269
|
+
A request for *only* the requirements — "write a PRD for X", no design wanted
|
|
270
|
+
yet — still runs Steps 1–3 as far as §0, then asks: carry on into the design,
|
|
271
|
+
or sign off here and save the PRD alone? Saving it alone is the Step 7 spec
|
|
272
|
+
write-back with `prd.md` as the only concern file — and **the design file
|
|
273
|
+
keeps `status: in-progress`**. A PRD is not a design: no approach was agreed,
|
|
274
|
+
so `/draft-plan`'s gate must still ask, and flipping the status here would let
|
|
275
|
+
it plan against a file with requirements and no design in it. A later
|
|
276
|
+
discovery on the same feature finds the file and the `prd.md`, and resumes
|
|
277
|
+
from §0.
|
|
278
|
+
|
|
214
279
|
## The Design File and the Live Preview (Step 3 onward)
|
|
215
280
|
|
|
216
281
|
**The file is created at §1, not at sign-off.** Write
|
|
@@ -275,8 +340,9 @@ A short design summary covering:
|
|
|
275
340
|
- Key constraints and out-of-scope items
|
|
276
341
|
- Open questions (if any remain after sign-off)
|
|
277
342
|
|
|
278
|
-
|
|
279
|
-
|
|
343
|
+
Requirements live in §0 and become `prd.md`; detail-round answers (Step 4)
|
|
344
|
+
belong in the other spec concern files, not the summary — the summary stays
|
|
345
|
+
short; the spec carries the detail.
|
|
280
346
|
|
|
281
347
|
Lives at: `.condux/designs/YYYY-MM-DD-<feature>.md`, created at §1 and
|
|
282
348
|
appended to per section, in the shape of `references/design-template.md`
|
|
@@ -334,8 +400,9 @@ the launch here.
|
|
|
334
400
|
Integrates with `technical-spec` to persist the design and render it live while
|
|
335
401
|
discovery runs. At sign-off (Step 7), unless the user opts out: run
|
|
336
402
|
`technical-spec`'s scaffold script to create the spec directory, write the
|
|
337
|
-
design's decisions/contracts/mappings/edge-cases into its concern
|
|
338
|
-
(`
|
|
403
|
+
design's requirements/decisions/contracts/mappings/edge-cases into its concern
|
|
404
|
+
files (`prd.md` from §0, then `decisions.md`, `api.md`, `fields.md`,
|
|
405
|
+
`quirks.md`, `implementation.md`), then
|
|
339
406
|
launch `plan-review`'s directory-mode preview against that spec path so it
|
|
340
407
|
live-reloads as the conversation refines the design. Full commands, the
|
|
341
408
|
existing-spec check, and how to action a submitted review decision:
|
|
@@ -19,6 +19,10 @@
|
|
|
19
19
|
{ "query": "review the plan in the browser", "should_trigger": true, "expected_skill": "plan-review" },
|
|
20
20
|
{ "query": "save what we decided as a spec", "should_trigger": true, "expected_skill": "technical-spec" },
|
|
21
21
|
{ "query": "why does checkout 500 on submit", "should_trigger": true, "expected_skill": "root-cause-analysis" },
|
|
22
|
+
{ "query": "write a PRD for the notifications feature", "should_trigger": true, "expected_skill": "discovery", "accept": ["workflow"] },
|
|
23
|
+
{ "query": "what are we building and why — pin the product requirements before any design", "should_trigger": true, "expected_skill": "discovery", "accept": ["workflow"] },
|
|
24
|
+
{ "query": "write a PRD for fixing the footer typo", "should_trigger": true, "expected_skill": "workflow", "disallowed": ["discovery"], "note": "A PRD ask on a trivial change goes to the router, which picks SMALL; discovery must not claim it (specs/prd-authoring quirk Q5)." },
|
|
25
|
+
{ "query": "save this PRD", "should_trigger": true, "expected_skill": "technical-spec" },
|
|
22
26
|
{ "query": "help me write my resume", "should_trigger": false, "expected_skill": null },
|
|
23
27
|
{ "query": "design a logo for the app", "should_trigger": false, "expected_skill": null }
|
|
24
28
|
]
|
|
@@ -23,6 +23,13 @@ feature: <slug>
|
|
|
23
23
|
|
|
24
24
|
**Sections:** N — <names, in order> [at creation]
|
|
25
25
|
|
|
26
|
+
## §0 · requirements — AGREED <date> [on acknowledgment; revised visibly]
|
|
27
|
+
|
|
28
|
+
<prd.md's six headings, verbatim — Problem · Users · Goals and non-goals ·
|
|
29
|
+
Success metrics · Scope · Open questions — each a table or short list.
|
|
30
|
+
technical-spec's references/templates.md has the template. Step 7 copies
|
|
31
|
+
this part into specs/<slug>/prd.md heading for heading.>
|
|
32
|
+
|
|
26
33
|
## §n · <name> — AGREED <date> [appended per agreement]
|
|
27
34
|
|
|
28
35
|
**Decided:** <the choice>, because <one line>.
|
|
@@ -49,8 +56,11 @@ feature: <slug>
|
|
|
49
56
|
| Rule | Why |
|
|
50
57
|
|---|---|
|
|
51
58
|
| Every agreed § carries the four facts a `decisions.md` entry carries — title+date, choice, alternatives with one-line why-nots, consequence | Step 7's spec write-back becomes transcription, not authorship; the design doc and `decisions.md` cannot disagree on shape because they share one |
|
|
59
|
+
| §0 carries `prd.md`'s six headings verbatim, outside the `§n of N` count; an unanswered section is an open question, never a guess | Step 7 copies §0 into `prd.md` — same shape, so nothing is re-authored; an invented metric reads as fact forever after |
|
|
60
|
+
| The why-line is derived from §0's *Problem*, never a second statement of it | one fact, one home |
|
|
52
61
|
| Sections are appended as agreed, never drafted ahead | The file records the conversation's actual state; a pre-drafted section reads as agreed when it isn't |
|
|
53
62
|
| Constraints discovered mid-flow go straight into their table | The section exists from creation precisely so mid-flow findings have a home other than an invented heading |
|
|
63
|
+
| A requirements-only discovery that stops at §0 writes `prd.md` and leaves `status: in-progress` | a PRD is not a design; `/draft-plan`'s gate must still ask |
|
|
54
64
|
| `status` flips to `signed-off` only at Step 7, and nothing else edits the frontmatter | `/draft-plan` and the `planner` agent gate on this value |
|
|
55
65
|
|
|
56
66
|
## Lifecycle stamps, spelled out
|
|
@@ -58,6 +68,8 @@ feature: <slug>
|
|
|
58
68
|
| Stamp | When written | Parts |
|
|
59
69
|
|---|---|---|
|
|
60
70
|
| `[at creation]` | Step 3 opens, before §1 is presented | frontmatter, title, why-line, section list |
|
|
71
|
+
| `[on acknowledgment]` | the §0 card is acknowledged, before §1 is presented | §0 requirements — written then, not before, so the file never shows requirements as agreed that nobody has seen |
|
|
72
|
+
| `[revised visibly]` | a later section changes scope, goals, or users | §0 — edited in place, the change named in that section's entry |
|
|
61
73
|
| `[appended per agreement]` | each section, at the moment it is agreed | the § entries |
|
|
62
74
|
| `[accumulates]` | any time | `Constraints & out of scope` rows |
|
|
63
75
|
| `[finalized at sign-off]` | Step 7 | `Open questions`, the `status` flip |
|
|
@@ -21,8 +21,8 @@ If yes, go straight to **Launch preview** below (skip scaffold + write — spec
|
|
|
21
21
|
The Markdown design doc (Step 7) is always written. The spec write-back is
|
|
22
22
|
**default-on** — announce it rather than ask:
|
|
23
23
|
|
|
24
|
-
> "Saving this as a tech spec too (
|
|
25
|
-
> detail round) and opening the live preview — say no to skip."
|
|
24
|
+
> "Saving this as a tech spec too (the PRD from §0, decisions, and the concern
|
|
25
|
+
> files from the detail round) and opening the live preview — say no to skip."
|
|
26
26
|
|
|
27
27
|
Unless the user opts out (the spec directory then becomes the target for the
|
|
28
28
|
Design Review Loop above, in directory mode):
|
|
@@ -45,7 +45,12 @@ Design Review Loop above, in directory mode):
|
|
|
45
45
|
repo structure, automatically.
|
|
46
46
|
|
|
47
47
|
3. **Write initial spec files** from the design into `$SPEC_PATH/`.
|
|
48
|
-
`
|
|
48
|
+
`prd.md` first — the design file's `§0 · requirements` part, copied
|
|
49
|
+
heading for heading; if a `prd.md` was already on disk, update it in
|
|
50
|
+
place and add a changelog line to `index.md` rather than overwriting
|
|
51
|
+
silently. `decisions.md` always (chosen approach + rationale) — except on
|
|
52
|
+
the requirements-only exit (SKILL.md → The Requirements Card), where no
|
|
53
|
+
approach was agreed and `prd.md` is the only file written. Then every concern
|
|
49
54
|
the detail round produced answers for gets its file: `api.md`,
|
|
50
55
|
`fields.md`, `quirks.md`, `implementation.md`. A detail-round answer
|
|
51
56
|
that never lands in a spec file is a bug in the flow, not a judgment call.
|
|
@@ -68,6 +68,7 @@ missing or scaffold-only file makes no claim, skip it:
|
|
|
68
68
|
|
|
69
69
|
| Concern file | Check the implementation against |
|
|
70
70
|
|---|---|
|
|
71
|
+
| `prd.md` | requirements — work that lands in the **Scope** table's *Out* column, or inside a row of the **Non-goal** table, is drift: both are explicit exclusions. Work the *In* column merely does not mention is not. Goals are compared only when the task claims to complete the feature; a task that serves a subset of them is not drift |
|
|
71
72
|
| `api.md` | contracts touched — shapes, error forms, external calls |
|
|
72
73
|
| `fields.md` | source-to-UI mappings and transformations |
|
|
73
74
|
| `quirks.md` | edge cases and failure modes the spec says are handled |
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: technical-spec
|
|
3
|
-
description: "Persists feature decisions, API contracts, implementation details, and quirks into a structured, queryable spec tree — one folder per feature, one file per concern. Invoke-only — discovery runs it at design sign-off and preflight's drift check reads its output; the user runs it via /technical-spec when they say \"save spec\", \"document this\", \"write up what we decided\", \"record the decision rationale\",
|
|
3
|
+
description: "Persists feature requirements, decisions, API contracts, implementation details, and quirks into a structured, queryable spec tree — one folder per feature, one file per concern. Invoke-only — discovery runs it at design sign-off and preflight's drift check reads its output; the user runs it via /technical-spec when they say \"save spec\", \"document this\", \"write up what we decided\", \"record the decision rationale\", \"spec this out\", \"save this PRD\", or \"write up the requirements\" — recording decisions for the future is spec work even when phrased as remembering. Not for turning a rough idea into a design first — that's discovery."
|
|
4
4
|
disable-model-invocation: true
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -8,7 +8,7 @@ disable-model-invocation: true
|
|
|
8
8
|
|
|
9
9
|
## Overview
|
|
10
10
|
|
|
11
|
-
Persists feature decisions, API contracts, implementation details, and quirks into a structured, queryable spec tree. One folder per feature, one file per concern — future sessions load only what they need. Specs are living contracts: `/preflight`'s Drift Check compares the implementation against them at end-of-task.
|
|
11
|
+
Persists feature requirements, decisions, API contracts, implementation details, and quirks into a structured, queryable spec tree. One folder per feature, one file per concern — future sessions load only what they need. Specs are living contracts: `/preflight`'s Drift Check compares the implementation against them at end-of-task.
|
|
12
12
|
|
|
13
13
|
## Spec Folder Layout
|
|
14
14
|
|
|
@@ -24,6 +24,7 @@ to place the spec.
|
|
|
24
24
|
apps/web/
|
|
25
25
|
{feature-slug}/ # scaffolded while working in apps/web
|
|
26
26
|
index.md # purpose, TOC, last updated, PR stamp, changelog ← scaffold creates this
|
|
27
|
+
prd.md # Requirements: problem, users, goals/non-goals, metrics, scope
|
|
27
28
|
decisions.md # Design decisions with context + rationale
|
|
28
29
|
api.md # Endpoints, types, external APIs consumed
|
|
29
30
|
fields.md # Field mappings: BE/3rd-party → UI, or forwarding chains
|
|
@@ -56,9 +57,11 @@ exists and has since the design's first section — discovery creates it at §1
|
|
|
56
57
|
and appends to it as each section is agreed. So the input here is a finished
|
|
57
58
|
file on disk, not a summary reconstructed from the conversation: read
|
|
58
59
|
`.condux/designs/YYYY-MM-DD-<feature>.md` and map its sections into the
|
|
59
|
-
concern files.
|
|
60
|
-
|
|
61
|
-
|
|
60
|
+
concern files. Its `§0 · requirements` part uses `prd.md`'s six headings
|
|
61
|
+
verbatim, so that mapping is a copy, heading for heading. Discovery's own
|
|
62
|
+
preview server is already running against that file, so the live-preview
|
|
63
|
+
offer below applies to the *spec directory* only — never start a second
|
|
64
|
+
server for the design.
|
|
62
65
|
|
|
63
66
|
## Required Notifications
|
|
64
67
|
|
|
@@ -111,6 +114,16 @@ the spec all read, so write each row as a claim someone could check.
|
|
|
111
114
|
trailing `//` per field, JSDoc only when a line won't do. `fields.md` says
|
|
112
115
|
what *happens to it* — mapping and transformation only. One fact never lives
|
|
113
116
|
in both places: a fact with two homes goes missing from the one being read.
|
|
117
|
+
The same split holds one level up: `prd.md` says *why the feature exists and
|
|
118
|
+
for whom*; `decisions.md` says *how it was chosen*. A decision never restates
|
|
119
|
+
the problem, and the PRD never records an alternative.
|
|
120
|
+
|
|
121
|
+
**`prd.md` is the requirements file, and the one file written before the
|
|
122
|
+
design.** `discovery` authors it from its requirements card and writes it
|
|
123
|
+
here at sign-off; run standalone ("save this PRD", "write up the
|
|
124
|
+
requirements") you write it directly from what the user gives you. Six fixed
|
|
125
|
+
sections — see the template. A section nobody has answered becomes an open
|
|
126
|
+
question; never invent users or metrics to complete the table.
|
|
114
127
|
|
|
115
128
|
**Quirk headings are `## Q<n> — Title`.** The `Q<n>` anchors are a citation
|
|
116
129
|
contract (`durable-citations.test.mjs` resolves them), so numbers are unique,
|
|
@@ -17,6 +17,9 @@
|
|
|
17
17
|
{ "query": "browse the specs tree", "should_trigger": true, "expected_skill": "spec-browser" },
|
|
18
18
|
{ "query": "where is the spec for the auth feature", "should_trigger": true, "expected_skill": "spec-browser" },
|
|
19
19
|
{ "query": "design the feature first before documenting", "should_trigger": true, "expected_skill": "discovery" },
|
|
20
|
+
{ "query": "save this PRD", "should_trigger": true, "expected_skill": "technical-spec" },
|
|
21
|
+
{ "query": "write up the requirements from this ticket into the spec", "should_trigger": true, "expected_skill": "technical-spec", "disallowed": ["draft-plan"] },
|
|
22
|
+
{ "query": "write a PRD for the notifications feature", "should_trigger": true, "expected_skill": "discovery", "accept": ["workflow"] },
|
|
20
23
|
{ "query": "generate openapi yaml from the routes", "should_trigger": false, "expected_skill": null },
|
|
21
24
|
{ "query": "write jsdoc comments for this module", "should_trigger": false, "expected_skill": null, "accept": ["workflow"], "note": "Writing comments is a code change — an implementation request workflow claims. null stays primary: it is also fine to just do it." },
|
|
22
25
|
{ "query": "host our swagger docs somewhere", "should_trigger": false, "expected_skill": null }
|
|
@@ -52,6 +52,74 @@ rule existed and two were already dead when they were found.
|
|
|
52
52
|
|
|
53
53
|
---
|
|
54
54
|
|
|
55
|
+
## prd.md
|
|
56
|
+
|
|
57
|
+
```markdown
|
|
58
|
+
# PRD — {Feature Name}
|
|
59
|
+
|
|
60
|
+
| Section | In one line |
|
|
61
|
+
|---|---|
|
|
62
|
+
| Problem | {the problem, stated as a claim} |
|
|
63
|
+
| Users | {who it is for} |
|
|
64
|
+
| Goals | {what changes when this succeeds} |
|
|
65
|
+
| Scope | {where the boundary sits} |
|
|
66
|
+
|
|
67
|
+
## Problem
|
|
68
|
+
|
|
69
|
+
{one paragraph, three lines at most — what is wrong today, for whom, and why
|
|
70
|
+
it is worth fixing now}
|
|
71
|
+
|
|
72
|
+
## Users
|
|
73
|
+
|
|
74
|
+
| Who | Today | What changes |
|
|
75
|
+
|---|---|---|
|
|
76
|
+
| {role or persona} | {what they do now} | {what they can do after} |
|
|
77
|
+
|
|
78
|
+
## Goals and non-goals
|
|
79
|
+
|
|
80
|
+
| Goal | Measured by |
|
|
81
|
+
|---|---|
|
|
82
|
+
| {outcome, not a feature} | {the metric row that proves it} |
|
|
83
|
+
|
|
84
|
+
| Non-goal | Why excluded |
|
|
85
|
+
|---|---|
|
|
86
|
+
| {what this deliberately does not do} | {one line} |
|
|
87
|
+
|
|
88
|
+
## Success metrics
|
|
89
|
+
|
|
90
|
+
| Metric | Target | How measured |
|
|
91
|
+
|---|---|---|
|
|
92
|
+
| {what is counted} | {the number or state} | {where the reading comes from} |
|
|
93
|
+
|
|
94
|
+
## Scope
|
|
95
|
+
|
|
96
|
+
| In | Out |
|
|
97
|
+
|---|---|
|
|
98
|
+
| {a surface, flow, or platform this covers} | {the adjacent thing it does not} |
|
|
99
|
+
|
|
100
|
+
## Open questions
|
|
101
|
+
|
|
102
|
+
- {a question nobody has answered yet — or "none"}
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
The PRD is the one concern file written *before* the design: it says why the
|
|
106
|
+
feature exists and for whom, and `decisions.md` says how it was chosen. The
|
|
107
|
+
section set is fixed — these six headings, in this order — because
|
|
108
|
+
`discovery` writes them from its requirements card and `preflight`'s drift
|
|
109
|
+
check reads **Scope** and the **Non-goal** table as claims: work that lands
|
|
110
|
+
in the Out column, or inside a non-goal, is drift. Write the Out column as
|
|
111
|
+
things someone might plausibly build — an exclusion nobody would attempt
|
|
112
|
+
checks nothing.
|
|
113
|
+
|
|
114
|
+
**An empty section is an open question, not a blank to fill.** When nobody
|
|
115
|
+
has stated the users or a metric, the section says so under *Open questions*
|
|
116
|
+
in plain words. A PRD whose metrics were invented to complete the table is
|
|
117
|
+
worse than one that admits it has none. Content from a document the user
|
|
118
|
+
brought that fits none of the six sections also lands under *Open questions*,
|
|
119
|
+
in its original wording.
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
55
123
|
## decisions.md
|
|
56
124
|
|
|
57
125
|
```markdown
|
package/skills/workflow/SKILL.md
CHANGED
|
@@ -78,7 +78,8 @@ Every tier ends with `preflight` then `finalize` — no exceptions.
|
|
|
78
78
|
Match the task subject to a spec dir (fuzzy kebab-case: "checkout flow" →
|
|
79
79
|
`specs/checkout-flow`). If found, read `index.md`, then load by task type —
|
|
80
80
|
bug/debug → `quirks.md`, `api.md`, `fields.md`; refactor → `implementation.md`,
|
|
81
|
-
`decisions.md`; new feature → `decisions.md`, `api.md`, `fields.md
|
|
81
|
+
`decisions.md`; new feature → `prd.md`, `decisions.md`, `api.md`, `fields.md`
|
|
82
|
+
(any of these the spec does not have is skipped silently). Carry this
|
|
82
83
|
context through; don't re-read mid-task. No spec → proceed without comment.
|
|
83
84
|
3. **Confirm with the user.** State the inferred tier + a one-sentence reason. If a
|
|
84
85
|
spec was loaded, mention it and offer the companion: "Found spec for
|