voidmachine 6.0.0 → 7.0.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 (28) hide show
  1. package/core-assets/.claude-plugin/plugin.json +2 -2
  2. package/core-assets/PHILOSOPHY.md +18 -5
  3. package/core-assets/data/catalog.v3.json +29 -109
  4. package/core-assets/data/certification.json +1 -1
  5. package/core-assets/data/model.json +28 -52
  6. package/core-assets/hooks/_syntax-worker.cjs +1 -1
  7. package/core-assets/hooks/_void-hook.mjs +8 -6
  8. package/core-assets/hooks/tdd-guard.md +45 -88
  9. package/core-assets/hooks/viewport-screenshot-gate.sh +3 -3
  10. package/core-assets/packs/pack-monorepo/skills/void-dependency-direction/SKILL.md +27 -146
  11. package/core-assets/packs/pack-monorepo/skills/void-service-package/SKILL.md +5 -8
  12. package/core-assets/packs/pack-server/skills/void-webhook-handler-pattern/.source +4 -2
  13. package/core-assets/packs/pack-server/skills/void-webhook-handler-pattern/SKILL.md +32 -132
  14. package/core-assets/skills/void-accessibility/SKILL.md +2 -2
  15. package/core-assets/skills/void-async-safety/SKILL.md +37 -24
  16. package/core-assets/skills/void-autopilot/SKILL.md +4 -3
  17. package/core-assets/skills/void-code-review/SKILL.md +1 -1
  18. package/core-assets/skills/void-commit-discipline/SKILL.md +5 -11
  19. package/core-assets/skills/void-frontend-design/SKILL.md +2 -2
  20. package/core-assets/skills/void-hexagonal-architecture/SKILL.md +5 -5
  21. package/core-assets/skills/void-implement/SKILL.md +7 -3
  22. package/core-assets/skills/void-observability/SKILL.md +4 -4
  23. package/core-assets/skills/void-orchestrate/SKILL.md +50 -222
  24. package/core-assets/skills/void-testing/SKILL.md +4 -4
  25. package/core-assets/skills/void-verify/SKILL.md +1 -1
  26. package/dist/main.js +1055 -1321
  27. package/package.json +2 -2
  28. package/core-assets/hooks/block-protected-push.sh +0 -81
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: void-commit-discipline
3
- description: Conventional Commits + mandatory "why" in body + scope + breaking-change marking. ASCII-only (no em dash, no emoji). Co-author trailer for AI pair. The git log is documentation. Use at every commit.
3
+ description: Conventional Commits + mandatory "why" in body + scope + breaking-change marking. Co-author trailer for AI pair. The git log is documentation. Use at every commit.
4
4
  ---
5
5
 
6
6
  # commit-discipline — voidcorp craftsman edition
@@ -27,7 +27,7 @@ The git log is the project's living narrative. "fix stuff" / "wip" / "asdf" dest
27
27
  |---|---|
28
28
  | `feat` | New observable behavior (new feature, new endpoint, new component visible to users / consumers) |
29
29
  | `fix` | Bug fix. Composes with `void-debug` (the why = the root cause) |
30
- | `void-refactor` | Structural change without behavior change. Composes with `void-refactor` (named Fowler move) |
30
+ | `refactor` | Structural change without behavior change. Composes with `void-refactor` (named Fowler move) |
31
31
  | `test` | Add / modify tests without changing production code. Includes `test: reproduce <bug>` from `void-debug` |
32
32
  | `docs` | Documentation only |
33
33
  | `chore` | Repo maintenance (config, scripts, tooling) without user-visible effect |
@@ -48,11 +48,11 @@ No invented types (`improve:`, `tweak:`, `cleanup:`). Reach for one of the above
48
48
 
49
49
  ### Body rules
50
50
 
51
- - Always present for `feat`, `fix`, `void-refactor`, `perf` commits. Optional for trivial `chore` / `style`.
51
+ - Always present for `feat`, `fix`, `refactor`, `perf` commits. Optional for trivial `chore` / `style`.
52
52
  - Wrapped at ≤ 72 columns
53
53
  - Explains the WHY: rationale, constraint, spec link, root cause
54
54
  - Multi-line bullets fine
55
- - ASCII only — no em dash, no emoji (the harness invariant)
55
+ - Follow the philosophy's prose rule: avoid decorative filler; meaningful punctuation and glyphs are allowed.
56
56
 
57
57
  ### Footers
58
58
 
@@ -145,10 +145,6 @@ The author cannot tell, the reviewer cannot tell, future maintainers cannot tell
145
145
 
146
146
  The companion hook `tidying-commit-prefix` (already shipped) flags `refactor:` with behavior-change keywords in body.
