@outerlayer/cli 0.4.0 → 0.5.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 (47) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/README.md +4 -2
  3. package/dist/{build-TZUUTRGH.js → build-PAEKVYVK.js} +1 -1
  4. package/dist/build-info.json +1 -1
  5. package/dist/{check-WQP2CZDW.js → check-AXCXDYO2.js} +12 -12
  6. package/dist/{chunk-7A6RVXPZ.js → chunk-4NMBDRBS.js} +2 -2
  7. package/dist/{chunk-3TT7RQYB.js → chunk-D2KWEAN6.js} +1 -1
  8. package/dist/{chunk-3YPKXE5L.js → chunk-EGABNHZG.js} +8 -5
  9. package/dist/{chunk-G7FSV7JX.js → chunk-EX6M5JPR.js} +2147 -34
  10. package/dist/{chunk-CBZB6XY6.js → chunk-FC7TMRNA.js} +2 -2
  11. package/dist/{chunk-DVYHCMB2.js → chunk-JLDZTG3A.js} +1 -1
  12. package/dist/{chunk-FS2VYGZT.js → chunk-L24G4PLP.js} +6 -6
  13. package/dist/{chunk-7YIOOFVJ.js → chunk-OHFDWLJP.js} +4 -4
  14. package/dist/{chunk-2E54Z3P5.js → chunk-OR6AEEDO.js} +3 -3
  15. package/dist/{chunk-FV2CCGXK.js → chunk-QDQEUVUF.js} +1 -1
  16. package/dist/{chunk-L2DBRKRA.js → chunk-RJ467PDQ.js} +2 -2
  17. package/dist/{chunk-5DLBAXY5.js → chunk-RMAZ2NWA.js} +2 -2
  18. package/dist/{chunk-FAJSS2WN.js → chunk-RWOTHXYE.js} +139 -35
  19. package/dist/{chunk-6Y63SXFO.js → chunk-WOBNRVQT.js} +1 -1
  20. package/dist/{chunk-ZNA27WEV.js → chunk-Z62HNKEJ.js} +3 -3
  21. package/dist/{chunk-NYC54VBD.js → chunk-ZLB7GCTY.js} +5 -5
  22. package/dist/{chunk-HE2D4EY5.js → chunk-ZOC7JSYC.js} +1 -1
  23. package/dist/{cli-NHUXABYH.js → cli-NNWPFP5S.js} +72 -48
  24. package/dist/{connect-cmd-OOG4TPU7.js → connect-cmd-OJBFHZWP.js} +4 -4
  25. package/dist/{dist-RW4UPPC2.js → dist-WDV7U7UJ.js} +1 -1
  26. package/dist/{doctor-UFVL4PZY.js → doctor-J3GIMR7K.js} +8 -8
  27. package/dist/{emit-artifact-cmd-KTYW2TN2.js → emit-artifact-cmd-FDWYKURA.js} +67 -7
  28. package/dist/{emit-criteria-cmd-VAUUSAYD.js → emit-criteria-cmd-OCXHLK34.js} +1 -1
  29. package/dist/{emit-finding-cmd-UR4ID45Z.js → emit-finding-cmd-POW7PKIA.js} +1 -1
  30. package/dist/{emit-result-cmd-FDTUKGKE.js → emit-result-cmd-ID35SH53.js} +4 -4
  31. package/dist/index.js +1 -1
  32. package/dist/{init-DXBCOAJK.js → init-3ZQLFPNC.js} +7 -7
  33. package/dist/{init-YEXK35CF.js → init-CZX7ZDWF.js} +7 -7
  34. package/dist/{init-cmd-NHR7PRSQ.js → init-cmd-W5NOLQPX.js} +6 -6
  35. package/dist/{loop-VZOLL4WQ.js → loop-VGM772I7.js} +9 -9
  36. package/dist/{machine-WSG52J75.js → machine-5WEJA36F.js} +6 -6
  37. package/dist/{mcp-serve-cmd-JPTP5FMS.js → mcp-serve-cmd-N6UD2KBX.js} +1 -1
  38. package/dist/{status-2UZKKNB7.js → status-KBDVUYQ3.js} +7 -7
  39. package/dist/{sync-cmd-VPPYCNNM.js → sync-cmd-SWQ5KLPL.js} +4 -4
  40. package/dist/{watch-5C4ZBBGO.js → watch-3YW6Z3DQ.js} +4 -4
  41. package/dist/{work-claim-cmd-LSO2B2EX.js → work-claim-cmd-BQPPURBW.js} +6 -6
  42. package/dist/{work-cmd-UOQO2AD4.js → work-cmd-NUR4CAG6.js} +3 -3
  43. package/dist/{work-comment-cmd-WF3EOLAE.js → work-comment-cmd-6TTTYGHM.js} +3 -3
  44. package/dist/{work-open-pr-cmd-4SSQZMYG.js → work-open-pr-cmd-KZ7QQFLD.js} +4 -4
  45. package/dist/{work-pr-cmd-6AN6RRQJ.js → work-pr-cmd-QNUBE6IQ.js} +2 -2
  46. package/package.json +1 -1
  47. package/skill-pack/maintained/emitting-evidence/SKILL.md +14 -5
