voidmachine 5.0.8 → 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 (38) hide show
  1. package/core-assets/.claude-plugin/plugin.json +13 -2
  2. package/core-assets/PHILOSOPHY.md +29 -6
  3. package/core-assets/data/catalog.v3.json +52 -132
  4. package/core-assets/data/certification.json +1 -1
  5. package/core-assets/data/model.json +51 -75
  6. package/core-assets/hooks/_syntax-worker.cjs +1 -1
  7. package/core-assets/hooks/_void-hook.mjs +730 -515
  8. package/core-assets/hooks/outcome-meter.sh +2 -1
  9. package/core-assets/hooks/tdd-guard.md +45 -88
  10. package/core-assets/hooks/viewport-screenshot-gate.sh +3 -3
  11. package/core-assets/packs/pack-monorepo/skills/void-dependency-direction/SKILL.md +27 -146
  12. package/core-assets/packs/pack-monorepo/skills/void-service-package/SKILL.md +5 -8
  13. package/core-assets/packs/pack-server/skills/void-webhook-handler-pattern/.source +4 -2
  14. package/core-assets/packs/pack-server/skills/void-webhook-handler-pattern/SKILL.md +32 -132
  15. package/core-assets/skills/void-accessibility/SKILL.md +2 -2
  16. package/core-assets/skills/void-async-safety/SKILL.md +37 -24
  17. package/core-assets/skills/void-autopilot/SKILL.md +7 -6
  18. package/core-assets/skills/void-brainstorm/SKILL.md +40 -61
  19. package/core-assets/skills/void-code-review/SKILL.md +24 -11
  20. package/core-assets/skills/void-commit-discipline/SKILL.md +13 -20
  21. package/core-assets/skills/void-debug/SKILL.md +9 -10
  22. package/core-assets/skills/void-domain-driven-design/SKILL.md +1 -1
  23. package/core-assets/skills/void-frontend-design/SKILL.md +3 -3
  24. package/core-assets/skills/void-hexagonal-architecture/SKILL.md +5 -5
  25. package/core-assets/skills/void-implement/SKILL.md +67 -26
  26. package/core-assets/skills/void-llm-cost-discipline/SKILL.md +3 -0
  27. package/core-assets/skills/void-observability/SKILL.md +4 -4
  28. package/core-assets/skills/void-orchestrate/SKILL.md +91 -221
  29. package/core-assets/skills/void-plan/SKILL.md +12 -17
  30. package/core-assets/skills/void-qa/SKILL.md +15 -14
  31. package/core-assets/skills/void-tdd/SKILL.md +33 -84
  32. package/core-assets/skills/void-testing/SKILL.md +5 -5
  33. package/core-assets/skills/void-ticket/SKILL.md +2 -0
  34. package/core-assets/skills/void-typescript-strict/SKILL.md +5 -5
  35. package/core-assets/skills/void-verify/SKILL.md +57 -159
  36. package/dist/main.js +1959 -1633
  37. package/package.json +3 -3
  38. package/core-assets/hooks/block-protected-push.sh +0 -81
@@ -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.
@@ -40,21 +34,35 @@ or act on an unrelated project. Native work independent of that action may conti
40
34
  mandatory independent review or required isolation remains a blocker; do not
41
35
  replace it with self-review or silently weaken its requirement.
42
36
 
