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.
- package/core-assets/.claude-plugin/plugin.json +2 -2
- package/core-assets/PHILOSOPHY.md +18 -5
- package/core-assets/data/catalog.v3.json +29 -109
- package/core-assets/data/certification.json +1 -1
- package/core-assets/data/model.json +28 -52
- package/core-assets/hooks/_syntax-worker.cjs +1 -1
- package/core-assets/hooks/_void-hook.mjs +8 -6
- package/core-assets/hooks/tdd-guard.md +45 -88
- package/core-assets/hooks/viewport-screenshot-gate.sh +3 -3
- package/core-assets/packs/pack-monorepo/skills/void-dependency-direction/SKILL.md +27 -146
- package/core-assets/packs/pack-monorepo/skills/void-service-package/SKILL.md +5 -8
- package/core-assets/packs/pack-server/skills/void-webhook-handler-pattern/.source +4 -2
- package/core-assets/packs/pack-server/skills/void-webhook-handler-pattern/SKILL.md +32 -132
- package/core-assets/skills/void-accessibility/SKILL.md +2 -2
- package/core-assets/skills/void-async-safety/SKILL.md +37 -24
- package/core-assets/skills/void-autopilot/SKILL.md +17 -15
- package/core-assets/skills/void-autopilot/references/publication.md +82 -0
- package/core-assets/skills/void-code-review/SKILL.md +1 -1
- package/core-assets/skills/void-commit-discipline/SKILL.md +5 -11
- package/core-assets/skills/void-frontend-design/SKILL.md +2 -2
- package/core-assets/skills/void-hexagonal-architecture/SKILL.md +5 -5
- package/core-assets/skills/void-implement/SKILL.md +11 -5
- package/core-assets/skills/void-observability/SKILL.md +4 -4
- package/core-assets/skills/void-orchestrate/SKILL.md +57 -224
- package/core-assets/skills/void-testing/SKILL.md +4 -4
- package/core-assets/skills/void-verify/SKILL.md +1 -1
- package/core-assets/skills/void-verify/references/ci-admission.mjs +1 -1
- package/core-assets/skills/void-verify/references/ci-feedback.md +33 -4
- package/core-assets/templates/github/void-dependency-audit.yml +18 -2
- package/dist/main.js +2941 -2449
- package/package.json +2 -2
- 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,
|
|
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
|
|
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
|
|
176
|
-
|
|
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
|
|
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.
|
|
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.
|
|
207
|
-
publishes
|
|
208
|
-
|
|
209
|
-
|
|
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,
|
|
272
|
-
|
|
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
|
|
279
|
-
|
|
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.
|
|
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
|
-
| `
|
|
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`, `
|
|
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
|
-
-
|
|
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 +
|
|
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`
|
|
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`) —
|
|
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.
|
|
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
|
-
|
|
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
|
-
-
|
|
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
|
-
|
|
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`** (
|
|
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.
|
|
56
|
-
|
|
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
|
|
96
|
-
branches and useful proofs on their distinct
|
|
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
|
-
| `
|
|
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
|
-
|
|
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
|
-
-
|
|
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
|