@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.
Files changed (45) hide show
  1. package/.agents/skills/deft-directive-swarm/SKILL.md +1 -996
  2. package/QUICK-START.md +6 -0
  3. package/Taskfile.yml +3 -1
  4. package/UPGRADING.md +24 -2
  5. package/coding/coding.md +5 -1
  6. package/commands.md +1 -1
  7. package/contracts/runtime-authority.md +34 -8
  8. package/conventions/references.md +1 -1
  9. package/docs/getting-started.md +6 -0
  10. package/docs/no-deft-directive.md +87 -0
  11. package/docs/openclaw-agent-host.md +170 -0
  12. package/docs/product-signal.md +2 -0
  13. package/docs/writing-ste100.md +53 -0
  14. package/glossary.md +37 -39
  15. package/package.json +2 -1
  16. package/packs/rules/rules-pack-0.1.json +25 -1
  17. package/packs/skills/skills-pack-0.1.json +5 -5
  18. package/packs/strategies/strategies-pack-0.1.json +4 -4
  19. package/skills/deft-directive-review-cycle/SKILL.md +116 -14
  20. package/skills/deft-directive-setup/SKILL.md +35 -8
  21. package/skills/deft-directive-swarm/SKILL.md +81 -956
  22. package/skills/deft-directive-swarm/references/core-ops.md +144 -0
  23. package/skills/deft-directive-swarm/references/core-phase-0.md +200 -0
  24. package/skills/deft-directive-swarm/references/core-phase-1-2.md +73 -0
  25. package/skills/deft-directive-swarm/references/core-phase-3.md +145 -0
  26. package/skills/deft-directive-swarm/references/core-phase-4.md +71 -0
  27. package/skills/deft-directive-swarm/references/core-phase-5-6.md +317 -0
  28. package/skills/deft-directive-swarm/references/host-cursor.md +25 -0
  29. package/skills/deft-directive-swarm/references/host-generic.md +27 -0
  30. package/skills/deft-directive-swarm/references/host-grok-build.md +37 -0
  31. package/skills/deft-directive-swarm/references/host-openclaw.md +70 -0
  32. package/skills/deft-directive-swarm/references/host-warp.md +37 -0
  33. package/skills/deft-directive-triage/SKILL.md +40 -55
  34. package/skills/deft-directive-write-skill/SKILL.md +17 -0
  35. package/strategies/artifact-guards.md +24 -14
  36. package/strategies/discuss.md +40 -1
  37. package/strategies/interview.md +103 -30
  38. package/strategies/probe.md +27 -1
  39. package/tasks/engine-invoke.cjs +69 -13
  40. package/tasks/engine-invoke.test.cjs +188 -0
  41. package/tasks/triage-queue.yml +1 -1
  42. package/tasks/verify.yml +19 -0
  43. package/templates/agent-prompt-preamble.md +16 -5
  44. package/templates/swarm-greptile-poller-prompt.md +21 -12
  45. 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 (idempotent, TTL-aware, re-applies the #883 scanner v2 quarantine rules); `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 compare cached `meta.json.fetched_at` against live upstream `updatedAt` and surface drift before the queue is rendered.
55
- 4. ~ When the one-liner emitted by the session-start ritual carries a `[scope-drift] N` segment (D14 / #1133), run `task triage:scope-drift` to see the per-label / per-milestone breakdown of upstream signals on cached open issues that fall outside the active `plan.policy.triageScope[]` subscription. The output documents both opt-in (`task triage:subscribe -- --label=<L>`) and opt-out (`task triage:scope-drift -- --ignore-label=<L>`) paths -- pick one before walking the queue so the cohort reflects the operator's current intent rather than a stale subscription.
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 the effective universal + consumer auto-classification rules and the active hold-marker list.
63
- 2. ! Walk recent entries in `xbrief/.eval/candidates.jsonl` for anomalies: classifier disagreements against the operator's prior decisions, repeated `defer` cycles on the same issue, or `needs-ac` records older than the freshness window. Surface anomalies to the operator before Phase 2; do NOT auto-fix.
64
- 3. ~ When the operator wants to widen / narrow the corpus, consult `task triage:scope --list` (D12 / #1131) to see the active `plan.policy.triageScope[]` subscription. Subscription edits belong in PROJECT-DEFINITION.xbrief.json, not in this skill.
65
- 4. ~ Issue-label hygiene: labels feed triage queue ranking, issue gauges, hygiene sweeps, and lifecycle reconciliation. When this skill exposes an unlabeled issue or a downstream issue-creation step, recommend choosing one or more suitable labels from the repository's existing label set via `gh label list` or the labels API, or explicitly note that no label was applied. This is a recommendation, not a gate.
66
- 5. ⊗ Re-classify items already terminally decided (accept / reject / mark-duplicate) without explicit operator approval -- the audit log is append-only and supersession runs through Layer 5 (`task triage:reset <N>`), not through silent re-walks.
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` per the umbrella Current Shape v3 WIP cap. Output is grouped `[RESUME]` -> `[URGENT]` -> untriaged -> other; within-group ordering follows the consumer-supplied `plan.policy.triageRankingLabels[]` (framework default empty per §12 boundary), tiebroken by `updated_at` descending.
74
- 2. ! For per-item detail, run `task triage:show <N>` -- prints the cached upstream payload, the latest triage decision, the audit timeline, and the active-xBRIEF reference flag. Exit 0 on hit, 1 on cache miss (re-sync per Phase 0).
75
- 3. ~ Present the ranked queue verbatim; do NOT silently re-rank, drop, or annotate beyond what the canonical renderer emits. If the operator wants a different ordering they edit `plan.policy.triageRankingLabels[]` and re-run.
76
- 4. ⊗ Recommend a specific issue without consulting `task triage:queue` first, or recommend an issue absent from the queue without first running `task triage:show` to surface why (cache miss / outside subscription / terminal decision).
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. The skill does NOT reimplement the audit-log append, schema validation, or `xbrief/proposed/` write inline -- the tasks are the canonical implementation (mirrors the #537 ingest-task discipline).
79
+ ! Walk per-item decisions through the canonical `task triage:*` verbs (tasks own audit-log append / schema / `xbrief/proposed/` write).
81
80
 
82
- For each candidate the operator selects from the Phase 2 queue, render the canonical numbered action menu and dispatch the matching verb:
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>` (writes proposed/ xBRIEF + audit-log entry)
87
- 2. Reject -- `task triage:reject <N>` (audit-log entry only; terminal)
88
- 3. Defer -- `task triage:defer <N> [--resume-on <event>]` (non-terminal; resurfaces)
89
- 4. Needs-AC -- `task triage:needs-ac <N>` (non-terminal; flags missing acceptance criteria)
90
- 5. Mark duplicate -- `task triage:mark-duplicate <N> <of-issue>` (terminal; cross-links target)
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 the action sequence immediately, prompt `What would you like to discuss?`, and resume only on an explicit user signal. ⊗ Implicit resumption.
98
- - ! On `Back`, un-buffer the prior candidate's selection and re-render its action menu -- permitted only before the action has dispatched to a `task triage:*` command. Once dispatched, the audit entry is committed; revisions go through Layer 5 (`task triage:reset`).
99
- - ~ Bulk patterns: `task triage:bulk-{accept,reject,defer,needs-ac}` (#845 Story 4) for clear label-driven sweeps; bulk results still flow through the audit log so history stays coherent.
100
- - ⊗ Write to `xbrief/proposed/` directly -- only `task triage:accept` (which delegates to `task issue:ingest`) is authorised for that surface.
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) -- emits the stable `{generated_at, repo, vbrief_staleness, entry_count, entries: [...]}` schema; pipe through `jq` to surface this session's appended entries. For historical look-back, add the #1180 filters: `task triage:audit --since=30d --action=demote --format=json | jq` answers "how many demotes in the last 30 days?" in one call. `--since=<window>` accepts the framework duration grammar (`Nd` / `Nh` / `Nm` / `Nw` / `Ns` or ISO-8601 `PnDTnHnMnS`); `--action=<verb>` filters to a single decision verb (`accept` / `reject` / `defer` / `needs-ac` / `mark-duplicate` / `reset` / `resume-eligible`). Both filters compose with `--format=text` and `--format=json`. The framework deliberately does NOT compute trend lines or apply falsification gates -- the contract is read raw, transform with `jq`.
107
- 2. ! Run `task triage:summary` (D2 / #1122) -- prints the canonical one-liner `[triage] N untriaged · S stale-defer · M in-flight · WIP X/Y [⚠] [· [scope-drift] N]`. The WIP cap default is 20 per #2319, raised from the original 10 per the umbrella Current Shape v3 (overridable via typed `plan.policy.wipCap`). The `⚠` glyph fires only at-or-above cap. The `[scope-drift] N` segment (D14 / #1133) appears only when at least one unsubscribed label/milestone meets the framework `_DRIFT_MIN_ISSUES = 3` threshold; suppressed at zero.
108
- 3. ~ When the summary surfaces a non-zero `[scope-drift] N` (D14 / #1133), surface it to the operator alongside `task triage:scope-drift` output and the matching `task triage:subscribe` / `task triage:unsubscribe` / `task triage:scope-drift -- --ignore-label=<L>` remediation. Subscription mutations record a `subscription-change` audit entry under `xbrief/.eval/subscription-history.jsonl` (sidecar of the existing `candidates.jsonl` audit surface) so future operators can replay how the subscription evolved. After every mutation, run `task triage:bootstrap -- --resume` to backfill newly-subscribed entries / mark newly-out-of-scope entries.
109
- 4. ~ When the audit surfaces a stale acceptance (`accept` decision whose issue is no longer referenced by any `xbrief/active/`), surface it to the operator -- the typical fix is a fresh ingest via `task issue:ingest -- <N>` or a `task triage:reset <N>` if the acceptance was in error.
110
- 5. ⊗ Skip the Phase 4 audit -- silent exit leaves the operator without a record of what landed in `xbrief/proposed/` this session, which is the typical recurrence vector for "what did I just accept?" confusion.
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
- ! To undo a decision, run `task triage:reset <N>`. This writes a `reset` audit entry referencing the prior decision id; history is **never** deleted. `task triage:reset` is the canonical Layer 5 reversibility verb (resolves the V3 audit from 2026-05-13). After a reset, the candidate re-enters the untriaged group on the next `task triage:queue` render so it can be re-walked through Phase 3.
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 a specific issue without first consulting `task triage:queue` (binding under AGENTS.md `## Cache-as-authoritative work selection (#1149)`).
123
- - ⊗ Conclude "nothing to do" from `xbrief/{pending,active}` scans or live GitHub reads alone — `task triage:queue` is the ranked superset (#2576).
124
- - ⊗ Walk the queue against a stale cache (Phase 0 gate skipped).
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
- ! When the operator opts out (queue exhausted, mid-session stop, or explicit "done"), confirm skill exit with the canonical phrasing: `deft-directive-triage complete -- exiting skill.`
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
- - Umbrella: #1119 (Wave-1 D6, this skill)
144
- - D2 #1122 (`task triage:summary`), D3 #1123 (`--resume-on`, parallel), D5 #1127 (`task verify:cache-fresh`), D10 #1129 (auto-classification), D11 #1128 (`task triage:queue` / `triage:show` / `triage:audit`), D12 #1131 (subscription scope)
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 to `PROJECT-DEFINITION.vbrief.json` (⊗ never `specification.vbrief.json` per [v0-20-contract.md](./v0-20-contract.md)): **speckit**, **enterprise**, **rapid**.
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
- ! Before writing to `vbrief/PROJECT-DEFINITION.vbrief.json`, the strategy MUST perform the following checks (⊗ Never target the legacy `specification.vbrief.json`):
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
- 1. ! **Check existence**: Does the target file already exist?
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.vbrief.json`, 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.
55
- - ⊗ Overwrite all `PROJECT-DEFINITION.vbrief.json` narratives when the strategy only produces a single narrative key
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 vBRIEFs to `vbrief/proposed/`: **bdd**, **discuss**, **research**, **map**.
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 vBRIEF to `vbrief/proposed/`, the strategy MUST check for existing files with the same scope or feature name:
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 `vbrief/proposed/` for files matching the target scope/feature slug (e.g. `*-{feature}-bdd.vbrief.json`, `*-{scope}-context.vbrief.json`).
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 vBRIEF for this scope already exists at `{path}`. Replace it, or create a new version? (replace/new)"
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 vBRIEF with the same feature/scope name without warning the user.
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.vbrief.json` without checking the file's current status (⊗ never write `specification.vbrief.json` at all per v0-20-contract.md)
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.vbrief.json` narratives when the strategy only contributes one narrative key (e.g. `Principles`)
84
- - ⊗ Overwriting a scope vBRIEF in `vbrief/proposed/` without checking if one already exists for the same 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
@@ -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
 
@@ -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
- Present two groups sourced from the `Type` column in
48
- [strategies/README.md](./README.md#strategy-types):
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. **Proceed to specification** (default) — continue to the [Sizing Gate](#sizing-gate)
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 vBRIEFs (date-prefixed in proposed/) + PROJECT-DEFINITION.vbrief.json + rendered SPECIFICATION (v0.20 contract).
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 vBRIEF(s) to `./vbrief/proposed/YYYY-MM-DD-<slug>.vbrief.json` (date-prefixed per vbrief filename convention) with `status: proposed`
198
- 4. Run `task project:render` to create/update `./vbrief/PROJECT-DEFINITION.vbrief.json` (full project identity + items registry) and ensure all five lifecycle folders exist
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 vBRIEF(s) to `./vbrief/pending/` with `status: pending` / `approved`
201
- 7. Run `task spec:render` (SPECIFICATION.md is a rendered derivative with deprecation sentinel; `specification.vbrief.json` is legacy and is NOT written by this strategy on the v0.20 path)
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
- ! At the emission step (step 3 above), after writing the scope vBRIEF(s) to `./vbrief/proposed/`, surface the GitHub-issue tracking hint from [emit-hints.md](./emit-hints.md) name all three patterns (none / `--umbrella` / `--per-vbrief`).
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 vBRIEFs (date-prefixed in proposed/) + PROJECT-DEFINITION.vbrief.json + rendered SPECIFICATION (v0.20 contract).
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 vBRIEF(s) to `./vbrief/proposed/YYYY-MM-DD-<slug>.vbrief.json` (date-prefixed per vbrief filename convention) with `status: proposed`
263
- 5. Run `task project:render` to create/update `./vbrief/PROJECT-DEFINITION.vbrief.json` (full project identity + items registry) and ensure all five lifecycle folders exist
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 vBRIEF(s) to `./vbrief/pending/` with `status: pending` / `approved`
266
- 8. Run `task spec:render` (SPECIFICATION.md is a rendered derivative with deprecation sentinel; `specification.vbrief.json` is legacy and is NOT written by this strategy on the v0.20 path)
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 vBRIEF(s) to `./vbrief/proposed/`, surface the GitHub-issue tracking hint from [emit-hints.md](./emit-hints.md) — name all three patterns (none / `--umbrella` / `--per-vbrief`).
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 vBRIEF(s) exist in `./vbrief/proposed/` (with date-prefixed filenames and `status: "proposed"`) or promoted to pending/active (with `status: "approved" / "pending"`)
421
- - ! `./vbrief/PROJECT-DEFINITION.vbrief.json` is present (populated via `task project:render`)
422
- - ! `SPECIFICATION.md` has been rendered via `task spec:render`
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 vBRIEFs (date-prefixed, v0.20 contract) | Interview |
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.vbrief.json`) | Legacy artifact — omitted on v0.20 path | — |
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 vBRIEFs (date-prefixed, v0.20 contract) | Post-PRD interview |
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.vbrief.json`) | Legacy artifact — omitted on v0.20 path | — |
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 vBRIEFs in ./vbrief/active/
623
+ implement the scope records in ./xbrief/active/ (or legacy ./vbrief/active/)
551
624
  ```