43
- ## First ticket and optional worker tabs
44
-
45
- SessionStart discovers Herdr even before central mission files exist. Its advice
46
- requires a fresh caller pane at the canonical checkout and process ownership;
47
- environment variables alone never authorize a host action. Revalidate before launch.
48
- On a new implementation ticket, reuse the assigned writer if one exists. Otherwise,
49
- in a validated Herdr session, register the mission and planned worker first, then
50
- create one background tab in the resolved coordinator workspace with the assigned
51
- worktree as cwd. Read the installed `herdr tab` schema, preserve focus with
52
- `--no-focus`, and use the returned root pane for the single agent start below.
53
- Reattach a matching existing worker instead of opening another tab. The coordinator
54
- stays in its existing pane. Hooks only discover and advise; they never create tabs,
55
- launch agents or write central files. Without Herdr, use native delegation normally.
56
- An invalid host or explicit mission selection refuses only that host action;
57
- independent native work may continue with the limitation stated.
37
+ ## Native model choice
38
+
39
+ Use the current runtime's declared model/effort controls and project-configured identifiers.
40
+ An explicit user choice wins; do not infer availability, price or capability from a product name.
41
+ Without an explicit choice, match the bounded task to an available native configuration:
42
+
43
+ | Work | Selection |
44
+ | --- | --- |
45
+ | Mechanical lookup, extraction, formatting | An economical model when supported and sufficient |
46
+ | Domain advice or implementation | Enough capability for the actual contract and uncertainty |
47
+ | Sensitive architecture/security, independent review, failed-proof adjudication | Retain judgment capability; never downgrade just for cost |
48
+
49
+ Keep the assigned writer and reuse valid specialist advice. Do not restart a retained context
50
+ merely to change its model; the writer's whole quality cycle stays intact. A cheaper explicit
51
+ choice never waives acceptance or independent review: report insufficient capability as a
52
+ conflict, rather than silently upgrading or claiming the quality requirement is met.
53
+
54
+ - Discover supported identifiers and controls before dispatch; pass only supported options.
55
+ Respect native constraints between model overrides, effort and context/fork modes.
56
+ - An unavailable explicit choice stops the dependent launch with its cause and next action.
57
+ If no explicit choice exists and selection is unsupported, inherit/default transparently;
58
+ do not claim that a particular model or lower price was selected.
59
+ - Diagnose an unsupported optional setting instead of passing it anyway. Do not silently
60
+ change provider, credentials, permissions or the user's choice to make a launch work.
61
+ - Reconcile an uncertain launch before retrying the same work. At most one retry for a
62
+ confirmed transient failure; otherwise report the limitation. Never cascade across models.
63
+ - Requested and observed models differ: retain the requested option in the ordinary brief,
64
+ and report the effective model only when the runtime supplies it; otherwise it is unknown.
65
+ Use existing evidence/reporting, not a new registry. Report cost/time only when observed.
58
66
 
59
67
  ## Brief and bound the delegation
60
68
 
@@ -68,7 +76,7 @@ Formal specialist envelopes and evidence follow the independent contract below.
68
76
 
69
77
  Count writer, research and review children together against observed available runtime slots
70
78
  and the coordinator's bounded dispatch; queue work when full. Preserve tighter caller
71
- limits, including Autopilot's ticket cap and the central schema's four-worker limit.
79
+ limits, including Autopilot's ticket cap.
72
80
  This is no machine-wide quota. Do not create recursive child coordinators or redispatch
73
81
  the same complete workflow. Required formal specialists remain dispatched by their
74
82
  designated owner within the shared available capacity. Do not duplicate a child's work
@@ -97,6 +105,18 @@ Never invent a durable inbox. Preserve formal receipts separately from working n
97
105
 
98
106
  ## Short native specialists
99
107
 
108
+ `void-implement` owns domain detection and the required primary domain consultation before coding.
109
+ Dispatch that smallest relevant expert set once, collect actual advice and reuse it while its
110
+ inputs hold. This skill owns transport and provenance, not a second applicability policy or
111
+ an all-specialist preparation quorum. Extra experts need a distinct uncovered risk.
112
+
113
+ For a lightweight consultation outside formal dispatch, after the native call actually succeeds
114
+ and returns a context ID, the coordinator may record `void-machine mission advisory-start --id
115
+ <mission> --specialist core:<role> --runtime claude|codex --context <actual-native-context>`.
116
+ This is a coordinator-observed usage receipt, not `specialist-event`, completion or review proof.
117
+ Never record a planned/failed start, reconstruct past receipts, or block delivery on missing
118
+ telemetry. Repeated submission of the same context is idempotent; a different role conflicts.
119
+
100
120
  Pass the returned specialist envelope unchanged: runtime, agentName, missionId,
101
121
  contextPack and, when present, reviewSubject and reviewScope. Invoke the runtime's
102
122
  native fresh-context primitive; native Agent calls are not intercepted. Keep the
@@ -108,206 +128,56 @@ Preserve the complete result; incomplete results go back to the same agent.
108
128
  With `panel.provider: orchestrator`, only ORCH launches and collects this panel.
109
129
  Missing required native capability is reported with cause and next action.
110
130
 
