@deftai/directive-content 0.72.0 → 0.73.1
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 +5 -6
- package/package.json +1 -1
- package/packs/skills/skills-pack-0.1.json +45 -23
- package/skills/deft-directive-feedback/SKILL.md +5 -0
- package/skills/deft-directive-gh-arch/SKILL.md +1 -1
- package/skills/deft-directive-review-cycle/SKILL.md +6 -6
- package/skills/deft-directive-setup/SKILL.md +2 -2
- package/skills/deft-directive-swarm/SKILL.md +33 -33
- package/tasks/engine.yml +170 -5
- package/tasks/ts.yml +9 -6
- package/templates/agent-prompt-preamble.md +17 -17
- package/templates/agents-entry.md +13 -13
|
@@ -58,7 +58,7 @@ Heterogeneous swarm dispatch (#1531) assigns each worker a **dispatch provider**
|
|
|
58
58
|
When present, the section documents these fields in order:
|
|
59
59
|
|
|
60
60
|
- `dispatch_provider`: the runtime primitive that launched this worker -- e.g. `spawn_subagent`, `start_agent`, `cursor-composer`, `cursor-cloud-agent`, or a future adapter id. Names the harness surface, not the model.
|
|
61
|
-
- `worker_role`: the role boundary for this dispatch -- one of `leaf-implementation`, `orchestrator`, `review-monitor`, or `merge-release` (stable ids from `
|
|
61
|
+
- `worker_role`: the role boundary for this dispatch -- one of `leaf-implementation`, `orchestrator`, `review-monitor`, or `merge-release` (stable ids from `packages/core/src/swarm/routing.ts` `SWARM_WORKER_ROLES`). Tells the worker which preamble rules and skill surfaces apply.
|
|
62
62
|
- `selected_backend`: the stable backend id from `plan.policy.swarmSubagentBackend` / `task policy:subagent-backends` (e.g. `composer`, `grok-build`, `cursor-cloud`) | null -- which catalogued coding backend the operator selected for this role.
|
|
63
63
|
- `routing_policy`: <path or reference to the operator's routing file / tiering policy> | null -- when backend selection is delegated to harness routing instead of a typed policy field, cite the policy handle here so postmortems can reconstruct the route. The canonical handle is the gitignored, per-machine `.deft/routing.local.json` (#1739), keyed by `(dispatch_provider, worker_role)`; set decisions with `task swarm:routing-set -- --role <role> (--model <slug> | --harness-default)`.
|
|
64
64
|
- `resolved_model` (#1739): the concrete model slug the operator pinned for this `(provider, role)` | null for an explicit harness default. Resolved from `.deft/routing.local.json` and stamped into the `task swarm:launch` manifest. **This is the field the dispatch primitive must actually honor** -- see the threading rule below.
|
|
@@ -98,7 +98,7 @@ Worked example (a tiered leaf worker on Composer):
|
|
|
98
98
|
|
|
99
99
|
! Pre-dispatch gate (#1739 / #1877): run `task verify:routing` before spawning ANY sub-agent (cohort OR solo) — it fails when a dispatched worker role has no decision (pinned model or explicit harness default) for the active provider. `task verify:story-ready` chains the same routing gate for single Cursor/Grok Task dispatches (#1877). Session start runs `task verify:routing -- --advise` (non-blocking disclosure).
|
|
100
100
|
|
|
101
|
-
Reference: `.deft/routing.local.json` + `task swarm:routing-set` + `task verify:routing` (#1739, supersedes the `plan.policy.swarmSubagentBackend` enum of #1531a / #1735), `
|
|
101
|
+
Reference: `.deft/routing.local.json` + `task swarm:routing-set` + `task verify:routing` (#1739, supersedes the `plan.policy.swarmSubagentBackend` enum of #1531a / #1735), `packages/core/src/swarm/routing.ts` `SWARM_WORKER_ROLES`, issue #1531 scope update (dispatch provider / worker role / model selection are three separate concerns).
|
|
102
102
|
|
|
103
103
|
## 2.7 Runtime and GitHub auth mode (#1557)
|
|
104
104
|
|
|
@@ -129,7 +129,7 @@ Worked example (cloud / headless worker):
|
|
|
129
129
|
- github_auth_mode: injected-token
|
|
130
130
|
```
|
|
131
131
|
|
|
132
|
-
Reference: `
|
|
132
|
+
Reference: `packages/core/src/platform/platform-capabilities.ts` (#1557a), `packages/core/src/intake/github-auth-modes.ts` (#1557b), issue #1557.
|
|
133
133
|
|
|
134
134
|
## 3. PowerShell 5.1 non-ASCII rule (#798)
|
|
135
135
|
|
|
@@ -154,24 +154,24 @@ When running under the Grok Build runtime on Windows + pwsh 7+, `run_terminal_co
|
|
|
154
154
|
|
|
155
155
|
This rule applies to the Grok Build runtime (pwsh 7+); Warp + Claude (PTY-based) is not affected by this wrapper leakage.
|
|
156
156
|
|
|
157
|
-
## 3.6 Safe subprocess on Windows -- UTF-8 capture
|
|
157
|
+
## 3.6 Safe subprocess on Windows -- UTF-8 capture (#1366)
|
|
158
158
|
|
|
159
|
-
|
|
159
|
+
**Historical note:** The `scripts/` Python directory was removed in #2022 (TS-native migration). The `scripts/_safe_subprocess.py::run_text` helper no longer exists. The underlying risk -- locale-codepage decode failures when capturing `gh api` output on Windows -- still applies to any TS tooling that shells out.
|
|
160
160
|
|
|
161
|
-
**Directive rule:** Any
|
|
161
|
+
**Directive rule for TS tooling:** Any TS script that captures `gh` output or other child-process output for parsing MUST use `execa` (preferred) or `child_process.spawn` with explicit `encoding: "utf8"`. Never use `execSync` / `spawnSync` without explicit encoding when the output may carry non-ASCII glyphs (Greptile bodies, gh REST bodies, user-authored commit messages).
|
|
162
162
|
|
|
163
|
-
```
|
|
164
|
-
|
|
165
|
-
|
|
163
|
+
```typescript
|
|
164
|
+
// WRONG -- Buffer return; non-ASCII bytes become mojibake or throw on .toString()
|
|
165
|
+
const out = execSync("gh api ...");
|
|
166
166
|
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
167
|
+
// RIGHT -- explicit utf8 encoding; non-ASCII bytes survive the round-trip
|
|
168
|
+
import { execa } from "execa";
|
|
169
|
+
const { stdout } = await execa("gh", ["api", "..."], { encoding: "utf8" });
|
|
170
170
|
```
|
|
171
171
|
|
|
172
|
-
This rule
|
|
172
|
+
This rule bites on Windows + Grok Build / cmd / PowerShell hosts where the default codepage is not UTF-8. Linux / macOS generally default to UTF-8 and do not reproduce the crash, but explicit encoding keeps behavior identical across platforms.
|
|
173
173
|
|
|
174
|
-
Reference: AGENTS.md `## Safe subprocess capture (#1366)`. Recurrence record: the #1166 swarm session repeatedly observed `Thread-3 (_readerthread) UnicodeDecodeError` across multiple gh-shelling tools; #1366 is the structural fix.
|
|
174
|
+
Reference: AGENTS.md `## Safe subprocess capture (#1366)`. Recurrence record: the #1166 swarm session repeatedly observed `Thread-3 (_readerthread) UnicodeDecodeError` across multiple gh-shelling tools; #1366 is the structural fix. `scripts/_safe_subprocess.py` was the Python-era solution; the TS-era solution is explicit encoding on every `execa`/`spawn` call.
|
|
175
175
|
|
|
176
176
|
## 3.7 Per-run unique pytest basetemp under concurrent swarm dispatch (#1681)
|
|
177
177
|
|
|
@@ -239,7 +239,7 @@ task scm:body:issue:edit -- --repo OWNER/REPO --issue 1555 --body-file "$bodyFil
|
|
|
239
239
|
task scm:body:pr:edit -- --repo OWNER/REPO --pr 42 --body-file "$bodyFile"
|
|
240
240
|
```
|
|
241
241
|
|
|
242
|
-
The wrapper reads UTF-8 body text from a file
|
|
242
|
+
The wrapper reads UTF-8 body text from a file and invokes the `github-body` TS CLI (which routes through `gh api --input -` with explicit UTF-8 encoding), then prints the live post-mutation read-back object. Use live `gh` for immediate verification after mutations; do not use `ghx` for the first read-back because it may serve a cached stale GET.
|
|
243
243
|
|
|
244
244
|
## 5.6 Issue reading — body then comments (#2143 / #2066)
|
|
245
245
|
|
|
@@ -404,7 +404,7 @@ The contract in one paragraph:
|
|
|
404
404
|
- The record is JSON with at least `agent_id` (matches filename), `parent_id`, `last_heartbeat_at` (ISO-8601 UTC, `Z`-suffix), `last_message` (one human-readable line), `phase` (one of `starting | implementing | validating | committing | pushing | polling | fixing | terminal`), and optional `terminal_state`.
|
|
405
405
|
- Writes MUST be atomic (write-to-temp + rename) so the monitor never reads a half-written file.
|
|
406
406
|
|
|
407
|
-
The parent monitor watches
|
|
407
|
+
The parent monitor watches the heartbeat file directly (three-state exit 0 ok / 1 stale-or-malformed / 2 config error). Skipping the heartbeat is a hard `⊗` for any long-running sub-agent: a stalled agent with no heartbeat surface is the exact #1166 failure mode this contract closes.
|
|
408
408
|
|
|
409
409
|
## 11. Mandatory DONE message even on early exit
|
|
410
410
|
|
|
@@ -433,7 +433,7 @@ The `--allow-stale` override is per-shell and audited: the dispatcher MAY pass i
|
|
|
433
433
|
|
|
434
434
|
The `--allow-missing-bootstrap` flag exists for the framework's own `task check` wiring (so a fresh framework checkout doesn't fail its own `verify:cache-fresh` aggregate run) and MUST NOT be passed by dispatchers. Consumer dispatchers leave it OFF; a missing cache is a real failure for them.
|
|
435
435
|
|
|
436
|
-
Reference: the gate is
|
|
436
|
+
Reference: the gate is exposed via `task verify:cache-fresh`; the subscription scope is read via the D12 surface (`task triage:scope`) so a consumer that has tightened `plan.policy.triageScope[]` is not gated by stale entries outside their subscription.
|
|
437
437
|
|
|
438
438
|
## 13. Cancellation Attribution (#1300)
|
|
439
439
|
|
|
@@ -19,7 +19,7 @@ Deft is installed in .deft/core/. Full guidelines: .deft/core/main.md
|
|
|
19
19
|
|
|
20
20
|
**Pre-cutover detected** if ANY of the following are true:
|
|
21
21
|
|
|
22
|
-
- ./SPECIFICATION.md exists and is neither a deprecation redirect nor a current generated spec export. A current generated spec export contains `<!-- Purpose: rendered specification -->` and `<!-- Source of truth: xbrief/specification.xbrief.json -->`, and `./xbrief/specification.xbrief.json` plus all five lifecycle folders exist.
|
|
22
|
+
- ./SPECIFICATION.md exists and is neither a deprecation redirect nor a current generated spec export. A current generated spec export contains `<!-- Purpose: rendered specification -->` and `<!-- Source of truth: xbrief/specification.xbrief.json -->`, and `./xbrief/specification.xbrief.json` plus all five lifecycle folders exist.
|
|
23
23
|
- ./PROJECT.md exists and is not a deprecation redirect (`<!-- deft:deprecated-redirect -->` or `<!-- Purpose: deprecation redirect -->`).
|
|
24
24
|
- ./xbrief/ exists but any of the five lifecycle subfolders (proposed/, pending/, active/, completed/, cancelled/) is missing
|
|
25
25
|
|
|
@@ -29,13 +29,15 @@ Deft is installed in .deft/core/. Full guidelines: .deft/core/main.md
|
|
|
29
29
|
|
|
30
30
|
## First Session
|
|
31
31
|
|
|
32
|
-
Check what exists before doing anything else:
|
|
32
|
+
! Check what exists before doing anything else -- do NOT respond to any user request until the correct phase fires:
|
|
33
33
|
|
|
34
34
|
**USER.md missing** (~/.config/deft/USER.md or %APPDATA%\deft\USER.md):
|
|
35
|
-
|
|
35
|
+
! Read .deft/core/.agents/skills/deft-directive-setup/SKILL.md and immediately start Phase 1 (user preferences). Do not wait for a user prompt.
|
|
36
36
|
|
|
37
|
-
**USER.md exists, PROJECT-DEFINITION.xbrief.json missing
|
|
38
|
-
|
|
37
|
+
**USER.md exists, `xbrief/PROJECT-DEFINITION.xbrief.json` missing**:
|
|
38
|
+
! Read .deft/core/.agents/skills/deft-directive-setup/SKILL.md and immediately start Phase 2 (project definition). This branch MUST fire even when USER.md already exists from a prior install or another project -- a pre-existing USER.md is not a reason to skip Phase 2 on a greenfield project.
|
|
39
|
+
|
|
40
|
+
⊗ Respond to any user query (greet, answer questions, take requests) before the correct phase has completed -- first-session phase routing is mandatory, not advisory.
|
|
39
41
|
|
|
40
42
|
## Returning Sessions
|
|
41
43
|
|
|
@@ -94,23 +96,21 @@ Projects on the legacy `vbrief/` tree are still read-accepted; run `deft migrate
|
|
|
94
96
|
|
|
95
97
|
## Umbrella status reading (#1152 / #2066)
|
|
96
98
|
|
|
97
|
-
Rationale + cross-references: `.deft/core/docs/analysis/2026-07-02-agents-md-incident-rule-rationale.md` § Umbrella current-shape convention (#1152).
|
|
98
|
-
|
|
99
99
|
- ! Fetch issue comments via REST (`gh api repos/<owner>/<repo>/issues/<N>/comments`), read the `## Current shape (as of pass-N)` comment, and any linked context or `LockedDecisions` xBRIEF referenced there — following the reading order body -> current-shape comment -> amendment comments (claim-cites-state-surface, #2066). Prefer the deterministic read path: `deft umbrella:current-shape <N>` (or `task umbrella:current-shape <N>`) — it locates the canonical comment, validates #1152 sections, and never falls back to the issue body.
|
|
100
100
|
- ⊗ Conclude umbrella or epic status from the issue body alone. Any "X is done" / "X is the blocker" assertion about an umbrella MUST cite the current-shape comment or another state artifact, not the body.
|
|
101
101
|
|
|
102
102
|
## Deterministic questions runtime obligation (#1470)
|
|
103
103
|
|
|
104
|
-
Rationale + cross-references: `.deft/core/
|
|
104
|
+
Rationale + cross-references: `.deft/core/contracts/deterministic-questions.md` (#767); closes the agent-runtime enforcement gap on issue #1470.
|
|
105
105
|
|
|
106
|
-
- ! ANY agent-initiated structured question — whether via host `ask_user_question` / `AskQuestion` tooling or a numbered menu rendered in chat — inside OR outside any skill flow MUST include `Discuss` and `Back` as the final two options, in that order, and MUST obey the Discuss-pause semantic documented verbatim in `.deft/core/
|
|
106
|
+
- ! ANY agent-initiated structured question — whether via host `ask_user_question` / `AskQuestion` tooling or a numbered menu rendered in chat — inside OR outside any skill flow MUST include `Discuss` and `Back` as the final two options, in that order, and MUST obey the Discuss-pause semantic documented verbatim in `.deft/core/contracts/deterministic-questions.md`.
|
|
107
107
|
- ! Before emitting any structured or numbered question, self-check: confirm `Discuss` and `Back` are present as the final two options; if not, add them before calling the tool or rendering the menu. Host-native `Other` / free-text affordances are NOT substitutes for `Discuss` (#767 / #431).
|
|
108
108
|
- ⊗ Emit a structured or numbered question without `Discuss` and `Back` as the final two options — including ad-hoc orchestration approvals, dispatch confirmations, and decision walkthroughs outside interview/setup/refinement skills.
|
|
109
109
|
- ⊗ Treat the host UI's automatic `Other` option as the stop-and-discuss escape hatch — `Other` widens the answer space; `Discuss` exits the deterministic flow entirely (see contract).
|
|
110
110
|
|
|
111
111
|
## Issue body→comments reading (#2143)
|
|
112
112
|
|
|
113
|
-
Rationale + cross-references:
|
|
113
|
+
Rationale + cross-references: preamble § 5.6 in `.deft/core/templates/agent-prompt-preamble.md` (#2143).
|
|
114
114
|
|
|
115
115
|
- ! Fetch both the issue body and `repos/<owner>/<repo>/issues/<N>/comments` via REST before concluding what the issue asks for or building a worker dispatch envelope. Read body first, then the comment thread in chronological order.
|
|
116
116
|
- ! `deft issue:ingest` / `task issue:ingest` fetches `/comments` by default and folds the thread into the ingested overview (#2143).
|
|
@@ -182,7 +182,7 @@ When the active project's `xbrief/PROJECT-DEFINITION.xbrief.json` has `plan.poli
|
|
|
182
182
|
|
|
183
183
|
> "[deft policy] Direct commits to the default branch are ENABLED (source: typed). Branch-protection policy is OFF."
|
|
184
184
|
|
|
185
|
-
This phrasing
|
|
185
|
+
This phrasing is produced by `deft policy:show --field=allowDirectCommitsToMaster` and stays in lockstep with the typed surface (#746). When the policy is OFF (default; `allowDirectCommitsToMaster=false`), no session-start disclosure is required -- the absence of the disclosure line itself signals the default-enforcing state.
|
|
186
186
|
|
|
187
187
|
Override paths (`deft policy:show` / `deft policy:enforce-branches` / `deft policy:allow-direct-commits -- --confirm` / `DEFT_ALLOW_DEFAULT_BRANCH_COMMIT=1`) are detailed in the Branch policy & branch verification section above.
|
|
188
188
|
|
|
@@ -190,7 +190,7 @@ Override paths (`deft policy:show` / `deft policy:enforce-branches` / `deft poli
|
|
|
190
190
|
|
|
191
191
|
## Platform-conditional rules (PowerShell / Windows)
|
|
192
192
|
|
|
193
|
-
Platform/tool/runtime-specific rules are lazy-loaded, not rendered here, so they don't crowd context for sessions that can't trigger them (#2157 / #1882). If your session matches a trigger below, load `.deft/core/
|
|
193
|
+
Platform/tool/runtime-specific rules are lazy-loaded, not rendered here, so they don't crowd context for sessions that can't trigger them (#2157 / #1882). If your session matches a trigger below, load `.deft/core/scm/github.md` § "PowerShell platform-conditional rules for agents" **before** the risky operation:
|
|
194
194
|
|
|
195
195
|
- ! Editing files with non-ASCII glyphs from PowerShell (especially PS 5.1) -- enforced at commit by `deft verify:encoding` (#798).
|
|
196
196
|
- ! Running shell commands under the Grok Build Windows + pwsh 7+ runtime -- piped/redirected commands leak wrapper text (#1353); PTY-based Warp + Claude are exempt.
|
|
@@ -220,7 +220,7 @@ Platform/tool/runtime-specific rules are lazy-loaded, not rendered here, so they
|
|
|
220
220
|
|
|
221
221
|
## Commands
|
|
222
222
|
|
|
223
|
-
Directive product commands use the `/deft:directive:*` namespace (#418 / #1670). Prior `/deft:*` product forms remain as deprecation-warning aliases — see
|
|
223
|
+
Directive product commands use the `/deft:directive:*` namespace (#418 / #1670). Prior `/deft:*` product forms remain as deprecation-warning aliases — see `.deft/core/commands.md` for the full alias table. Cross-product session commands stay at the umbrella `/deft:*` level.
|
|
224
224
|
|
|
225
225
|
**Directive product (`/deft:directive:*`):**
|
|
226
226
|
|