@deftai/directive-content 0.86.0 → 0.88.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/skills/deft-directive-swarm/SKILL.md +1 -996
- package/QUICK-START.md +6 -0
- package/Taskfile.yml +3 -1
- package/UPGRADING.md +24 -2
- package/coding/coding.md +5 -1
- package/commands.md +1 -1
- package/contracts/runtime-authority.md +34 -8
- package/conventions/references.md +1 -1
- package/docs/getting-started.md +6 -0
- package/docs/no-deft-directive.md +87 -0
- package/docs/openclaw-agent-host.md +170 -0
- package/docs/product-signal.md +2 -0
- package/docs/writing-ste100.md +53 -0
- package/glossary.md +37 -39
- package/package.json +2 -1
- package/packs/rules/rules-pack-0.1.json +25 -1
- package/packs/skills/skills-pack-0.1.json +5 -5
- package/packs/strategies/strategies-pack-0.1.json +4 -4
- package/skills/deft-directive-review-cycle/SKILL.md +116 -14
- package/skills/deft-directive-setup/SKILL.md +35 -8
- package/skills/deft-directive-swarm/SKILL.md +81 -956
- package/skills/deft-directive-swarm/references/core-ops.md +144 -0
- package/skills/deft-directive-swarm/references/core-phase-0.md +200 -0
- package/skills/deft-directive-swarm/references/core-phase-1-2.md +73 -0
- package/skills/deft-directive-swarm/references/core-phase-3.md +145 -0
- package/skills/deft-directive-swarm/references/core-phase-4.md +71 -0
- package/skills/deft-directive-swarm/references/core-phase-5-6.md +317 -0
- package/skills/deft-directive-swarm/references/host-cursor.md +25 -0
- package/skills/deft-directive-swarm/references/host-generic.md +27 -0
- package/skills/deft-directive-swarm/references/host-grok-build.md +37 -0
- package/skills/deft-directive-swarm/references/host-openclaw.md +70 -0
- package/skills/deft-directive-swarm/references/host-warp.md +37 -0
- package/skills/deft-directive-triage/SKILL.md +40 -55
- package/skills/deft-directive-write-skill/SKILL.md +17 -0
- package/strategies/artifact-guards.md +24 -14
- package/strategies/discuss.md +40 -1
- package/strategies/interview.md +103 -30
- package/strategies/probe.md +27 -1
- package/tasks/engine-invoke.cjs +69 -13
- package/tasks/engine-invoke.test.cjs +188 -0
- package/tasks/triage-queue.yml +1 -1
- package/tasks/verify.yml +19 -0
- package/templates/agent-prompt-preamble.md +16 -5
- package/templates/swarm-greptile-poller-prompt.md +21 -12
- package/vbrief/vbrief.md +4 -2
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Host adapter: Warp
|
|
2
|
+
|
|
3
|
+
Legend (RFC2119): !=MUST, ~=SHOULD, ≉=SHOULD NOT, ⊗=MUST NOT, ?=MAY.
|
|
4
|
+
|
|
5
|
+
Descriptor: `warp-orchestrated` (`start_agent`) or `warp-manual` (`WARP_*` without `start_agent`).
|
|
6
|
+
|
|
7
|
+
Load this file only after detect selects Warp. Do not load other host adapters.
|
|
8
|
+
|
|
9
|
+
### Step 2a: Orchestrated Launch (start_agent available)
|
|
10
|
+
|
|
11
|
+
! When `start_agent` is detected in the tool set, use it directly to launch each agent.
|
|
12
|
+
|
|
13
|
+
- ! Launch one agent per worktree using `start_agent` with the generated prompt and worktree path as the working directory
|
|
14
|
+
- ! Agents inherit the current environment's MCP servers, Warp Drive rules, and codebase index — equivalent to interactive Warp tabs but without manual tab management
|
|
15
|
+
- ! No user intervention needed — launch is fully automated
|
|
16
|
+
- ~ This is the preferred path: richest context with zero manual overhead
|
|
17
|
+
|
|
18
|
+
### Step 2b: Interactive Warp Tabs (start_agent unavailable, Warp detected)
|
|
19
|
+
|
|
20
|
+
! When `start_agent` is not available but Warp is detected (via `WARP_*` environment variables), fall back to manual Warp tab launch — briefly note that orchestrated launch is not available in this session, then proceed with the tab instructions below.
|
|
21
|
+
|
|
22
|
+
! **Warp tabs cannot be opened programmatically.** There is no API or CLI command to open a new Warp terminal tab from an agent or script.
|
|
23
|
+
|
|
24
|
+
Ask the user to open N new Warp terminal tabs. For each tab, the user:
|
|
25
|
+
1. Navigates to the worktree: `cd <worktree>`
|
|
26
|
+
2. Pastes the prompt directly into the **Warp agent chat input** (not the terminal)
|
|
27
|
+
|
|
28
|
+
**Context advantages of Warp tabs:**
|
|
29
|
+
- Global Warp Drive rules (personal rules auto-injected)
|
|
30
|
+
- MCP servers via UUID (GitHub, etc. — zero-config)
|
|
31
|
+
- Warp Drive notebooks, workflows, and other auto-injected context
|
|
32
|
+
- Warm codebase index from the active Warp session (no cold-start delay)
|
|
33
|
+
- Agent is interruptible and steerable mid-run
|
|
34
|
+
|
|
35
|
+
**Tradeoff:** Requires the user to manually open and manage one Warp tab per agent.
|
|
36
|
+
|
|
37
|
+
? If not running inside Warp at all (no `WARP_*` variables, no `start_agent`), use the same tab approach but with any terminal emulator — the user pastes prompts into their preferred terminal or agent interface.
|
|
@@ -50,98 +50,83 @@ Directive does not guess your mix: **ordered plan** (`task plan-sequence:*`) whe
|
|
|
50
50
|
! Probe cache freshness before doing any classification or selection. Stale cache reads produce stale decisions; the gate is the contract.
|
|
51
51
|
|
|
52
52
|
1. ! Run `task verify:cache-fresh` (D5 / #1127). Exit 0 -> proceed to Phase 1. Exit 1 (stale or blocked) -> refresh per the printed remediation. Exit 2 (no bootstrap) -> run `task triage:bootstrap` first. When the cache has zero entries, read paths auto-fetch from GitHub first (#2575).
|
|
53
|
-
2. ~ Refresh path: `task cache:fetch-all -- --source=github-issue --repo OWNER/NAME` for an already-bootstrapped project
|
|
54
|
-
3. ~ If `xbrief/active/*.xbrief.json` references are in play, run `task triage:refresh-active` to
|
|
55
|
-
4. ~ When the one-liner
|
|
53
|
+
2. ~ Refresh path: `task cache:fetch-all -- --source=github-issue --repo OWNER/NAME` for an already-bootstrapped project; `task triage:bootstrap` for a first-time seed.
|
|
54
|
+
3. ~ If `xbrief/active/*.xbrief.json` references are in play, run `task triage:refresh-active` to surface drift before the queue is rendered.
|
|
55
|
+
4. ~ When the session one-liner carries `[scope-drift] N` (D14 / #1133), run `task triage:scope-drift` and choose subscribe / ignore before walking the queue.
|
|
56
56
|
5. ⊗ Walk the queue against a stale cache -- the audit log will record decisions against bodies the operator never actually saw.
|
|
57
57
|
|
|
58
58
|
## Phase 1 -- Classify
|
|
59
59
|
|
|
60
60
|
! Inspect the auto-classification audit log so manually-decided items are not re-walked, and surface anomalies before the queue render.
|
|
61
61
|
|
|
62
|
-
1. ! Run `task triage:classify --list` (D10 / #1129) to render
|
|
63
|
-
2. ! Walk recent
|
|
64
|
-
3. ~
|
|
65
|
-
4. ~
|
|
66
|
-
5. ⊗ Re-classify
|
|
67
|
-
6. ⊗ Block issue creation solely because no label was selected, or invent ad hoc labels outside the repository's existing label set.
|
|
62
|
+
1. ! Run `task triage:classify --list` (D10 / #1129) to render effective rules and hold-markers.
|
|
63
|
+
2. ! Walk recent `xbrief/.eval/candidates.jsonl` entries for anomalies (classifier disagreement, repeated defer, stale needs-ac); surface before Phase 2; do NOT auto-fix.
|
|
64
|
+
3. ~ Scope widen/narrow via `task triage:scope --list` (D12 / #1131); edits belong in PROJECT-DEFINITION.
|
|
65
|
+
4. ~ Label hygiene: recommend repo labels via `gh label list` when unlabeled; do not invent labels or block creation solely for missing labels.
|
|
66
|
+
5. ⊗ Re-classify terminally decided items without operator approval -- supersession is `task triage:reset <N>` only.
|
|
68
67
|
|
|
69
68
|
## Phase 2 -- Present
|
|
70
69
|
|
|
71
70
|
! Apply the Work selection fork gate (#2542): when no ordered-plan is active, render `task triage:queue` before suggesting work (#1149). Active sequence yields to the ordered-plan entry (#2402).
|
|
72
71
|
|
|
73
|
-
1. ! Run `task triage:queue --limit=N` (D11 / #1128) -- default `N=10
|
|
74
|
-
2. ! For per-item detail, run `task triage:show <N>` --
|
|
75
|
-
3. ~ Present the ranked queue verbatim; do NOT silently re-rank, drop, or annotate beyond
|
|
76
|
-
4. ⊗ Recommend a specific issue without
|
|
72
|
+
1. ! Run `task triage:queue --limit=N` (D11 / #1128) -- default `N=10`. Groups `[RESUME]` -> `[URGENT]` -> untriaged -> other; ranking via `plan.policy.triageRankingLabels[]`, tiebreak `updated_at` desc.
|
|
73
|
+
2. ! For per-item detail, run `task triage:show <N>` (default) or `task triage:show --format=operator <N>` (#2890) -- cached payload, latest decision, audit timeline, active-xBRIEF flag; operator format is the pasteable Phase 3 brief backbone. Exit 0 on hit, 1 on cache miss (re-sync per Phase 0).
|
|
74
|
+
3. ~ Present the ranked **queue listing** verbatim; do NOT silently re-rank, drop, or annotate the listing beyond the canonical renderer. This queue non-annotation rule does **not** forbid Phase 3 per-candidate operator briefs or leans (see Phase 3 / #2890).
|
|
75
|
+
4. ⊗ Recommend a specific issue without `task triage:queue` first, or an issue absent from the queue without `task triage:show` to surface why.
|
|
77
76
|
|
|
78
77
|
## Phase 3 -- Decide
|
|
79
78
|
|
|
80
|
-
! Walk per-item decisions through the canonical `task triage:*` verbs
|
|
79
|
+
! Walk per-item decisions through the canonical `task triage:*` verbs (tasks own audit-log append / schema / `xbrief/proposed/` write).
|
|
81
80
|
|
|
82
|
-
|
|
81
|
+
! **Operator brief (same turn as menu) (#2890):** Before every per-item decision menu, present an operator brief in the **same operator-visible message/surface** as the menu, containing at least: issue `#N` + title + link; labels (or explicit none); 2–5 line problem/context summary; AC bullets or explicit "thin body / no AC"; agent **lean** + one-line why (Accept / Defer / Reject / Needs-AC / …). ~ Prefer `task triage:show --format=operator <N>` as the brief backbone; agent still owns lean. ⊗ Menu-only or chip-only Phase 3 turns without that brief. ⊗ Brief-only turn followed by a later chip/menu-only turn that does not restate the brief.
|
|
82
|
+
|
|
83
|
+
! **Host structured-question adapter:** On chips / `ask_user` / similar UIs (e.g. OpenClaw `ask_user`), keep the prose brief in chat; structured options are **actions only** (Accept / Defer / Reject / Needs-AC / Mark duplicate / Discuss / Back). Option labels ≉ substitute for the brief.
|
|
84
|
+
|
|
85
|
+
For each candidate, render the canonical numbered action menu and dispatch:
|
|
83
86
|
|
|
84
87
|
```
|
|
85
88
|
What would you like to do with this candidate?
|
|
86
|
-
1. Accept -- `task triage:accept <N>`
|
|
87
|
-
2. Reject -- `task triage:reject <N>`
|
|
88
|
-
3. Defer -- `task triage:defer <N> [--resume-on <event>]`
|
|
89
|
-
4. Needs-AC -- `task triage:needs-ac <N>`
|
|
90
|
-
5. Mark duplicate -- `task triage:mark-duplicate <N> <of-issue>`
|
|
89
|
+
1. Accept -- `task triage:accept <N>`
|
|
90
|
+
2. Reject -- `task triage:reject <N>`
|
|
91
|
+
3. Defer -- `task triage:defer <N> [--resume-on <event>]`
|
|
92
|
+
4. Needs-AC -- `task triage:needs-ac <N>`
|
|
93
|
+
5. Mark duplicate -- `task triage:mark-duplicate <N> <of-issue>`
|
|
91
94
|
6. Discuss
|
|
92
95
|
7. Back
|
|
93
96
|
```
|
|
94
97
|
|
|
95
|
-
- ! `--resume-on <event>` on `task triage:defer` (D3 / #1123 -- ships in parallel; reference but do not hard-depend) records a resume condition with the defer entry; the resume condition surfaces in `task triage:queue` once met. When D3 has not landed yet, omit the flag -- the verb stays terminal-shape-compatible.
|
|
96
98
|
- ! Map user replies only to the displayed number (`1`-`7`) or exact displayed option text. ⊗ Do NOT infer from alphabetic host affordances or bare letters such as `d` / `b` unless those letters were visibly rendered as choices.
|
|
97
|
-
- ! On `Discuss`, halt
|
|
98
|
-
- ! On `Back`, un-buffer
|
|
99
|
-
- ~ Bulk
|
|
100
|
-
- ⊗ Write to `xbrief/proposed/` directly -- only `task triage:accept`
|
|
99
|
+
- ! On `Discuss`, halt immediately, prompt `What would you like to discuss?`, resume only on explicit user signal. ⊗ Implicit resumption.
|
|
100
|
+
- ! On `Back`, un-buffer prior selection and re-render its action menu only before a `task triage:*` dispatch; after dispatch use `task triage:reset`.
|
|
101
|
+
- ~ Bulk: `task triage:bulk-{accept,reject,defer,needs-ac}`; results still flow through the audit log.
|
|
102
|
+
- ⊗ Write to `xbrief/proposed/` directly -- only `task triage:accept` is authorised.
|
|
101
103
|
|
|
102
104
|
## Phase 4 -- Audit
|
|
103
105
|
|
|
104
106
|
! Confirm the session's decisions landed coherently before exiting the skill.
|
|
105
107
|
|
|
106
|
-
1. ! Run `task triage:audit --format=json` (D11 / #1128)
|
|
107
|
-
2. ! Run `task triage:summary` (D2 / #1122) --
|
|
108
|
-
3. ~
|
|
109
|
-
4. ~
|
|
110
|
-
5. ⊗ Skip
|
|
111
|
-
|
|
112
|
-
! Before reporting an umbrella or epic's current status during triage (what is done, what blocks, wave order), fetch `repos/<owner>/<repo>/issues/<N>/comments` via REST, read the `## Current shape (as of pass-N)` comment and any linked context/`LockedDecisions` xBRIEF — never conclude status from the issue body alone (claim-cites-state-surface, #2066 / AGENTS.md #1152).
|
|
108
|
+
1. ! Run `task triage:audit --format=json` (D11 / #1128); optional `#1180` filters `--since` / `--action`. Transform with `jq` -- framework does not compute trends.
|
|
109
|
+
2. ! Run `task triage:summary` (D2 / #1122) -- `[triage] N untriaged · S stale-defer · M in-flight · WIP X/Y [⚠] [· [scope-drift] N]`.
|
|
110
|
+
3. ~ Non-zero `[scope-drift]` → surface `task triage:scope-drift` + subscribe/unsubscribe/ignore remediation; then `task triage:bootstrap -- --resume`.
|
|
111
|
+
4. ~ Stale accept (no active xBRIEF ref) → re-ingest or `task triage:reset`.
|
|
112
|
+
5. ⊗ Skip Phase 4 audit.
|
|
113
|
+
6. ! Umbrella/epic status: REST comments → `## Current shape (as of pass-N)` (#2066 / #1152); never body alone.
|
|
113
114
|
|
|
114
115
|
## Reversibility
|
|
115
116
|
|
|
116
|
-
!
|
|
117
|
-
|
|
118
|
-
⊗ Edit or delete prior entries in `xbrief/.eval/candidates.jsonl` to "undo" a decision -- the log is append-only by design and any external mutation breaks the `merge=union` rebase ergonomic (#1144 / N4).
|
|
117
|
+
! Undo via `task triage:reset <N>` (Layer 5; history never deleted). ⊗ Edit/delete `xbrief/.eval/candidates.jsonl` to "undo".
|
|
119
118
|
|
|
120
119
|
## Anti-Patterns
|
|
121
120
|
|
|
122
|
-
- ⊗ Recommend
|
|
123
|
-
- ⊗ Conclude "nothing to do" from
|
|
124
|
-
- ⊗
|
|
125
|
-
- ⊗ Reimplement audit-log append / `proposed/` write inline -- the `task triage:*` verbs own those surfaces (#845, #883).
|
|
126
|
-
- ⊗ Treat `defer` / `needs-ac` as terminal -- they intentionally resurface on the next pass.
|
|
127
|
-
- ⊗ Edit `xbrief/.eval/candidates.jsonl` directly to revoke a decision -- use `task triage:reset <N>`.
|
|
121
|
+
- ⊗ Recommend work without `task triage:queue` (#1149).
|
|
122
|
+
- ⊗ Conclude "nothing to do" from folder scans or live GitHub alone (#2576).
|
|
123
|
+
- ⊗ Stale-cache walk; reimplement audit/`proposed/` writes; treat defer/needs-ac as terminal; edit candidates.jsonl; menu-only Phase 3 without operator brief (#2890).
|
|
128
124
|
|
|
129
125
|
## EXIT
|
|
130
126
|
|
|
131
|
-
!
|
|
132
|
-
|
|
133
|
-
! Provide chaining instructions:
|
|
134
|
-
|
|
135
|
-
- **Ingestion / evaluation of accepted items**: chain into `skills/deft-directive-refinement/SKILL.md` -- refinement's Phase 1 ingests the `xbrief/proposed/` items this skill just wrote into the rest of the lifecycle.
|
|
136
|
-
- **Cohort dispatch**: chain into `skills/deft-directive-swarm/SKILL.md` -- swarm Phase 0 is queue-driven (N2 / #1142) and consumes the same `task triage:queue` ordering you just walked.
|
|
137
|
-
- **Fresh-state refresh before re-entry**: run `task cache:fetch-all -- --source=github-issue --repo OWNER/NAME` then re-enter this skill when ready to continue.
|
|
138
|
-
|
|
139
|
-
⊗ Exit silently without the canonical confirmation + chaining instruction -- the Skill Completion Gate in AGENTS.md is binding.
|
|
127
|
+
! On opt-out: `deft-directive-triage complete -- exiting skill.` Chain: `deft-directive-refinement` (accepted items) · `deft-directive-swarm` (cohort) · `task cache:fetch-all` then re-enter. ⊗ Silent exit.
|
|
140
128
|
|
|
141
129
|
## References
|
|
142
130
|
|
|
143
|
-
-
|
|
144
|
-
-
|
|
145
|
-
- Layer 5 reversibility verb: `scripts/triage_actions.py::reset` (already shipped under #845)
|
|
146
|
-
- Sibling skills: `skills/deft-directive-refinement/SKILL.md`, `skills/deft-directive-swarm/SKILL.md`, `skills/deft-directive-sync/SKILL.md`
|
|
147
|
-
- Stub author (replaced): #1149 (N9)
|
|
131
|
+
- #1119 D6; #1128 D11 (`triage:queue` / `show` / `audit`); #2890 Phase 3 operator brief; #1122 / #1123 / #1127 / #1129 / #1131
|
|
132
|
+
- Siblings: `deft-directive-refinement`, `deft-directive-swarm`, `deft-directive-sync`
|
|
@@ -162,6 +162,23 @@ The description is **the only thing the agent sees** when deciding whether to lo
|
|
|
162
162
|
|
|
163
163
|
- ⊗ Omitting RFC2119 notation — deft skills use it consistently
|
|
164
164
|
- ⊗ Putting all content in SKILL.md when it exceeds 150 lines — split into `references/*.md` or `REFERENCE.md`
|
|
165
|
+
|
|
166
|
+
- ⊗ Putting every agent-host branch (Warp, Cursor, OpenClaw, Grok Build, generic) in one always-loaded SKILL body when a host-neutral core + per-host adapter split is feasible (#2928)
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
## Host-adapter skills (multi-host) (#2928)
|
|
171
|
+
|
|
172
|
+
Large skills that branch on **agent host** (the runtime: Warp, Cursor, OpenClaw, Grok Build, generic-terminal) SHOULD use progressive host adapters:
|
|
173
|
+
|
|
174
|
+
1. ! Keep a **thin host-neutral core** in `SKILL.md` (triggers, phase overview, detect, route table, cross-host MUST gates).
|
|
175
|
+
2. ! Put shared depth in `references/core-*.md`.
|
|
176
|
+
3. ! Put each host path in `references/host-<id>.md` (spawn primitive, cwd rules, monitor liveness, host MUST NOT list).
|
|
177
|
+
4. ! Default load path: detect host → read core + **one** adapter.
|
|
178
|
+
5. ⊗ Load all host adapters “just in case.”
|
|
179
|
+
|
|
180
|
+
Exemplar: `skills/deft-directive-swarm/` (route table in SKILL + `references/host-openclaw.md` etc.).
|
|
181
|
+
|
|
165
182
|
- ⊗ Vague trigger phrases — use phrases the user would actually type
|
|
166
183
|
- ⊗ Overlapping triggers without negative triggers — add `Do NOT trigger on …` to the description
|
|
167
184
|
- ⊗ Naming a GitHub-integrated skill without `gh` in the name
|
|
@@ -18,7 +18,7 @@ Legend (from RFC2119): !=MUST, ~=SHOULD, ≉=SHOULD NOT, ⊗=MUST NOT, ?=MAY.
|
|
|
18
18
|
|
|
19
19
|
This file is not a standalone strategy — it is a shared guard referenced by other strategies. It activates automatically when a strategy writes to vBRIEF artifacts.
|
|
20
20
|
|
|
21
|
-
- ! Referenced by spec-generating strategies: [speckit](./speckit.md), [enterprise](./enterprise.md), [rapid](./rapid.md)
|
|
21
|
+
- ! Referenced by spec-generating strategies: [speckit](./speckit.md), [enterprise](./enterprise.md), [rapid](./rapid.md), [interview](./interview.md), [yolo](./yolo.md)
|
|
22
22
|
- ! Referenced by preparatory strategies: [bdd](./bdd.md), [discuss](./discuss.md), [research](./research.md), [map](./map.md), [probe](./probe.md)
|
|
23
23
|
|
|
24
24
|
## Workflow
|
|
@@ -32,11 +32,16 @@ This file is not a standalone strategy — it is a shared guard referenced by ot
|
|
|
32
32
|
|
|
33
33
|
## Spec-Generating Guard (Full)
|
|
34
34
|
|
|
35
|
-
Applies to strategies that write
|
|
35
|
+
Applies to strategies that write project identity as `PROJECT-DEFINITION` (⊗ never `specification.vbrief.json` / `specification.xbrief.json` per [v0-20-contract.md](./v0-20-contract.md)): **speckit**, **enterprise**, **rapid**, **interview**, **yolo**.
|
|
36
36
|
|
|
37
|
-
!
|
|
37
|
+
! **Target resolution (xbrief-first)**: guard the file that is the live project identity:
|
|
38
|
+
1. `./xbrief/PROJECT-DEFINITION.xbrief.json` when it exists (canonical current layout)
|
|
39
|
+
2. else `./vbrief/PROJECT-DEFINITION.vbrief.json` when it exists (legacy layout)
|
|
40
|
+
3. else the intended write path for a greenfield create (usually `./xbrief/PROJECT-DEFINITION.xbrief.json`)
|
|
38
41
|
|
|
39
|
-
|
|
42
|
+
! Before writing or updating that target, the strategy MUST perform the following checks (⊗ Never target the legacy `specification.*.json`):
|
|
43
|
+
|
|
44
|
+
1. ! **Check existence**: Does the resolved target file already exist?
|
|
40
45
|
- If NO: proceed with the write — no guard needed.
|
|
41
46
|
- If YES: continue to step 2.
|
|
42
47
|
|
|
@@ -51,35 +56,40 @@ Applies to strategies that write to `PROJECT-DEFINITION.vbrief.json` (⊗ never
|
|
|
51
56
|
- ! Display: "A `{status}` version of this artifact already exists. Replace it? (yes/no)"
|
|
52
57
|
- ~ If the user declines, offer to enrich (merge narratives) instead of replacing
|
|
53
58
|
|
|
54
|
-
5. ! **Narrative preservation**: When overwriting `PROJECT-DEFINITION
|
|
55
|
-
- ⊗ Overwrite all `PROJECT-DEFINITION
|
|
59
|
+
5. ! **Narrative preservation**: When overwriting `PROJECT-DEFINITION`, read existing `narratives` keys first. If the strategy only writes a subset of narratives (e.g. speckit Phase 1 writes only `Principles`), merge the new narrative into the existing set — do NOT replace all narratives with only the new key.
|
|
60
|
+
- ⊗ Overwrite all `PROJECT-DEFINITION` narratives when the strategy only produces a single narrative key
|
|
61
|
+
- ⊗ Guard only the legacy `vbrief/` path while an `xbrief/PROJECT-DEFINITION.xbrief.json` is the live identity
|
|
56
62
|
|
|
57
63
|
---
|
|
58
64
|
|
|
59
65
|
## Preparatory Guard (Light)
|
|
60
66
|
|
|
61
|
-
Applies to strategies that write scoped
|
|
67
|
+
Applies to strategies that write scoped records to `proposed/`: **bdd**, **discuss**, **research**, **map**, **probe**, and brownfield **Add scope** paths from interview/setup.
|
|
68
|
+
|
|
69
|
+
! **Target folder resolution (xbrief-first)**: scan `./xbrief/proposed/` when it exists; else legacy `./vbrief/proposed/`. Prefer writing new scopes under the same root the project already uses.
|
|
62
70
|
|
|
63
|
-
! Before writing a scope
|
|
71
|
+
! Before writing a scope record to `proposed/`, the strategy MUST check for existing files with the same scope or feature name:
|
|
64
72
|
|
|
65
|
-
1. ! **Check for existing file**: Scan `
|
|
73
|
+
1. ! **Check for existing file**: Scan the resolved `proposed/` folder for files matching the target scope/feature slug (e.g. `*-{feature}-bdd.xbrief.json`, `*-{scope}-context.vbrief.json`).
|
|
66
74
|
- If NO match: proceed with the write — no guard needed.
|
|
67
75
|
- If a match exists: continue to step 2.
|
|
68
76
|
|
|
69
|
-
2. ! **Warn and ask**: Display: "A
|
|
77
|
+
2. ! **Warn and ask**: Display: "A scope record for this feature already exists at `{path}`. Replace it, or create a new version? (replace/new)"
|
|
70
78
|
- ! If replace: overwrite the existing file
|
|
71
79
|
- ! If new: append a numeric suffix or use today's date to create a distinct file
|
|
72
80
|
|
|
73
81
|
3. ~ **Read existing decisions**: If the existing file contains a `LockedDecisions` or similar narrative, surface those decisions to the agent context so they are not lost even if the user chooses to replace.
|
|
74
82
|
|
|
75
|
-
⊗ Silently overwrite an existing scope
|
|
83
|
+
⊗ Silently overwrite an existing scope record with the same feature/scope name without warning the user.
|
|
84
|
+
⊗ Scan only legacy `vbrief/proposed/` when `xbrief/proposed/` is the live lifecycle root.
|
|
76
85
|
|
|
77
86
|
---
|
|
78
87
|
|
|
79
88
|
## Anti-Patterns
|
|
80
89
|
|
|
81
|
-
- ⊗ Writing to `PROJECT-DEFINITION
|
|
90
|
+
- ⊗ Writing to `PROJECT-DEFINITION` without checking the file's current status (⊗ never write `specification.vbrief.json` / `specification.xbrief.json` at all per v0-20-contract.md)
|
|
91
|
+
- ⊗ Guarding only `vbrief/PROJECT-DEFINITION.vbrief.json` while `xbrief/PROJECT-DEFINITION.xbrief.json` is the live identity
|
|
82
92
|
- ⊗ Silently overwriting an `approved` or `completed` artifact — this discards locked decisions and approval state
|
|
83
|
-
- ⊗ Replacing all `PROJECT-DEFINITION
|
|
84
|
-
- ⊗ Overwriting a scope
|
|
93
|
+
- ⊗ Replacing all `PROJECT-DEFINITION` narratives when the strategy only contributes one narrative key (e.g. `Principles`)
|
|
94
|
+
- ⊗ Overwriting a scope record in `proposed/` without checking if one already exists for the same scope
|
|
85
95
|
- ⊗ Accepting vague confirmation (`proceed`, `ok`) when the guard requires explicit confirmation for approved/completed artifacts
|
package/strategies/discuss.md
CHANGED
|
@@ -72,6 +72,7 @@ Adapt question focus to what's being built:
|
|
|
72
72
|
|
|
73
73
|
- ! Produce a `vbrief/proposed/{scope}-context.vbrief.json` scope vBRIEF with a `LockedDecisions` narrative
|
|
74
74
|
- ! Each decision includes: **what** was decided, **why**, and **alternatives considered**
|
|
75
|
+
- ! When the lock is an intentional under-build (weaker Now + decided end-product Later), the decision MUST also include dual-path graduation fields: `now`, `later`, `graduationRef`, `trigger`, and `status` (`open` | `shipped` | `cancelled`) — see [Graduation (Now+Later)](#graduation-nowlater-dual-path-locks-2899)
|
|
75
76
|
- ! This vBRIEF is injected into all downstream work: planning, execution, verification
|
|
76
77
|
- ! Persist decisions as vBRIEF narratives on the relevant plan items
|
|
77
78
|
- ⊗ Write decisions to a hand-authored markdown context file -- use vBRIEF narratives for token-efficient agent consumption
|
|
@@ -85,6 +86,44 @@ Adapt question focus to what's being built:
|
|
|
85
86
|
- ⊗ Silently making a different choice because the agent forgot what was decided
|
|
86
87
|
- ⊗ Re-debating a settled decision without explicit user approval
|
|
87
88
|
|
|
89
|
+
## Graduation (Now+Later) dual-path locks (#2899)
|
|
90
|
+
|
|
91
|
+
**Graduation** (alias: Now+Later) is a first-class decision shape for intentional under-builds:
|
|
92
|
+
|
|
93
|
+
> We *decided* to ship a weaker path **now**, and we also decided what the end-product path is **later**.
|
|
94
|
+
|
|
95
|
+
It is **not** the same as other "later" concepts:
|
|
96
|
+
|
|
97
|
+
| Concept | Meaning |
|
|
98
|
+
|---|---|
|
|
99
|
+
| `DeferredDecisions` (probe) | Not decided yet; open question with justification |
|
|
100
|
+
| deferred plan item / `triage:defer` | Out of scope, or not accepted into the workspace backlog |
|
|
101
|
+
| rapid **graduate** | Spike / prototype → fresh full interview/spec cycle |
|
|
102
|
+
| **Graduation** | Decided weaker **Now** + decided end-product **Later** |
|
|
103
|
+
|
|
104
|
+
Glossary naming for this term is owned by sibling work (#2907). Strategy prose here is the Wave A contract agents must follow until the glossary entry lands.
|
|
105
|
+
|
|
106
|
+
### When a lock is an under-build
|
|
107
|
+
|
|
108
|
+
- ! When a `LockedDecisions` entry chooses a temporary, weaker, MVP, or shortcut approach **and** a stronger end-product approach is also decided, the entry MUST record a dual-path graduation shape with all of:
|
|
109
|
+
- `now` — what this scope ships
|
|
110
|
+
- `later` — the end-product approach
|
|
111
|
+
- `graduationRef` — GitHub issue URL and/or scope xBRIEF path that tracks Later work
|
|
112
|
+
- `trigger` — free-text condition that makes Later required (examples are illustrative only, e.g. "before multi-tenant customers", "when latency SLO is adopted")
|
|
113
|
+
- `status` — `open` | `shipped` | `cancelled` (cancellation MUST include justification)
|
|
114
|
+
- ! A permanent approach lock (no weaker temporary path) does **not** require graduation fields
|
|
115
|
+
- ! Chat-only "we'll harden this later" is insufficient — same anti-pattern as decisions that exist only in conversation history
|
|
116
|
+
- ~ Emitting `graduationRef` SHOULD use existing [emit-hints](./emit-hints.md) patterns (none / `--umbrella` / `--per-vbrief`) rather than a parallel SCM ontology
|
|
117
|
+
- ⊗ Routing a *decided* under-build into `DeferredDecisions`, a deferred plan item, or `triage:defer` — those surfaces mean undecided or out-of-scope, not dual-path delivery
|
|
118
|
+
- ⊗ Treating rapid prototype **graduate** as Graduation dual-path tracking inside a normal production build
|
|
119
|
+
|
|
120
|
+
### Lifecycle: Now complete ≠ Later closed
|
|
121
|
+
|
|
122
|
+
- ! `task scope:complete` on the Now story MUST NOT imply closure of linked graduation work (`graduationRef` issue and/or Later scope xBRIEF stay open until Later ships or is explicitly cancelled)
|
|
123
|
+
- ⊗ Closing a graduation ticket solely because the MVP / Now story completed
|
|
124
|
+
- ~ Wave A (soft): when completing a story whose `LockedDecisions` contain an open graduation, warn and audit if `graduationRef` is missing or invalid — hard fail / policy flag is Wave B follow-on
|
|
125
|
+
- ! Durable surfaces for graduation are: (1) strategy output narratives (this contract), (2) optional always-loadable ProjectRules for stricter consumer policy — ⊗ Cursor-rule-only as the sole persistence path
|
|
126
|
+
|
|
88
127
|
---
|
|
89
128
|
|
|
90
129
|
## Then: Chaining Gate
|
|
@@ -115,7 +154,7 @@ run additional preparatory strategies or proceed to spec generation.
|
|
|
115
154
|
|
|
116
155
|
1. **Open** -- Start with the user's goal statement; restate it in your own words
|
|
117
156
|
2. **Explore** -- Follow energy, challenge vagueness, ask domain-sensitive questions
|
|
118
|
-
3. **Lock** -- Record each decision in `vbrief/proposed/{scope}-context.vbrief.json` `LockedDecisions` narrative with what/why/alternatives
|
|
157
|
+
3. **Lock** -- Record each decision in `vbrief/proposed/{scope}-context.vbrief.json` `LockedDecisions` narrative with what/why/alternatives (and dual-path graduation fields when the lock is an under-build; #2899)
|
|
119
158
|
4. **Verify** -- Explain the full picture back to the user (Feynman check)
|
|
120
159
|
5. **Chain** -- Return to [interview.md Chaining Gate](./interview.md#chaining-gate), or -- if invoked from a standalone strategy (e.g. map's standalone next-step menu) -- return to the invoking strategy's menu per the [standalone-context rule](#then-chaining-gate) above
|
|
121
160
|
|
package/strategies/interview.md
CHANGED
|
@@ -13,7 +13,7 @@ follow this strategy.
|
|
|
13
13
|
|
|
14
14
|
Legend (from RFC2119): !=MUST, ~=SHOULD, ≉=SHOULD NOT, ⊗=MUST NOT, ?=MAY.
|
|
15
15
|
|
|
16
|
-
**⚠️ See also**: [strategies/discuss.md](./discuss.md) | [strategies/yolo.md](./yolo.md) | [core/glossary.md](../glossary.md)
|
|
16
|
+
**⚠️ See also**: [strategies/discuss.md](./discuss.md) | [strategies/yolo.md](./yolo.md) | [strategies/artifact-guards.md](./artifact-guards.md) | [core/glossary.md](../glossary.md)
|
|
17
17
|
|
|
18
18
|
## When to Use
|
|
19
19
|
|
|
@@ -42,13 +42,37 @@ and wait for the user to choose before proceeding.
|
|
|
42
42
|
- ! After each completed preparatory strategy (recursive — the gate reappears)
|
|
43
43
|
- ! After the [Acceptance Gate](#acceptance-gate) when the user chooses "Revise" or "Switch"
|
|
44
44
|
|
|
45
|
+
### Brownfield Detector
|
|
46
|
+
|
|
47
|
+
Before rendering menu options, classify the repo (align with setup Phase 3):
|
|
48
|
+
|
|
49
|
+
- **Brownfield** when **either**:
|
|
50
|
+
- `PROJECT-DEFINITION` exists under `./xbrief/` or legacy `./vbrief/` (`PROJECT-DEFINITION.xbrief.json` or `PROJECT-DEFINITION.vbrief.json`), **or**
|
|
51
|
+
- any lifecycle folder (`proposed/`, `pending/`, `active/`, `completed/`, `cancelled/` under `xbrief/` or legacy `vbrief/`) has scope records
|
|
52
|
+
- **Greenfield** otherwise
|
|
53
|
+
|
|
54
|
+
! The detector MUST run on every Chaining Gate presentation.
|
|
55
|
+
⊗ Offer only the greenfield-framed **Proceed to specification** default on a brownfield repo.
|
|
56
|
+
⊗ Treat brownfield as a full create path without an explicit Replace/scrap confirm.
|
|
57
|
+
|
|
45
58
|
### Options
|
|
46
59
|
|
|
47
|
-
|
|
48
|
-
|
|
60
|
+
! Numbered Chaining Gate menus (greenfield and brownfield examples below) MUST end with `Discuss` and `Back` as the final two options per [deterministic-questions.md](../contracts/deterministic-questions.md).
|
|
61
|
+
|
|
62
|
+
Present groups sourced from the `Type` column in
|
|
63
|
+
[strategies/README.md](./README.md#strategy-types). The **default path** depends
|
|
64
|
+
on the brownfield detector:
|
|
65
|
+
|
|
66
|
+
**Default path (greenfield):**
|
|
67
|
+
1. **Proceed to specification** (default) — continue to the [Sizing Gate](#sizing-gate) for a full create path
|
|
49
68
|
|
|
50
|
-
**Default:**
|
|
51
|
-
1. **
|
|
69
|
+
**Default path (brownfield) — create-vs-update menu:**
|
|
70
|
+
1. **Add scope to this project** (default) — load existing project identity + preparatory artifacts; **skip** the greenfield "what are we building?" interview; gather only the new scope; emit **one** proposed scope record; apply the [Preparatory Guard](./artifact-guards.md#preparatory-guard-light) on write
|
|
71
|
+
2. **Update project definition** — run a **delta** interview against existing identity; apply the [Spec-Generating Guard](./artifact-guards.md#spec-generating-guard-full); **merge** narratives (prefer enrich/merge when the user declines replace)
|
|
72
|
+
3. **Replace specification (scrap)** — full recreate equivalent to greenfield Proceed; **only** after explicit affirmative (`yes` / `confirmed`); vague replies (`proceed`, `ok`, `go ahead`) are **not** acceptance
|
|
73
|
+
- ! On confirmed scrap, continue to the [Sizing Gate](#sizing-gate) as a full create path
|
|
74
|
+
- ⊗ Auto-delete PROJECT-DEFINITION without scrap confirm
|
|
75
|
+
- ⊗ Rename Proceed to "Update" without changing behavior
|
|
52
76
|
|
|
53
77
|
**Preparatory strategies** (type: `preparatory` — loops back to this gate on completion):
|
|
54
78
|
- Research — investigate the domain, find libraries, identify pitfalls
|
|
@@ -79,9 +103,28 @@ See `strategies/map.md` for standalone behavior.
|
|
|
79
103
|
- ! Append all new artifact paths to the flat `artifacts` array
|
|
80
104
|
- ! The next strategy and eventual spec generation MUST load all artifacts
|
|
81
105
|
listed in `plan.vbrief.json`
|
|
106
|
+
- ! On brownfield **Add scope** or **Update project definition**, load existing
|
|
107
|
+
PROJECT-DEFINITION identity and preparatory artifacts before asking questions
|
|
108
|
+
|
|
109
|
+
### Write Guards (interview)
|
|
110
|
+
|
|
111
|
+
! Interview is a **spec-generating** strategy and MUST follow
|
|
112
|
+
[artifact-guards.md](./artifact-guards.md) before emission (Light or Full path).
|
|
113
|
+
|
|
114
|
+
- ! **Before writing** scope records to `proposed/`: [Preparatory Guard](./artifact-guards.md#preparatory-guard-light) (xbrief-first: `./xbrief/proposed/`, else legacy `./vbrief/proposed/`)
|
|
115
|
+
- ! **Before writing** or updating `PROJECT-DEFINITION`: [Spec-Generating Guard](./artifact-guards.md#spec-generating-guard-full) against the **single live** identity file only — `./xbrief/PROJECT-DEFINITION.xbrief.json` when present (or after `deft migrate:xbrief`); else, until migrated, the existing legacy `./vbrief/PROJECT-DEFINITION.vbrief.json`. ⊗ Dual-write both roots
|
|
116
|
+
- ! Prefer enrich/merge when the user declines replace
|
|
117
|
+
- ⊗ Silently overwrite PROJECT-DEFINITION or same-slug proposed scopes
|
|
118
|
+
- ⊗ Guard only the legacy `vbrief/` path while an `xbrief/` PROJECT-DEFINITION is the live identity
|
|
119
|
+
- ⊗ Rely on write-time guards alone without the brownfield Chaining Gate menu above
|
|
120
|
+
|
|
121
|
+
Surface this obligation **inside `interview.md`** so agents that load only this
|
|
122
|
+
file still hit the guards (#2925; incomplete closeout of #82/#387).
|
|
82
123
|
|
|
83
124
|
### Example Prompt
|
|
84
125
|
|
|
126
|
+
**Greenfield:**
|
|
127
|
+
|
|
85
128
|
```
|
|
86
129
|
Ready to generate the specification. Before we proceed, would you like to:
|
|
87
130
|
|
|
@@ -96,8 +139,32 @@ Ready to generate the specification. Before we proceed, would you like to:
|
|
|
96
139
|
--- Switch strategy ---
|
|
97
140
|
6. Switch to yolo — auto-pilot picks all answers
|
|
98
141
|
7. Switch to speckit — formal spec process with story readiness before implementation
|
|
99
|
-
|
|
100
142
|
8. Other (specify)
|
|
143
|
+
9. Discuss
|
|
144
|
+
10. Back
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
**Brownfield:**
|
|
148
|
+
|
|
149
|
+
```
|
|
150
|
+
This repo already has a project definition and/or scopes. Before we proceed:
|
|
151
|
+
|
|
152
|
+
1. Add scope to this project (default) — keep identity; add one new proposed scope
|
|
153
|
+
2. Update project definition — delta interview; merge narratives (Spec-Generating Guard)
|
|
154
|
+
3. Replace specification (scrap) — requires explicit yes/confirmed; full recreate
|
|
155
|
+
|
|
156
|
+
--- Preparatory (loops back) ---
|
|
157
|
+
4. Run a research phase — investigate the domain, find libraries, identify pitfalls
|
|
158
|
+
5. Run a discuss phase — lock key decisions using Feynman technique
|
|
159
|
+
6. Run a probe phase — adversarially stress-test the plan; surface assumptions, edge cases, and risks
|
|
160
|
+
7. Run a map phase — analyze existing codebase conventions
|
|
161
|
+
|
|
162
|
+
--- Switch strategy ---
|
|
163
|
+
8. Switch to yolo — auto-pilot picks all answers
|
|
164
|
+
9. Switch to speckit — formal spec process with story readiness before implementation
|
|
165
|
+
10. Other (specify)
|
|
166
|
+
11. Discuss
|
|
167
|
+
12. Back
|
|
101
168
|
```
|
|
102
169
|
|
|
103
170
|
---
|
|
@@ -188,19 +255,22 @@ flowchart LR
|
|
|
188
255
|
|
|
189
256
|
## Light Path (small/medium projects)
|
|
190
257
|
|
|
191
|
-
Interview → scope
|
|
258
|
+
Interview → scope records (date-prefixed in proposed/) + live PROJECT-DEFINITION + rendered SPECIFICATION (v0.20 contract). Paths are **xbrief-first**: use `./xbrief/` when that root is the live project layout; else legacy `./vbrief/`.
|
|
192
259
|
|
|
193
260
|
### Flow
|
|
194
261
|
|
|
195
262
|
1. Sizing gate selects Light
|
|
196
263
|
2. Interview (rules above)
|
|
197
|
-
3. Write scope
|
|
198
|
-
4. Run `task project:render` to create/update `./
|
|
264
|
+
3. Write scope record(s) to the live lifecycle root — `./xbrief/proposed/YYYY-MM-DD-<slug>.xbrief.json` when `./xbrief/` is live; else legacy `./vbrief/proposed/YYYY-MM-DD-<slug>.vbrief.json` — date-prefixed with `status: proposed`
|
|
265
|
+
4. Run `task project:render` to create/update the **live** PROJECT-DEFINITION under the resolved layout root (`./xbrief/PROJECT-DEFINITION.xbrief.json`). Engine layout resolution requires `xbrief/` (#2112); if the repo is legacy-only `./vbrief/`, run `deft migrate:xbrief` first, then render. Ensure all five lifecycle folders exist under the live root. ⊗ Write a second PROJECT-DEFINITION under legacy `vbrief/` when `xbrief/` is live
|
|
199
266
|
5. Summarize decisions, ask user to review
|
|
200
|
-
6. On approval, use `task scope:promote` (or equivalent) to move scope
|
|
201
|
-
7. Run `task spec:render` (SPECIFICATION.md is a rendered derivative with deprecation sentinel; `specification.vbrief.json`
|
|
267
|
+
6. On approval, use `task scope:promote` (or equivalent) to move scope record(s) to `pending/` under the **same** live root with `status: pending` / `approved`
|
|
268
|
+
7. Run `task project:export-spec` / `task spec:render` as appropriate (SPECIFICATION.md is a rendered derivative with deprecation sentinel; `specification.vbrief.json` / `specification.xbrief.json` are legacy and are NOT written by this strategy on the v0.20 path)
|
|
202
269
|
|
|
203
|
-
!
|
|
270
|
+
! **Before writing** scope records or updating `PROJECT-DEFINITION` on the Light path, follow [artifact-guards.md](./artifact-guards.md): Preparatory Guard for `proposed/` scopes; Spec-Generating Guard against the **live** identity file (xbrief-first). Prefer enrich/merge when the user declines replace.
|
|
271
|
+
! ⊗ Write a second PROJECT-DEFINITION under legacy `vbrief/` when `./xbrief/PROJECT-DEFINITION.xbrief.json` is already the live identity.
|
|
272
|
+
|
|
273
|
+
! At the emission step (step 3 above), after writing the scope record(s) to the live `proposed/`, surface the GitHub-issue tracking hint from [emit-hints.md](./emit-hints.md) — name all three patterns (none / `--umbrella` / `--per-vbrief`).
|
|
204
274
|
|
|
205
275
|
### SPECIFICATION Structure (Light)
|
|
206
276
|
|
|
@@ -252,20 +322,23 @@ How to ship it.
|
|
|
252
322
|
|
|
253
323
|
## Full Path (large/complex projects)
|
|
254
324
|
|
|
255
|
-
Interview → PRD → scope
|
|
325
|
+
Interview → PRD → scope records (date-prefixed in proposed/) + live PROJECT-DEFINITION + rendered SPECIFICATION (v0.20 contract). Paths are **xbrief-first**: use `./xbrief/` when that root is the live project layout; else legacy `./vbrief/`.
|
|
256
326
|
|
|
257
327
|
### Flow
|
|
258
328
|
|
|
259
329
|
1. Sizing gate selects Full
|
|
260
330
|
2. Interview (rules above)
|
|
261
331
|
3. Generate `PRD.md` — user approval gate
|
|
262
|
-
4. Write scope
|
|
263
|
-
5. Run `task project:render` to create/update `./
|
|
332
|
+
4. Write scope record(s) to the live lifecycle root — `./xbrief/proposed/YYYY-MM-DD-<slug>.xbrief.json` when `./xbrief/` is live; else legacy `./vbrief/proposed/YYYY-MM-DD-<slug>.vbrief.json` — date-prefixed with `status: proposed`
|
|
333
|
+
5. Run `task project:render` to create/update the **live** PROJECT-DEFINITION under the resolved layout root (`./xbrief/PROJECT-DEFINITION.xbrief.json`). Engine layout resolution requires `xbrief/` (#2112); if the repo is legacy-only `./vbrief/`, run `deft migrate:xbrief` first, then render. Ensure all five lifecycle folders exist under the live root. ⊗ Write a second PROJECT-DEFINITION under legacy `vbrief/` when `xbrief/` is live
|
|
264
334
|
6. Summarize decisions, ask user to review
|
|
265
|
-
7. On approval, use `task scope:promote` (or equivalent) to move scope
|
|
266
|
-
8. Run `task spec:render` (SPECIFICATION.md is a rendered derivative with deprecation sentinel; `specification.vbrief.json`
|
|
335
|
+
7. On approval, use `task scope:promote` (or equivalent) to move scope record(s) to `pending/` under the **same** live root with `status: pending` / `approved`
|
|
336
|
+
8. Run `task project:export-spec` / `task spec:render` as appropriate (SPECIFICATION.md is a rendered derivative with deprecation sentinel; `specification.vbrief.json` / `specification.xbrief.json` are legacy and are NOT written by this strategy on the v0.20 path)
|
|
337
|
+
|
|
338
|
+
! **Before writing** PRD, scope records, or updating `PROJECT-DEFINITION` on the Full path, follow [artifact-guards.md](./artifact-guards.md): Preparatory Guard for `proposed/` scopes; Spec-Generating Guard against the **live** identity file (xbrief-first). Prefer enrich/merge when the user declines replace.
|
|
339
|
+
! ⊗ Write a second PROJECT-DEFINITION under legacy `vbrief/` when `./xbrief/PROJECT-DEFINITION.xbrief.json` is already the live identity.
|
|
267
340
|
|
|
268
|
-
! At the emission step (step 4 above), after writing the scope
|
|
341
|
+
! At the emission step (step 4 above), after writing the scope record(s) to the live `proposed/`, surface the GitHub-issue tracking hint from [emit-hints.md](./emit-hints.md) — name all three patterns (none / `--umbrella` / `--per-vbrief`).
|
|
269
342
|
|
|
270
343
|
### PRD Structure (Full path only)
|
|
271
344
|
|
|
@@ -417,9 +490,9 @@ Each task SHOULD include:
|
|
|
417
490
|
|
|
418
491
|
- ! All requirements mapped to tasks
|
|
419
492
|
- ! Dependencies form a valid DAG (no cycles)
|
|
420
|
-
- ! Scope
|
|
421
|
-
- ! `./
|
|
422
|
-
- ! `SPECIFICATION.md` has been rendered via
|
|
493
|
+
- ! Scope records exist in the live `proposed/` root (`./xbrief/proposed/` when live; else legacy `./vbrief/proposed/`) with date-prefixed filenames and `status: "proposed"`, or promoted to pending/active (with `status: "approved" / "pending"`)
|
|
494
|
+
- ! Live PROJECT-DEFINITION is present (`./xbrief/PROJECT-DEFINITION.xbrief.json` when that is the identity; else legacy `./vbrief/PROJECT-DEFINITION.vbrief.json`) populated via `task project:render`
|
|
495
|
+
- ! `SPECIFICATION.md` has been rendered via export/`task spec:render`
|
|
423
496
|
- ! Proceed to [Acceptance Gate](#acceptance-gate)
|
|
424
497
|
|
|
425
498
|
---
|
|
@@ -517,20 +590,20 @@ diff only on the second pass or when the user explicitly asks for it.
|
|
|
517
590
|
|
|
518
591
|
| Artifact | Purpose | Created By |
|
|
519
592
|
|----------|---------|------------|
|
|
520
|
-
| `./vbrief/proposed/YYYY-MM-DD-*.vbrief.json` | Scope story
|
|
521
|
-
| `./vbrief/PROJECT-DEFINITION.vbrief.json` | Project identity gestalt + items registry | `task project:render` (triggered by strategy) |
|
|
522
|
-
| `SPECIFICATION.md` | Generated plan with embedded Requirements (rendered derivative; deprecation sentinel) | `task spec:render` |
|
|
523
|
-
| (no `specification
|
|
593
|
+
| `./xbrief/proposed/YYYY-MM-DD-*.xbrief.json` (else legacy `./vbrief/proposed/YYYY-MM-DD-*.vbrief.json`) | Scope story records (date-prefixed, v0.20 contract) | Interview |
|
|
594
|
+
| `./xbrief/PROJECT-DEFINITION.xbrief.json` (else legacy `./vbrief/PROJECT-DEFINITION.vbrief.json`) | Project identity gestalt + items registry | `task project:render` (triggered by strategy) |
|
|
595
|
+
| `SPECIFICATION.md` | Generated plan with embedded Requirements (rendered derivative; deprecation sentinel) | export / `task spec:render` |
|
|
596
|
+
| (no `specification.*.json`) | Legacy artifact — omitted on v0.20 path | — |
|
|
524
597
|
|
|
525
598
|
**Full path:**
|
|
526
599
|
|
|
527
600
|
| Artifact | Purpose | Created By |
|
|
528
601
|
|----------|---------|------------|
|
|
529
602
|
| `PRD.md` | What to build (approval gate) | Interview |
|
|
530
|
-
| `./vbrief/proposed/YYYY-MM-DD-*.vbrief.json` | Scope story
|
|
531
|
-
| `./vbrief/PROJECT-DEFINITION.vbrief.json` | Project identity gestalt + items registry | `task project:render` (triggered by strategy) |
|
|
532
|
-
| `SPECIFICATION.md` | Generated implementation plan (rendered derivative; deprecation sentinel) | `task spec:render` |
|
|
533
|
-
| (no `specification
|
|
603
|
+
| `./xbrief/proposed/YYYY-MM-DD-*.xbrief.json` (else legacy `./vbrief/proposed/YYYY-MM-DD-*.vbrief.json`) | Scope story records (date-prefixed, v0.20 contract) | Post-PRD interview |
|
|
604
|
+
| `./xbrief/PROJECT-DEFINITION.xbrief.json` (else legacy `./vbrief/PROJECT-DEFINITION.vbrief.json`) | Project identity gestalt + items registry | `task project:render` (triggered by strategy) |
|
|
605
|
+
| `SPECIFICATION.md` | Generated implementation plan (rendered derivative; deprecation sentinel) | export / `task spec:render` |
|
|
606
|
+
| (no `specification.*.json`) | Legacy artifact — omitted on v0.20 path | — |
|
|
534
607
|
|
|
535
608
|
## Invoking This Strategy
|
|
536
609
|
|
|
@@ -547,5 +620,5 @@ Use the interview strategy to plan [project].
|
|
|
547
620
|
After completion:
|
|
548
621
|
|
|
549
622
|
```
|
|
550
|
-
implement the scope
|
|
623
|
+
implement the scope records in ./xbrief/active/ (or legacy ./vbrief/active/)
|
|
551
624
|
```
|