specweave 2.0.3 → 2.2.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.
Files changed (156) hide show
  1. package/.claude-plugin/marketplace.json +3 -3
  2. package/README.md +21 -11
  3. package/bin/specweave.js +28 -0
  4. package/dist/dashboard/assets/index-BeKUULf0.css +1 -0
  5. package/dist/dashboard/assets/index-Bf5TF0_l.js +13 -0
  6. package/dist/dashboard/index.html +2 -2
  7. package/dist/src/cli/commands/jev-helpers.d.ts +148 -0
  8. package/dist/src/cli/commands/jev-helpers.d.ts.map +1 -0
  9. package/dist/src/cli/commands/jev-helpers.js +582 -0
  10. package/dist/src/cli/commands/jev-helpers.js.map +1 -0
  11. package/dist/src/cli/commands/jev.d.ts +21 -0
  12. package/dist/src/cli/commands/jev.d.ts.map +1 -0
  13. package/dist/src/cli/commands/jev.js +350 -0
  14. package/dist/src/cli/commands/jev.js.map +1 -0
  15. package/dist/src/cli/commands/sync.d.ts.map +1 -1
  16. package/dist/src/cli/commands/sync.js +23 -5
  17. package/dist/src/cli/commands/sync.js.map +1 -1
  18. package/dist/src/cli/helpers/init/instruction-file-writer.d.ts +4 -0
  19. package/dist/src/cli/helpers/init/instruction-file-writer.d.ts.map +1 -1
  20. package/dist/src/cli/helpers/init/instruction-file-writer.js +11 -6
  21. package/dist/src/cli/helpers/init/instruction-file-writer.js.map +1 -1
  22. package/dist/src/core/auto/completion-evaluator.d.ts +22 -1
  23. package/dist/src/core/auto/completion-evaluator.d.ts.map +1 -1
  24. package/dist/src/core/auto/completion-evaluator.js +99 -9
  25. package/dist/src/core/auto/completion-evaluator.js.map +1 -1
  26. package/dist/src/core/config/types.d.ts +39 -1
  27. package/dist/src/core/config/types.d.ts.map +1 -1
  28. package/dist/src/core/config/types.js +1 -0
  29. package/dist/src/core/config/types.js.map +1 -1
  30. package/dist/src/core/doctor/checkers/hooks-checker.d.ts +1 -1
  31. package/dist/src/core/doctor/checkers/hooks-checker.js +1 -1
  32. package/dist/src/core/hooks/handlers/pre-tool-use.d.ts +28 -5
  33. package/dist/src/core/hooks/handlers/pre-tool-use.d.ts.map +1 -1
  34. package/dist/src/core/hooks/handlers/pre-tool-use.js +162 -7
  35. package/dist/src/core/hooks/handlers/pre-tool-use.js.map +1 -1
  36. package/dist/src/core/hooks/handlers/session-start.d.ts.map +1 -1
  37. package/dist/src/core/hooks/handlers/session-start.js +20 -0
  38. package/dist/src/core/hooks/handlers/session-start.js.map +1 -1
  39. package/dist/src/core/intent/portable-context.d.ts +4 -0
  40. package/dist/src/core/intent/portable-context.d.ts.map +1 -0
  41. package/dist/src/core/intent/portable-context.js +68 -0
  42. package/dist/src/core/intent/portable-context.js.map +1 -0
  43. package/dist/src/core/intent/types.d.ts +28 -0
  44. package/dist/src/core/intent/types.d.ts.map +1 -0
  45. package/dist/src/core/intent/types.js +3 -0
  46. package/dist/src/core/intent/types.js.map +1 -0
  47. package/dist/src/core/intent/validation.d.ts +5 -0
  48. package/dist/src/core/intent/validation.d.ts.map +1 -0
  49. package/dist/src/core/intent/validation.js +39 -0
  50. package/dist/src/core/intent/validation.js.map +1 -0
  51. package/dist/src/core/jev/browse.d.ts +56 -0
  52. package/dist/src/core/jev/browse.d.ts.map +1 -0
  53. package/dist/src/core/jev/browse.js +721 -0
  54. package/dist/src/core/jev/browse.js.map +1 -0
  55. package/dist/src/core/jev/client.d.ts +134 -0
  56. package/dist/src/core/jev/client.d.ts.map +1 -0
  57. package/dist/src/core/jev/client.js +329 -0
  58. package/dist/src/core/jev/client.js.map +1 -0
  59. package/dist/src/core/jev/config.d.ts +69 -0
  60. package/dist/src/core/jev/config.d.ts.map +1 -0
  61. package/dist/src/core/jev/config.js +181 -0
  62. package/dist/src/core/jev/config.js.map +1 -0
  63. package/dist/src/core/jev/decide.d.ts +160 -0
  64. package/dist/src/core/jev/decide.d.ts.map +1 -0
  65. package/dist/src/core/jev/decide.js +325 -0
  66. package/dist/src/core/jev/decide.js.map +1 -0
  67. package/dist/src/core/jev/index.d.ts +20 -0
  68. package/dist/src/core/jev/index.d.ts.map +1 -0
  69. package/dist/src/core/jev/index.js +20 -0
  70. package/dist/src/core/jev/index.js.map +1 -0
  71. package/dist/src/core/jev/questions.d.ts +56 -0
  72. package/dist/src/core/jev/questions.d.ts.map +1 -0
  73. package/dist/src/core/jev/questions.js +159 -0
  74. package/dist/src/core/jev/questions.js.map +1 -0
  75. package/dist/src/core/jev/redact.d.ts +44 -0
  76. package/dist/src/core/jev/redact.d.ts.map +1 -0
  77. package/dist/src/core/jev/redact.js +102 -0
  78. package/dist/src/core/jev/redact.js.map +1 -0
  79. package/dist/src/core/jev/usage.d.ts +38 -0
  80. package/dist/src/core/jev/usage.d.ts.map +1 -0
  81. package/dist/src/core/jev/usage.js +70 -0
  82. package/dist/src/core/jev/usage.js.map +1 -0
  83. package/dist/src/core/session/handoff-pointer.d.ts +4 -0
  84. package/dist/src/core/session/handoff-pointer.d.ts.map +1 -0
  85. package/dist/src/core/session/handoff-pointer.js +60 -0
  86. package/dist/src/core/session/handoff-pointer.js.map +1 -0
  87. package/dist/src/core/session/work-handoff.d.ts.map +1 -1
  88. package/dist/src/core/session/work-handoff.js +10 -3
  89. package/dist/src/core/session/work-handoff.js.map +1 -1
  90. package/dist/src/dashboard/server/dashboard-server.d.ts +1 -0
  91. package/dist/src/dashboard/server/dashboard-server.d.ts.map +1 -1
  92. package/dist/src/dashboard/server/dashboard-server.js +10 -90
  93. package/dist/src/dashboard/server/dashboard-server.js.map +1 -1
  94. package/dist/src/dashboard/server/data/cost-aggregator.d.ts +10 -5
  95. package/dist/src/dashboard/server/data/cost-aggregator.d.ts.map +1 -1
  96. package/dist/src/dashboard/server/data/cost-aggregator.js +31 -33
  97. package/dist/src/dashboard/server/data/cost-aggregator.js.map +1 -1
  98. package/dist/src/dashboard/server/data/dashboard-data-aggregator.d.ts +0 -1
  99. package/dist/src/dashboard/server/data/dashboard-data-aggregator.d.ts.map +1 -1
  100. package/dist/src/dashboard/server/data/dashboard-data-aggregator.js +14 -66
  101. package/dist/src/dashboard/server/data/dashboard-data-aggregator.js.map +1 -1
  102. package/dist/src/dashboard/server/data/dashboard-task-board.d.ts +4 -0
  103. package/dist/src/dashboard/server/data/dashboard-task-board.d.ts.map +1 -0
  104. package/dist/src/dashboard/server/data/dashboard-task-board.js +56 -0
  105. package/dist/src/dashboard/server/data/dashboard-task-board.js.map +1 -0
  106. package/dist/src/dashboard/server/data/intent-store.d.ts +19 -0
  107. package/dist/src/dashboard/server/data/intent-store.d.ts.map +1 -0
  108. package/dist/src/dashboard/server/data/intent-store.js +268 -0
  109. package/dist/src/dashboard/server/data/intent-store.js.map +1 -0
  110. package/dist/src/dashboard/server/data/local-sessions.d.ts +15 -0
  111. package/dist/src/dashboard/server/data/local-sessions.d.ts.map +1 -0
  112. package/dist/src/dashboard/server/data/local-sessions.js +197 -0
  113. package/dist/src/dashboard/server/data/local-sessions.js.map +1 -0
  114. package/dist/src/dashboard/server/data/work-projection.d.ts +8 -0
  115. package/dist/src/dashboard/server/data/work-projection.d.ts.map +1 -0
  116. package/dist/src/dashboard/server/data/work-projection.js +175 -0
  117. package/dist/src/dashboard/server/data/work-projection.js.map +1 -0
  118. package/dist/src/dashboard/server/file-watcher.d.ts.map +1 -1
  119. package/dist/src/dashboard/server/file-watcher.js +2 -1
  120. package/dist/src/dashboard/server/file-watcher.js.map +1 -1
  121. package/dist/src/dashboard/server/local-request.d.ts +4 -0
  122. package/dist/src/dashboard/server/local-request.d.ts.map +1 -0
  123. package/dist/src/dashboard/server/local-request.js +29 -0
  124. package/dist/src/dashboard/server/local-request.js.map +1 -0
  125. package/dist/src/dashboard/server/routes/work-routes.d.ts +5 -0
  126. package/dist/src/dashboard/server/routes/work-routes.d.ts.map +1 -0
  127. package/dist/src/dashboard/server/routes/work-routes.js +37 -0
  128. package/dist/src/dashboard/server/routes/work-routes.js.map +1 -0
  129. package/dist/src/dashboard/types.d.ts +3 -3
  130. package/dist/src/dashboard/types.d.ts.map +1 -1
  131. package/dist/src/dashboard/work-types.d.ts +39 -0
  132. package/dist/src/dashboard/work-types.d.ts.map +1 -0
  133. package/dist/src/dashboard/work-types.js +3 -0
  134. package/dist/src/dashboard/work-types.js.map +1 -0
  135. package/dist/src/sync/external-change-puller.d.ts +19 -0
  136. package/dist/src/sync/external-change-puller.d.ts.map +1 -1
  137. package/dist/src/sync/external-change-puller.js +87 -77
  138. package/dist/src/sync/external-change-puller.js.map +1 -1
  139. package/dist/src/utils/model-selection.d.ts +49 -0
  140. package/dist/src/utils/model-selection.d.ts.map +1 -1
  141. package/dist/src/utils/model-selection.js +70 -0
  142. package/dist/src/utils/model-selection.js.map +1 -1
  143. package/package.json +3 -3
  144. package/plugins/PLUGINS-INDEX.md +14 -4
  145. package/plugins/specweave/.claude-plugin/plugin.json +5 -3
  146. package/plugins/specweave/PLUGIN.md +16 -4
  147. package/plugins/specweave/hooks/hooks.json +1 -24
  148. package/plugins/specweave/hooks/run-worker.mjs +37 -2
  149. package/plugins/specweave/hooks/run.mjs +54 -1
  150. package/plugins/specweave/marketplace.json +6 -0
  151. package/plugins/specweave/skills/increment/SKILL.md +7 -5
  152. package/plugins/specweave/skills/jev/SKILL.md +201 -0
  153. package/src/templates/AGENTS.md.template +27 -5
  154. package/src/templates/CLAUDE.md.template +27 -5
  155. package/dist/dashboard/assets/index-BiJhGDZV.js +0 -13
  156. package/dist/dashboard/assets/index-heYRtWFf.css +0 -1