147
147
 
148
- ### Em dash, emoji, non-ASCII
149
-
150
- The harness invariant: English ASCII commit messages. Hyphens (`-`) for ranges, hyphens for parenthetical, not em dash. The companion hook `no-emdash-no-emoji-in-commit-msg` blocks.
151
-
152
148
  ### Missing "why" for substantive commits
153
149
 
154
150
  `feat:` / `fix:` / `refactor:` / `perf:` without a body explaining why = rejected. The commit message is documentation.
@@ -174,7 +170,6 @@ prove that chronology. Retain the actual test commands/results and explain the r
174
170
  - `commitlint-precommit` (commit-msg, in `pack-monorepo`) — already in void-starter. Enforces conventional commits.
175
171
  - `tidying-commit-prefix` (commit-msg, already shipped in core/hooks) — warns on mixed-intent `refactor:` commits.
176
172
  - `refactor-named-grep` (commit-msg, already shipped) — warns on `refactor:` without a Fowler name.
177
- - `no-emdash-no-emoji-in-commit-msg` (commit-msg, in `pack-monorepo`) — blocks em dash and emoji.
178
173
 
179
174
  ---
180
175
 
@@ -192,7 +187,6 @@ prove that chronology. Retain the actual test commands/results and explain the r
192
187
 
