@deftai/directive-content 0.94.0 → 0.96.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/skills/deft-directive-sync/SKILL.md +4 -3
- package/QUICK-START.md +3 -1
- package/Taskfile.yml +23 -1
- package/UPGRADING.md +103 -1
- package/commands.md +37 -10
- package/contracts/agent-hook-readiness.md +67 -0
- package/conventions/rule-ownership.json +2 -2
- package/docs/consumer-issue-label-kit.md +211 -0
- package/docs/freshness-contract.md +139 -0
- package/docs/getting-started.md +2 -0
- package/docs/openclaw-agent-host.md +22 -6
- package/package.json +1 -1
- package/packs/skills/skills-pack-0.1.json +13 -14
- package/resilience/continue-here.md +8 -8
- package/scm/github.md +9 -3
- package/skills/deft-directive-build/SKILL.md +18 -0
- package/skills/deft-directive-pre-pr/SKILL.md +18 -0
- package/skills/deft-directive-refinement/SKILL.md +1 -3
- package/skills/deft-directive-review-cycle/SKILL.md +33 -11
- package/skills/deft-directive-swarm/SKILL.md +22 -11
- package/skills/deft-directive-swarm/references/core-ops.md +2 -1
- package/skills/deft-directive-swarm/references/core-phase-0.md +6 -14
- package/skills/deft-directive-swarm/references/core-phase-3.md +12 -9
- package/skills/deft-directive-swarm/references/core-phase-5-6.md +1 -1
- package/skills/deft-directive-swarm/references/host-claude-code.md +86 -0
- package/skills/deft-directive-swarm/references/host-cursor.md +1 -1
- package/skills/deft-directive-swarm/references/host-openclaw.md +8 -4
- package/skills/deft-directive-sync/SKILL.md +181 -26
- package/skills/deft-directive-triage/SKILL.md +21 -8
- package/skills/deft-directive-xbrief/SKILL.md +0 -1
- package/tasks/cache.yml +31 -0
- package/tasks/triage-classify.yml +1 -1
- package/templates/agent-prompt-preamble.md +26 -4
- package/templates/agents-entry.md +1 -0
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
# Consumer issue-label kit
|
|
2
|
+
|
|
3
|
+
**Audience:** consumer projects that use Directive (not the `deftai/directive` maintainer repo).
|
|
4
|
+
**Status:** recommended starter set -- not a mandate.
|
|
5
|
+
**Related:** [#2611](https://github.com/deftai/directive/issues/2611) (this kit) · [#2609](https://github.com/deftai/directive/issues/2609) (maintainer taxonomy only) · [#3124](https://github.com/deftai/directive/issues/3124) (session discovery tips) · [#1423](https://github.com/deftai/directive/issues/1423) (SCM label mirror)
|
|
6
|
+
|
|
7
|
+
Directive agents label issues from the **repo's existing** label set. They must not invent labels. This guide ships a **thin portable kit** so capacity and triage matchers have something real to use.
|
|
8
|
+
|
|
9
|
+
⊗ Import the full `deftai/directive` maintainer catalog (dozens of facets such as `ts-migration`, `swarm`, `area:vbrief`, full `patterns:*`). That catalog is maintainer-only ([`.github/ISSUE_LABELS.md`](https://github.com/deftai/directive/blob/master/.github/ISSUE_LABELS.md) / #2609).
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Recommended kit
|
|
14
|
+
|
|
15
|
+
Create these labels in your forge (GitHub/GitLab/etc.) when you adopt Directive, or when your backlog is bare. Prefer existing project names when you already have equivalents (`defect` for `bug`, a single docs label for `documentation`).
|
|
16
|
+
|
|
17
|
+
### Core (always recommend)
|
|
18
|
+
|
|
19
|
+
| Label | Role |
|
|
20
|
+
|-------|------|
|
|
21
|
+
| `bug` | Defect / incorrect behavior |
|
|
22
|
+
| `enhancement` | New capability or improvement |
|
|
23
|
+
| `documentation` | Docs-only work |
|
|
24
|
+
| `duplicate` | Already tracked elsewhere |
|
|
25
|
+
| `wontfix` | Declined / out of scope |
|
|
26
|
+
|
|
27
|
+
Optional priority: `urgent` (or your project's priority label).
|
|
28
|
+
|
|
29
|
+
### Role (if you run multi-issue programs)
|
|
30
|
+
|
|
31
|
+
| Label | Role |
|
|
32
|
+
|-------|------|
|
|
33
|
+
| `epic` | Multi-ship **product** initiative root (rare) |
|
|
34
|
+
| `status:tracker` | Long-lived coordination home (plan / children), not one PR |
|
|
35
|
+
| `status:child` | Has a parent -- not a root queue item |
|
|
36
|
+
|
|
37
|
+
### Triage / mirror (if you use Directive triage + label mirror)
|
|
38
|
+
|
|
39
|
+
| Label | Role |
|
|
40
|
+
|-------|------|
|
|
41
|
+
| `triaged` | Machine idempotency -- classify/mirror already ran (**include if you recommend mirror**) |
|
|
42
|
+
| `triage` | Optional human "area of work" chip (not a machine `triage:*` label) |
|
|
43
|
+
|
|
44
|
+
Optional action chips (only if you set `plan.policy.triageLabelMirror.actionLabels`). Use the **same names** as the maintainer machine set -- do not invent a second vocabulary:
|
|
45
|
+
|
|
46
|
+
| Label | Typical `actionLabels` key |
|
|
47
|
+
|-------|----------------------------|
|
|
48
|
+
| `triage:deferred` | `defer` |
|
|
49
|
+
| `triage:archived` | `archive` |
|
|
50
|
+
|
|
51
|
+
Richer chips (`triage:lifecycle-linked`, `triage:needs-human`) exist in the maintainer set; adopt them only when your policy maps those actions.
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## Story / PR (MUST)
|
|
56
|
+
|
|
57
|
+
- Prefer **one issue ≈ one story ≈ one PR**.
|
|
58
|
+
- Do **not** open an "epic" for two tiny checklist tasks.
|
|
59
|
+
- Epic/tracker issues stay open across many PRs; **each child** closes with its PR.
|
|
60
|
+
- Epics are **not** the PR unit.
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## When to use `epic` (short rule)
|
|
65
|
+
|
|
66
|
+
Apply **`epic` only** when this issue is a **multi-ship product initiative**: multiple shippable units by design, and this issue is the program home.
|
|
67
|
+
|
|
68
|
+
**Not** "has two children." Children are normal stories with optional **`status:child`**, never `epic`.
|
|
69
|
+
|
|
70
|
+
| Situation | Labels |
|
|
71
|
+
|-----------|--------|
|
|
72
|
+
| Product multi-ship root | `epic` + `status:tracker` |
|
|
73
|
+
| Process / coordination board | `status:tracker` (epic optional / discouraged) |
|
|
74
|
+
| Leaf under a parent | type label + optional `status:child` |
|
|
75
|
+
| Standalone one-PR story | type label only |
|
|
76
|
+
|
|
77
|
+
Parent identity lives in **links** (and current-shape / body text), not in labels. Nested mid-trackers may wear both `status:tracker` and `status:child`. Do not invent depth labels (`tracker-l2`, …).
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## Document your labels
|
|
82
|
+
|
|
83
|
+
~ Keep a short project catalog so agents and humans share one vocabulary. A common pattern is `.github/ISSUE_LABELS.md` in the **consumer** repo (name is a convention; any stable path works if AGENTS.md or CONTRIBUTING points at it).
|
|
84
|
+
|
|
85
|
+
Example stub:
|
|
86
|
+
|
|
87
|
+
```markdown
|
|
88
|
+
# Issue labels (this repo)
|
|
89
|
+
|
|
90
|
+
Recommended starter set from Deft Directive consumer kit:
|
|
91
|
+
https://github.com/deftai/directive/blob/master/content/docs/consumer-issue-label-kit.md
|
|
92
|
+
|
|
93
|
+
## Core
|
|
94
|
+
- bug, enhancement, documentation, duplicate, wontfix
|
|
95
|
+
- optional: urgent
|
|
96
|
+
|
|
97
|
+
## Role (multi-issue programs)
|
|
98
|
+
- epic (rare multi-ship product root)
|
|
99
|
+
- status:tracker, status:child
|
|
100
|
+
|
|
101
|
+
## Mirror (if using triage:classify -- --mirror)
|
|
102
|
+
- triaged
|
|
103
|
+
- optional action chips: triage:deferred, triage:archived
|
|
104
|
+
(only if plan.policy.triageLabelMirror.actionLabels maps them)
|
|
105
|
+
|
|
106
|
+
Do not invent labels outside this file. Prefer existing names over twins.
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
! When creating issues, apply at least one appropriate label from the **existing** set.
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## Optional: label mirror appendix
|
|
114
|
+
|
|
115
|
+
After SCM label mirror Waves 1–2 (#1423 / #3125):
|
|
116
|
+
|
|
117
|
+
| Topic | Guidance |
|
|
118
|
+
|-------|----------|
|
|
119
|
+
| Defaults | Mirror is available; on match it stamps **`triaged`** (idempotency). Action chips only when configured. |
|
|
120
|
+
| Dry-run | `deft triage:classify -- --mirror` (open-only default). Review the digest before `--apply`. |
|
|
121
|
+
| Apply | `deft triage:classify -- --mirror --apply` writes labels in batches; re-run is a no-op for already-`triaged` issues. |
|
|
122
|
+
| More matches | Add rules under `plan.policy.triageAutoClassify` in `xbrief/PROJECT-DEFINITION.xbrief.json`. |
|
|
123
|
+
| Richer chips | Set `plan.policy.triageLabelMirror.actionLabels` **and** create those GitHub labels first. |
|
|
124
|
+
| Accept path | ⊗ Never auto-`triage:accept` / never auto-write `proposed/` from mirror. Accept stays an operator decision. |
|
|
125
|
+
|
|
126
|
+
Minimal policy sketch (clone and edit; broader triage field examples live in the framework repo at [`docs/example-project-definition.md`](https://github.com/deftai/directive/blob/master/docs/example-project-definition.md) — not deposited under `.deft/core/`):
|
|
127
|
+
|
|
128
|
+
```json
|
|
129
|
+
{
|
|
130
|
+
"plan": {
|
|
131
|
+
"policy": {
|
|
132
|
+
"triageAutoClassify": [
|
|
133
|
+
{
|
|
134
|
+
"match": { "labels": { "any-of": ["wontfix"] } },
|
|
135
|
+
"action": "defer",
|
|
136
|
+
"reason": "wontfix"
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
"match": { "labels": { "any-of": ["duplicate"] } },
|
|
140
|
+
"action": "archive",
|
|
141
|
+
"reason": "duplicate"
|
|
142
|
+
}
|
|
143
|
+
],
|
|
144
|
+
"triageLabelMirror": {
|
|
145
|
+
"actionLabels": {
|
|
146
|
+
"defer": ["triage:deferred"],
|
|
147
|
+
"archive": ["triage:archived"]
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
If you only want the default `triaged` stamp, you can omit `actionLabels` entirely.
|
|
156
|
+
|
|
157
|
+
Validate with:
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
deft triage:classify -- --validate
|
|
161
|
+
deft triage:classify -- --mirror
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
## Capacity and ranking
|
|
167
|
+
|
|
168
|
+
Labels only help ranking and auto-classify when they **exist** on the forge and appear on issues. After the kit is created:
|
|
169
|
+
|
|
170
|
+
- Point `plan.policy.triageRankingLabels` at labels you care about first (for example `urgent`, `bug`).
|
|
171
|
+
- Point `plan.policy.triageScope` at the open-work envelope you want in cache.
|
|
172
|
+
- Run `deft triage:welcome` (or your host's triage onboarding) so subscription and WIP policy match the kit.
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## What not to copy from directive
|
|
177
|
+
|
|
178
|
+
Do **not** treat the maintainer catalog as a consumer default. Examples of maintainer-only names:
|
|
179
|
+
|
|
180
|
+
- `ts-migration`, `swarm`, `area:vbrief`, full `patterns:*` trees
|
|
181
|
+
- Large `area:*` / platform / process zoos built for the framework monorepo
|
|
182
|
+
- `legacy:*` quarantine names (closed history only on the framework repo)
|
|
183
|
+
|
|
184
|
+
Name alignment for the thin shared set (`bug`, `enhancement`, `documentation`, `epic`, `status:tracker`, `status:child`, `triaged`, optional `triage:*` action chips) follows **#2609** so mirror and classify stay portable. Full facet depth stays maintainer-only.
|
|
185
|
+
|
|
186
|
+
---
|
|
187
|
+
|
|
188
|
+
## Discovery
|
|
189
|
+
|
|
190
|
+
Installed deposit (consumer tree):
|
|
191
|
+
|
|
192
|
+
| Surface | Path after deposit |
|
|
193
|
+
|---------|-------------------|
|
|
194
|
+
| This doc | `.deft/core/docs/consumer-issue-label-kit.md` |
|
|
195
|
+
| SCM guide | `.deft/core/scm/github.md` (section Issue Labels) |
|
|
196
|
+
| Getting started | `.deft/core/docs/getting-started.md` (backlog section) |
|
|
197
|
+
|
|
198
|
+
Framework source / GitHub (browse when not in a deposit):
|
|
199
|
+
|
|
200
|
+
| Surface | URL / path |
|
|
201
|
+
|---------|------------|
|
|
202
|
+
| This doc | [`content/docs/consumer-issue-label-kit.md`](https://github.com/deftai/directive/blob/master/content/docs/consumer-issue-label-kit.md) |
|
|
203
|
+
| Session tip packaging | **#3124** (after this kit) |
|
|
204
|
+
|
|
205
|
+
---
|
|
206
|
+
|
|
207
|
+
## Related reading
|
|
208
|
+
|
|
209
|
+
- Maintainer taxonomy (do not import wholesale): [`.github/ISSUE_LABELS.md`](https://github.com/deftai/directive/blob/master/.github/ISSUE_LABELS.md) (#2609)
|
|
210
|
+
- Label mirror behavior: deposit `.deft/core/commands.md` (or framework `content/commands.md`) / `deft triage:classify -- --mirror` (#1423, #3125)
|
|
211
|
+
- Example PROJECT-DEFINITION triage fields: [`docs/example-project-definition.md`](https://github.com/deftai/directive/blob/master/docs/example-project-definition.md) (#1186; framework repo only, not deposited)
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# Freshness contract: bound vs live generation (#3117)
|
|
2
|
+
|
|
3
|
+
Long-lived multi-agent sessions can keep executing the pre-upgrade payload they
|
|
4
|
+
loaded earlier even after `directive update` / deposit apply succeeds and disk
|
|
5
|
+
probes report "up to date." This product **freshness contract** is host-agnostic:
|
|
6
|
+
it does not depend on any single host session-key mechanism.
|
|
7
|
+
|
|
8
|
+
## Readiness rule
|
|
9
|
+
|
|
10
|
+
Disk-only freshness is **insufficient**. A session is ready only when its
|
|
11
|
+
**bound** generation matches the **live** deposit generation for the surfaces
|
|
12
|
+
it uses.
|
|
13
|
+
|
|
14
|
+
## Generation token
|
|
15
|
+
|
|
16
|
+
On successful deposit apply (`directive init`) or payload refresh
|
|
17
|
+
(`directive update` when content swaps), Directive stamps a **monotonic** live
|
|
18
|
+
generation under:
|
|
19
|
+
|
|
20
|
+
```text
|
|
21
|
+
.deft/GENERATION.json
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
The file is outside `.deft/core/` so a full-tree payload replace does not wipe
|
|
25
|
+
the counter. Fields include `generation` (integer ≥ 1), `contentVersion`,
|
|
26
|
+
`stampedAt`, `stampedBy`, and per-surface fingerprints (`payload`, `version`,
|
|
27
|
+
`templates`, `skills`, `docs`).
|
|
28
|
+
|
|
29
|
+
Already-current update paths ensure the token exists without advancing the
|
|
30
|
+
counter when the content version is unchanged.
|
|
31
|
+
|
|
32
|
+
## Session bind
|
|
33
|
+
|
|
34
|
+
When a mutation `session:start` (cold or re-arm) loads payload surfaces into
|
|
35
|
+
runtime context, it binds the live generation:
|
|
36
|
+
|
|
37
|
+
```text
|
|
38
|
+
.deft/session-binds/<safe-session-id>.json # multi-agent isolation (preferred)
|
|
39
|
+
.deft/session-bind.json # default / last-bind convenience
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Multi-agent hosts **must** pin session identity so one session cannot certify
|
|
43
|
+
another as current:
|
|
44
|
+
|
|
45
|
+
1. Prefer `DEFT_SESSION_ID=<id>` in the process environment (printed by
|
|
46
|
+
`session:start`), or
|
|
47
|
+
2. Pass `--session-id <id>` on every `freshness:report` / `freshness:bind`.
|
|
48
|
+
|
|
49
|
+
Trusted readiness (`state=current`, exit 0) requires a **pinned** identity
|
|
50
|
+
(explicit flag or `DEFT_SESSION_ID`). Bare report without a pin never returns
|
|
51
|
+
`ready=true` even if a ritual-recovered bind matches live — that prevents
|
|
52
|
+
cross-session false current when multiple agents share a worktree.
|
|
53
|
+
|
|
54
|
+
`session:start` binds the ritual `session_id` path and prints the
|
|
55
|
+
`DEFT_SESSION_ID=…` line for the operator or host to adopt.
|
|
56
|
+
|
|
57
|
+
Hosts and operators can rebind without restarting the shared host runtime:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
# After re-loading payload surfaces into the session:
|
|
61
|
+
deft freshness:bind -- --confirm-payload-loaded
|
|
62
|
+
# multi-agent hosts MUST pin identity:
|
|
63
|
+
deft freshness:bind -- --session-id <host-session-id> --confirm-payload-loaded
|
|
64
|
+
export DEFT_SESSION_ID=<host-session-id>
|
|
65
|
+
deft freshness:report
|
|
66
|
+
# or
|
|
67
|
+
deft freshness:report -- --session-id <host-session-id>
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
`session:start` attests `payloadLoaded` automatically (payload load ceremony).
|
|
71
|
+
A bare bind without `--confirm-payload-loaded` never yields trusted readiness.
|
|
72
|
+
|
|
73
|
+
API (TypeScript): `bindSessionGeneration(projectRoot, options)` /
|
|
74
|
+
`reportFreshness(projectRoot, { sessionId })` from
|
|
75
|
+
`@deftai/directive-core/freshness`.
|
|
76
|
+
|
|
77
|
+
## Freshness report
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
deft freshness:report
|
|
81
|
+
task freshness:report
|
|
82
|
+
task session:freshness
|
|
83
|
+
deft freshness:report -- --json
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Exit codes:
|
|
87
|
+
|
|
88
|
+
| Code | Meaning |
|
|
89
|
+
|------|---------|
|
|
90
|
+
| 0 | `current` — bound matches live for used surfaces |
|
|
91
|
+
| 1 | `stale_soft` or `unbound` — caution / not yet bound |
|
|
92
|
+
| 2 | `stale_hard` — rebind before trusted work |
|
|
93
|
+
|
|
94
|
+
Report fields: bound generation, live generation, state, differing surfaces
|
|
95
|
+
(hard vs soft), rebind guidance, mid-mission safety note.
|
|
96
|
+
|
|
97
|
+
## State meanings
|
|
98
|
+
|
|
99
|
+
| State | Meaning | Operator action |
|
|
100
|
+
|-------|---------|-----------------|
|
|
101
|
+
| `current` | Bound matches live | Ready for trusted work |
|
|
102
|
+
| `stale_soft` | Additive / advisory drift (e.g. docs-only) | Safe to continue with caution; rebind when convenient |
|
|
103
|
+
| `stale_hard` | Evidence-untrustworthy drift (payload / version / templates / skills, or generation advance) | **Must rebind** before trusted work |
|
|
104
|
+
| `unbound` | No session bind recorded | Bind after loading surfaces |
|
|
105
|
+
|
|
106
|
+
Hard surfaces: `payload`, `version`, `templates`, `skills`.
|
|
107
|
+
Soft surfaces: `docs` (advisory).
|
|
108
|
+
|
|
109
|
+
## Rebind without host restart
|
|
110
|
+
|
|
111
|
+
1. Park in-flight mission work (see mid-mission safety).
|
|
112
|
+
2. Re-load skill, ritual, template, and command bodies from the live deposit into
|
|
113
|
+
the session context (host-specific load; product does not restart the host).
|
|
114
|
+
3. Run `deft freshness:bind` (or cold/re-arm `session:start`, which binds
|
|
115
|
+
automatically).
|
|
116
|
+
4. Confirm with `deft freshness:report` → `current`.
|
|
117
|
+
|
|
118
|
+
Prefer `session:start --rearm` or `session:ready` when ritual state is still
|
|
119
|
+
valid on the same worktree — re-arm also rebinds generation.
|
|
120
|
+
|
|
121
|
+
## Mid-mission safety
|
|
122
|
+
|
|
123
|
+
- **Park and hand off** before a hard refresh or hard rebind.
|
|
124
|
+
- An empty session after refresh is **not** "work complete." Resume from the
|
|
125
|
+
handoff artifact, not from a blank context.
|
|
126
|
+
- Consumer policy decides *when* to refresh; this product owns generation +
|
|
127
|
+
honesty of bound-vs-live.
|
|
128
|
+
|
|
129
|
+
## Non-goals
|
|
130
|
+
|
|
131
|
+
- Restarting the whole shared runtime as the freshness mechanism.
|
|
132
|
+
- Auto-resetting sessions on any file mtime change.
|
|
133
|
+
- Bound proof for remote PR claims (see #3120).
|
|
134
|
+
|
|
135
|
+
## Related
|
|
136
|
+
|
|
137
|
+
- `content/commands.md` § Session-start ritual / freshness pointer
|
|
138
|
+
- Doctor `payload-staleness` (disk/registry currency) — complementary, not a substitute
|
|
139
|
+
- Issue #3117
|
package/docs/getting-started.md
CHANGED
|
@@ -80,6 +80,8 @@ checks tools without rewriting consumer-managed files.
|
|
|
80
80
|
|
|
81
81
|
If you are adopting Deft on a project that already has an issue tracker (existing repo, brownfield migration, an upstream bug list that has been accumulating), you do not have to start from an empty `xbrief/proposed/`. The refinement skill's **Phase 0 triage workflow** lets you walk an existing backlog locally, decide what to keep, and let only the **accepted** items land in `xbrief/proposed/`. Trigger words: **"triage"**, **"work the cache"**, **"pre-ingest"**, **"action menu"**.
|
|
82
82
|
|
|
83
|
+
**Labels first:** capacity and triage matchers only help when labels exist. For a bare or thin label set, adopt the [consumer issue-label kit](./consumer-issue-label-kit.md) (#2611) before you rely on ranking or `triage:classify -- --mirror`.
|
|
84
|
+
|
|
83
85
|
### Step 1 — Scoped first populate
|
|
84
86
|
|
|
85
87
|
A real-sized backlog can drain the shared GitHub GraphQL bucket if you fetch everything at once (see [#976](https://github.com/deftai/directive/issues/976) for the recurring symptom). Scope the first populate so it lands in seconds rather than minutes:
|
|
@@ -204,7 +204,7 @@ deft doctor --fix --openclaw-all-agents
|
|
|
204
204
|
|
|
205
205
|
---
|
|
206
206
|
|
|
207
|
-
## Swarm on OpenClaw (#2929 / #2934 / #2943)
|
|
207
|
+
## Swarm on OpenClaw (#2929 / #2934 / #2943 / #3131)
|
|
208
208
|
|
|
209
209
|
! For **parallel** swarm leaves on OpenClaw:
|
|
210
210
|
|
|
@@ -214,16 +214,20 @@ deft doctor --fix --openclaw-all-agents
|
|
|
214
214
|
|
|
215
215
|
! After a coding cohort completes, dispatch the next phase with a **real tool call in the same turn**, or write explicit terminal status (`blocked` / `awaiting-human` / `done`). Do not end on narrative-only “I will spawn…”.
|
|
216
216
|
|
|
217
|
-
### Parent-monitor after `subagent_announce` (#2943)
|
|
217
|
+
### Parent-monitor after `subagent_announce` (#2943 / hard-stop #3131)
|
|
218
218
|
|
|
219
|
-
OpenClaw parents can lock into a **text-only repetition hang** after thin leaf completions: the model regenerates the same “checking worktrees / open PRs next” sentence with **zero tool calls** until length cap or abort. Subagents may still be healthy; only the parent appears hung.
|
|
219
|
+
OpenClaw parents can lock into a **text-only repetition hang** after thin leaf completions: the model regenerates the same “checking worktrees / open PRs next” sentence with **zero tool calls** until length cap or abort. Subagents may still be healthy; only the parent appears hung. Soft skill prose alone is **not** enough (#2943 closed; recurrence under production → **#3131**).
|
|
220
220
|
|
|
221
|
-
! After any leaf completion event (`subagent_announce` / parent-push completion), the parent’s **first response** MUST be
|
|
221
|
+
! After any leaf completion event (`subagent_announce` / parent-push completion), the parent’s **first response** MUST be exactly one of:
|
|
222
222
|
|
|
223
|
-
1. **Tool-first ground-truth batch** — one same-turn tool batch that inspects reality (`gh` PR/issue status, `git` / worktree status, or file/xBRIEF state), **or**
|
|
224
|
-
2. **`sessions_yield`** (or host equivalent yield) — leave the turn steerable without narrating unfinished work
|
|
223
|
+
1. **Tool-first ground-truth batch** — one same-turn tool batch that inspects reality (`gh` PR/issue status, `git` / worktree status, or file/xBRIEF state), then one consolidate, **or**
|
|
224
|
+
2. **`sessions_yield`** (or host equivalent yield / wait) — leave the turn steerable without narrating unfinished work, **or**
|
|
225
|
+
3. **One short user answer** that is **not** a repeated progress line.
|
|
225
226
|
|
|
226
227
|
⊗ Open the first response after announce with multi-sentence progress-only prose (“Two leaves look unfinished…”, “Checking worktrees next…”, “Implementing both myself…”) and **zero** tool calls / yield.
|
|
228
|
+
⊗ Emit **N>2** near-identical assistant sentences (or streaming text chunks) in one turn with no `tool_use` / yield — **FC14 text-repetition hang** (illegal turn shape; hard-stop).
|
|
229
|
+
|
|
230
|
+
! **Machine check (hard-stop, not prose-only):** `evaluateParentTurnShape` in `@deftai/directive-core` / `@deftai/directive-core/parent-turn-shape` (`packages/core/src/parent-turn-shape/`). Hosts and parents SHOULD feed ordered turn events (`assistant_text` / `tool_use` / `yield`) mid-stream; when `ok === false` and `failClass` is `FC14` (or `progress-only-no-tool` after announce), **abort the turn** / force tool-or-yield — do not burn the output budget. Soft skill text is **not** the sole mitigation.
|
|
227
231
|
|
|
228
232
|
! **Thin DONE = failed leaf:** a completion without PR URL / merge evidence (and without a structured `BLOCKED` / `FAILED` terminal) is **not** success. Treat as failed: re-dispatch or take over after the ground-truth batch. Do not celebrate thin DONE as shipped.
|
|
229
233
|
|
|
@@ -231,6 +235,16 @@ OpenClaw parents can lock into a **text-only repetition hang** after thin leaf c
|
|
|
231
235
|
|
|
232
236
|
Full rules: [`skills/deft-directive-swarm/references/host-openclaw.md`](../skills/deft-directive-swarm/references/host-openclaw.md), thin swarm SKILL hard-gates, and [`templates/agent-prompt-preamble.md`](../templates/agent-prompt-preamble.md) §11. This page does not fork a second source of truth.
|
|
233
237
|
|
|
238
|
+
### Operator recovery — FC14 parent hang on current OpenClaw beta pins (#3131)
|
|
239
|
+
|
|
240
|
+
When the Control UI / parent seat is stuck replaying the same progress sentence with no tools:
|
|
241
|
+
|
|
242
|
+
1. **Abort the parent turn** (Control UI stop / interrupt / cancel generation). Do **not** wait for length-cap.
|
|
243
|
+
2. **Do not assume leaves failed.** Check worktrees, open PRs, and xBRIEF state with a **tool-first** batch from a fresh parent turn (`gh` / `git` / files). Leaves may already be DONE or mid-review.
|
|
244
|
+
3. **Resume with a legal shape only:** tool-first ground truth, `sessions_yield`, or one short non-repeated answer. ⊗ Restart by pasting more “checking next…” prose.
|
|
245
|
+
4. **If the hang returns immediately:** refresh Directive deposit (`npm i -g @deftai/directive@latest` then `directive update` / `deft update` / `deft doctor --fix` for OpenClaw skill pins — see § Wire skills into OpenClaw workspace), re-open the parent with current `openclaw-agent-host` + swarm host adapter text, and re-dispatch only after ground truth.
|
|
246
|
+
5. **Host pin note:** On OpenClaw beta pins that do not yet call `evaluateParentTurnShape` in the stream, the operator abort in step 1 **is** the hard stop. Directive still ships the machine-check library + skill/docs so soft prose is not the only mitigation once the host wires it (or an agent-side gate evaluates a recorded turn). Surface `FC14` in notes when reporting the incident.
|
|
247
|
+
|
|
234
248
|
## Anti-patterns
|
|
235
249
|
|
|
236
250
|
- ⊗ Main-session `gh` poll + **cron** as the default babysit path when the installed skill offers a Tier 1 / background monitor.
|
|
@@ -239,9 +253,11 @@ Full rules: [`skills/deft-directive-swarm/references/host-openclaw.md`](../skill
|
|
|
239
253
|
- ⊗ Substituting host-native review theater for `deft-directive-review-cycle` on Deft-managed repos.
|
|
240
254
|
- ⊗ Claiming this doc alone makes `sessions_spawn` a shipped register/matrix primitive — that is epic skill/engine work (#2875 / #2876).
|
|
241
255
|
- ⊗ Multi-sentence progress-only first response after `subagent_announce` with zero tools / yield (#2943 text-repetition hang).
|
|
256
|
+
- ⊗ N>2 near-identical assistant sentences in one turn with no tool_use / yield (FC14 / #3131 hard-stop).
|
|
242
257
|
- ⊗ Treating thin DONE (no PR URL / merge evidence) as success (#2943).
|
|
243
258
|
- ⊗ Assuming package install alone populates OpenClaw `available_skills` — wire main workspace pins via `deft doctor --fix` (#3001).
|
|
244
259
|
- ⊗ Auto-enumerating every `workspace-*` seat without `--openclaw-all-agents` (#3001).
|
|
260
|
+
- ⊗ Relying on soft skill prose alone as the sole mitigation for the parent hang (#3131).
|
|
245
261
|
|
|
246
262
|
---
|
|
247
263
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@deftai/directive-content",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.96.0",
|
|
4
4
|
"description": "Shippable Directive framework content in the consumer .deft/core/ layout (C1 flatten), plus the engine surfaces (.githooks/, Taskfile.yml, tasks/) the deposit wires. Python-free per #2022 Phase 3. Refs #11, #1669, #1967.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|