@@ -1,6 +1,6 @@
1
1
  # SpecWeave plugin (`sw`)
2
2
 
3
- The Claude Code surface for SpecWeave: **10 skills, 4 hooks, 1 closer agent**.
3
+ The Claude Code surface for SpecWeave: **11 skills, 2 default hooks, 1 closer agent**.
4
4
  Everything deterministic lives in the `specweave` CLI; a skill exists only where a
5
5
  procedure needs model judgement. There is no `commands/` namespace in 2.0.
6
6
 
@@ -18,6 +18,7 @@ procedure needs model judgement. There is no `commands/` namespace in 2.0.
18
18
  | `sw:auto` | Unattended loop driven by the Stop hook |
19
19
  | `sw:brainstorm` | Expand the option space before committing to one |
20
20
  | `sw:qa` | Risk-scored quality assessment (`specweave qa`) |
21
+ | `sw:jev` | Delegate closed-set decisions to Jev (TypeSafe System One): routing, command safety, screening |
21
22
 
22
23
  Optional procedures (tdd-cycle, e2e, debug, diagrams, release-expert) are **not** in the
23
24
  plugin — they ship from `skills-optional/` via
@@ -25,14 +26,25 @@ plugin — they ship from `skills-optional/` via
25
26
 
26
27
  ## Hooks
27
28
 
28
- Four, all exec-form `node hooks/run.mjs <event>` (no shell, Windows-safe):
29
+ Two by default, both exec-form `node hooks/run.mjs <event>` (no shell, Windows-safe):
29
30
 
30
31
  | Hook | Job |