193
188
  - MUST NOT decide whether the change itself is correct (that is the upstream skills' job).
194
189
  - MUST NOT permit vacuous subjects.
195
- - MUST NOT permit em dash / emoji / non-ASCII.
196
190
  - MUST NOT permit `feat:` / `fix:` / `refactor:` without a body why.
197
191
  - MUST NOT substitute phase commit messages for observed RED/GREEN evidence.
198
192
  - MUST NOT silently allow invented commit types.
@@ -202,7 +196,7 @@ prove that chronology. Retain the actual test commands/results and explain the r
202
196
  ## Final rule
203
197
 
204
198
  ```
205
- Every commit → conventional format + imperative subject ≤ 72 + body explains WHY + ASCII + AI co-author trailer.
199
+ Every commit → conventional format + imperative subject ≤ 72 + body explains WHY + AI co-author trailer.
206
200
  Substantive (feat/fix/refactor/perf) → body mandatory.
207
201
  Otherwise → it is not voidcorp commit-discipline.
208
202
  ```
@@ -19,7 +19,7 @@ Every UI is designed mobile-first AND must reach first-class quality on both vie
19
19
 
20
20
  - **Layout starts at 360–390px** (iPhone 12 mini → 15 Pro range), progressively enhanced wider.
21
21
  - **Never the reverse.** No "desktop-first then squeeze for mobile."
22
- - **Both viewports screenshot-reviewed before merge** — `viewport-screenshot-gate` hook (shared with `void-accessibility`).
22
+ - **Both viewports screenshot-reviewed before merge** — inspect actual captures; the optional `viewport-screenshot-gate` script only checks PR text.
23
23
  - **No mobile-only / desktop-only features** without an explicit decision recorded through the `void-decide` skill.
24
24
  - **Performance budget enforced for both**: LCP < 2.5s on slow 4G mobile AND on desktop fiber (measure with the project's perf tooling — Lighthouse CI, WebPageTest, bundlesize).
25
25
 
@@ -234,7 +234,7 @@ import { Button } from '@repo/ui';
234
234
 
235
235
  ## Companion hooks
236
236
 
237
- - `viewport-screenshot-gate` (pre-PR on UI changes, shared with `void-accessibility`) — fails PRs lacking both mobile and desktop screenshots.
237
+ - `viewport-screenshot-gate` (pre-PR on UI changes, shared with `void-accessibility`) — optional PR-text heuristic, not a wired native/CI gate or image validation. Review actual captures.
238
238
  - `anti-ai-slop-grep` (pre-commit) — warns on banned copy patterns. Initial list of ~10; grows from `void-learn` harness-gap feedback.
239
239
 
240
240
  See `../../hooks/`.
@@ -31,9 +31,9 @@ The domain decides; the world translates. Ports are interfaces the domain owns.
31
31
  infrastructure (Drizzle, fetch, Resend SDK, ...)
32
32
  ```
33
33
 
34
- Read it: the domain depends on its own port interfaces. Adapters depend on the port interfaces and on infrastructure. **Infrastructure NEVER depends on the domain.** Reversing this direction is a Red Flag.
34
+ Read it: the domain depends on its own port interfaces. Adapters depend on the port interfaces and on infrastructure. The domain never imports concrete infrastructure. Adapters may depend on domain-owned ports.
35
35
 
36
- The companion hook `boundary-direction-check` enforces this on every commit.
36
+ Review enforces this architectural direction. The `boundary-direction-check` hook checks declared package dependencies; it does not infer domain/adapters layers from paths.
37
37
 
38
38
  ---
39
39
 
@@ -124,7 +124,7 @@ export function createDrizzleOrdersAdapter(db: Database): OrdersPort {
124
124
 
125
125
  - Business decisions ("if order total > $1000, set priority")
126
126
  - Cross-port coordination ("save to DB AND emit event in one method")
127
- - Validation beyond type translation (Zod for trust-boundary input lives in use-cases or boundary, not in adapters)
127
+ - Business invariants belong in the domain. Validate untrusted external data at adapter ingress (for example with Zod), before passing typed input to a use-case.
128
128
 
129
129
  ### The "fat port" smell
130
130
 
@@ -231,13 +231,13 @@ Replayable event log is an audit / temporal tool, not a default persistence stra
231
231
 
232
232
  ### Domain → infrastructure imports
233
233
 
234
- The companion hook blocks. There is no legitimate exception.
234
+ Review rejects this dependency direction; a package-manifest check alone cannot prove internal layer isolation.
235
235
 
236
236
  ---
237
237
 
238
238
  ## Companion hooks
239
239
 
240
- - **`boundary-direction-check`** (pre-commit) — greps cross-layer imports forbidden by the architecture (domain → infrastructure / adapters). See `../../hooks/`.
240
+ - **`boundary-direction-check`** (PreToolUse) checks scoped package imports against the nearest package manifest. It does not validate internal layer imports. See `void-dependency-direction` for the pack convention.
241
241
 
242
242
  ---
243
243
 
@@ -28,6 +28,9 @@ executes it: never delegate this complete workflow again. Tiny direct work and
28
28
  capability fallbacks follow that policy without skipping triggered quality gates.
29
29
  Preserve one `leadWriterId` through corrections; the coordinator retains user intent
30
30
  and decisions. Pass any orchestrator-owned panel contract unchanged.
31
+ For the writer and delegated reviewers, compose `void-orchestrate` to publish
32
+ observed worker lifecycle events in the canonical mission. Display metadata never
33
+ replaces the implementation or independent review receipts below.
31
34
 
32
35
  ## Optional usage linkage
33
36
 
@@ -78,7 +81,7 @@ materializes its runtime-neutral specialist envelopes from the current plan.
78
81
  unaffected conclusions and proofs; invalidate only affected evidence. A new targeted blocker
79
82
  must demonstrate a regression from the correction or a defect within the original scope.
80
83
  Carry unresolved blockers until an explicit, evidenced resolution; silence is not resolution.
81
- 7. Maximum two correction batches after the initial general review. A batch is submitted
84
+ 7. Maximum two correction batches after the initial general review. Under `void-autopilot`, its tighter two-total-review-round budget applies (initial plus one corrected head); see `docs/BOUNDED-REVIEWS.md`. A batch is submitted
82
85
  corrections awaiting targeted verification. Agent restart, incomplete review, transport repair
83
86
  and mission resumption neither consume a batch nor reset the budget. At the limit, stop
84
87
  automatic corrective dispatch, retain history and expose a cause, owner and next action.
@@ -92,8 +95,9 @@ materializes its runtime-neutral specialist envelopes from the current plan.
92
95
  prior reviews, resolutions, budgets and effects. Existing attestation-only stops need explicit
93
96
  validation of the original review's subject, available provenance and result before recovery;
94
97
  never promote a degraded historical result automatically or recreate the mission to bypass it.
95
- 9. Collect the final result before closing an orchestrator-owned agent panel. Keep worktrees,
96
- branches and useful proofs on their distinct lifecycle. Panel closure never deletes them.
98
+ 9. Collect the final result, then publish the worker terminal state and finished event
99
+ through `void-orchestrate`. Keep worktrees, branches and useful proofs on their distinct
100
+ lifecycle. External presentation tools own their surfaces; the harness does not close them.
97
101
 
98
102
  The CLI and existing Mission Engine implement this bounded cycle. A runtime certification is
99
103
  not an additional delivery gate. Concrete independence, permission, isolation, evidence and
@@ -45,7 +45,7 @@ logger.error({ err, orderId }, 'payment_failed');
45
45
  | `error` | Operation failed; user impact |
46
46
  | `warn` | Unexpected but handled |
47
47
  | `info` | Significant business event |
48
- | `void-debug` | Developer-time signal |
48
+ | `debug` | Developer-time signal |
49
49
  | `trace` | Very granular (rarely committed) |
50
50
 
51
51
  ---
@@ -110,7 +110,7 @@ The adapter (per `void-hexagonal-architecture`) is where the catch lives. The er
110
110
  try { await doSomething(); } catch (e) { /* swallow */ }
111
111
  ```
112
112
 
113
- Either log it, or rethrow, or both. `catch (e) {}` is rejected.
113
+ Logging alone does not recover a failed operation. Propagate a typed failure or rethrow; explicit recovery must preserve the caller's contract. Log at the boundary that owns the diagnosis, without duplicating the same failure at every layer.
114
114
 
115
115
  ---
116
116
 
@@ -121,7 +121,7 @@ Majors' rule. Log:
121
121
  - User ID (anonymized — `userId: hash(realId)` for Sentry; raw in internal logs only if compliance allows)
122
122
  - Org / tenant ID
123
123
  - Feature flags active
124
- - Session ID
124
+ - Non-secret correlation ID (generated for tracing, never an authentication credential)
125
125
  - Browser / device / region
126
126
  - Business-meaningful tags (plan tier, signup source, conversion path)
127
127
 
@@ -184,7 +184,7 @@ Defense in depth. The discipline says "don't log it." The config says "even if y
184
184
  ## What NOT to log
185
185
 
186
186
  - Full request bodies (PII / secrets / massive payloads). Log specific fields with explicit allowlist.
187
- - Passwords, tokens, API keys, session IDs, JWTs (composes with `void-security-guidance`)
187
+ - Passwords, tokens, API keys, authentication session IDs/cookies, JWTs (composes with `void-security-guidance`)
188
188
  - Email addresses unredacted in production logs (consider hashing or partial redaction depending on compliance)
189
189
  - Full database rows (PII risk)
190
190
  - LLM full prompts / responses (PII + cost) — log token counts and structural metadata, not content
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: void-orchestrate
3
- description: Delegate independent research and substantial implementation through native agents; choose context, isolation and bounded concurrency, collect results and preserve review evidence. Use the supported session host.
3
+ description: Delegate independent research and substantial implementation through native agents; choose context, isolation and bounded concurrency, collect results and preserve review evidence. Publish observed worker lifecycle events.
4
4
  ---
5
5
 
6
6
  # Orchestrate
@@ -17,16 +17,10 @@ context, permissions, completion and resume capabilities. Use the best supported
17
17
  capabilities for the task in the current session; an installed executable or an
18
18
  environment hint alone does not validate a host, identity or permission.
19
19
 
20
- Herdr is optional for consumers, not discretionary inside a validated Herdr session.
21
- When fresh discovery validates the coordinator in Herdr, use its adapter below for
22
- durable terminal workers and mission visibility. Short agents remain native; never
23
- duplicate an agent to give it a pane. Outside Herdr, use the current supported host
24
- (such as tmux) when its required capabilities and ownership can be verified. This
25
- policy adds no tmux transport and never relaunches through the legacy kernel.
26
- Without supported presentation, retain native delegation and report the limitation;
27
- do not claim durability from a pane or unsupported API. Failed or ambiguous host
28
- discovery blocks the affected host action: diagnose it, never silently switch hosts
29
- or act on an unrelated project. Native work independent of that action may continue.
20
+ Use native execution independently of presentation. The harness publishes worker
21
+ observations; external plugins own windows, tabs and panes. Never discover or call
22
+ a multiplexer to delegate, and never duplicate an agent to make it visible.
23
+ An absent display cannot change execution permissions or invalidate real evidence.
30
24
 
31
25
  - Work directly for a tiny targeted change, a single tool call, mechanical processing,
32
26
  or tightly coupled work where delegation adds no useful separation.
@@ -70,22 +64,6 @@ conflict, rather than silently upgrading or claiming the quality requirement is
70
64
  and report the effective model only when the runtime supplies it; otherwise it is unknown.
71
65
  Use existing evidence/reporting, not a new registry. Report cost/time only when observed.
72
66
 
73
- ## First ticket and optional worker tabs
74
-
75
- SessionStart discovers Herdr even before central mission files exist. Its advice
76
- requires a fresh caller pane at the canonical checkout and process ownership;
77
- environment variables alone never authorize a host action. Revalidate before launch.
78
- On a new implementation ticket, reuse the assigned writer if one exists. Otherwise,
79
- in a validated Herdr session, register the mission and planned worker first, then
80
- create one background tab in the resolved coordinator workspace with the assigned
81
- worktree as cwd. Read the installed `herdr tab` schema, preserve focus with
82
- `--no-focus`, and use the returned root pane for the single agent start below.
83
- Reattach a matching existing worker instead of opening another tab. The coordinator
84
- stays in its existing pane. Hooks only discover and advise; they never create tabs,
85
- launch agents or write central files. Without Herdr, use native delegation normally.
86
- An invalid host or explicit mission selection refuses only that host action;
87
- independent native work may continue with the limitation stated.
88
-
89
67
  ## Brief and bound the delegation
90
68
 
91
69
  Use a fresh context by default. Choose a supported fork only when the task needs
@@ -98,7 +76,7 @@ Formal specialist envelopes and evidence follow the independent contract below.
98
76
 
99
77
  Count writer, research and review children together against observed available runtime slots
100
78
  and the coordinator's bounded dispatch; queue work when full. Preserve tighter caller
101
- limits, including Autopilot's ticket cap and the central schema's four-worker limit.
79
+ limits, including Autopilot's ticket cap.
102
80
  This is no machine-wide quota. Do not create recursive child coordinators or redispatch
103
81
  the same complete workflow. Required formal specialists remain dispatched by their
104
82
  designated owner within the shared available capacity. Do not duplicate a child's work
@@ -150,206 +128,56 @@ Preserve the complete result; incomplete results go back to the same agent.
150
128
  With `panel.provider: orchestrator`, only ORCH launches and collects this panel.
151
129
  Missing required native capability is reported with cause and next action.
152
130
 
153
- ## Herdr adapter: recovery
154
-
155
- The following Herdr sections apply when the session-host policy selects this adapter.
156
- Native delegation without it does not require these central files or pane discovery.
157
-
158
- Read project instructions, the approved task and the current Git status. Preserve
159
- other writers' changes. Resolve the canonical Git common directory, SHA-256 its
160
- absolute real path as UTF-8, and inspect
161
- `~/.local/state/orchestra/<project>/<mission>/`. Never use an inherited workspace
162
- variable or a stale pane ID as authority. Read mission.md, the applicable
163
- workers/<label>/brief.md and report.md. Re-read `herdr pane list` before every
164
- identity decision. Match **label + worktree**, using the canonical worktree path.
165
- Refuse multiple matches, incomplete discovery, symlinks, traversal and invalid data.
166
- After reattachment/restart, ORCH atomically updates pane_id and coordinator.workspace
167
- from that validated fresh inventory. Hooks and workers never write these hints.
168
- A missing unrelated historical worktree does not invalidate a current identity.
169
-
170
- The coordinator is the existing ORCH session, never a second agent opened for display.
171
- Resolve its own label + worktree before selecting its workspace. Keep each writer
172
- in its assigned worktree. Do not affect any other project, workspace or pane.
173
- An uncertain launch or prompt acknowledgement requires reconciliation of that same
174
- worker before retrying. A timeout proves neither launch failure nor prompt loss.
175
-
176
- ## Herdr adapter: explicit coordinator context
177
-
178
- If unique discovery refuses multiple compatible missions, ORCH reads the target
179
- mission and reports, then atomically replaces its local, unversioned
180
- `<canonical worktree>/.void/machine/orchestra-selection.json`. Schema 1 is strict
181
- JSON, at most 4096 UTF-8 bytes: `{ "schema": 1, "project": "<project-sha256>",
182
- "mission": "<existing-id>", "coordinator": { "label": "ORCH", "worktree":
183
- "/absolute/canonical/worktree" } }`. ORCH alone writes it; hooks never repair it.
184
- No unknown or duplicate keys, YAML, traversal, symlinks or partial writes.
185
-
186
- This selects context only, never execution state or permissions. Full bounded
187
- central discovery still runs; malformed unrelated missions or limits refuse.
188
- A stale/invalid binding never falls back. Verify selected coordinator label and
189
- canonical worktree against the current worktree and a fresh `herdr pane list`;
190
- missing or duplicate live matches refuse. Never prefer timestamps, running status
191
- or pane tokens to decide intent. Without a binding, preserve unique discovery.
192
- Clear/compact/resume re-read selection and central state without launching workers.
193
- Separate worker worktrees retain their own mission, attempt and report discovery.
194
- A selected terminal mission retains the guarded cleanup below: never clear tokens
195
- belonging to another mission. No binding belongs in the programme descriptor.
196
-
197
- ## Herdr adapter: central files and ownership
198
-
199
- Use schema: 1 YAML frontmatter, strict string keys and one document, followed by
200
- Markdown. Reject duplicate keys, tags, anchors, aliases and unknown fields. Bound
201
- mission/report to 64 KiB, brief to 256 KiB, discovery to 64 entries and 1 MiB of
202
- mission bytes; exceeding a bound is incomplete, never a unique match.
203
- See the shipped technical contract `docs/ORCHESTRA.md` in the harness source for
204
- schemas; the operational fields are listed here so an installed skill is sufficient.
205
-
206
- - mission.md: schema, mission, project, status, updated_at
207
- (ISO with `Z` or `+HH:MM`/`-HH:MM`; prefer UTC `Z`), repository
208
- (canonical Git common path), coordinator {label, worktree, workspace?}, workers.
209
- - Worker entries: label, agent (codex or claude), worktree, branch, ticket, status,
210
- attempt; optional pane_id and session are hints only. At most four workers.
211
- - Coordinator status and worker status: planned, running, blocked, done, failed.
212
- - report.md: schema, mission, attempt, worker, branch, status (running, blocked,
213
- done, failed), commits (full SHAs), tests (passed, failed, not_run), updated_at.
214
- Body: actual commands/results, proof locations, risks, questions and remaining work.
215
- - brief.md: absolute paths, exact base, footprint, acceptance criteria, ownership,
216
- permissions, forbidden effects and current attempt. No secrets. Explicitly warn
217
- that other writers exist and their changes must be preserved.
218
-
219
- ORCH alone writes mission and briefs; each worker alone writes its report. Use an
220
- atomic replacement: write an exclusive temporary sibling, then rename. Hooks never
221
- write these files. A new work turn gets a new attempt; resume keeps its attempt.
222
- A valid report for the current mission/attempt overrides workers[].status at every
223
- event. An absent report falls back to the manifest. Malformed, foreign, partial or
224
- unrecognized stale reports refuse usage; never turn a parse failure into absence.
225
- The files carry coordination state, not independent review proof.
226
-
227
- ## Herdr adapter: copyable starting files
228
-
229
- Replace the example project hash with SHA-256 of the canonical common Git path.
230
- Replace every path, branch, ticket and timestamp from actual observations. These
231
- three files are authored by their owner, never by the hook.
232
-
233
- mission.md:
234
-
235
- ```yaml
236
- ---
237
- schema: 1
238
- mission: dev-42
239
- project: "<project-sha256>"
240
- status: planned
241
- updated_at: "2026-10-08T10:00:00.000Z"
242
- repository: /absolute/repository/.git
243
- coordinator:
244
- label: ORCH
245
- worktree: /absolute/repository
246
- workspace: wA
247
- workers:
248
- - label: WORK-1
249
- agent: codex
250
- worktree: /absolute/worktrees/dev-42
251
- branch: work/dev-42
252
- ticket: DEV-42
253
- status: planned
254
- attempt: implementation-1
255
- ---
256
- # Mission
257
- Scope, acceptance criteria, canonical mission journal and proof locations.
258
- ```
259
-
260
- workers/WORK-1/brief.md:
261
-
262
- ```yaml
263
- ---
264
- schema: 1
265
- mission: dev-42
266
- attempt: implementation-1
267
- worker: WORK-1
268
- ---
269
- # Work
270
- Worktree: /absolute/worktrees/dev-42. Branch: work/dev-42.
271
- Base: <verified full commit SHA>. Ticket: DEV-42.
272
- Footprint: <exact owned files/directories>; preserve every other writer's edits.
273
- Acceptance: <complete observable criteria and verification commands>.
274
- Limits: <role permissions, forbidden effects, human gates>.
275
- Report: /absolute/mission/workers/WORK-1/report.md, owned only by this worker.
276
- Resume: <actual runtime session and the recipe from the table below>.
277
- ```
278
-
279
- workers/WORK-1/report.md:
280
-
281
- ```yaml
282
- ---
283
- schema: 1
284
- mission: dev-42
285
- attempt: implementation-1
286
- worker: WORK-1
287
- branch: work/dev-42
288
- status: running
289
- commits: []
290
- tests: not_run
291
- updated_at: "2026-10-08T10:00:00.000Z"
292
- ---
293
- # Checkpoint
294
- Completed: <actual changes>. Verification: <commands, results and proof paths>.
295
- Remaining: <work and exact next action>. Risks/questions: <observed limitations>.
296
- ```
297
-
298
- ## Herdr adapter: durable workers
299
-
300
- Read installed `herdr --help`, `herdr agent --help` and the live schema before
301
- issuing commands. Use structured argv, exact acknowledged identities and bounded
302
- waits/output. The launch recipes for the selected worktree are:
131
+ ## Publish worker observations
303
132
 
304
- | Kind | Launch argv | Resume argv | Short contexts | ctx capability |
305
- | --- | --- | --- | --- | --- |
306
- | codex | `--no-daemon --add-dir <absolute-mission>` | `resume <actual-session> --no-daemon --add-dir <absolute-mission>` | Native fresh context | Unmeasurable without a supported usage source |
307
- | claude | `--add-dir <absolute-mission>` | `--resume <actual-session> --add-dir <absolute-mission>` | Native Agent, no interception | Fresh transcript usage plus required context.windowTokens |
133
+ For each mission worker or reviewer, keep one `run_<opaque-id>` for its assignment.
134
+ Reuse the unit's open canonical mission; if it has none, create it with
135
+ `void-machine mission start --title <unit> --json` and retain its returned ID.
136
+ Do not recreate a mission to evade a refusal. This publication never substitutes
137
+ for the mission's implementation, verification or independent review receipts.
308
138
 
309
- Use the selected kind's executable and preserve these options on every launch/resume:
139
+ After an actual successful native dispatch acknowledgement, publish:
310
140
 
311
141
  ```sh
312
- herdr agent start <unique-mission-worker-name> --kind <kind> --pane <resolved-pane> -- <argv-from-table>
142
+ void-machine agents record --mission <mis_id> --event-file <observation.json>
313
143
  ```
314
144
 
315
- The arguments after `--` belong to the selected runtime. The name is unique within
316
- the mission; it is not an invented native session ID. Resolve the pane first and
317
- keep the session ID actually returned by the runtime.
318
-
319
- Apply the role's existing permission/read-only policy; `--add-dir` only grants the
320
- specified directory, never disables a sandbox or an approval. Unsupported kind or
321
- option: diagnose and stop that launch. Do not update or restart Herdr to make it fit.
322
- Register planned worker before creating its owned surface. Keep the returned pane
323
- ID as a hint, launch once, submit the brief once, then reconcile by label + worktree.
324
- Use `herdr agent wait` in bounded slices and read the report after every turn.
325
- Idle/done is a turn ending, never proof the task passed. Request a missing report
326
- from the same session. Follow up in that session; never create a duplicate worker.
327
- After /clear read the same mission; after a killed process resume its actual session
328
- in the same worktree. Missing session: retain the mission and expose the loss.
329
-
330
- `resume_argv` is absent from Herdr 0.9.0 and 0.9.1, present from 0.9.2. Publish it
331
- only after the installed schema proves support. Otherwise retain the complete resume
332
- recipe in the brief. Never claim restart restoration was tested without doing it.
333
-
334
- ## Herdr adapter: projection and closure
335
-
336
- The hook publishes source void-machine on SessionStart startup/resume/clear/compact
337
- and Stop after re-reading central state and fresh Herdr identities. Pane tokens:
338
- mission, worker, ticket, wstatus; coordinator-only workspace: mission, wstatus, workers.
339
- These are file status, never agent state. ctx requires the selected kind's measured capability from the table; unavailable measurement stays unavailable. Clear
340
- removes ctx before fresh measurement. State TTL is 86400000 ms, ctx TTL 7200000 ms.
341
- Sequences are exact nanosecond decimal BigInts captured before discovery. Old or
342
- equal seq is ignored by Herdr. Tokens are global keys, not source namespaces: another
343
- source may overwrite them; null clears globally. Never reconfigure cockpit to win.
344
-
345
- Terminal mission cleanup explicitly clears keys on all still-resolved owned panes,
346
- only where the currently projected mission still matches. Only the resolved
347
- coordinator clears workspace keys, again after verifying the displayed mission.
348
- A late closure of A must not clear B. A worker SessionEnd never cleans the workspace.
349
- When no mission is active, recover the verified displayed terminal mission; do not
350
- choose arbitrary history. Discovery/transport errors never trigger a purge.
351
- After collection and acceptance ORCH may close its owned surfaces; retain worktrees,
352
- branches and evidence according to their own lifecycle. Do not close the coordinator.
145
+ The file contains `observationId`, `kind` and `payload`. Use a stable observation ID
146
+ and exactly the same content on a retry. The payload always carries `schemaVersion: 1`
147
+ and `runId`. Publish these three kinds at their real boundaries:
148
+
149
+ - `worker.dispatched`: add `missionId`, `ticket` (or `unknown`), `role` (`work` or
150
+ `review`), `runtime` (`claude` or `codex`), the verified absolute `worktree`,
151
+ `branch` (`detached` requires `headSha`), and `attachCommand` (verified argv or
152
+ `unknown`). Never invent an attachment recipe or use presentation hints as identity.
153
+ - `worker.state`: add `state` (`running`, `blocked`, `done`, `failed`) and the UTC
154
+ `observedAt`; optional `reason` explains a wait. Publish the initial running state
155
+ and subsequent observed changes. A turn ending while awaiting the coordinator
156
+ is blocked, not done. No observation means unknown, never inferred failure.
157
+ - `worker.finished`: add `outcome` (`succeeded`, `failed`, `stopped`) after final
158
+ collection or confirmed terminal failure/stop, preceded by done for succeeded,
159
+ failed otherwise. Finish before closing the mission. It does not mean merged.
160
+
161
+ Keep the same assignment through corrections and resume. Repeated running states
162
+ across distinct turns need distinct observation IDs. A finished assignment is closed;
163
+ new work afterwards gets a new run ID. Keep real native identities in the existing
164
+ brief/evidence; the observation ID is not a fabricated native receipt.
165
+
166
+ A publication error is visible and retried with the same identity/content after its
167
+ cause is resolved; it never authorizes another launch. No brief, transcript, secret
168
+ or result content belongs in these metadata. Native calls outside this procedure are
169
+ not automatically captured, including unsupported Codex observation paths.
170
+
171
+ `void-machine agents status --json` reads all project mission journals and reports
172
+ active assignments, their last observed state and coverage issues. It does not poll
173
+ runtimes or control presentation. Partial coverage is explicit and exits nonzero;
174
+ never treat an unreadable history as no workers. External tools consume this public
175
+ contract; the harness does not open or close their surfaces.
176
+
177
+ Existing legacy runs retain their session and journal. Their mutating CLI commands
178
+ publish the same events; `void-machine agents publish <runId>` retries publication
179
+ from saved transitions without re-executing or stopping the runtime. This does not
180
+ make the legacy launcher mandatory for new work.
353
181
 
354
182
  ## Independent review
355
183
 
@@ -128,7 +128,7 @@ Describe the behavior. Imperative. Specific.
128
128
  - `it should retry` (the "should" is fluff)
129
129
  </Bad>
130
130
 
131
- The companion hook `test-name-lint` warns on weak patterns (`test`, `works`, `should` as the entire name).
131
+ The `test-name-lint` write hook blocks detected generic names: exactly `test`, or names starting with `should `, `work` or `works`. The owning rule defines the lexical scope.
132
132
 
133
133
  ---
134
134
 
@@ -231,7 +231,7 @@ Each snapshot has a reason. No `.toMatchSnapshot()` outside the whitelist withou
231
231
 
232
232
  Banned in committed code. They mean "I will not run this." If you mean "this case is intentionally not yet tested," write a `it.todo('description')` — the test runner reports todos.
233
233
 
234
- The companion hook `no-only-no-skip` blocks commits with `.only` / `fdescribe` / `xit` in the staged diff (allowed in `**/__skip-on-purpose__/**` whitelist with justifying comment).
234
+ The `no-only-no-skip` write hook rejects focused and skipped calls in proposed test files, including `fit`, `fdescribe`, `xit`, `xdescribe` and suite `.skip`. There is no path whitelist; use an explicit `todo` for pending coverage.
235
235
 
236
236
  ### Implementation spies as primary assertion
237
237
 
@@ -259,8 +259,8 @@ Use pglite or dev branch. Mocking Drizzle breaks at every schema change while pr
259
259
 
260
260
  ## Companion hooks
261
261
 
262
- - **`no-only-no-skip`** — block on `.only` / `fdescribe` / `xit` / `.skip` in staged diff (whitelist: `**/__skip-on-purpose__/**`)
263
- - **`test-name-lint`** — warn on weak test names matching `/^\s*(test|works|should)\s*$/i`
262
+ - **`no-only-no-skip`** — blocks focused/skipped calls on supported test writes; no path exemption
263
+ - **`test-name-lint`** — blocks the generic test-name patterns described above
264
264
  - **`no-business-mock`** — warn on `vi.mock\('@/(services|domain)/...'\)` patterns
265
265
  - **`no-snapshot-default`** — warn on new `.toMatchSnapshot()` outside `**/__visual__/**` whitelist
266
266
 
@@ -77,7 +77,7 @@ Remove unrelated scope unless the requested behavior requires it.
77
77
  Give the result, relevant commands/results, independent review outcome and material limits.
78
78
  Do not print a twelve-item checklist with irrelevant N/A rows. Keep applicability reasoning in
79
79
  the existing task/review evidence; summarize it when it explains a real omission or decision.
80
- For a plan, update its existing resume point; the tracker owns mutable programme progress.
80
+ For a standalone sequential plan, update its existing resume point. For a programme, the declared tracker alone owns mutable progress; do not add a current/next unit to the plan.
81
81
  The PR evidence and final report reuse the same observed results rather than duplicate work.
82
82
 
83
83
  Once at ticket end, the coordinator closes each explicitly bound source with