voidmachine 4.0.0 → 5.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.
- package/core-assets/.claude-plugin/plugin.json +33 -1
- package/core-assets/agents/independent-code-reviewer.md +1 -0
- package/core-assets/codex/hooks.json +16 -1
- package/core-assets/data/catalog.v3.json +67 -19
- package/core-assets/data/certification.json +27 -1
- package/core-assets/data/model.json +48 -18
- package/core-assets/hooks/_void-hook.mjs +12723 -2734
- package/core-assets/skills/void-autopilot/SKILL.md +109 -73
- package/core-assets/skills/void-brainstorm/SKILL.md +7 -0
- package/core-assets/skills/void-context/SKILL.md +2 -3
- package/core-assets/skills/void-implement/SKILL.md +16 -7
- package/core-assets/skills/void-orchestrate/.source +16 -0
- package/core-assets/skills/void-orchestrate/SKILL.md +311 -0
- package/core-assets/skills/void-orchestrate/harness.yaml +10 -0
- package/core-assets/skills/void-plan/SKILL.md +7 -0
- package/core-assets/skills/void-security-guidance/.source +1 -0
- package/core-assets/skills/void-security-guidance/SKILL.md +42 -3
- package/core-assets/skills/void-ticket/SKILL.md +2 -3
- package/core-assets/specialists/independent-code-reviewer.yaml +1 -0
- package/dist/main.js +34793 -21621
- package/package.json +5 -3
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
---
|
|
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.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Orchestrate
|
|
7
|
+
|
|
8
|
+
The user-facing coordinator keeps intent, decisions and synthesis. This skill owns
|
|
9
|
+
adaptive delegation, transport and continuity; `void-implement` owns delivery quality
|
|
10
|
+
and `void-autopilot` its loop. Neither a pane nor a report grants merge permission.
|
|
11
|
+
|
|
12
|
+
## Choose work and capabilities
|
|
13
|
+
|
|
14
|
+
Read project instructions, the approved task and Git state; preserve other writers'
|
|
15
|
+
changes. Before dispatch, inspect the actual native agent tools and their supported
|
|
16
|
+
context, permissions, completion and resume capabilities. Use the best supported
|
|
17
|
+
capabilities for the task in the current session; an installed executable or an
|
|
18
|
+
environment hint alone does not validate a host, identity or permission.
|
|
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.
|
|
30
|
+
|
|
31
|
+
- Work directly for a tiny targeted change, a single tool call, mechanical processing,
|
|
32
|
+
or tightly coupled work where delegation adds no useful separation.
|
|
33
|
+
- Delegate bounded independent research and exploration during brainstorm and plan.
|
|
34
|
+
Keep the user conversation, evaluation of sources and decisions in the coordinator.
|
|
35
|
+
- Delegate substantial implementation to one writer when supported. A writer
|
|
36
|
+
already assigned the unit executes it; never delegate the same complete workflow
|
|
37
|
+
recursively. Retain that writer for corrections. Before parallel feature slices,
|
|
38
|
+
define disjoint ownership, dependencies and acceptance of the integrated result.
|
|
39
|
+
- No native agent capability: execute sequentially and state the limitation. A
|
|
40
|
+
mandatory independent review or required isolation remains a blocker; do not
|
|
41
|
+
replace it with self-review or silently weaken its requirement.
|
|
42
|
+
|
|
43
|
+
## Brief and bound the delegation
|
|
44
|
+
|
|
45
|
+
Use a fresh context by default. Choose a supported fork only when the task needs
|
|
46
|
+
conversation history. Give objective, relevant context/source revision, owned paths,
|
|
47
|
+
permissions, acceptance, result format and bounds. Tell writers they are not alone
|
|
48
|
+
and must preserve others' changes. Ask researchers for conclusions, source references,
|
|
49
|
+
uncertainty and remaining questions, not all intermediate logs. Ordinary research
|
|
50
|
+
uses this lightweight brief: do not invent specialist events or review receipts.
|
|
51
|
+
Formal specialist envelopes and evidence follow the independent contract below.
|
|
52
|
+
|
|
53
|
+
Count writer, research and review children together against observed available runtime slots
|
|
54
|
+
and the coordinator's bounded dispatch; queue work when full. Preserve tighter caller
|
|
55
|
+
limits, including Autopilot's ticket cap and the central schema's four-worker limit.
|
|
56
|
+
This is no machine-wide quota. Do not create recursive child coordinators or redispatch
|
|
57
|
+
the same complete workflow. Required formal specialists remain dispatched by their
|
|
58
|
+
designated owner within the shared available capacity. Do not duplicate a child's work
|
|
59
|
+
in the coordinator. Run independent work concurrently only when it helps the critical
|
|
60
|
+
path; use ordinary tools for mechanical operations. Respect permissions throughout.
|
|
61
|
+
|
|
62
|
+
Read-only research needs no new worktree. Reviews use an immutable exact subject.
|
|
63
|
+
Concurrent authors need isolated assigned worktrees and disjoint ownership; if
|
|
64
|
+
isolation fails, serialize rather than share concurrent writes. Required isolation
|
|
65
|
+
that cannot be met stays blocked. A sole writer may reuse its assigned checkout;
|
|
66
|
+
Autopilot retains its per-ticket worktree requirement. Follow the universal durable
|
|
67
|
+
worktree invariant and existing shared Git restrictions, irrespective of display.
|
|
68
|
+
|
|
69
|
+
## Collect and resume honestly
|
|
70
|
+
|
|
71
|
+
Prefer native completion events; otherwise wait in bounded slices. A wait timeout
|
|
72
|
+
is not failure. Reconcile an uncertain launch or side effect before retrying. Use
|
|
73
|
+
partial results when useful, distinguish failure from missing output, and verify
|
|
74
|
+
acceptance before claiming success. Reuse the same session for corrections; confirm
|
|
75
|
+
that a new instruction was consumed or reflected in the result before calling it applied.
|
|
76
|
+
|
|
77
|
+
Distinguish saved work, live session, retained result and delivered result. A finished
|
|
78
|
+
turn or report alone proves no accepted outcome or crash recovery. Use the selected
|
|
79
|
+
runtime's actual persistence/recovery path; expose a lost session or unknown effects.
|
|
80
|
+
Never invent a durable inbox. Preserve formal receipts separately from working notes.
|
|
81
|
+
|
|
82
|
+
## Short native specialists
|
|
83
|
+
|
|
84
|
+
Pass the returned specialist envelope unchanged: runtime, agentName, missionId,
|
|
85
|
+
contextPack and, when present, reviewSubject and reviewScope. Invoke the runtime's
|
|
86
|
+
native fresh-context primitive; native Agent calls are not intercepted. Keep the
|
|
87
|
+
real opaque context ID exactly as returned, including slash-prefixed names; it is
|
|
88
|
+
data, never a filesystem path. Record actual starts/completions with
|
|
89
|
+
`mission specialist-event`; never invent IDs or convert a failed call into a review.
|
|
90
|
+
Before another invocation, reconcile any existing invocation for the same envelope.
|
|
91
|
+
Preserve the complete result; incomplete results go back to the same agent.
|
|
92
|
+
With `panel.provider: orchestrator`, only ORCH launches and collects this panel.
|
|
93
|
+
Missing required native capability is reported with cause and next action.
|
|
94
|
+
|
|
95
|
+
## Herdr adapter: recovery
|
|
96
|
+
|
|
97
|
+
The following Herdr sections apply when the session-host policy selects this adapter.
|
|
98
|
+
Native delegation without it does not require these central files or pane discovery.
|
|
99
|
+
|
|
100
|
+
Read project instructions, the approved task and the current Git status. Preserve
|
|
101
|
+
other writers' changes. Resolve the canonical Git common directory, SHA-256 its
|
|
102
|
+
absolute real path as UTF-8, and inspect
|
|
103
|
+
`~/.local/state/orchestra/<project>/<mission>/`. Never use an inherited workspace
|
|
104
|
+
variable or a stale pane ID as authority. Read mission.md, the applicable
|
|
105
|
+
workers/<label>/brief.md and report.md. Re-read `herdr pane list` before every
|
|
106
|
+
identity decision. Match **label + worktree**, using the canonical worktree path.
|
|
107
|
+
Refuse multiple matches, incomplete discovery, symlinks, traversal and invalid data.
|
|
108
|
+
After reattachment/restart, ORCH atomically updates pane_id and coordinator.workspace
|
|
109
|
+
from that validated fresh inventory. Hooks and workers never write these hints.
|
|
110
|
+
A missing unrelated historical worktree does not invalidate a current identity.
|
|
111
|
+
|
|
112
|
+
The coordinator is the existing ORCH session, never a second agent opened for display.
|
|
113
|
+
Resolve its own label + worktree before selecting its workspace. Keep each writer
|
|
114
|
+
in its assigned worktree. Do not affect any other project, workspace or pane.
|
|
115
|
+
An uncertain launch or prompt acknowledgement requires reconciliation of that same
|
|
116
|
+
worker before retrying. A timeout proves neither launch failure nor prompt loss.
|
|
117
|
+
|
|
118
|
+
## Herdr adapter: explicit coordinator context
|
|
119
|
+
|
|
120
|
+
If unique discovery refuses multiple compatible missions, ORCH reads the target
|
|
121
|
+
mission and reports, then atomically replaces its local, unversioned
|
|
122
|
+
`<canonical worktree>/.void/machine/orchestra-selection.json`. Schema 1 is strict
|
|
123
|
+
JSON, at most 4096 UTF-8 bytes: `{ "schema": 1, "project": "<project-sha256>",
|
|
124
|
+
"mission": "<existing-id>", "coordinator": { "label": "ORCH", "worktree":
|
|
125
|
+
"/absolute/canonical/worktree" } }`. ORCH alone writes it; hooks never repair it.
|
|
126
|
+
No unknown or duplicate keys, YAML, traversal, symlinks or partial writes.
|
|
127
|
+
|
|
128
|
+
This selects context only, never execution state or permissions. Full bounded
|
|
129
|
+
central discovery still runs; malformed unrelated missions or limits refuse.
|
|
130
|
+
A stale/invalid binding never falls back. Verify selected coordinator label and
|
|
131
|
+
canonical worktree against the current worktree and a fresh `herdr pane list`;
|
|
132
|
+
missing or duplicate live matches refuse. Never prefer timestamps, running status
|
|
133
|
+
or pane tokens to decide intent. Without a binding, preserve unique discovery.
|
|
134
|
+
Clear/compact/resume re-read selection and central state without launching workers.
|
|
135
|
+
Separate worker worktrees retain their own mission, attempt and report discovery.
|
|
136
|
+
A selected terminal mission retains the guarded cleanup below: never clear tokens
|
|
137
|
+
belonging to another mission. No binding belongs in the programme descriptor.
|
|
138
|
+
|
|
139
|
+
## Herdr adapter: central files and ownership
|
|
140
|
+
|
|
141
|
+
Use schema: 1 YAML frontmatter, strict string keys and one document, followed by
|
|
142
|
+
Markdown. Reject duplicate keys, tags, anchors, aliases and unknown fields. Bound
|
|
143
|
+
mission/report to 64 KiB, brief to 256 KiB, discovery to 64 entries and 1 MiB of
|
|
144
|
+
mission bytes; exceeding a bound is incomplete, never a unique match.
|
|
145
|
+
See the shipped technical contract `docs/ORCHESTRA.md` in the harness source for
|
|
146
|
+
schemas; the operational fields are listed here so an installed skill is sufficient.
|
|
147
|
+
|
|
148
|
+
- mission.md: schema, mission, project, status, updated_at (UTC ISO), repository
|
|
149
|
+
(canonical Git common path), coordinator {label, worktree, workspace?}, workers.
|
|
150
|
+
- Worker entries: label, agent (codex or claude), worktree, branch, ticket, status,
|
|
151
|
+
attempt; optional pane_id and session are hints only. At most four workers.
|
|
152
|
+
- Coordinator status and worker status: planned, running, blocked, done, failed.
|
|
153
|
+
- report.md: schema, mission, attempt, worker, branch, status (running, blocked,
|
|
154
|
+
done, failed), commits (full SHAs), tests (passed, failed, not_run), updated_at.
|
|
155
|
+
Body: actual commands/results, proof locations, risks, questions and remaining work.
|
|
156
|
+
- brief.md: absolute paths, exact base, footprint, acceptance criteria, ownership,
|
|
157
|
+
permissions, forbidden effects and current attempt. No secrets. Explicitly warn
|
|
158
|
+
that other writers exist and their changes must be preserved.
|
|
159
|
+
|
|
160
|
+
ORCH alone writes mission and briefs; each worker alone writes its report. Use an
|
|
161
|
+
atomic replacement: write an exclusive temporary sibling, then rename. Hooks never
|
|
162
|
+
write these files. A new work turn gets a new attempt; resume keeps its attempt.
|
|
163
|
+
A valid report for the current mission/attempt overrides workers[].status at every
|
|
164
|
+
event. An absent report falls back to the manifest. Malformed, foreign, partial or
|
|
165
|
+
unrecognized stale reports refuse usage; never turn a parse failure into absence.
|
|
166
|
+
The files carry coordination state, not independent review proof.
|
|
167
|
+
|
|
168
|
+
## Herdr adapter: copyable starting files
|
|
169
|
+
|
|
170
|
+
Replace the example project hash with SHA-256 of the canonical common Git path.
|
|
171
|
+
Replace every path, branch, ticket and timestamp from actual observations. These
|
|
172
|
+
three files are authored by their owner, never by the hook.
|
|
173
|
+
|
|
174
|
+
mission.md:
|
|
175
|
+
|
|
176
|
+
```yaml
|
|
177
|
+
---
|
|
178
|
+
schema: 1
|
|
179
|
+
mission: dev-42
|
|
180
|
+
project: "<project-sha256>"
|
|
181
|
+
status: planned
|
|
182
|
+
updated_at: "2026-10-08T10:00:00.000Z"
|
|
183
|
+
repository: /absolute/repository/.git
|
|
184
|
+
coordinator:
|
|
185
|
+
label: ORCH
|
|
186
|
+
worktree: /absolute/repository
|
|
187
|
+
workspace: wA
|
|
188
|
+
workers:
|
|
189
|
+
- label: WORK-1
|
|
190
|
+
agent: codex
|
|
191
|
+
worktree: /absolute/worktrees/dev-42
|
|
192
|
+
branch: work/dev-42
|
|
193
|
+
ticket: DEV-42
|
|
194
|
+
status: planned
|
|
195
|
+
attempt: implementation-1
|
|
196
|
+
---
|
|
197
|
+
# Mission
|
|
198
|
+
Scope, acceptance criteria, canonical mission journal and proof locations.
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
workers/WORK-1/brief.md:
|
|
202
|
+
|
|
203
|
+
```yaml
|
|
204
|
+
---
|
|
205
|
+
schema: 1
|
|
206
|
+
mission: dev-42
|
|
207
|
+
attempt: implementation-1
|
|
208
|
+
worker: WORK-1
|
|
209
|
+
---
|
|
210
|
+
# Work
|
|
211
|
+
Worktree: /absolute/worktrees/dev-42. Branch: work/dev-42.
|
|
212
|
+
Base: <verified full commit SHA>. Ticket: DEV-42.
|
|
213
|
+
Footprint: <exact owned files/directories>; preserve every other writer's edits.
|
|
214
|
+
Acceptance: <complete observable criteria and verification commands>.
|
|
215
|
+
Limits: <role permissions, forbidden effects, human gates>.
|
|
216
|
+
Report: /absolute/mission/workers/WORK-1/report.md, owned only by this worker.
|
|
217
|
+
Resume: <actual runtime session and the recipe from the table below>.
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
workers/WORK-1/report.md:
|
|
221
|
+
|
|
222
|
+
```yaml
|
|
223
|
+
---
|
|
224
|
+
schema: 1
|
|
225
|
+
mission: dev-42
|
|
226
|
+
attempt: implementation-1
|
|
227
|
+
worker: WORK-1
|
|
228
|
+
branch: work/dev-42
|
|
229
|
+
status: running
|
|
230
|
+
commits: []
|
|
231
|
+
tests: not_run
|
|
232
|
+
updated_at: "2026-10-08T10:00:00.000Z"
|
|
233
|
+
---
|
|
234
|
+
# Checkpoint
|
|
235
|
+
Completed: <actual changes>. Verification: <commands, results and proof paths>.
|
|
236
|
+
Remaining: <work and exact next action>. Risks/questions: <observed limitations>.
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
## Herdr adapter: durable workers
|
|
240
|
+
|
|
241
|
+
Read installed `herdr --help`, `herdr agent --help` and the live schema before
|
|
242
|
+
issuing commands. Use structured argv, exact acknowledged identities and bounded
|
|
243
|
+
waits/output. The launch recipes for the selected worktree are:
|
|
244
|
+
|
|
245
|
+
| Kind | Launch argv | Resume argv | Short contexts | ctx capability |
|
|
246
|
+
| --- | --- | --- | --- | --- |
|
|
247
|
+
| 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 |
|
|
248
|
+
| claude | `--add-dir <absolute-mission>` | `--resume <actual-session> --add-dir <absolute-mission>` | Native Agent, no interception | Fresh transcript usage plus required context.windowTokens |
|
|
249
|
+
|
|
250
|
+
Use the selected kind's executable and preserve these options on every launch/resume:
|
|
251
|
+
|
|
252
|
+
```sh
|
|
253
|
+
herdr agent start <unique-mission-worker-name> --kind <kind> --pane <resolved-pane> -- <argv-from-table>
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
The arguments after `--` belong to the selected runtime. The name is unique within
|
|
257
|
+
the mission; it is not an invented native session ID. Resolve the pane first and
|
|
258
|
+
keep the session ID actually returned by the runtime.
|
|
259
|
+
|
|
260
|
+
Apply the role's existing permission/read-only policy; `--add-dir` only grants the
|
|
261
|
+
specified directory, never disables a sandbox or an approval. Unsupported kind or
|
|
262
|
+
option: diagnose and stop that launch. Do not update or restart Herdr to make it fit.
|
|
263
|
+
Register planned worker before creating its owned surface. Keep the returned pane
|
|
264
|
+
ID as a hint, launch once, submit the brief once, then reconcile by label + worktree.
|
|
265
|
+
Use `herdr agent wait` in bounded slices and read the report after every turn.
|
|
266
|
+
Idle/done is a turn ending, never proof the task passed. Request a missing report
|
|
267
|
+
from the same session. Follow up in that session; never create a duplicate worker.
|
|
268
|
+
After /clear read the same mission; after a killed process resume its actual session
|
|
269
|
+
in the same worktree. Missing session: retain the mission and expose the loss.
|
|
270
|
+
|
|
271
|
+
`resume_argv` is absent from Herdr 0.9.0 and 0.9.1, present from 0.9.2. Publish it
|
|
272
|
+
only after the installed schema proves support. Otherwise retain the complete resume
|
|
273
|
+
recipe in the brief. Never claim restart restoration was tested without doing it.
|
|
274
|
+
|
|
275
|
+
## Herdr adapter: projection and closure
|
|
276
|
+
|
|
277
|
+
The hook publishes source void-machine on SessionStart startup/resume/clear/compact
|
|
278
|
+
and Stop after re-reading central state and fresh Herdr identities. Pane tokens:
|
|
279
|
+
mission, worker, ticket, wstatus; coordinator-only workspace: mission, wstatus, workers.
|
|
280
|
+
These are file status, never agent state. ctx requires the selected kind's measured capability from the table; unavailable measurement stays unavailable. Clear
|
|
281
|
+
removes ctx before fresh measurement. State TTL is 86400000 ms, ctx TTL 7200000 ms.
|
|
282
|
+
Sequences are exact nanosecond decimal BigInts captured before discovery. Old or
|
|
283
|
+
equal seq is ignored by Herdr. Tokens are global keys, not source namespaces: another
|
|
284
|
+
source may overwrite them; null clears globally. Never reconfigure cockpit to win.
|
|
285
|
+
|
|
286
|
+
Terminal mission cleanup explicitly clears keys on all still-resolved owned panes,
|
|
287
|
+
only where the currently projected mission still matches. Only the resolved
|
|
288
|
+
coordinator clears workspace keys, again after verifying the displayed mission.
|
|
289
|
+
A late closure of A must not clear B. A worker SessionEnd never cleans the workspace.
|
|
290
|
+
When no mission is active, recover the verified displayed terminal mission; do not
|
|
291
|
+
choose arbitrary history. Discovery/transport errors never trigger a purge.
|
|
292
|
+
After collection and acceptance ORCH may close its owned surfaces; retain worktrees,
|
|
293
|
+
branches and evidence according to their own lifecycle. Do not close the coordinator.
|
|
294
|
+
|
|
295
|
+
## Independent review
|
|
296
|
+
|
|
297
|
+
Commit the candidate before the independent pass. Keep a fresh read-only reviewer,
|
|
298
|
+
different from the writer, on the exact reviewedCommit, baseCommit and
|
|
299
|
+
acceptanceCriteriaHash. Preserve its actual canonical request/start/completion and
|
|
300
|
+
receipt (native-context or supported review-artifact provenance). Artifact provenance
|
|
301
|
+
stays within the existing project boundary and must match its digest and invocation.
|
|
302
|
+
A central report marked done is never a review receipt. Preserve limitations honestly.
|
|
303
|
+
|
|
304
|
+
For autopilot, `autopilot review --ticket <id> --pr <n> --head <sha> --round <1|2>
|
|
305
|
+
--mission <canonical-id>` checks the target ticket against the existing bounded ticket reader (filename identity
|
|
306
|
+
and frozen content hash), then prepares the exact review subject/worktree and, when
|
|
307
|
+
pending, returns awaiting-native-review. ORCH performs the native invocation and
|
|
308
|
+
records its real receipts, then repeats the same command to collect. Do not start a
|
|
309
|
+
new mission to repair a pending attempt. Budgets, protected paths, HEAD drift checks,
|
|
310
|
+
local verdict admission and merge holds remain enforced. In-flight legacy runs are
|
|
311
|
+
collected through their existing transport and journals; never duplicate them.
|
|
@@ -11,6 +11,13 @@ The spec answers "what should we build." This skill answers "in what order, with
|
|
|
11
11
|
|
|
12
12
|
---
|
|
13
13
|
|
|
14
|
+
## Delegated investigation
|
|
15
|
+
|
|
16
|
+
Invoke `void-orchestrate` for independent dependency, codebase or verification
|
|
17
|
+
investigations that inform the plan. The coordinator integrates the results into
|
|
18
|
+
one dependency graph and retains scope, sequencing and approval decisions; agents
|
|
19
|
+
do not independently approve plans or start implementation.
|
|
20
|
+
|
|
14
21
|
## When to invoke
|
|
15
22
|
|
|
16
23
|
Invoke immediately after `void-brainstorm` approves a spec. The plan is the next deliverable before any code.
|
|
@@ -3,6 +3,7 @@ Sources for `void-security-guidance` skill (see `docs/plans/skill-audits/void-se
|
|
|
3
3
|
- security-audit — the deep-audit ceiling; full audits delegated there (was gstack /cso, vendored in DEV-387).
|
|
4
4
|
- citypaul/.dotfiles security stance — daily defaults.
|
|
5
5
|
- OWASP cheat sheets — https://cheatsheetseries.owasp.org — Input Validation, Auth, Session Mgmt, LLM cheat sheets referenced.
|
|
6
|
+
- OWASP Secrets Management Cheat Sheet — https://cheatsheetseries.owasp.org/cheatsheets/Secrets_Management_Cheat_Sheet.html — least privilege, automation, bounded lifetime and metadata auditing; adapted for model-invisible external operations (DEV-1020).
|
|
6
7
|
- OWASP Top 10 for LLMs — https://owasp.org/www-project-top-10-for-large-language-model-applications/ — prompt injection, data leakage.
|
|
7
8
|
- semgrep rule packs — https://semgrep.dev — opt-in CI tool.
|
|
8
9
|
- Better-Auth docs — https://www.better-auth.com/ — default auth provider in void-starter.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: void-security-guidance
|
|
3
|
-
description:
|
|
3
|
+
description: Secure defaults at trust boundaries and scoped credential operations. Zod input, app secrets via env, confidential external provisioning, SQL parameterized, Better-Auth, untrusted LLM I/O. Deep audits use void-security-audit.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# security-guidance — voidcorp craftsman edition
|
|
@@ -54,7 +54,7 @@ The validated output is a typed value (often a branded type). No `as` cast requi
|
|
|
54
54
|
|
|
55
55
|
---
|
|
56
56
|
|
|
57
|
-
##
|
|
57
|
+
## Application secrets — env vars, validated, never logged
|
|
58
58
|
|
|
59
59
|
### Allowed
|
|
60
60
|
|
|
@@ -100,6 +100,43 @@ Companion hooks (in `pack-monorepo`):
|
|
|
100
100
|
|
|
101
101
|
---
|
|
102
102
|
|
|
103
|
+
## Agent-orchestrated external credential operations
|
|
104
|
+
|
|
105
|
+
This governs creation, storage and rotation through an external secret manager. It is separate
|
|
106
|
+
from application runtime configuration and customer BYO-key storage above.
|
|
107
|
+
|
|
108
|
+
1. **Establish scope before acting.** Require explicit user authorization naming the operation,
|
|
109
|
+
affected service/account/project/environment, credential names or bounded set, and approved
|
|
110
|
+
destination manager. Reuse existing precise consent for that operation only. A broad request
|
|
111
|
+
to deploy, fix a project or run autopilot is not consent. Revocation or deletion needs its own
|
|
112
|
+
explicitly requested scope. New credentials get only required privileges and an appropriate
|
|
113
|
+
bounded lifetime; unclear permissions or lifetime require clarification, never administrator
|
|
114
|
+
privileges or an unrestricted credential by assumption.
|
|
115
|
+
2. **Keep values outside model context.** Prefer provider-side generation and storage, opaque
|
|
116
|
+
references, or verified direct process-to-manager transfer. Before invocation, establish from
|
|
117
|
+
documented capabilities that both success and error paths keep values confidential. CLI, API
|
|
118
|
+
and MCP are transports, not exemptions. A tool that returns plaintext to the model is
|
|
119
|
+
unsuitable; redacting the final response after receiving it is too late.
|
|
120
|
+
3. **Keep plaintext out of intermediate surfaces.** Never put values in prompts, model-visible
|
|
121
|
+
tool arguments, command argv/history, source, repository files, temporary plaintext files,
|
|
122
|
+
logs, traces, screenshots, reports or review evidence. Never request a secret through chat.
|
|
123
|
+
Authenticate through the provider's established secure flow or existing permitted credentials,
|
|
124
|
+
without printing them.
|
|
125
|
+
4. **Verify by non-sensitive metadata.** Check destination, resource identifier, version and
|
|
126
|
+
status. Never read the secret back to prove storage. After an uncertain mutation, reconcile
|
|
127
|
+
metadata before retrying; never blindly regenerate or rotate.
|
|
128
|
+
5. **Stop when the conditions cannot be established.** An unavailable destination, ambiguous
|
|
129
|
+
scope or unverified safe transfer stops that operation. Preserve existing credentials and
|
|
130
|
+
request the missing scope or a secure user/provider action.
|
|
131
|
+
|
|
132
|
+
Runtime permissions, sandboxing, hook refusals, role restrictions (including read-only reviewers)
|
|
133
|
+
and higher-priority instructions remain binding. Never bypass them or change policy during an
|
|
134
|
+
operation to unblock it. Local protected-file and secret-content guards remain active. These
|
|
135
|
+
instructions do not mechanically certify an external transfer: provider/runtime access controls
|
|
136
|
+
and the verified tool own execution; the agent owns checking scope and selecting a suitable tool.
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
103
140
|
## SQL / DB — parameterized via Drizzle, no string concat
|
|
104
141
|
|
|
105
142
|
```typescript
|
|
@@ -247,7 +284,9 @@ The `doctrine-critic` agent (in void-machine) flags trust-boundary code in a dif
|
|
|
247
284
|
## Final rule
|
|
248
285
|
|
|
249
286
|
```
|
|
250
|
-
Trust boundary → Zod validation.
|
|
287
|
+
Trust boundary → Zod validation. App secrets → env; BYO keys → encrypted tenant data.
|
|
288
|
+
External credential operations → scoped consent, confidential transfer, metadata verification.
|
|
289
|
+
SQL → parameterized. Auth → Better-Auth.
|
|
251
290
|
LLM I/O → untrusted. Logs → no PII no secrets.
|
|
252
291
|
Otherwise → it is not voidcorp security-guidance.
|
|
253
292
|
```
|
|
@@ -176,9 +176,8 @@ progress:
|
|
|
176
176
|
done: [<native completed states>]
|
|
177
177
|
humanGates: [<ticket identifiers requiring explicit approval>]
|
|
178
178
|
autopilot:
|
|
179
|
-
schemaVersion:
|
|
179
|
+
schemaVersion: 2
|
|
180
180
|
enabled: <true | false>
|
|
181
|
-
mergeGate: human
|
|
182
181
|
---
|
|
183
182
|
```
|
|
184
183
|
|
|
@@ -188,7 +187,7 @@ lifecycle. `progress.order` is the deterministic tie-break among simultaneously
|
|
|
188
187
|
scope, not mutable progress. Never store a current or next unit, copied status, assignee, or
|
|
189
188
|
completion checklist in the program or checkpoint.
|
|
190
189
|
|
|
191
|
-
The `void-autopilot` block is required, because consent to autonomous execution is never inferred from silence: a program that does not want it declares `enabled: false`.
|
|
190
|
+
The `void-autopilot` block is required, because consent to autonomous execution is never inferred from silence: a program that does not want it declares `enabled: false`. There is no merge gate to declare: the loop merges into the integration branch on a local review verdict, never into the branch that deploys, which `deployBranch` names when it is not the repository's default branch; a person who merges themselves says so with `void-machine autopilot merges --by-human`, local state and not the program. Add `deployBranch`, `clusterSize` (1..4), `base`, `verifyCommands` (argv arrays, run with `shell:false`) and `ownership.sequential` / `ownership.reconcileOnly` only when the program enables autopilot.
|
|
192
191
|
|
|
193
192
|
Do not replace an unrelated executing programme. Stop and surface the collision. When the same
|
|
194
193
|
programme already has a descriptor, preserve its routing unless the user explicitly changes
|