31
32
  |---|---|
32
33
  | `SessionStart` | Inject the active increment + next task as context |
33
- | `PreToolUse` (Write\|Edit) | Guard writes under `.specweave/increments/` |
34
34
  | `Stop` | Drive the `sw:auto` loop; `{}` for every ordinary session |
35
- | `PreCompact` | Write a handoff doc before context is compacted |
35
+
36
+ `PreToolUse` is **not** registered by default — `hooks.json` ships `SessionStart` and
37
+ `Stop` only, exactly as in 2.1.0. `PreToolUse` and `PreCompact` stay callable
38
+ compatibility handlers.
39
+
40
+ The Jev Bash guard is opted into **one project at a time**:
41
+ `specweave jev setup --guard-bash` sets `jev.guards.bash` in `.specweave/config.json`,
42
+ writes the marker `.specweave/state/jev-guard.enabled`, and registers a project-level
43
+ hook in that project's `.claude/settings.json` (`hooks.PreToolUse`, matcher `Bash`,
44
+ command `node "<installed specweave>/plugins/specweave/hooks/run.mjs" pre-tool-use`).
45
+ `specweave jev setup --no-guard-bash` removes all three, and `specweave jev doctor` shows
46
+ the marker and the project hook. This is a Claude Code surface only; other tools call
47
+ `specweave jev guard "<command>"` explicitly before running anything unattended.
36
48
 
37
49
  ## Agents
38
50
 
@@ -1,5 +1,5 @@
1
1
  {
2
- "description": "SpecWeave hooks: portable command strings and bounded worker execution.",
2
+ "description": "Minimal hooks: compact session context and an opt-in auto loop. Handoffs are explicit CLI actions.",
3
3
  "hooks": {
4
4
  "SessionStart": [
5
5
  {
@@ -12,18 +12,6 @@
12
12
  ]
13
13
  }
14
14
  ],
15
- "PreToolUse": [
16
- {
17
- "matcher": "Write|Edit",
18
- "hooks": [
19
- {
20
- "type": "command",
21
- "command": "node \"${CLAUDE_PLUGIN_ROOT}/hooks/run.mjs\" pre-tool-use",
22
- "timeout": 10
23
- }
24
- ]
25
- }
26
- ],
27
15
  "Stop": [
28
16
  {
29
17
  "hooks": [
@@ -34,17 +22,6 @@
34
22
  }
35
23
  ]
36
24
  }
37
- ],
38
- "PreCompact": [
39
- {
40
- "hooks": [
41
- {
42
- "type": "command",
43
- "command": "node \"${CLAUDE_PLUGIN_ROOT}/hooks/run.mjs\" pre-compact",
44
- "timeout": 10
45
- }
46
- ]
47
- }
48
25
  ]
49
26
  }
50
27
  }
@@ -19,7 +19,9 @@
19
19
  * 4. `npm root -g` (result cached in a per-user private file under ~/.specweave)
20
20
  *
21
21
  * Fast path: PreToolUse for a file outside `.specweave/increments/` prints `{}`
22
- * without loading the CLI at all (the guards only concern increment files).
22
+ * without loading the CLI at all (the guards only concern increment files), and
23
+ * PreToolUse for Bash prints `{}` unless the project opted into the Jev command
24
+ * guard with a `.specweave/state/jev-guard.enabled` marker.
23
25
  */
24
26
  import { createRequire } from 'node:module';
25
27
  import { spawnSync } from 'node:child_process';
