@outerlayer/cli 0.28.3 → 0.29.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 (127) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dist/{agent-setup-IDF3EXM4.js → agent-setup-S3KI7TER.js} +14 -14
  3. package/dist/{artifact-link-cmd-LEI6EOZE.js → artifact-link-cmd-LIJEXVN5.js} +2 -2
  4. package/dist/{bridge-JN3VJ23L.js → bridge-CP25XV3W.js} +2 -2
  5. package/dist/{build-JCYOHPLL.js → build-ZS4Y5MJU.js} +4 -4
  6. package/dist/build-info.json +1 -1
  7. package/dist/{builder-HCTVP2O7.js → builder-FDUOMHY3.js} +6 -6
  8. package/dist/{check-F2TJCQ7S.js → check-5XB22HKS.js} +42 -41
  9. package/dist/{chunk-6NFXOQKZ.js → chunk-23PFIW35.js} +1 -1
  10. package/dist/{chunk-SATUCMAJ.js → chunk-25Z6SBMQ.js} +2 -2
  11. package/dist/{chunk-W7BH5YN6.js → chunk-2KOXAMMB.js} +39 -28
  12. package/dist/{chunk-EPGMCEVP.js → chunk-2YLKMVFV.js} +2 -2
  13. package/dist/{chunk-QBF462QH.js → chunk-3KMYWLMK.js} +1 -1
  14. package/dist/{chunk-5B7BEQPR.js → chunk-427AVP6J.js} +2 -2
  15. package/dist/{chunk-VWFOKRYS.js → chunk-42TFWHFF.js} +1 -1
  16. package/dist/{chunk-X7SFJZIG.js → chunk-6AG2XW5S.js} +29 -10
  17. package/dist/{chunk-BUP5N3X6.js → chunk-6XQPCQBW.js} +1 -1
  18. package/dist/{chunk-WL3QF3QF.js → chunk-77YT7YC4.js} +18 -16
  19. package/dist/{chunk-EZ3DZXUH.js → chunk-7H7RUQCZ.js} +3 -3
  20. package/dist/{chunk-LRFU6RPD.js → chunk-A2E7MU2H.js} +55 -47
  21. package/dist/{chunk-MFI55TNI.js → chunk-BFA2LNJG.js} +22 -6
  22. package/dist/{chunk-N5EEEKT6.js → chunk-C7F6U2YZ.js} +3 -2
  23. package/dist/{chunk-M6NNXKRM.js → chunk-CU7TJL6S.js} +1 -1
  24. package/dist/{chunk-T7LJ6AIC.js → chunk-D3D2CERC.js} +5 -5
  25. package/dist/{chunk-RKOTJQVG.js → chunk-DXI6A6JN.js} +10 -4
  26. package/dist/{chunk-KJIUFOC4.js → chunk-F72ABZRD.js} +1 -1
  27. package/dist/{chunk-UXLLWIA2.js → chunk-FA6XWYRH.js} +7 -7
  28. package/dist/{chunk-P2RWZCV7.js → chunk-FUGRIAG7.js} +2 -2
  29. package/dist/{chunk-JYVBEWBC.js → chunk-GG3WS4C5.js} +3 -3
  30. package/dist/{chunk-O47BTZSN.js → chunk-GI73HOI2.js} +1 -1
  31. package/dist/{chunk-2BZTGJII.js → chunk-GJJDPZS2.js} +7 -7
  32. package/dist/{chunk-QKXF7CLR.js → chunk-GJOF6357.js} +4 -4
  33. package/dist/{chunk-TG7FAHRP.js → chunk-H6DGJBXG.js} +5 -5
  34. package/dist/{chunk-QFNFBQCG.js → chunk-HRWL7NSJ.js} +5 -5
  35. package/dist/chunk-I3LTIAOR.js +11 -0
  36. package/dist/{chunk-OOUHNKKX.js → chunk-IG45QISA.js} +2 -2
  37. package/dist/{chunk-AV5MJY45.js → chunk-IGEJUPDE.js} +3 -3
  38. package/dist/{chunk-QZBXLLTV.js → chunk-JL6VZHAJ.js} +38 -1
  39. package/dist/{chunk-RXFKXZJS.js → chunk-KBIJZAH4.js} +1 -1
  40. package/dist/{chunk-UHU7H57K.js → chunk-LKN4J37L.js} +151 -34
  41. package/dist/{chunk-ILU6664L.js → chunk-M4QY7YZ5.js} +360 -74
  42. package/dist/{chunk-4SJ57DH7.js → chunk-MO2NI6W6.js} +35 -27
  43. package/dist/{chunk-HWOU2HDH.js → chunk-MX3PPJNS.js} +1 -1
  44. package/dist/{chunk-ITAIEJ2T.js → chunk-MZJAIRXM.js} +4 -4
  45. package/dist/{chunk-YYGXCRIW.js → chunk-NAHTO4XM.js} +1 -1
  46. package/dist/{chunk-JGML2VUN.js → chunk-NX2G6PH6.js} +1 -1
  47. package/dist/{chunk-OO6OADZN.js → chunk-OD6WUNKZ.js} +3 -3
  48. package/dist/{chunk-DSKOHPXN.js → chunk-OKAJSYZ2.js} +1 -1
  49. package/dist/{chunk-DWVAG73B.js → chunk-PAHZQQB3.js} +1 -1
  50. package/dist/{chunk-NMIYK2G2.js → chunk-PGA5BVHQ.js} +3 -3
  51. package/dist/{chunk-YTR435DO.js → chunk-PP7C7JQO.js} +3 -3
  52. package/dist/{chunk-DQYMQ47E.js → chunk-S2Q65ZOT.js} +1 -1
  53. package/dist/{chunk-R7TMTFJP.js → chunk-SHVE5JZO.js} +1 -1
  54. package/dist/{chunk-JZJLKTZT.js → chunk-SN3C57RV.js} +5 -5
  55. package/dist/{chunk-TOHKSZKI.js → chunk-TZGQQY7Y.js} +7 -7
  56. package/dist/{chunk-VM6BX2WJ.js → chunk-UPKFSNSU.js} +5 -5
  57. package/dist/{chunk-TCBVV2JK.js → chunk-V47KJGNE.js} +3 -3
  58. package/dist/{chunk-NKD5BNRX.js → chunk-VT3BKV5D.js} +3 -3
  59. package/dist/{chunk-HOU33DW5.js → chunk-VY4YVFL5.js} +1 -1
  60. package/dist/{chunk-SVODOMYC.js → chunk-WEMNLTWB.js} +7 -7
  61. package/dist/{chunk-DIQN5SEL.js → chunk-YSH4KCUJ.js} +1 -1
  62. package/dist/{claude-launcher-LVYZ4YJI.js → claude-launcher-SHIQTBS6.js} +5 -5
  63. package/dist/{cli-5LLFR2SX.js → cli-EN2WGVM6.js} +126 -120
  64. package/dist/{command-YXOMIXOJ.js → command-2VFWA2RF.js} +30 -30
  65. package/dist/{config-TNV5HHLO.js → config-HJQ4YE57.js} +2 -2
  66. package/dist/{connect-cmd-43IWARIV.js → connect-cmd-T6IAT5FT.js} +12 -12
  67. package/dist/{container-start-YG45GLFE.js → container-start-C5ZCXXMF.js} +29 -29
  68. package/dist/{context-cleanup-LTH77FC3.js → context-cleanup-MV3X6NSF.js} +3 -3
  69. package/dist/{control-plane-launch-TIK265OT.js → control-plane-launch-5FZ6LJOC.js} +10 -10
  70. package/dist/{dist-JFVKLUHL.js → dist-H5IYGH3T.js} +2 -2
  71. package/dist/{docker-2IIRBQAB.js → docker-RFN6UWTT.js} +6 -6
  72. package/dist/{doctor-3SRHLRF5.js → doctor-VXDBXKSL.js} +32 -32
  73. package/dist/{emit-artifact-cmd-RM2X3PBJ.js → emit-artifact-cmd-M52RLUBU.js} +16 -16
  74. package/dist/{emit-cmd-QUABLVO6.js → emit-cmd-HTNETHAE.js} +6 -6
  75. package/dist/{emit-criteria-cmd-ZUI7DFND.js → emit-criteria-cmd-APDCA6FK.js} +13 -13
  76. package/dist/{emit-finding-cmd-W2FU4CCF.js → emit-finding-cmd-XEX5XVVI.js} +13 -13
  77. package/dist/{emit-result-cmd-JINMQ7QG.js → emit-result-cmd-HFC3WDWB.js} +52 -25
  78. package/dist/{emit-step-cmd-7FZWQTV3.js → emit-step-cmd-LTRPF2YX.js} +14 -14
  79. package/dist/{exec-client-6ZJJ4KVH.js → exec-client-GHFNXOY6.js} +3 -3
  80. package/dist/{fleet-readiness-3A67MUAU.js → fleet-readiness-SJA7NFR2.js} +12 -12
  81. package/dist/{governing-source-KQMKM5CI.js → governing-source-PBYOKKAJ.js} +17 -17
  82. package/dist/{guest-init-A4HHI2UR.js → guest-init-MQRIALWR.js} +4 -4
  83. package/dist/{hook-fast-UJPAWDAO.js → hook-fast-JKYCVO4R.js} +1 -1
  84. package/dist/{host-key-NGRCMJZ7.js → host-key-DBYH3RTZ.js} +3 -3
  85. package/dist/{image-tag-TEOKZVD5.js → image-tag-XNODAHAW.js} +3 -3
  86. package/dist/index.js +4 -4
  87. package/dist/{init-XP55Q4ZT.js → init-JJPJ2XLL.js} +29 -29
  88. package/dist/{init-HQW3LHIF.js → init-ZUMSDYMW.js} +29 -29
  89. package/dist/{init-cmd-XSOVMNNE.js → init-cmd-342RW7DZ.js} +22 -22
  90. package/dist/{init-update-MZ4IRFC7.js → init-update-4MCW5W72.js} +21 -21
  91. package/dist/{install-NPTR35MG.js → install-GODA5G7U.js} +4 -4
  92. package/dist/{install-cmd-4PXPAFQX.js → install-cmd-YNQ5DCZP.js} +5 -5
  93. package/dist/{layout-BBTQPS6V.js → layout-DBAL2HTQ.js} +4 -4
  94. package/dist/{login-browser-WSOSQH2T.js → login-browser-B6E4GNIF.js} +2 -2
  95. package/dist/{logs-Z4L4I3OR.js → logs-KAG3MAUO.js} +2 -2
  96. package/dist/loop-ZXJFOVCS.js +81 -0
  97. package/dist/{machine-ATDPHWL5.js → machine-F3TVUBZY.js} +25 -25
  98. package/dist/{machine-skills-O7W6NMWB.js → machine-skills-6MLTVBCF.js} +4 -4
  99. package/dist/{mcp-serve-cmd-NQM2WDYI.js → mcp-serve-cmd-SGISNCB3.js} +4 -4
  100. package/dist/{paths-2VSGK6E2.js → paths-PG4JNLZG.js} +2 -2
  101. package/dist/{pending-SFZ2AYSK.js → pending-GG252ERT.js} +3 -3
  102. package/dist/{pidfile-3FT5OLUE.js → pidfile-7SYDMT2O.js} +3 -3
  103. package/dist/{record-7SSRLSI2.js → record-ZGUOOYJH.js} +3 -3
  104. package/dist/{runner-env-2Z2DVSUJ.js → runner-env-WI6LKWIU.js} +5 -5
  105. package/dist/{runner-identity-B37HHOZR.js → runner-identity-JIC54L5Q.js} +6 -6
  106. package/dist/{runner-key-SICUOQY5.js → runner-key-RXCKMQRL.js} +29 -29
  107. package/dist/{session-sender-7MSVJZ6Q.js → session-sender-JAAMA5E6.js} +17 -17
  108. package/dist/{spec-cmd-KAQ7MX4O.js → spec-cmd-BUFLEQ6L.js} +14 -14
  109. package/dist/{starter-pack-5SOT5V4I.js → starter-pack-I5W5JAYT.js} +5 -5
  110. package/dist/{status-AI22UPKC.js → status-E7V365CD.js} +33 -32
  111. package/dist/{sync-cmd-7K3WVQKO.js → sync-cmd-U5FUBXJY.js} +16 -16
  112. package/dist/{watch-NCYESLO2.js → watch-AOPZJOUM.js} +16 -16
  113. package/dist/{work-claim-cmd-IOUEHYIY.js → work-claim-cmd-Z2UZD37I.js} +17 -17
  114. package/dist/{work-cmd-FOI74X5B.js → work-cmd-XLVQDNTC.js} +14 -14
  115. package/dist/{work-comment-cmd-3C44H4CG.js → work-comment-cmd-THLQUSMH.js} +14 -14
  116. package/dist/{work-logs-cmd-YGAWCX3X.js → work-logs-cmd-2NFG6ZY6.js} +14 -14
  117. package/dist/{work-open-pr-cmd-HUG5HAVC.js → work-open-pr-cmd-J22A2YCD.js} +15 -15
  118. package/dist/{work-pr-cmd-L2EDOYXH.js → work-pr-cmd-SYAENEH4.js} +14 -14
  119. package/dist/{work-stop-cmd-GGDVKC67.js → work-stop-cmd-FP453YCB.js} +14 -14
  120. package/package.json +1 -1
  121. package/skill-pack/maintained/outerlayer-amend/SKILL.md +40 -39
  122. package/skill-pack/maintained/outerlayer-build/SKILL.md +5 -9
  123. package/skill-pack/maintained/outerlayer-build/references/criteria-judge.md +15 -12
  124. package/skill-pack/maintained/outerlayer-build/references/release.md +11 -6
  125. package/skill-pack/shipped.json +1 -0
  126. package/skill-pack/validators/acceptance-criteria.yaml +7 -2
  127. package/dist/loop-QQBLJ7GN.js +0 -80
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { launcherPath, writeLauncher, LauncherWriteError, pathNotes } from './chunk-DSKOHPXN.js';
4
- import { currentVersion, currentLink, isInLayout, packageRootIn, versionDir, switchCurrent, execStartLine } from './chunk-6NFXOQKZ.js';
3
+ import { launcherPath, writeLauncher, LauncherWriteError, pathNotes } from './chunk-OKAJSYZ2.js';
4
+ import { currentVersion, currentLink, isInLayout, packageRootIn, versionDir, switchCurrent, execStartLine } from './chunk-23PFIW35.js';
5
5
  import { compareVersions } from './chunk-TQMI335S.js';
