@ai-dossier/cli 0.58.0 → 0.60.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/README.md CHANGED
@@ -1329,8 +1329,8 @@ against ground truth.
1329
1329
  `pause` prevents every new agent process, including recovery takeovers, but leaves live
1330
1330
  agents running. `stop --issue <n>` PID-start-safely terminates one live agent, releases its
1331
1331
  slot, and records terminal `stopped` state without recovery or escalation. Active batch members
1332
- must use `stop --batch <id>`, which terminates the batch process and stops unfinished members
1333
- atomically. `abandon` instead records failure and releases a slot without terminating the process.
1332
+ must use `stop --batch <id>`, which terminates every agent the batch holds (its own slot plus one
1333
+ per running parallel member) and stops unfinished members atomically. `abandon` instead records failure and releases a slot without terminating the process.
1334
1334
 
1335
1335
  - **`enqueue`** records entries (issue, mode, batch id, dependency edges, model tier) from
1336
1336
  flags or a batch-prep manifest (`--from-manifest`, a JSON file of entries — flags and
@@ -1541,7 +1541,9 @@ serialized by a `.sched-lock` directory mutex (stolen from dead holders). `confi
1541
1541
  holds `max_slots` (default 3, bounds concurrently-live units), `stall_timeout_ms` (default
1542
1542
  1 800 000 — but the `implement` phase defaults to 5 400 000, overridable per phase via
1543
1543
  `dispatch.phase_stall_timeout_ms: {"<phase>": <ms>}`, #495), `reconcile_interval_ms`
1544
- (default 60 000), and the optional `dispatch` section (including `report_prompt` for
1544
+ (default 60 000), `member_parallelism` (#809 — at most this many members of one batch run
1545
+ concurrently; default bounded only by `max_slots`/free capacity; `1` runs every batch's members
1546
+ serially), and the optional `dispatch` section (including `report_prompt` for
1545
1547
  the #468 report agent and `fence_takeover_timeout_ms`, default 900 000 — the short stall
1546
1548
  allowance for a freshly-fenced takeover that has posted nothing, #504; `dispatch.prompt`
1547
1549
  substitutes `{issue}` and `{gen}`; `dispatch.tiers.<tier>` — `{command?, model?, prompt?}`
@@ -1585,6 +1587,7 @@ ai-dossier cap list [--json] # inspect .dossier/automation/manifest.yaml
1585
1587
  ai-dossier cap run test.focused # execute one capability
1586
1588
  ai-dossier cap run test.focused -- --grep auth # extra args are shell-quoted and appended
1587
1589
  ai-dossier cap run test.focused --tail-bytes 4096 # bytes of output captured on a non-ok outcome (default 8192)
1590
+ ai-dossier cap run test.focused --envelope-file /tmp/env.json # also write the envelope atomically to a file (or set $DOSSIER_CAP_ENVELOPE_FILE)
1588
1591
  ```
1589
1592
 
1590
1593
  A repo declares its deterministic, recurring operations — tests, lint, build, deps
@@ -1611,8 +1614,10 @@ Extra args after `--` are shell-quoted and appended (they are data, not shell sy
1611
1614
  ai-dossier cap run test.focused -- --grep auth # → npm test -- --silent --grep auth
1612
1615
  ```
1613
1616
 
1614
- `cap run` reports one of exactly four outcomes — the JSON envelope is the **last
1615
- stdout line**, and the exit code matches:
1617
+ `cap run` reports one of exactly four outcomes — the JSON envelope (marked
1618
+ `"cap_envelope": 1`) is the **last stdout line** and, with `--envelope-file <path>` /
1619
+ `$DOSSIER_CAP_ENVELOPE_FILE`, is also written to that file (the channel machine consumers
1620
+ should read, #811); the exit code matches:
1616
1621
 
1617
1622
  | Outcome | Exit | Meaning |
1618
1623
  |---|---|---|
@@ -1 +1 @@
1
- {"version":3,"file":"batch-suite-runner.d.ts","sourceRoot":"","sources":["../src/batch-suite-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAKH,OAAO,EACL,KAAK,iBAAiB,EAGtB,KAAK,WAAW,EAChB,KAAK,WAAW,EACjB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,KAAK,kBAAkB,EAA8C,MAAM,cAAc,CAAC;AAEnG,oFAAoF;AACpF,eAAO,MAAM,qBAAqB,eAAe,CAAC;AAElD,uEAAuE;AACvE,eAAO,MAAM,qBAAqB,cAAc,CAAC;AAajD;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,MAAM,GAAG,IAAI,CAU5E;AAED,kGAAkG;AAClG,eAAO,MAAM,sBAAsB,SAAU,CAAC;AAE9C,mGAAmG;AACnG,eAAO,MAAM,sBAAsB,QAAS,CAAC;AA+O7C;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,WAAW,EACnB,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GAChC,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,iBAAiB,KAAK,WAAW,CAyD5D"}
1
+ {"version":3,"file":"batch-suite-runner.d.ts","sourceRoot":"","sources":["../src/batch-suite-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAKH,OAAO,EACL,KAAK,iBAAiB,EAGtB,KAAK,WAAW,EAChB,KAAK,WAAW,EACjB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,KAAK,kBAAkB,EAA8C,MAAM,cAAc,CAAC;AAEnG,oFAAoF;AACpF,eAAO,MAAM,qBAAqB,eAAe,CAAC;AAElD,uEAAuE;AACvE,eAAO,MAAM,qBAAqB,cAAc,CAAC;AAajD;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,MAAM,GAAG,IAAI,CAU5E;AAED,kGAAkG;AAClG,eAAO,MAAM,sBAAsB,SAAU,CAAC;AAE9C,mGAAmG;AACnG,eAAO,MAAM,sBAAsB,QAAS,CAAC;AAgO7C;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,WAAW,EACnB,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GAChC,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,iBAAiB,KAAK,WAAW,CAyD5D"}
@@ -47,6 +47,7 @@ const node_fs_1 = __importDefault(require("node:fs"));
47
47
  const node_path_1 = __importDefault(require("node:path"));
48
48
  const sched_1 = require("@ai-dossier/sched");
49
49
  const worktree_pool_1 = require("@ai-dossier/worktree-pool");
50
+ const cap_envelope_1 = require("./cap-envelope");
50
51
  const capability_1 = require("./capability");
51
52
  /** The repo-declared batch gate (#777) — preferred over `test.full` when active. */
52
53
  exports.BATCH_GATE_CAPABILITY = 'gate.batch';
@@ -159,15 +160,18 @@ function runCommand(argv, worktree, source, timeoutMs, env) {
159
160
  function runCapabilitySuite(capabilityId, worktree, capabilityTimeoutMs, env) {
160
161
  const source = `cap run ${capabilityId}`;
161
162
  const start = Date.now();
162
- const spawned = (0, node_child_process_1.spawnSync)('ai-dossier', ['cap', 'run', capabilityId], {
163
- cwd: worktree,
164
- encoding: 'utf-8',
163
+ // #811: the envelope comes from `cap run`'s dedicated envelope file, not
164
+ // stdout's last line — output that lands after the envelope (or a tail lost
165
+ // on exit) must never turn a green gate into "no envelope". `spawnCapRun`
166
+ // only returns an envelope whose outcome agrees with `cap run`'s own exit
167
+ // code, which the capability's command cannot forge (#562 review).
168
+ const run = (0, cap_envelope_1.spawnCapRun)(capabilityId, worktree, {
165
169
  // The inner capability owns this budget; the outer watchdog has bounded setup grace.
166
- timeout: capabilityTimeoutMs + exports.CAP_RUN_SETUP_GRACE_MS,
167
- maxBuffer: MAX_BUFFER_BYTES,
168
- ...(env !== undefined ? { env } : {}),
170
+ timeoutMs: capabilityTimeoutMs + exports.CAP_RUN_SETUP_GRACE_MS,
171
+ env,
169
172
  });
170
- if (spawned.error) {
173
+ const { spawned } = run;
174
+ if (spawned.error && !run.exitedWithVerdict) {
171
175
  if (spawned.error.code === 'ETIMEDOUT') {
172
176
  const elapsedMs = Date.now() - start;
173
177
  return {
@@ -184,23 +188,13 @@ function runCapabilitySuite(capabilityId, worktree, capabilityTimeoutMs, env) {
184
188
  return 'unavailable';
185
189
  }
186
190
  const stdout = spawned.stdout ?? '';
187
- const lastLine = stdout.trim().split('\n').pop() ?? '';
188
- let envelope = null;
189
- try {
190
- envelope = JSON.parse(lastLine);
191
- }
192
- catch {
193
- envelope = null;
194
- }
195
- if (envelope?.outcome === 'capability-unavailable')
191
+ const fields = run.envelope !== null ? (0, cap_envelope_1.envelopeFields)(run.envelope) : null;
192
+ if (fields?.outcome === 'capability-unavailable')
196
193
  return 'unavailable';
197
- // The exit code is `cap run`'s own — it cannot be forged by anything the
198
- // capability's command writes to stdout, unlike the envelope's `outcome`
199
- // field. Both must agree before this is trusted as green (#562 review).
200
- const ok = envelope?.outcome === 'ok' && spawned.status === 0;
194
+ const ok = fields?.outcome === 'ok' && spawned.status === 0;
201
195
  const readable = (0, sched_1.isReadableVitestReport)(stdout);
202
196
  const failing = readable ? (0, sched_1.parseVitestJson)(stdout) : [];
203
- const timedOut = envelope?.reason === (0, capability_1.timeoutReasonSpent)(capabilityTimeoutMs);
197
+ const timedOut = fields?.reason === (0, capability_1.timeoutReasonSpent)(capabilityTimeoutMs);
204
198
  return {
205
199
  source,
206
200
  terminal: timedOut,
@@ -208,13 +202,14 @@ function runCapabilitySuite(capabilityId, worktree, capabilityTimeoutMs, env) {
208
202
  ok,
209
203
  failing,
210
204
  readable: ok || readable,
211
- detail: envelope !== null
212
- ? `${source}: outcome=${envelope.outcome} exit_code=${envelope.exit_code ?? 'unknown'}` +
213
- (envelope.reason ? ` reason=${envelope.reason}` : '') +
214
- (typeof envelope.duration_ms === 'number' ? ` elapsed ${envelope.duration_ms}ms` : '') +
205
+ detail: fields !== null
206
+ ? `${source}: outcome=${fields.outcome} exit_code=${fields.exitCode ?? 'unknown'}` +
207
+ (fields.reason ? ` reason=${fields.reason}` : '') +
208
+ (fields.durationMs !== null ? ` elapsed ${fields.durationMs}ms` : '') +
215
209
  (!ok && readable ? ` (${failing.length} failing)` : '') +
210
+ ` [${run.diagnostics}]` +
216
211
  (!ok && !readable ? stderrTail(spawned.stderr) : '')
217
- : `${source}: task-failed (exit ${spawned.status ?? 'unknown'}), harness produced no envelope${stderrTail(spawned.stderr)}`,
212
+ : `${source}: task-failed (exit ${spawned.status ?? 'unknown'}), harness produced no envelope [${run.diagnostics}]${stderrTail(spawned.stderr)}`,
218
213
  },
219
214
  };
220
215
  }
@@ -1 +1 @@
1
- {"version":3,"file":"batch-suite-runner.js","sourceRoot":"","sources":["../src/batch-suite-runner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"batch-suite-runner.js","sourceRoot":"","sources":["../src/batch-suite-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,122 @@
1
+ /**
2
+ * The `cap run` outcome-envelope channel (#811).
3
+ *
4
+ * `ai-dossier cap run <id>` reports its four-way outcome as a JSON envelope.
5
+ * Machine consumers (the batch suite runner, the per-member gate runner) used
6
+ * to read only stdout's LAST line — which silently failed when that line was
7
+ * not the envelope:
8
+ *
9
+ * - `cap run` re-emitted the capability's captured output and then exited
10
+ * with `process.exit()` while a large stdout write was still queued on the
11
+ * pipe; the tail (envelope included) was discarded. A green 33-minute
12
+ * `gate.batch` came back as exit 0 + no envelope → `suite-unreadable`.
13
+ * - anything that inherited the same stdout and wrote after `cap run`
14
+ * printed its envelope pushed the envelope off the last line.
15
+ *
16
+ * The fix is a dedicated channel: the consumer hands `cap run` a private file
17
+ * path via {@link CAP_ENVELOPE_FILE_ENV} (or `--envelope-file`), `cap run`
18
+ * writes the envelope there before exiting, and the consumer reads the file.
19
+ * Stdout keeps the envelope for humans and older consumers; when the file is
20
+ * absent (an older `ai-dossier` on PATH that ignores the env var) the stdout
21
+ * is scanned bottom-up for a line carrying the {@link CAP_ENVELOPE_MARKER}
22
+ * key, then the legacy last line.
23
+ *
24
+ * Whatever the source, an envelope is only trusted when `cap run`'s own exit
25
+ * status agrees with its `outcome` — the exit code is the one signal the
26
+ * capability's command cannot forge (#562 review).
27
+ */
28
+ import { type SpawnSyncReturns } from 'node:child_process';
29
+ import { CAP_ENVELOPE_FILE_ENV, type CapabilityOutcome } from './capability';
30
+ export { CAP_ENVELOPE_FILE_ENV };
31
+ /** Marker key present (value `1`) on every envelope `cap run` emits. */
32
+ export declare const CAP_ENVELOPE_MARKER = "cap_envelope";
33
+ /**
34
+ * Consumer-side stdout buffer for `cap run`: the capability layer captures up
35
+ * to {@link MAX_CAPABILITY_OUTPUT_BYTES} of its command's output and re-emits
36
+ * it before the envelope, so a consumer buffer no larger than that turns a
37
+ * chatty-but-green run into ENOBUFS. Derived, not restated, so the two cannot drift.
38
+ */
39
+ export declare const CAP_RUN_MAX_BUFFER_BYTES: number;
40
+ /** The raw envelope object; every field is `unknown` until narrowed by {@link envelopeFields}. */
41
+ export interface CapEnvelope {
42
+ [key: string]: unknown;
43
+ }
44
+ /** The typed fields consumers read off an envelope — `null` when absent or of the wrong type. */
45
+ export interface CapEnvelopeFields {
46
+ outcome: CapabilityOutcome | null;
47
+ exitCode: number | null;
48
+ reason: string | null;
49
+ durationMs: number | null;
50
+ outputTail: string | null;
51
+ }
52
+ /** `true` when `value` is one of the four `cap run` outcomes. */
53
+ export declare function isCapabilityOutcome(value: unknown): value is CapabilityOutcome;
54
+ /** Narrow an envelope's fields by type — one place, so every consumer reads it identically. */
55
+ export declare function envelopeFields(envelope: CapEnvelope): CapEnvelopeFields;
56
+ /**
57
+ * Find the envelope in `cap run`'s stdout: the LAST line (scanning
58
+ * bottom-up) that parses as a JSON object carrying the marker key; failing
59
+ * that, the legacy contract — the last non-empty line, parsed as-is (an
60
+ * older `cap run` that predates the marker). `null` when neither parses.
61
+ */
62
+ export declare function parseCapEnvelope(stdout: string): CapEnvelope | null;
63
+ /** What {@link readCapEnvelopeFile} found: nothing, something unusable, or a marked envelope. */
64
+ export type CapEnvelopeFileRead = {
65
+ state: 'absent';
66
+ } | {
67
+ state: 'invalid';
68
+ preview: string;
69
+ } | {
70
+ state: 'ok';
71
+ envelope: CapEnvelope;
72
+ };
73
+ /**
74
+ * Read an envelope file written by `cap run`. `invalid` (present but not a
75
+ * marked envelope) is kept distinct from `absent` — it means version skew or
76
+ * a writer bug, not "an older CLI that never wrote one".
77
+ */
78
+ export declare function readCapEnvelopeFile(file: string): CapEnvelopeFileRead;
79
+ /**
80
+ * Write `json` (one envelope) to `file` atomically — a reader never sees a
81
+ * half-written envelope. The temp sibling has an unguessable name and is
82
+ * opened exclusively (`wx`, mode 0600), so a pre-planted file or symlink in a
83
+ * shared directory is refused rather than written through; it is removed if
84
+ * the write or rename fails. Throws on I/O failure; the caller decides
85
+ * whether that is fatal.
86
+ */
87
+ export declare function writeCapEnvelopeFile(file: string, json: string): void;
88
+ /** Result of {@link spawnCapRun}: the raw spawn plus the verdict it produced, if any. */
89
+ export interface CapRunSpawn {
90
+ spawned: SpawnSyncReturns<string>;
91
+ /**
92
+ * The envelope — from the dedicated file, else from stdout (see
93
+ * {@link parseCapEnvelope}) — and only when `cap run`'s exit status agrees
94
+ * with its `outcome`. `null` when no trustworthy envelope was recovered.
95
+ */
96
+ envelope: CapEnvelope | null;
97
+ /** Where {@link envelope} came from; `'none'` when it is `null`. */
98
+ envelopeSource: 'file' | 'stdout' | 'none';
99
+ /**
100
+ * `cap run` exited on its own with a trusted verdict. When this is `true`
101
+ * a spawn error (ETIMEDOUT) is NOT the gate timing out: a descendant still
102
+ * held the inherited stdout pipe, so `spawnSync` kept waiting past its
103
+ * timeout after `cap run` had already recorded its exit status.
104
+ */
105
+ exitedWithVerdict: boolean;
106
+ /** Human-readable account of how the envelope was (or was not) recovered — for `detail`/`reason`. */
107
+ diagnostics: string;
108
+ }
109
+ /**
110
+ * Spawn `ai-dossier cap run <capabilityId>` in `cwd` with a dedicated
111
+ * envelope file in a fresh private (0700) temp directory, and return the
112
+ * spawn result plus the verdict. Always sets {@link CAP_ENVELOPE_FILE_ENV}
113
+ * (overriding any value in `env`, which otherwise defaults to the inherited
114
+ * environment) and uses {@link CAP_RUN_MAX_BUFFER_BYTES} as `maxBuffer`. The
115
+ * temp directory — and any stray temp file a killed `cap run` left in it — is
116
+ * always removed.
117
+ */
118
+ export declare function spawnCapRun(capabilityId: string, cwd: string, opts: {
119
+ timeoutMs: number;
120
+ env?: NodeJS.ProcessEnv;
121
+ }): CapRunSpawn;
122
+ //# sourceMappingURL=cap-envelope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cap-envelope.d.ts","sourceRoot":"","sources":["../src/cap-envelope.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,KAAK,gBAAgB,EAAa,MAAM,oBAAoB,CAAC;AAKtE,OAAO,EACL,qBAAqB,EAErB,KAAK,iBAAiB,EAEvB,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,qBAAqB,EAAE,CAAC;AAEjC,wEAAwE;AACxE,eAAO,MAAM,mBAAmB,iBAAiB,CAAC;AAElD;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,QAAiD,CAAC;AAEvF,kGAAkG;AAClG,MAAM,WAAW,WAAW;IAC1B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,iGAAiG;AACjG,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAClC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,iEAAiE;AACjE,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,iBAAiB,CAE9E;AAED,+FAA+F;AAC/F,wBAAgB,cAAc,CAAC,QAAQ,EAAE,WAAW,GAAG,iBAAiB,CAQvE;AAgBD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAUnE;AAED,iGAAiG;AACjG,MAAM,MAAM,mBAAmB,GAC3B;IAAE,KAAK,EAAE,QAAQ,CAAA;CAAE,GACnB;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,WAAW,CAAA;CAAE,CAAC;AAI3C;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,mBAAmB,CAUrE;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CASrE;AAED,yFAAyF;AACzF,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAClC;;;;OAIG;IACH,QAAQ,EAAE,WAAW,GAAG,IAAI,CAAC;IAC7B,oEAAoE;IACpE,cAAc,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC3C;;;;;OAKG;IACH,iBAAiB,EAAE,OAAO,CAAC;IAC3B,qGAAqG;IACrG,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CACzB,YAAY,EAAE,MAAM,EACpB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;CAAE,GACnD,WAAW,CAmBb"}
@@ -0,0 +1,211 @@
1
+ "use strict";
2
+ /**
3
+ * The `cap run` outcome-envelope channel (#811).
4
+ *
5
+ * `ai-dossier cap run <id>` reports its four-way outcome as a JSON envelope.
6
+ * Machine consumers (the batch suite runner, the per-member gate runner) used
7
+ * to read only stdout's LAST line — which silently failed when that line was
8
+ * not the envelope:
9
+ *
10
+ * - `cap run` re-emitted the capability's captured output and then exited
11
+ * with `process.exit()` while a large stdout write was still queued on the
12
+ * pipe; the tail (envelope included) was discarded. A green 33-minute
13
+ * `gate.batch` came back as exit 0 + no envelope → `suite-unreadable`.
14
+ * - anything that inherited the same stdout and wrote after `cap run`
15
+ * printed its envelope pushed the envelope off the last line.
16
+ *
17
+ * The fix is a dedicated channel: the consumer hands `cap run` a private file
18
+ * path via {@link CAP_ENVELOPE_FILE_ENV} (or `--envelope-file`), `cap run`
19
+ * writes the envelope there before exiting, and the consumer reads the file.
20
+ * Stdout keeps the envelope for humans and older consumers; when the file is
21
+ * absent (an older `ai-dossier` on PATH that ignores the env var) the stdout
22
+ * is scanned bottom-up for a line carrying the {@link CAP_ENVELOPE_MARKER}
23
+ * key, then the legacy last line.
24
+ *
25
+ * Whatever the source, an envelope is only trusted when `cap run`'s own exit
26
+ * status agrees with its `outcome` — the exit code is the one signal the
27
+ * capability's command cannot forge (#562 review).
28
+ */
29
+ var __importDefault = (this && this.__importDefault) || function (mod) {
30
+ return (mod && mod.__esModule) ? mod : { "default": mod };
31
+ };
32
+ Object.defineProperty(exports, "__esModule", { value: true });
33
+ exports.CAP_RUN_MAX_BUFFER_BYTES = exports.CAP_ENVELOPE_MARKER = exports.CAP_ENVELOPE_FILE_ENV = void 0;
34
+ exports.isCapabilityOutcome = isCapabilityOutcome;
35
+ exports.envelopeFields = envelopeFields;
36
+ exports.parseCapEnvelope = parseCapEnvelope;
37
+ exports.readCapEnvelopeFile = readCapEnvelopeFile;
38
+ exports.writeCapEnvelopeFile = writeCapEnvelopeFile;
39
+ exports.spawnCapRun = spawnCapRun;
40
+ const node_child_process_1 = require("node:child_process");
41
+ const node_crypto_1 = require("node:crypto");
42
+ const node_fs_1 = __importDefault(require("node:fs"));
43
+ const node_os_1 = __importDefault(require("node:os"));
44
+ const node_path_1 = __importDefault(require("node:path"));
45
+ const capability_1 = require("./capability");
46
+ Object.defineProperty(exports, "CAP_ENVELOPE_FILE_ENV", { enumerable: true, get: function () { return capability_1.CAP_ENVELOPE_FILE_ENV; } });
47
+ /** Marker key present (value `1`) on every envelope `cap run` emits. */
48
+ exports.CAP_ENVELOPE_MARKER = 'cap_envelope';
49
+ /**
50
+ * Consumer-side stdout buffer for `cap run`: the capability layer captures up
51
+ * to {@link MAX_CAPABILITY_OUTPUT_BYTES} of its command's output and re-emits
52
+ * it before the envelope, so a consumer buffer no larger than that turns a
53
+ * chatty-but-green run into ENOBUFS. Derived, not restated, so the two cannot drift.
54
+ */
55
+ exports.CAP_RUN_MAX_BUFFER_BYTES = capability_1.MAX_CAPABILITY_OUTPUT_BYTES + 16 * 1024 * 1024;
56
+ /** `true` when `value` is one of the four `cap run` outcomes. */
57
+ function isCapabilityOutcome(value) {
58
+ return typeof value === 'string' && Object.hasOwn(capability_1.CAPABILITY_EXIT_CODES, value);
59
+ }
60
+ /** Narrow an envelope's fields by type — one place, so every consumer reads it identically. */
61
+ function envelopeFields(envelope) {
62
+ return {
63
+ outcome: isCapabilityOutcome(envelope.outcome) ? envelope.outcome : null,
64
+ exitCode: typeof envelope.exit_code === 'number' ? envelope.exit_code : null,
65
+ reason: typeof envelope.reason === 'string' ? envelope.reason : null,
66
+ durationMs: typeof envelope.duration_ms === 'number' ? envelope.duration_ms : null,
67
+ outputTail: typeof envelope.output_tail === 'string' ? envelope.output_tail : null,
68
+ };
69
+ }
70
+ function parseObject(text) {
71
+ try {
72
+ const parsed = JSON.parse(text);
73
+ if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed))
74
+ return null;
75
+ return parsed;
76
+ }
77
+ catch {
78
+ return null;
79
+ }
80
+ }
81
+ function isMarked(envelope) {
82
+ return envelope !== null && envelope[exports.CAP_ENVELOPE_MARKER] === 1;
83
+ }
84
+ /**
85
+ * Find the envelope in `cap run`'s stdout: the LAST line (scanning
86
+ * bottom-up) that parses as a JSON object carrying the marker key; failing
87
+ * that, the legacy contract — the last non-empty line, parsed as-is (an
88
+ * older `cap run` that predates the marker). `null` when neither parses.
89
+ */
90
+ function parseCapEnvelope(stdout) {
91
+ const lines = stdout.split('\n');
92
+ for (let i = lines.length - 1; i >= 0; i--) {
93
+ const line = lines[i].trim();
94
+ if (!line.startsWith('{'))
95
+ continue;
96
+ const candidate = parseObject(line);
97
+ if (isMarked(candidate))
98
+ return candidate;
99
+ }
100
+ const lastLine = stdout.trim().split('\n').pop() ?? '';
101
+ return parseObject(lastLine.trim());
102
+ }
103
+ const INVALID_PREVIEW_CHARS = 200;
104
+ /**
105
+ * Read an envelope file written by `cap run`. `invalid` (present but not a
106
+ * marked envelope) is kept distinct from `absent` — it means version skew or
107
+ * a writer bug, not "an older CLI that never wrote one".
108
+ */
109
+ function readCapEnvelopeFile(file) {
110
+ let text;
111
+ try {
112
+ text = node_fs_1.default.readFileSync(file, 'utf-8');
113
+ }
114
+ catch {
115
+ return { state: 'absent' };
116
+ }
117
+ const envelope = parseObject(String(text).trim());
118
+ if (isMarked(envelope))
119
+ return { state: 'ok', envelope };
120
+ return { state: 'invalid', preview: String(text).slice(0, INVALID_PREVIEW_CHARS) };
121
+ }
122
+ /**
123
+ * Write `json` (one envelope) to `file` atomically — a reader never sees a
124
+ * half-written envelope. The temp sibling has an unguessable name and is
125
+ * opened exclusively (`wx`, mode 0600), so a pre-planted file or symlink in a
126
+ * shared directory is refused rather than written through; it is removed if
127
+ * the write or rename fails. Throws on I/O failure; the caller decides
128
+ * whether that is fatal.
129
+ */
130
+ function writeCapEnvelopeFile(file, json) {
131
+ const tmp = `${file}.${(0, node_crypto_1.randomUUID)()}.tmp`;
132
+ try {
133
+ node_fs_1.default.writeFileSync(tmp, `${json}\n`, { flag: 'wx', mode: 0o600 });
134
+ node_fs_1.default.renameSync(tmp, file);
135
+ }
136
+ catch (err) {
137
+ node_fs_1.default.rmSync(tmp, { force: true });
138
+ throw err;
139
+ }
140
+ }
141
+ /**
142
+ * Spawn `ai-dossier cap run <capabilityId>` in `cwd` with a dedicated
143
+ * envelope file in a fresh private (0700) temp directory, and return the
144
+ * spawn result plus the verdict. Always sets {@link CAP_ENVELOPE_FILE_ENV}
145
+ * (overriding any value in `env`, which otherwise defaults to the inherited
146
+ * environment) and uses {@link CAP_RUN_MAX_BUFFER_BYTES} as `maxBuffer`. The
147
+ * temp directory — and any stray temp file a killed `cap run` left in it — is
148
+ * always removed.
149
+ */
150
+ function spawnCapRun(capabilityId, cwd, opts) {
151
+ const dir = node_fs_1.default.mkdtempSync(node_path_1.default.join(node_os_1.default.tmpdir(), 'ai-dossier-cap-'));
152
+ const envelopeFile = node_path_1.default.join(dir, 'envelope.json');
153
+ try {
154
+ const spawned = (0, node_child_process_1.spawnSync)('ai-dossier', ['cap', 'run', capabilityId], {
155
+ cwd,
156
+ encoding: 'utf-8',
157
+ timeout: opts.timeoutMs,
158
+ maxBuffer: exports.CAP_RUN_MAX_BUFFER_BYTES,
159
+ env: { ...(opts.env ?? process.env), [capability_1.CAP_ENVELOPE_FILE_ENV]: envelopeFile },
160
+ });
161
+ return resolveVerdict(spawned, readCapEnvelopeFile(envelopeFile));
162
+ }
163
+ finally {
164
+ try {
165
+ node_fs_1.default.rmSync(dir, { recursive: true, force: true });
166
+ }
167
+ catch {
168
+ // Best effort — a leftover private temp dir is harmless.
169
+ }
170
+ }
171
+ }
172
+ function resolveVerdict(spawned, fileRead) {
173
+ const notes = [];
174
+ let candidate = null;
175
+ let source = 'file';
176
+ if (fileRead.state === 'ok') {
177
+ candidate = fileRead.envelope;
178
+ }
179
+ else {
180
+ notes.push(fileRead.state === 'invalid'
181
+ ? `envelope file invalid: ${JSON.stringify(fileRead.preview)}`
182
+ : 'envelope file not written (an `ai-dossier` on PATH older than #811?)');
183
+ candidate = spawned.stdout ? parseCapEnvelope(spawned.stdout) : null;
184
+ source = 'stdout';
185
+ if (candidate === null)
186
+ notes.push('stdout scan found no envelope');
187
+ }
188
+ let envelope = null;
189
+ if (candidate !== null) {
190
+ const outcome = envelopeFields(candidate).outcome;
191
+ if (outcome !== null && spawned.status === capability_1.CAPABILITY_EXIT_CODES[outcome]) {
192
+ envelope = candidate;
193
+ }
194
+ else {
195
+ notes.push(`envelope from ${source} rejected: outcome=${String(candidate.outcome)} disagrees with cap run exit ${spawned.status ?? 'none'}`);
196
+ }
197
+ }
198
+ const envelopeSource = envelope !== null ? source : 'none';
199
+ const exitedWithVerdict = spawned.status !== null && envelope !== null;
200
+ if (exitedWithVerdict && spawned.error) {
201
+ notes.push(`verdict accepted although the spawn reported ${spawned.error.code ?? spawned.error.message} — a descendant held cap run's stdout after it exited`);
202
+ }
203
+ return {
204
+ spawned,
205
+ envelope,
206
+ envelopeSource,
207
+ exitedWithVerdict,
208
+ diagnostics: [`envelope=${envelopeSource}`, ...notes].join('; '),
209
+ };
210
+ }
211
+ //# sourceMappingURL=cap-envelope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cap-envelope.js","sourceRoot":"","sources":["../src/cap-envelope.ts"],"names":[],"mappings":"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"}
@@ -41,6 +41,18 @@ export declare const DEFAULT_OUTPUT_TAIL_BYTES = 8192;
41
41
  * both sides of the contract.