111
- ## Herdr adapter: recovery
112
-
113
- The following Herdr sections apply when the session-host policy selects this adapter.
114
- Native delegation without it does not require these central files or pane discovery.
115
-
116
- Read project instructions, the approved task and the current Git status. Preserve
117
- other writers' changes. Resolve the canonical Git common directory, SHA-256 its
118
- absolute real path as UTF-8, and inspect
119
- `~/.local/state/orchestra/<project>/<mission>/`. Never use an inherited workspace
120
- variable or a stale pane ID as authority. Read mission.md, the applicable
121
- workers/<label>/brief.md and report.md. Re-read `herdr pane list` before every
122
- identity decision. Match **label + worktree**, using the canonical worktree path.
123
- Refuse multiple matches, incomplete discovery, symlinks, traversal and invalid data.
124
- After reattachment/restart, ORCH atomically updates pane_id and coordinator.workspace
125
- from that validated fresh inventory. Hooks and workers never write these hints.
126
- A missing unrelated historical worktree does not invalidate a current identity.
127
-
128
- The coordinator is the existing ORCH session, never a second agent opened for display.
129
- Resolve its own label + worktree before selecting its workspace. Keep each writer
130
- in its assigned worktree. Do not affect any other project, workspace or pane.
131
- An uncertain launch or prompt acknowledgement requires reconciliation of that same
132
- worker before retrying. A timeout proves neither launch failure nor prompt loss.
133
-
134
- ## Herdr adapter: explicit coordinator context
135
-
136
- If unique discovery refuses multiple compatible missions, ORCH reads the target
137
- mission and reports, then atomically replaces its local, unversioned
138
- `<canonical worktree>/.void/machine/orchestra-selection.json`. Schema 1 is strict
139
- JSON, at most 4096 UTF-8 bytes: `{ "schema": 1, "project": "<project-sha256>",
140
- "mission": "<existing-id>", "coordinator": { "label": "ORCH", "worktree":
141
- "/absolute/canonical/worktree" } }`. ORCH alone writes it; hooks never repair it.
142
- No unknown or duplicate keys, YAML, traversal, symlinks or partial writes.
143
-
144
- This selects context only, never execution state or permissions. Full bounded
145
- central discovery still runs; malformed unrelated missions or limits refuse.
146
- A stale/invalid binding never falls back. Verify selected coordinator label and
147
- canonical worktree against the current worktree and a fresh `herdr pane list`;
148
- missing or duplicate live matches refuse. Never prefer timestamps, running status
149
- or pane tokens to decide intent. Without a binding, preserve unique discovery.
150
- Clear/compact/resume re-read selection and central state without launching workers.
151
- Separate worker worktrees retain their own mission, attempt and report discovery.
152
- A selected terminal mission retains the guarded cleanup below: never clear tokens
153
- belonging to another mission. No binding belongs in the programme descriptor.
154
-
155
- ## Herdr adapter: central files and ownership
156
-
157
- Use schema: 1 YAML frontmatter, strict string keys and one document, followed by
158
- Markdown. Reject duplicate keys, tags, anchors, aliases and unknown fields. Bound
159
- mission/report to 64 KiB, brief to 256 KiB, discovery to 64 entries and 1 MiB of
160
- mission bytes; exceeding a bound is incomplete, never a unique match.
161
- See the shipped technical contract `docs/ORCHESTRA.md` in the harness source for
162
- schemas; the operational fields are listed here so an installed skill is sufficient.
163
-
164
- - mission.md: schema, mission, project, status, updated_at
165
- (ISO with `Z` or `+HH:MM`/`-HH:MM`; prefer UTC `Z`), repository
166
- (canonical Git common path), coordinator {label, worktree, workspace?}, workers.
167
- - Worker entries: label, agent (codex or claude), worktree, branch, ticket, status,
168
- attempt; optional pane_id and session are hints only. At most four workers.
169
- - Coordinator status and worker status: planned, running, blocked, done, failed.
170
- - report.md: schema, mission, attempt, worker, branch, status (running, blocked,
171
- done, failed), commits (full SHAs), tests (passed, failed, not_run), updated_at.
172
- Body: actual commands/results, proof locations, risks, questions and remaining work.
173
- - brief.md: absolute paths, exact base, footprint, acceptance criteria, ownership,
174
- permissions, forbidden effects and current attempt. No secrets. Explicitly warn
175
- that other writers exist and their changes must be preserved.
176
-
177
- ORCH alone writes mission and briefs; each worker alone writes its report. Use an
178
- atomic replacement: write an exclusive temporary sibling, then rename. Hooks never
179
- write these files. A new work turn gets a new attempt; resume keeps its attempt.
180
- A valid report for the current mission/attempt overrides workers[].status at every
181
- event. An absent report falls back to the manifest. Malformed, foreign, partial or
182
- unrecognized stale reports refuse usage; never turn a parse failure into absence.
183
- The files carry coordination state, not independent review proof.
184
-
185
- ## Herdr adapter: copyable starting files
186
-
187
- Replace the example project hash with SHA-256 of the canonical common Git path.
188
- Replace every path, branch, ticket and timestamp from actual observations. These
189
- three files are authored by their owner, never by the hook.
190
-
191
- mission.md:
192
-
193
- ```yaml
194
- ---
195
- schema: 1
196
- mission: dev-42
197
- project: "<project-sha256>"
198
- status: planned
199
- updated_at: "2026-10-08T10:00:00.000Z"
200
- repository: /absolute/repository/.git
201
- coordinator:
202
- label: ORCH
203
- worktree: /absolute/repository
204
- workspace: wA
205
- workers:
206
- - label: WORK-1
207
- agent: codex
208
- worktree: /absolute/worktrees/dev-42
209
- branch: work/dev-42
210
- ticket: DEV-42
211
- status: planned
212
- attempt: implementation-1
213
- ---
214
- # Mission
215
- Scope, acceptance criteria, canonical mission journal and proof locations.
216
- ```
217
-
218
- workers/WORK-1/brief.md:
219
-
220
- ```yaml
221
- ---
222
- schema: 1
223
- mission: dev-42
224
- attempt: implementation-1
225
- worker: WORK-1
226
- ---
227
- # Work
228
- Worktree: /absolute/worktrees/dev-42. Branch: work/dev-42.
229
- Base: <verified full commit SHA>. Ticket: DEV-42.
230
- Footprint: <exact owned files/directories>; preserve every other writer's edits.
231
- Acceptance: <complete observable criteria and verification commands>.
232
- Limits: <role permissions, forbidden effects, human gates>.
233
- Report: /absolute/mission/workers/WORK-1/report.md, owned only by this worker.
234
- Resume: <actual runtime session and the recipe from the table below>.
235
- ```
236
-
237
- workers/WORK-1/report.md:
238
-
239
- ```yaml
240
- ---
241
- schema: 1
242
- mission: dev-42
243
- attempt: implementation-1
244
- worker: WORK-1
245
- branch: work/dev-42
246
- status: running
247
- commits: []
248
- tests: not_run
249
- updated_at: "2026-10-08T10:00:00.000Z"
250
- ---
251
- # Checkpoint
252
- Completed: <actual changes>. Verification: <commands, results and proof paths>.
253
- Remaining: <work and exact next action>. Risks/questions: <observed limitations>.
254
- ```
255
-
256
- ## Herdr adapter: durable workers
257
-
258
- Read installed `herdr --help`, `herdr agent --help` and the live schema before
259
- issuing commands. Use structured argv, exact acknowledged identities and bounded
260
- waits/output. The launch recipes for the selected worktree are:
131
+ ## Publish worker observations
261
132
 
