voidmachine 6.0.0 → 7.0.1

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 (32) 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 +17 -15
  17. package/core-assets/skills/void-autopilot/references/publication.md +82 -0
  18. package/core-assets/skills/void-code-review/SKILL.md +1 -1
  19. package/core-assets/skills/void-commit-discipline/SKILL.md +5 -11
  20. package/core-assets/skills/void-frontend-design/SKILL.md +2 -2
  21. package/core-assets/skills/void-hexagonal-architecture/SKILL.md +5 -5
  22. package/core-assets/skills/void-implement/SKILL.md +11 -5
  23. package/core-assets/skills/void-observability/SKILL.md +4 -4
  24. package/core-assets/skills/void-orchestrate/SKILL.md +57 -224
  25. package/core-assets/skills/void-testing/SKILL.md +4 -4
  26. package/core-assets/skills/void-verify/SKILL.md +1 -1
  27. package/core-assets/skills/void-verify/references/ci-admission.mjs +1 -1
  28. package/core-assets/skills/void-verify/references/ci-feedback.md +33 -4
  29. package/core-assets/templates/github/void-dependency-audit.yml +18 -2
  30. package/dist/main.js +2941 -2449
  31. package/package.json +2 -2
  32. package/core-assets/hooks/block-protected-push.sh +0 -81
@@ -151,7 +151,7 @@ Act on each returned action, then ask again:
151
151
 
152
152
  | Action | What you do |
153
153
  |---|---|
154
- | `assign` | claim the ticket (In Progress, assigned), run `autopilot fingerprint --before <ticket>`, create or reuse its worktree, spawn its worker |
154
+ | `assign` | claim the ticket (In Progress, assigned), run `autopilot fingerprint --before <ticket>`, create or reuse its worktree, create the controlled mission there with title and full frozen ticket via `void-orchestrate`, hand its ID to the worker |
155
155
  | `wait` | nothing; the reason says who is working |
156
156
  | `hand-back-to-worker` | give the ticket back to its worker, alive or respawned in the same worktree, with the reason and the pull request; a respawned worker resumes its mission (see Respawning) |
157
157
  | `mark-human-wait` | record it in `recent` with its `reason`, which `recent` requires and the recap repeats, put the decision's `humanWaitLabel` on the ticket, comment the reason and detail, free the slot; keep reporting its pull request and footprint, which hold its ground until that pull request merges or closes |
@@ -159,7 +159,7 @@ Act on each returned action, then ask again:
159
159
  | `update-branch` | `void-machine autopilot update-branch --pr <n> --head <headSha>`: GitHub merges the base into the branch if its head is still that one; the new head is reviewed before anything merges it |
160
160
  | `enable-auto-merge` | `void-machine autopilot arm --ticket <id> --pr <n> --head <headSha>`, on a base with a merge queue: the same guards, then it records the head, arms on exactly that head and reads GitHub back; never `gh pr merge --auto` by hand, never `--admin` |
161
161
  | `disable-auto-merge` | `void-machine autopilot disarm --pr <n>`, before the action that follows it for the same ticket; it turns its auto-merge off, then takes it out of the merge queue, and fails while GitHub still shows either; never `gh pr merge --disable-auto` alone, which leaves a queued pull request in the queue |
162
- | `review` | `void-machine autopilot review --ticket <id> --pr <n> --head <headSha> --round <round> --mission <canonical-id>`; on awaiting-native-review use `void-orchestrate` for the actual reviewer, record canonical receipts, then repeat to collect. The same attempt keeps its 30 minute deadline; failures retain the existing budget |
162
+ | `review` | `void-machine autopilot review --ticket <id> --pr <n> --head <headSha> --round <round> --mission <canonical-id> --worktree <assigned-path>` from the coordinator checkout; on awaiting-native-review use `void-orchestrate` for the actual reviewer, record canonical receipts, then repeat to collect. The same attempt keeps its 30 minute deadline; failures retain the existing budget |
163
163
  | `requeue` | the same command, to put an ejected head back in the queue; the kernel bounds how often |
164
164
  | `drain` | take nothing new; keep acting on the tickets in flight |
165
165
  | `freeze` | stop acting, once the disarms before it succeeded |
@@ -172,8 +172,8 @@ send each back to the agent that produced it.
172
172
  **Spawning.** Every worker gets its worktree before it starts, at the durable location the
