@deftai/directive-content 0.105.0 → 0.107.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/Taskfile.yml +13 -0
- package/UPGRADING.md +4 -4
- package/commands.md +22 -14
- package/contracts/agent-hook-readiness.md +3 -3
- package/contracts/closed-verb-authz.md +14 -2
- package/contracts/design-critique.md +354 -0
- package/contracts/issue-eval.md +77 -0
- package/contracts/path-write-fence.md +126 -1
- package/contracts/runtime-authority.md +2 -0
- package/contracts/scm-readiness.md +2 -2
- package/docs/scope-provenance.md +1 -1
- package/main.md +1 -1
- package/package.json +1 -1
- package/packs/skills/skills-pack-0.1.json +35 -7
- package/packs/strategies/strategies-pack-0.1.json +13 -13
- package/scm/github.md +35 -2
- package/skills/deft-directive-build/SKILL.md +1 -1
- package/skills/deft-directive-design-critique/SKILL.md +55 -0
- package/skills/deft-directive-feedback/SKILL.md +11 -2
- package/skills/deft-directive-issue-eval/SKILL.md +48 -0
- package/skills/deft-directive-probe/SKILL.md +4 -2
- package/skills/deft-directive-release/SKILL.md +5 -3
- package/skills/deft-directive-review-cycle/SKILL.md +1 -1
- package/skills/deft-directive-swarm/SKILL.md +1 -1
- package/skills/deft-directive-triage/SKILL.md +3 -2
- package/strategies/README.md +4 -4
- package/strategies/bdd.md +6 -6
- package/strategies/discuss.md +8 -8
- package/strategies/emit-hints.md +6 -6
- package/strategies/enterprise.md +18 -18
- package/strategies/interview.md +4 -4
- package/strategies/map.md +6 -6
- package/strategies/probe.md +22 -18
- package/strategies/rapid.md +16 -16
- package/strategies/research.md +6 -6
- package/strategies/roadmap.md +1 -1
- package/strategies/speckit.md +52 -52
- package/strategies/v0-20-contract.md +21 -21
- package/strategies/yolo.md +12 -12
- package/tasks/engine.yml +2 -0
- package/tasks/feedback.yml +1 -1
- package/tasks/occupancy.yml +11 -0
- package/tasks/policy.yml +10 -0
- package/tasks/scm.yml +14 -2
- package/tasks/scope.yml +2 -2
- package/tasks/session.yml +11 -0
- package/tasks/triage-evaluate.yml +22 -0
- package/tasks/verify.yml +22 -2
- package/templates/agent-prompt-preamble.md +23 -6
- package/templates/agents-entry.md +6 -6
- package/templates/design-critique-brief.md +55 -0
package/scm/github.md
CHANGED
|
@@ -306,7 +306,11 @@ auth.
|
|
|
306
306
|
`--with-network` / `DEFT_SESSION_START_NETWORK=1`.
|
|
307
307
|
- ! `deft scm:status` (alias `scm:readiness`) is the explicit probe verb:
|
|
308
308
|
exit `0` ready / `1` not ready / `2` config. Flags: `--json`,
|
|
309
|
-
`--deep` / `--shallow` / `--depth shallow|deep
|
|
309
|
+
`--deep` / `--shallow` / `--depth shallow|deep`, `--repo OWNER/REPO`,
|
|
310
|
+
`--expected-login`.
|
|
311
|
+
Deep validation derives the target repository and compares an expected
|
|
312
|
+
user login when one is supplied (#3665). GitHub App installation identity
|
|
313
|
+
is deferred to #3693.
|
|
310
314
|
- ! When not ready, diagnostics MUST name the reason
|
|
311
315
|
(`binary-absent` | `missing-token` | `unauthenticated` | ...) and list
|
|
312
316
|
skipped gates (`triage:queue`, `issue:ingest`, `pr:*`, `reconcile:issues`,
|
|
@@ -373,6 +377,35 @@ Agent `edit_files` operations can fail when structured file sections contain Uni
|
|
|
373
377
|
|
|
374
378
|
**Mirror** (if using `triage:classify -- --mirror`): at least `triaged`; optional `triage:deferred` / `triage:archived` when `actionLabels` maps them
|
|
375
379
|
|
|
380
|
+
### Consumer hard-blocker (`adoption-blocker`)
|
|
381
|
+
|
|
382
|
+
**Framework source (`deftai/directive` only).** Consumer kits do not ship this label; see `.github/ISSUE_LABELS.md`.
|
|
383
|
+
|
|
384
|
+
**Positive-only:** the `adoption-blocker` label means the issue is *classified as a blocker*. Its absence means *not classified*. Absence never means a workaround exists.
|
|
385
|
+
|
|
386
|
+
This is the canonical ranking label for **a Directive consumer cannot complete an intended flow and has no reasonable workaround**. The range is install, first session, update, `task check`, and ship -- not onboarding alone. Do not invent a second ranking label for that class.
|
|
387
|
+
|
|
388
|
+
**Title classification (the one sanctioned exception, #3713):** `BLOCKER` in the title is permitted for this class, and is the **only** classification allowed in an issue title. Every other classification stays label-only. Reason: the filing population cannot apply labels -- GitHub requires push access to set them at issue creation. The token is an inbound flare; it never writes `adoption-blocker`. A privileged actor applies the label after the body-evidence test below. Absence of the token does not mean "not a blocker." `task feedback:file --blocker` is the consumer filing path that carries the token and this evidence.
|
|
389
|
+
|
|
390
|
+
**Classification test** (all must hold, and a second person must be able to check them from the body):
|
|
391
|
+
|
|
392
|
+
1. An intended consumer flow at a named version does not complete.
|
|
393
|
+
2. Documented alternatives were tried and failed, or are not a reasonable workaround.
|
|
394
|
+
3. Recovery cost is observed (time, lost work, or a stuck session), not inferred.
|
|
395
|
+
|
|
396
|
+
**Required body evidence** -- apply the label only when all four are present:
|
|
397
|
+
|
|
398
|
+
- affected consumer flow and version
|
|
399
|
+
- documented alternatives attempted, or why the documented alternatives are not a reasonable workaround
|
|
400
|
+
- observed recovery cost
|
|
401
|
+
- triage owner and date
|
|
402
|
+
|
|
403
|
+
**Upgrade path:** a hard stop on the upgrade flow is still a consumer hard stop. Apply `adoption-blocker` so it ranks. Also apply `Upgrade Blocker` as the upgrade-specific adjacent signal. `Upgrade Blocker` alone does not rank. A hard stop at `task check` or ship is `adoption-blocker` only.
|
|
404
|
+
|
|
405
|
+
**Not this label:** `status:blocked` means *this issue* waits on something else. `urgent` is priority; an issue may be `urgent` and still not a consumer hard stop.
|
|
406
|
+
|
|
407
|
+
**Ranking / display:** `plan.policy.triageRankingLabels` already lists `adoption-blocker` (after `blocks-merge` and `blocks-release-tag`). `triage:queue` prints `(label: adoption-blocker)` on matched rows. Confirm participation; do not add ranking code.
|
|
408
|
+
|
|
376
409
|
### Post-1.0.0 Issue Linking
|
|
377
410
|
|
|
378
411
|
Following a v1.0.0 release, commits:
|
|
@@ -503,7 +536,7 @@ Three consumer-facing surfaces enforce the branch-policy contract:
|
|
|
503
536
|
- `deft verify:branch` — refuses default-branch commit unless `plan.policy.allowDirectCommitsToMaster = true` (typed) or `DEFT_ALLOW_DEFAULT_BRANCH_COMMIT=1`.
|
|
504
537
|
- `.githooks/pre-commit` / `pre-push` — installed via `deft setup`; verify via `deft verify:hooks-installed`. After a framework upgrade, run `deft update` to refresh hook templates (#2049).
|
|
505
538
|
- `deft policy:show --field=allowDirectCommitsToMaster` — inspect policy; `deft policy:allow-direct-commits -- --confirm` writes typed override with audit row.
|
|
506
|
-
- `deft verify:forward-coverage` —
|
|
539
|
+
- `deft verify:forward-coverage` — fail-closed new-source-file existence (#1310) plus warn-first diff coverage of added/modified branches (#3514). Intersects `coverage/coverage-final.json` with the diff (90% per-change branch threshold). That 90% is not the 75 global floor. Wired into `deft check` + pre-commit (`--staged`); `--enforce` fail-closes the diff half; `--allow-list <path>` documents exceptions.
|
|
507
540
|
|
|
508
541
|
When `plan.policy.allowDirectCommitsToMaster = true`, the agent MUST surface at session start (after alignment confirmation):
|
|
509
542
|
|
|
@@ -494,7 +494,7 @@ feat(phase-2): add REST API endpoints with integration tests
|
|
|
494
494
|
|
|
495
495
|
## Completion
|
|
496
496
|
|
|
497
|
-
- ! When all phases pass and `task check` is green,
|
|
497
|
+
- ! When all phases pass and `task check` is green, run `task scope:complete -- <active-story-path>` only as the post-merge scope lifecycle in `templates/agent-prompt-preamble.md` §9 (AGENTS.md `#2321`) specifies for `drive-to: merge-ready` versus `stop-at: pr-open`. That section is the single statement of the ordering; this skill does not restate it.
|
|
498
498
|
|
|
499
499
|
> "The project is built and all quality checks pass. Describe any new features you'd like to add — I'll follow the deft standards we've set up."
|
|
500
500
|
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: deft-directive-design-critique
|
|
3
|
+
description: >-
|
|
4
|
+
Thin router for the design-critique motion: triggers and pointer stops into
|
|
5
|
+
the contract, including the operator-gated loop. Use when the operator asks
|
|
6
|
+
for a design critique, design-critique, critique panel, or mechanism-shaped
|
|
7
|
+
triage. Do NOT trigger on ordinary implement, build, or swarm work.
|
|
8
|
+
triggers:
|
|
9
|
+
- design critique
|
|
10
|
+
- design-critique
|
|
11
|
+
- critique panel
|
|
12
|
+
- mechanism-shaped triage
|
|
13
|
+
---
|
|
14
|
+
<!-- AUTO-GENERATED by task packs:render -- DO NOT EDIT MANUALLY -->
|
|
15
|
+
<!-- Purpose: rendered skill -->
|
|
16
|
+
<!-- Source of truth: packs/skills/skills-pack-0.1.json -->
|
|
17
|
+
<!-- Regenerate with: task packs:render -->
|
|
18
|
+
<!-- Edit the source, not this file. Slice instead of loading every SKILL.md: task packs:slice skills by-trigger --trigger <kw> (or list) -->
|
|
19
|
+
|
|
20
|
+
# Design Critique
|
|
21
|
+
|
|
22
|
+
Thin router into the design-critique contract. Operator dispatches from the brief template.
|
|
23
|
+
|
|
24
|
+
Legend (from RFC2119): !=MUST, ~=SHOULD, ≉=SHOULD NOT, ⊗=MUST NOT, ?=MAY.
|
|
25
|
+
|
|
26
|
+
## When to Use
|
|
27
|
+
|
|
28
|
+
- Operator asks for a design critique, a design-critique, a critique panel, or mechanism-shaped triage
|
|
29
|
+
- ⊗ Ordinary implement, build, or swarm work
|
|
30
|
+
|
|
31
|
+
## Stops
|
|
32
|
+
|
|
33
|
+
Normative rules live in [`contracts/design-critique.md`](../../contracts/design-critique.md). Fill [`templates/design-critique-brief.md`](../../templates/design-critique-brief.md) and dispatch from there. Phase 1 gate: [`docs/decisions/ADR-005-design-critique-judgment-gate.md`](../../../docs/decisions/ADR-005-design-critique-judgment-gate.md). Parent-audit principle: [`docs/decisions/ADR-006-parent-side-substantiation.md`](../../../docs/decisions/ADR-006-parent-side-substantiation.md).
|
|
34
|
+
|
|
35
|
+
1. Stop 1 — Gate
|
|
36
|
+
2. Stop 2 — Variant selection
|
|
37
|
+
3. Stop 3 — Critic envelope
|
|
38
|
+
4. Stop 4 — Residual reiteration
|
|
39
|
+
5. Stop 5 — Verified synthesis
|
|
40
|
+
|
|
41
|
+
Comment lead (model then role): Stop 3 — Critic envelope.
|
|
42
|
+
Operator-gated loop. Successor lean. Parent-side substantiation. Operator verbs. Dual stop. Halt line. Bind after accepted synthesis.
|
|
43
|
+
After critic post: posted successor lean, then verbs.
|
|
44
|
+
Auto-stamp after operator confirm; not while same-round siblings outstanding.
|
|
45
|
+
Walk / walk all. Auto-stamp when agents agree: Operator verbs.
|
|
46
|
+
Parent chip write: scm:issue:design-critique-chip.
|
|
47
|
+
|
|
48
|
+
Each critic dispatch EXITs after posting.
|
|
49
|
+
|
|
50
|
+
⊗ Auto-dispatch critics from this skill.
|
|
51
|
+
⊗ Copy the variant table, synthesis rules, or other contract bodies into this skill.
|
|
52
|
+
|
|
53
|
+
## EXIT
|
|
54
|
+
|
|
55
|
+
deft-directive-design-critique complete -- exiting skill. Next: fill the brief template and dispatch.
|
|
@@ -37,12 +37,19 @@ Legend (from RFC2119): !=MUST, ~=SHOULD, ≉=SHOULD NOT, ⊗=MUST NOT, ?=MAY.
|
|
|
37
37
|
- ! Batch multiple friction items into one upstream issue when they share a root cause; otherwise prepare separate drafts
|
|
38
38
|
- ~ Prefer attributed phrasing ("encoding gate blocked a valid file") over vague quality claims
|
|
39
39
|
|
|
40
|
+
## Phase 1.5 -- Adoption-blocker judgment
|
|
41
|
+
|
|
42
|
+
- ! Ask whether the gap blocks adoption. A gap blocks adoption when the consumer cannot complete an intended Directive flow and has no reasonable workaround.
|
|
43
|
+
- ! When the answer is yes, collect the body evidence a privileged actor needs before applying `adoption-blocker`: affected consumer flow and version; documented alternatives attempted, or why they are not a reasonable workaround; observed recovery cost. Pass `--blocker` (and `--flow`, `--alternatives`, `--recovery-cost` when known) so the title carries `BLOCKER` and the body carries those sections.
|
|
44
|
+
- ! When the answer is no or unknown, omit `--blocker`. Absence of the token does not mean "not a blocker" -- it means not classified.
|
|
45
|
+
- ⊗ Apply or request the `adoption-blocker` ranking label from a consumer-authored title. The label is a privileged write after the body-evidence test.
|
|
46
|
+
|
|
40
47
|
## Phase 2 -- Draft + dedup
|
|
41
48
|
|
|
42
49
|
- ! For each candidate report, run a dry draft:
|
|
43
50
|
|
|
44
51
|
```bash
|
|
45
|
-
task feedback:file -- --summary "<one-line summary>" --context "<session context>" --expected "<expected>" --actual "<actual>" --notes "<optional>"
|
|
52
|
+
task feedback:file -- --summary "<one-line summary>" --context "<session context>" --expected "<expected>" --actual "<actual>" --notes "<optional>" [--blocker --flow "<flow and version>" --alternatives "<alts>" --recovery-cost "<cost>"]
|
|
46
53
|
```
|
|
47
54
|
|
|
48
55
|
- ! Read the printed draft title/body with the operator before proceeding
|
|
@@ -55,7 +62,7 @@ task feedback:file -- --summary "<one-line summary>" --context "<session context
|
|
|
55
62
|
- ! Only after approval, re-run with `--confirm`:
|
|
56
63
|
|
|
57
64
|
```bash
|
|
58
|
-
task feedback:file -- --summary "<one-line summary>" --context "<session context>" --expected "<expected>" --actual "<actual>" --confirm
|
|
65
|
+
task feedback:file -- --summary "<one-line summary>" --context "<session context>" --expected "<expected>" --actual "<actual>" --confirm [--blocker]
|
|
59
66
|
```
|
|
60
67
|
|
|
61
68
|
- ! Print the filed issue URL to the operator
|
|
@@ -71,3 +78,5 @@ task feedback:file -- --summary "<one-line summary>" --context "<session context
|
|
|
71
78
|
- ⊗ Filing from the maintainer framework repo (consumer-only guard)
|
|
72
79
|
- ⊗ Skipping dedup review when the command reports an existing open issue
|
|
73
80
|
- ⊗ Treating `--confirm` as implicit from broad session approval -- require an explicit filing confirmation step
|
|
81
|
+
- ⊗ Infer "not a blocker" from an unmarked report -- absence of `BLOCKER` means not classified
|
|
82
|
+
- ⊗ Auto-apply `adoption-blocker` from a consumer-authored title
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: deft-directive-issue-eval
|
|
3
|
+
description: >-
|
|
4
|
+
Thin router for Stage A issue evaluation: isolated origin/master validity,
|
|
5
|
+
parent WIP census, named gitignored sink. Use when the operator asks to
|
|
6
|
+
evaluate issues, run issue-eval, or triage:evaluate. Do NOT trigger on
|
|
7
|
+
ordinary implement, build, swarm, or design-critique dispatch.
|
|
8
|
+
triggers:
|
|
9
|
+
- issue-eval
|
|
10
|
+
- issue eval
|
|
11
|
+
- triage:evaluate
|
|
12
|
+
- evaluate issues
|
|
13
|
+
---
|
|
14
|
+
<!-- AUTO-GENERATED by task packs:render -- DO NOT EDIT MANUALLY -->
|
|
15
|
+
<!-- Purpose: rendered skill -->
|
|
16
|
+
<!-- Source of truth: packs/skills/skills-pack-0.1.json -->
|
|
17
|
+
<!-- Regenerate with: task packs:render -->
|
|
18
|
+
<!-- Edit the source, not this file. Slice instead of loading every SKILL.md: task packs:slice skills by-trigger --trigger <kw> (or list) -->
|
|
19
|
+
|
|
20
|
+
# Issue Eval
|
|
21
|
+
|
|
22
|
+
Thin router into the issue-eval contract. Operator runs `task triage:evaluate`.
|
|
23
|
+
|
|
24
|
+
Legend (from RFC2119): !=MUST, ~=SHOULD, ≉=SHOULD NOT, ⊗=MUST NOT, ?=MAY.
|
|
25
|
+
|
|
26
|
+
## When to Use
|
|
27
|
+
|
|
28
|
+
- Operator asks to evaluate issues, run issue-eval, or `triage:evaluate`
|
|
29
|
+
- ⊗ Ordinary implement, build, swarm, or design-critique dispatch
|
|
30
|
+
|
|
31
|
+
## Stops
|
|
32
|
+
|
|
33
|
+
Normative rules live in [`contracts/issue-eval.md`](../../contracts/issue-eval.md).
|
|
34
|
+
|
|
35
|
+
1. Split read sources
|
|
36
|
+
2. Verdict sink
|
|
37
|
+
3. Evaluator worktrees
|
|
38
|
+
4. Value advice grammar
|
|
39
|
+
5. No GitHub writes
|
|
40
|
+
6. Fan-out
|
|
41
|
+
|
|
42
|
+
⊗ Emit `design-critique: warranted | not warranted, because` from evaluation.
|
|
43
|
+
⊗ Reuse `swarm:launch` until #3649.
|
|
44
|
+
⊗ Write `xbrief/proposed/` or GitHub from this skill.
|
|
45
|
+
|
|
46
|
+
## EXIT
|
|
47
|
+
|
|
48
|
+
deft-directive-issue-eval complete -- exiting skill. Next: run `task triage:evaluate`, then decide with existing `triage:*` verbs.
|
|
@@ -43,6 +43,8 @@ While probe completion criteria (below) are NOT met:
|
|
|
43
43
|
|
|
44
44
|
! Read existing context and interrogate only — artifacts land in the Output phase after completion.
|
|
45
45
|
|
|
46
|
+
**Waiver (#3556):** This skill keeps the no-artifact guard and does not require `deft probe-session`. The probe strategy names `deft probe-session`. Silence is not agreement.
|
|
47
|
+
|
|
46
48
|
## Workflow
|
|
47
49
|
|
|
48
50
|
### Step 1: Establish the plan
|
|
@@ -95,7 +97,7 @@ Walk the decision tree depth-first. For each unresolved branch:
|
|
|
95
97
|
|
|
96
98
|
`{scope}` is the project name from `PROJECT-DEFINITION.xbrief.json`, or the feature/component name if probing a sub-scope. Use the same value consistently throughout the session.
|
|
97
99
|
|
|
98
|
-
- ! Produce a `xbrief/proposed/{scope}-probe.xbrief.json` scope xBRIEF with three mandatory narratives:
|
|
100
|
+
- ! Produce a `xbrief/proposed/YYYY-MM-DD-{scope}-probe.xbrief.json` scope xBRIEF with three mandatory narratives:
|
|
99
101
|
- `LockedDecisions` — what was resolved and why
|
|
100
102
|
- `SurfacedRisks` — concerns raised, even if not fully resolved
|
|
101
103
|
- `DeferredDecisions` — explicitly acknowledged items with justification
|
|
@@ -105,7 +107,7 @@ Walk the decision tree depth-first. For each unresolved branch:
|
|
|
105
107
|
|
|
106
108
|
## Chaining Gate
|
|
107
109
|
|
|
108
|
-
After the probe is complete and `xbrief/proposed/{scope}-probe.xbrief.json` is written:
|
|
110
|
+
After the probe is complete and `xbrief/proposed/YYYY-MM-DD-{scope}-probe.xbrief.json` is written:
|
|
109
111
|
|
|
110
112
|
- ! Register artifacts in `./xbrief/plan.xbrief.json` (`completedStrategies`, `artifacts`)
|
|
111
113
|
- ! Return to [interview.md Chaining Gate](../../strategies/interview.md#chaining-gate) when invoked from the interview flow
|
|
@@ -180,7 +180,7 @@ See [`docs/RELEASING.md`](../../../docs/RELEASING.md) § Routine vs hard cut for
|
|
|
180
180
|
6. ! **Run `task reconcile:issues -- --apply-lifecycle-fixes` to clear any closed-issue / non-completed-folder xBRIEFs before invoking `task release`** (#734). The release pipeline carries the deterministic gate at Step 3 (`scripts/release.py::check_vbrief_lifecycle_sync`, refuses with `EXIT_VIOLATION` on any Section (c) mismatch), but Phase 1 is the operator's first-line defence -- running the apply-mode flag here is the canonical clean path; `--allow-vbrief-drift` on the pipeline exists only as the explicit-acknowledgment escape hatch (analogous to `--allow-dirty`). The recurrence record is the v0.21.0 cut, which surfaced 13 stranded xBRIEFs (8 cycle-relevant + 5 historical residue) post-publish; the gate now blocks that drift before any irreversible action
|
|
181
181
|
7. ! **Verify the proposed `v<version>` tag is not already in use locally, on origin, or as a published GitHub release** (#784). The release pipeline carries the deterministic gate at Step 4 (`scripts/release.py::check_tag_available`, refuses with `EXIT_VIOLATION` before any state mutation -- CHANGELOG promotion, ROADMAP refresh, build, commit), but Phase 1 is the operator's first-line defence. Quickly probe with `git tag -l v<version>` (local), `git ls-remote --tags origin refs/tags/v<version>` (remote), and `gh release view v<version> --repo <owner>/<repo>` (release-only, where `gh release view` exits 0 only when the release exists). The recurrence record is the v0.22.0 → v0.23.0 release attempt on 2026-05-01: the operator typed `0.22.0` (the prior release from 12 hours earlier) and the legacy pipeline ran 8 steps before failing at `git tag` -- leaving a wrong-version local commit + `dist/deft-0.22.0.zip` orphan + manual `git reset --hard` recovery. The new pre-flight gate blocks that mode before any irreversible action
|
|
182
182
|
8. ! **Verify the npm credential path is configured before cutting the tag** (#1910, #1909). A `v*` tag now auto-triggers `.github/workflows/npm-publish.yml`, which publishes the four `@deftai/directive*` packages with `npm publish --provenance`. Confirm the publish path can authenticate: either the `NPM_TOKEN` repo secret is present (`gh secret list --repo <owner>/<repo>` shows `NPM_TOKEN`) OR an npm OIDC trusted publisher is configured for the `@deftai/directive*` packages. If neither is in place, WARN loudly that the tag will fire a publish job that fails (red X on the tag, no packages) -- the operator may still proceed for a GitHub-only release, but the npm channel will not land until #1909's credential is provisioned. Cross-reference #1909.
|
|
183
|
-
9. ! **Disclose npm irrevocability before any tag push (#1972, #2002).** A `v<version>` tag push is the **real npm publish gate** -- NOT Phase 5 or `task release:publish`. Tag push fires `.github/workflows/npm-publish.yml` in a separate workflow that is NOT draft-gated; npm packages ship immediately and **cannot be retracted** (`npm unpublish` is forbidden). Recovery is forward-only: deprecate, dist-tag, or ship a patch. The
|
|
183
|
+
9. ! **Disclose npm irrevocability before any tag push (#1972, #2002, #3527).** A `v<version>` tag push is the **real npm publish gate** -- NOT Phase 5 or `task release:publish`. Tag push fires `.github/workflows/npm-publish.yml` in a separate workflow that is NOT draft-gated; npm packages ship immediately and **cannot be retracted** (`npm unpublish` is forbidden). Recovery is forward-only: deprecate, dist-tag, or ship a patch. The last human gates before npm goes live are: (a) Phase 2 dry-run `yes`, (b) a human-origin closed-verb grant (`deft authz:grant -- --template release-publish --target <version>` or `DEFT_ALLOW_RELEASE_PUBLISH=1`). `task release` fails closed at the Step 10–11 tag-push boundary without that grant. Phase 5 only controls GitHub release visibility (draft → public); it does NOT gate npm. The draft-flip `release:publish` closed-verb check remains (#1095).
|
|
184
184
|
10. ~ Ask the operator for an optional one-line release **summary** (recommended 80-160 chars; can be skipped). The summary is the canonical narrative for THIS release across three audiences: (a) injected as a Markdown blockquote at the top of the promoted `CHANGELOG.md [<version>]` section, (b) auto-flowed into the GitHub release body via the existing `_section_for_version` pickup, and (c) populated VERBATIM into the Phase 8 Slack `*Summary*:` slot. Capture the wording once here; do NOT regenerate per-audience downstream
|
|
185
185
|
|
|
186
186
|
⊗ Skip the version-bump magnitude check -- a patch release that ships breaking changes is the kind of regression that Repair Authority [AXIOM] (#709) is designed to prevent.
|
|
@@ -201,7 +201,7 @@ task release -- <version> --dry-run --skip-tag --skip-release --summary "<text>"
|
|
|
201
201
|
|
|
202
202
|
The dry-run prints `[N/13] <step>... DRYRUN (would <action>)` for every pipeline step (Step 13 is the post-create verify-isDraft gate added by #724; Step 4 is the tag-availability pre-flight gate added by #784). Step 6 (CHANGELOG promotion) surfaces whether a summary was supplied (truncated to ~60 chars in the preview) so the operator can validate the wording before any file is written. Capture the output and present it to the user, then wait for explicit confirmation before continuing.
|
|
203
203
|
|
|
204
|
-
! Wait for explicit user confirmation: `yes` / `back` / `quit`. Remind the operator that Phase 4's tag push will irrevocably publish npm (#1972) -- this `yes` is the last safe abort before that channel opens.
|
|
204
|
+
! Wait for explicit user confirmation: `yes` / `back` / `quit`. Remind the operator that Phase 4's tag push will irrevocably publish npm (#1972) and requires a `release-publish` grant (or `DEFT_ALLOW_RELEASE_PUBLISH=1`) -- this `yes` is the last safe abort before that channel opens (#3527).
|
|
205
205
|
- `yes` (or `confirmed` / `approve`) → proceed to Phase 3
|
|
206
206
|
- `back` → return to Phase 1 for re-validation (e.g. user wants to amend the version or `[Unreleased]` content)
|
|
207
207
|
- `quit` → abort the workflow cleanly; no state changes
|
|
@@ -232,7 +232,7 @@ The harness provisions `deftai/deftai-release-test-<ts>-<uuid6>`, runs the smoke
|
|
|
232
232
|
|
|
233
233
|
## Phase 4 — Production draft
|
|
234
234
|
|
|
235
|
-
! **Last human gate before npm (#1972, #2002).** Immediately before invoking `task release`, re-state that the tag push in this step will irrevocably publish all four `@deftai/directive*` packages to npm via `.github/workflows/npm-publish.yml`. There is no undo on npm; only forward recovery (deprecate / dist-tag / patch). Proceed only when the operator explicitly confirms.
|
|
235
|
+
! **Last human gate before npm (#1972, #2002, #3527).** Immediately before invoking `task release`, re-state that the tag push in this step will irrevocably publish all four `@deftai/directive*` packages to npm via `.github/workflows/npm-publish.yml`. There is no undo on npm; only forward recovery (deprecate / dist-tag / patch). Proceed only when the operator explicitly confirms **and** a human-origin grant covers `release-publish` for this version (`deft authz:grant -- --template release-publish --target <version>` or `DEFT_ALLOW_RELEASE_PUBLISH=1`). The pipeline fails closed at Step 10–11 without that grant -- that is the npm-distributing boundary. ⊗ Rely on Phase 5 `release:publish` as the npm gate; it only flips the GitHub draft. ⊗ Delete the draft-flip check as a substitute for the tag-push gate.
|
|
236
236
|
|
|
237
237
|
! Invoke `task release -- <version>` (NO `--dry-run`, NO `--skip-tag`, NO `--skip-release`, NO `--skip-ci`). If Phase 1 collected an operator summary, pass `--summary "<text>"` so the production cut writes the same blockquote the dry-run previewed.
|
|
238
238
|
|
|
@@ -377,6 +377,8 @@ Where `<one-line guidance>` is one of:
|
|
|
377
377
|
- ⊗ Run `task release` without a Phase 2 dry-run preview -- the dry-run is the only safe place to catch a bad version, malformed CHANGELOG, or wrong base branch
|
|
378
378
|
- ⊗ Skip Phase 3 (e2e rehearsal) on the assumption that "the dry-run is enough" -- the e2e harness catches gh-CLI auth issues, repo permission gaps, and pipeline-shape regressions that the dry-run cannot detect
|
|
379
379
|
- ⊗ Pass `--no-draft` to `task release` without explicit operator opt-in -- the default-draft contract is the foundation of the safety hardening surface
|
|
380
|
+
- ⊗ Invoke `task release` without `--skip-tag` when no `release-publish` grant or `DEFT_ALLOW_RELEASE_PUBLISH` is present -- the v0.105.0 cut published npm with no authz because the closed-verb check sat only on the later draft flip (#3527)
|
|
381
|
+
- ⊗ Delete the `release:publish` draft-flip closed-verb check as a substitute for the tag-push gate -- placement, not strength; both stay (#3527 / #1095)
|
|
380
382
|
- ⊗ Treat Phase 5 as the npm authority gate or require a redundant human `publish` prompt when npm already succeeded -- npm ships at tag push (#1972); Phase 5 is GitHub draft QA only
|
|
381
383
|
- ⊗ Expect `task release:rollback` to retract npm packages -- rollback is GitHub-only; npm recovery is forward-only (deprecate / dist-tag / patch)
|
|
382
384
|
- ⊗ Run `task release:rollback` against a release that has > 30 minutes of consumer-driven downloads without first weighing the hot-fix path -- a withdrawal note in the next patch is almost always less disruptive than deleting a public artifact
|
|
@@ -75,7 +75,7 @@ On OpenClaw hosts with Directive installed (`.deft/core/` or equivalent content
|
|
|
75
75
|
! Before entering the review/fix loop, run the skill-level branch-policy guard (#746 / #747). Halt before any state mutation if the project's `plan.policy.allowDirectCommitsToMaster` is unresolvable AND the operator has not set `DEFT_ALLOW_DEFAULT_BRANCH_COMMIT=1`. Concretely:
|
|
76
76
|
|
|
77
77
|
```
|
|
78
|
-
|
|
78
|
+
deft verify:branch || exit 1
|
|
79
79
|
```
|
|
80
80
|
|
|
81
81
|
The skill MUST NOT modify files, push, or comment on the PR until the guard passes -- this catches the case where a malformed PROJECT-DEFINITION quietly disabled the policy and the agent would have committed directly to master mid-review.
|
|
@@ -29,7 +29,7 @@ Legend (from RFC2119): !=MUST, ~=SHOULD, ≉=SHOULD NOT, ⊗=MUST NOT, ?=MAY.
|
|
|
29
29
|
! Before any state mutation (creating worktrees, dispatching sub-agents, opening PRs), run the skill-level branch-policy guard (#746 / #747). Halt with the actionable disclosure message when the project's `plan.policy.allowDirectCommitsToMaster` is unresolvable AND `DEFT_ALLOW_DEFAULT_BRANCH_COMMIT` is unset:
|
|
30
30
|
|
|
31
31
|
```
|
|
32
|
-
|
|
32
|
+
deft verify:branch || exit 1
|
|
33
33
|
```
|
|
34
34
|
|
|
35
35
|
The swarm skill creates branches per agent so the guard is mostly informational here, but a malformed PROJECT-DEFINITION (missing `plan.policy` block AND no legacy narrative) is a fail-closed signal worth surfacing before the swarm spawns N agents.
|
|
@@ -37,7 +37,7 @@ Legend (from RFC2119): !=MUST, ~=SHOULD, ≉=SHOULD NOT, ⊗=MUST NOT, ?=MAY.
|
|
|
37
37
|
|
|
38
38
|
## Deterministic Questions Contract
|
|
39
39
|
|
|
40
|
-
! Every numbered-menu prompt rendered in this skill (Phase 2 candidate selection, Phase 3 per-item decision walk) ! MUST follow [`../../contracts/deterministic-questions.md`](../../contracts/deterministic-questions.md): render the canonical numbered menu in chat unless the host UI visibly preserves numeric option labels and returns numeric selections or exact displayed option text. The final two numbered options are `Discuss` and `Back`, in that order, and the Discuss-pause semantic from the contract applies verbatim -- on `Discuss` the agent halts the in-progress sequence and resumes only on an explicit user signal.
|
|
40
|
+
! Every numbered-menu prompt rendered in this skill (Phase 2 candidate selection, Phase 3 per-item decision walk, post-Accept offer) ! MUST follow [`../../contracts/deterministic-questions.md`](../../contracts/deterministic-questions.md): render the canonical numbered menu in chat unless the host UI visibly preserves numeric option labels and returns numeric selections or exact displayed option text. The final two numbered options are `Discuss` and `Back`, in that order, and the Discuss-pause semantic from the contract applies verbatim -- on `Discuss` the agent halts the in-progress sequence and resumes only on an explicit user signal.
|
|
41
41
|
|
|
42
42
|
## Work selection fork (#2542 / #2402)
|
|
43
43
|
|
|
@@ -101,6 +101,7 @@ What would you like to do with this candidate?
|
|
|
101
101
|
- ~ Bulk: `task triage:bulk-{accept,reject,defer,needs-ac}`; results still flow through the audit log.
|
|
102
102
|
- ⊗ Write to `xbrief/proposed/` directly -- only `task triage:accept` is authorised.
|
|
103
103
|
- ~ **Accept → pending chain (#1136):** `task triage:accept` ingests into **`proposed/`**. To stage into WIP (`pending/`) in one operator action: `task triage:accept -- --issue <N> --repo OWNER/NAME --auto-promote` (WIP cap still enforced; use `--force` on the accept command for WIP override). Separately, promote an already-accepted proposed scope by issue: `task scope:promote -- --from-issue=<N> [--repo OWNER/NAME]` (gates on latest `candidates.jsonl` decision = `accept`; non-accept refuses unless `--force-no-cache`; no decision soft-warns, `--strict` fails). Path-based `task scope:promote -- <file>` remains ungated for refinement scaffolds.
|
|
104
|
+
- ? **After Accept (#3708):** offer `deft-directive-design-critique`. Optional; same after `--auto-promote` (promote already happened). Decline writes nothing. Menu: 1. Run critique (existing ADR-005 path) 2. Skip 3. Discuss 4. Back. Back = Skip (do not re-open Accept; undo is `task triage:reset`).
|
|
104
105
|
|
|
105
106
|
## Phase 4 -- Audit
|
|
106
107
|
|
|
@@ -141,5 +142,5 @@ Live walkers (`triage:queue`, scope-drift, bootstrap) scan `.deft-cache/github-i
|
|
|
141
142
|
|
|
142
143
|
## References
|
|
143
144
|
|
|
144
|
-
- #1119 D6; #1128 D11 (`triage:queue` / `show` / `audit`); #2890 Phase 3 operator brief; #3116 validity + URL-first; #1122 / #1123 / #1127 / #1129 / #1131; #1136 (`scope:promote --from-issue` / `triage:accept --auto-promote`)
|
|
145
|
+
- #1119 D6; #1128 D11 (`triage:queue` / `show` / `audit`); #2890 Phase 3 operator brief; #3116 validity + URL-first; #1122 / #1123 / #1127 / #1129 / #1131; #1136 (`scope:promote --from-issue` / `triage:accept --auto-promote`); #3708 (post-Accept design-critique offer)
|
|
145
146
|
- Siblings: `deft-directive-refinement`, `deft-directive-swarm`, `deft-directive-sync`
|
package/strategies/README.md
CHANGED
|
@@ -36,7 +36,7 @@ Every strategy has a **Type** that determines its behavior in the
|
|
|
36
36
|
via `/deft:run:<name>` — when invoked outside an interview context, they present their
|
|
37
37
|
own next-step options instead of returning to the chaining gate. See each strategy file
|
|
38
38
|
for standalone support.
|
|
39
|
-
- **`spec-generating`** — Produces v0.20-conformant output per [v0-20-contract.md](./v0-20-contract.md) (lifecycle folders + PROJECT-DEFINITION.
|
|
39
|
+
- **`spec-generating`** — Produces v0.20-conformant output per [v0-20-contract.md](./v0-20-contract.md) (lifecycle folders + PROJECT-DEFINITION.xbrief.json + date-prefixed proposed/ scope vBRIEFs only; SPECIFICATION.md/PROJECT.md as deprecation stubs or omitted). Selecting one at the chaining gate switches the pipeline to that strategy’s spec flow.
|
|
40
40
|
|
|
41
41
|
Custom strategies MUST declare their type in this table. If the `Type` column is missing,
|
|
42
42
|
the chaining gate cannot include the strategy.
|
|
@@ -45,9 +45,9 @@ the chaining gate cannot include the strategy.
|
|
|
45
45
|
|
|
46
46
|
All spec-generating strategies (interview, yolo, speckit, rapid, enterprise) MUST produce output conforming to [v0-20-contract.md](./v0-20-contract.md):
|
|
47
47
|
|
|
48
|
-
- Five
|
|
49
|
-
-
|
|
50
|
-
- Scope vBRIEFs ONLY as date-prefixed in
|
|
48
|
+
- Five xbrief/ lifecycle folders (proposed/ pending/ active/ completed/ cancelled/)
|
|
49
|
+
- xbrief/PROJECT-DEFINITION.xbrief.json (full)
|
|
50
|
+
- Scope vBRIEFs ONLY as date-prefixed in xbrief/proposed/YYYY-MM-DD-*.xbrief.json
|
|
51
51
|
- Never dual-write legacy vbrief/specification.vbrief.json
|
|
52
52
|
- SPECIFICATION.md/PROJECT.md only as deprecation-redirect stubs (banner + sentinel) or omitted
|
|
53
53
|
|
package/strategies/bdd.md
CHANGED
|
@@ -57,7 +57,7 @@ Legend (from RFC2119): !=MUST, ~=SHOULD, ≉=SHOULD NOT, ⊗=MUST NOT, ?=MAY.
|
|
|
57
57
|
|
|
58
58
|
! Before writing output artifacts, follow the [Preparatory Guard](./artifact-guards.md#preparatory-guard-light).
|
|
59
59
|
|
|
60
|
-
! Resolve all ambiguities surfaced by Step 3. Record decisions in `
|
|
60
|
+
! Resolve all ambiguities surfaced by Step 3. Record decisions in `xbrief/proposed/{feature}-bdd.xbrief.json`.
|
|
61
61
|
|
|
62
62
|
- ! Write a scope vBRIEF with two narratives:
|
|
63
63
|
- `Scenarios` -- Given/When/Then scenario descriptions from Step 1
|
|
@@ -67,32 +67,32 @@ Legend (from RFC2119): !=MUST, ~=SHOULD, ≉=SHOULD NOT, ⊗=MUST NOT, ?=MAY.
|
|
|
67
67
|
- ⊗ Leave ambiguities unresolved -- every question surfaced in Step 3 must have a locked answer
|
|
68
68
|
- ⊗ Write decisions to a hand-authored markdown file -- use vBRIEF narratives for token-efficient agent consumption
|
|
69
69
|
|
|
70
|
-
! After emitting the scope vBRIEF to `
|
|
70
|
+
! After emitting the scope vBRIEF to `xbrief/proposed/`, surface the GitHub-issue tracking hint from [emit-hints.md](./emit-hints.md) — name all three patterns (none / `--umbrella` / `--per-vbrief`).
|
|
71
71
|
|
|
72
72
|
### Step 5: Generate Spec
|
|
73
73
|
|
|
74
74
|
! Derive SPECIFICATION.md tasks from the now-stable test scenarios and locked decisions.
|
|
75
75
|
|
|
76
76
|
- ! Each scenario maps to one or more spec tasks with traceability (`traces: scenario-N`)
|
|
77
|
-
- ! Locked decisions from `
|
|
77
|
+
- ! Locked decisions from `xbrief/proposed/{feature}-bdd.xbrief.json` `LockedDecisions` narrative flow into the spec as constraints
|
|
78
78
|
- ~ Use the Light or Full path from [strategies/interview.md](./interview.md) based on project size
|
|
79
79
|
|
|
80
80
|
### Step 6: Chain into Interview Sizing Gate
|
|
81
81
|
|
|
82
82
|
! Follow [strategies/interview.md](./interview.md) sizing gate for SPECIFICATION.md finalisation.
|
|
83
83
|
|
|
84
|
-
- ! On completion, register artifacts in `./
|
|
84
|
+
- ! On completion, register artifacts in `./xbrief/plan.xbrief.json`:
|
|
85
85
|
- Update `completedStrategies`: increment `runCount` for `"bdd"`, append artifact paths
|
|
86
86
|
- Append all new artifact paths to the flat `artifacts` array
|
|
87
87
|
- ! Return to [interview.md Chaining Gate](./interview.md#chaining-gate)
|
|
88
|
-
- ! The locked decisions from `
|
|
88
|
+
- ! The locked decisions from `xbrief/proposed/{feature}-bdd.xbrief.json` and the acceptance tests MUST flow into subsequent strategies and spec generation
|
|
89
89
|
|
|
90
90
|
---
|
|
91
91
|
|
|
92
92
|
## Output Artifacts
|
|
93
93
|
|
|
94
94
|
- Executable test files in the project's standard test directory -- derived from Given/When/Then scenarios
|
|
95
|
-
- `
|
|
95
|
+
- `xbrief/proposed/{feature}-bdd.xbrief.json` -- scope vBRIEF with `Scenarios` and `LockedDecisions` narratives
|
|
96
96
|
|
|
97
97
|
---
|
|
98
98
|
|
package/strategies/discuss.md
CHANGED
|
@@ -55,7 +55,7 @@ Use the Feynman technique: if the user (or you) can't explain the feature in sim
|
|
|
55
55
|
|
|
56
56
|
- ! If the user suggests a capability belonging to a different feature, capture it as **deferred**
|
|
57
57
|
- ~ Redirect: "That sounds like a new capability — I'll note it. For now, let's focus on [current scope]."
|
|
58
|
-
- ~ Record deferred ideas in `./
|
|
58
|
+
- ~ Record deferred ideas in `./xbrief/plan.xbrief.json` with `deferred` status and a narrative explaining why
|
|
59
59
|
|
|
60
60
|
## Domain-Sensitive Questions
|
|
61
61
|
|
|
@@ -70,14 +70,14 @@ Adapt question focus to what's being built:
|
|
|
70
70
|
|
|
71
71
|
! Before writing output artifacts, follow the [Preparatory Guard](./artifact-guards.md#preparatory-guard-light).
|
|
72
72
|
|
|
73
|
-
- ! Produce a `
|
|
73
|
+
- ! Produce a `xbrief/proposed/{scope}-context.xbrief.json` scope vBRIEF with a `LockedDecisions` narrative
|
|
74
74
|
- ! Each decision includes: **what** was decided, **why**, and **alternatives considered**
|
|
75
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)
|
|
76
76
|
- ! This vBRIEF is injected into all downstream work: planning, execution, verification
|
|
77
77
|
- ! Persist decisions as vBRIEF narratives on the relevant plan items
|
|
78
78
|
- ⊗ Write decisions to a hand-authored markdown context file -- use vBRIEF narratives for token-efficient agent consumption
|
|
79
79
|
|
|
80
|
-
! After emitting the scope vBRIEF to `
|
|
80
|
+
! After emitting the scope vBRIEF to `xbrief/proposed/`, surface the GitHub-issue tracking hint from [emit-hints.md](./emit-hints.md) — name all three patterns (none / `--umbrella` / `--per-vbrief`).
|
|
81
81
|
|
|
82
82
|
## Decision Locking
|
|
83
83
|
|
|
@@ -128,18 +128,18 @@ Glossary naming for this term is owned by sibling work (#2907). Strategy prose h
|
|
|
128
128
|
|
|
129
129
|
## Then: Chaining Gate
|
|
130
130
|
|
|
131
|
-
After alignment is complete and decisions are locked in `
|
|
131
|
+
After alignment is complete and decisions are locked in `xbrief/proposed/{scope}-context.xbrief.json`,
|
|
132
132
|
return to the [chaining gate](./interview.md#chaining-gate) so the user can
|
|
133
133
|
run additional preparatory strategies or proceed to spec generation.
|
|
134
134
|
|
|
135
|
-
- ! On completion, register artifacts in `./
|
|
135
|
+
- ! On completion, register artifacts in `./xbrief/plan.xbrief.json`:
|
|
136
136
|
- Update `completedStrategies`: increment `runCount` for `"discuss"`,
|
|
137
|
-
append artifact path (`
|
|
137
|
+
append artifact path (`xbrief/proposed/{scope}-context.xbrief.json`)
|
|
138
138
|
- Append the path to the flat `artifacts` array
|
|
139
139
|
- ! Return to [interview.md Chaining Gate](./interview.md#chaining-gate)
|
|
140
140
|
(the discuss phase replaces the interview's question-gathering -- decisions are
|
|
141
141
|
already made, so the interview will be short or skipped entirely)
|
|
142
|
-
- ! The locked decisions from `
|
|
142
|
+
- ! The locked decisions from `xbrief/proposed/{scope}-context.xbrief.json` MUST flow into subsequent
|
|
143
143
|
strategies and spec generation
|
|
144
144
|
- ⊗ End the session after discuss without returning to the chaining gate
|
|
145
145
|
or the invoking strategy's next-step menu
|
|
@@ -154,7 +154,7 @@ run additional preparatory strategies or proceed to spec generation.
|
|
|
154
154
|
|
|
155
155
|
1. **Open** -- Start with the user's goal statement; restate it in your own words
|
|
156
156
|
2. **Explore** -- Follow energy, challenge vagueness, ask domain-sensitive questions
|
|
157
|
-
3. **Lock** -- Record each decision in `
|
|
157
|
+
3. **Lock** -- Record each decision in `xbrief/proposed/{scope}-context.xbrief.json` `LockedDecisions` narrative with what/why/alternatives (and dual-path graduation fields when the lock is an under-build; #2899)
|
|
158
158
|
4. **Verify** -- Explain the full picture back to the user (Feynman check)
|
|
159
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
|
|
160
160
|
|
package/strategies/emit-hints.md
CHANGED
|
@@ -16,7 +16,7 @@ Legend (from RFC2119): !=MUST, ~=SHOULD, ≉=SHOULD NOT, ⊗=MUST NOT, ?=MAY.
|
|
|
16
16
|
|
|
17
17
|
## When to Use
|
|
18
18
|
|
|
19
|
-
This file is not a standalone strategy — it is a shared hint referenced by other strategies. It activates at the emission step, right after a strategy writes scope vBRIEFs to `
|
|
19
|
+
This file is not a standalone strategy — it is a shared hint referenced by other strategies. It activates at the emission step, right after a strategy writes scope vBRIEFs to `xbrief/proposed/` (or `xbrief/pending/`).
|
|
20
20
|
|
|
21
21
|
- ! Referenced by spec-generating strategies: [speckit](./speckit.md) (Phase 4 and Phase 4.5), [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)
|
|
@@ -38,12 +38,12 @@ This file is not a standalone strategy — it is a shared hint referenced by oth
|
|
|
38
38
|
<strategy> emitted N scope vBRIEF(s).
|
|
39
39
|
|
|
40
40
|
Optional: track these in GitHub issues.
|
|
41
|
-
- task deft:issue:emit --umbrella --
|
|
42
|
-
- task deft:issue:emit --per-vbrief --
|
|
41
|
+
- task deft:issue:emit --umbrella -- xbrief/<path>/<glob> (one roadmap issue, all vBRIEFs reference it)
|
|
42
|
+
- task deft:issue:emit --per-vbrief -- xbrief/<path>/<glob> (one issue per vBRIEF)
|
|
43
43
|
- Default behavior (vBRIEF-only) requires no further action.
|
|
44
44
|
```
|
|
45
45
|
|
|
46
|
-
~ Replace `<path>/<glob>` with the actual emission target (e.g. `
|
|
46
|
+
~ Replace `<path>/<glob>` with the actual emission target (e.g. `xbrief/proposed/2026-06-15-*.xbrief.json`).
|
|
47
47
|
|
|
48
48
|
Note: `task deft:issue:emit` is the consumer-installed surface (this is what strategies render to). The maintainer-side, in-repo form is `task issue:emit` — the same command without the `deft:` prefix.
|
|
49
49
|
|
|
@@ -52,8 +52,8 @@ Note: `task deft:issue:emit` is the consumer-installed surface (this is what str
|
|
|
52
52
|
## The Three Patterns
|
|
53
53
|
|
|
54
54
|
1. **None (default)** — emit vBRIEF(s) only; file no GitHub issue. Requires no further user action. This is the framework default and is unchanged by this hint.
|
|
55
|
-
2. **Umbrella** — `task deft:issue:emit --umbrella --
|
|
56
|
-
3. **Per-vBRIEF** — `task deft:issue:emit --per-vbrief --
|
|
55
|
+
2. **Umbrella** — `task deft:issue:emit --umbrella -- xbrief/<path>/<glob>` files ONE roadmap issue, and every matched vBRIEF references it.
|
|
56
|
+
3. **Per-vBRIEF** — `task deft:issue:emit --per-vbrief -- xbrief/<path>/<glob>` files one issue per matched vBRIEF.
|
|
57
57
|
|
|
58
58
|
- ! Name all three patterns (none / `--umbrella` / `--per-vbrief`) when surfacing the hint — do not hide the umbrella / per-vBRIEF escape hatches.
|
|
59
59
|
- ⊗ File a GitHub issue automatically as part of emission. No strategy files an issue unless the user explicitly invokes `task deft:issue:emit`.
|
package/strategies/enterprise.md
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
Compliance-heavy workflow -- v0.20 date-prefixed story/phase vBRIEF + PROJECT-DEFINITION with explicit approval gates at each stage.
|
|
10
10
|
|
|
11
|
-
**v0.20 note (s5-migrate-speckit-rapid-enterprise / #1166):** Enterprise now emits only the canonical v0.20 shape (date-prefixed story/phase vBRIEFs in proposed/, full PROJECT-DEFINITION.
|
|
11
|
+
**v0.20 note (s5-migrate-speckit-rapid-enterprise / #1166):** Enterprise now emits only the canonical v0.20 shape (date-prefixed story/phase vBRIEFs in proposed/, full PROJECT-DEFINITION.xbrief.json via task project:render, seeded lifecycle folders, no legacy specification.vbrief.json). PRD.md and SPECIFICATION.md (if any) are deprecation-redirect derivatives only. See the dedicated ## v0.20 Output Shape section and the canonical contract `strategies/v0-20-contract.md` (s1-contract of #1166).
|
|
12
12
|
|
|
13
13
|
Legend (from RFC2119): !=MUST, ~=SHOULD, ≉=SHOULD NOT, ⊗=MUST NOT, ?=MAY.
|
|
14
14
|
|
|
@@ -38,12 +38,12 @@ Legend (from RFC2119): !=MUST, ~=SHOULD, ≉=SHOULD NOT, ⊗=MUST NOT, ?=MAY.
|
|
|
38
38
|
|
|
39
39
|
! Before writing output artifacts, follow the guards in [artifact-guards.md](./artifact-guards.md) (Preparatory Guard for proposed/ scope items; Spec-Generating Guard for PROJECT-DEFINITION).
|
|
40
40
|
|
|
41
|
-
! Run the Full interview path from [interview.md](./interview.md) unconditionally -- write PRD narratives as date-prefixed story/phase vBRIEF(s) to `
|
|
41
|
+
! Run the Full interview path from [interview.md](./interview.md) unconditionally -- write PRD narratives as date-prefixed story/phase vBRIEF(s) to `xbrief/proposed/YYYY-MM-DD-<kebab-slug>.xbrief.json`.
|
|
42
42
|
|
|
43
43
|
- ! Use the Full path regardless of project size -- enterprise always requires a PRD
|
|
44
44
|
- ! Write PRD content as narratives in the proposed/ vBRIEF `plan.narratives`: `ProblemStatement`, `Goals`, `NonGoals`, `UserStories`, `Requirements` (functional + non-functional), `SuccessMetrics`
|
|
45
45
|
- ! Record the PRD approver(s) in the `Approvers` narrative
|
|
46
|
-
- ! Run `task prd:render` (if UX continuity needed) to produce `PRD.md` **only as a deprecation-redirect derivative** (see v0.20 Output Shape); the source of truth is the
|
|
46
|
+
- ! Run `task prd:render` (if UX continuity needed) to produce `PRD.md` **only as a deprecation-redirect derivative** (see v0.20 Output Shape); the source of truth is the xbrief/ artifacts.
|
|
47
47
|
|
|
48
48
|
### Gate 1: PRD Approval
|
|
49
49
|
|
|
@@ -76,14 +76,14 @@ Legend (from RFC2119): !=MUST, ~=SHOULD, ≉=SHOULD NOT, ⊗=MUST NOT, ?=MAY.
|
|
|
76
76
|
|
|
77
77
|
! Before writing output artifacts, follow the guards in [artifact-guards.md](./artifact-guards.md) (Preparatory Guard for proposed/ scope items; Spec-Generating Guard for PROJECT-DEFINITION).
|
|
78
78
|
|
|
79
|
-
! Enrich or emit date-prefixed vBRIEF(s) in `
|
|
79
|
+
! Enrich or emit date-prefixed vBRIEF(s) in `xbrief/proposed/` with architecture and plan narratives derived from the approved PRD narratives and accepted ADRs. (No singular `specification.vbrief.json`.)
|
|
80
80
|
|
|
81
81
|
- ! Add HOW narratives to the proposed/ vBRIEF `plan.narratives`: `Architecture`, `TechDecisions`, `ImplementationPhases`, `TraceabilityMatrix`
|
|
82
82
|
- ! Every spec task must trace to a PRD requirement and, where applicable, an ADR
|
|
83
83
|
- ! Use the Light or Full path from [interview.md](./interview.md) for specification generation
|
|
84
84
|
- ! Include traceability matrix: spec task → PRD requirement → ADR (where applicable)
|
|
85
|
-
- ! Run `task spec:render` (if UX continuity needed) to produce `SPECIFICATION.md` **only as a deprecation-redirect derivative** (see v0.20 Output Shape); the source of truth is the
|
|
86
|
-
- ! After proposed/ vBRIEFs exist, invoke `task project:render` to produce/refresh `
|
|
85
|
+
- ! Run `task spec:render` (if UX continuity needed) to produce `SPECIFICATION.md` **only as a deprecation-redirect derivative** (see v0.20 Output Shape); the source of truth is the xbrief/ lifecycle + PROJECT-DEFINITION.
|
|
86
|
+
- ! After proposed/ vBRIEFs exist, invoke `task project:render` to produce/refresh `xbrief/PROJECT-DEFINITION.xbrief.json`.
|
|
87
87
|
|
|
88
88
|
! After emitting the proposed/ vBRIEF(s), surface the GitHub-issue tracking hint from [emit-hints.md](./emit-hints.md) — name all three patterns (none / `--umbrella` / `--per-vbrief`).
|
|
89
89
|
|
|
@@ -107,13 +107,13 @@ Legend (from RFC2119): !=MUST, ~=SHOULD, ≉=SHOULD NOT, ⊗=MUST NOT, ?=MAY.
|
|
|
107
107
|
|
|
108
108
|
## Output Artifacts
|
|
109
109
|
|
|
110
|
-
- `
|
|
111
|
-
- `
|
|
110
|
+
- `xbrief/proposed/YYYY-MM-DD-*.xbrief.json` (one or more) -- source of truth for PRD and specification narratives (date-prefixed per v0.20 contract)
|
|
111
|
+
- `xbrief/PROJECT-DEFINITION.xbrief.json` -- complete via `task project:render`
|
|
112
112
|
- `PRD.md` -- rendered export via `task prd:render` **only if deprecation-redirect sentinel** (read-only stakeholder review artifact; otherwise omit)
|
|
113
113
|
- `docs/adr/adr-NNN-*.md` -- accepted Architecture Decision Records (unchanged location)
|
|
114
114
|
- `SPECIFICATION.md` -- rendered export via `task spec:render` **only if deprecation-redirect sentinel** (read-only stakeholder review artifact; otherwise omit)
|
|
115
115
|
- Traceability matrix (inline in the proposed/ vBRIEF narratives or as a separate `docs/traceability.md`)
|
|
116
|
-
- `
|
|
116
|
+
- `xbrief/{proposed,pending,active,completed,cancelled}/` -- all five lifecycle folders seeded
|
|
117
117
|
|
|
118
118
|
---
|
|
119
119
|
|
|
@@ -139,11 +139,11 @@ Enterprise is a **spec-generating** strategy. It uses the Forced-Full path and a
|
|
|
139
139
|
|
|
140
140
|
This strategy has been migrated to the full v0.20 output shape so enterprise-generated projects are accepted by the build skill Pre-Cutover Detection Guard with zero errors on first attempt (resolves the enterprise row from the #1166 inconsistency table and the s5 story acceptance criteria).
|
|
141
141
|
|
|
142
|
-
- ! Seed the five lifecycle folders under `
|
|
143
|
-
- ! Emit scope items (PRD, spec phases, etc.) exclusively as date-prefixed scope vBRIEFs: `
|
|
144
|
-
- ! After the proposed/ vBRIEFs are written, invoke `task project:render` (run from the repo root) to generate/refresh the complete `
|
|
142
|
+
- ! Seed the five lifecycle folders under `xbrief/` if any are missing: `proposed/`, `pending/`, `active/`, `completed/`, `cancelled/`.
|
|
143
|
+
- ! Emit scope items (PRD, spec phases, etc.) exclusively as date-prefixed scope vBRIEFs: `xbrief/proposed/YYYY-MM-DD-<kebab-slug>.xbrief.json` (use the run's creation date for the prefix; choose descriptive slugs). Decompose into focused, buildable vBRIEFs (v0.6 schema) rather than a monolithic legacy spec.
|
|
144
|
+
- ! After the proposed/ vBRIEFs are written, invoke `task project:render` (run from the repo root) to generate/refresh the complete `xbrief/PROJECT-DEFINITION.xbrief.json` (items registry is derived from the lifecycle folders).
|
|
145
145
|
- ⊗ Never emit `vbrief/specification.vbrief.json` (or any legacy dual-write).
|
|
146
|
-
- ~ `PRD.md` and `SPECIFICATION.md` at the project root, if produced at all, must be only read-only derivatives that include the v0.20 deprecated-redirect sentinel (see conventions/machine-generated-banner.md). The source of truth is the
|
|
146
|
+
- ~ `PRD.md` and `SPECIFICATION.md` at the project root, if produced at all, must be only read-only derivatives that include the v0.20 deprecated-redirect sentinel (see conventions/machine-generated-banner.md). The source of truth is the xbrief/ lifecycle vBRIEFs + PROJECT-DEFINITION. ADRs remain in `docs/adr/`.
|
|
147
147
|
- ! Before writing any proposed/ vBRIEFs or PROJECT-DEFINITION, follow the guards in [artifact-guards.md](./artifact-guards.md) (Preparatory Guard for scope items in proposed/; Spec-Generating Guard for PROJECT-DEFINITION).
|
|
148
148
|
- ! Final output tree must pass the deterministic v0.20 strategy output validation gate (s2-deterministic-gate) and the build Pre-Cutover Detection Guard with zero warnings/errors. See full acceptance in the s5 vBRIEF and the 1166 decomposition.
|
|
149
149
|
- ! Cite the canonical contract `strategies/v0-20-contract.md` (s1-contract) for the exact shape and the per-strategy table row.
|
|
@@ -156,9 +156,9 @@ This strategy has been migrated to the full v0.20 output shape so enterprise-gen
|
|
|
156
156
|
|
|
157
157
|
| Artifact | Purpose | Created By |
|
|
158
158
|
|----------|---------|------------|
|
|
159
|
-
| `
|
|
160
|
-
| `
|
|
161
|
-
| `
|
|
159
|
+
| `xbrief/proposed/YYYY-MM-DD-*.xbrief.json` (one or more) | PRD + specification narratives as date-prefixed scope items (per v0.20 contract) | Enterprise |
|
|
160
|
+
| `xbrief/PROJECT-DEFINITION.xbrief.json` | Project identity gestalt + complete scope items registry | `task project:render` (invoked by Enterprise) |
|
|
161
|
+
| `xbrief/{proposed,pending,active,completed,cancelled}/` | All five lifecycle folders seeded | Enterprise |
|
|
162
162
|
| `docs/adr/adr-NNN-*.md` | Accepted Architecture Decision Records (traceable) | Enterprise (unchanged) |
|
|
163
163
|
| (optional derivative) `PRD.md` / `SPECIFICATION.md` | Human-readable (includes deprecated-redirect sentinel only) | `task prd:render` / `task spec:render` (if invoked) |
|
|
164
164
|
|
|
@@ -168,13 +168,13 @@ This strategy has been migrated to the full v0.20 output shape so enterprise-gen
|
|
|
168
168
|
- Primary handoff `PRD.md` or `SPECIFICATION.md` at project root (without sentinel)
|
|
169
169
|
- Bare-named vBRIEFs in proposed/
|
|
170
170
|
|
|
171
|
-
See the full table and rules in `strategies/v0-20-contract.md` (enterprise row: Must Create Lifecycle Folders: Yes; Must Write PROJECT-DEFINITION: Yes; Scope vBRIEFs Location: proposed/YYYY-MM-DD-*.
|
|
171
|
+
See the full table and rules in `strategies/v0-20-contract.md` (enterprise row: Must Create Lifecycle Folders: Yes; Must Write PROJECT-DEFINITION: Yes; Scope vBRIEFs Location: proposed/YYYY-MM-DD-*.xbrief.json only; specification.vbrief.json: Never; SPECIFICATION.md / PROJECT.md: Omit or deprecation redirect only).
|
|
172
172
|
|
|
173
173
|
---
|
|
174
174
|
|
|
175
175
|
## Invoking This Strategy
|
|
176
176
|
|
|
177
|
-
Set in PROJECT-DEFINITION.
|
|
177
|
+
Set in PROJECT-DEFINITION.xbrief.json narratives:
|
|
178
178
|
```json
|
|
179
179
|
"Strategy": "strategies/enterprise.md"
|
|
180
180
|
```
|