262
- | Kind | Launch argv | Resume argv | Short contexts | ctx capability |
263
- | --- | --- | --- | --- | --- |
264
- | 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 |
265
- | 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.
266
138
 
267
- Use the selected kind's executable and preserve these options on every launch/resume:
139
+ After an actual successful native dispatch acknowledgement, publish:
268
140
 
269
141
  ```sh
270
- 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>
271
143
  ```
272
144
 
273
- The arguments after `--` belong to the selected runtime. The name is unique within
274
- the mission; it is not an invented native session ID. Resolve the pane first and
275
- keep the session ID actually returned by the runtime.
276
-
277
- Apply the role's existing permission/read-only policy; `--add-dir` only grants the
278
- specified directory, never disables a sandbox or an approval. Unsupported kind or
279
- option: diagnose and stop that launch. Do not update or restart Herdr to make it fit.
280
- Register planned worker before creating its owned surface. Keep the returned pane
281
- ID as a hint, launch once, submit the brief once, then reconcile by label + worktree.
282
- Use `herdr agent wait` in bounded slices and read the report after every turn.
283
- Idle/done is a turn ending, never proof the task passed. Request a missing report
284
- from the same session. Follow up in that session; never create a duplicate worker.
285
- After /clear read the same mission; after a killed process resume its actual session
286
- in the same worktree. Missing session: retain the mission and expose the loss.
287
-
288
- `resume_argv` is absent from Herdr 0.9.0 and 0.9.1, present from 0.9.2. Publish it
289
- only after the installed schema proves support. Otherwise retain the complete resume
290
- recipe in the brief. Never claim restart restoration was tested without doing it.
291
-
292
- ## Herdr adapter: projection and closure
293
-
294
- The hook publishes source void-machine on SessionStart startup/resume/clear/compact
295
- and Stop after re-reading central state and fresh Herdr identities. Pane tokens:
296
- mission, worker, ticket, wstatus; coordinator-only workspace: mission, wstatus, workers.
297
- These are file status, never agent state. ctx requires the selected kind's measured capability from the table; unavailable measurement stays unavailable. Clear
298
- removes ctx before fresh measurement. State TTL is 86400000 ms, ctx TTL 7200000 ms.
299
- Sequences are exact nanosecond decimal BigInts captured before discovery. Old or
300
- equal seq is ignored by Herdr. Tokens are global keys, not source namespaces: another
301
- source may overwrite them; null clears globally. Never reconfigure cockpit to win.
302
-
303
- Terminal mission cleanup explicitly clears keys on all still-resolved owned panes,
304
- only where the currently projected mission still matches. Only the resolved
305
- coordinator clears workspace keys, again after verifying the displayed mission.
306
- A late closure of A must not clear B. A worker SessionEnd never cleans the workspace.
307
- When no mission is active, recover the verified displayed terminal mission; do not
308
- choose arbitrary history. Discovery/transport errors never trigger a purge.
309
- After collection and acceptance ORCH may close its owned surfaces; retain worktrees,
310
- 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.
311
181
 