173
173
  doctrine's worktree rule names, reused when its branch already has one. A worker never chooses its
174
174
  own checkout and never works in the main one. Compose `void-orchestrate` to choose supported
175
- native delegation, including the session-host selection policy and the Herdr adapter
176
- with its central files when applicable. Count writers,
175
+ native delegation and publish its observed worker lifecycle through `agents record`
176
+ under the canonical mission, as `void-orchestrate` defines. Count writers,
177
177
  researchers and reviewers against available dispatch capacity; the ticket cap is unchanged.
178
178
  An assigned worker executes the unit once, without recursively delegating the complete cycle.
179
179
  `liveWorkers` reflects reconciled actual sessions and current evidence, never stale pane hints.
@@ -181,7 +181,8 @@ No permission is widened. Collect results before closure; uncertainty requires r
181
181
 
182
182
  **Respawning.** A hand-back goes to the same native session that holds the ticket, with the
183
183
  reason and pull request as data. Re-read mission, Git and actual session evidence; consult central
184
- brief/report and fresh Herdr identities only when that adapter is selected. Never a second run
184
+ brief/report and actual native identities. Keep the worker runId until its assignment
185
+ closes, publishing each observed transition through `void-orchestrate`. Never a second run
185
186
  beside an existing or uncertain invocation. A missing session is reported; retain its evidence.
186
187
 
187
188
  A respawned worker resumes; it never starts the ticket again. Its code is in its
@@ -200,13 +201,13 @@ the local config and the files it includes, the stash, tags, notes, remotes, the
200
201
  deploy branches, replace refs, `hooks/` and `info/` are one set for every worktree. The upstream
201
202
  (`remote`, `merge`) of every branch but the bases and the one that deploys is left out, since units
202
203
  in flight set it when they create or push their branch and drop it with a merged one; the bases'
203
- own settings still count. So start each worktree from
204
+ own settings still count; only regular root `info/refs`, Git’s generated transport cache, is exempt. Start each worktree from
204
205
  `origin/<base>` and never move a local base branch while units are in flight. The baseline
205
206
  recorded at `assign` is written once: a second `--before` for the same ticket is refused, so a unit
206
- cannot re-record the state it left as the state it found. It is compared by the coordinator before it
207
- publishes, with `autopilot fingerprint --after <ticket>`, and again by the kernel before it arms a
208
- merge. A changed or missing baseline sends the ticket to a human, unpublished; only that person
209
- deletes the record.
207
+ cannot re-record the state it left as the state it found. `autopilot fingerprint --after <ticket>`
208
+ checks it; the coordinator publishes only through `autopilot publish --ticket <ticket> --head <sha>
209
+ --remote <remote> --branch <branch>`, which couples that guard to the literal SHA push. Never follow
210
+ refusal with direct Git. Human renewal retains evidence; see [publication and recovery](references/publication.md).
210
211
 
211
212
  **Disarming.** Armed means GitHub merges without anyone acting again: an auto-merge request, or,
212
213
  once the checks pass on a base with a merge queue, an entry in that queue and no request at all.
@@ -265,18 +266,19 @@ neither, so a restart loses nothing.
265
266
 
266
267
  ## Workers
267
268
 
268
- Given: one ticket id, its worktree, its branch, the programme's plan and spec. The worker re-fetches
269
+ Given: one ticket id, its worktree, its branch, its canonical mission ID, the programme's plan and spec. The worker re-fetches
269
270
  the complete ticket itself; it never works from a summary.
270
271
 
271
- It runs `void-implement` whole in that worktree, and starts its mission with the ticket id as its
272
- `--title`, which is how a respawn finds it again. Before any context compaction it writes to the
272
+ It runs `void-implement` whole and `mission dispatch` in that worktree, reusing the mission
273
+ the coordinator created once with `--title <ticket-id> --ticket <full-frozen-ticket>`.
274
+ A respawn retains that identity and its budgets. Before any context compaction it writes to the
273
275
  mission what it has done: each specialist result through `mission specialist-event`, each proof
274
276
  through `mission verify`, a committed candidate through `mission writer-event`. The journal accepts
275
277
  only these typed events, no free note; what is not yet one of them does not survive a respawn, and
276
278
  uncommitted edits survive only in the worktree. During development, the coordinator may create or reuse a draft pull request
277
279
  for the branch; drafts are permitted for development, never for merge admission. After the worker
