@outerlayer/cli 0.34.0-next.20261026200155 → 0.34.0-next.20261026214555

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.
@@ -1 +1 @@
1
- {"id":"2026-10-26T20:03:44.568Z+31b3f04","root":"/home/runner/_work/outerlayer/outerlayer","pkg":"outerlayer"}
1
+ {"id":"2026-10-26T21:47:27.971Z+9728168","root":"/home/runner/_work/outerlayer/outerlayer","pkg":"outerlayer"}
@@ -1,14 +1,14 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { probeCredentials } from './chunk-FVF2LMVG.js';
3
+ import { probeCredentials } from './chunk-C2LMT42U.js';
4
4
  import './chunk-3JVYMD4G.js';
5
- import './chunk-RNMCFAYH.js';
5
+ import './chunk-QVH4RRUQ.js';
6
6
  import './chunk-E7R2GIAW.js';
7
7
  import './chunk-MH6QLXUO.js';
8
8
  import './chunk-HOUFCUMH.js';
9
- import './chunk-5ZBVKRDK.js';
9
+ import './chunk-RRCLYSCM.js';
10
10
  import './chunk-TS3EFB7S.js';
11
- import './chunk-JKLSQOYO.js';
11
+ import './chunk-VCIB3HUZ.js';
12
12
  import './chunk-ZVB57WI6.js';
13
13
  import './chunk-6CK2OC4Q.js';
14
14
  import './chunk-P3NPTFLF.js';
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
3
  import { decideInstalledSwitch } from './chunk-3JVYMD4G.js';
4
- import { reportFailedStart, fitImageBuildMemory } from './chunk-RNMCFAYH.js';
4
+ import { reportFailedStart, fitImageBuildMemory } from './chunk-QVH4RRUQ.js';
5
5
  import { fetchVersionMeta, npmVersion, npmSupportsProvenance, fetchTarballDigest, fetchProvenance, installVersion, auditSignatures } from './chunk-E7R2GIAW.js';
6
6
  import { RUNNER_PROTOCOL } from './chunk-MH6QLXUO.js';
7
7
  import { writePendingUpdate } from './chunk-HOUFCUMH.js';
8
- import { renderUpdateSteps } from './chunk-5ZBVKRDK.js';
8
+ import { renderUpdateSteps } from './chunk-RRCLYSCM.js';
9
9
  import { readHousekeepingRecord, writeHousekeepingRecord } from './chunk-TS3EFB7S.js';
10
- import { releaseLease, isUnfinished, setStage, jobEnv, runHook, describeHookEnd, provisionMicroVm, deliverCommitHooks, provisionProcess, readProvisionOut, workdirProblem, MICROVM_COMMAND_DIR, commandLogOffset, startMicroVmCommand, microVmCommandLine, runCommand, startSender, finishJob, sampleGuest, foldSample, isContainerTracked, isMicroVmTracked, probeMicroVmCommand, probeCommand, appendCommandLog, judgeProbe, EXIT_CODE_FILE, isTracked, isGroupAlive, outcomeFromExitCode, isTimedOut, readCpuUsec, isIdle, stopOrphanedMicroVms, unfinishedJobs, listUnreadableJobs, listAdoptableJobs, retryFailedReleases, recoverLostJobs, GUEST_USAGE_INTERVAL_MS, hookLimitsFor, AttemptLogBook, microVmOomKills, needsRenew, renewLease, RENEW_INTERVAL_SECONDS, listTrackedJobs, restartSender, serveLease, vmAlive, writeGuestGhConfig, ALREADY_RELEASED, inTeardown } from './chunk-JKLSQOYO.js';
10
+ import { releaseLease, isUnfinished, setStage, jobEnv, runHook, describeHookEnd, provisionMicroVm, deliverCommitHooks, provisionProcess, readProvisionOut, workdirProblem, MICROVM_COMMAND_DIR, commandLogOffset, startMicroVmCommand, microVmCommandLine, runCommand, startSender, finishJob, sampleGuest, foldSample, isContainerTracked, isMicroVmTracked, probeMicroVmCommand, probeCommand, appendCommandLog, judgeProbe, EXIT_CODE_FILE, isTracked, isGroupAlive, outcomeFromExitCode, isTimedOut, readCpuUsec, isIdle, stopOrphanedMicroVms, unfinishedJobs, listUnreadableJobs, listAdoptableJobs, retryFailedReleases, recoverLostJobs, GUEST_USAGE_INTERVAL_MS, hookLimitsFor, AttemptLogBook, microVmOomKills, needsRenew, renewLease, RENEW_INTERVAL_SECONDS, listTrackedJobs, restartSender, serveLease, vmAlive, writeGuestGhConfig, ALREADY_RELEASED, inTeardown } from './chunk-VCIB3HUZ.js';
11
11
  import { JOB_STATE_FORMAT, readsJobState, jobStateFormatOf } from './chunk-ZVB57WI6.js';