312
182
  ## Independent review
313
183
 
@@ -20,11 +20,11 @@ do not independently approve plans or start implementation.
20
20
 
21
21
  ## When to invoke
22
22
 
23
- Invoke immediately after `void-brainstorm` approves a spec. The plan is the next deliverable before any code.
23
+ Use when approved work has dependencies, several units or continuity needs worth recording. A bounded request with clear acceptance criteria can go directly to `void-implement`; a plan is not required merely because code will change.
24
24
 
25
25
  **A `source: forge` spec is a ready spec.** When `docs/specs/YYYY-MM-DD-<slug>.md` carries `source: forge` in its frontmatter (the forge→harness artifact contract), consume it **directly** — it already holds the 18 recon variables, the winning design, and the critique verdict, so `void-brainstorm` need not have run. Plan from it as-is; if it is partial (missing critique, or a field absent in an older `forge_version`), plan around the holes and flag them as the first open decisions rather than re-deriving the whole thing.
26
26
 
27
- Do NOT invoke without an approved spec. If you find yourself wanting to plan without a spec, that means brainstorm was skipped — go back.
27
+ Use the approved spec or explicit user request as the source. If a material design choice is missing, resolve that choice with `void-brainstorm`; do not restart settled discovery.
28
28
 
29
29
  ---
30
30
 
@@ -64,9 +64,7 @@ Each implementation step has this shape:
64
64
  - **Depends on**: [step-3, step-5] (or "none")
65
65
  - **TDD mode**: strict | souple | exploratory
66
66
  - **Verification gate**: <what must pass before moving to step N+1>
67
- - **Expected commits**:
68
- - `test: <reproducing or new behavior>`
69
- - `feat: <implementation>` (or `fix:` / `refactor:` per `void-commit-discipline`)
67
+ - **Expected change**: one logical, bisectable commit or dependency-ordered commits; RED/GREEN evidence is retained independently of commit boundaries
70
68
  - **Notes**: <constraints, gotchas, hook implications>