6
- import { RUNNER_DIR_MODE } from './chunk-DWVAG73B.js';
6
+ import { RUNNER_DIR_MODE } from './chunk-PAHZQQB3.js';
7
7
  import { realpathSync, readFileSync, mkdirSync, rmSync, cpSync, existsSync } from 'fs';
8
8
  import { dirname, sep, join } from 'path';
9
9
 
@@ -1,30 +1,30 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { releaseLease, isUnfinished, setStage, jobEnv, runHook, describeHookEnd, provisionMicroVm, deliverCommitHooks, provisionProcess, provisionEnvironment, readProvisionOut, resolveHostBuild, workdirProblem, listenOnBroker, hostEnvironment, hostCommandEnvironment, execArgv, MICROVM_COMMAND_DIR, commandLogOffset, startMicroVmCommand, microVmCommandLine, runCommand, execCommandLine, startSender, startHostServices, finishJob, isContainerTracked, isMicroVmTracked, probeMicroVmCommand, probeCommand, appendCommandLog, judgeProbe, EXIT_CODE_FILE, isTracked, isGroupAlive, outcomeFromExitCode, isTimedOut, readCpuUsec, isIdle, stopOrphanedMicroVms, unfinishedJobs, listUnreadableJobs, listAdoptableJobs, retryFailedReleases, recoverLostJobs, hookLimitsFor, AttemptLogBook, microVmOomKills, needsRenew, renewLease, RENEW_INTERVAL_SECONDS, listTrackedJobs, restartSender, serveLease, vmAlive, writeGuestGhConfig, ALREADY_RELEASED, inTeardown } from './chunk-ILU6664L.js';
3
+ import { releaseLease, isUnfinished, setStage, jobEnv, runHook, describeHookEnd, provisionMicroVm, deliverCommitHooks, provisionProcess, provisionEnvironment, readProvisionOut, resolveHostBuild, workdirProblem, listenOnBroker, hostEnvironment, hostCommandEnvironment, execArgv, MICROVM_COMMAND_DIR, commandLogOffset, startMicroVmCommand, microVmCommandLine, runCommand, execCommandLine, startSender, startHostServices, finishJob, isContainerTracked, isMicroVmTracked, probeMicroVmCommand, probeCommand, appendCommandLog, judgeProbe, EXIT_CODE_FILE, isTracked, isGroupAlive, outcomeFromExitCode, isTimedOut, readCpuUsec, isIdle, stopOrphanedMicroVms, unfinishedJobs, listUnreadableJobs, listAdoptableJobs, retryFailedReleases, recoverLostJobs, hookLimitsFor, AttemptLogBook, microVmOomKills, needsRenew, renewLease, RENEW_INTERVAL_SECONDS, listTrackedJobs, restartSender, serveLease, vmAlive, writeGuestGhConfig, ALREADY_RELEASED, inTeardown } from './chunk-M4QY7YZ5.js';
4
4
  import { decideInstalledSwitch } from './chunk-3JVYMD4G.js';
5
5
  import { fetchVersionMeta, npmVersion, npmSupportsProvenance, fetchTarballDigest, fetchProvenance, installVersion, auditSignatures } from './chunk-E7R2GIAW.js';
