@ran-sh/dsh-crew 1.7.2 → 1.8.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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-crew",
3
- "version": "1.7.2",
3
+ "version": "1.8.0",
4
4
  "description": "Dispatch subtasks to DeepSeek Harness (DSH) agents as native subagents with live progress",
5
5
  "author": {
6
6
  "name": "ZSeven-W"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ran-sh/dsh-crew",
3
- "version": "1.7.2",
3
+ "version": "1.8.0",
4
4
  "type": "module",
5
5
  "main": "./src/hub/entry.mjs",
6
6
  "bin": {
@@ -32,10 +32,46 @@ same `dsh-crew` MCP server, so the behaviour below is identical from any host.
32
32
  | `dsh_worker_cancel` | cancel a workflow |
33
33
  | `dsh_worker_config` | read/update session settings: enable dispatch, tier, effort, timeout, presets, policy |
34
34
 
35
+ Dispatch takes `task` (make it self-contained — the worker sees nothing else),
36
+ `role` (`worker` for implementation, `reviewer` for an independent review pass),
37
+ `cwd` (the workspace; defaults to the current project) and `timeout_seconds`.
38
+ Use `dsh_spawn_worker` when you have other work to do meanwhile, then
39
+ `dsh_worker_result` with `wait_seconds` to collect it.
40
+
35
41
  `dsh_worker_config` with no arguments is the cheapest way to answer "what is
36
42
  Crew set to right now". Its settings last for the session only; persisted
37
43
  changes belong in the 3210 panel.
38
44
 
45
+ ## Reading a result
46
+
47
+ A result carries a `phase` and, when it did not succeed, a failure code. The
48
+ phases are `created`, `queued`, `running`, `verifying`, `escalating`,
49
+ `reviewing`, `ready`, `completed`, `failed`, `cancelled`, `interrupted`.
50
+
51
+ **`phase: failed` does not mean the worker broke.** Most often it means the
52
+ workflow's delivery gate rejected the result, and the reason code says which
53
+ gate. Read the code before reacting:
54
+
55
+ | Code | Means |
56
+ |---|---|
57
+ | `DELIVERY_INCOMPLETE` | the worker returned no change where the contract required one — a reply-only or question-only task lands here, and it is not a defect |
58
+ | `TESTS_FAILED` / `TESTS_NOT_RUN` | the worker's own test evidence is failing or absent |
59
+ | `REVIEW_CHANGES_REQUESTED` | the reviewer asked for changes; act on them |
60
+ | `REVIEW_INCONCLUSIVE` | the review could not reach a verdict |
61
+ | `WORKSPACE_MISMATCH` | the worker's changes are not in the workspace the job was meant to touch |
62
+ | `TASK_BLOCKED` / `TASK_PARTIAL` | the worker says it could not finish |
63
+ | `ATTEMPT_TIMEOUT` / `RUNTIME_FAILURE` / `EXECUTION_FAILED` | the run itself failed |
64
+ | `POLICY_REJECTED` | Crew's own policy refused the dispatch; change the request, not the worker |
65
+ | `PROVIDER_UNAVAILABLE` / `HUB_INCOMPATIBLE` | no model or no reachable hub |
66
+
67
+ `terminal_reason: escalation_disabled` is **not** a separate failure — it is the
68
+ escalation policy declining to retry after a failure. The failure code above it
69
+ is the real reason.
70
+
71
+ The selection trace names the model actually used and every candidate that was
72
+ skipped, with the reason. Reach for it whenever the chosen model is not the one
73
+ you expected.
74
+
39
75
  ## Choosing what to dispatch
40
76
 
41
77
  Delegate a bounded, independently verifiable unit when isolation,
@@ -48,6 +84,19 @@ Continue authorized work after a successful subtask; a returned workflow is a
48
84
  checkpoint, not the end of the task. If a worker's result is incomplete or its
49
85
  review asks for changes, that is a task result to act on — not approval.
50
86
 
87
+ ## Common ways a dispatch surprises you
88
+
89
+ - **A task that only asks a question fails.** The delivery contract wants a
90
+ change; a reply-only task returns `DELIVERY_INCOMPLETE`. That is the gate
91
+ working, not the worker failing.
92
+ - **Isolated workspaces need git.** The default `worktree` isolation fails with
93
+ `NOT_GIT_REPOSITORY` for a non-git workspace rather than silently sharing the
94
+ tree. Use `shared` deliberately if that is what you want.
95
+ - **Long tasks need a longer timeout.** `timeout_seconds` is per attempt and
96
+ caps at 7200; the default is far shorter than a real refactor.
97
+ - **A worker cannot see your conversation.** Anything it needs must be in
98
+ `task`, in the workspace, or in a file it can read.
99
+
51
100
  ## Configuration
52
101
 
53
102
  Two surfaces, and they are not equivalent:
@@ -36,7 +36,7 @@ export {
36
36
  // included in the identity contract.
37
37
  const RUNTIME_ID = randomUUID();
38
38
 
39
- export const RUNTIME_VERSION = '1.7.2';
39
+ export const RUNTIME_VERSION = '1.8.0';
40
40
  export const HUB_PROTOCOL_VERSION = 1;
41
41
 
42
42
  export const HUB_CAPABILITIES = Object.freeze([