package/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # @outerlayer/cli
2
2
 
3
+ ## 0.5.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 0101c5c: MicroVM builds are available. The CLI pins the guest kernel and guest helper published as the `guest-1` release of the public `outerlayerai/guest-assets` repository, so a Linux x86_64 host whose runner user can open `/dev/kvm` now runs each build in a Firecracker microVM. On such a host, `outerlayer runner init` names `builtin:vm`, and `outerlayer doctor` passes a `builtin:vm` hook. To move an existing host, set both hooks to `builtin:vm` and restart the runner while no build is running.
8
+
9
+ ### Patch Changes
10
+
11
+ - cfe700a: A recorded criterion without its declared proof now flags its pull request's verdict, and an item with no recorded criteria flags it unless the policy sets `criteria.missing` to `info` or `off`. The `acceptance-criteria` check is retired from the recommended registry. Its report, bound with `--for acceptance-criteria`, is linked at the top of the item's Criteria tab instead.
12
+
13
+ ## 0.4.1
14
+
15
+ ### Patch Changes
16
+
17
+ - a5cda3d: `import capture` and `context emit` help list all four maintained skills, and `mcp serve` no longer suggests the hidden `--api-key` flag when it finds no API key.
18
+ - b150a61: `emit artifact` reads a JUnit XML file bound with `--for` as test results, and a repeatable `--test "<name>[=path:line]"` selects the tests that prove the criterion and gives a location the file lacks.
19
+ - 32850dd: When a build's command exits 0, `outerlayer runner` reads the work item's evidence verdict before it releases the claim. A build whose item still has a failing check, or a required check with no result, is released `incomplete`, with a reason naming each check, instead of `ok`. A verdict that is not passing is read again every 30 seconds for up to 5 minutes; a passing one is believed at once. The report hook's `OUTERLAYER_OUTCOME` is the outcome the release carries. Runner protocol 12.
20
+
3
21
  ## 0.4.0
4
22
 
5
23
  ### Minor Changes
package/README.md CHANGED
@@ -90,6 +90,8 @@ content:
90
90
  the end of every poll: the host, the CLI version, the poll interval, the
91
91
  slots in use and total, and the result of that poll's own request for
92
92
  work — success, or the error code and message the platform returned.
93
+ When a build's command exits 0, it reads that work item once more, for its
94
+ evidence verdict, before releasing it: it sends nothing but the request.
93
95
  Before a build's command starts, the runner also runs `git ls-remote` and
94
96
  `git fetch` in the job's workdir, with the host's own git credentials, to
95
97
  put it on the branch the claim named. Nothing about the job leaves the host
@@ -315,13 +317,13 @@ before it gives up.
315
317
  | `outerlayer context emit [--check]` | Compile `.outerlayer/` into each configured target tool's native files (targets come from `.outerlayer/config.json`). `--check` computes outputs and diffs against disk without writing (CI mode). Bare `outerlayer emit` with no name still compiles, with a deprecation warning. |