6
6
  import { RUNNER_PROTOCOL } from './chunk-TPKYTORP.js';
7
- import { writePendingUpdate } from './chunk-HWOU2HDH.js';
7
+ import { writePendingUpdate } from './chunk-MX3PPJNS.js';
8
8
  import { JOB_STATE_FORMAT, readsJobState, jobStateFormatOf } from './chunk-ZVB57WI6.js';
9
- import { readHousekeepingRecord, writeHousekeepingRecord } from './chunk-QBF462QH.js';
10
- import { currentSkillCommand, formerSkillProblem, placeholderQueues, placeholderProblem } from './chunk-SVODOMYC.js';
9
+ import { readHousekeepingRecord, writeHousekeepingRecord } from './chunk-3KMYWLMK.js';
10
+ import { currentSkillCommand, formerSkillProblem, placeholderQueues, placeholderProblem } from './chunk-WEMNLTWB.js';
11
11
  import { freeBytes, formatBytes } from './chunk-YYYRBYWG.js';
12
- import { writeMarker, readMarker, currentVersion, removeMarker, entryIn, versionDir, startedThroughCurrent, switchCurrent, isInLayout, cleanVersions, stagingDir } from './chunk-6NFXOQKZ.js';
12
+ import { writeMarker, readMarker, currentVersion, removeMarker, entryIn, versionDir, startedThroughCurrent, switchCurrent, isInLayout, cleanVersions, stagingDir } from './chunk-23PFIW35.js';
13
13
  import { RepoFilter } from './chunk-TBT347UY.js';
14
- import { leaseTimeLeftMs, createContainerRuntime, withTunnelLog, LEASE_SECONDS, provisionContainer, leaseExpiresAtMs, deliverContainerHooks, lifecycleSteps, lifecycleFailureReason, prepareBranch, containerCommandExec, setUpRunnerCgroup, measureDisk, parseCpuList, ensureTunnel, keepGhConfigCurrent, filesAreCopied, gitRemoteFor, startServicesFor, createLeaseChannel } from './chunk-4SJ57DH7.js';
15
- import { describeCallFailure, retrySend, shortClaim, relativeToRunner, formatDuration, BuildTokens, classifyRefusal, refusalCode, createRunnerLog, formatClock } from './chunk-JZJLKTZT.js';
16
- import { tagToPull, pullInstruction, imageTag, writeUpdateStatus } from './chunk-O47BTZSN.js';
14
+ import { leaseTimeLeftMs, createContainerRuntime, withTunnelLog, LEASE_SECONDS, provisionContainer, leaseExpiresAtMs, deliverContainerHooks, lifecycleSteps, lifecycleFailureReason, prepareBranch, containerCommandExec, setUpRunnerCgroup, measureDisk, parseCpuList, ensureTunnel, keepGhConfigCurrent, filesAreCopied, gitRemoteFor, startServicesFor, createLeaseChannel } from './chunk-MO2NI6W6.js';
15
+ import { describeCallFailure, retrySend, shortClaim, relativeToRunner, formatDuration, BuildTokens, classifyRefusal, refusalCode, createRunnerLog, formatClock } from './chunk-SN3C57RV.js';
16
+ import { tagToPull, pullInstruction, imageTag, writeUpdateStatus } from './chunk-GI73HOI2.js';
17
17
  import { isVersion, compareVersions, satisfiesRange } from './chunk-TQMI335S.js';
18
- import { checkFit } from './chunk-JYVBEWBC.js';
19
- import { isBuiltinContainer, isBuiltinVm, isBuiltinProcess, loadRunnerConfig, checkHooks, builtinKind, DEFAULT_UPDATE_MAX_WAIT_HOURS } from './chunk-YYGXCRIW.js';
20
- import { claimPidFile, writePidFile, readPidFile, releasePidFile } from './chunk-M6NNXKRM.js';
18
+ import { checkFit } from './chunk-GG3WS4C5.js';
19
+ import { isBuiltinContainer, isBuiltinVm, isBuiltinProcess, loadRunnerConfig, checkHooks, builtinKind, DEFAULT_UPDATE_MAX_WAIT_HOURS } from './chunk-NAHTO4XM.js';
20
+ import { claimPidFile, writePidFile, readPidFile, releasePidFile } from './chunk-CU7TJL6S.js';
21
21
  import { startTimeOf, isSameProcess } from './chunk-JBJTC3UU.js';
22
- import { writeJobFile, ensureRunnerIdentity, readJobFile, builderName, runnerLabelValue, ensureFailureCount, builderSpec, ensureBuilder, spawnRun, BUILD_LABEL, RUNNER_LABEL, readJobFileChecked } from './chunk-MFI55TNI.js';
22
+ import { writeJobFile, ensureRunnerIdentity, readJobFile, builderName, runnerLabelValue, ensureFailureCount, builderSpec, ensureBuilder, spawnRun, BUILD_LABEL, RUNNER_LABEL, readJobFileChecked } from './chunk-BFA2LNJG.js';
23
23
  import { exceedsDisk } from './chunk-YJLHUKYS.js';
24
- import { isSignatureRefusal, WorkCommandError, getJson, postJson } from './chunk-X7SFJZIG.js';
25
- import { loadHostKey, ensureHostKey, signerFor } from './chunk-R7TMTFJP.js';
26
- import { RUNNER_DIR_MODE, runnerDir, buildDir, attemptStamp, jobDir, RUNNER_FILE_MODE, jobsDir, pidFilePath, spoolDir, rootfsDir } from './chunk-DWVAG73B.js';
27
- import { parseClaimIdentity, parseClaimedRepositories, parseUnreachable, repositoriesOf, primaryOf, sharedUserEnvironment, JOB_MOUNT, takeClaudeCredential, heldClaudeCredential, claudeCredential, currentClaudeCredential } from './chunk-N5EEEKT6.js';
24
+ import { isSignatureRefusal, WorkCommandError, getJson, postJson } from './chunk-6AG2XW5S.js';
25
+ import { loadHostKey, ensureHostKey, signerFor } from './chunk-SHVE5JZO.js';
26
+ import { RUNNER_DIR_MODE, runnerDir, buildDir, attemptStamp, jobDir, RUNNER_FILE_MODE, jobsDir, pidFilePath, spoolDir, rootfsDir } from './chunk-PAHZQQB3.js';
27
+ import { parseClaimIdentity, parseClaimedRepositories, parseUnreachable, repositoriesOf, primaryOf, sharedUserEnvironment, JOB_MOUNT, takeClaudeCredential, heldClaudeCredential, claudeCredential, currentClaudeCredential } from './chunk-C7F6U2YZ.js';
28
28
  import { resolveVersion } from './chunk-RA3O54FC.js';
29
29
  import { fdName } from './chunk-XD4ZCMA4.js';
30
30
  import { COMMAND_LOST_REASON, CONTAINER_STOPPED_REASON } from './chunk-MESOOLF4.js';
@@ -1140,17 +1140,21 @@ function deriveRepo(item) {
1140
1140
  const repoPart = hash === -1 ? item.trackerKey : item.trackerKey.slice(0, hash);
1141
1141
  return repoPart === "" ? void 0 : `${host}/${repoPart}`;
1142
1142
  }