12
12
  import { realBlockedProbes, checkBlockedWithSlots, largeBuildMemoryBytes, LARGE_BUILD_DISK_BYTES, checkManagedRoom, sliceMemoryOf } from './chunk-ZADRW2V2.js';
13
13
  import { writeMarker, readMarker, currentVersion, removeMarker, isInLayout, startedThroughCurrent, entryIn, versionDir, switchCurrent, cleanVersions, stagingDir } from './chunk-YL3RWW7X.js';
@@ -3279,7 +3279,7 @@ async function startRunner(configPath, deps, startup) {
3279
3279
  check: update.check ? () => update.check(configPath) : async () => {
3280
3280
  const held = heldClaudeCredential();
3281
3281
  const env = held === void 0 ? process.env : { ...process.env, [held.variable]: held.value };
3282
- return (await import('./check-FOWN6M3C.js')).runRunnerCheck(configPath, { fetchImpl: deps.fetchImpl, env });
3282
+ return (await import('./check-WK5P7CEG.js')).runRunnerCheck(configPath, { fetchImpl: deps.fetchImpl, env });
3283
3283
  },
3284
3284
  now: () => (deps.now ?? (() => /* @__PURE__ */ new Date()))().getTime(),
3285
3285
  log
@@ -159,13 +159,22 @@ function checkoutPlaces(cwd) {
159
159
  if (dirname(dir) === dir) return void 0;
160
160
  }
161
161
  }