42
42
  */
43
43
  export declare const timeoutReasonSpent: (timeoutMs: number) => string;
44
+ /** `spawnSync`'s own default `maxBuffer` (1 MiB) is too small for a real test/build command's combined stdout+stderr — raised so output volume alone never causes a false `automation-broken` (#583 review). Consumers of `cap run` size their own buffer above this (`cap-envelope.ts`). */
45
+ export declare const MAX_CAPABILITY_OUTPUT_BYTES: number;
46
+ /** Environment variable naming the file `cap run` writes its envelope to (#811). */
47
+ export declare const CAP_ENVELOPE_FILE_ENV = "DOSSIER_CAP_ENVELOPE_FILE";
48
+ /**
49
+ * The environment every process `cap run` spawns on a capability's behalf
50
+ * (assumption probes and the command itself) runs with: the inherited one
51
+ * minus {@link CAP_ENVELOPE_FILE_ENV}. The envelope channel belongs to
52
+ * `cap run`, not to the command it runs — the command is never handed the
53
+ * path, so it cannot write (or clobber) the verdict (#811).
54
+ */
55
+ export declare function capabilityChildEnv(): NodeJS.ProcessEnv;
44
56
  /** Supported tool-version comparison operators (single source of truth). */
45
57
  declare const TOOL_VERSION_OPS: readonly [">=", ">", "<=", "<", "==", "="];