71
69
  ```
72
70
 
@@ -86,7 +84,7 @@ Each step's gate states which checks must pass before moving on. Examples:
86
84
 
87
85
  - `tsc --noEmit && vitest run --filter checkoutCart`
88
86
  - `pre-commit hooks dry-run on staged set` (composes with `tdd-guard`, `tigerstyle-check`, `no-any-grep`, etc.)
89
- - `mutation testing score ≥ 90%` (strict mode steps with critical surface)
87
+ - the configured mutation threshold, when the project has a mutation runner
90
88
 
91
89
  The gate is observable. The user sees the output before the next step begins.
92
90
 
@@ -165,7 +163,7 @@ After writing the plan, scan for:
165
163
  3. **Missing TDD mode** — every implementation step declares one? Fix.
166
164
  4. **Unrealistic dependencies** — does step N actually need step N-1, or could they parallelize?
167
165
  5. **Missing execution handoff** — a standalone plan has a correct resume point; a tracker-backed program has the complete stable order/dependency table?
168
- 6. **Frontmatter `spec:`** — links back to the approved spec?
166
+ 6. **Source of authority** — links to the approved spec when present, otherwise records the explicit request?
169
167
  7. **Executability gate** (vendored from gstack `/spec`) — could an *unfamiliar* implementer or agent execute this plan with **zero follow-up questions**? Walk one step as if you'd never seen the codebase: is every file named, every metric quantified, every acceptance criterion observable? Any "figure it out at implementation time" is an ambiguity to resolve now.
170
168
 
171
169
  Fix inline. Then user-review gate.
@@ -174,12 +172,9 @@ Fix inline. Then user-review gate.
174
172
 
175
173
  ## User-review gate
176
174
 
177
- Ask the user to review the plan before execution begins:
178
-
179
- > "Plan written and committed to `docs/plans/<file>.md`. Please review and let me know if you want changes before we start executing."
180
-
181
- Wait for response. If changes requested, make them and re-run self-review.
182
-
175
+ For already authorized scope, do not request approval again for the plan's formatting or routine
176
+ sequencing. Link the plan and proceed. Ask only for a new consequential choice, expanded scope
177
+ or declared human gate; continue independent authorized work while it is unresolved.
183
178
  ---
184
179
 
185
180
  ## Transition to execution
@@ -213,7 +208,7 @@ Set `high_risk: true` when the plan touches:
213
208
 
214
209
  ## Composition with other skills
215
210
 
216
- - **Upstream — `void-brainstorm`**: the approved spec is the input.
211
+ - **Upstream**: the approved `void-brainstorm` spec or explicit complete user request supplies scope.
217
212
  - **Downstream — `void-ticket`**: converts a multi-ticket plan into native tracker items and installs its active handoff.
218
213
  - **Downstream — `void-implement`**: executes one complete ticket and maintains its tracker lifecycle.
219
214
  - **With `void-autopilot`**: drains independent ready tickets only through its attended flow.
@@ -227,11 +222,11 @@ Set `high_risk: true` when the plan touches:
227
222
 
228
223
  ## Anti-rules
229
224
 
230
- - MUST NOT plan without an approved spec.
225
+ - MUST NOT invent scope beyond the approved spec or explicit request.
231
226
  - MUST NOT skip TDD mode declaration per implementation step.
232
227
  - MUST NOT skip verification gates per step.
233
228
  - MUST NOT omit the applicable execution handoff: resume point for standalone work, tracker table for a multi-ticket program.
234
- - MUST NOT skip the spec link in frontmatter.
229
+ - MUST NOT omit the source of authority: link the spec when present, otherwise record the explicit request.
235
230
  - MUST NOT execute the plan (downstream skills do that).
236
231
 
237
232
  ---
@@ -239,7 +234,7 @@ Set `high_risk: true` when the plan touches:
239
234
  ## Final rule
240
235
 
241
236
  ```
242
- Approved spec → plan written → self-review → user approves → ticket or implement.
237
+ Approved scope → useful sequence → self-review → resolve only new decisions → ticket or implement.
243
238
  Otherwise → it is not voidcorp plan.
244
239
  ```
245
240
 
@@ -5,7 +5,7 @@ description: "Live browser QA of a running web app via the claude-in-chrome MCP:
5
5
 
6
6
  # qa — voidcorp craftsman edition
7
7
 
8
- You are a QA engineer AND a bug-fix engineer. Test a running web app like a real user — click everything, fill every form, check every state — using the **claude-in-chrome MCP** to drive the browser. When you find a bug, fix it in source with an atomic commit, then re-verify. Produce a structured report with before/after evidence.
8
+ You are a QA engineer AND a bug-fix engineer. Test a running web app like a real user within the selected scope, exercising its controls, forms and relevant states, using the **claude-in-chrome MCP** to drive the browser. When you find a bug, fix it in source with an atomic commit, then re-verify. Produce a structured report with before/after evidence.
9
9
 
10
10
  This tests the *shipped, running app* through a real browser. It is not unit/E2E authoring (`void-tdd` + `void-testing` own that), and it does not judge visual craft from code (`void-ui-review` owns that — this skill composes it for the live visual pass).
11
11
 
@@ -52,10 +52,10 @@ Command mapping from the old gstack browse (`$B`) to the MCP:
52
52
 
53
53
  ## Modes
54
54
 
55
- - **Diff-aware** (default on a feature branch with no URL) — read the branch diff, map changed files to affected pages/routes, detect the local dev server, test only those pages plus a homepage smoke. The common case.
56
- - **Full** (a URL is given) — systematic exploration of every reachable page; 5-10 well-evidenced issues; health score.
55
+ - **Diff-aware** (default for change verification, including when its URL is supplied) — read the diff, map the changed contract to affected pages, controls, states and viewports. Test the homepage only when it is affected or is a required entry path to that contract. Preserve mobile/desktop and keyboard/touch verification of the affected surface.
56
+ - **Full** (explicitly requested audit) — systematic exploration across the requested site scope, evidence-backed issues and health score. A URL alone identifies the target; it does not select a full audit.
57
57
  - **Quick** (`--quick`) — 30-second smoke: homepage + top 5 nav targets, load + console + broken links only.
58
- - **Regression** (`--regression <baseline.json>`) — run full, then diff against a prior baseline: fixed vs new vs score delta.
58
+ - **Regression** (`--regression <baseline.json>`) — run the explicitly requested baseline scope, then compare fixed/new issues and applicable score changes.
59
59
  - **Report-only** (`--report-only`, the old `/qa-only`) — phases through Report, then STOP. No fix loop, no commits.
60
60
 
61
61
  ## Precondition: clean working tree
@@ -65,18 +65,18 @@ Each fix must be its own atomic commit, so before fixing, `git status --porcelai
65
65
  ## Workflow