@@ -62,6 +64,34 @@ function isPrivateOwnedFile(file) {
62
64
 
63
65
  const event = process.argv[2] ?? '';
64
66
 
67
+ /** Opt-in marker for the Jev Bash guard, searched upward from cwd / project dir. */
68
+ const JEV_GUARD_MARKER = path.join('.specweave', 'state', 'jev-guard.enabled');
69
+ const JEV_GUARD_MAX_DEPTH = 8;
70
+
71
+ function hasJevGuardMarker(input) {
72
+ const starts = [typeof input.cwd === 'string' ? input.cwd : process.cwd(), process.env.CLAUDE_PROJECT_DIR];
73
+ for (const start of starts) {
74
+ if (!start) continue;
75
+ let current;
76
+ try {
77
+ current = path.resolve(start);
78
+ } catch {
79
+ continue;
80
+ }
81
+ for (let depth = 0; depth < JEV_GUARD_MAX_DEPTH; depth++) {
82
+ try {
83
+ if (existsSync(path.join(current, JEV_GUARD_MARKER))) return true;
84
+ } catch {
85
+ break;
86
+ }
87
+ const parent = path.dirname(current);
88
+ if (parent === current) break;
89
+ current = parent;
90
+ }
91
+ }
92
+ return false;
93
+ }
94
+
65
95
  function inactiveOutput() {
66
96
  if (event === 'session-start') {
67
97
  return {
@@ -123,7 +153,12 @@ function normalizeInput(raw) {
123
153
  filePath = ti.file_path;
124
154
  }
125
155
  if (typeof input.cwd === 'string') input.cwd = input.cwd.replace(/\\/g, '/');
126
- const skip = event === 'pre-tool-use' && !filePath.includes('.specweave/increments/');
156
+ const tool = typeof input.tool_name === 'string' ? input.tool_name : '';
157
+ const skip =
158
+ event === 'pre-tool-use' &&
159
+ (tool === 'Bash'
160
+ ? !hasJevGuardMarker(input)
161
+ : !filePath.includes('.specweave/increments/'));
127
162
  return { raw: JSON.stringify(input), skip };
128
163
  }
129
164
  } catch {
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  // SpecWeave hook supervisor: parent deadline remains live while the worker blocks in Git.
3
3
  import { spawn, spawnSync } from 'node:child_process';
4
- import { appendFileSync, mkdirSync } from 'node:fs';
4
+ import { appendFileSync, existsSync, mkdirSync, readFileSync } from 'node:fs';
5
5
  import { homedir } from 'node:os';
6
6
  import path from 'node:path';
7
7
  import { fileURLToPath } from 'node:url';
@@ -10,6 +10,56 @@ const worker = path.join(path.dirname(fileURLToPath(import.meta.url)), 'run-work
10
10
  const budget = event === 'stop' ? 25000 : 7500;
11
11
  let child, finished = false, input = '', output = '', size = 0;
12
12
  const started = Date.now();
13
+ // Ordinary turns should not resolve npm, import the CLI, or start a second Node
14
+ // process. Auto mode is explicit and its small local marker is authoritative.
15
+ function hasActiveAutoSession(data) {
16
+ let current = path.resolve(typeof data.cwd === 'string' ? data.cwd : process.cwd());
17
+ for (let depth = 0; depth < 100; depth++) {
18
+ const state = path.join(current, '.specweave', 'state');
19
+ if (existsSync(path.join(current, '.specweave', 'config.json'))) {
20
+ const sessionId = process.env.CLAUDE_SESSION_ID;
21
+ // Match session-state-manager's path-safe IDs, including dots and spaces.
22
+ const scoped = sessionId && !/[/\\]|\.\.|\0/.test(sessionId)
23
+ ? path.join(state, 'sessions', sessionId, 'auto-mode.json') : null;
24
+ const marker = scoped && existsSync(scoped) ? scoped : path.join(state, 'auto-mode.json');
25
+ try { return JSON.parse(readFileSync(marker, 'utf8')).active === true; }
26
+ catch { return false; }
27
+ }
28
+ const parent = path.dirname(current);
29
+ if (parent === current) break;
30
+ current = parent;
31
+ }
32
+ return false;
33
+ }
34
+ // PreToolUse fast path. Ordinary edits and ordinary shell commands must not
35
+ // spawn a worker, resolve npm or import the CLI. Write|Edit only matter inside
36
+ // `.specweave/increments/`; Bash only matters when the project opted into the
37
+ // Jev guard with a local marker file.
38
+ const JEV_GUARD_MARKER = path.join('.specweave', 'state', 'jev-guard.enabled');
39
+ const JEV_GUARD_MAX_DEPTH = 8;
40
+ function hasJevGuardMarker(data) {
41
+ const starts = [typeof data.cwd === 'string' ? data.cwd : process.cwd(), process.env.CLAUDE_PROJECT_DIR];
42
+ for (const start of starts) {
43
+ if (!start) continue;
44
+ let current;
45
+ try { current = path.resolve(start); } catch { continue; }
46
+ for (let depth = 0; depth < JEV_GUARD_MAX_DEPTH; depth++) {
47
+ try { if (existsSync(path.join(current, JEV_GUARD_MARKER))) return true; } catch { break; }
48
+ const parent = path.dirname(current);
49
+ if (parent === current) break;
50
+ current = parent;
51
+ }
52
+ }
53
+ return false;
54
+ }
55
+ function skipPreToolUse(data) {
56
+ const tool = typeof data.tool_name === 'string' ? data.tool_name : '';
57
+ if (tool === 'Bash') return !hasJevGuardMarker(data);
58
+ const ti = data.tool_input;
59
+ const filePath = ti && typeof ti === 'object' && typeof ti.file_path === 'string'
60
+ ? ti.file_path.replace(/\\/g, '/') : '';
61
+ return !filePath.includes('.specweave/increments/');
62
+ }
13
63
  function record(reason) {
14
64
  try {
15
65
  const dir = path.join(homedir(), '.specweave', 'logs');
@@ -49,6 +99,9 @@ process.stdin.on('end',()=>{
49
99
  try {data=JSON.parse(input);if(!data || typeof data!=='object'||Array.isArray(data))throw Error();}
50
100
  catch {return finish({},'invalid_input');}
51
101
  if(!['session-start','pre-tool-use','pre-compact','stop'].includes(event))return finish({});
102
+ if(process.env.SPECWEAVE_DISABLE_HOOKS === '1')return finish({});
103
+ if(event === 'stop' && !hasActiveAutoSession(data))return finish({});
104
+ if(event === 'pre-tool-use' && skipPreToolUse(data))return finish({});
52
105
  const env={...process.env};
53
106
  child=spawn(process.execPath,[worker,event],{env,detached:process.platform !== 'win32',stdio:['pipe','pipe','pipe']});
54
107
  child.stdout.setEncoding('utf8');
@@ -62,6 +62,12 @@
62
62
  "path": "skills/qa/SKILL.md",
63
63
  "description": "Risk-scored quality assessment via specweave qa: verdict, blockers, optional export to tasks.md.",
64
64
  "deprecated": false
65
+ },
66
+ {
67
+ "name": "sw:jev",
68
+ "path": "skills/jev/SKILL.md",
69
+ "description": "Delegate closed-set decisions to Jev (TypeSafe System One) instead of a frontier turn: routing, command safety, text screening, failure triage.",
70
+ "deprecated": false
65
71
  }
66
72
  ],
67
73
  "optionalSkills": {
@@ -11,11 +11,13 @@ An increment is one folder — `.specweave/increments/NNNN-slug/` — holding
11
11
  `ledger.jsonl` (state, written by the CLI) and `metadata.json`. It is the unit of
12
12
  work and the tracker; every commit for it carries its id in the subject.
13
13
 
14
- ## Plan mode first (blocking)
14
+ ## Scope before implementation
15
15
 
16
- Planning produces a document the user approves before any code is written. If your
17
- tool has a plan mode, enter it now (Claude Code: `EnterPlanMode`) and wait for
18
- confirmation. Do not create files, do not implement, until the plan is approved.
16
+ Write a concise plan for work that needs shared acceptance criteria. Ask only about
17
+ material ambiguity or actions beyond the user's authorization. When the user has
18
+ asked for autonomous execution, make routine decisions and continue through
19
+ implementation and verification. A small self-contained fix can remain a
20
+ lightweight intent without this workflow.
19
21
 
20
22
  ## Steps
21
23
 
@@ -79,7 +81,7 @@ confirmation. Do not create files, do not implement, until the plan is approved.
79
81
  least one task; every task needs a `Test:` that a machine can run (or an explicit
80
82
  "manual: <what to check>"). Shared contracts (types, schema, migrations) go in an early
81
83
  task everything else depends on.
82
- 6. **Present the plan** (problem, ACs, task list, risks) and get approval. Then leave plan mode.
84
+ 6. **Share the plan** (problem, ACs, tasks, material risks). Resolve any remaining decision that needs the user; otherwise continue within existing authorization.
83
85
  7. **Hand off to execution**: `sw:do <id>` for one agent; `sw:team <id>` when the work has
84
86
  3+ disjoint lanes or 15+ tasks.
85
87
 
@@ -0,0 +1,201 @@
1
+ ---
2
+ description: Delegate closed-set decisions to Jev (TypeSafe System One) instead of a frontier turn: routing, command safety, text screening, failure triage. Use when saying "jev" or "system one".
3
+ version: 2.0.0
4
+ argument-hint: "[doctor|setup|ask|route|task|guard|screen|failure|browse|usage]"
5
+ ---
6
+
7
+ # Jev — System One for closed-set decisions
8
+
9
+ Jev (`typesafe/jev-1.13`, reached through OpenRouter or TypeSafe) is a **selection**
10
+ model, not a generation model. You hand it state plus questions whose answers are
11
+ enumerated in advance; it returns the chosen option with calibrated probabilities in
12
+ about 250 ms for about $0.00002. It cannot return anything outside your schema, and it
13
+ never writes code, prose or explanations.
14
+
15
+ ## The one test
16
+
17
+ > **Can every possible answer be written down before the call?**
18
+
19
+ Yes → Jev. No → keep the work in the frontier model. That is the whole rule.
20
+
21
+ Three primitives, nothing else:
22
+
23
+ | Primitive | Answer shape | Use for |
24
+ |---|---|---|
25
+ | `choice` | one of 2–255 named options + probabilities + confidence | which skill, which tier, which scope, which failure kind |
26
+ | `noul` | probability that a statement is true (0–1) | yes/no gates: needs an increment? AC satisfied? injected text? |
27
+ | `score` | position on 2–10 ordered, described levels | graded severity, risk, priority |
28
+
29
+ ## When to delegate inside the SpecWeave loop
30
+
31
+ | Moment | Delegate | Command |
32
+ |---|---|---|
33
+ | Before picking a skill or spawning a subagent tier | route the prompt | `specweave jev route "<prompt>"` |
34
+ | Before claiming a task, to pick its model tier | complexity of one ledger task | `specweave jev task T-01` |
35
+ | Before an unattended risky shell command | scope + destructiveness verdict | `specweave jev guard "<command>"` |
36
+ | Pulled issue / PR / web text enters context | injection screen | `specweave jev screen <file>` (or on stdin) |
37
+ | Right after a red test run | regression vs flake vs env vs test bug | `specweave jev failure <file>` (or on stdin) |
38
+ | Mechanical navigation of a known site | headless browse loop | `specweave jev browse --goal "<goal>" --url "<url>"` |
39
+ | Any other closed set of your own | arbitrary state + questions | `specweave jev ask --state @state.json --questions @q.json` |
40
+
41
+ Everything else — writing the spec, the diff, the review prose — stays with you.
42
+
43
+ Two narrowings worth knowing. `specweave jev task T-NN` is the live model-tier surface
44
+ (`selectModelTierForTask()` in code): SpecWeave does **not** silently re-route model tiers
45
+ inside task generation, so the tier is a suggestion you act on, not something that happens
46
+ behind you. And the completion evaluator is **downgrade-only** — a Jev noul can mark an
47
+ exit-0 run as failed, never turn a failed run into a pass.
48
+
49
+ ## Commands
50
+
51
+ | Command | Prints | Exit |
52
+ |---|---|---|
53
+ | `specweave jev doctor` | provider, model, key source (env var **name** only), live latency | 0 ok · 4 unavailable |
54
+ | `specweave jev setup` | live ping, then writes `jev.enabled` into `.specweave/config.json` | 0 ok · 4 unavailable |
55
+ | `specweave jev ask` | raw typed answers as JSON | 0 ok · 1 bad input · 4 unavailable |
56
+ | `specweave jev route "<prompt>"` | skill, request kind, complexity → model tier, needs-increment, each with confidence | 0 ok · 4 unavailable |
57
+ | `specweave jev task T-01 [inc]` | complexity → model tier for one task in the ledger | 0 ok · 4 unavailable |
58
+ | `specweave jev guard "<command>"` | verdict + probabilities | 0 allow · 2 warn · 3 deny · 4 unavailable |
59
+ | `specweave jev screen <file>` | injection probability + flagged yes/no | 0 ok · 4 unavailable |
60
+ | `specweave jev failure <file>` | failure kind + probabilities | 0 ok · 4 unavailable |
61
+ | `specweave jev browse` | steps, final url/title, page text excerpt, screenshot paths | 0 ok · 4 unavailable |
62
+ | `specweave jev usage` | calls, tokens, cost from `.specweave/state/jev-usage.jsonl` | 0 |
63
+
64
+ `ask` takes `--state` and `--questions` as inline JSON, plain text, `@file` or `-` for
65
+ stdin; for a one-off question use the shorthand `--choice "<instructions>" --option
66
+ key=description` (repeatable) or `--noul "<instructions>"`. `--json` on any action prints
67
+ the machine-readable form. `screen` and `failure` read stdin when no file is given.
68
+
69
+ **Exit 4 is not a failure.** It means Jev is disabled, unconfigured or unreachable:
70
+ continue with your own judgement and say nothing further about it.
71
+
72
+ ## What leaves the machine
73
+
74
+ Every `specweave jev` call sends the question state to the configured provider
75
+ (OpenRouter or TypeSafe) under the user's own key: the prompt text, task titles and
76
+ acceptance criteria, the shell command, test-output tails, screened text, and page text
77
+ and element names while browsing. Secret-shaped values — tokens, `--password` /
78
+ `--token` flags, `KEY=value` assignments, bearer headers and URL credentials — are
79
+ masked heuristically before the request and the count is reported, but masking is
80
+ best-effort, not a guarantee. Do not hand Jev state you would not paste into a
81
+ third-party API.
82
+
83
+ ## Thresholds and confidence
84
+
85
+ Configured under `jev.thresholds` in `.specweave/config.json`:
86
+
87
+ - `route` (default 0.7) — a routing answer below this confidence falls back to `opus`
88
+ and to your own skill choice.
89
+ - `guardWarn` (0.5) / `guardDeny` (0.85) — the bands behind the guard verdict.
90
+
91
+ The guard **denies** on three arms: scope `destructive_remote` with confidence at or
92
+ above `guardDeny`; destructiveness at or above `guardDeny` with scope
93
+ `local_irreversible` or `destructive_remote`; or scope `local_irreversible` with
94
+ confidence at or above `guardDeny` *and* destructiveness at or above `guardWarn` (a
95
+ near-certain local wipe scores its scope high and its destructiveness only moderately).
96
+ It **warns** when destructiveness reaches `guardWarn`, or the scope is
97
+ `shared_or_remote`, `local_irreversible` or `destructive_remote` — a low-confidence
98
+ remote-destruction reading degrades to warn and never falls through to allow.
99
+
100
+ A `choice`/`score` confidence measures how concentrated the distribution is, not whether
101
+ acting is safe. A `noul` near 0.5 means "as likely as not", never "medium intensity".
102
+ Treat a low-confidence answer as *no answer*, not as a weak answer.
103
+
104
+ ## Prefilter — what the guard never sees
105
+
106
+ A regex prefilter runs before any call, so `npm test`, `npm run build` / `test` / `lint`,
107
+ `pnpm test`, `yarn test`, `cargo test`, `go test` and plain read commands (`ls`, `cat`,
108
+ `grep`, `rg`, `find`, `git status` / `log` / `diff` / `show`, …) skip Jev entirely. That
109
+ makes the common case free, and it means **project-defined scripts are trusted by the
110
+ guard**: whatever `npm test` runs in this repo is never scored.
111
+
112
+ ## Anti-patterns — never send these to Jev
113
+
114
+ - Writing or editing code, specs, commit messages, reviews or any prose.
115
+ - Compaction, summarisation or "what changed in this diff".
116
+ - Judging the quality of another model's free-text output.
117
+ - Counting, arithmetic, date maths, ordering by number — it reads literally and is weak here.
118
+ - Adversarial or untrusted text as *instructions*. Screen it as **data** with a `noul`;
119
+ never let the screened text be the question.
120
+ - State over 32k tokens for one question, or 64k for one request. Summarise in code first.
121
+ - Open-ended questions with an unbounded answer set. If you cannot enumerate, do not ask.
122
+
123
+ ## Setup
124
+
125
+ ```bash
126
+ specweave jev setup # live ping, then writes jev.enabled: true
127
+ specweave jev doctor # verify: provider, model, key source, latency, guard state
128
+ specweave update-instructions # renders the jev section into CLAUDE.md / AGENTS.md
129
+ ```
130
+
131
+ The key lives in the environment (`OPENROUTER_API_KEY`, or `TYPESAFE_API_KEY` for the
132
+ direct provider; `JEV_API_KEY` works for either). Never print, echo, log or commit its
133
+ value — every surface here reports the variable **name** only. `SPECWEAVE_JEV=0`
134
+ disables Jev for one process; `SPECWEAVE_JEV=1` enables it ad hoc.
135
+
136
+ ### The Bash guard is per project, not a default hook
137
+
138
+ SpecWeave's default hooks are `SessionStart` and `Stop`, unchanged. `PreToolUse` is not
139
+ registered by the plugin. Turn the guard on for one project with:
140
+
141
+ ```bash
142
+ specweave jev setup --guard-bash # config flag + marker + project hook
143
+ specweave jev setup --no-guard-bash # removes all three
144
+ ```
145
+
146
+ That writes `jev.guards.bash` into `.specweave/config.json`, the marker
147
+ `.specweave/state/jev-guard.enabled`, and a `PreToolUse` entry with matcher `Bash` in the
148
+ project's `.claude/settings.json` (running
149
+ `node "<installed specweave>/plugins/specweave/hooks/run.mjs" pre-tool-use`).
150
+ `specweave jev doctor` shows the marker and the project hook. This is a Claude Code
151
+ surface: in Codex, Cursor and Gemini CLI call `specweave jev guard "<command>"` yourself
152
+ before running anything unattended.
153
+
154
+ **A denied command is for the user to approve, not for you to route around.** There is no
155
+ prefix you can type to skip the guard — the escape hatch is an environment variable set
156
+ in the shell that launches the agent, or `--no-guard-bash`. When a command is denied,
157
+ stop, say what you were about to run and why, and let the user decide.
158
+
159
+ ## Browser delegation — pick the runtime
160
+
161
+ | Tool | Use |
162
+ |---|---|
163
+ | Claude Code, Cursor, Gemini CLI | `specweave jev browse` — one headless Playwright loop, same JSON everywhere |
164
+ | Codex **with Computer Use connected** | the community `jev-browser-use` skill |
165
+ | Codex without Computer Use | `specweave jev browse` |
166
+
167
+ The loop is headless by definition: it never opens a visible window and never types text
168
+ Jev chose — text comes only from `--input Label=value`. `jev.browse.allowDomains` and the
169
+ repeatable `--allow-domain` flag are **merged**, and the `--url` the run starts from must
170
+ already be inside that allow-list. A control counts as sensitive by its **label or its
171
+ link target** (pay, delete, buy, sign out, …) and is skipped unless `--allow-sensitive`
172
+ is passed.
173
+
174
+ ## Adding Jev to the user's own project
175
+
176
+ Install TypeSafe's own skill and read the live docs — they are the source of truth:
177
+ `npx vskill install typesafe-ai`, index at https://docs.typesafe.ai/llms.txt (append
178
+ `.md` to any docs path for Markdown).
179
+
180
+ Then design the integration:
181
+
182
+ 1. **Find the closed sets.** Walk the product's flows and mark every place a prompt is
183
+ sent to an LLM only to pick one of a handful of outcomes: intent routing, moderation
184
+ triage, write-approval gates, dedupe, rerank, tagging. Those are Jev's.
185
+ 2. **One constants file.** Keep every question in a single module
186
+ (like `src/core/jev/questions.ts` here) and import it. Wording is the contract;
187
+ editing it at a call site silently changes behaviour and makes results unreproducible.
188
+ 3. **Fan out.** Independent questions over the same state go in *one* request — they run
189
+ in parallel and cannot see each other. Ask speculative branch questions up front and
190
+ consume only the answers the chosen branch needs.
191
+ 4. **Confidence gate.** Every consumer needs a documented threshold and a fallback path
192
+ for below it. No threshold means the probability is decoration.
193
+ 5. **Cascade.** Jev first, frontier model only for the cases it is unsure about. That is
194
+ where the cost and latency win actually lands; measure it before and after.
195
+ 6. **Errors.** 401 auth · 422 validation · 429 rate limit · 529 overloaded. Retry 429 and
196
+ 529 with backoff; fail open on everything else so the product keeps working.
197
+
198
+ ## Resources
199
+
200
+ - [Official Documentation](https://verified-skill.com/docs/reference/skills#jev)
201
+ - [TypeSafe docs index](https://docs.typesafe.ai/llms.txt)
@@ -1,7 +1,7 @@
1
1
  <!-- SECTION:header required -->
2
2
  # {PROJECT_NAME}
3
3
 
4
- SpecWeave project. Work happens in increments under `.specweave/increments/NNNN-slug/`. `spec.md` (Problem, ACs, Approach) is the source of truth; the ledger records who did what. This file is for Codex, OpenCode, Cursor, Gemini, Aider and humans; Claude Code reads CLAUDE.md (same content). Keep it under one page; project-specific notes go in **Project notes** at the bottom.
4
+ SpecWeave project. Small requests live in the intent board; scoped work lives in increments under `.specweave/increments/NNNN-slug/`. `spec.md` (Problem, ACs, Approach) is the source of truth; the ledger records who did what. This file is for Codex, OpenCode, Cursor, Gemini, Aider and humans; Claude Code reads CLAUDE.md (same content). Keep it under one page; project-specific notes go in **Project notes** at the bottom.
5
5
  <!-- /SECTION -->
6
6
 
7
7
  <!-- SECTION:structure -->
@@ -9,6 +9,7 @@ SpecWeave project. Work happens in increments under `.specweave/increments/NNNN-
9
9
 
10
10
  ```
11
11
  .specweave/
12
+ intents/board.jsonl append-only intent history (latest revision per id; planning state, not verification)
12
13
  increments/NNNN-slug/ spec.md (Problem · ACs · Approach) · tasks.md (tasks + rendered board) · ledger.jsonl (claims/done, CLI-written) · handoff.md · reports/ (evidence; binaries in reports/artifacts/, gitignored)
13
14
  docs/ ADRs and hand-written docs (read before changing architecture)
14
15
  config.json
@@ -23,7 +24,7 @@ Only those files (plus optional `plan.md` when Approach outgrows a page, and `sc
23
24
 
24
25
  | Step | Command (each step is also a standalone skill you can install into any tool with `npx vskill install anton-abyzov/specweave/sw-do` — same for `sw-increment`, `sw-review`, `sw-handoff`, `sw-task`) |
25
26
  |---|---|
26
- | Plan a feature: write `spec.md` (Problem, Scope, `AC-01…` checkboxes, Approach: files that change, order of work, risks, decisions), get approval before any code | `specweave create-increment "title"` |
27
+ | Plan a feature: write `spec.md` (Problem, Scope, `AC-01…` checkboxes, Approach: files that change, order of work, risks, decisions), resolve material scope questions before implementation | `specweave create-increment "title"` |
27
28
  | Work the tasks | `specweave task next` → `specweave task claim T-NN` → implement → commit (`NNNN: …`) → `specweave task done T-NN --run "<test cmd>"` (the command runs through your OS shell: cmd.exe on Windows, sh elsewhere) |
28
29
  | Verify the whole increment | `specweave verify` |
29
30
  | Review before closing (recommended for anything that ships) | in a fresh session: read spec.md, list findings by severity citing path:line, re-verify each before writing `reports/review.md`; the authoring session never approves its own work |
@@ -31,7 +32,7 @@ Only those files (plus optional `plan.md` when Approach outgrows a page, and `sc
31
32
  | Stop for any reason | `specweave handoff` |
32
33
 
33
34
  Without the `specweave` CLI: create the folder by hand (id = highest existing 4-digit prefix + 1, zero-padded); append one JSON line per event to `ledger.jsonl` as UTF-8 without BOM, LF-terminated, e.g. `{"t":"T-01","e":"claim","by":"<tool>@<host>","at":"<ISO>"}` (bash: `>>`; PowerShell: `[IO.File]::AppendAllText('ledger.jsonl', $line + "`n")`, never `>>`, it writes UTF-16); mark done with the same line using `"e":"done","evidence":"<commit sha>"` after the Test command exits 0; write `reports/verify.md` with the real test output and say the increment is ready to close (closing itself needs the CLI).
34
- Start every feature with an increment, even a small one, unless the user says "no increment". Fix a bug by writing the failing test first, then fixing the code without touching the test.
35
+ Use an increment for work that needs shared scope, acceptance criteria, or a handoff. Small self-contained fixes can remain a lightweight intent. For bugs, reproduce the failure and add a regression test when it protects behavior. User authorization carries through routine implementation and verification.
35
36
  <!-- /SECTION -->
36
37
 
37
38
  <!-- SECTION:verify required -->
@@ -48,8 +49,7 @@ Run the project's build/test/lint (see **Commands**) before reporting any task c
48
49
  3. Never edit ledger lines or another task's status; append only. On a git conflict in `ledger.jsonl` keep every line from both sides.
49
50
  4. `done` needs the task's **Test** command exit 0 and a commit sha. A task that turns out unnecessary is closed with `specweave task skip T-NN --reason "..."` (no CLI: append a `skip` ledger line with a reason), never ticked.
50
51
  5. When you stop: `specweave task release --all-mine` then `specweave handoff`.
51
-
52
- Resuming: find the active increment with `specweave status` (or the `NNNN-*` folder whose `metadata.json` has `"status": "active"`), read `spec.md`, then the latest `handoff.md`, then `specweave task next`.
52
+ Resuming: check `.specweave/intents/board.jsonl` (latest revision per id) or `specweave dashboard` for unfinished intents, including work without an increment. Then find the active increment with `specweave status` (or the `NNNN-*` folder whose `metadata.json` has `"status": "active"`), read `spec.md`, then the latest `handoff.md`, then `specweave task next`.
53
53
  <!-- /SECTION -->
54
54
 
55
55
  <!-- SECTION:conventions required -->
@@ -64,6 +64,28 @@ Resuming: find the active increment with `specweave status` (or the `NNNN-*` fol
64
64
  - Umbrella projects only: nested repos live under `repositories/<org>/<repo>/`; commit inside each nested repo, then the umbrella.
65
65
  <!-- /SECTION -->
66
66
 
67
+ <!-- SECTION:jev when="jev" -->
68
+ ## Jev (System One) — closed-set decisions
69
+
70
+ Jev answers questions whose every possible answer can be written down in advance: about 250 ms, about $0.00002, calibrated probabilities, no generation. Delegate the decision, then act on it yourself.
71
+
72
+ | Moment | Command |
73
+ |---|---|
74
+ | Before choosing a skill or a subagent model tier | `specweave jev route "<prompt>"` |
75
+ | Picking the tier for one task already in the ledger | `specweave jev task T-NN` — a suggestion you act on; nothing re-routes models behind you |
76
+ | Before an unattended risky shell command | `specweave jev guard "<command>"` — exit 0 allow, 2 warn, 3 deny |
77
+ | Pulled issue / PR / web text, a red test run | `specweave jev screen <file>` · `specweave jev failure <file>` |
78
+ | Any other closed set of your own | `specweave jev ask --state @state.json --questions @q.json` |
79
+ | Mechanical browser navigation (headless only) | `specweave jev browse --goal "<goal>" --url "<url>"` |
80
+ | Is it configured here, what has it cost | `specweave jev doctor` · `specweave jev usage` |
81
+
82
+ Exit 4 means Jev is unavailable — continue without it. Never send Jev code, prose, compaction, counting or date maths, another model's free-text output, or a question whose answers you cannot enumerate. Below `jev.thresholds.route` treat the answer as no answer.
83
+
84
+ Every call sends its state — prompt text, task titles and ACs, the shell command, test-output tails, screened text, page text and element names — to the configured provider under the user's own key; secret-shaped values are masked heuristically first, best-effort only.
85
+
86
+ The Bash guard is per project (`specweave jev setup --guard-bash` writes the config flag, the `.specweave/state/jev-guard.enabled` marker and a project-level `PreToolUse` hook; `--no-guard-bash` removes all three). A regex prefilter skips Jev for `npm test`, `npm run build|test|lint`, `pnpm/yarn test`, `cargo test`, `go test` and plain read commands, so project-defined scripts are trusted by the guard. A denied command is the user's to approve — stop and ask; do not reword it, wrap it or edit config around it.
87
+ <!-- /SECTION -->
88
+
67
89
  <!-- SECTION:troubleshooting -->
68
90
  ## Troubleshooting
69
91
 
@@ -1,7 +1,7 @@
1
1
  <!-- SECTION:header required -->
2
2
  # {PROJECT_NAME}
3
3
 
4
- SpecWeave project. Work happens in increments under `.specweave/increments/NNNN-slug/`. `spec.md` (Problem, ACs, Approach) is the source of truth; the ledger records who did what. Keep this file under one page; project-specific notes go in **Project notes** at the bottom.
4
+ SpecWeave project. Small requests live in the intent board; scoped work lives in increments under `.specweave/increments/NNNN-slug/`. `spec.md` (Problem, ACs, Approach) is the source of truth; the ledger records who did what. Keep this file under one page; project-specific notes go in **Project notes** at the bottom.
5
5
  <!-- /SECTION -->
6
6
 
7
7
  <!-- SECTION:structure -->
@@ -9,6 +9,7 @@ SpecWeave project. Work happens in increments under `.specweave/increments/NNNN-
9
9
 
10
10
  ```
11
11
  .specweave/
12
+ intents/board.jsonl append-only intent history (latest revision per id; planning state, not verification)
12
13
  increments/NNNN-slug/ spec.md (Problem · ACs · Approach) · tasks.md (tasks + rendered board) · ledger.jsonl (claims/done, CLI-written) · handoff.md · reports/ (evidence; binaries in reports/artifacts/, gitignored)
13
14
  docs/ ADRs and hand-written docs (read before changing architecture)
14
15
  config.json
@@ -23,14 +24,14 @@ Only those files (plus optional `plan.md` when Approach outgrows a page, and `sc
23
24
 
24
25
  | Step | Command |
25
26
  |---|---|
26
- | Plan a feature (spec.md with ACs + Approach, in plan mode; approved before any code) | `/sw:increment "title"` |
27
+ | Plan a feature (spec.md with ACs + Approach; resolve material scope questions) | `/sw:increment "title"` |
27
28
  | Work the tasks (claim → implement → commit → done with evidence) | `/sw:do` (loops `specweave task next` / `claim` / `done --run`) |
28
29
  | Verify the whole increment | `specweave verify` |
29
30
  | Review before closing (recommended for anything that ships: fresh context, findings cite path:line and are re-verified) | `/sw:review` |
30
31
  | Close (needs a green verify or `--reason`) | `/sw:done` |
31
32
  | Stop for any reason (context, tokens, switching tools) | `/sw:handoff` |
32
33
 
33
- Start every feature with the increment, even a small one, unless the user says "no increment". Fix a bug by writing the failing test first, then fixing the code without touching the test.
34
+ Use an increment for work that needs shared scope, acceptance criteria, or a handoff. Small self-contained fixes can remain a lightweight intent. For bugs, reproduce the failure and add a regression test when it protects behavior. User authorization carries through routine implementation and verification.
34
35
  <!-- /SECTION -->
35
36
 
36
37
  <!-- SECTION:verify required -->
@@ -47,8 +48,7 @@ Run the project's build/test/lint (see **Commands**) before reporting any task c
47
48
  3. Never edit ledger lines or another task's status; append only. On a git conflict in `ledger.jsonl` keep every line from both sides.
48
49
  4. `done` needs the task's **Test** command exit 0 and a commit sha. A task that turns out unnecessary is closed with `specweave task skip T-NN --reason "..."`, never ticked.
49
50
  5. When you stop: `specweave task release --all-mine` then `/sw:handoff`.
50
-
51
- Resuming: find the active increment with `specweave status` (or the `NNNN-*` folder whose `metadata.json` has `"status": "active"`), read `spec.md`, then the latest `handoff.md`, then `/sw:do`.
51
+ Resuming: check `.specweave/intents/board.jsonl` (latest revision per id) or `specweave dashboard` for unfinished intents, including work without an increment. Then find the active increment with `specweave status` (or the `NNNN-*` folder whose `metadata.json` has `"status": "active"`), read `spec.md`, then the latest `handoff.md`, then `/sw:do`.
52
52
  <!-- /SECTION -->
53
53
 
54
54
  <!-- SECTION:conventions required -->
@@ -63,6 +63,28 @@ Resuming: find the active increment with `specweave status` (or the `NNNN-*` fol
63
63
  - Umbrella projects only: nested repos live under `repositories/<org>/<repo>/`; commit inside each nested repo, then the umbrella.
64
64
  <!-- /SECTION -->
65
65
 
66
+ <!-- SECTION:jev when="jev" -->
67
+ ## Jev (System One) — closed-set decisions
68
+
69
+ Jev answers questions whose every possible answer can be written down in advance: about 250 ms, about $0.00002, calibrated probabilities, no generation. Delegate the decision, then act on it yourself.
70
+
71
+ | Moment | Command |
72
+ |---|---|
73
+ | Before choosing a skill or a subagent model tier | `specweave jev route "<prompt>"` |
74
+ | Picking the tier for one task already in the ledger | `specweave jev task T-NN` — a suggestion you act on; nothing re-routes models behind you |
75
+ | Before an unattended risky shell command | `specweave jev guard "<command>"` — exit 0 allow, 2 warn, 3 deny |
76
+ | Pulled issue / PR / web text, a red test run | `specweave jev screen <file>` · `specweave jev failure <file>` |
77
+ | Any other closed set of your own | `specweave jev ask --state @state.json --questions @q.json` |
78
+ | Mechanical browser navigation (headless only) | `specweave jev browse --goal "<goal>" --url "<url>"` |
79
+ | Is it configured here, what has it cost | `specweave jev doctor` · `specweave jev usage` |
80
+
81
+ Exit 4 means Jev is unavailable — continue without it. Never send Jev code, prose, compaction, counting or date maths, another model's free-text output, or a question whose answers you cannot enumerate. Below `jev.thresholds.route` treat the answer as no answer.
82
+
83
+ Every call sends its state — prompt text, task titles and ACs, the shell command, test-output tails, screened text, page text and element names — to the configured provider under the user's own key; secret-shaped values are masked heuristically first, best-effort only.
84
+
85
+ The Bash guard is per project (`specweave jev setup --guard-bash` writes the config flag, the `.specweave/state/jev-guard.enabled` marker and a project-level `PreToolUse` hook; `--no-guard-bash` removes all three). A regex prefilter skips Jev for `npm test`, `npm run build|test|lint`, `pnpm/yarn test`, `cargo test`, `go test` and plain read commands, so project-defined scripts are trusted by the guard. A denied command is the user's to approve — stop and ask; do not reword it, wrap it or edit config around it.
86
+ <!-- /SECTION -->
87
+
66
88
  <!-- SECTION:troubleshooting -->
67
89
  ## Troubleshooting
68
90