278
- returns its commit and green proofs, the coordinator runs `autopilot fingerprint --after <ticket>`,
279
- pushes, and must mark the same pull request ready (create one only if absent), then move the ticket
280
+ returns its commit and green proofs, the coordinator runs the guarded `autopilot publish` command
281
+ and must mark the same pull request ready (create one only if absent), then move the ticket
280
282
  to In Review. The independent reviewer examines ready pull requests only; an unfinished draft waits.
281
283
  Blocking findings come back as a hand-back and are corrected as a batch, per `void-implement`.
282
284
 
@@ -0,0 +1,82 @@
1
+ # Guarded publication and human recovery
2
+
3
+ The coordinator runs from the checkout containing the ticket's original baseline.
4
+ The local candidate branch can belong to another worktree; no checkout movement
5
+ or evidence copy is needed. Workers remain commit-only.
6
+
7
+ ```sh
8
+ void-machine autopilot publish --ticket DEV-42 --head <full-sha> --remote origin --branch fix/dev-42 --json
9
+ ```
10
+
11
+ This checks the explicit local branch against the full SHA and the shared Git
12
+ guard, then pushes that literal SHA to the named remote branch in the same
13
+ command. A base or deploy branch is refused. It does not force push, disable
14
+ hooks, set an upstream, grant review or merge permission, or remove a merge hold.
15
+ Missing, invalid, unreadable and changed fingerprints launch zero pushes. A
16
+ transport error can follow a remote success: inspect the named remote branch
17
+ before a deliberate retry. Never automatically follow a refusal with direct Git.
18
+
19
+ ## Coverage
20
+
21
+ Policy v4 excludes only a regular file exactly at common-Git-directory `info/refs`.
22
+ Git documents it as generated transport information, rebuilt by
23
+ [`git update-server-info`](https://git-scm.com/docs/git-update-server-info).
24
+ Its creation, update and removal are harmless to this guard. This does not identify
25
+ who created an incident file from its timestamp. `objects/info/packs` is Git's
26
+ other generated output; it is outside the existing fingerprint. `info/packs` is
27
+ not that output and stays guarded. Symlinks, nested `refs`, `info/exclude`,
28
+ `info/attributes`, hooks and their checksums, config/includes, bases, stash, tags,
29
+ notes, remotes and replace refs retain their previous coverage.
30
+
31
+ Version 3 aggregates the whole info directory, including regular root `info/refs`.
32
+ A retained v3 record is compared against a current reading using that same complete
33
+ v3 policy at both publication checks and in `autopilot next` merge decisions. All nine digests and retained protected branches
34
+ stay authoritative; any drift refuses. No conversion, renewal or baseline write is
35
+ needed for an unchanged v3 state. Versions 1 and 2 remain unsupported.
36
+
37
+ A v3 aggregate cannot be converted to v4 without historical file contents. Relaxing
38
+ its policy or accepting actual drift still requires the explicit human renewal below.
39
+ `fingerprint --record` reports the current v4 reading for that renewal inspection;
40
+ `fingerprint --after` and publication use the retained policy for comparison.
41
+
42
+ ## Explicit human renewal
43
+
44
+ Stop publication. Inspect the failure and the actual shared-state changes. A
45
+ person must authorize the exact repair or policy transition and affected candidate;
46
+ the ticket's implementation mandate alone is not that authorization.
47
+
48
+ ```sh
49
+ void-machine autopilot fingerprint --record DEV-42 --json
50
+ ```
51
+
52
+ Retain the output, including `recordDigest`, `currentDigest`, old fingerprint and
53
+ current fingerprint. After the human decision, use those exact digest values:
54
+
55
+ ```sh
56
+ void-machine autopilot fingerprint --renew DEV-42 --head <full-sha> --branch fix/dev-42 \
57
+ --previous <recordDigest> --expected <currentDigest> \
58
+ --cause 'Reviewed authorized repair or v3 policy transition' \
59
+ --decision '<reference to the explicit human decision>' --json
60
+ ```
61
+
62
+ The original `fingerprints/DEV-42.json` remains byte-for-byte intact. The complete
63
+ renewal under `fingerprints/DEV-42.renewals/` retains both fingerprints, predecessor
64
+ digest, branch/SHA, cause and decision. Its atomic creation is the transition;
65
+ there is no separate baseline replacement. Identical replay returns the retained
66
+ record. Conflicting or stale replay and changed observations refuse. Preserve
67
+ all those files: deleting history is not recovery. Renewal changes no review,
68
+ merge hold, merge authorization or deployment permission.
69
+
70
+ Publication and renewal share `fingerprints/DEV-42.lock`. A competing operation
71
+ refuses immediately. A crashed process may leave that directory: a person must
72
+ establish the owning process ended and inspect retained evidence before removing
73
+ only that abandoned lock. An incomplete canonical record remains blocked and
74
+ must be recovered from retained evidence, never ignored. Unlinked unique temporary
75
+ files are not committed records; retain them for diagnosis after an interrupted write.
76
+
77
+ The lock coordinates these supported commands in this state directory. It cannot
78
+ serialize direct Git, hooks or other processes, nor prevent malicious edits to
79
+ local evidence. The command rechecks immediately before its side effect and uses
80
+ an immutable commit refspec, but does not claim an atomic snapshot of all Git state
81
+ through network completion. See [Git push](https://git-scm.com/docs/git-push) for
82
+ refspec and hook semantics. Direct Git is outside this guarantee.
@@ -147,7 +147,7 @@ and consequence-based findings; it is not proof of correctness by itself.
147
147
  verify only the corrections and affected behavior. Reuse unaffected conclusions and proofs;
148
148
  never restart the general review. Newly raised blockers must demonstrate a correction
149
149
  regression or a concrete defect within the original scope.
150
- 5. Follow `void-implement`'s maximum two correction batches. Incomplete review, resumption and
150
+ 5. Follow `void-implement`'s maximum two correction batches. Under `void-autopilot`, its tighter two-total-review-round budget applies (initial plus one corrected head); see `docs/BOUNDED-REVIEWS.md`. Incomplete review, resumption and
151
151
  transport repair do not consume or reset that budget. Advisory findings never request a
152
152
  correction cycle. At the limit, report unresolved defects with cause and next action.
153
153
  Advisory findings never start a correction cycle; stop after acceptance, required proofs and independent review hold.
@@ -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
 
@@ -52,8 +55,10 @@ materializes its runtime-neutral specialist envelopes from the current plan.
52
55
 
53
56
  1. Keep one `leadWriterId` for implementation and every correction. The implementer owns
54
57
  the worktree and code; specialists and the independent reviewer never edit.
55
- 2. Start with `mission start --ticket <ticket>` and follow `mission dispatch --id <mission>
56
- --json`. The frozen task and controller own routing, state and correction budget. Normal
58
+ 2. Reuse the mission ID the coordinator supplied. The coordinator creates it once from the
59
+ assigned worktree with `mission start --title <unit> --ticket <full-frozen-ticket> --json`.
60
+ Run `mission dispatch --id <mission> --json` from that worktree. Never start another mission
61
+ to repair a refusal. The frozen task and controller own routing, state and correction budget. Normal
57
62
  dispatch starts the writer without a compulsory preparation panel. The writer still obtains
58
63
  the primary domain specialist advice required by pass 5 before production edits.
59
64
  For canonical `invoke-specialists` actions, pass each envelope unchanged through
@@ -78,7 +83,7 @@ materializes its runtime-neutral specialist envelopes from the current plan.
78
83
  unaffected conclusions and proofs; invalidate only affected evidence. A new targeted blocker
79
84
  must demonstrate a regression from the correction or a defect within the original scope.
80
85
  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
86
+ 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
87
  corrections awaiting targeted verification. Agent restart, incomplete review, transport repair
83
88
  and mission resumption neither consume a batch nor reset the budget. At the limit, stop
84
89
  automatic corrective dispatch, retain history and expose a cause, owner and next action.
@@ -92,8 +97,9 @@ materializes its runtime-neutral specialist envelopes from the current plan.
92
97
  prior reviews, resolutions, budgets and effects. Existing attestation-only stops need explicit
93
98
  validation of the original review's subject, available provenance and result before recovery;
94
99
  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.
100
+ 9. Collect the final result, then publish the worker terminal state and finished event
101
+ through `void-orchestrate`. Keep worktrees, branches and useful proofs on their distinct
102
+ lifecycle. External presentation tools own their surfaces; the harness does not close them.
97
103
 
98
104
  The CLI and existing Mission Engine implement this bounded cycle. A runtime certification is
99
105
  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