create-harness-vibe-coding 0.8.16 → 0.8.18

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 (70) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/README-CN.md +100 -127
  3. package/README.md +63 -42
  4. package/package.json +1 -1
  5. package/src/generator.js +628 -121
  6. package/src/index.js +174 -43
  7. package/src/prompts.js +18 -0
  8. package/templates/common/.claude/commands/wf-auto-spark.md +16 -0
  9. package/templates/common/.claude/commands/wf-auto.md +16 -0
  10. package/templates/{optional/skills/browser-e2e/.opencode → common/.claude}/commands/wf-browser.md +1 -1
  11. package/templates/common/.claude/commands/wf-command-create.md +58 -0
  12. package/templates/common/.claude/commands/wf-help.md +13 -6
  13. package/templates/common/.claude/commands/wf-learn.md +16 -0
  14. package/templates/common/.claude/commands/wf-max.md +20 -0
  15. package/templates/common/.claude/commands/wf-readme.md +16 -0
  16. package/templates/common/.claude/commands/wf-remove.md +16 -0
  17. package/templates/common/.claude/commands/wf-review.md +16 -0
  18. package/templates/common/.claude/commands/wf-task-archive.md +26 -0
  19. package/templates/common/.claude/commands/wf-task-list.md +24 -0
  20. package/templates/common/.claude/commands/wf-task-record.md +24 -0
  21. package/templates/common/.claude/commands/wf.md +16 -0
  22. package/templates/common/.claude/rules/ecc/common.md +1 -1
  23. package/templates/common/.claude/skills/wf-agents-docs/SKILL.md +15 -30
  24. package/templates/common/.claude/skills/wf-browser/SKILL.md +176 -0
  25. package/templates/common/.claude/skills/wf-command-create/SKILL.md +37 -0
  26. package/templates/common/.claude/skills/wf-help/SKILL.md +30 -0
  27. package/templates/common/.claude/skills/wf-max/SKILL.md +22 -8
  28. package/templates/common/.claude/skills/wf-review/SKILL.md +29 -2
  29. package/templates/common/.claude/skills/wf-task-archive/SKILL.md +28 -0
  30. package/templates/common/.claude/skills/wf-task-list/SKILL.md +28 -0
  31. package/templates/common/.claude/skills/wf-task-record/SKILL.md +28 -0
  32. package/templates/common/.codex/config.toml +3 -5
  33. package/templates/common/.harness-version +108 -41
  34. package/templates/common/.opencode/agents/architect-manager.md +7 -1
  35. package/templates/common/.opencode/agents/explore-manager.md +10 -1
  36. package/templates/common/.opencode/agents/implement-manager.md +5 -3
  37. package/templates/common/.opencode/agents/review-manager.md +5 -2
  38. package/templates/common/.opencode/commands/wf-browser.md +16 -0
  39. package/templates/common/.opencode/commands/wf-command-create.md +61 -0
  40. package/templates/common/.opencode/commands/wf-help.md +13 -6
  41. package/templates/common/.opencode/commands/wf-max.md +12 -7
  42. package/templates/common/.opencode/commands/wf-task-archive.md +29 -0
  43. package/templates/common/.opencode/commands/wf-task-list.md +27 -0
  44. package/templates/common/.opencode/commands/wf-task-record.md +27 -0
  45. package/templates/common/CLAUDE.md +9 -7
  46. package/templates/common/Harness/MEMORY.md +12 -3
  47. package/templates/common/Harness/README.md +23 -41
  48. package/templates/common/Harness/ownership.manifest.json +162 -14
  49. package/templates/common/Harness/scripts/archive-tasks.mjs +12 -220
  50. package/templates/common/Harness/scripts/scan-clean.mjs +3 -9
  51. package/templates/common/Harness/scripts/task-state.mjs +1279 -0
  52. package/templates/common/Harness/scripts/validate-harness.mjs +635 -65
  53. package/templates/common/Harness/scripts/wf-remove.mjs +37 -5
  54. package/templates/common/Harness/scripts/wf-update-check.mjs +3 -0
  55. package/templates/common/Harness/specs/guides/SETUP.md +10 -2
  56. package/templates/common/Harness/specs/protocols/MEMORY_PROTOCOL.md +15 -0
  57. package/templates/common/Harness/specs/protocols/TASK_ARCHIVE.md +49 -23
  58. package/templates/common/Harness/specs/runtime/command-surface.json +215 -0
  59. package/templates/common/Harness/specs/runtime/dispatch.md +2 -2
  60. package/templates/common/Harness/specs/runtime/subagents.md +15 -5
  61. package/templates/common/Harness/specs/workflows/WF-AUTO.md +6 -6
  62. package/templates/common/Harness/specs/workflows/WF-KERNEL.md +1 -1
  63. package/templates/common/Harness/specs/workflows/WF-MAX.md +35 -2
  64. package/templates/common/Harness/specs/workflows/WF-STATE.md +155 -36
  65. package/templates/common/Harness/tasks/_template/STATE.json +6 -0
  66. package/templates/common/opencode.json +1 -0
  67. package/templates/optional/catalog.json +2 -9
  68. package/templates/optional/skills/browser-e2e/.claude/skills/browser-e2e/SKILL.md +0 -42
  69. package/templates/optional/skills/browser-e2e/.claude/skills/wf-browser/SKILL.md +0 -201
  70. package/templates/optional/skills/browser-e2e/Harness/workflows/browser-e2e.md +0 -119