316
318
  | `outerlayer import ruler` | Port a `.ruler/` tree ([Ruler](https://github.com/intellectronica/ruler)) into the equivalent `.outerlayer/` tree — mostly a rename; never overwrites an existing `.outerlayer/`. |
317
319
  | `outerlayer hooks wrap` / `outerlayer hooks unwrap` | Auto-wrap (or undo wrapping) `PreToolUse`/`PostToolUse` hooks for execution evidence — one spawn per firing. |
318
- | `outerlayer emit artifact <file> --caption <text> [--for <criterion-id>] [--pr <n>]` | Upload a proof artifact — screenshot, recording, report, or log — with its caption. Inside a recorded session it spools locally and ships on the next `sync`; otherwise it uploads immediately, anchored to a pull request or the current checkout. `--replaces` retires artifacts an earlier run uploaded. |
320
+ | `outerlayer emit artifact <file> --caption <text> [--for <criterion-id>] [--pr <n>]` | Upload a proof artifact — screenshot, recording, report, or log — with its caption. Inside a recorded session it spools locally and ships on the next `sync`; otherwise it uploads immediately, anchored to a pull request or the current checkout. `--replaces` retires artifacts an earlier run uploaded. A JUnit XML file bound with `--for` proves a criterion that declares `test` proof; `--test <name[=path:line]>` binds only the named tests. |
319
321
  | `outerlayer emit <name> --result <pass\|fail> [--link <url>] [--body <text>\|--body-file <path>] --item <number>` | Record one named check's outcome on a work item. A check that ran carries the run URL as its proof (`--link`); a judgment you are making yourself carries one sentence (`--body`, or `--body-file` to read it from a file — `-` reads standard input). A `fail` needs at least one of the two; a `pass` needs neither. `--item` names the work item by the number printed when the item was created — always required, in or out of a recorded session; a session records checks on its own item like any other, stored as the session's, but cannot clear a person's fail. Prints the recorded check's id. Who recorded it comes from your API key, never from what you send. |
320
322
  | `outerlayer work comment --item <n> [--criterion <id>] --body <text> [--artifact <id>] [--pass\|--fail\|--attach\|--ready]` | Post one comment on a work item's general thread, or on one acceptance criterion's own thread with `--criterion`. `--pass`/`--fail` need a person's own credential and apply to the whole item, so they work on the general thread only and the gateway refuses them with `--criterion`; `--attach` makes the named artifact that criterion's current proof; `--ready` hands a thread back to a person. The detected session id rides along automatically, only ever narrowing what the comment may do. |
321
323
  | `outerlayer work threads --item <n>` | Read a work item's threads back — the general thread first, then one per criterion with proof or a comment, each with its `waitingOn`. |
322
324
  | `outerlayer emit finding --id <id> --category <context\|flaky-test\|tooling\|environment\|defect\|other> --title <text> --file <path> --where <label> [--line <n>] [--item <number>] …` | Record one problem you hit in the factory. `--category` is one of `context` (an instruction that is wrong, broken or missing), `flaky-test`, `tooling`, `environment`, `defect` (a bug outside your own change) or `other`. A `context` finding also needs `--rule-path` and `--rule-relation` (`wrong`, `broken` or `missing`), and `--rule-quote` unless the relation is `missing`. Findings are informational; nothing reads one to pass or fail the work. `--item` names the work item; without it, inside a recorded session, the item that session was launched for is used automatically. Re-emitting the same `--id` on the item replaces that finding. |
323
325
  | `outerlayer emit findings <file> [--item <number>]` | Record a whole batch at once, read from a JSON file (`-` for standard input) with `"schemaVersion": 2` — the same shape and validation as `emit finding`, one record per id, category, title, file, line, rule and where. Anchored the same way: `--item`, else a recorded session's own item. |
324
- | `outerlayer emit criteria <file> [--item <number>]` | Record a work item's acceptance criteria as one list, read from a JSON file (`-` for standard input): `{"criteria": [{"id": "AC-1", "text": "Given …", "proof": null}]}`. An `id` is 1 to 64 characters of `A-Z a-z 0-9 . _ : -`, the same id `emit artifact --for` binds evidence to. `proof` is `video`, `screenshot`, `report`, `log`, `file` or `null` (any bound artifact proves it). The list holds 1 to 200 criteria, each `text` at most 2,000 characters, with no id twice. It is validated before anything is sent. This list is the only source for the item's Criteria tab. Once an item has a list, only a person can replace it: run the command outside an agent session, with your own login. Anchored the same way as `emit findings`: `--item`, else a recorded session's own item. |
326
+ | `outerlayer emit criteria <file> [--item <number>]` | Record a work item's acceptance criteria as one list, read from a JSON file (`-` for standard input): `{"criteria": [{"id": "AC-1", "text": "Given …", "proof": null}]}`. An `id` is 1 to 64 characters of `A-Z a-z 0-9 . _ : -`, the same id `emit artifact --for` binds evidence to. `proof` is `video`, `screenshot`, `report`, `log`, `test`, `file` or `null` (any bound artifact proves it). The list holds 1 to 200 criteria, each `text` at most 2,000 characters, with no id twice. It is validated before anything is sent. This list is the only source for the item's Criteria tab. Once an item has a list, only a person can replace it: run the command outside an agent session, with your own login. Anchored the same way as `emit findings`: `--item`, else a recorded session's own item. |
325
327
  | `outerlayer mcp install [--transport stdio\|http] [--url] [--name] [--command]` | Write (or update) an `mcpServers` entry in `.mcp.json` for the OuterLayer gateway. Default `stdio`: the client spawns `outerlayer mcp serve`, which reads the API key from `~/.outerlayer/config.json` (or `OUTERLAYER_API_KEY`) each time it connects, so a reconnect picks up a newly saved or rotated key. `--transport http` writes a direct `POST /v1/mcp` entry referencing `${OUTERLAYER_API_KEY}`, resolved by the client from the environment it was launched with. Never writes an API key. Pass `--url`/`--app-id` for self-host. |
326
328
  | `outerlayer mcp serve [--url] [--app-id]` | Stdio MCP server bridging stdin/stdout JSON-RPC to the gateway's `POST /v1/mcp`. What the stdio `.mcp.json` entry runs; exits 1 with a clear message when no API key is configured. |
327
329
  | `outerlayer work build --issue <n\|KEY>\|--item <n> [--tracker linear\|jira] [--local] [--repo] [--note] [--retry <count>]` | Starts work on an item and puts it on the Work page. `--issue` takes a GitHub issue number or a Linear or Jira key such as `ENG-123`; the gateway verifies a key against the factory's tracker connection before adding it. `--tracker` is needed only when both Linear and Jira are connected. A key gets a repository only from `--repo`, never from the checkout. Without `--local`, records a build request that a host takes when it has a free slot. With `--local` (issue only), no host takes it: it prints the item's number and the line that starts your own session on it, such as `OUTERLAYER_WORK=7 claude`. `--retry` resends after a 5xx or 429 answer, up to that many more times. |
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- export { buildRepositoryImage } from './chunk-ZNA27WEV.js';
3
+ export { buildRepositoryImage } from './chunk-Z62HNKEJ.js';
4
4
  import './chunk-N5FOE5PS.js';
5
5
  export { RecipeError } from './chunk-QOZKPLVJ.js';
6
6
  import './chunk-ZM2IMMYN.js';
@@ -1 +1 @@
1
- {"id":"2026-10-02T18:11:11.100Z+54c322e","root":"/home/runner/_work/outerlayer/outerlayer","pkg":"outerlayer"}
1
+ {"id":"2026-10-03T18:15:54.958Z+defeb9b","root":"/home/runner/_work/outerlayer/outerlayer","pkg":"outerlayer"}
@@ -1,28 +1,28 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { probeCredentials } from './chunk-FS2VYGZT.js';
4
- import './chunk-FAJSS2WN.js';
5
- import './chunk-FV2CCGXK.js';
3
+ import { probeCredentials } from './chunk-L24G4PLP.js';
4
+ import './chunk-RWOTHXYE.js';
5
+ import './chunk-QDQEUVUF.js';
6
6
  import './chunk-ABIWDUMS.js';
7
7
  import './chunk-YYYXRJUW.js';
8
8
  import './chunk-CBPPJSAR.js';
9
- import { placeholderQueues, placeholderProblem, needsClaudeCredential, claudeCredentialCheck, claimPermissionProblem } from './chunk-7YIOOFVJ.js';
10
- import './chunk-HE2D4EY5.js';
9
+ import { placeholderQueues, placeholderProblem, needsClaudeCredential, claudeCredentialCheck, claimPermissionProblem } from './chunk-OHFDWLJP.js';
10
+ import './chunk-ZOC7JSYC.js';
11
11
  import './chunk-TBT347UY.js';
12
- import './chunk-CBZB6XY6.js';
13
- import './chunk-L2DBRKRA.js';
14
- import './chunk-7A6RVXPZ.js';
15
- import './chunk-ZNA27WEV.js';
12
+ import './chunk-FC7TMRNA.js';
13
+ import './chunk-RJ467PDQ.js';
14
+ import './chunk-4NMBDRBS.js';
15
+ import './chunk-Z62HNKEJ.js';
16
16
  import './chunk-N5FOE5PS.js';
17
17
  import './chunk-OGFGZQA3.js';
18
18
  import './chunk-774HEQL6.js';
19
19
  import './chunk-QOZKPLVJ.js';
20
20
  import './chunk-W4SQCOZU.js';
21
21
  import './chunk-B2G7JHHB.js';
22
- import './chunk-5DLBAXY5.js';
22
+ import './chunk-RMAZ2NWA.js';
23
23
  import './chunk-BFESLKPP.js';
24
- import './chunk-6Y63SXFO.js';
25
- import './chunk-G7FSV7JX.js';
24
+ import './chunk-WOBNRVQT.js';
25
+ import './chunk-EX6M5JPR.js';
26
26
  import { loadRunnerConfig, RunnerConfigError, checkHooks } from './chunk-5Y3QQRUH.js';
27
27
  import './chunk-F6GFZXZ3.js';
28
28
  import './chunk-AUFG23AA.js';
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { readDefaultBranchHead, cloneRepository, buildRepositoryImage, CLAUDE_CODE_VERSION, firecrackerArch, MICROVM_ARCHES, DEFAULT_BASE_IMAGE, GUEST_HELPER_SHA256, GUEST_ASSETS_BASE_URL, GUEST_KERNEL_SHA256, FIRECRACKER_BINARY_SHA256, FIRECRACKER_SHA256, FIRECRACKER_VERSION, GUEST_ASSETS_VERSION } from './chunk-ZNA27WEV.js';
3
+ import { readDefaultBranchHead, cloneRepository, buildRepositoryImage, CLAUDE_CODE_VERSION, firecrackerArch, MICROVM_ARCHES, DEFAULT_BASE_IMAGE, GUEST_HELPER_SHA256, GUEST_ASSETS_BASE_URL, GUEST_KERNEL_SHA256, FIRECRACKER_BINARY_SHA256, FIRECRACKER_SHA256, FIRECRACKER_VERSION, GUEST_ASSETS_VERSION } from './chunk-Z62HNKEJ.js';
4
4
  import { startTimeOf, isSameProcess } from './chunk-N5FOE5PS.js';
5
5
  import { currentCliBuild } from './chunk-OGFGZQA3.js';
6
6
  import { createDockerHost, childEnvironment, spawnRun } from './chunk-774HEQL6.js';
7
7
  import { RecipeError } from './chunk-QOZKPLVJ.js';
8
8
  import { execCapture } from './chunk-W4SQCOZU.js';
9
9
  import { GUEST_CID } from './chunk-B2G7JHHB.js';
10
- import { WorkCommandError, postJson } from './chunk-5DLBAXY5.js';
10
+ import { WorkCommandError, postJson } from './chunk-RMAZ2NWA.js';
11
11
  import { parseDuKilobytes, hostAllowed } from './chunk-F6GFZXZ3.js';
12
12
  import { RELAY_PORT, CHECKOUT_DIR, JOB_MOUNT, claudeCredential, buildEnvironment, startBuildServices, AGENT_CREDENTIAL_MISSING, GATEWAY_PORT, GATEWAY_SOCKET, CLAUDE_PORT, CLAUDE_SOCKET, DESTINATION_BASE_PORT } from './chunk-AUFG23AA.js';
13
13
  import { defaultGitRunner, materializeContext } from './chunk-XDDW4FRS.js';
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { sanitizeTerminal } from './chunk-6Y63SXFO.js';
3
+ import { sanitizeTerminal } from './chunk-WOBNRVQT.js';
4
4
  import { DEFAULT_DASHBOARD } from './chunk-USO2DKBD.js';
5
5
  import { readCloudConfig } from './chunk-EABW6AJQ.js';
6
6
 
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { applyContextProvenance, installScrubContext, prepareSessionForUpload, wholeSessionCounts, sliceTurnIo } from './chunk-HE2D4EY5.js';
3
+ import { applyContextProvenance, installScrubContext, prepareSessionForUpload, wholeSessionCounts, sliceTurnIo } from './chunk-ZOC7JSYC.js';
4
4
  import { LaunchFilter } from './chunk-BCJNHMZT.js';
5
5
  import { RepoFilter } from './chunk-TBT347UY.js';
6
6
  import { hookExecSpoolPath } from './chunk-F7CU5ABH.js';
7
7
  import { applyReportedCost } from './chunk-BKO6JEZI.js';
8
- import { migrateLegacyArtifactSidecars, planArtifactUpload, artifactsStatePath, sanitizeTerminal, artifactBlobsDir, resolveArtifactTurnIndex, isArtifactTombstoned, ARTIFACT_RETRY_MAX_AGE_MS, writeArtifactSpoolState, reclaimUnneededArtifactBlobs, neededArtifactShas } from './chunk-6Y63SXFO.js';
9
- import { tailTranscript, enrichSessionRepo, CAPTURE_TIERS, scanAll, setRepoRoot, resolveRepoIdentity, inferArtifactKind, bannedPathsForTier, sessionIdFromPath, SOURCE_ADAPTERS, EVENT_TYPES } from './chunk-G7FSV7JX.js';
8
+ import { migrateLegacyArtifactSidecars, planArtifactUpload, artifactsStatePath, sanitizeTerminal, artifactBlobsDir, resolveArtifactTurnIndex, isArtifactTombstoned, ARTIFACT_RETRY_MAX_AGE_MS, writeArtifactSpoolState, reclaimUnneededArtifactBlobs, neededArtifactShas } from './chunk-WOBNRVQT.js';
9
+ import { tailTranscript, enrichSessionRepo, CAPTURE_TIERS, scanAll, setRepoRoot, resolveRepoIdentity, inferArtifactKind, bannedPathsForTier, sessionIdFromPath, SOURCE_ADAPTERS, EVENT_TYPES } from './chunk-EX6M5JPR.js';
10
10
  import { C } from './chunk-YRYMNBGQ.js';
11
11
  import { readLaunchSpoolState, launchStatusIsDecisive, launchedItemsBySession, launchesPath } from './chunk-DVDEBNQJ.js';
12
12
  import { readLatestProvenanceForSession, readContextProvenance } from './chunk-ZJSNLVCE.js';
@@ -786,14 +786,16 @@ var KNOWN_PERMANENT_ARTIFACT_ERROR_CODES = /* @__PURE__ */ new Set([
786
786
  "unknown_replaces_target",
787
787
  "nothing_to_attach",
788
788
  "artifact_content_conflict",
789
- "payload_too_large"
789
+ "payload_too_large",
790
+ "unreadable_test_results"
790
791
  ]);
791
792
  var NEVER_REACHED_SERVER_ERROR_CODES = /* @__PURE__ */ new Set([
792
793
  "invalid_request_body",
793
794
  "invalid_field_value",
794
795
  "session_not_found",
795
796
  "nothing_to_attach",
796
- "payload_too_large"
797
+ "payload_too_large",
798
+ "unreadable_test_results"
797
799
  ]);
798
800
  function splitPayload(payload) {
799
801
  const mid = Math.ceil(payload.sessions.length / 2);
@@ -1493,6 +1495,7 @@ ${C.yellow}!${C.reset} batch ${shippedBatches + 1}/${batches.length} accounting
1493
1495
  ...record.commitSha !== void 0 ? { commitSha: record.commitSha } : {},
1494
1496
  ...replaces !== void 0 ? { replaces } : {},
1495
1497
  ...record.replacesTargets !== void 0 ? { replacesTargets: record.replacesTargets } : {},
1498
+ ...record.tests !== void 0 ? { tests: record.tests } : {},
1496
1499
  session: { sessionId: record.sessionId, ...turnIndex !== void 0 ? { turnIndex } : {} }
1497
1500
  },
1498
1501
  blob: { data: blobData.toString("base64") }