66
66
 
67
67
  1. **Orient** — `tabs_context_mcp`, open the target in a new tab, screenshot, read the page, check console. Detect the framework (Next.js `__next` / `_next/data`; Rails `csrf-token`; SPA = client routing) and note it. For an SPA, map nav from `read_page` (client routes, not raw links).
68
- 2. **Explore** — visit pages systematically. Per page: visual scan of the screenshot; click interactive elements; fill + submit forms (empty, invalid, edge, overflow); walk navigation in and out; exercise **the states a user actually hits — empty, loading, error, overflow**; check console after every interaction; for responsive, `resize_window` then **verify the screenshot dimensions actually changed** — on some setups it resizes the window without re-rendering to a true mobile viewport, so confirm before trusting a "mobile" shot (else note responsive as unverified). Depth over breadth: more time on core flows (auth, checkout, search), less on static pages.
68
+ 2. **Explore** — visit only the selected mode's pages and affected states. Per page: visual scan of the screenshot; click interactive elements; fill + submit forms (empty, invalid, edge, overflow); walk navigation in and out; exercise **the states a user actually hits — empty, loading, error, overflow**; check console after every interaction; for responsive, `resize_window` then **verify the screenshot dimensions actually changed** — on some setups it resizes the window without re-rendering to a true mobile viewport, so confirm before trusting a "mobile" shot (else note responsive as unverified). Depth over breadth: more time on core flows (auth, checkout, search), less on static pages.
69
69
  3. **Document** — write each issue the moment you find it, never batch. Two evidence tiers: an **interactive** bug gets a before-screenshot, the action, an after-screenshot (a `gif_creator` repro for a flow); a **static** bug gets one annotated screenshot. Verify a bug reproduces once before writing it. For a UI quality pass, capture mobile and desktop for every applicable state and bind each capture to the current diff hash; a later CSS/UI diff makes it stale. Redact credentials (`[REDACTED]`). Surface every screenshot to the user (Read the file) — otherwise it is invisible.