@@ -130,7 +130,6 @@ const BUILT_IN_AGENT_NAMES = [
130
130
  ];
131
131
 
132
132
  const BUILT_IN_SKILL_NAMES = [
133
- 'browser-e2e',
134
133
  'github-pr-review',
135
134
  'python-backend',
136
135
  'subagent-orchestrator',
@@ -142,11 +141,34 @@ const BUILT_IN_SKILL_NAMES = [
142
141
  'wf-auto',
143
142
  'wf-auto-spark',
144
143
  'wf-browser',
144
+ 'wf-command-create',
145
+ 'wf-help',
145
146
  'wf-learn',
146
147
  'wf-max',
147
148
  'wf-readme',
148
149
  'wf-remove',
149
150
  'wf-review',
151
+ 'wf-task-archive',
152
+ 'wf-task-list',
153
+ 'wf-task-record',
154
+ 'wf-update',
155
+ ];
156
+
157
+ const BUILT_IN_COMMAND_NAMES = [
158
+ 'wf',
159
+ 'wf-auto',
160
+ 'wf-auto-spark',
161
+ 'wf-browser',
162
+ 'wf-command-create',
163
+ 'wf-help',
164
+ 'wf-learn',
165
+ 'wf-max',
166
+ 'wf-readme',
167
+ 'wf-remove',
168
+ 'wf-review',
169
+ 'wf-task-archive',
170
+ 'wf-task-list',
171
+ 'wf-task-record',
150
172
  'wf-update',
151
173
  ];
152
174
 
@@ -159,8 +181,10 @@ const KNOWN_FRAMEWORK_FILES = new Set([
159
181
  `.claude/skills/${name}/SKILL.md`,
160
182
  `.agents/skills/${name}/SKILL.md`,
161
183
  ]),
162
- '.claude/commands/wf-help.md',
163
- '.opencode/commands/wf-help.md',
184
+ ...BUILT_IN_COMMAND_NAMES.flatMap(name => [
185
+ `.claude/commands/${name}.md`,
186
+ `.opencode/commands/${name}.md`,
187
+ ]),
164
188
  '.claude/rules/ecc/common.md',
165
189
  'opencode.json',
166
190
  ]);