1143
- async function listStartable(config, queue, fetchImpl) {
1143
+ async function listStartable(config, queue, fetchImpl, cursor = null) {
1144
1144
  const query = queue === "amend" ? "needs=amend&startable=true" : "startable=true";
1145
1145
  const page = await getJson(
1146
1146
  config.url,
1147
- `/v1/work-items?${query}`,
1147
+ `/v1/work-items?${query}${cursor === null ? "" : `&cursor=${encodeURIComponent(cursor)}`}`,
1148
1148
  config.apiKey,
1149
1149
  config.appId,
1150
1150
  fetchImpl,
1151
1151
  await signerFor(config.configPath)
1152
1152
  );
1153
- return Array.isArray(page.data) ? page.data : [];
1153
+ const next = page.pagination?.cursor;
1154
+ return {
1155
+ items: Array.isArray(page.data) ? page.data : [],
1156
+ cursor: typeof next === "string" && next !== "" && next !== cursor ? next : null
1157
+ };
1154
1158
  }
1155
1159
  function reloadConfig(state) {
1156
1160
  let mtimeMs;
@@ -1735,35 +1739,39 @@ async function runTick(state) {
1735
1739
  let claimed = false;
1736
1740
  for (const queue of QUEUE_ORDER) {
1737
1741
  if (!state.config.queues.includes(queue)) continue;
1738
- let items;
1739
- try {
1740
- items = await listStartable(state.config, queue, state.deps.fetchImpl);
1741
- reportRepeating(state, "the work item list", void 0);
1742
- state.lastWorkRequest = { ok: true };
1743
- } catch (err) {
1744
- state.lastWorkRequest = workRequestFromFailure(err);
1745
- reportRepeating(state, "the work item list", `list failed: ${describeCallFailure(err)} \xB7 retrying next tick`);
1746
- return;
1747
- }
1748
- for (const item of items) {
1749
- if (item.startable === false) continue;
1750
- if (!repoFilter.allows(deriveRepo(item))) {
1751
- filtered++;
1752
- continue;
1753
- }
1754
- const attempt = await tryClaimAndStart(state, item, queue);
1755
- if (attempt.kind === "started") {
1756
- claimed = true;
1757
- break;
1758
- }
1759
- if (attempt.kind === "outdated" || attempt.kind === "signature" || attempt.kind === "no_item_key" || attempt.kind === "no_branch" || attempt.kind === "unreadable_repositories") {
1742
+ let cursor = null;
1743
+ do {
1744
+ let page;
1745
+ try {
1746
+ page = await listStartable(state.config, queue, state.deps.fetchImpl, cursor);
1747
+ reportRepeating(state, "the work item list", void 0);
1748
+ state.lastWorkRequest = { ok: true };
1749
+ } catch (err) {
1750
+ state.lastWorkRequest = workRequestFromFailure(err);
1751
+ reportRepeating(state, "the work item list", `list failed: ${describeCallFailure(err)} \xB7 retrying next tick`);
1760
1752
  return;
1761
1753
  }
1762
- if (attempt.kind === "error") {
1763
- log.error(`claim for #${item.number} failed: ${attempt.reason} \xB7 retrying next tick`);
1764
- return;
1754
+ cursor = page.cursor;
1755
+ for (const item of page.items) {
1756
+ if (item.startable === false) continue;
1757
+ if (!repoFilter.allows(deriveRepo(item))) {
1758
+ filtered++;
1759
+ continue;
1760
+ }
1761
+ const attempt = await tryClaimAndStart(state, item, queue);
1762
+ if (attempt.kind === "started") {
1763
+ claimed = true;
1764
+ break;
1765
+ }
1766
+ if (attempt.kind === "outdated" || attempt.kind === "signature" || attempt.kind === "no_item_key" || attempt.kind === "no_branch" || attempt.kind === "unreadable_repositories") {
1767
+ return;
1768
+ }
1769
+ if (attempt.kind === "error") {
1770
+ log.error(`claim for #${item.number} failed: ${attempt.reason} \xB7 retrying next tick`);
1771
+ return;
1772
+ }
1765
1773
  }
1766
- }
1774
+ } while (!claimed && cursor !== null);
1767
1775
  if (claimed) break;
1768
1776
  }
1769
1777
  if (!claimed) break;
@@ -1779,7 +1787,7 @@ var CLAIM_REFUSAL_CODES = new Set(
1779
1787
  "pull_request_from_fork pull_request_on_default_branch pull_request_ambiguous pull_request_repository_not_connected repository_not_reachable branch_claimed_elsewhere".split(" ")
1780
1788
  );
1781
1789
  async function tryClaimAndStart(state, item, queue) {
1782
- const { postJson: postJson2 } = await import('./work-cmd-FOI74X5B.js');
1790
+ const { postJson: postJson2 } = await import('./work-cmd-XLVQDNTC.js');
1783
1791
  const log = logOf(state);
1784
1792
  const hostKey = await loadHostKey(state.config.configPath);
1785
1793
  const claim = await retrySend(
@@ -2955,7 +2963,7 @@ async function start(configPath, deps = { fetchImpl: fetch }) {
2955
2963
  check: update.check ? () => update.check(configPath) : async () => {
2956
2964
  const held = heldClaudeCredential();
2957
2965
  const env = held === void 0 ? process.env : { ...process.env, [held.variable]: held.value };
2958
- return (await import('./check-F2TJCQ7S.js')).runRunnerCheck(configPath, { fetchImpl: deps.fetchImpl, env });
2966
+ return (await import('./check-5XB22HKS.js')).runRunnerCheck(configPath, { fetchImpl: deps.fetchImpl, env });
2959
2967
  },
2960
2968
  now: () => (deps.now ?? (() => /* @__PURE__ */ new Date()))().getTime(),
2961
2969
  log
@@ -2,10 +2,10 @@
2
2
  import { createRequire } from 'node:module';
3
3
  import { parseSize } from './chunk-YJLHUKYS.js';
4
4
  import { RecipeError, BUILDKIT_IMAGE } from './chunk-SJZL5F3F.js';
5
- import { compareVersions } from './chunk-UHU7H57K.js';
6
- import { ensureHostKey } from './chunk-R7TMTFJP.js';
7
- import { RUNNER_DIR_MODE, RUNNER_FILE_MODE, runnerDir, jobsDir } from './chunk-DWVAG73B.js';
8
- import { CLAUDE_PORT, JOB_MOUNT, GATEWAY_PORT, GATEWAY_SOCKET, CLAUDE_SOCKET, RELAY_PORT, DESTINATION_BASE_PORT } from './chunk-N5EEEKT6.js';
5
+ import { compareVersions } from './chunk-LKN4J37L.js';
6
+ import { ensureHostKey } from './chunk-SHVE5JZO.js';
7
+ import { RUNNER_DIR_MODE, RUNNER_FILE_MODE, runnerDir, jobsDir } from './chunk-PAHZQQB3.js';
8
+ import { CLAUDE_PORT, JOB_MOUNT, GATEWAY_PORT, GATEWAY_SOCKET, CLAUDE_SOCKET, RELAY_PORT, DESTINATION_BASE_PORT } from './chunk-C7F6U2YZ.js';
9
9
  import { JOIN_DIR, RELAY_ID, JOIN_SOCKET, TARGET_GATEWAY, TARGET_CLAUDE, destinationTarget, RELAY_USER } from './chunk-MESOOLF4.js';
10
10
  import { StringDecoder } from 'string_decoder';
11
11
  import { spawn } from 'child_process';
@@ -155,8 +155,10 @@ var JUDGE_DIR = "/outerlayer/judge";
155
155
  var JUDGE_HOME = `${JUDGE_DIR}/home`;
156
156
  var JUDGE_TREE = `${JUDGE_DIR}/tree`;
157
157
  var JUDGE_REPORT = `${JUDGE_DIR}/report.html`;
158
+ var JUDGE_ITEMS = `${JUDGE_DIR}/items.json`;
158
159
  var JUDGE_PROGRAM = "/opt/outerlayer/claude/bin/claude";
159
160
  var MAX_REPORT_BYTES = 5 * 1024 * 1024;
161
+ var MAX_ITEMS_BYTES = 1024 * 1024;
160
162
  var JUDGE_MAX_TURNS = 60;
161
163
  var JUDGE_PATH = "/opt/outerlayer/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin";
162
164
  var JUDGE_TOOLS = "Read,Grep,Glob,Write";
@@ -184,7 +186,7 @@ function judgeCommand(input) {
184
186
  JUDGE_TOOLS,
185
187
  "--allowedTools",
186
188
  // A path that starts with two slashes is absolute in a permission rule.
187
- `Read(/${JUDGE_DIR}/**),Edit(/${JUDGE_REPORT})`,
189
+ `Read(/${JUDGE_DIR}/**),Edit(/${JUDGE_REPORT}),Edit(/${JUDGE_ITEMS})`,
188
190
  "--add-dir",
189
191
  JUDGE_TREE,
190
192
  "--permission-mode",
@@ -197,6 +199,20 @@ function judgeCommand(input) {
197
199
  ];
198
200
  return { argv, env, cwd: JUDGE_DIR };
199
201
  }
202
+ function withAnswerProtocol(brief, subjects) {
203
+ const inputs = subjects === "criteria" ? `\`${JUDGE_DIR}/criteria.json\` lists the criteria to judge, \`${JUDGE_DIR}/citations.json\` the tests that cite each one, \`${JUDGE_DIR}/diff.patch\` the change and \`${JUDGE_TREE}/\` the files of the pushed commit.` : `\`${JUDGE_DIR}/diff.patch\` holds the change and \`${JUDGE_TREE}/\` the files of the pushed commit.`;
204
+ const items = subjects === "criteria" ? `one entry per criterion in criteria.json, with its id: \`{"items":[{"id":"<criterion id>","result":"pass"|"fail","reason":"<one to three sentences>"}]}\`. A criterion you do not list fails.` : `your overall result and, when you judged separate parts, one entry per part with an id you choose (a file path or a short name): \`{"result":"pass"|"fail","items":[{"id":"<part>","result":"pass"|"fail","reason":"<one to three sentences>"}]}\`. A failing part fails the whole.`;
205
+ return `${brief.trimEnd()}
206
+
207
+ ## How to answer
208
+
209
+ This section comes from the factory host and overrides any other answer format above. ${inputs}
210
+
211
+ Write your answer as JSON to \`${JUDGE_ITEMS}\`: ${items} A reason quotes the decisive assertion or names what is missing.
212
+
213
+ Then end your reply with one line \`unmet: <id>\` for each failing ${subjects === "criteria" ? "criterion" : "part"}, and a final line that is exactly \`result: pass\` or \`result: fail\`.
214
+ `;
215
+ }
200
216
  var HASH_SCRIPT = 'const fs=require("fs"),c=require("crypto");const p=fs.realpathSync(process.argv[1]);process.stdout.write(c.createHash("sha256").update(fs.readFileSync(p)).digest("hex")+" "+p+"\\n")';
201
217
  var HASH_ARGV = ["/opt/outerlayer/bin/node", "-e", HASH_SCRIPT, JUDGE_PROGRAM];
202
218
  function parseProgramHash(stdout) {
@@ -715,4 +731,4 @@ ${result.stderr}`)) throw outOfMemory(builder, req.logPath);
715
731
  };
716
732
  }
717
733
 
718
- export { BUILD_LABEL, COMMAND_DIR, HASH_ARGV, JUDGE_DIR, JUDGE_MAX_TURNS, JUDGE_PROGRAM, JUDGE_REPORT, MAX_REPORT_BYTES, MIN_BUILDX_VERSION, RUNNER_LABEL, builderName, builderNameFor, builderSpec, buildxState, childEnvironment, containerExecArgs, containerRunArgs, createDockerHost, dockerIdentity, ensureBuilder, ensureFailureCount, ensureRunnerIdentity, isOutOfMemory, judgeCommand, parseProgramHash, pathLabelValue, prepareRunArgs, proxyEnvironment, readJobFile, readJobFileChecked, readRunnerIdentity, resolveDevcontainerCli, runnerLabelValue, spawnRun, trackImageBuild, writeJobFile };
734
+ export { BUILD_LABEL, COMMAND_DIR, HASH_ARGV, JUDGE_DIR, JUDGE_ITEMS, JUDGE_MAX_TURNS, JUDGE_PROGRAM, JUDGE_REPORT, MAX_ITEMS_BYTES, MAX_REPORT_BYTES, MIN_BUILDX_VERSION, RUNNER_LABEL, builderName, builderNameFor, builderSpec, buildxState, childEnvironment, containerExecArgs, containerRunArgs, createDockerHost, dockerIdentity, ensureBuilder, ensureFailureCount, ensureRunnerIdentity, isOutOfMemory, judgeCommand, parseProgramHash, pathLabelValue, prepareRunArgs, proxyEnvironment, readJobFile, readJobFileChecked, readRunnerIdentity, resolveDevcontainerCli, runnerLabelValue, spawnRun, trackImageBuild, withAnswerProtocol, writeJobFile };
@@ -558,6 +558,7 @@ function primaryOf(repositories) {
558
558
  var RELAY_PORT = 3128;
559
559
  var JOB_MOUNT = "/outerlayer/job";
560
560
  var EVAL_INPUT_DIR = `${JOB_MOUNT}/eval-input`;
561
+ var CHECK_ITEMS_FILE = "/tmp/outerlayer-check-items.json";
561
562
  var BUILD_HOME = "/build/home";
562
563
  var CHECKOUT_DIR = "/build/work/checkout";
563
564
  var REPOS_DIR = "/build/work/repos";
@@ -713,7 +714,7 @@ function checkEnvironment(input) {
713
714
  imageEnv: input.imageEnv
714
715
  });
715
716
  const withheld = /* @__PURE__ */ new Set(["OUTERLAYER_URL", "OUTERLAYER_API_KEY", ...CLAUDE_CREDENTIAL_VARIABLES]);
716
- const literals = { OUTERLAYER_EVAL_INPUT: EVAL_INPUT_DIR };
717
+ const literals = { OUTERLAYER_EVAL_INPUT: EVAL_INPUT_DIR, OUTERLAYER_CHECK_ITEMS: CHECK_ITEMS_FILE };
717
718
  for (const [name, value] of Object.entries(env.literals)) if (!withheld.has(name)) literals[name] = value;
718
719
  const passed = {};
719
720
  for (const [name, value] of Object.entries(env.passed)) if (!withheld.has(name)) passed[name] = value;
@@ -752,4 +753,4 @@ function withTunnelRecord(environment, record, onlyWhenUsed = false) {
752
753
  };
753
754
  }
754
755
 
755
- export { AGENT_CREDENTIAL_MISSING, BUILD_HOME, BUILT_IN_NAMES, CHECKOUT_DIR, CLAUDE_CREDENTIAL_ID, CLAUDE_CREDENTIAL_VARIABLES, CLAUDE_ENV_FILE, CLAUDE_PORT, CLAUDE_SOCKET, DESTINATION_BASE_PORT, EVAL_INPUT_DIR, GATEWAY_PORT, GATEWAY_SOCKET, JOB_MOUNT, PROXY_WARNING_FLAG, RELAY_PORT, authorEnvironment, buildEnvironment, builtInEnvironment, checkEnvironment, checkoutPath, claudeCredential, claudeEnvPath, commitIdentityRecord, containerLocalAddress, credentialLineIn, currentClaudeCredential, destinationEnvironment, headerVariables, heldClaudeCredential, isRefusedInConfig, isReservedVariable, lifecycleWorkdir, parseClaimIdentity, parseClaimedRepositories, parseIsolation, parseUnreachable, primaryOf, proxyEnvironment, readClaudeCredential, removedClaudeCredentialValues, repositoriesOf, repositoryPath, resolveDestinations, sharedUserEnvironment, startBuildServices, takeClaudeCredential, tokenHeader, withGitConfig, withHooksPath, withProxyWarningHidden, withTokenHeader, withTunnelRecord, withoutCredentialLines };
756
+ export { AGENT_CREDENTIAL_MISSING, BUILD_HOME, BUILT_IN_NAMES, CHECKOUT_DIR, CHECK_ITEMS_FILE, CLAUDE_CREDENTIAL_ID, CLAUDE_CREDENTIAL_VARIABLES, CLAUDE_ENV_FILE, CLAUDE_PORT, CLAUDE_SOCKET, DESTINATION_BASE_PORT, EVAL_INPUT_DIR, GATEWAY_PORT, GATEWAY_SOCKET, JOB_MOUNT, PROXY_WARNING_FLAG, RELAY_PORT, authorEnvironment, buildEnvironment, builtInEnvironment, checkEnvironment, checkoutPath, claudeCredential, claudeEnvPath, commitIdentityRecord, containerLocalAddress, credentialLineIn, currentClaudeCredential, destinationEnvironment, headerVariables, heldClaudeCredential, isRefusedInConfig, isReservedVariable, lifecycleWorkdir, parseClaimIdentity, parseClaimedRepositories, parseIsolation, parseUnreachable, primaryOf, proxyEnvironment, readClaudeCredential, removedClaudeCredentialValues, repositoriesOf, repositoryPath, resolveDestinations, sharedUserEnvironment, startBuildServices, takeClaudeCredential, tokenHeader, withGitConfig, withHooksPath, withProxyWarningHidden, withTokenHeader, withTunnelRecord, withoutCredentialLines };
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
3
  import { isSameProcess } from './chunk-JBJTC3UU.js';
4
- import { RUNNER_DIR_MODE, RUNNER_FILE_MODE } from './chunk-DWVAG73B.js';
4
+ import { RUNNER_DIR_MODE, RUNNER_FILE_MODE } from './chunk-PAHZQQB3.js';
5
5
  import { existsSync, readFileSync, mkdirSync, writeFileSync, rmSync } from 'fs';
6
6
  import { dirname } from 'path';
7
7
 
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { detectMachine, supportsContainerBuilds, reachDockerStep, describeMachineDocker, supportsMicroVmBuilds } from './chunk-EPGMCEVP.js';
4
- import { MIN_ENGINE_MAJOR } from './chunk-4SJ57DH7.js';
5
- import { hasStoredCredential, AGENT_COMMANDS, storeClaudeCredential, credentialFromStdin, isAgentName } from './chunk-AV5MJY45.js';
6
- import { runnerCredentialProblem } from './chunk-YYGXCRIW.js';
7
- import { runnerDir, RUNNER_DIR_MODE, RUNNER_FILE_MODE } from './chunk-DWVAG73B.js';
3
+ import { detectMachine, supportsContainerBuilds, reachDockerStep, describeMachineDocker, supportsMicroVmBuilds } from './chunk-2YLKMVFV.js';
4
+ import { MIN_ENGINE_MAJOR } from './chunk-MO2NI6W6.js';
5
+ import { hasStoredCredential, AGENT_COMMANDS, storeClaudeCredential, credentialFromStdin, isAgentName } from './chunk-IGEJUPDE.js';
6
+ import { runnerCredentialProblem } from './chunk-NAHTO4XM.js';
7
+ import { runnerDir, RUNNER_DIR_MODE, RUNNER_FILE_MODE } from './chunk-PAHZQQB3.js';
8
8
  import { existsSync, readFileSync, mkdirSync, writeFileSync } from 'fs';
9
9
  import { dirname } from 'path';
10
10
 
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { RESERVED_EMIT_NAMES, ARTIFACT_KINDS, ArtifactCriterionIdSchema } from './chunk-QZBXLLTV.js';
3
+ import { RESERVED_EMIT_NAMES, ARTIFACT_KINDS, ArtifactCriterionIdSchema } from './chunk-JL6VZHAJ.js';
4
4
  import { __commonJS, __require, __toESM } from './chunk-Z5GEFMRW.js';
5
5
 
6
6
  createRequire(import.meta.url);
@@ -7954,6 +7954,7 @@ function normalizeRepoName(repo) {
7954
7954
  return repo.trim().toLowerCase();
7955
7955
  }
7956
7956
  var CONTEXT_PIN_FILENAME = ".outerlayer-pin.json";
7957
+ var JUDGE_SUBJECTS = ["criteria", "none"];
7957
7958
  var MAX_BRIEF_LENGTH = 300;
7958
7959
  var MAX_COMMAND_LENGTH = 2e3;
7959
7960
  var EXTENDS_PROBLEM = '"extends" is not a policy key \u2014 every check is a file in .outerlayer/validators/. Run outerlayer init --template default to write .outerlayer/validators/code-review.yaml, then delete the extends line';
@@ -8208,6 +8209,7 @@ var CUSTOM_KEYS = /* @__PURE__ */ new Set([
8208
8209
  "needs"
8209
8210
  ]);
8210
8211
  function parseCustomFile(file, problems) {
8212
+ var _a;
8211
8213
  const fail = (problem) => {
8212
8214
  problems.push({ file: file.path, problem });
8213
8215
  return null;
@@ -8350,8 +8352,12 @@ function parseCustomFile(file, problems) {
8350
8352
  return fail(`"${id}" run declares both "judge" and "command" \u2014 a host check has one or the other`);
8351
8353
  }
8352
8354
  const rawJudge = run["judge"];
8353
- if (!isRecord(rawJudge) || Object.keys(rawJudge).some((key) => key !== "brief")) {
8354
- return fail(`"${id}" run.judge must be a mapping with a "brief"`);
8355
+ if (!isRecord(rawJudge) || Object.keys(rawJudge).some((key) => key !== "brief" && key !== "subjects")) {
8356
+ return fail(`"${id}" run.judge must be a mapping with a "brief" and, optionally, "subjects"`);
8357
+ }
8358
+ const rawSubjects = (_a = rawJudge["subjects"]) != null ? _a : "criteria";
8359
+ if (typeof rawSubjects !== "string" || !JUDGE_SUBJECTS.includes(rawSubjects)) {
8360
+ return fail(`"${id}" run.judge.subjects must be one of ${JUDGE_SUBJECTS.map((value) => `"${value}"`).join(", ")}`);
8355
8361
  }
8356
8362
  const brief = rawJudge["brief"];
8357
8363
  if (typeof brief !== "string" || brief.trim() === "" || brief.length > MAX_BRIEF_LENGTH || brief.startsWith("/") || brief.split("/").includes("..")) {
@@ -8359,7 +8365,7 @@ function parseCustomFile(file, problems) {
8359
8365
  `"${id}" run.judge.brief must be a relative path inside the repository, of at most ${MAX_BRIEF_LENGTH} characters, with no ".." segment`
8360
8366
  );
8361
8367
  }
8362
- judge = { brief: brief.trim() };
8368
+ judge = { brief: brief.trim(), subjects: rawSubjects };
8363
8369
  runWhere = "host";
8364
8370
  } else if (where === "host") {
8365
8371
  const rawCommand = run["command"];
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
3
  import { readCloudConfigStrict, readCloudConfig, cloudConfigPath } from './chunk-PJDQPF5N.js';
4
- import { signRunnerRequest, signerFor } from './chunk-R7TMTFJP.js';
4
+ import { signRunnerRequest, signerFor } from './chunk-SHVE5JZO.js';
5
5
  import { readRepoConnection, findGitDirs } from './chunk-BJ3KTMDH.js';
6
6
  import { PLAIN_VERSION, recordCliVersion, removeRecordedVersion } from './chunk-5BHIBJDA.js';
7
7
  import { resolvePackageVersion } from './chunk-RA3O54FC.js';
@@ -1,16 +1,16 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { runEmit } from './chunk-QKXF7CLR.js';
3
+ import { runEmit } from './chunk-GJOF6357.js';
4
4
  import { addStdioMcpEntryIfAbsent, addDocsMcpEntryIfAbsent, DOCS_MCP_SERVER_NAME } from './chunk-KT4CN6OU.js';
5
- import { installStarterPack } from './chunk-SATUCMAJ.js';
6
- import { AGENTS_MD_LAYOUT, declareAgentsMdLayout, linkClaudeSkills, SKILLS_LINK_PATH, describeSkillsLink, isAgentsMdLayout, holdsTodaysLayoutSources, discoverOuterlayerPaths } from './chunk-5B7BEQPR.js';
5
+ import { installStarterPack } from './chunk-25Z6SBMQ.js';
6
+ import { AGENTS_MD_LAYOUT, declareAgentsMdLayout, linkClaudeSkills, SKILLS_LINK_PATH, describeSkillsLink, isAgentsMdLayout, holdsTodaysLayoutSources, discoverOuterlayerPaths } from './chunk-427AVP6J.js';
7
7
  import { C } from './chunk-ANPNT6PM.js';
8
- import { resolveGitCommonDir, defaultGitRunner } from './chunk-TG7FAHRP.js';
9
- import { loadTemplateFiles, loadMaintainedFiles, skillDir, AGENTS_SKILLS_BASE } from './chunk-JGML2VUN.js';
8
+ import { resolveGitCommonDir, defaultGitRunner } from './chunk-H6DGJBXG.js';
9
+ import { loadTemplateFiles, loadMaintainedFiles, skillDir, AGENTS_SKILLS_BASE } from './chunk-NX2G6PH6.js';
10
10
  import { cliInvocation } from './chunk-CRB3POP4.js';
11
- import { linkedAgentsPath } from './chunk-VWFOKRYS.js';
11
+ import { linkedAgentsPath } from './chunk-42TFWHFF.js';
12
12
  import { cloneIsGoverned } from './chunk-YQR6E6OV.js';
13
- import { generatedHeaderSource } from './chunk-RKOTJQVG.js';
13
+ import { generatedHeaderSource } from './chunk-DXI6A6JN.js';
14
14
  import { execFileSync } from 'child_process';
15
15
  import { existsSync, mkdirSync, writeFileSync } from 'fs';
16
16
  import { join, dirname } from 'path';
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { skillDir, FORMER_MAINTAINED_NAMES, isMaintainedCopy } from './chunk-JGML2VUN.js';
3
+ import { skillDir, FORMER_MAINTAINED_NAMES, isMaintainedCopy } from './chunk-NX2G6PH6.js';
4
4
  import { cliInvocation } from './chunk-CRB3POP4.js';
5
- import { emitTree, ALL_TARGET_IDS, classifyTree } from './chunk-RKOTJQVG.js';
5
+ import { emitTree, ALL_TARGET_IDS, classifyTree } from './chunk-DXI6A6JN.js';
6
6
  import { readFileSync, existsSync, unlinkSync, rmdirSync, readdirSync } from 'fs';
7
7
  import { join, dirname, relative, sep } from 'path';
8
8
 
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { builtinKind } from './chunk-YYGXCRIW.js';
3
+ import { builtinKind } from './chunk-NAHTO4XM.js';
4
4
  import { parseSize } from './chunk-YJLHUKYS.js';
5
- import { runnerDir } from './chunk-DWVAG73B.js';
6
- import { CLAUDE_CREDENTIAL_ID, CLAUDE_ENV_FILE, credentialLineIn, withoutCredentialLines } from './chunk-N5EEEKT6.js';
5
+ import { runnerDir } from './chunk-PAHZQQB3.js';
6
+ import { CLAUDE_CREDENTIAL_ID, CLAUDE_ENV_FILE, credentialLineIn, withoutCredentialLines } from './chunk-C7F6U2YZ.js';
7
7
  import { FD_SLOTS_PER_BUILD, FD_STORE_ENV } from './chunk-XD4ZCMA4.js';
8
8
  import { existsSync, readFileSync, writeFileSync, chmodSync, renameSync } from 'fs';
9
9
  import { dirname, join } from 'path';
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
3
  import { isVersion, compareVersions } from './chunk-TQMI335S.js';
4
- import { RUNNER_DIR_MODE, RUNNER_FILE_MODE } from './chunk-DWVAG73B.js';
4
+ import { RUNNER_DIR_MODE, RUNNER_FILE_MODE } from './chunk-PAHZQQB3.js';
5
5
  import { readFileSync, mkdirSync, writeFileSync, renameSync } from 'fs';
6
6
  import { join } from 'path';
7
7
 
@@ -1,15 +1,15 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { uploadSpooledSteps } from './chunk-VM6BX2WJ.js';
3
+ import { uploadSpooledSteps } from './chunk-UPKFSNSU.js';
4
4
  import { LaunchFilter } from './chunk-ESVW4MJY.js';
5
5
  import { RepoFilter } from './chunk-TBT347UY.js';
6
- import { migrateLegacyArtifactSidecars, planArtifactUpload, artifactsStatePath, sanitizeTerminal, acquireArtifactSpoolLock, artifactBlobsDir, resolveArtifactTurnIndex, isArtifactTombstoned, ARTIFACT_RETRY_MAX_AGE_MS, writeArtifactSpoolState, reclaimUnneededArtifactBlobs, neededArtifactShas } from './chunk-BUP5N3X6.js';
7
- import { setCustomScrubbers, setLocalIdentity, tailTranscript, enrichSessionRepo, scanAll, setRepoRoot, resolveRepoIdentity, sessionIdFromPath, scrubDeep, SOURCE_ADAPTERS } from './chunk-UHU7H57K.js';
6
+ import { migrateLegacyArtifactSidecars, planArtifactUpload, artifactsStatePath, sanitizeTerminal, acquireArtifactSpoolLock, artifactBlobsDir, resolveArtifactTurnIndex, isArtifactTombstoned, ARTIFACT_RETRY_MAX_AGE_MS, writeArtifactSpoolState, reclaimUnneededArtifactBlobs, neededArtifactShas } from './chunk-6XQPCQBW.js';
7
+ import { setCustomScrubbers, setLocalIdentity, tailTranscript, enrichSessionRepo, scanAll, setRepoRoot, resolveRepoIdentity, sessionIdFromPath, scrubDeep, SOURCE_ADAPTERS } from './chunk-LKN4J37L.js';
8
8
  import { C } from './chunk-ANPNT6PM.js';
9
- import { cliFetch, resolveGatewayCredentials, defaultFetch, unauthorizedMessage } from './chunk-KJIUFOC4.js';
9
+ import { cliFetch, resolveGatewayCredentials, defaultFetch, unauthorizedMessage } from './chunk-F72ABZRD.js';
10
10
  import { readCloudConfig, cloudConfigPath, writeCloudConfig } from './chunk-PJDQPF5N.js';
11
- import { signerFor, signRunnerRequest } from './chunk-R7TMTFJP.js';
12
- import { writeSyncStatus, spoolDir } from './chunk-OOUHNKKX.js';
11
+ import { signerFor, signRunnerRequest } from './chunk-SHVE5JZO.js';
12
+ import { writeSyncStatus, spoolDir } from './chunk-IG45QISA.js';
13
13
  import { readLatestProvenanceForSession, readContextProvenance } from './chunk-ZJSNLVCE.js';
14
14
  import { hookExecSpoolPath } from './chunk-2O5KA67H.js';
15
15
  import { applyReportedCost } from './chunk-BKO6JEZI.js';
@@ -17,7 +17,7 @@ import { readRepoConnection, findGitDirs } from './chunk-BJ3KTMDH.js';
17
17
  import { readLaunchSpoolState, launchStatusIsDecisive, launchedItemsBySession, launchesPath } from './chunk-T2Q7ISPE.js';
18
18
  import { cliInvocation } from './chunk-CRB3POP4.js';
19
19
  import { removeJournalHooks } from './chunk-TUSYOL2O.js';
20
- import { CAPTURE_TIERS, inferArtifactKind, bannedPathsForTier, downconvertSession, isHumanUserTurn, turnCountBound, EVENT_TYPES } from './chunk-QZBXLLTV.js';
20
+ import { CAPTURE_TIERS, inferArtifactKind, bannedPathsForTier, downconvertSession, isHumanUserTurn, turnCountBound, EVENT_TYPES } from './chunk-JL6VZHAJ.js';
21
21
  import { homeFromEnv } from './chunk-VNVZDWO3.js';
22
22
  import { dirname, basename, join, sep } from 'path';
23
23
  import { statSync, readFileSync, readdirSync, mkdirSync, writeFileSync, renameSync, existsSync, rmSync } from 'fs';
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { isAgentsMdLayout, discoverOuterlayerPaths, isForeignTree, toRepoRelative } from './chunk-5B7BEQPR.js';
3
+ import { isAgentsMdLayout, discoverOuterlayerPaths, isForeignTree, toRepoRelative } from './chunk-427AVP6J.js';
4
4
  import { C } from './chunk-ANPNT6PM.js';
5
- import { retiredSkillPaths, removeRetiredSkills } from './chunk-P2RWZCV7.js';
6
- import { maintainedFilesForExistingSkills, loadMaintainedFiles, writeMaintainedFiles } from './chunk-JGML2VUN.js';
5
+ import { retiredSkillPaths, removeRetiredSkills } from './chunk-FUGRIAG7.js';
6
+ import { maintainedFilesForExistingSkills, loadMaintainedFiles, writeMaintainedFiles } from './chunk-NX2G6PH6.js';
7
7
  import { cliInvocation } from './chunk-CRB3POP4.js';
8
- import { emitTree, generatedHeaderSource, parseOuterlayerConfig, classifyTree } from './chunk-RKOTJQVG.js';
8
+ import { emitTree, generatedHeaderSource, parseOuterlayerConfig, classifyTree } from './chunk-DXI6A6JN.js';
9
9
  import { existsSync, readFileSync, mkdirSync, writeFileSync, copyFileSync, unlinkSync, rmdirSync, readdirSync } from 'fs';
10
10
  import { join, dirname } from 'path';
11
11
 
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { removeRetiredSkills } from './chunk-P2RWZCV7.js';
4
- import { defaultFetch, resolveGatewayCredentials } from './chunk-KJIUFOC4.js';
5
- import { withTokenHeader } from './chunk-N5EEEKT6.js';
3
+ import { removeRetiredSkills } from './chunk-FUGRIAG7.js';
4
+ import { defaultFetch, resolveGatewayCredentials } from './chunk-F72ABZRD.js';
5
+ import { withTokenHeader } from './chunk-C7F6U2YZ.js';
6
6
  import { appendContextProvenance } from './chunk-ZJSNLVCE.js';
7
- import { loadMaintainedFiles, writeMaintainedFiles } from './chunk-JGML2VUN.js';
7
+ import { loadMaintainedFiles, writeMaintainedFiles } from './chunk-NX2G6PH6.js';
8
8
  import { cliInvocation } from './chunk-CRB3POP4.js';
9
9
  import { writeDegraded, writeSourceCache, SOURCE_CACHE_TTL_RETRY_MS, writeContextManifest, SOURCE_CACHE_TTL_SUCCESS_MS, readSourceCache, isSourceCacheFresh, clearDegraded } from './chunk-YQR6E6OV.js';
10
- import { normalizeRepoName, parseOuterlayerConfig, classifyTree, emitTree } from './chunk-RKOTJQVG.js';
10
+ import { normalizeRepoName, parseOuterlayerConfig, classifyTree, emitTree } from './chunk-DXI6A6JN.js';
11
11
  import { homeFromEnv } from './chunk-VNVZDWO3.js';
12
12
  import { execFileSync } from 'child_process';
13
13
  import { existsSync, mkdirSync, writeFileSync, chmodSync, lstatSync, readFileSync, copyFileSync } from 'fs';
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { sanitizeTerminal } from './chunk-BUP5N3X6.js';
4
- import { remoteLookupFailed } from './chunk-UHU7H57K.js';
5
- import { isAgentsMdLayout } from './chunk-5B7BEQPR.js';
6
- import { DEFAULT_DASHBOARD } from './chunk-HOU33DW5.js';
7
- import { cliFetch, resolveGatewayCredentials } from './chunk-KJIUFOC4.js';
3
+ import { sanitizeTerminal } from './chunk-6XQPCQBW.js';
4
+ import { remoteLookupFailed } from './chunk-LKN4J37L.js';
5
+ import { isAgentsMdLayout } from './chunk-427AVP6J.js';
6
+ import { DEFAULT_DASHBOARD } from './chunk-VY4YVFL5.js';
7
+ import { cliFetch, resolveGatewayCredentials } from './chunk-F72ABZRD.js';
8
8
  import { readCloudConfig } from './chunk-PJDQPF5N.js';
9
9
  import { writeRepoConnection, findGitDirs, readRepoConnection } from './chunk-BJ3KTMDH.js';
10
10
  import { cliInvocation } from './chunk-CRB3POP4.js';
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire } from 'node:module';
3
+
4
+ createRequire(import.meta.url);
5
+
6
+ // src/zod-problem.ts
7
+ function zodProblem(issues) {
8
+ return issues.slice(0, 1).map((issue) => `${issue.path.map(String).join(".")}: ${issue.message}`).join("");
9
+ }
10
+
11
+ export { zodProblem };
@@ -680,11 +680,11 @@ async function missingControlPlane(cwd, sessionId, home, env) {
680
680
  const dirs = findGitDirs(cwd);
681
681
  if (dirs === void 0) return void 0;
682
682
  if (existsSync(join(dirs.gitCommonDir, "outerlayer", "materialized.json")) || hasExcludeBlock(dirs.gitCommonDir)) {
683
- const { cleanupEarlierCopies } = await import('./context-cleanup-LTH77FC3.js');
683
+ const { cleanupEarlierCopies } = await import('./context-cleanup-MV3X6NSF.js');
684
684
  cleanupEarlierCopies(dirs);
685
685
  }
686
686
  if (!contextPossiblyGoverned(cwd, home)) return void 0;
687
- const { governanceOf } = await import('./control-plane-launch-TIK265OT.js');
687
+ const { governanceOf } = await import('./control-plane-launch-5FZ6LJOC.js');
688
688
  if (await governanceOf({ cwd, env, home }) !== "governed") return void 0;
689
689
  recordMissingContext(dirs, sessionId, home);
690
690
  const launcher = `${cliInvocation()} claude`;
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { DEFAULT_UNIT_NAME } from './chunk-JYVBEWBC.js';
4
- import { RUNNER_FILE_MODE } from './chunk-DWVAG73B.js';
5
- import { claudeEnvPath, withoutCredentialLines } from './chunk-N5EEEKT6.js';
3
+ import { DEFAULT_UNIT_NAME } from './chunk-GG3WS4C5.js';
4
+ import { RUNNER_FILE_MODE } from './chunk-PAHZQQB3.js';
5
+ import { claudeEnvPath, withoutCredentialLines } from './chunk-C7F6U2YZ.js';
6
6
  import { parseRunnerEnv } from './chunk-XD4ZCMA4.js';
7
7
  import { existsSync, readFileSync, writeFileSync, renameSync, rmSync } from 'fs';
8
8
  import { join, dirname } from 'path';
@@ -22278,6 +22278,43 @@ var ArtifactTombstoneRecordSchema = external_exports.looseObject({
22278
22278
  t: external_exports.string()
22279
22279
  });
22280
22280
  external_exports.union([ArtifactSpoolRecordSchema, ArtifactTombstoneRecordSchema]);
22281
+ var CHECK_ITEM_RESULTS = ["pass", "fail", "skipped"];
22282
+ var CHECK_ITEMS_MAX = 500;
22283
+ var CHECK_ITEM_ID_MAX_LENGTH = 200;
22284
+ var CHECK_ITEM_REASON_MAX_LENGTH = 1e3;
22285
+ var CHECK_ITEM_REFS_MAX = 20;
22286
+ var CHECK_ITEM_REF_PATH_MAX_LENGTH = 500;
22287
+ var ONE_LINE = /^[^\u0000-\u001f\u007f]+$/;
22288
+ var CheckItemRefSchema = external_exports.object({
22289
+ path: external_exports.string().min(1).max(CHECK_ITEM_REF_PATH_MAX_LENGTH).regex(ONE_LINE, "must be one line").refine((path) => !path.startsWith("/") && !path.split(/[\\/]/).includes(".."), {
22290
+ message: "must be a relative path with no '..' segment"
22291
+ }),
22292
+ line: external_exports.number().int().positive().optional(),
22293
+ /** Only an https link: it becomes an href on a page. */
22294
+ href: external_exports.string().max(1e3).refine((href) => href.startsWith("https://") && !/\s/.test(href), { message: "must be an https:// URL with no whitespace" }).optional()
22295
+ });
22296
+ var CheckItemSchema = external_exports.object({
22297
+ /** What the item is about, unique within the check. */
22298
+ id: external_exports.string().min(1).max(CHECK_ITEM_ID_MAX_LENGTH).regex(ONE_LINE, "must be one line"),
22299
+ /** The acceptance criterion the item is about, when it is about one. */
22300
+ criterion: ArtifactCriterionIdSchema.optional(),
22301
+ result: external_exports.enum(CHECK_ITEM_RESULTS),
22302
+ /** Why, in a sentence or three. */
22303
+ reason: external_exports.string().max(CHECK_ITEM_REASON_MAX_LENGTH).optional(),
22304
+ refs: external_exports.array(CheckItemRefSchema).max(CHECK_ITEM_REFS_MAX).optional(),
22305
+ /** The sha256 of what the check item was judged on. A judge that sees the same inputs again keeps its result. */
22306
+ inputs: external_exports.string().regex(/^[0-9a-f]{64}$/, "must be a lowercase sha256 hex digest").optional()
22307
+ });
22308
+ var CheckItemsSchema = external_exports.array(CheckItemSchema).max(CHECK_ITEMS_MAX).superRefine((items, ctx) => {
22309
+ const seen = /* @__PURE__ */ new Set();
22310
+ for (const [index, item] of items.entries()) {
22311
+ if (seen.has(item.id)) ctx.addIssue({ code: "custom", path: [index, "id"], message: `repeats the id ${JSON.stringify(item.id)}` });
22312
+ seen.add(item.id);
22313
+ }
22314
+ });
22315
+ function itemsAllowResult(result, items) {
22316
+ return result === "fail" || !(items != null ? items : []).some((item) => item.result === "fail");
22317
+ }
22281
22318
  var EMITTED_RESULTS = ["pass", "fail"];
22282
22319
  var RESERVED_EMIT_NAMES = ["artifact", "criteria", "finding", "findings", "step"];
22283
22320
  var EmittedNameSchema = external_exports.string().regex(/^[a-z][a-z0-9._-]{0,63}$/).superRefine((name, ctx) => {
@@ -22579,4 +22616,4 @@ xmlchars/xmlns/1.0/ed3.js:
22579
22616
  *)
22580
22617
  */
22581
22618
 
22582
- export { ARTIFACT_KINDS, ARTIFACT_MAX_CAPTION_LENGTH, ARTIFACT_MAX_FILENAME_LENGTH, ARTIFACT_MAX_REPLACES_TARGETS, ArtifactCriterionIdSchema, ArtifactSpoolRecordSchema, ArtifactTombstoneRecordSchema, BUCKET_MODEL_MAX_LENGTH, CAPTURE_TIERS, CLI_LOGIN_KIND, CLI_LOGIN_MACHINE_NAME_MAX, CliLoginPollResponseSchema, CliLoginRefusalSchema, CliLoginStartedSchema, CriteriaListSchema, EMITTED_RESULTS, EMITTED_RESULT_MAX_BODY_LENGTH, EMITTED_RESULT_MAX_LINK_LENGTH, EVENT_TYPES, EmittedNameSchema, FindingBatchSchema, FindingsResponseSchema, INPUT_BAND_BOUNDARIES, RESERVED_EMIT_NAMES, SAME_PROBLEM_RULES, SCHEMA_VERSION, SPEED_MAX_LENGTH, StepBodySchema, StepNameSchema, bannedPathsForTier, bindTests, downconvertSession, inferArtifactKind, inputBandOf, isHumanUserTurn, mediaTypeForArtifactPath, parseAgentSession, parseJunit, parseTestSelector, turnCountBound };
22619
+ export { ARTIFACT_KINDS, ARTIFACT_MAX_CAPTION_LENGTH, ARTIFACT_MAX_FILENAME_LENGTH, ARTIFACT_MAX_REPLACES_TARGETS, ArtifactCriterionIdSchema, ArtifactSpoolRecordSchema, ArtifactTombstoneRecordSchema, BUCKET_MODEL_MAX_LENGTH, CAPTURE_TIERS, CHECK_ITEM_REASON_MAX_LENGTH, CLI_LOGIN_KIND, CLI_LOGIN_MACHINE_NAME_MAX, CheckItemsSchema, CliLoginPollResponseSchema, CliLoginRefusalSchema, CliLoginStartedSchema, CriteriaListSchema, EMITTED_RESULTS, EMITTED_RESULT_MAX_BODY_LENGTH, EMITTED_RESULT_MAX_LINK_LENGTH, EVENT_TYPES, EmittedNameSchema, FindingBatchSchema, FindingsResponseSchema, INPUT_BAND_BOUNDARIES, RESERVED_EMIT_NAMES, SAME_PROBLEM_RULES, SCHEMA_VERSION, SPEED_MAX_LENGTH, StepBodySchema, StepNameSchema, bannedPathsForTier, bindTests, downconvertSession, inferArtifactKind, inputBandOf, isHumanUserTurn, itemsAllowResult, mediaTypeForArtifactPath, parseAgentSession, parseJunit, parseTestSelector, turnCountBound };
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { RELAY_PORT, BUILD_HOME } from './chunk-N5EEEKT6.js';
3
+ import { RELAY_PORT, BUILD_HOME } from './chunk-C7F6U2YZ.js';
4
4
  import { createServer, connect } from 'net';
5
5
 
6
6
  createRequire(import.meta.url);