70
- 4. **Health score** — per-category 0-100 (Console, Links, Visual, Functional, UX, Performance, Content, Accessibility) minus severity deductions (critical -25 / high -15 / medium -8 / low -3), weighted average. Record it as the baseline.
71
- 5. **Visual pass** — for visual/interaction judgment on the live screenshots, compose `void-ui-review`, then hand the current-diff evidence to `core:visual-craft-director` in fresh context. This skill drives the browser; `void-ui-review` supplies the craft bar; the specialist owns the independent verdict. If the browser or required captures are unavailable, report the UI pass blocked rather than certifying from prose.
72
- 6. **Triage** — sort by severity; fix per tier: `--quick` critical+high · standard (default) +medium · `--exhaustive` +low. Mark unfixable-from-source (third-party, infra) as deferred.
73
- 7. **Fix loop** (skipped in report-only) — per issue in severity order: locate source (grep/glob — only now do you read code); make the **minimal** fix (no refactor, no scope creep); commit one fix `fix(qa): <issue> — <desc>`; re-test the page with a before/after pair + console + a regression test that reproduces the bug (compose `void-tdd`/`void-testing` — assert behavior, not "it renders"); classify **verified / best-effort / reverted** (`git revert` on a regression → defer).
74
- 8. **Self-regulation** — every 5 fixes or after any revert, stop and evaluate: reverts, fixes touching many files, all-low-severity remaining, and unrelated-file edits all raise the "this is going wrong" signal. Above the threshold, or past a hard cap of ~50 fixes, STOP and show the user before continuing.
75
- 9. **Report** — issues with severity + evidence + fix status (verified/best-effort/reverted/deferred) + commit SHA; health-score delta baseline → final; a one-line PR summary ("QA found N, fixed M, health X → Y"). If the final score is worse than baseline, warn prominently. Write it under the project's report location, not `~/.gstack`.
70
+ 4. **Health score** (only for an explicitly requested full audit or scored baseline) — per-category 0-100 (Console, Links, Visual, Functional, UX, Performance, Content, Accessibility) minus severity deductions (critical -25 / high -15 / medium -8 / low -3), weighted average. Record it as the baseline.
71
+ 5. **Visual pass** (only for an explicitly requested visual audit, a new or materially redesigned journey, or an unresolved in-scope usability defect) — compose `void-ui-review` and hand the relevant current-diff screenshots to `core:visual-craft-director` in fresh context. Routine diff-aware verification retains its affected screenshots and functional/accessibility checks without a full visual audit or another specialist invocation. This skill drives the browser; `void-ui-review` supplies the craft bar; the specialist owns the independent verdict. If the browser or required captures are unavailable, report the UI pass blocked rather than certifying from prose.
72
+ 6. **Triage** — Diff-aware verification fixes only demonstrated in-scope blocking defects in the changed contract. Findings outside that scope are reported as limits or separate decisions; do not enter the fix loop for them or for optional improvements. For explicitly requested broad audits, the authorized tiers remain `--quick` critical+high, full critical+high+medium, `--exhaustive` all severities. Severity alone never expands the authorized scope. Mark unfixable-from-source issues as deferred.
73
+ 7. **Fix loop** (skipped in report-only) — for an authorized defect, locate its source, write and observe the failing regression before implementation (`void-tdd`/`void-testing`), make the minimal correction, then verify the affected behavior, screenshots and console. Commit the logical fix `fix(qa): <issue>` with its cause and actual proof. Classify verified / best-effort / reverted; a regression must be resolved or reverted without claiming success. In diff-aware delivery, reuse `void-implement`'s existing bounded correction cycle and stop once the affected contract is proven; no extra QA improvement loop.
74
+ 8. **Self-regulation** (explicit broad audit) — every 5 fixes or after any revert, stop and evaluate: reverts, fixes touching many files, all-low-severity remaining, and unrelated-file edits all raise the "this is going wrong" signal. Above the threshold, or past a hard cap of ~50 fixes, STOP and show the user before continuing.
75
+ 9. **Report** — state the scope, affected states/viewports verified, real defects, proof, fix status and material limits. Include a health-score delta only when that mode requested a score. A local change needs no whole-site score or unrelated N/A rows. Write under the project's report location, not `~/.gstack`.
76
76
 
77
77
  ## Composition & boundaries
78
78
 
79
- - **With `void-ui-review`** — this skill owns driving the browser and the functional/fix loop; `void-ui-review` owns the visual-craft judgment applied to the live screenshots (step 5). No restated design rules here.
79
+ - **With `void-ui-review`** — this skill owns driving the browser and the functional/fix loop; `void-ui-review` owns the visual-craft judgment when step 5 applies; local diff-aware verification does not automatically invoke a full audit. No restated design rules here.
80
80
  - **With `void-tdd` / `void-testing`** — the regression test in the fix loop is authored per their discipline. This skill finds bugs in a running app; they own how the test that locks the fix is written.
81
81
  - **Not `void-devex-audit`** — that audits a developer-facing surface (API/CLI/SDK/docs journey, TTHW); this QAs an end-user web app in a browser. Different surface.
82
82
  - **Not E2E authoring** — Playwright suites are `void-testing`'s output; this is exploratory human-style QA of the deployed thing.
@@ -95,8 +95,9 @@ Each fix must be its own atomic commit, so before fixing, `git status --porcelai
95
95
  ## Final rule
96
96
 
97
97
  ```
98
- Running app → load claude-in-chrome (tabs_context first) → orient → explore every state → document with
99
- evidence → score → triage → atomic fix + regression test + re-verify → self-regulate → report.
98
+ Running app → select authorized scope → load browser → verify affected states/viewports →
99
+ record evidence → fix only in-scope defects with RED/GREEN → stop when proven → report.
100
+ Scoring and broad visual exploration apply only to the modes that request them.
100
101
  Report-only stops before the fix loop. Otherwise → it is not voidcorp qa.
101
102
  ```
102
103