46
58
  type ToolVersionOp = (typeof TOOL_VERSION_OPS)[number];
@@ -1 +1 @@
1
- {"version":3,"file":"capability.d.ts","sourceRoot":"","sources":["../src/capability.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"capability.d.ts","sourceRoot":"","sources":["../src/capability.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAQH,oFAAoF;AACpF,eAAO,MAAM,cAAc,wBAAwB,CAAC;AACpD,+DAA+D;AAC/D,eAAO,MAAM,aAAa,kBAAkB,CAAC;AAE7C,MAAM,MAAM,iBAAiB,GACzB,IAAI,GACJ,aAAa,GACb,mBAAmB,GACnB,wBAAwB,CAAC;AAE7B,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEtD,4DAA4D;AAC5D,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAKnE,CAAC;AAcF;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAE9C;;;;;;;;GAQG;AACH,eAAO,MAAM,kBAAkB,GAAI,WAAW,MAAM,KAAG,MACb,CAAC;AAE3C,6RAA6R;AAC7R,eAAO,MAAM,2BAA2B,QAAmB,CAAC;AAE5D,oFAAoF;AACpF,eAAO,MAAM,qBAAqB,8BAA8B,CAAC;AAEjE;;;;;;GAMG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAAC,UAAU,CAGtD;AAED,4EAA4E;AAC5E,QAAA,MAAM,gBAAgB,4CAA6C,CAAC;AACpE,KAAK,aAAa,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAgBvD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,aAAa,CAAC;IACpB,0DAA0D;IAC1D,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,cAAc,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,aAAa,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,oBAAoB,GAAG,eAAe,GAAG,gBAAgB,CAAC;AAEtE,MAAM,WAAW,eAAe;IAC9B,4FAA4F;IAC5F,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,mBAAmB,CAAC;IAC/B,WAAW,CAAC,EAAE,oBAAoB,EAAE,CAAC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oFAAoF;IACpF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,2EAA2E;IAC3E,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CAC/C;AAED,8DAA8D;AAC9D,qBAAa,gBAAiB,SAAQ,KAAK;gBAC7B,OAAO,EAAE,MAAM;CAI5B;AAQD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB,CAoBtE;AAED,gEAAgE;AAChE,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAmCrF;AAiJD,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,+DAA+D;AAC/D,wBAAgB,aAAa,CAAC,KAAK,EAAE,oBAAoB,EAAE,GAAG,EAAE,MAAM,GAAG,WAAW,CA0CnF;AAMD,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,iBAAiB,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,wEAAwE;IACxE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB;;;;OAIG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB,wEAAwE;IACxE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,gFAAgF;AAChF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAIxE;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,MAAM,EACX,SAAS,GAAE,MAAkC,GAC5C,YAAY,CAWd;AAED,4DAA4D;AAC5D,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,kBAAkB,EAC5B,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,MAAM,EACX,SAAS,GAAE,MAAkC,GAC5C,YAAY,CA6Ed"}
@@ -22,7 +22,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
22
22
  return (mod && mod.__esModule) ? mod : { "default": mod };
23
23
  };
24
24
  Object.defineProperty(exports, "__esModule", { value: true });
25
- exports.CapManifestError = exports.timeoutReasonSpent = exports.DEFAULT_OUTPUT_TAIL_BYTES = exports.CAPABILITY_EXIT_CODES = exports.MANIFEST_FILE = exports.AUTOMATION_DIR = void 0;
25
+ exports.CapManifestError = exports.CAP_ENVELOPE_FILE_ENV = exports.MAX_CAPABILITY_OUTPUT_BYTES = exports.timeoutReasonSpent = exports.DEFAULT_OUTPUT_TAIL_BYTES = exports.CAPABILITY_EXIT_CODES = exports.MANIFEST_FILE = exports.AUTOMATION_DIR = void 0;
26
+ exports.capabilityChildEnv = capabilityChildEnv;
26
27
  exports.loadCapabilityManifest = loadCapabilityManifest;
27
28
  exports.parseCapabilityManifest = parseCapabilityManifest;
28
29
  exports.evaluateProbe = evaluateProbe;
@@ -72,8 +73,21 @@ exports.DEFAULT_OUTPUT_TAIL_BYTES = 8192;
72
73
  */
73
74
  const timeoutReasonSpent = (timeoutMs) => `command timed out after ${timeoutMs}ms`;
74
75
  exports.timeoutReasonSpent = timeoutReasonSpent;
75
- /** `spawnSync`'s own default `maxBuffer` (1 MiB) is too small for a real test/build command's combined stdout+stderr — raised so output volume alone never causes a false `automation-broken` (#583 review). */
76
- const MAX_CAPABILITY_OUTPUT_BYTES = 64 * 1024 * 1024;
76
+ /** `spawnSync`'s own default `maxBuffer` (1 MiB) is too small for a real test/build command's combined stdout+stderr — raised so output volume alone never causes a false `automation-broken` (#583 review). Consumers of `cap run` size their own buffer above this (`cap-envelope.ts`). */
77
+ exports.MAX_CAPABILITY_OUTPUT_BYTES = 64 * 1024 * 1024;
78
+ /** Environment variable naming the file `cap run` writes its envelope to (#811). */
79
+ exports.CAP_ENVELOPE_FILE_ENV = 'DOSSIER_CAP_ENVELOPE_FILE';
80
+ /**
81
+ * The environment every process `cap run` spawns on a capability's behalf
82
+ * (assumption probes and the command itself) runs with: the inherited one
83
+ * minus {@link CAP_ENVELOPE_FILE_ENV}. The envelope channel belongs to
84
+ * `cap run`, not to the command it runs — the command is never handed the
85
+ * path, so it cannot write (or clobber) the verdict (#811).
86
+ */
87
+ function capabilityChildEnv() {
88
+ const { [exports.CAP_ENVELOPE_FILE_ENV]: _envelopeFile, ...childEnv } = process.env;
89
+ return childEnv;
90
+ }
77
91
  /** Supported tool-version comparison operators (single source of truth). */
78
92
  const TOOL_VERSION_OPS = ['>=', '>', '<=', '<', '==', '='];
79
93
  const TOOL_VERSION_OPS_DISPLAY = [...TOOL_VERSION_OPS].sort().join(' ');
@@ -280,6 +294,7 @@ function evaluateProbe(probe, cwd) {
280
294
  encoding: 'utf-8',
281
295
  timeout: PROBE_TIMEOUT_MS,
282
296
  windowsHide: true,
297
+ env: capabilityChildEnv(),
283
298
  });
284
299
  const output = `${res.stdout ?? ''}${res.stderr ?? ''}`;
285
300
  if (res.error || res.status !== 0) {
@@ -389,7 +404,8 @@ function runCapability(manifest, id, args, cwd, tailBytes = exports.DEFAULT_OUTP
389
404
  cwd,
390
405
  encoding: 'utf-8',
391
406
  timeout: timeoutMs,
392
- maxBuffer: MAX_CAPABILITY_OUTPUT_BYTES,
407
+ maxBuffer: exports.MAX_CAPABILITY_OUTPUT_BYTES,
408
+ env: capabilityChildEnv(),
393
409
  });
394
410
  if (res.stdout)
395
411
  process.stdout.write(res.stdout);