@deftai/directive-runtime 0.126.0-beta.3 → 0.127.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-release/SKILL.md +428 -7
- package/Taskfile.yml +1 -1
- package/dist/contract-entry.js +2 -4
- package/dist/dispatch.js +1 -6
- package/dist/doctor-diagnose.js +10 -7
- package/dist/hook-dispatch.d.ts +1 -1
- package/dist/hook-dispatch.js +1 -1
- package/dist/install-cli/coverage-map.d.ts +1 -5
- package/dist/install-cli/coverage-map.js +28 -22
- package/dist/installer-output-inventory.js +1 -4
- package/dist/lifecycle-cli/coverage-map.js +37 -35
- package/dist/migrate.js +12 -7
- package/dist/removal-steps/index.d.ts +2 -2
- package/dist/removal-steps/steps.js +6 -9
- package/dist/removal-steps/strategies.js +1 -1
- package/dist/setup-wiring.d.ts +4 -0
- package/dist/setup-wiring.js +6 -7
- package/dist/setup.js +12 -14
- package/dist/uninstall.js +1 -1
- package/dist/vbrief-preflight-fixtures.js +1 -1
- package/dist/verify-intent-constraint.d.ts +2 -0
- package/dist/verify-intent-constraint.js +24 -0
- package/dist/verify-observable-scope.d.ts +2 -0
- package/dist/verify-observable-scope.js +24 -0
- package/docs/intent-constraint.md +7 -1
- package/docs/observable-scope.md +6 -0
- package/package.json +1 -1
- package/packs/skills/skills-pack-0.1.json +3 -3
- package/scm/github.md +1 -0
- package/skills/deft-directive-feedback/SKILL.md +9 -20
- package/skills/deft-directive-release/SKILL.md +4 -4
- package/skills/deft-directive-review-cycle/SKILL.md +2 -2
- package/skills/deft-directive-setup/SKILL.md +17 -41
- package/skills/deft-directive-swarm/references/host-cursor.md +18 -1
- package/skills/deft-directive-swarm/references/host-grok-build.md +3 -3
- package/skills/deft-directive-sync/SKILL.md +2 -2
- package/skills/deft-directive-tutorial/SKILL.md +1 -1
- package/tasks/engine.yml +11 -4
- package/templates/agents-entry.md +1 -0
- package/vendor/directive-content/.agents/skills/deft-directive-release/SKILL.md +428 -7
- package/vendor/directive-content/Taskfile.yml +1 -1
- package/vendor/directive-content/docs/intent-constraint.md +7 -1
- package/vendor/directive-content/docs/observable-scope.md +6 -0
- package/vendor/directive-content/packs/skills/skills-pack-0.1.json +3 -3
- package/vendor/directive-content/scm/github.md +1 -0
- package/vendor/directive-content/skills/deft-directive-feedback/SKILL.md +9 -20
- package/vendor/directive-content/skills/deft-directive-release/SKILL.md +4 -4
- package/vendor/directive-content/skills/deft-directive-review-cycle/SKILL.md +2 -2
- package/vendor/directive-content/skills/deft-directive-setup/SKILL.md +17 -41
- package/vendor/directive-content/skills/deft-directive-swarm/references/host-cursor.md +18 -1
- package/vendor/directive-content/skills/deft-directive-swarm/references/host-grok-build.md +3 -3
- package/vendor/directive-content/skills/deft-directive-sync/SKILL.md +2 -2
- package/vendor/directive-content/skills/deft-directive-tutorial/SKILL.md +1 -1
- package/vendor/directive-content/tasks/engine.yml +11 -4
- package/vendor/directive-content/templates/agents-entry.md +1 -0
- package/vendor/directive-core/dist/.tsbuildinfo +1 -1
- package/vendor/directive-core/dist/consumer-check-contract/evaluate.d.ts +3 -2
- package/vendor/directive-core/dist/consumer-check-contract/evaluate.d.ts.map +1 -1
- package/vendor/directive-core/dist/consumer-check-contract/evaluate.js +7 -6
- package/vendor/directive-core/dist/consumer-check-contract/evaluate.js.map +1 -1
- package/vendor/directive-core/dist/content-contracts/skills/greptile-detector.d.ts +6 -0
- package/vendor/directive-core/dist/content-contracts/skills/greptile-detector.d.ts.map +1 -1
- package/vendor/directive-core/dist/content-contracts/skills/greptile-detector.js +97 -3
- package/vendor/directive-core/dist/content-contracts/skills/greptile-detector.js.map +1 -1
- package/vendor/directive-core/dist/coverage-applicability/evaluate.d.ts.map +1 -1
- package/vendor/directive-core/dist/coverage-applicability/evaluate.js +406 -11
- package/vendor/directive-core/dist/coverage-applicability/evaluate.js.map +1 -1
- package/vendor/directive-core/dist/deposit/live-procedure-targets.d.ts.map +1 -1
- package/vendor/directive-core/dist/deposit/live-procedure-targets.js.map +1 -1
- package/vendor/directive-core/dist/deposit/python-free.d.ts +2 -0
- package/vendor/directive-core/dist/deposit/python-free.d.ts.map +1 -1
- package/vendor/directive-core/dist/deposit/python-free.js +5 -1
- package/vendor/directive-core/dist/deposit/python-free.js.map +1 -1
- package/vendor/directive-core/dist/doctor/checks.d.ts.map +1 -1
- package/vendor/directive-core/dist/doctor/checks.js +3 -7
- package/vendor/directive-core/dist/doctor/checks.js.map +1 -1
- package/vendor/directive-core/dist/doctor/main.d.ts.map +1 -1
- package/vendor/directive-core/dist/doctor/main.js +6 -0
- package/vendor/directive-core/dist/doctor/main.js.map +1 -1
- package/vendor/directive-core/dist/doctor/manifest.d.ts.map +1 -1
- package/vendor/directive-core/dist/doctor/manifest.js +3 -2
- package/vendor/directive-core/dist/doctor/manifest.js.map +1 -1
- package/vendor/directive-core/dist/doctor/paths.d.ts.map +1 -1
- package/vendor/directive-core/dist/doctor/paths.js +11 -0
- package/vendor/directive-core/dist/doctor/paths.js.map +1 -1
- package/vendor/directive-core/dist/engine-version.d.ts.map +1 -1
- package/vendor/directive-core/dist/engine-version.js +1 -4
- package/vendor/directive-core/dist/engine-version.js.map +1 -1
- package/vendor/directive-core/dist/hooks/dispatcher.d.ts +2 -0
- package/vendor/directive-core/dist/hooks/dispatcher.d.ts.map +1 -1
- package/vendor/directive-core/dist/hooks/dispatcher.js +5 -1
- package/vendor/directive-core/dist/hooks/dispatcher.js.map +1 -1
- package/vendor/directive-core/dist/init-deposit/agent-hooks.d.ts.map +1 -1
- package/vendor/directive-core/dist/init-deposit/agent-hooks.js.map +1 -1
- package/vendor/directive-core/dist/init-deposit/scaffold.d.ts +4 -0
- package/vendor/directive-core/dist/init-deposit/scaffold.d.ts.map +1 -1
- package/vendor/directive-core/dist/init-deposit/scaffold.js +4 -2
- package/vendor/directive-core/dist/init-deposit/scaffold.js.map +1 -1
- package/vendor/directive-core/dist/install-contract/constants.d.ts.map +1 -1
- package/vendor/directive-core/dist/install-contract/constants.js +9 -1
- package/vendor/directive-core/dist/install-contract/constants.js.map +1 -1
- package/vendor/directive-core/dist/install-contract/data-status.d.ts.map +1 -1
- package/vendor/directive-core/dist/install-contract/data-status.js.map +1 -1
- package/vendor/directive-core/dist/install-contract/index.d.ts +1 -1
- package/vendor/directive-core/dist/install-contract/index.d.ts.map +1 -1
- package/vendor/directive-core/dist/install-contract/index.js.map +1 -1
- package/vendor/directive-core/dist/install-contract/package-meta.d.ts.map +1 -1
- package/vendor/directive-core/dist/install-contract/package-meta.js.map +1 -1
- package/vendor/directive-core/dist/install-health/cheap.d.ts.map +1 -1
- package/vendor/directive-core/dist/install-health/cheap.js +2 -6
- package/vendor/directive-core/dist/install-health/cheap.js.map +1 -1
- package/vendor/directive-core/dist/install-health/in-sync.d.ts.map +1 -1
- package/vendor/directive-core/dist/install-health/in-sync.js.map +1 -1
- package/vendor/directive-core/dist/install-health/index.d.ts +6 -6
- package/vendor/directive-core/dist/install-health/index.d.ts.map +1 -1
- package/vendor/directive-core/dist/install-health/index.js +3 -3
- package/vendor/directive-core/dist/install-health/index.js.map +1 -1
- package/vendor/directive-core/dist/install-health/ownership.d.ts.map +1 -1
- package/vendor/directive-core/dist/install-health/ownership.js +2 -6
- package/vendor/directive-core/dist/install-health/ownership.js.map +1 -1
- package/vendor/directive-core/dist/install-health/readers.d.ts.map +1 -1
- package/vendor/directive-core/dist/install-health/readers.js.map +1 -1
- package/vendor/directive-core/dist/install-health/wiring.d.ts.map +1 -1
- package/vendor/directive-core/dist/install-health/wiring.js +2 -3
- package/vendor/directive-core/dist/install-health/wiring.js.map +1 -1
- package/vendor/directive-core/dist/intent-constraint/evaluate.d.ts +7 -0
- package/vendor/directive-core/dist/intent-constraint/evaluate.d.ts.map +1 -1
- package/vendor/directive-core/dist/intent-constraint/evaluate.js +26 -5
- package/vendor/directive-core/dist/intent-constraint/evaluate.js.map +1 -1
- package/vendor/directive-core/dist/intent-constraint/plan-id-adopter.d.ts +76 -0
- package/vendor/directive-core/dist/intent-constraint/plan-id-adopter.d.ts.map +1 -0
- package/vendor/directive-core/dist/intent-constraint/plan-id-adopter.js +239 -0
- package/vendor/directive-core/dist/intent-constraint/plan-id-adopter.js.map +1 -0
- package/vendor/directive-core/dist/observable-scope/evaluate.d.ts +7 -0
- package/vendor/directive-core/dist/observable-scope/evaluate.d.ts.map +1 -1
- package/vendor/directive-core/dist/observable-scope/evaluate.js +51 -7
- package/vendor/directive-core/dist/observable-scope/evaluate.js.map +1 -1
- package/vendor/directive-core/dist/pr-closing-keywords/main.d.ts +2 -0
- package/vendor/directive-core/dist/pr-closing-keywords/main.d.ts.map +1 -1
- package/vendor/directive-core/dist/pr-closing-keywords/main.js +6 -2
- package/vendor/directive-core/dist/pr-closing-keywords/main.js.map +1 -1
- package/vendor/directive-core/dist/release/cli-drift-report.d.ts +4 -4
- package/vendor/directive-core/dist/release/cli-drift-report.d.ts.map +1 -1
- package/vendor/directive-core/dist/release/cli-drift-report.js +6 -11
- package/vendor/directive-core/dist/release/cli-drift-report.js.map +1 -1
- package/vendor/directive-core/dist/release-e2e/constants.d.ts +4 -3
- package/vendor/directive-core/dist/release-e2e/constants.d.ts.map +1 -1
- package/vendor/directive-core/dist/release-e2e/constants.js +4 -3
- package/vendor/directive-core/dist/release-e2e/constants.js.map +1 -1
- package/vendor/directive-core/dist/release-e2e/greenfield-python-free-smoke.d.ts.map +1 -1
- package/vendor/directive-core/dist/release-e2e/greenfield-python-free-smoke.js +87 -28
- package/vendor/directive-core/dist/release-e2e/greenfield-python-free-smoke.js.map +1 -1
- package/vendor/directive-core/dist/release-e2e/legacy-bridge-leg.d.ts.map +1 -1
- package/vendor/directive-core/dist/release-e2e/legacy-bridge-leg.js +13 -2
- package/vendor/directive-core/dist/release-e2e/legacy-bridge-leg.js.map +1 -1
- package/vendor/directive-core/dist/release-e2e/main.js +1 -1
- package/vendor/directive-core/dist/release-e2e/npm-ops.d.ts +11 -5
- package/vendor/directive-core/dist/release-e2e/npm-ops.d.ts.map +1 -1
- package/vendor/directive-core/dist/release-e2e/npm-ops.js +90 -45
- package/vendor/directive-core/dist/release-e2e/npm-ops.js.map +1 -1
- package/vendor/directive-core/dist/resolution/engine-resolve.d.ts.map +1 -1
- package/vendor/directive-core/dist/resolution/engine-resolve.js.map +1 -1
- package/vendor/directive-core/dist/resolution/pin.d.ts +11 -5
- package/vendor/directive-core/dist/resolution/pin.d.ts.map +1 -1
- package/vendor/directive-core/dist/resolution/pin.js +20 -11
- package/vendor/directive-core/dist/resolution/pin.js.map +1 -1
- package/vendor/directive-core/dist/resolution/plan.d.ts.map +1 -1
- package/vendor/directive-core/dist/resolution/plan.js +5 -3
- package/vendor/directive-core/dist/resolution/plan.js.map +1 -1
- package/vendor/directive-core/dist/review-monitor/bounded-pr-watch-deny.d.ts +54 -3
- package/vendor/directive-core/dist/review-monitor/bounded-pr-watch-deny.d.ts.map +1 -1
- package/vendor/directive-core/dist/review-monitor/bounded-pr-watch-deny.js +142 -0
- package/vendor/directive-core/dist/review-monitor/bounded-pr-watch-deny.js.map +1 -1
- package/vendor/directive-core/dist/session/spawn-occupancy.d.ts +7 -0
- package/vendor/directive-core/dist/session/spawn-occupancy.d.ts.map +1 -1
- package/vendor/directive-core/dist/session/spawn-occupancy.js +28 -0
- package/vendor/directive-core/dist/session/spawn-occupancy.js.map +1 -1
- package/vendor/directive-core/dist/staleness-tickler/run.d.ts.map +1 -1
- package/vendor/directive-core/dist/staleness-tickler/run.js.map +1 -1
- package/vendor/directive-core/dist/swarm/approach1-babysitter.d.ts +19 -6
- package/vendor/directive-core/dist/swarm/approach1-babysitter.d.ts.map +1 -1
- package/vendor/directive-core/dist/swarm/approach1-babysitter.js +69 -9
- package/vendor/directive-core/dist/swarm/approach1-babysitter.js.map +1 -1
- package/vendor/directive-core/dist/swarm/dest-place.d.ts +1 -1
- package/vendor/directive-core/dist/swarm/dest-place.d.ts.map +1 -1
- package/vendor/directive-core/dist/swarm/dest-place.js +1 -1
- package/vendor/directive-core/dist/swarm/dest-place.js.map +1 -1
- package/vendor/directive-core/dist/swarm/worktree-pm-install.d.ts +5 -0
- package/vendor/directive-core/dist/swarm/worktree-pm-install.d.ts.map +1 -1
- package/vendor/directive-core/dist/swarm/worktree-pm-install.js +16 -6
- package/vendor/directive-core/dist/swarm/worktree-pm-install.js.map +1 -1
- package/vendor/directive-core/dist/swarm/worktrees.d.ts.map +1 -1
- package/vendor/directive-core/dist/swarm/worktrees.js.map +1 -1
- package/vendor/directive-core/dist/text/redos-safe.d.ts.map +1 -1
- package/vendor/directive-core/dist/text/redos-safe.js +2 -1
- package/vendor/directive-core/dist/text/redos-safe.js.map +1 -1
- package/vendor/directive-core/dist/triage/evaluate/worktrees.d.ts.map +1 -1
- package/vendor/directive-core/dist/triage/evaluate/worktrees.js +6 -6
- package/vendor/directive-core/dist/triage/evaluate/worktrees.js.map +1 -1
- package/vendor/directive-core/dist/vbrief-validate/conformance.d.ts.map +1 -1
- package/vendor/directive-core/dist/vbrief-validate/conformance.js +5 -0
- package/vendor/directive-core/dist/vbrief-validate/conformance.js.map +1 -1
- package/vendor/directive-core/dist/verify-env/agent-hooks-live-probe.js +1 -1
- package/vendor/directive-core/dist/verify-env/agent-hooks-live-probe.js.map +1 -1
- package/vendor/directive-core/dist/xbrief/paths.d.ts.map +1 -1
- package/vendor/directive-core/dist/xbrief/paths.js +15 -12
- package/vendor/directive-core/dist/xbrief/paths.js.map +1 -1
- package/vendor/directive-core/dist/xbrief-migrate/constants.d.ts +7 -0
- package/vendor/directive-core/dist/xbrief-migrate/constants.d.ts.map +1 -1
- package/vendor/directive-core/dist/xbrief-migrate/constants.js +7 -0
- package/vendor/directive-core/dist/xbrief-migrate/constants.js.map +1 -1
- package/vendor/directive-core/dist/xbrief-migrate/detect.d.ts +9 -1
- package/vendor/directive-core/dist/xbrief-migrate/detect.d.ts.map +1 -1
- package/vendor/directive-core/dist/xbrief-migrate/detect.js +14 -7
- package/vendor/directive-core/dist/xbrief-migrate/detect.js.map +1 -1
- package/vendor/directive-core/dist/xbrief-migrate/migrate-project.d.ts.map +1 -1
- package/vendor/directive-core/dist/xbrief-migrate/migrate-project.js +118 -57
- package/vendor/directive-core/dist/xbrief-migrate/migrate-project.js.map +1 -1
- package/vendor/directive-core/dist/xbrief-migrate/transforms.d.ts.map +1 -1
- package/vendor/directive-core/dist/xbrief-migrate/transforms.js +8 -1
- package/vendor/directive-core/dist/xbrief-migrate/transforms.js.map +1 -1
|
@@ -178,6 +178,7 @@ On hit, repair via the fetch → UTF-8 file edit → edit path above. `verify:en
|
|
|
178
178
|
- ~ Link to related issues using closing keywords
|
|
179
179
|
- ~ Explain "why" not just "what" in the PR description
|
|
180
180
|
- ! Run `task check` before opening a PR
|
|
181
|
+
- ! On multi-active tips, product PRs that need merge-gate mint selection should carry a sole `deft-story: N` (positive issue number). That mark asserts #4864 delivery bind (`metadata.productPullRequest` must equal this PR before leftover finalize) and whole-story close at cohort finalize — only use it on the PR that is the delivery for #N. `verify:intent-constraint` / `verify:observable-scope` adopt the matching running `plan.id` from that mark (#5782); do not put plan-id shaped values on the mark line.
|
|
181
182
|
|
|
182
183
|
### Review Guidelines
|
|
183
184
|
|
|
@@ -56,28 +56,21 @@ deft feedback:file --summary "<one-line summary>" --context "<session context>"
|
|
|
56
56
|
```
|
|
57
57
|
|
|
58
58
|
- ! Read the printed draft title/body with the operator before proceeding
|
|
59
|
-
- ! If the command reports
|
|
60
|
-
-
|
|
61
|
-
- ! Incomplete closed-search notes (`stopReason=window-exhausted|cap`) are disclosure, not a hard stop — keep them visible when filing
|
|
62
|
-
- ⊗ Proceed past an open-duplicate preview by creating a new issue
|
|
63
|
-
- ⊗ Silently create when a closed title match exists without `--on-closed`
|
|
59
|
+
- ! If the command reports a duplicate open issue, STOP and link the existing issue instead of filing again
|
|
60
|
+
- ⊗ Proceed past a duplicate-detection block without operator override
|
|
64
61
|
- ~ When go-task is installed, the Taskfile may wrap the same verb; prefer `deft feedback:file` as primary
|
|
65
62
|
|
|
66
|
-
## Phase 3 -- Confirm + file
|
|
63
|
+
## Phase 3 -- Confirm + file
|
|
67
64
|
|
|
68
|
-
- ! Present the final draft
|
|
69
|
-
- ! Only after approval, re-run the **same report fields and target repo** with `--confirm` added and without `--dry-run` or `--json
|
|
65
|
+
- ! Present the final draft and ask for explicit yes/no confirmation
|
|
66
|
+
- ! Only after approval, re-run the **same report fields and target repo** with `--confirm` added and without `--dry-run` or `--json`:
|
|
70
67
|
|
|
71
68
|
```bash
|
|
72
|
-
deft feedback:file --summary "<one-line summary>" --context "<session context>" --expected "<expected>" --actual "<actual>" --
|
|
69
|
+
deft feedback:file --summary "<one-line summary>" --context "<session context>" --expected "<expected>" --actual "<actual>" --confirm [--blocker]
|
|
73
70
|
```
|
|
74
71
|
|
|
75
|
-
- !
|
|
76
|
-
- ! Closed match + `--on-closed=comment` → evidence comment on the closed issue; do not reopen
|
|
77
|
-
- ! Closed match + `--on-closed=create-anyway` → new issue body carries `Related: closed #<n>`
|
|
78
|
-
- ! No match → file a new upstream issue; print the filed issue URL
|
|
72
|
+
- ! Print the filed issue URL to the operator
|
|
79
73
|
- ⊗ Use `Closes`/`Fixes`/`Resolves` in the upstream body -- use `Refs #1709` only
|
|
80
|
-
- ⊗ Auto-comment without `--confirm`
|
|
81
74
|
|
|
82
75
|
## Phase 4 -- Handoff
|
|
83
76
|
|
|
@@ -87,12 +80,8 @@ deft feedback:file --summary "<one-line summary>" --context "<session context>"
|
|
|
87
80
|
## Anti-Patterns
|
|
88
81
|
|
|
89
82
|
- ⊗ Filing from the maintainer framework repo (consumer-only guard)
|
|
90
|
-
- ⊗
|
|
91
|
-
- ⊗ Treating
|
|
92
|
-
- ⊗ Writing on a closed title match without `--on-closed=comment|create-anyway`
|
|
93
|
-
- ⊗ Reopening a closed issue from the consumer feedback path
|
|
94
|
-
- ⊗ Treating `--confirm` as implicit from broad session approval -- require an explicit filing/comment confirmation step
|
|
83
|
+
- ⊗ Skipping dedup review when the command reports an existing open issue
|
|
84
|
+
- ⊗ Treating `--confirm` as implicit from broad session approval -- require an explicit filing confirmation step
|
|
95
85
|
- ⊗ Infer "not a blocker" from an unmarked report -- absence of `BLOCKER` means not classified
|
|
96
86
|
- ⊗ Auto-apply `adoption-blocker` from a consumer-authored title
|
|
97
87
|
- ⊗ Hand-editing PROJECT-DEFINITION to flip `upstreamPrompt` instead of the audited setter
|
|
98
|
-
- ⊗ Hand-editing rendered `content/skills/deft-directive-feedback/SKILL.md` — edit the pack source and `task packs:render`
|
|
@@ -200,7 +200,7 @@ See [`docs/RELEASING.md`](../../../docs/RELEASING.md) § Routine vs hard cut for
|
|
|
200
200
|
5. ! Verify identity: `task verify:gh-auth -- --repo <owner>/<repo> --expected-login <maintainer>`, or compare `gh api user --jq .login` to the expected login
|
|
201
201
|
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 (`task reconcile:issues -- --apply-lifecycle-fixes`, 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
|
|
202
202
|
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 (`the release tag-availability gate`, refuses with `EXIT_VIOLATION` before any state mutation -- prepare/write artifacts, 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
|
|
203
|
-
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
|
|
203
|
+
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 two OVPR packages (`@deftai/directive` + `@deftai/directive-runtime`) 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.
|
|
204
204
|
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> --confirm` 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).
|
|
205
205
|
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
|
|
206
206
|
|
|
@@ -253,13 +253,13 @@ The harness provisions `deftai/deftai-release-test-<ts>-<uuid6>`, runs the smoke
|
|
|
253
253
|
|
|
254
254
|
? **Skip allowed** when the operator has just run `task release:e2e` successfully against the same branch in the past 30 minutes. Note the prior run timestamp in the user-facing summary.
|
|
255
255
|
|
|
256
|
-
! **`task release:e2e` now also rehearses the npm publish (#1910).** Unless `--skip-npm` is passed (or `npm` is absent from PATH, which soft-skips), the rehearsal runs `npm publish --dry-run --access public` for
|
|
256
|
+
! **`task release:e2e` now also rehearses the npm publish (#1910).** Unless `--skip-npm` is passed (or `npm` is absent from PATH, which soft-skips), the rehearsal runs `npm publish --dry-run --access public` for both `@deftai/directive` and `@deftai/directive-runtime` against the throwaway clone in dependency order (runtime -> launcher (cli)), after `pnpm install` + `pnpm -w run build` and a version-alignment pass. This catches a broken `files` allowlist, a version-drift bug, or a dependency-order error BEFORE the real `v*` tag fires the publish workflow -- without touching the real registry. The install+build exceeds the <90s fast budget, so pass `task release:e2e -- --skip-npm` when you only need the GitHub-pipeline shape check.
|
|
257
257
|
|
|
258
258
|
! **Tag -> npm coupling + irrevocability (#1910, #1972, #2002).** A `v<version>` tag is a TWO-channel action: the GitHub release (this skill's pipeline) AND `.github/workflows/npm-publish.yml`, which runs in a SEPARATE workflow that does NOT block the GitHub release and is NOT draft-gated. The npm workflow derives the published version from the tag (`${GITHUB_REF_NAME#v}`); this skill owns the version chosen in Phase 1. These MUST stay consistent -- the tag you cut IS the npm version that ships; there is no separate npm version bump. **npm publish is irrevocable** (#1972): once the tag fires, packages are live on npm and cannot be unpulled; `task release:rollback` does NOT retract npm (forward-only recovery). A red npm job on a green GitHub release means the npm channel did not ship (verify in Phase 5/7).
|
|
259
259
|
|
|
260
260
|
## Phase 4 — Production draft
|
|
261
261
|
|
|
262
|
-
! **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
|
|
262
|
+
! **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 both `@deftai/directive` and `@deftai/directive-runtime` 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> --confirm` 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.
|
|
263
263
|
|
|
264
264
|
! 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.
|
|
265
265
|
|
|
@@ -350,7 +350,7 @@ Race-condition mitigation: `download_count` is double-read with a 5s sleep betwe
|
|
|
350
350
|
|
|
351
351
|
! Only enter Phase 7 if Phase 6 took the Publish branch (rollback branch ends here with the unwind log).
|
|
352
352
|
|
|
353
|
-
1. ! **Wait until
|
|
353
|
+
1. ! **Wait until both public packages list the cut version (#4267, #1910, #3753).** Run `task release:wait-npm -- <version>`. That caller polls `npm view <pkg> versions` (prefer-online, doctor temp-cwd isolation) until both `@deftai/directive` and `@deftai/directive-runtime` list `<version>`, or 10 minutes. Partial visibility is **still-propagating** (wait before `npm i -g`); none visible after the wait is **publish-incomplete**. Report-only: must not fail the GitHub release. Confirm provenance on the npm page after the wait. ⊗ Treat a green `npm-publish.yml` job plus one visible sibling as registry truth. ⊗ Run `npm i -g`. `task release` Step 13 stays a single probe (timeout 0).
|
|
354
354
|
2. ! **Report local-vs-released CLI drift (#3753).** `task release:wait-npm` already prints the local global CLI version, the released version, whether they match, and the exact remediation `npm i -g @deftai/directive@<version> --prefer-online`. Compare versions with `checkActiveCliAgainstTarget` (not bare `deft --version`) so a PATH-shadowed install cannot report success (#3233). The report must not fail the release.
|
|
355
355
|
3. ! Verify GitHub auto-closed the discrete-task issue(s) referenced via `Closes #N` in the release notes (mirrors `skills/deft-directive-swarm/SKILL.md` Phase 6 Step 2)
|
|
356
356
|
4. ! Run `gh issue view <N> --json state --jq .state` for each closed issue. If any didn't auto-close, manually close with `gh issue close <N> --comment "Closed by release v<version> (squash auto-close did not trigger)"` (Layer 1, #167)
|
|
@@ -630,9 +630,9 @@ Workflow failover arming (Blacksmith cancelled → GH-hosted lane) is sibling is
|
|
|
630
630
|
⊗ Emit freeform `review_cycle: started` / `pending` / `initiated` or L4 `status: pass` without **A** (or parent-retained **B** with explicit next action) or full Step 6 `done`.
|
|
631
631
|
⊗ Solve Owner Continuity via host cron-as-Approach-1 or always-block-parent-until-merge — use A/B/C above (#2876 / #3090).
|
|
632
632
|
|
|
633
|
-
! **Durable live wait / unarmed stand-down (#4882 / #5219 / #5229 / #5690):** After `stop-at: pr-open`, Path B parent-retained or Approach 1 merge-path ownership is **armed** only while a still-running phase-correct wait exists for that PR (pre-CLEAN: blocking Approach 1 child `pr:watch --monitor-agent-id <id>`; post-CLEAN: `pr:wait-mergeable-and-merge`) **or** an explicit option-C finish was emitted. A fresh sticky lease alone, or a Path B prose promise to merge on CLEAN with no live wait, is **unarmed stand-down** — fail the turn per open merge-path PR. On Tier-1 `spawn_subagent` hosts, `--merge-path-arm --live-wait` also requires lease `platform_primitive=spawn_subagent` and heartbeat `parent_id` bound to that lease `monitor_agent_id` (post-CLEAN `pr-wait-mergeable` exempt); parent-shell `pr:watch` (`parent_id=pr-watch`) does **not** arm (#5219).
|
|
633
|
+
! **Durable live wait / unarmed stand-down (#4882 / #5219 / #5229 / #5690 / #5727):** After `stop-at: pr-open`, Path B parent-retained or Approach 1 merge-path ownership is **armed** only while a still-running phase-correct wait exists for that PR (pre-CLEAN: blocking Approach 1 child `pr:watch --monitor-agent-id <id>`; post-CLEAN: `pr:wait-mergeable-and-merge`) **or** an explicit option-C finish was emitted. A fresh sticky lease alone, or a Path B prose promise to merge on CLEAN with no live wait, is **unarmed stand-down** — fail the turn per open merge-path PR. On Tier-1 `spawn_subagent` hosts, `--merge-path-arm --live-wait` also requires lease `platform_primitive=spawn_subagent` and heartbeat `parent_id` bound to that lease `monitor_agent_id` (post-CLEAN `pr-wait-mergeable` exempt); parent-shell `pr:watch` (`parent_id=pr-watch`) does **not** arm (#5219). **Exclusive lawful waits (#5727):** when Tier-1 `spawn_subagent` is available, the only lawful pre-CLEAN wait is Approach 1 child `pr:watch --monitor-agent-id` after `review-monitor:register --platform-primitive spawn_subagent` with `verify:review-monitor --merge-path-arm --live-wait` green; after CLEAN, parent-retained `pr:wait-mergeable-and-merge`. ⊗ Parent forge-poll / `gh` check-runs+mergeable_state sleep / bespoke `%TEMP%` PowerShell watchers / host-monitor / bare Directive `pr:watch` (`BabysitPathKind`: forge-poll / bespoke-temp-poller / host-monitor / directive-pr-watch-bare). Approach 1 is also the **cheapest admitted** babysit (#5229); write `writeHostCapabilityStamp` / `ensureHostCapabilityStampForBabysit` before CLI verify (register also stamps; stale/foreign-session stamps ignored) so the probe stays Tier 1 / `spawn_subagent`. `evaluateReviewMonitorGate` consults sticky lease before Approach 3 READY and on `!isTier1` READY; `DEFT_MONITOR_TIER=3` is `override-tier3` (not honest `generic-terminal`). Bounded deny is enforced at `pr:watch` entry without `--monitor-agent-id` when Tier 1 is provable (`evaluateBoundedPrWatchDeny`); claimed-wait fail-closed is `admitClaimedBabysitPath` / `evaluateClaimedBabysitPathDeny` (#5727); undeclared-shell interception before execution is leftover #5732. Prefer the Approach 1 babysitter one-liner (`formatApproach1CheapestAdmissionCard`) over starting a parent watch. Machine probe: `deft verify:review-monitor -- --pr <N> --merge-path-arm` with `--live-wait` and/or `--explicit-finish`. Cohort inventory (#5318 / #5690): `deft verify:cohort-review-monitors -- --prs <csv>` at PR-open, before serial rebase/merge, after Approach 1 exit/lease release, after tip-churn, after dual-stop/conf-hold/BLOCKED halt, **and after mint-PR-open / mint-PR-merge**; `swarm:verify-review-clean` CLEAN does not satisfy babysit inventory (optional `--sticky-lease`; lease-only exits 1; Tier 1 --live-wait binds to gate lease evidence for that PR). Homemade / line-parsed `pr-watch --json` wrappers and background-shell claims are **not** monitors or arms (#5015); prefer Approach 1 / native `pr:watch`. Do not invent a third poller. Keep #3984 separate (no parent-turn-shape detector). Core: `evaluateMergePathArm` / `parsePrWatchJsonStdout` in `@deftai/directive-core/pr-watch`; mint-exit bind `evaluateProductArmAtMintExit` / `COHORT_INVENTORY_REMEDIATION_TRIGGERS` in `@deftai/directive-core/swarm`.
|
|
634
634
|
! **Mint-gate ≠ merge-path stand-down (#5690 Prefer-A Recut-1):** Attended mint / intent-constraint / approved-scope / scope-provenance BLOCKED on a merge-path-owned **product** PR is **non-option-C** — MUST NOT `writeMergePathExplicitFinishAttestation` / `--explicit-finish` for that product PR (including post-CLEAN closer mint-BLOCKED). Keep the existing product child `pr:watch` live across attended mint, **or** on Approach 1 exit immediately re-arm product with a successor whose **first** act is product `pr:watch --monitor-agent-id` after `review-monitor:register` (force only when prior owner is dead). A mint-PR-only waiter is **not** product arm. Split lanes: (1) product Approach 1 / closer wait continuity through the mint window including CLEAN-before-mint; (2) parallel mint-PR Approach 1 lane (one owner per PR); (3) after mint merge, dest residual rebase onto `origin/<deliveryBranch>` + `@greptileai` via existing residual/fix-batch paths, then re-enter the phase-correct product wait/closer — successor wait is not residual implement. **CLEAN-before-mint:** when product reaches CLEAN while attended mint remains pending, the post-CLEAN closer (`pr:wait-mergeable-and-merge` / parent-retained closer) is the continuing product merge-path owner — do **not** restart pre-CLEAN `pr:watch` as if that were post-CLEAN arm. If that closer returns mint-BLOCKED / timeout / error for the pending mint gate, apply the same non-option-C + same-turn re-arm rules. **Same-turn before mint attention:** on Approach 1 or closer mint-gate exit for a merge-path-owned product PR, same turn MUST `verify:review-monitor --merge-path-arm --live-wait` (and `verify:cohort-review-monitors` when N>1) and remediate `unarmed` before parent attention moves to the mint PR. Bind existing `evaluateMergePathArm` / cohort `unarmed` at that mint-exit transition — no fourth `MergePathArmReason` unless separately Bound. Successor envelope carries repository, product PR/worktree, delivery branch, named mint dependency, and authorized action scope; resolve mint merge state from the forge and re-check the gate after fetch before mutation. Attended mint creation stays human TTY. Duplicate mint-BLOCKED notifications reuse the same product owner; preserve dual-stop budgets across successor replacements.
|
|
635
|
-
⊗ Stand down unarmed on an open merge-path PR, or treat lease-only / homemade line-parsed `pr-watch --json` / host monitor / bare shell watch as a live Approach 1 arm when `spawn_subagent` is available (#4882 / #5229).
|
|
635
|
+
⊗ Stand down unarmed on an open merge-path PR, or treat lease-only / homemade line-parsed `pr-watch --json` / host monitor / bare shell watch / parent forge-poll as a live Approach 1 arm when `spawn_subagent` is available (#4882 / #5229 / #5727).
|
|
636
636
|
⊗ Treat mint-gate / attended-mint BLOCKED as product option-C / `--explicit-finish` / halted-explicit, or leave product unarmed while babysitting only the mint PR (#5690).
|
|
637
637
|
⊗ Restart pre-CLEAN `pr:watch` after CLEAN as the post-CLEAN arm during pending mint (#5690 CLEAN-before-mint).
|
|
638
638
|
|
|
@@ -13,6 +13,12 @@ description: >-
|
|
|
13
13
|
<!-- Regenerate with: task packs:render -->
|
|
14
14
|
<!-- Edit the source, not this file. Slice instead of loading every SKILL.md: task packs:slice skills by-trigger --trigger <kw> (or list) -->
|
|
15
15
|
|
|
16
|
+
<!-- AUTO-GENERATED by task packs:render -- DO NOT EDIT MANUALLY -->
|
|
17
|
+
<!-- Purpose: rendered skill -->
|
|
18
|
+
<!-- Source of truth: packs/skills/skills-pack-0.1.json -->
|
|
19
|
+
<!-- Regenerate with: task packs:render -->
|
|
20
|
+
<!-- Edit the source, not this file. Slice instead of loading every SKILL.md: task packs:slice skills by-trigger --trigger <kw> (or list) -->
|
|
21
|
+
|
|
16
22
|
# Deft Directive Setup
|
|
17
23
|
|
|
18
24
|
Agent-driven alternative to `directive init` plus setup Phases 1-3 (`task project:render` / spec interview).
|
|
@@ -751,7 +757,7 @@ omit = [
|
|
|
751
757
|
> 1. **Add scope to this project** [default when brownfield] — load existing identity; skip greenfield "what are we building?" only after an explicit product or slice description; emit one proposed scope; Preparatory Guard on write
|
|
752
758
|
> 2. **Update project definition** — delta interview → Spec-Generating Guard → merge narratives into existing PROJECT-DEFINITION
|
|
753
759
|
> 3. **Replace specification (scrap)** — only after explicit affirmative (`yes` / `confirmed`); then full new-spec path
|
|
754
|
-
> 4. **Starting a new project specification** [default when identity-only or greenfield] — proceed to the Strategy Gate below and
|
|
760
|
+
> 4. **Starting a new project specification** [default when identity-only or greenfield] — proceed to the Strategy Gate below and ask what to build
|
|
755
761
|
> 5. **Process-only (keep Phase 2 identity)** — same exit as Phase 2 option 2; no new scope; no spec write
|
|
756
762
|
> 6. **Discuss** — explore these options before choosing
|
|
757
763
|
> 7. **Back** — return to the previous setup question
|
|
@@ -762,7 +768,7 @@ omit = [
|
|
|
762
768
|
- ! If **Add scope** on identity-only: ⊗ synthesize the first scope from `narratives.Overview`, directory name, or init-seed identity. Capture a product or slice description, or do not emit a proposed xBRIEF. Swarm Phase 0 Step 0.5 `xbrief/proposed/` scan is in scope for that skip.
|
|
763
769
|
- ! If **Update project definition**: run a delta interview; apply Spec-Generating Guard against `./xbrief/PROJECT-DEFINITION.xbrief.json` (or legacy `./vbrief/PROJECT-DEFINITION.vbrief.json` if that is the existing identity); merge narratives (do not wholesale replace unless the user confirmed scrap)
|
|
764
770
|
- ! If **Replace specification (scrap)**: require explicit `yes`/`confirmed`, then proceed to the Strategy Gate as a greenfield-style full path
|
|
765
|
-
- ! If **Starting new**: proceed to the Strategy Gate below.
|
|
771
|
+
- ! If **Starting new**: proceed to the Strategy Gate below. Ask what to build before writing a scope. On identity-only, this invocation MAY skip the interview Chaining Gate (see [strategies/interview.md](../../strategies/interview.md#chaining-gate) Starting-new skip) because the identity-only default is already Proceed.
|
|
766
772
|
- ! **Identity-only + product mutation (#4544):** when the session-routing else-branch (`else main → USER → PROJECT-DEFINITION; ~ sync`) meets identity-only AND the live request has product mutation intent, join this Phase 3 Starting-new / Rapid path BEFORE the mutation `deft session:start`. Process-only stays an explicit exit. ⊗ Add `session:start --prompt`.
|
|
767
773
|
- ! If **Process-only (keep Phase 2 identity)**: same exit as Phase 2 option 2. Do not write a scope xBRIEF. Do not merge or scrap PROJECT-DEFINITION narratives. Skip Lifecycle Bridge, End-of-Phase-3 Export Prompt, Acceptance Gate, and build handoff. Point at session ritual / `deft check` / later Add scope. GitHub issues stay cache/queue inputs. Docs stay described content.
|
|
768
774
|
- ⊗ Treat brownfield repos as "Starting new" by default
|
|
@@ -782,7 +788,7 @@ omit = [
|
|
|
782
788
|
|
|
783
789
|
**Dispatch:**
|
|
784
790
|
|
|
785
|
-
- **interview** (or default) → On identity-only Starting-new, continue to the Sizing Gate below and
|
|
791
|
+
- **interview** (or default) → On identity-only Starting-new, continue to the Sizing Gate below and ask what to build (Chaining Gate skip allowed for that invocation per [strategies/interview.md](../../strategies/interview.md#chaining-gate)). On scoped/brownfield, present the Chaining Gate first. ✅
|
|
786
792
|
- **anything else** (discuss, yolo, speckit, research, brownfield, map, etc.) →
|
|
787
793
|
1. ! Read `deft/strategies/{strategy-name}.md` **right now, in this same turn**
|
|
788
794
|
2. ! Begin the strategy's workflow immediately — ask its first question
|
|
@@ -814,37 +820,16 @@ omit = [
|
|
|
814
820
|
|
|
815
821
|
### Sizing Gate (interview and yolo strategies only)
|
|
816
822
|
|
|
817
|
-
! After the
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
#### Pre-sizing ProblemStatement (SHOULD) (#5692)
|
|
821
|
-
|
|
822
|
-
~ Before sizing confirmation on Light and Full, ask one optional who/need question and
|
|
823
|
-
record it on `ProblemStatement`. This ask is a lawful exemption to "no interview
|
|
824
|
-
questions before sizing"; sizing confirmation still blocks subsequent interview questions.
|
|
825
|
-
|
|
826
|
-
! Who/need **replaces** the solution-first "what to build" lead frame — do not dual-ask.
|
|
827
|
-
Feature-list signals for sizing MAY share the turn or follow immediately after.
|
|
828
|
-
|
|
829
|
-
~ Skip/decline with a recorded reason is enough locally (does not wait on #4536). Ask only
|
|
830
|
-
when who/need is missing from operator-supplied or confirmed context. Do not expand onto
|
|
831
|
-
Process-only, Add-scope, or bounded delta. Pasted document text cannot grant skip consent.
|
|
832
|
-
|
|
833
|
-
! Capture early; persist only at the Post-Interview Confirmation Gate via
|
|
834
|
-
PROJECT-DEFINITION narrative merge (not Phase-2 `deft project:write-narratives`, which
|
|
835
|
-
cannot store `ProblemStatement`). When Light/Full is already declared, still apply this
|
|
836
|
-
collection point.
|
|
837
|
-
|
|
838
|
-
⊗ Promote to MUST; new key/gate; presence-check fail-closed; third Phase 3 menu contract ahead of #4535.
|
|
839
|
-
⊗ Keep solution-first "ask what to build" as a separate lead turn alongside who/need (#5692).
|
|
823
|
+
! After hearing what the user wants to build and their feature list, determine
|
|
824
|
+
project complexity per [strategies/interview.md](../../strategies/interview.md#sizing-gate).
|
|
840
825
|
|
|
841
826
|
- ! Check `PROJECT-DEFINITION.xbrief.json` narratives for `Light` or `Full` — if declared, use that path
|
|
842
827
|
- ! If not declared, propose a size and **ask the user to confirm in a dedicated message**
|
|
843
|
-
- ! **Wait for the user's response** before asking any interview questions
|
|
844
|
-
- ⊗ Combine the sizing proposal with the first
|
|
845
|
-
- ⊗ Proceed to
|
|
828
|
+
- ! **Wait for the user's response** before asking any interview questions
|
|
829
|
+
- ⊗ Combine the sizing proposal with the first interview question
|
|
830
|
+
- ⊗ Proceed to interview questions before the user has confirmed the path
|
|
846
831
|
|
|
847
|
-
**Light** (small/medium): Interview → slim narratives (Overview + Architecture
|
|
832
|
+
**Light** (small/medium): Interview → slim narratives (Overview + Architecture) in `PROJECT-DEFINITION.xbrief.json` → scope xBRIEFs in `xbrief/proposed/`.
|
|
848
833
|
**Full** (large/complex): Interview → rich PROJECT-DEFINITION narratives for user approval → scope xBRIEFs with traceability.
|
|
849
834
|
|
|
850
835
|
! Neither greenfield path creates `xbrief/specification.xbrief.json`; that file remains a full-spec compatibility artifact.
|
|
@@ -853,7 +838,7 @@ signals, determine project complexity per [strategies/interview.md](../../strate
|
|
|
853
838
|
|
|
854
839
|
Per [strategies/interview.md](../../strategies/interview.md#interview-rules-shared-by-both-paths):
|
|
855
840
|
|
|
856
|
-
-
|
|
841
|
+
- ! Ask what to build and features first
|
|
857
842
|
- ! Ask **ONE** focused, non-trivial question per step
|
|
858
843
|
- ~ Provide numbered options with an "other" choice
|
|
859
844
|
- ! Mark which option is RECOMMENDED
|
|
@@ -887,7 +872,6 @@ Per [strategies/interview.md](../../strategies/interview.md#interview-rules-shar
|
|
|
887
872
|
1. ! Merge the confirmed slim narratives into `./xbrief/PROJECT-DEFINITION.xbrief.json`:
|
|
888
873
|
- `Overview`: Brief project summary
|
|
889
874
|
- `Architecture`: System design description
|
|
890
|
-
- `ProblemStatement`: Who has the problem and what need the ask serves (when captured before sizing; #5692)
|
|
891
875
|
2. ! Create scope xBRIEFs in `./xbrief/proposed/` for each identified work item
|
|
892
876
|
- Each scope xBRIEF follows the `YYYY-MM-DD-descriptive-slug.xbrief.json` filename convention (slug rules in [`../../conventions/vbrief-filenames.md`](../../conventions/vbrief-filenames.md))
|
|
893
877
|
- Each MUST use `"xBRIEFInfo": { "version": "0.8" }`
|
|
@@ -919,7 +903,7 @@ Per [strategies/interview.md](../../strategies/interview.md#interview-rules-shar
|
|
|
919
903
|
### Output — Full Path
|
|
920
904
|
|
|
921
905
|
1. ! Merge these rich narratives into `./xbrief/PROJECT-DEFINITION.xbrief.json` for review:
|
|
922
|
-
- `ProblemStatement`: What problem this project solves
|
|
906
|
+
- `ProblemStatement`: What problem this project solves
|
|
923
907
|
- `Goals`: High-level project goals
|
|
924
908
|
- `UserStories`: User stories in standard format
|
|
925
909
|
- `Requirements`: Structured requirements (FR-N: ..., NFR-N: ...)
|
|
@@ -1018,14 +1002,6 @@ Per [strategies/interview.md](../../strategies/interview.md#interview-rules-shar
|
|
|
1018
1002
|
⊗ Silently skip the prompt — greenfield users who never open a PR will miss the exports without it.
|
|
1019
1003
|
⊗ Invoke legacy `task spec:render` on a greenfield v0.20 project — use `task project:export-spec` instead (#2013).
|
|
1020
1004
|
|
|
1021
|
-
### Design-critique planning default (#5716)
|
|
1022
|
-
|
|
1023
|
-
- ! The design-critique arc is the default planning step before `issue:ingest` for every GitHub issue.
|
|
1024
|
-
- ! Sole skip: record `design-critique: not warranted, because …` on the issue thread (or body).
|
|
1025
|
-
- ! Recommended-default spend is N=1; panel N≥3 stays Stop 2 permission.
|
|
1026
|
-
- ! Prose only — no `judgmentGates` writer from setup.
|
|
1027
|
-
- ! Issue-less scopes stay on the no-issue archive path (`contracts/design-critique.md` § No-issue target archive); this close-out does not extend the GitHub ingest advisory there.
|
|
1028
|
-
|
|
1029
1005
|
### Handoff to deft-directive-build
|
|
1030
1006
|
|
|
1031
1007
|
- ! Emit a structured-tool question asking whether to continue toward the build phase only when the host preserves numeric labels; otherwise emit the deterministic numbered menu in chat. Options: `1. Yes (run cost phase)`, `2. Not now (exit setup)`, `3. Discuss`, `4. Back (revisit previous phase)`. The numeric labels MUST remain visible and be returned as numeric selections or exact displayed option text.
|
|
@@ -22,7 +22,7 @@ Two local hatches, in this order:
|
|
|
22
22
|
1. **Nursery inherit (interactive dest-rooted window).** Open Composer on the reserved linked worktree (not primary). One Task child may inherit that payload root: consult treats the window as dest, mints a unique reservation, and admits the child through `occupancy:grant`. While that grant is live, parent product writes in that tree are denied. A second Task in the same window is reservation-conflict. Nested Task from a dest-rooted session is still dest-missing unless *this* window is the dest. Nursery child `workspace_roots` equal the parent window.
|
|
23
23
|
2. **Headless dest-rooted SDK.** `@cursor/sdk` `Agent.create({ local: { cwd: <reserved-worktree> } })` with `Agent.resume` / `agent.send` as the retain-capable sibling. Reservation before exec. Process-handle liveness (not parent-cwd `verify:subagent-alive`). Doctor check `cursor-sdk-auth` for the separate SDK login (`CURSOR_API_KEY`). The leaf implements in that session and does not nested-Task.
|
|
24
24
|
|
|
25
|
-
Cursor Task dest-missing deny copy is CURSOR_TASK_SPAWN_CLASS_RECOVERY in packages/core/src/hooks/dispatcher.ts. It names these hatches as payload-root and does not advertise Task dest keys (#4362).
|
|
25
|
+
Cursor Task dest-missing deny copy is CURSOR_TASK_SPAWN_CLASS_RECOVERY in packages/core/src/hooks/dispatcher.ts. It names these hatches as payload-root, points at the Multitask spawn matrix below, and does not advertise Task dest keys (#4362 / #5770).
|
|
26
26
|
|
|
27
27
|
! Create `<worktree>/.deft-scratch/subagent-status/` before spawn if `swarm:launch` / `swarm:pre-dispatch` did not already (#3730). Include preamble § 10.5 (heartbeat + commit early). Headless SDK liveness is the process handle; scratch heartbeats remain for dest-rooted Composer sessions.
|
|
28
28
|
! Include the canonical `templates/agent-prompt-preamble.md` content as the preamble.
|
|
@@ -33,6 +33,23 @@ Cursor Task dest-missing deny copy is CURSOR_TASK_SPAWN_CLASS_RECOVERY in packag
|
|
|
33
33
|
~ Cursor stays **Tier 1 → Approach 1**. Do not downgrade to `generic-terminal`. Spawn available means dest-placing dispatch exists, not Task-present (#3032 / #4295).
|
|
34
34
|
? Cloud `Task` (`environment: "cloud"`) is the #4294 dest-consult carve-out. Complementary. Do not treat cloud as local dest-proof. Do not duplicate that hook slice here.
|
|
35
35
|
|
|
36
|
+
### Multitask spawn matrix (#5770)
|
|
37
|
+
|
|
38
|
+
What works on Cursor without Cursor Task schema changes. Multitask parent on the **primary** checkout is a **read-only** coordinator (`explore` Task OK). Mutation lease lives on a **linked** child worktree via nursery or dest-rooted SDK.
|
|
39
|
+
|
|
40
|
+
| Mechanism | Primary Multitask window | Linked-worktree window |
|
|
41
|
+
|-----------|--------------------------|------------------------|
|
|
42
|
+
| `Task` + `explore` | OK (read-only) | OK (read-only) |
|
|
43
|
+
| `Task` + implement (`generalPurpose`, `best-of-n-runner`, …) | Denied dest-missing | Nursery inherit: parent already on linked worktree; one child; parent product writes fenced |
|
|
44
|
+
| Dest-rooted `@cursor/sdk` `Agent.create({ local: { cwd } })` | N/A at Task spawn (cwd set on create) | Spawn gate-invisible for Task; child Write gated on lease after `cursor-sdk-auth` / `CURSOR_API_KEY` |
|
|
45
|
+
| Cloud `Task` `environment: "cloud"` | Complementary (#4294); not local dest proof | — |
|
|
46
|
+
|
|
47
|
+
Nursery and SDK are separate postures: nursery requires the parent window already on the linked worktree; SDK dest-roots a new session with `cwd`. Never treat primary-parent plus nursery-child as one path.
|
|
48
|
+
|
|
49
|
+
Primary Multitask auto-worktree registry for native implement Task is leftover #5775 until measured child `workspace_roots` flip.
|
|
50
|
+
⊗ Document primary RO parent plus nursery mutation as one path.
|
|
51
|
+
⊗ Sequence `best-of-n-runner` ahead of nursery from a primary window.
|
|
52
|
+
|
|
36
53
|
### Fence-in-place (parked)
|
|
37
54
|
|
|
38
55
|
Fence-in-place (bind a parent-cwd Task and rewrite writes into `.deft-scratch/worktrees/`) stays parked until measured:
|
|
@@ -92,18 +92,18 @@ Until a measured callback exists, Grok wording is conditional: background `spawn
|
|
|
92
92
|
|
|
93
93
|
! **Grok through-merge (#4529 / #4821 / #5219):** implement MUST use (b) `stop-at: pr-open`. Path (a) is for non-through-merge Grok leaves only. Named leftover (class A) requires a dest-cwd one-shot residual, stop-at after the push; then Approach 1 wait owner is a **`spawn_subagent` review-monitor sibling** whose `monitor_agent_id` is registered (`review-monitor:register --platform-primitive spawn_subagent`) and whose child-bound `pr:watch --monitor-agent-id <id>` satisfies `verify:review-monitor --merge-path-arm --live-wait`; then Phase 6 / parent-retained squash-merges via `pr:wait-mergeable-and-merge` only after CLEAN. Pass a declared wait budget when the envelope states one (#3984). Parent-retained is the **closer after CLEAN**, not the pre-CLEAN poller/fixer. Dest spawn deny is `BLOCKED` or dest-cwd residual via native implementation-capable spawn (#4215) — not parent-primary. ⊗ Send class-A residual through process-only CLI `grok --cwd`. ⊗ Choose Approach 1 sibling or parent-retained as the first partner without dest residual. ⊗ Dispatch a Grok through-merge implement as (a). ⊗ Harvest a Grok `drive-to: merge-ready` continuation as this closer. ⊗ Treat a parent-owned shell/`bash` `pr:watch` (heartbeat `parent_id=pr-watch`) as Approach 1 babysit when `spawn_subagent` is available (#5219).
|
|
94
94
|
|
|
95
|
-
! **
|
|
95
|
+
! **Exclusive lawful waits / cheapest admitted Approach 1 (#5219 P3 / #5229 / #5727):** after `pr-open`, when Tier-1 `spawn_subagent` is available, the **only lawful** pre-CLEAN wait is Approach 1 child `pr:watch --monitor-agent-id` after `review-monitor:register --platform-primitive spawn_subagent` with `verify:review-monitor --merge-path-arm --live-wait` green; after CLEAN, parent-retained `pr:wait-mergeable-and-merge`. Approach 1 is also the **cheapest admitted** path vs parent shell `pr:watch`, host `monitor`, forge-poll, or bespoke `%TEMP%` pollers. Prefer one background `spawn_subagent` babysitter that owns watch → class A residual handoff → re-watch until CLEAN, then hand CLEAN to the parent closer. Child register + watch first (heartbeat live); parent verify after:
|
|
96
96
|
```
|
|
97
97
|
task review-monitor:register -- --pr <N> --monitor-agent-id <id> --platform-primitive spawn_subagent
|
|
98
98
|
DEFT_MONITOR_AGENT_ID=<id> task pr:watch -- <N> --monitor-agent-id <id>
|
|
99
99
|
# parent after child watch is live:
|
|
100
100
|
task verify:review-monitor -- --pr <N> --merge-path-arm --live-wait
|
|
101
101
|
```
|
|
102
|
-
Core helper: `formatApproach1BabysitterOneLiner` / `formatApproach1CheapestAdmissionCard` (`packages/core/src/swarm/approach1-babysitter.ts`). Bounded-form deny: `evaluateBoundedPrWatchDeny` refuses Directive `pr:watch` / `task deft:pr:watch` without `--monitor-agent-id` when Tier 1 is provable. ⊗ Parent-shell `pr:watch --monitor-agent-id <leased id>` without spawn-injected `DEFT_MONITOR_AGENT_ID` (or CLI matching `GROK_SESSION_ID`) — that impersonation does not arm. ⊗ Start `pr:wait-mergeable-and-merge` before CLEAN (#4822). ⊗ Treat host `monitor` or bare shell `pr:watch` as the sole babysit when `spawn_subagent` is available (#5229).
|
|
102
|
+
Core helper: `formatApproach1BabysitterOneLiner` / `formatApproach1CheapestAdmissionCard` / `admitClaimedBabysitPath` (`packages/core/src/swarm/approach1-babysitter.ts`). Bounded-form deny: `evaluateBoundedPrWatchDeny` refuses Directive `pr:watch` / `task deft:pr:watch` without `--monitor-agent-id` when Tier 1 is provable. Claimed-wait deny: `evaluateClaimedBabysitPathDeny` / `admitClaimedBabysitPath` refuse `BabysitPathKind` forge-poll / bespoke-temp-poller / host-monitor / directive-pr-watch-bare and Approach 1 without bound evidence / different-PR arm. ⊗ Parent forge-poll / `gh` check-runs+mergeable_state sleep / bespoke `%TEMP%` PowerShell watchers as pre-CLEAN babysit (#5727). ⊗ Parent-shell `pr:watch --monitor-agent-id <leased id>` without spawn-injected `DEFT_MONITOR_AGENT_ID` (or CLI matching `GROK_SESSION_ID`) — that impersonation does not arm. ⊗ Start `pr:wait-mergeable-and-merge` before CLEAN (#4822). ⊗ Treat host `monitor` or bare shell `pr:watch` as the sole babysit when `spawn_subagent` is available (#5229).
|
|
103
103
|
|
|
104
104
|
! **Durable host→CLI capability stamp (#5229):** Before any CLI `verify:review-monitor` / `pr:watch` subprocess, write `.deft-scratch/host-capability-stamp.json` via `writeHostCapabilityStamp(projectRoot)` / `ensureHostCapabilityStampForBabysit` (and prefer exporting `GROK_BUILD=1` / `DEFT_HAS_SPAWN_SUBAGENT=1` into that subprocess). `review-monitor:register` also writes the stamp on successful claim/renew. Stamps older than 8h or bound to a different `host_session_id` are ignored so a later plain-terminal session cannot inherit Tier 1. Without a fresh stamp, bare `node … verify:review-monitor` can mis-detect Tier 3 / `generic-terminal` and fail-open with "no active review-monitor required" even though this parent owns `spawn_subagent`. `probeMonitoringTier` merges the stamp; `DEFT_MONITOR_TIER=3` is labeled `override-tier3` (not honest `generic-terminal`) and refused when stamp/env already proves Tier 1. `evaluateReviewMonitorGate` consults sticky lease `platform_primitive` before Approach 3 READY and before `!isTier1` READY. Bounded `pr:watch` without `--monitor-agent-id` is refused at the watch entry when Tier 1 is provable.
|
|
105
105
|
|
|
106
|
-
! **Named residual — bespoke `%TEMP%`
|
|
106
|
+
! **Named residual — undeclared shell / bespoke `%TEMP%` (#5229 / #5732):** Unsanctioned `%TEMP%` / ad-hoc PowerShell one-shot watchers are **not** covered by the bounded Directive `pr:watch` form deny unless the host routes them through deft-hook. Claimed-path fixture coverage (#5727) is not pre-execution interception — that residual is leftover #5732. Do not claim total coverage of arbitrary host/shell babysitting without host admission. Prefer Approach 1; kill freestyle watchers when they appear.
|
|
107
107
|
|
|
108
108
|
! **Mandatory checked handoff (#5219 / #5229):** before the parent yields on a Tracking PR that still needs Greptile/CI shepherding while `spawn_subagent` is available, the same-turn checked handoff is `task verify:review-monitor -- --pr <N> --merge-path-arm --live-wait` exit 0 after Approach 1 register + **still-running** child-bound wait (verify after watch starts, not before).
|
|
109
109
|
|
|
@@ -4,8 +4,8 @@ description: >-
|
|
|
4
4
|
Session-start framework sync and upgrade handoff. OVPR path: npm i -g
|
|
5
5
|
@deftai/directive then directive install / upgrade / install --repair /
|
|
6
6
|
doctor; validates xBRIEF lifecycle, detects stale origins (RFC D12), and
|
|
7
|
-
finishes SCM release handoff in released | pr-open | blocked:<reason>
|
|
8
|
-
|
|
7
|
+
finishes SCM release handoff in released | pr-open | blocked:<reason> (#1604
|
|
8
|
+
/ #5490).
|
|
9
9
|
triggers:
|
|
10
10
|
- good morning
|
|
11
11
|
- update deft
|
|
@@ -77,7 +77,7 @@ The person finishes one menu option, or has a recorded skip. The agent reads eac
|
|
|
77
77
|
- Step 3 start: `--confirm` (menu: 1 Yes / 2 Leave / 3 Discuss / 4 Back). Commands promote and activate the proposed work file, then create the branch. After `startLifecycleDone` (Back to start), JSON `command` is null — do not re-run them.
|
|
78
78
|
- Step 4 change: `--content-seen` (menu: 1 Go / 2 Leave / 3 Discuss / 4 Back)
|
|
79
79
|
- Step 5 prove: menu 1 Go (run check), then record `--check pass|fail` (fail stays; pass stays on Continue). Menu after pass: 1 Continue / 2 Leave / 3 Discuss / 4 Back. After fail: 1 Try again / 2 Leave / 3 Discuss / 4 Back. A combined `--project 1 --check pass` on a failed prove step records the new result.
|
|
80
|
-
- Step 6 close:
|
|
80
|
+
- Step 6 close: stamp acceptance proof then complete (`--complete`; menu: 1 Go / 2 Leave / 3 Discuss / 4 Back; only after a pass + Continue). Commands run `scope:stamp-evidence` then `scope:complete --non-delivery experiment_archived`. After `closeLifecycleDone` (Back to close), JSON `command` is null — do not re-run stamp-evidence or complete.
|
|
81
81
|
- Step 7 leave: `advance` with no extra flags (only after close); otherwise `deft tutorial:leave`
|
|
82
82
|
|
|
83
83
|
## Progress
|
|
@@ -71,7 +71,14 @@ tasks:
|
|
|
71
71
|
cmds:
|
|
72
72
|
- |
|
|
73
73
|
set -eu
|
|
74
|
-
|
|
74
|
+
# OVPR consumer: DEFT_ROOT is node_modules/@deftai/directive-runtime → dist/bin.js.
|
|
75
|
+
# Framework source / legacy .deft/core: DEFT_ROOT/packages/runtime/dist/bin.js.
|
|
76
|
+
bin=""
|
|
77
|
+
if [ -f "{{.DEFT_ROOT}}/dist/bin.js" ]; then
|
|
78
|
+
bin="{{.DEFT_ROOT}}/dist/bin.js"
|
|
79
|
+
elif [ -f "{{.DEFT_ROOT}}/packages/runtime/dist/bin.js" ]; then
|
|
80
|
+
bin="{{.DEFT_ROOT}}/packages/runtime/dist/bin.js"
|
|
81
|
+
fi
|
|
75
82
|
root_pkg="{{.DEFT_ROOT}}/package.json"
|
|
76
83
|
# #3324: deposit marker (package.json field / file / content-package
|
|
77
84
|
# name) forces is_buildable_source=0 so every verb uses global CLI.
|
|
@@ -79,7 +86,7 @@ tasks:
|
|
|
79
86
|
if node "{{.TASKFILE_DIR}}/engine-invoke.cjs" is-buildable-source "{{.DEFT_ROOT}}"; then
|
|
80
87
|
is_buildable_source=1
|
|
81
88
|
fi
|
|
82
|
-
if [ -f "$bin" ]; then
|
|
89
|
+
if [ -n "$bin" ] && [ -f "$bin" ]; then
|
|
83
90
|
if [ "$is_buildable_source" = 1 ] && [ -f "$root_pkg" ]; then
|
|
84
91
|
node -e "
|
|
85
92
|
const fs=require('fs');
|
|
@@ -153,7 +160,7 @@ tasks:
|
|
|
153
160
|
" "{{.DEFT_ROOT}}" "$global_cli" >&2 || true
|
|
154
161
|
node "{{.TASKFILE_DIR}}/engine-invoke.cjs" global "$global_cli"
|
|
155
162
|
else
|
|
156
|
-
echo "deft: CLI artifact missing
|
|
163
|
+
echo "deft: CLI artifact missing under {{.DEFT_ROOT}} (tried dist/bin.js and packages/runtime/dist/bin.js)" >&2
|
|
157
164
|
if [ "$is_runtime_verb" = 1 ]; then
|
|
158
165
|
echo " Install global deft: npm i -g @deftai/directive" >&2
|
|
159
166
|
echo " Or run \`task build\` first (framework source checkout)." >&2
|
|
@@ -167,7 +174,7 @@ tasks:
|
|
|
167
174
|
elif command -v directive >/dev/null 2>&1; then
|
|
168
175
|
node "{{.TASKFILE_DIR}}/engine-invoke.cjs" global directive
|
|
169
176
|
else
|
|
170
|
-
echo "deft: neither {{.DEFT_ROOT}}
|
|
177
|
+
echo "deft: neither OVPR/legacy bin.js under {{.DEFT_ROOT}} nor a global deft command is available." >&2
|
|
171
178
|
echo " Install with: npm i -g @deftai/directive" >&2
|
|
172
179
|
exit 2
|
|
173
180
|
fi
|
|
@@ -111,6 +111,7 @@ Deft runtime is pinned as `@deftai/directive-runtime`. Full guidelines: node_mod
|
|
|
111
111
|
! Default story / through-merge unit of work is `drive-to: merge-ready`. Deliberate `stop-at: pr-open` only with a **partner merge-path owner** (review-cycle babysit / Approach 1 lease / parent-retained) for Greptile + CI + post-merge `scope:complete` — capacity stall, wall-clock, large multi-gate, host nest limits (#4130; swarm Phase 0). Depth: `deft-directive-swarm` + `deft-directive-review-cycle`.
|
|
112
112
|
! **Declared wall-clock (#3984):** wall-clock row fires only on a declared budget (`--max-wait-minutes` / `DEFT_PR_WATCH_MAX_WAIT_MINUTES` / xBRIEF); 30m `pr:watch` default is a poll cap, not that declaration. Prefer Approach 1 dispatch over parent-as-leaf implement for multi-hour babysit — partner merge-path owner must keep a live wait (`pr:watch` + `verify:review-monitor --merge-path-arm --live-wait`); sticky lease alone is unarmed (#4882). Durable human-merge owner rules stay with that partner through merge + `scope:complete`. ⊗ Parent-turn-shape detector on #3984; ⊗ absorb #5219.
|
|
113
113
|
! **Grok through-merge (#4529 / #4821):** implement MUST be `stop-at: pr-open`. Dest class A residual, then Approach 1 wait, then parent-retained closer after CLEAN. Not a global SLA recut. ⊗ Harvest option 2 / `merge-release` / parent-inline residual.
|
|
114
|
+
! **Exclusive lawful waits (#5727 / #5229):** When Tier-1 `spawn_subagent` is available, the only lawful pre-CLEAN wait is Approach 1 child `pr:watch --monitor-agent-id` after `review-monitor:register --platform-primitive spawn_subagent` with `verify:review-monitor --merge-path-arm --live-wait` green; after CLEAN, parent-retained `pr:wait-mergeable-and-merge`. Reuse `approach1BabysitterCommands` / `formatApproach1CheapestAdmissionCard`. ⊗ Parent forge-poll / `gh` check-runs+mergeable_state sleep / bespoke `%TEMP%` PowerShell watchers / host-monitor / bare Directive `pr:watch` as pre-CLEAN babysit (`BabysitPathKind`: forge-poll / bespoke-temp-poller / host-monitor / directive-pr-watch-bare). Claimed-wait fail-closed: `admitClaimedBabysitPath` / `evaluateClaimedBabysitPathDeny`. Undeclared-shell interception before execution is leftover #5732.
|
|
114
115
|
! After stop-at:pr-open (#4882 / #5219), merge-path owner MUST keep a still-running phase-correct wait (pre-CLEAN: Approach 1 child `pr:watch --monitor-agent-id <id>`; post-CLEAN: `pr:wait-mergeable-and-merge`) until CLEAN or explicit option-C finish; under human-merge also remain for post-merge `scope:complete`. Sticky lease alone or Path B promise without a live wait is unarmed; CLEAN alone is not lifecycle complete. On Tier-1 `spawn_subagent`, `--merge-path-arm --live-wait` requires lease `platform_primitive=spawn_subagent` and heartbeat `parent_id` bound to that `monitor_agent_id` (post-CLEAN `pr-wait-mergeable` exempt); parent-shell `pr:watch` does not arm (#5219). Probe: `deft verify:review-monitor -- --pr <N> --merge-path-arm` (`--live-wait` / `--explicit-finish`). `pr:watch --json` wrappers MUST parse full stdout JSON (pretty multi-line valid); line-split misses CLEAN (#5015). Prefer Approach 1 babysitter / native `pr:watch --monitor-agent-id`.
|
|
115
116
|
! **Cohort babysit inventory (#5318 / #5690):** For N>1 open Tracking/cohort PRs, parent MUST run `deft verify:cohort-review-monitors -- --prs <csv>` (launch-manifest ∪ open Tracking; `--prs` must not silently shrink) and remediate `unarmed` via Approach 1 at: after each PR-open/discover; before each serial rebase/squash-merge; after Approach 1 child exit/lease release; after tip-churn dirty; after dual-stop/conf-hold/BLOCKED halt; after mint-PR-open/merge. Product mint-gate BLOCKED is non-option-C — same-turn re-arm `--merge-path-arm --live-wait` (mint-PR waiter ≠ product). Classes: `armed-live` | `halted-explicit` (durable `--explicit-finish` only) | `unarmed`. `swarm:verify-review-clean` CLEAN does **not** satisfy inventory — one rule family with #4882/#5219.
|
|
116
117
|
⊗ Silent PR-open handback for a worker already scoped `drive-to: merge-ready`. ⊗ `stop-at: pr-open` without a named babysit / merge-path owner, or dual review-monitor leases on recovery (#3044 / #2261). ⊗ Stand down unarmed, or treat lease-only / line-parsed `pr-watch --json` / parent-shell `pr:watch` as armed when `spawn_subagent` is available (#4882 / #5219).
|