@@ -172,12 +196,13 @@ function isKnownFrameworkFile(file) {
172
196
  /** Directories to clean up if empty after file removal. */
173
197
  const CLEANUP_DIRS = [
174
198
  '.claude/agents',
175
- '.claude/skills/browser-e2e',
176
199
  '.claude/skills/github-pr-review',
177
200
  '.claude/skills/python-backend',
178
201
  '.claude/skills/wf-auto',
179
202
  '.claude/skills/wf-auto-spark',
180
203
  '.claude/skills/wf-browser',
204
+ '.claude/skills/wf-command-create',
205
+ '.claude/skills/wf-help',
181
206
  '.claude/skills/tdd',
182
207
  '.claude/skills/ts-react-frontend',
183
208
  '.claude/skills/ui-ux-review',
@@ -187,16 +212,20 @@ const CLEANUP_DIRS = [
187
212
  '.claude/skills/wf-max',
188
213
  '.claude/skills/wf-readme',
189
214
  '.claude/skills/wf-review',
215
+ '.claude/skills/wf-task-archive',
216
+ '.claude/skills/wf-task-list',
217
+ '.claude/skills/wf-task-record',
190
218
  '.claude/skills/wf-update',
191
219
  '.claude/skills/wf-remove',
192
220
  '.claude/skills/subagent-orchestrator',
193
221
  '.claude/skills',
194
- '.agents/skills/browser-e2e',
195
222
  '.agents/skills/github-pr-review',
196
223
  '.agents/skills/python-backend',
197
224
  '.agents/skills/wf-auto',
198
225
  '.agents/skills/wf-auto-spark',
199
226
  '.agents/skills/wf-browser',
227
+ '.agents/skills/wf-command-create',
228
+ '.agents/skills/wf-help',
200
229
  '.agents/skills/tdd',
201
230
  '.agents/skills/ts-react-frontend',
202
231
  '.agents/skills/ui-ux-review',
@@ -206,6 +235,9 @@ const CLEANUP_DIRS = [
206
235
  '.agents/skills/wf-max',
207
236
  '.agents/skills/wf-readme',
208
237
  '.agents/skills/wf-review',
238
+ '.agents/skills/wf-task-archive',
239
+ '.agents/skills/wf-task-list',
240
+ '.agents/skills/wf-task-record',
209
241
  '.agents/skills/wf-update',
210
242
  '.agents/skills/wf-remove',
211
243
  '.agents/skills/subagent-orchestrator',
@@ -149,8 +149,11 @@ function optionalSkillFromSource(source) {
149
149
  return match ? match[1] : null;
150
150
  }
151
151
 
152
+ const RETIRED_OPTION_IDS = new Set(['browser-e2e']);
153
+
152
154
  function isInstalledOptionalFile(file, localVersion) {
153
155
  const skillId = optionalSkillFromSource(localVersion?.sources?.[file]);
156
+ if (skillId && RETIRED_OPTION_IDS.has(skillId)) return false;
154
157
  return Boolean(skillId && selectedOptionIds(localVersion).has(skillId));
155
158
  }
156
159
 
@@ -55,6 +55,14 @@ Claude or Codex must follow this order during bootstrap. This sequence is broade
55
55
 
56
56
  Before writing, identify the project state:
57
57
 
58
+ Choose the install scope before scaffold writes:
59
+
60
+ - `--install-scope project` (default): full Harness scaffold is project-local.
61
+ - `--install-scope global`: write shared runtime assets to the selected global Harness directory and copy Claude Code, Codex, and OpenCode command/skill surfaces to host-global directories while keeping `Harness/tasks/`, `Harness/PROGRESS.md`, project memory, research, architecture, and project settings under the target project.
62
+ - Use `--global-dir <dir>` when the global runtime location must be explicit.
63
+ - Use `--host-global-dir <dir>` only when the host-global copy base must be explicit; the installer creates `claude/`, `codex/`, and `opencode/` subdirectories under it.
64
+ - Project settings in `Harness/settings.json` override global settings defaults. Existing user-authored files at config, command, skill, or agent paths are preserved or surfaced for review unless they carry a Harness ownership marker.
65
+
58
66
  | Project state | Required action |
59
67
  | --- | --- |
60
68
  | Empty or new project | Run the scaffold, then follow this file for 0-1 bootstrap |
@@ -152,7 +160,7 @@ The harness validator checks for specific structural invariants. When comparing
152
160
  | `Harness/tasks/<id>/PROGRESS.md` | `## Current Goal`, `## Phase`, `## Heartbeat`, `## Loaded Context` headings |
153
161
  | `Harness/tasks/<id>/PLAN.md` | `## Tasks`, `## Parallel Dispatch`, `## Subagent Synthesis`, `## Verification` headings |
154
162
  | `Harness/specs/guides/SETUP.md` | Retained install/bootstrap guide for new projects, existing projects, legacy upgrades, and Harness update decisions. Keep "Install or Upgrade Path" present. |
155
- | `Harness/workflows/browser-e2e.md` (if installed as optional) | `data-testid`, `accessible labels/roles`, and `inputs, buttons, filters, rows, empty/error/loading states` requirement |
163
+ | `.claude/skills/wf-browser/SKILL.md` and `.agents/skills/wf-browser/SKILL.md` | Built-in browser workflow requires `data-testid`, `accessible labels/roles`, and `inputs, buttons, filters, rows, empty/error/loading states` guidance |
156
164
  | `Harness/workflows/ts-react-frontend.md` (if installed as optional) | Same UI selector contract as above |
157
165
 
158
166
  **Files that do NOT need manual merge when the path does not already exist (auto-created by harness):**
@@ -172,7 +180,7 @@ The generated file list is authoritative by path, not by stale count labels. Cur
172
180
  Optional workflow examples:
173
181
 
174
182
  ```bash
175
- npx create-harness-vibe-coding@latest my-app ./my-app -y --with browser-e2e,ts-react-frontend
183
+ npx create-harness-vibe-coding@latest my-app ./my-app -y --with ts-react-frontend,ui-ux-review
176
184
  npx create-harness-vibe-coding@latest my-app ./my-app -y --preset web-app
177
185
  npx create-harness-vibe-coding@latest my-app ./my-app -y --recommend superpowers,codegraph
178
186
  ```
@@ -10,6 +10,21 @@ Memory is downstream of evidence. It records reusable patterns, not raw transcri
10
10
  - **L2 = Startup Digest**: `Harness/memory/startup-hints.md`. Lightweight hints loaded at session start. Not a replacement for full router.
11
11
  - **L3 = Detailed Durable Memory**: `Harness/memory/*.md` files. Loaded only when scenario matches via `routes.md`.
12
12
 
13
+ ## Project/Global Memory Boundary
14
+
15
+ - `Harness/tasks/` and `Harness/PROGRESS.md` are always project-local, even when the Harness runtime is installed globally.
16
+ - Project memory lives in `Harness/memory/` and records repo-specific lessons, preferences, and tool patterns.
17
+ - Global memory may live under the selected global Harness directory for cross-project lessons and preferences.
18
+ - Global memory must never store project task state, secrets, raw transcripts, or private project facts.
19
+
20
+ ## Project/Global Settings Boundary
21
+
22
+ - Project settings live in `Harness/settings.json` and override global settings.
23
+ - Global settings defaults live in the selected global Harness runtime under `Harness/settings.json`.
24
+ - Host-global settings are copied, not symlinked, into Claude Code, Codex, and OpenCode user config directories.
25
+ - Settings and memory must never store secrets; use external secret stores or environment variables.
26
+ - Existing user-authored config, command, skill, or agent files are user-owned unless they carry a Harness ownership marker.
27
+
13
28
  ## When To Write Memory
14
29
 
15
30
  Write memory when any condition applies:
@@ -1,6 +1,7 @@
1
- # TASK_ARCHIVE Task Archive Mechanism
1
+ # TASK_ARCHIVE - Task Archive Mechanism
2
2
 
3
- Purpose: keep `Harness/tasks/` lean by archiving completed/abandoned tasks while preserving all evidence.
3
+ Purpose: keep `Harness/tasks/` lean by archiving completed/abandoned tasks while
4
+ preserving all evidence.
4
5
 
5
6
  ## Archive Location
6
7
 
@@ -9,44 +10,68 @@ Archived tasks move to `Harness/tasks/_archive/YYYY/<task-id>/`.
9
10
 
10
11
  ## What Is Never Archived
11
12
 
12
- - `Harness/tasks/_template/` scaffold template, never moved.
13
- - `Harness/tasks/auto/` WF-AUTO permanent state capsule, never moved unless explicitly allowed by WF-AUTO docs.
14
- - `Harness/tasks/_archive/` the archive directory itself.
15
- - Active, blocked, in-progress, or needs-user-decision tasks.
16
- - Tasks whose STATE.json status is `active`, `blocked`, `in_progress`, `running`, `pending`, or `needs-user-decision`.
13
+ - `Harness/tasks/_template/` - scaffold template, never moved.
14
+ - `Harness/tasks/auto/` - WF-AUTO permanent state capsule, never moved unless
15
+ explicitly allowed by WF-AUTO docs.
16
+ - `Harness/tasks/_archive/` - the archive directory itself.
17
+ - Active, blocked, in-progress, running, pending, or needs-user-decision tasks.
18
+ - Tasks whose STATE.json status is `active`, `blocked`, `in_progress`,
19
+ `running`, `pending`, or `needs-user-decision`.
17
20
 
18
21
  ## What May Be Archived
19
22
 
20
- Tasks whose STATE.json or PROGRESS.md status is: `complete`, `verified`, `archived`, `abandoned`, `obsolete`, `done`, `closed`, or `closeout`.
23
+ Tasks whose STATE.json or reconciled phase is: `complete`, `verified`,
24
+ `archived`, `abandoned`, `obsolete`, `done`, `closed`, or `closeout`.
21
25
 
22
- The script reads STATE.json `status`/`phase` first, then falls back to the first `- Phase:`, `Phase:`, or `Current:` marker in the task's PROGRESS.md (first word wins). Ambiguous phases are never auto-archived.
26
+ `Harness/scripts/task-state.mjs` reads STATE.json `status`/`phase` first, then
27
+ uses root/task PROGRESS phases only as reconciliation evidence. Missing or
28
+ invalid STATE.json is skipped until
29
+ `node Harness/scripts/task-state.mjs reconcile --apply` creates or repairs
30
+ machine state.
23
31
 
24
32
  ## Archive Process
25
33
 
26
- 1. Verify the task is not active/blocked.
34
+ 1. Verify the task is not active/blocked/running/pending.
27
35
  2. Ensure `Harness/tasks/_archive/YYYY/` exists.
28
- 3. Move `Harness/tasks/<task-id>/` → `Harness/tasks/_archive/YYYY/<task-id>/`.
29
- 4. Update the moved STATE.json: `status` → `archived`, `phase` → `archived`.
36
+ 3. Move `Harness/tasks/<task-id>/` to
37
+ `Harness/tasks/_archive/YYYY/<task-id>/`.
38
+ 4. Update the moved STATE.json: `status` to `archived`, `phase` to `archived`.
30
39
  5. Update `Harness/tasks/_archive/INDEX.md`.
31
- 6. Update `Harness/PROGRESS.md` Task Index remove or annotate `(archived)`.
40
+ 6. Rewrite `Harness/PROGRESS.md` Task Index from the remaining non-archived
41
+ task capsules.
32
42
 
33
43
  ## Retention
34
44
 
35
45
  - Archived tasks retain: PLAN, PROGRESS, STATE, ARTIFACTS, NOTES.
36
46
  - Do NOT delete historical evidence.
37
- - `Harness/PROGRESS.md` keeps the last 5 non-archived task entries in the Task Index.
38
- - When outer task capsules exceed 5 completed/abandoned/obsolete, archive the oldest.
39
- - The validator (`Harness/scripts/validate-harness.mjs`) warns when `Harness/tasks/` holds more than 5 outer task capsules (excluding `_archive`, `_template`, `auto`) and fails in `--strict` mode.
47
+ - `Harness/PROGRESS.md` keeps the last 5 non-archived task entries in the Task
48
+ Index.
49
+ - When outer task capsules exceed 5 completed/abandoned/obsolete tasks, remind
50
+ the user to run the task archive command. Do not auto-archive during unrelated
51
+ validation or closeout unless the user explicitly invokes archive apply mode.
52
+ - The validator (`Harness/scripts/validate-harness.mjs`) warns when
53
+ `Harness/tasks/` holds more than 5 outer task capsules (excluding `_archive`,
54
+ `_template`, `auto`) and fails in `--strict` mode.
40
55
 
41
56
  ## Script
42
57
 
43
- Use `Harness/scripts/archive-tasks.mjs`:
44
- - Default: dry-run
45
- - `--apply` to execute
46
- - `--keep 5` to set the non-archived task threshold
47
- - `--task <task-id>` to archive a specific task
48
- - `--json` for machine-readable output
49
- - `node Harness/scripts/archive-tasks.mjs --dry-run --json` must always run
58
+ User-facing command:
59
+
60
+ - Codex: `$wf-task-archive` or `/skills wf-task-archive`.
61
+ - Claude Code/OpenCode: `/wf-task-archive`.
62
+
63
+ Underlying implementation: `Harness/scripts/task-state.mjs archive`.
64
+
65
+ - Default: dry-run.
66
+ - `--apply` to execute.
67
+ - `--keep 5` to set the non-archived task threshold.
68
+ - `--task <task-id>` to archive a specific task.
69
+ - `--json` for machine-readable output.
70
+ - Run `node Harness/scripts/task-state.mjs archive --dry-run --json` before
71
+ applying a risky cleanup.
72
+
73
+ Compatibility entry: `Harness/scripts/archive-tasks.mjs` delegates to
74
+ `task-state.mjs archive` and accepts the same archive flags.
50
75
 
51
76
  ## Safety Rules
52
77
 
@@ -54,3 +79,4 @@ Use `Harness/scripts/archive-tasks.mjs`:
54
79
  - Confirm target is within `Harness/tasks/` before any move.
55
80
  - Do NOT recursively delete.
56
81
  - Tasks with `needs-user-decision` status are never auto-archived.
82
+ - Missing or invalid STATE.json is never archived without reconciliation.
@@ -0,0 +1,215 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "commands": [
4
+ {
5
+ "id": "wf-help",
6
+ "classification": "direct",
7
+ "aliases": ["/wf-help", "$wf-help", "/skills wf-help"],
8
+ "entersWf": false,
9
+ "taskCapsulePolicy": "none",
10
+ "surfaces": {
11
+ "claudeCommand": true,
12
+ "opencodeCommand": true,
13
+ "claudeSkill": true,
14
+ "codexSkill": true,
15
+ "helpRow": true
16
+ }
17
+ },
18
+ {
19
+ "id": "wf",
20
+ "classification": "workflow",
21
+ "aliases": ["/wf", "$wf", "/skills wf"],
22
+ "entersWf": true,
23
+ "taskCapsulePolicy": "required",
24
+ "surfaces": {
25
+ "claudeCommand": true,
26
+ "opencodeCommand": true,
27
+ "claudeSkill": true,
28
+ "codexSkill": true,
29
+ "helpRow": true
30
+ }
31
+ },
32
+ {
33
+ "id": "wf-max",
34
+ "classification": "workflow",
35
+ "aliases": ["/wf-max", "$wf-max", "/skills wf-max"],
36
+ "entersWf": true,
37
+ "taskCapsulePolicy": "required",
38
+ "surfaces": {
39
+ "claudeCommand": true,
40
+ "opencodeCommand": true,
41
+ "claudeSkill": true,
42
+ "codexSkill": true,
43
+ "helpRow": true
44
+ }
45
+ },
46
+ {
47
+ "id": "wf-auto",
48
+ "classification": "workflow",
49
+ "aliases": ["/wf-auto", "$wf-auto", "/skills wf-auto"],
50
+ "entersWf": true,
51
+ "taskCapsulePolicy": "auto-capsule-required",
52
+ "surfaces": {
53
+ "claudeCommand": true,
54
+ "opencodeCommand": true,
55
+ "claudeSkill": true,
56
+ "codexSkill": true,
57
+ "helpRow": true
58
+ }
59
+ },
60
+ {
61
+ "id": "wf-auto-spark",
62
+ "classification": "workflow",
63
+ "aliases": ["/wf-auto-spark", "$wf-auto-spark", "/skills wf-auto-spark"],
64
+ "entersWf": true,
65
+ "taskCapsulePolicy": "auto-capsule-required",
66
+ "surfaces": {
67
+ "claudeCommand": true,
68
+ "opencodeCommand": true,
69
+ "claudeSkill": true,
70
+ "codexSkill": true,
71
+ "helpRow": true
72
+ }
73
+ },
74
+ {
75
+ "id": "wf-review",
76
+ "classification": "workflow",
77
+ "aliases": ["/wf-review", "$wf-review", "/skills wf-review"],
78
+ "entersWf": true,
79
+ "taskCapsulePolicy": "use-current-or-create-when-needed",
80
+ "surfaces": {
81
+ "claudeCommand": true,
82
+ "opencodeCommand": true,
83
+ "claudeSkill": true,
84
+ "codexSkill": true,
85
+ "helpRow": true
86
+ }
87
+ },
88
+ {
89
+ "id": "wf-learn",
90
+ "classification": "workflow",
91
+ "aliases": ["/wf-learn", "$wf-learn", "/skills wf-learn"],
92
+ "entersWf": true,
93
+ "taskCapsulePolicy": "use-current-or-create-when-needed",
94
+ "surfaces": {
95
+ "claudeCommand": true,
96
+ "opencodeCommand": true,
97
+ "claudeSkill": true,
98
+ "codexSkill": true,
99
+ "helpRow": true
100
+ }
101
+ },
102
+ {
103
+ "id": "wf-browser",
104
+ "classification": "workflow",
105
+ "aliases": ["/wf-browser", "$wf-browser", "/skills wf-browser"],
106
+ "entersWf": true,
107
+ "taskCapsulePolicy": "required",
108
+ "surfaces": {
109
+ "claudeCommand": true,
110
+ "opencodeCommand": true,
111
+ "claudeSkill": true,
112
+ "codexSkill": true,
113
+ "helpRow": true
114
+ }
115
+ },
116
+ {
117
+ "id": "wf-readme",
118
+ "classification": "workflow",
119
+ "aliases": ["/wf-readme", "$wf-readme", "/skills wf-readme"],
120
+ "entersWf": true,
121
+ "taskCapsulePolicy": "required",
122
+ "surfaces": {
123
+ "claudeCommand": true,
124
+ "opencodeCommand": true,
125
+ "claudeSkill": true,
126
+ "codexSkill": true,
127
+ "helpRow": true
128
+ }
129
+ },
130
+ {
131
+ "id": "wf-update",
132
+ "classification": "direct",
133
+ "aliases": ["/wf-update", "$wf-update", "/skills wf-update"],
134
+ "entersWf": false,
135
+ "taskCapsulePolicy": "none",
136
+ "surfaces": {
137
+ "claudeCommand": true,
138
+ "opencodeCommand": true,
139
+ "claudeSkill": true,
140
+ "codexSkill": true,
141
+ "helpRow": true
142
+ }
143
+ },
144
+ {
145
+ "id": "wf-remove",
146
+ "classification": "workflow",
147
+ "aliases": ["/wf-remove", "$wf-remove", "/skills wf-remove"],
148
+ "entersWf": true,
149
+ "taskCapsulePolicy": "required",
150
+ "surfaces": {
151
+ "claudeCommand": true,
152
+ "opencodeCommand": true,
153
+ "claudeSkill": true,
154
+ "codexSkill": true,
155
+ "helpRow": true
156
+ }
157
+ },
158
+ {
159
+ "id": "wf-task-record",
160
+ "classification": "direct",
161
+ "aliases": ["/wf-task-record", "$wf-task-record", "/skills wf-task-record"],
162
+ "entersWf": false,
163
+ "taskCapsulePolicy": "creates-or-updates",
164
+ "surfaces": {
165
+ "claudeCommand": true,
166
+ "opencodeCommand": true,
167
+ "claudeSkill": true,
168
+ "codexSkill": true,
169
+ "helpRow": true
170
+ }
171
+ },
172
+ {
173
+ "id": "wf-task-list",
174
+ "classification": "direct",
175
+ "aliases": ["/wf-task-list", "$wf-task-list", "/skills wf-task-list"],
176
+ "entersWf": false,
177
+ "taskCapsulePolicy": "none",
178
+ "surfaces": {
179
+ "claudeCommand": true,
180
+ "opencodeCommand": true,
181
+ "claudeSkill": true,
182
+ "codexSkill": true,
183
+ "helpRow": true
184
+ }
185
+ },
186
+ {
187
+ "id": "wf-task-archive",
188
+ "classification": "direct",
189
+ "aliases": ["/wf-task-archive", "$wf-task-archive", "/skills wf-task-archive"],
190
+ "entersWf": false,
191
+ "taskCapsulePolicy": "none",
192
+ "surfaces": {
193
+ "claudeCommand": true,
194
+ "opencodeCommand": true,
195
+ "claudeSkill": true,
196
+ "codexSkill": true,
197
+ "helpRow": true
198
+ }
199
+ },
200
+ {
201
+ "id": "wf-command-create",
202
+ "classification": "direct",
203
+ "aliases": ["/wf-command-create", "$wf-command-create", "/skills wf-command-create"],
204
+ "entersWf": false,
205
+ "taskCapsulePolicy": "required",
206
+ "surfaces": {
207
+ "claudeCommand": true,
208
+ "opencodeCommand": true,
209
+ "claudeSkill": true,
210
+ "codexSkill": true,
211
+ "helpRow": true
212
+ }
213
+ }
214
+ ]
215
+ }
@@ -13,7 +13,7 @@ Use when work needs parallel reading, independent review, cross-layer analysis,
13
13
  - Important assumptions, decisions, blockers, evidence, and handoffs must be written to `Harness/tasks/<task-id>/PROGRESS.md` and `Harness/tasks/<task-id>/PLAN.md`, the current feature doc, `Harness/MEMORY.md`, or `Harness/memory/*` as appropriate.
14
14
  - Resumable state is governed by [WF-STATE.md](../workflows/WF-STATE.md). On session start, the controller reads STATE.json before building a fresh dispatch table.
15
15
  - PRD-derived Acceptance Criteria are the source of truth. Dispatch packets must carry the relevant AC IDs and contracts.
16
- - Agent count: default (non-WF) <=3 active agents; `/wf` selects a tier dynamically per [WF-KERNEL.md](../workflows/WF-KERNEL.md) (Light/Standard/Full); `/wf-max` inherits the selected tier and adds maximum safe fan-out (WF-Max-Useful default; WF-Max-Strict explicit only), removing the Harness default cap through the span formula. Real concurrency is still bounded by runtime thread budget, config, billing, and local resources. Use current runtime subagents first, close completed agents, then peer-CLI overflow (`claude -p`, `codex exec`, or `opencode run --agent <role> --dir .`). Generated Codex config defaults to `agents.max_threads = 12` and `agents.max_depth = 1`; ask the user before raising `agents.max_threads` above that default. See [WF.md](../workflows/WF.md) and [WF-MAX.md](../workflows/WF-MAX.md).
16
+ - Agent count: default (non-WF) <=3 active agents; `/wf` selects a tier dynamically per [WF-KERNEL.md](../workflows/WF-KERNEL.md) (Light/Standard/Full); `/wf-max` inherits the selected tier and adds maximum safe fan-out (WF-Max-Useful default; WF-Max-Strict explicit only), removing the Harness default cap through the span formula. WF-MAX must attempt native subagent fan-out and record `fanoutAttempted: true` before any solo fallback. Real concurrency is still bounded by runtime thread budget, config, billing, and local resources. Use current runtime subagents first, close completed agents, then peer-CLI overflow (`claude -p`, `codex exec`, or `opencode run --agent <role> --dir .`). Do not scaffold Codex scalar `[agents]` capacity fields into project `.codex/config.toml`; probe the installed runtime and manage Codex caps through the dispatch ledger unless the installed version accepts the config shape. Generated OpenCode config defaults to `subagent_depth = 2` for manager -> worker nesting. See [WF.md](../workflows/WF.md) and [WF-MAX.md](../workflows/WF-MAX.md).
17
17
  - Read-only agents may run in parallel.
18
18
  - Writing agents run serially unless write sets are disjoint.
19
19
  - Use a worktree when two agents may touch overlapping files or long-running branches.
@@ -68,7 +68,7 @@ Objective: <one-sentence goal>
68
68
  TaskType: ui-browser | api-backend | architecture-migration | docs-readme | dependency-sdk | bug-fix | refactor | chore
69
69
  ModelTier: small-fast | standard | high-reasoning
70
70
  AgentName: <the agent file name, e.g. task-scribe, codebase-explorer, implementer>
71
- Skills: <which skills to activate, e.g. tdd, browser-e2e>
71
+ Skills: <which skills to activate, e.g. tdd, wf-browser>
72
72
  ECC: <which ECC rules to load, e.g. web/design-quality.md, python/fastapi.md>
73
73
  PRD: <path or task PLAN section containing Mini PRD>
74
74
  Acceptance IDs: <AC-001, AC-002, or "none" for non-behavioral work>
@@ -130,11 +130,15 @@ Max parallelism removes the Harness default cap, not the runtime's physical or
130
130
  account cap. For WF-MAX, record the current runtime budget, use native
131
131
  subagents first, close completed agents before declaring the pool exhausted,
132
132
  then overflow to a peer CLI (`claude -p`, `codex exec`, or `opencode run --agent <role> --dir .`) with explicit
133
- dispatch packets. Generated Harness Codex config defaults to
134
- `agents.max_threads = 12` and `agents.max_depth = 1`; if that becomes the
135
- bottleneck, ask the user before raising `agents.max_threads` and keep
136
- `max_depth = 1` unless recursive delegation is explicitly approved. Do not rely
137
- on undocumented fork/derive bypasses as stable capacity.
133
+ dispatch packets. WF-MAX must attempt native subagent fan-out and record
134
+ `fanoutAttempted: true` before any solo fallback. Do not scaffold Codex scalar
135
+ `[agents]` capacity fields into `.codex/config.toml`; codex-cli 0.144.x can
136
+ reject them during TUI `skills/list`. Probe the installed runtime first and
137
+ manage Codex WF-MAX caps through the dispatch ledger unless the installed
138
+ version accepts the config shape. Generated OpenCode config defaults to
139
+ `subagent_depth = 2` so manager subagents can invoke worker subagents; manager
140
+ agents also need `permission.task` allowlists. Do not rely on undocumented
141
+ fork/derive bypasses as stable capacity.
138
142
 
139
143
  Default for explicit WF invocation: tier-based. WF-Light: planner + test-writer + implementer + verifier (bounded passes acceptable). WF-Standard: adds research/docs + one independent review lens. WF-Full: complete role chain, use bounded role passes as the recorded fallback when subagents are unavailable.
140
144
 
@@ -204,6 +208,12 @@ independent same-runtime subagent context; for broad WF-MAX review, dispatch
204
208
  agents report suggestions only. The controller accepts, rejects, or escalates
205
209
  each finding and owns the final decision.
206
210
 
211
+ ### OpenCode Reviewer Caveat
212
+
213
+ `opencode run --agent reviewer`: current installed `.opencode/agents/reviewer.md`
214
+ is `mode: subagent`; OpenCode falls back to the default agent. Probe before
215
+ claiming primary-runner review. Prefer same-runtime reviewer subagent fallback.
216
+
207
217
  ## Subagent Status Handling
208
218
 
209
219
  | Status | Controller Action |
@@ -296,11 +296,11 @@ Every cycle writes one entry to `Harness/tasks/auto/PROGRESS.md`:
296
296
 
297
297
  IMMEDIATELY return to W0. No pause between cycles — the only breaks are the adaptive Intent Checkpoint and the A-GATE.
298
298
 
299
- ### WF-AUTO Hook Exception
299
+ ### Runtime Hook Boundaries
300
300
 
301
- Runtime hooks are disabled by default across the Harness scaffold. The only
302
- allowed exception is an explicitly enabled `/wf-auto` tick hook for long-running
303
- auto-optimization.
301
+ Execution-control hooks are disabled by default across the Harness scaffold.
302
+ Startup update-check hooks are not execution-control hooks. Only an explicitly
303
+ enabled `/wf-auto` tick hook may drive long-running auto-optimization.
304
304
 
305
305
  Manual or benchmark-driven single-cycle `/wf-auto` runs use the same bounded
306
306
  tick contract: they may stop because the caller explicitly requested one tick,
@@ -321,8 +321,8 @@ wf-auto hook event
321
321
 
322
322
  Hard boundaries:
323
323
 
324
- - no hook is installed or registered by default
325
- - only `/wf-auto` may use a runtime hook
324
+ - no execution-control hook is installed or registered by default
325
+ - only `/wf-auto` may use a runtime hook to drive auto-optimization
326
326
  - the hook must run one bounded tick, not an unbounded process
327
327
  - the hook must respect `Harness/tasks/auto/STOP`, `state=paused`, user stop,
328
328
  and the Adaptive Coverage Exhaustion Gate
@@ -131,7 +131,7 @@ ReturnSchema:
131
131
 
132
132
  | Task Type | Primary Agents | Skills |
133
133
  |---|---|---|
134
- | UI/browser behavior | test-writer, implementer, verifier, reviewer | browser-e2e, wf-browser |
134
+ | UI/browser behavior | test-writer, implementer, verifier, reviewer | wf-browser |
135
135
  | API/backend | docs-researcher, test-writer, implementer, verifier, reviewer (security) | tdd |
136
136
  | Architecture/migration | architect, codebase-explorer, planner, reviewer | — |
137
137
  | Docs/README | wf-readme, reviewer, task-scribe | wf-readme |