162
- async function judgeCheckName(cwd) {
162
+ function governingDir(cwd) {
163
163
  const places = checkoutPlaces(cwd);
164
- if (places === void 0) return {};
165
- const delivered = readDeliveryRecord(places.common);
166
- const dir = delivered?.dir ?? places.root;
164
+ if (places === void 0) return void 0;
165
+ return readDeliveryRecord(places.common)?.dir ?? places.root;
166
+ }
167
+ async function testProofMode(cwd) {
168
+ const dir = governingDir(cwd);
169
+ if (dir === void 0) return "any";
170
+ const { testProofIn } = await import('./host-checks-HAXPZSDU.js');
171
+ return testProofIn(dir);
172
+ }
173
+ async function judgeCheckName(cwd) {
174
+ const dir = governingDir(cwd);
175
+ if (dir === void 0) return {};
167
176
  if (!existsSync(dir)) return { note: `the governed context at ${dir} is not readable` };
168
- const { checksIn, isJudgeCheck } = await import('./host-checks-V25YUP4Q.js');
177
+ const { checksIn, isJudgeCheck } = await import('./host-checks-HAXPZSDU.js');
169
178
  const quiet = { line: () => void 0, error: () => void 0 };
170
179
  const check = checksIn(dir, quiet, "").checks.find((c) => isJudgeCheck(c) && c.judge.subjects === "criteria");
171
180
  return check === void 0 ? {} : { name: check.name };
@@ -211,19 +220,19 @@ function otherPullRequestHeads(pullRequests, ownPr, checkoutRepository) {
211
220
  }
212
221
  return heads;
213
222
  }
214
- function classifyProofs(data, checkoutHead) {
223
+ function classifyProofs(data, checkoutHead, listing = {}) {
215
224
  const heads = /* @__PURE__ */ new Set();
216
225
  if (checkoutHead !== void 0 && checkoutHead !== "") heads.add(checkoutHead.toLowerCase());
217
226
  data.pullRequests?.forEach((pr) => {
218
227
  const head = liveHead(pr);
219
228
  if (head !== void 0) heads.add(head);
220
229
  });
221
- return classifyProofsAt(data, heads);
230
+ return classifyProofsAt(data, heads, listing);
222
231
  }
223
- function classifyProofsAt(data, heads) {
232
+ function classifyProofsAt(data, heads, listing = {}) {
224
233
  const entries = [];
225
234
  for (const criterion of data.criteria?.items ?? []) {
226
- if (criterion.proof === null || criterion.proof === "test") continue;
235
+ if (criterion.proof === null || criterion.proof === "test" && listing.tests !== true) continue;
227
236
  const newest = criterion.newestProof;
228
237
  if (newest === null || newest === void 0) {
229
238
  entries.push({ id: criterion.id, proof: criterion.proof, state: "missing", commit: null });
@@ -244,11 +253,14 @@ function renderEntry(e) {
244
253
  if (e.state === "failed") {
245
254
  return `${id} none failed ${sanitizeTerminal(e.commit)} The judge failed it: ${sanitizeTerminal(e.reason)} No test that cites it has changed since. Change a test that cites ${id}.`;
246
255
  }
247
- return `${id} ${sanitizeTerminal(e.proof)} ${STATE_LABEL[e.state]} ${sanitizeTerminal(e.commit ?? "no commit")}`;
256
+ const row = `${id} ${sanitizeTerminal(e.proof)} ${STATE_LABEL[e.state]} ${sanitizeTerminal(e.commit ?? "no commit")}`;
257
+ if (e.proof !== "test" || e.state === "current") return row;
258
+ return `${row} Run the tests with a JUnit reporter at HEAD, then run outerlayer emit artifact <file> --for ${id}`;
248
259
  }
249
- function render(entries, notes, json) {
260
+ function render(entries, notes, json, tests) {
250
261
  if (json) return JSON.stringify(entries);
251
- const lines = entries.length === 0 ? ["No criterion declares a proof other than test."] : entries.map(renderEntry);
262
+ const none = tests ? "No criterion declares a proof." : "No criterion declares a proof other than test.";
263
+ const lines = entries.length === 0 ? [none] : entries.map(renderEntry);
252
264
  if (notes.length > 0) lines.push(`The command could not check the judge's results: ${notes.map(sanitizeTerminal).join("; ")}.`);
253
265
  return lines.join("\n");
254
266
  }
@@ -283,11 +295,13 @@ async function runWorkProofs(opts) {
283
295
  if (!checkoutHead) {
284
296
  throw new WorkCommandError("cannot read the checkout's HEAD. Run this inside the git checkout, or pass the head explicitly.");
285
297
  }
286
- const declared = classifyProofs(body, checkoutHead);
287
- const unproven = await findUnproven({ item: body, cwd: opts.cwd ?? process.cwd(), head: checkoutHead });
298
+ const cwd = opts.cwd ?? process.cwd();
299
+ const tests = body.criteria?.testProofsReported === true && await testProofMode(cwd) === "any";
300
+ const declared = classifyProofs(body, checkoutHead, { tests });
301
+ const unproven = await findUnproven({ item: body, cwd, head: checkoutHead });
288
302
  const entries = [...declared, ...unproven.entries];
289
303
  const json = opts.json === true;
290
- const output = render(entries, json ? [] : unproven.notes, json);
304
+ const output = render(entries, json ? [] : unproven.notes, json, tests);
291
305
  if (!opts.quiet) {
292
306
  process.stdout.write(output + "\n");
293
307
  if (json && unproven.notes.length > 0) process.stderr.write(`The command could not check the judge's results: ${unproven.notes.join("; ")}.
@@ -300,7 +314,7 @@ async function runWorkProofs(opts) {
300
314
  async function runWorkProofsCommand(opts) {
301
315
  try {
302
316
  if (opts.record) {
303
- const { runWorkProofsRecord } = await import('./work-proofs-record-MCSA56F5.js');
317
+ const { runWorkProofsRecord } = await import('./work-proofs-record-FCA47NNX.js');
304
318
  const result2 = await runWorkProofsRecord(opts);
305
319
  process.exitCode = result2.exitCode;
306
320
  return;
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { scrubReason, stripTerminalControls } from './chunk-JKLSQOYO.js';
3
+ import { scrubReason, stripTerminalControls } from './chunk-VCIB3HUZ.js';
4
4
  import { checkFit, RUNNER_RESERVE_BYTES } from './chunk-3NCWHEGM.js';
5
5
  import { RunnerAlreadyRunningError, readPidFile } from './chunk-LQHCNXPK.js';
6
6
  import { isSameProcess } from './chunk-JBJTC3UU.js';
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { stripTerminalControls } from './chunk-JKLSQOYO.js';
3
+ import { stripTerminalControls } from './chunk-VCIB3HUZ.js';
4
4
  import { tagToPull, imageTag, pullInstruction, readUpdateStatus, runnerImageVersion } from './chunk-SDELQEG4.js';
5
5
  import { readFileSync } from 'fs';
6
6
 
@@ -3104,6 +3104,10 @@ function asHostReads(file, base, log, tag) {
3104
3104
  log.line(`${tag} ${file.path} is an unedited copy an earlier release wrote, so it is read as this CLI writes it`);
3105
3105
  return { path: file.path, content: upgraded };
3106
3106
  }
3107
+ function testProofIn(root) {
3108
+ const policyText = readInside(root, POLICY_FILE);
3109
+ return parsePolicy(policyText === void 0 ? null : { path: POLICY_FILE, content: policyText }, []).testProof;
3110
+ }
3107
3111
  function checksIn(root, log, tag) {
3108
3112
  const base = existsSync(join(root, AGENTS_SKILLS_BASE)) ? AGENTS_SKILLS_BASE : OUTERLAYER_SKILLS_BASE;
3109
3113
  const policyText = readInside(root, POLICY_FILE);
@@ -3471,4 +3475,4 @@ async function runHostChecks(input) {
3471
3475
  }
3472
3476
  }
3473
3477
 
3474
- export { ALREADY_RELEASED, AttemptLogBook, EXIT_CODE_FILE, GUEST_USAGE_INTERVAL_MS, MAX_CHECK_ITEMS_BYTES, MICROVM_COMMAND_DIR, RENEW_INTERVAL_SECONDS, appendCommandLog, checksIn, commandItems, commandLogOffset, deliverCommitHooks, describeHookEnd, finishJob, foldSample, hookLimitsFor, inTeardown, isContainerTracked, isGroupAlive, isIdle, isJudgeCheck, isMicroVmTracked, isReadable, isTimedOut, isTracked, isUnfinished, jobEnv, judgeProbe, listAdoptableJobs, listTrackedJobs, listUnreadableJobs, makeRecorder, microVmCommandLine, microVmOomKills, needsRenew, outcomeFromExitCode, probeCommand, probeMicroVmCommand, provisionMicroVm, provisionProcess, readCpuUsec, readDefinitions, readProvisionOut, recoverLostJobs, releaseLease, renewLease, restartSender, retryFailedReleases, runCommand, runHook, runHostChecks, sampleGuest, scrubReason, serveLease, setStage, startMicroVmCommand, startSender, stopOrphanedMicroVms, stripTerminalControls, timeoutAfter, unfinishedJobs, vmAlive, workdirProblem, writeGuestGhConfig };
3478
+ export { ALREADY_RELEASED, AttemptLogBook, EXIT_CODE_FILE, GUEST_USAGE_INTERVAL_MS, MAX_CHECK_ITEMS_BYTES, MICROVM_COMMAND_DIR, RENEW_INTERVAL_SECONDS, appendCommandLog, checksIn, commandItems, commandLogOffset, deliverCommitHooks, describeHookEnd, finishJob, foldSample, hookLimitsFor, inTeardown, isContainerTracked, isGroupAlive, isIdle, isJudgeCheck, isMicroVmTracked, isReadable, isTimedOut, isTracked, isUnfinished, jobEnv, judgeProbe, listAdoptableJobs, listTrackedJobs, listUnreadableJobs, makeRecorder, microVmCommandLine, microVmOomKills, needsRenew, outcomeFromExitCode, probeCommand, probeMicroVmCommand, provisionMicroVm, provisionProcess, readCpuUsec, readDefinitions, readProvisionOut, recoverLostJobs, releaseLease, renewLease, restartSender, retryFailedReleases, runCommand, runHook, runHostChecks, sampleGuest, scrubReason, serveLease, setStage, startMicroVmCommand, startSender, stopOrphanedMicroVms, stripTerminalControls, testProofIn, timeoutAfter, unfinishedJobs, vmAlive, workdirProblem, writeGuestGhConfig };
@@ -4964,7 +4964,7 @@ differs from HEAD.
4964
4964
  fail(trackerNumberError("--pr", opts.pr));
4965
4965
  return;
4966
4966
  }
4967
- const { runWorkProofsCommand } = await import('./work-proofs-cmd-LIXV252G.js');
4967
+ const { runWorkProofsCommand } = await import('./work-proofs-cmd-BO6Q2LVK.js');
4968
4968
  await runWorkProofsCommand({ ...opts, ...pr === void 0 ? {} : { pr } });
4969
4969
  });
4970
4970
  workCmd.command("list").description("List live work items for this factory").option("--stage <spec|build|review>", "filter by stage").option("--section <attention|waiting|flowing>", "filter by Queue section").option("--repo <owner/name>", "repository (default: the current checkout's remote)").option("--unclaimed", "only items with no live lease").option("--claimed", "only items with a live lease, held by a host or a local session").option("--startable", "only items a host can start: a build request, no open PR, no live lease").option("--needs <amend>", "only items with a thread waiting on an agent").option("--json", "machine-readable JSON output").option("--url <url>", "cloud base URL (or OUTERLAYER_URL / config)").addOption(apiKeyOption()).option("--app-id <id>", "factory id the key is bound to (or OUTERLAYER_APP_ID / config)").action(async (opts) => {
@@ -5111,7 +5111,7 @@ function registerRunnerCommands(program2) {
5111
5111
  const configOption = "the cloud config file to run against (default: ~/.outerlayer/config.json)";
5112
5112
  runnerCmd.command("start").description("Run the loop: claim work, run it, report, clean up, repeat").option("--config <path>", configOption).action(async (opts) => {
5113
5113
  const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-EBT5VYPX.js');
5114
- const { start, RunnerStartError } = await import('./loop-UVONXWXB.js');
5114
+ const { start, RunnerStartError } = await import('./loop-KP5CI2JH.js');
5115
5115
  const { RunnerAlreadyRunningError } = await import('./pidfile-PCG2H5T4.js');
5116
5116
  const configPath = opts.config ?? defaultRunnerConfigPath();
5117
5117
  try {
@@ -5130,8 +5130,8 @@ function registerRunnerCommands(program2) {
5130
5130
  "\nReads OUTERLAYER_URL, OUTERLAYER_APP_ID, OUTERLAYER_API_KEY, OUTERLAYER_RUNNER_NAME and one Claude credential\n(CLAUDE_CODE_OAUTH_TOKEN or ANTHROPIC_API_KEY) from the environment. OUTERLAYER_AGENT\nis optional and defaults to claude. On a later start it refuses variables that disagree with the config in the volume.\nThe image sets OUTERLAYER_RUNNER_IMAGE; outside the image, use `runner start`.\n"
5131
5131
  ).action(async () => {
5132
5132
  const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-EBT5VYPX.js');
5133
- const { containerStart } = await import('./container-start-RLX2PL3C.js');
5134
- const { start, RunnerStartError } = await import('./loop-UVONXWXB.js');
5133
+ const { containerStart } = await import('./container-start-UNY3PO5U.js');
5134
+ const { start, RunnerStartError } = await import('./loop-KP5CI2JH.js');
5135
5135
  const { RunnerAlreadyRunningError } = await import('./pidfile-PCG2H5T4.js');
5136
5136
  try {
5137
5137
  const result = await containerStart({
@@ -5155,14 +5155,14 @@ function registerRunnerCommands(program2) {
5155
5155
  ).action(async (opts) => {
5156
5156
  const { defaultRunnerConfigPath } = await import('./config-EBT5VYPX.js');
5157
5157
  const { runnerDir } = await import('./paths-AQ47ZRHK.js');
5158
- const { runUpdateSteps } = await import('./update-steps-MC3IUHW7.js');
5158
+ const { runUpdateSteps } = await import('./update-steps-HPMQMEQR.js');
5159
5159
  const text = await runUpdateSteps({ runnerDirPath: runnerDir(opts.config ?? defaultRunnerConfigPath()) });
5160
5160
  process.stdout.write(`${text}
5161
5161
  `);
5162
5162
  });
5163
5163
  runnerCmd.command("check").description("Validate the config, the hooks and the key, and print the effective settings").option("--config <path>", configOption).action(async (opts) => {
5164
5164
  const { defaultRunnerConfigPath } = await import('./config-EBT5VYPX.js');
5165
- const { runRunnerCheck } = await import('./check-FOWN6M3C.js');
5165
+ const { runRunnerCheck } = await import('./check-WK5P7CEG.js');
5166
5166
  const configPath = opts.config ?? defaultRunnerConfigPath();
5167
5167
  const result = await runRunnerCheck(configPath);
5168
5168
  if (!result.ok) {
@@ -5570,7 +5570,7 @@ Next:
5570
5570
  });
5571
5571
  runnerCmd.command("stop").description("Take no more work; finish running jobs, then exit").option("--config <path>", "the cloud config file naming the runner to stop").option("--now", "end running jobs immediately, with outcome stopped").action(async (opts) => {
5572
5572
  const { defaultRunnerConfigPath } = await import('./config-EBT5VYPX.js');
5573
- const { requestStop } = await import('./loop-UVONXWXB.js');
5573
+ const { requestStop } = await import('./loop-KP5CI2JH.js');
5574
5574
  const configPath = opts.config ?? defaultRunnerConfigPath();
5575
5575
  const { runnerImageVersion } = await import('./image-tag-BTXKIH73.js');
5576
5576
  await requestStop(configPath, Boolean(opts.now), void 0, { image: runnerImageVersion() !== void 0 });
@@ -5578,8 +5578,8 @@ Next:
5578
5578
  runnerCmd.command("status").description("List running jobs; with --recent, finished ones too").option("--config <path>", "the cloud config file naming the runner to inspect").option("--recent", "also list finished jobs, newest first, capped at 20").option("--json", "machine-readable JSON output").action(async (opts) => {
5579
5579
  const { defaultRunnerConfigPath, loadRunnerConfig } = await import('./config-EBT5VYPX.js');
5580
5580
  const { jobsDir, runnerDir } = await import('./paths-AQ47ZRHK.js');
5581
- const { listJobFiles, runnerProcessState } = await import('./loop-UVONXWXB.js');
5582
- const { renderStatus } = await import('./status-YCQHAY45.js');
5581
+ const { listJobFiles, runnerProcessState } = await import('./loop-KP5CI2JH.js');
5582
+ const { renderStatus } = await import('./status-TVN6CDEF.js');
5583
5583
  const { readHousekeepingRecord } = await import('./record-SVCNFCGQ.js');
5584
5584
  const path2 = await import('path');
5585
5585
  const configPath = opts.config ?? defaultRunnerConfigPath();
@@ -5638,7 +5638,7 @@ Next:
5638
5638
  });
5639
5639
  runnerCmd.command("logs").argument("<item>", "the work item's number in the factory").description("Print the newest attempt's log for one item").option("--config <path>", "the cloud config file naming the runner to inspect").option("-f, --follow", "keep printing as the log grows").action(async (itemArg, opts) => {
5640
5640
  const { defaultRunnerConfigPath } = await import('./config-EBT5VYPX.js');
5641
- const { listJobFiles } = await import('./loop-UVONXWXB.js');
5641
+ const { listJobFiles } = await import('./loop-KP5CI2JH.js');
5642
5642
  const { newestAttempt, logPathFor, tail, RunnerLogsError } = await import('./logs-LEVH6VAI.js');
5643
5643
  const configPath = opts.config ?? defaultRunnerConfigPath();
5644
5644
  const item = parseTrackerNumber(itemArg);
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { reportFailedStart, BUILD_MEMORY_VARIABLE } from './chunk-RNMCFAYH.js';
4
- import { readOwnContainer } from './chunk-5ZBVKRDK.js';
5
- import './chunk-JKLSQOYO.js';
3
+ import { reportFailedStart, BUILD_MEMORY_VARIABLE } from './chunk-QVH4RRUQ.js';
4
+ import { readOwnContainer } from './chunk-RRCLYSCM.js';
5
+ import './chunk-VCIB3HUZ.js';
6
6
  import './chunk-ZVB57WI6.js';
7
7
  import './chunk-6CK2OC4Q.js';
8
8
  import './chunk-P3NPTFLF.js';
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- export { MAX_CHECK_ITEMS_BYTES, checksIn, commandItems, isJudgeCheck, makeRecorder, readDefinitions, runHostChecks, timeoutAfter } from './chunk-JKLSQOYO.js';
3
+ export { MAX_CHECK_ITEMS_BYTES, checksIn, commandItems, isJudgeCheck, makeRecorder, readDefinitions, runHostChecks, testProofIn, timeoutAfter } from './chunk-VCIB3HUZ.js';
4
4
  import './chunk-ZVB57WI6.js';
5
5
  import './chunk-6CK2OC4Q.js';
6
6
  import './chunk-P3NPTFLF.js';
package/dist/index.js CHANGED
@@ -26,5 +26,5 @@ if (argv[0] === "claude") {
26
26
  process.exit(await runClaudeLauncher(argv.slice(1)));
27
27
  }
28
28
  (await import('./hook-fast-KXAQ22LZ.js')).recordLinkExitFailure(argv);
29
- var { runCli } = await import('./cli-3RDQSLYI.js');
29
+ var { runCli } = await import('./cli-WYHBUV6E.js');
30
30
  await runCli(process.argv);
@@ -1,14 +1,14 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- export { RunnerStartError, leaseTimeLeftFor, listJobFiles, logUnusableHelper, probeBuild, probeCredentials, requestStop, runnerProcessState, runtimeOf, sampleUsage, start, tick, watchTick } from './chunk-FVF2LMVG.js';
3
+ export { RunnerStartError, leaseTimeLeftFor, listJobFiles, logUnusableHelper, probeBuild, probeCredentials, requestStop, runnerProcessState, runtimeOf, sampleUsage, start, tick, watchTick } from './chunk-C2LMT42U.js';
4
4
  import './chunk-3JVYMD4G.js';
5
- import './chunk-RNMCFAYH.js';
5
+ import './chunk-QVH4RRUQ.js';
6
6
  import './chunk-E7R2GIAW.js';
7
7
  import './chunk-MH6QLXUO.js';
8
8
  import './chunk-HOUFCUMH.js';
9
- import './chunk-5ZBVKRDK.js';
9
+ import './chunk-RRCLYSCM.js';
10
10
  import './chunk-TS3EFB7S.js';
11
- import './chunk-JKLSQOYO.js';
11
+ import './chunk-VCIB3HUZ.js';
12
12
  import './chunk-ZVB57WI6.js';
13
13
  import './chunk-6CK2OC4Q.js';
14
14
  import './chunk-P3NPTFLF.js';
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { isReadable, ALREADY_RELEASED, RENEW_INTERVAL_SECONDS } from './chunk-JKLSQOYO.js';
3
+ import { isReadable, ALREADY_RELEASED, RENEW_INTERVAL_SECONDS } from './chunk-VCIB3HUZ.js';
4
4
  import { jobStateFormatOf } from './chunk-ZVB57WI6.js';
5
5
  import './chunk-6CK2OC4Q.js';
6
6
  import './chunk-P3NPTFLF.js';
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- export { readOwnContainer, renderUpdateSteps, runUpdateSteps } from './chunk-5ZBVKRDK.js';
4
- import './chunk-JKLSQOYO.js';
3
+ export { readOwnContainer, renderUpdateSteps, runUpdateSteps } from './chunk-RRCLYSCM.js';
4
+ import './chunk-VCIB3HUZ.js';
5
5
  import './chunk-ZVB57WI6.js';
6
6
  import './chunk-6CK2OC4Q.js';
7
7
  import './chunk-P3NPTFLF.js';
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- export { classifyProofs, classifyProofsAt, otherPullRequestHeads, resolveProofsItem, runWorkProofs, runWorkProofsCommand } from './chunk-KR2TIRNQ.js';
3
+ export { classifyProofs, classifyProofsAt, otherPullRequestHeads, resolveProofsItem, runWorkProofs, runWorkProofsCommand } from './chunk-LIM35C33.js';
4
4
  import './chunk-6CK2OC4Q.js';
5
5
  import './chunk-QABXXQ67.js';
6
6
  import './chunk-IP7BIBXJ.js';
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { resolveProofsItem, ownPullRequest, proofsCommentId, otherPullRequestHeads, classifyProofsAt, kindProblem, proofsCommentBody, runWorkProofs } from './chunk-KR2TIRNQ.js';
3
+ import { resolveProofsItem, ownPullRequest, proofsCommentId, otherPullRequestHeads, classifyProofsAt, kindProblem, proofsCommentBody, runWorkProofs } from './chunk-LIM35C33.js';
4
4
  import { runWorkComment } from './chunk-EBVK3QBO.js';
5
5
  import './chunk-6CK2OC4Q.js';
6
6
  import { runEmitDemo } from './chunk-K3ACC2CV.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@outerlayer/cli",
3
- "version": "0.34.0-next.20261026200155",
3
+ "version": "0.34.0-next.20261026214555",
4
4
  "description": "OuterLayer CLI — commands: init, claude, connect, doctor, login, logout, sync, daemon (alias: watch), emit, findings, work, spec, runner, hooks, mcp, context. Capture and sync coding-agent sessions, and record proof of factory work.",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Magu Studios, Inc.",
@@ -129,8 +129,8 @@ repository. Commit and push in each checkout you change, to its own branch only.
129
129
  thread back to a person.
130
130
  9. **Check nothing is left waiting.** Reread threads. A thread still waiting
131
131
  on an agent has a reply that did not land or was flagged `unchanged`. Fix
132
- or report it. Run `outerlayer sync` and `outerlayer work proofs`. Fix each
133
- `uncited` or `failed` row it lists.
132
+ or report it. Run `outerlayer sync` and `outerlayer work proofs`. Fix every
133
+ listed row that is not current.
134
134
  10. **Report.** Write one line per thread: the criterion (or the general
135
135
  thread), and fixed (with the replacement) or handed off (with the reason).
136
136
  Add a line for a merge conflict (merged with the base sha, or handed off
@@ -29,13 +29,13 @@ session can run it again.
29
29
 
30
30
  After the evidence agent returns, run `outerlayer sync`, then
31
31
  `outerlayer work proofs --item "$OUTERLAYER_WORK"`. It lists each declared proof
32
- as current, out of date or missing at the checkout's head. The command leaves
33
- out criteria that declare a test proof. It also lists each criterion that the
34
- host's criteria judge fails without reading a test. A row marked `uncited` has
35
- no proof and no test at HEAD that cites it: put the id in a test's title or in a
36
- comment above it, as in `// proves AC-7-02`, and commit. A row marked `failed`
37
- names a criterion that the judge failed, whose citing tests have not changed:
38
- change a test that cites it, and commit.
32
+ as current, out of date or missing at the checkout's head. It lists a `test`
33
+ proof too, unless the policy file sets `criteria.test_proof: ci`. It also lists
34
+ each criterion that the host's criteria judge fails without reading a test. A
35
+ row marked `uncited` has no proof and no test at HEAD that cites it: put the id
36
+ in a test's title or in a comment above it, as in `// proves AC-7-02`, and
37
+ commit. A row marked `failed` names a criterion that the judge failed, whose
38
+ citing tests have not changed: change a test that cites it, and commit.
39
39
 
40
40
  A commit makes every proof out of date, and each `--record` run starts the app
41
41
  again. So record only at the run's last head. First make every commit the run
@@ -45,10 +45,11 @@ proof that is not current and skips the rest. If a commit lands after that,
45
45
  record once more after it. The final report names that head and the proofs
46
46
  recorded there.
47
47
 
48
- `--record` skips a criterion that declares `proof: test`, and the list command
49
- leaves it out. So at that same head, record each one as the Evidence brief in
50
- [agent-briefs.md](agent-briefs.md) says, unless the policy file sets
51
- `criteria.test_proof: ci`. The final report names each one with its artifact.
48
+ `--record` skips a criterion that declares `proof: test`. So at that same head,
49
+ record each one as the Evidence brief in [agent-briefs.md](agent-briefs.md)
50
+ says, unless the policy file sets `criteria.test_proof: ci`. The list command
51
+ shows it as out of date or missing until you do. The final report names each
52
+ one with its artifact.
52
53
 
53
54
  Run the list command once more before the run ends. A criterion still listed
54
55
  as out of date or missing goes in `build-reports/evidence.md` with the reason.