looply-cli 0.0.0-stage → 0.3.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 (793) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +137 -3
  3. package/dist/.src-hash +1 -0
  4. package/dist/acceptance-observe.d.ts +108 -0
  5. package/dist/acceptance-observe.d.ts.map +1 -0
  6. package/dist/acceptance-observe.js +152 -0
  7. package/dist/acceptance-observe.js.map +1 -0
  8. package/dist/agent-cmd.d.ts +131 -0
  9. package/dist/agent-cmd.d.ts.map +1 -0
  10. package/dist/agent-cmd.js +154 -0
  11. package/dist/agent-cmd.js.map +1 -0
  12. package/dist/agent-contained.d.ts +114 -0
  13. package/dist/agent-contained.d.ts.map +1 -0
  14. package/dist/agent-contained.js +292 -0
  15. package/dist/agent-contained.js.map +1 -0
  16. package/dist/agent-driver.d.ts +130 -0
  17. package/dist/agent-driver.d.ts.map +1 -0
  18. package/dist/agent-driver.js +170 -0
  19. package/dist/agent-driver.js.map +1 -0
  20. package/dist/agent-envelope.d.ts +94 -0
  21. package/dist/agent-envelope.d.ts.map +1 -0
  22. package/dist/agent-envelope.js +214 -0
  23. package/dist/agent-envelope.js.map +1 -0
  24. package/dist/agent-exec.d.ts +182 -0
  25. package/dist/agent-exec.d.ts.map +1 -0
  26. package/dist/agent-exec.js +125 -0
  27. package/dist/agent-exec.js.map +1 -0
  28. package/dist/agent-runtime.d.ts +23 -0
  29. package/dist/agent-runtime.d.ts.map +1 -0
  30. package/dist/agent-runtime.js +143 -0
  31. package/dist/agent-runtime.js.map +1 -0
  32. package/dist/approval-gate-read.d.ts +66 -0
  33. package/dist/approval-gate-read.d.ts.map +1 -0
  34. package/dist/approval-gate-read.js +138 -0
  35. package/dist/approval-gate-read.js.map +1 -0
  36. package/dist/approval-resolution.d.ts +87 -0
  37. package/dist/approval-resolution.d.ts.map +1 -0
  38. package/dist/approval-resolution.js +100 -0
  39. package/dist/approval-resolution.js.map +1 -0
  40. package/dist/approval-resumes.d.ts +102 -0
  41. package/dist/approval-resumes.d.ts.map +1 -0
  42. package/dist/approval-resumes.js +167 -0
  43. package/dist/approval-resumes.js.map +1 -0
  44. package/dist/ask-brain.d.ts +167 -0
  45. package/dist/ask-brain.d.ts.map +1 -0
  46. package/dist/ask-brain.js +355 -0
  47. package/dist/ask-brain.js.map +1 -0
  48. package/dist/autonomy-authority.d.ts +80 -0
  49. package/dist/autonomy-authority.d.ts.map +1 -0
  50. package/dist/autonomy-authority.js +82 -0
  51. package/dist/autonomy-authority.js.map +1 -0
  52. package/dist/autonomy-controller.d.ts +321 -0
  53. package/dist/autonomy-controller.d.ts.map +1 -0
  54. package/dist/autonomy-controller.js +517 -0
  55. package/dist/autonomy-controller.js.map +1 -0
  56. package/dist/autonomy-store.d.ts +327 -0
  57. package/dist/autonomy-store.d.ts.map +1 -0
  58. package/dist/autonomy-store.js +581 -0
  59. package/dist/autonomy-store.js.map +1 -0
  60. package/dist/autonomy-tick.d.ts +257 -0
  61. package/dist/autonomy-tick.d.ts.map +1 -0
  62. package/dist/autonomy-tick.js +616 -0
  63. package/dist/autonomy-tick.js.map +1 -0
  64. package/dist/bin.d.ts +3 -0
  65. package/dist/bin.d.ts.map +1 -0
  66. package/dist/bin.js +2727 -0
  67. package/dist/bin.js.map +1 -0
  68. package/dist/brain-advice.d.ts +21 -0
  69. package/dist/brain-advice.d.ts.map +1 -0
  70. package/dist/brain-advice.js +51 -0
  71. package/dist/brain-advice.js.map +1 -0
  72. package/dist/candidate-replay-runtime.d.ts +125 -0
  73. package/dist/candidate-replay-runtime.d.ts.map +1 -0
  74. package/dist/candidate-replay-runtime.js +188 -0
  75. package/dist/candidate-replay-runtime.js.map +1 -0
  76. package/dist/checkout-carry.d.ts +76 -0
  77. package/dist/checkout-carry.d.ts.map +1 -0
  78. package/dist/checkout-carry.js +125 -0
  79. package/dist/checkout-carry.js.map +1 -0
  80. package/dist/citation-readers.d.ts +26 -0
  81. package/dist/citation-readers.d.ts.map +1 -0
  82. package/dist/citation-readers.js +102 -0
  83. package/dist/citation-readers.js.map +1 -0
  84. package/dist/command-receipts.d.ts +79 -0
  85. package/dist/command-receipts.d.ts.map +1 -0
  86. package/dist/command-receipts.js +143 -0
  87. package/dist/command-receipts.js.map +1 -0
  88. package/dist/command-runner.d.ts +32 -0
  89. package/dist/command-runner.d.ts.map +1 -0
  90. package/dist/command-runner.js +108 -0
  91. package/dist/command-runner.js.map +1 -0
  92. package/dist/compatible-sets.d.ts +67 -0
  93. package/dist/compatible-sets.d.ts.map +1 -0
  94. package/dist/compatible-sets.js +81 -0
  95. package/dist/compatible-sets.js.map +1 -0
  96. package/dist/compile-check.d.ts +31 -0
  97. package/dist/compile-check.d.ts.map +1 -0
  98. package/dist/compile-check.js +34 -0
  99. package/dist/compile-check.js.map +1 -0
  100. package/dist/compile-store.d.ts +16 -0
  101. package/dist/compile-store.d.ts.map +1 -0
  102. package/dist/compile-store.js +21 -0
  103. package/dist/compile-store.js.map +1 -0
  104. package/dist/completion.d.ts +106 -0
  105. package/dist/completion.d.ts.map +1 -0
  106. package/dist/completion.js +131 -0
  107. package/dist/completion.js.map +1 -0
  108. package/dist/config.d.ts +549 -0
  109. package/dist/config.d.ts.map +1 -0
  110. package/dist/config.js +763 -0
  111. package/dist/config.js.map +1 -0
  112. package/dist/control-file.d.ts +142 -0
  113. package/dist/control-file.d.ts.map +1 -0
  114. package/dist/control-file.js +144 -0
  115. package/dist/control-file.js.map +1 -0
  116. package/dist/coordinator-state.d.ts +131 -0
  117. package/dist/coordinator-state.d.ts.map +1 -0
  118. package/dist/coordinator-state.js +380 -0
  119. package/dist/coordinator-state.js.map +1 -0
  120. package/dist/coordinator.d.ts +95 -0
  121. package/dist/coordinator.d.ts.map +1 -0
  122. package/dist/coordinator.js +97 -0
  123. package/dist/coordinator.js.map +1 -0
  124. package/dist/cursor-store.d.ts +53 -0
  125. package/dist/cursor-store.d.ts.map +1 -0
  126. package/dist/cursor-store.js +98 -0
  127. package/dist/cursor-store.js.map +1 -0
  128. package/dist/daemon-cmd.d.ts +239 -0
  129. package/dist/daemon-cmd.d.ts.map +1 -0
  130. package/dist/daemon-cmd.js +1751 -0
  131. package/dist/daemon-cmd.js.map +1 -0
  132. package/dist/daemon-lock.d.ts +140 -0
  133. package/dist/daemon-lock.d.ts.map +1 -0
  134. package/dist/daemon-lock.js +352 -0
  135. package/dist/daemon-lock.js.map +1 -0
  136. package/dist/daemon-recovery.d.ts +78 -0
  137. package/dist/daemon-recovery.d.ts.map +1 -0
  138. package/dist/daemon-recovery.js +161 -0
  139. package/dist/daemon-recovery.js.map +1 -0
  140. package/dist/daemon.d.ts +368 -0
  141. package/dist/daemon.d.ts.map +1 -0
  142. package/dist/daemon.js +601 -0
  143. package/dist/daemon.js.map +1 -0
  144. package/dist/declared-response-shape.d.ts +93 -0
  145. package/dist/declared-response-shape.d.ts.map +1 -0
  146. package/dist/declared-response-shape.js +200 -0
  147. package/dist/declared-response-shape.js.map +1 -0
  148. package/dist/declared-surfaces.d.ts +16 -0
  149. package/dist/declared-surfaces.d.ts.map +1 -0
  150. package/dist/declared-surfaces.js +19 -0
  151. package/dist/declared-surfaces.js.map +1 -0
  152. package/dist/depends-review.d.ts +113 -0
  153. package/dist/depends-review.d.ts.map +1 -0
  154. package/dist/depends-review.js +110 -0
  155. package/dist/depends-review.js.map +1 -0
  156. package/dist/doctor.d.ts +91 -0
  157. package/dist/doctor.d.ts.map +1 -0
  158. package/dist/doctor.js +71 -0
  159. package/dist/doctor.js.map +1 -0
  160. package/dist/edge-approval.d.ts +105 -0
  161. package/dist/edge-approval.d.ts.map +1 -0
  162. package/dist/edge-approval.js +100 -0
  163. package/dist/edge-approval.js.map +1 -0
  164. package/dist/evidence-cache.d.ts +45 -0
  165. package/dist/evidence-cache.d.ts.map +1 -0
  166. package/dist/evidence-cache.js +90 -0
  167. package/dist/evidence-cache.js.map +1 -0
  168. package/dist/evidence-cmd.d.ts +133 -0
  169. package/dist/evidence-cmd.d.ts.map +1 -0
  170. package/dist/evidence-cmd.js +347 -0
  171. package/dist/evidence-cmd.js.map +1 -0
  172. package/dist/evidence-facts.d.ts +40 -0
  173. package/dist/evidence-facts.d.ts.map +1 -0
  174. package/dist/evidence-facts.js +114 -0
  175. package/dist/evidence-facts.js.map +1 -0
  176. package/dist/exclusive-lock.d.ts +52 -0
  177. package/dist/exclusive-lock.d.ts.map +1 -0
  178. package/dist/exclusive-lock.js +150 -0
  179. package/dist/exclusive-lock.js.map +1 -0
  180. package/dist/exec-domains.d.ts +140 -0
  181. package/dist/exec-domains.d.ts.map +1 -0
  182. package/dist/exec-domains.js +287 -0
  183. package/dist/exec-domains.js.map +1 -0
  184. package/dist/exemption-store.d.ts +197 -0
  185. package/dist/exemption-store.d.ts.map +1 -0
  186. package/dist/exemption-store.js +266 -0
  187. package/dist/exemption-store.js.map +1 -0
  188. package/dist/explicit-start-gate.d.ts +96 -0
  189. package/dist/explicit-start-gate.d.ts.map +1 -0
  190. package/dist/explicit-start-gate.js +103 -0
  191. package/dist/explicit-start-gate.js.map +1 -0
  192. package/dist/fs-trouble.d.ts +70 -0
  193. package/dist/fs-trouble.d.ts.map +1 -0
  194. package/dist/fs-trouble.js +98 -0
  195. package/dist/fs-trouble.js.map +1 -0
  196. package/dist/gate.d.ts +278 -0
  197. package/dist/gate.d.ts.map +1 -0
  198. package/dist/gate.js +278 -0
  199. package/dist/gate.js.map +1 -0
  200. package/dist/git-driver.d.ts +519 -0
  201. package/dist/git-driver.d.ts.map +1 -0
  202. package/dist/git-driver.js +900 -0
  203. package/dist/git-driver.js.map +1 -0
  204. package/dist/git-push-executor.d.ts +41 -0
  205. package/dist/git-push-executor.d.ts.map +1 -0
  206. package/dist/git-push-executor.js +142 -0
  207. package/dist/git-push-executor.js.map +1 -0
  208. package/dist/glob.d.ts +26 -0
  209. package/dist/glob.d.ts.map +1 -0
  210. package/dist/glob.js +93 -0
  211. package/dist/glob.js.map +1 -0
  212. package/dist/goal-adaptive.d.ts +295 -0
  213. package/dist/goal-adaptive.d.ts.map +1 -0
  214. package/dist/goal-adaptive.js +393 -0
  215. package/dist/goal-adaptive.js.map +1 -0
  216. package/dist/goal-compile.d.ts +342 -0
  217. package/dist/goal-compile.d.ts.map +1 -0
  218. package/dist/goal-compile.js +444 -0
  219. package/dist/goal-compile.js.map +1 -0
  220. package/dist/goal-depends-executor.d.ts +55 -0
  221. package/dist/goal-depends-executor.d.ts.map +1 -0
  222. package/dist/goal-depends-executor.js +202 -0
  223. package/dist/goal-depends-executor.js.map +1 -0
  224. package/dist/goal-execution-evidence.d.ts +135 -0
  225. package/dist/goal-execution-evidence.d.ts.map +1 -0
  226. package/dist/goal-execution-evidence.js +159 -0
  227. package/dist/goal-execution-evidence.js.map +1 -0
  228. package/dist/goal-gap.d.ts +140 -0
  229. package/dist/goal-gap.d.ts.map +1 -0
  230. package/dist/goal-gap.js +197 -0
  231. package/dist/goal-gap.js.map +1 -0
  232. package/dist/goal-met-target.d.ts +98 -0
  233. package/dist/goal-met-target.d.ts.map +1 -0
  234. package/dist/goal-met-target.js +92 -0
  235. package/dist/goal-met-target.js.map +1 -0
  236. package/dist/goal-ownership.d.ts +416 -0
  237. package/dist/goal-ownership.d.ts.map +1 -0
  238. package/dist/goal-ownership.js +576 -0
  239. package/dist/goal-ownership.js.map +1 -0
  240. package/dist/goal-runs.d.ts +82 -0
  241. package/dist/goal-runs.d.ts.map +1 -0
  242. package/dist/goal-runs.js +120 -0
  243. package/dist/goal-runs.js.map +1 -0
  244. package/dist/goal-store.d.ts +146 -0
  245. package/dist/goal-store.d.ts.map +1 -0
  246. package/dist/goal-store.js +294 -0
  247. package/dist/goal-store.js.map +1 -0
  248. package/dist/goal-view.d.ts +156 -0
  249. package/dist/goal-view.d.ts.map +1 -0
  250. package/dist/goal-view.js +499 -0
  251. package/dist/goal-view.js.map +1 -0
  252. package/dist/governed-approvals.d.ts +152 -0
  253. package/dist/governed-approvals.d.ts.map +1 -0
  254. package/dist/governed-approvals.js +246 -0
  255. package/dist/governed-approvals.js.map +1 -0
  256. package/dist/governed-broker.d.ts +169 -0
  257. package/dist/governed-broker.d.ts.map +1 -0
  258. package/dist/governed-broker.js +196 -0
  259. package/dist/governed-broker.js.map +1 -0
  260. package/dist/governed-run.d.ts +220 -0
  261. package/dist/governed-run.d.ts.map +1 -0
  262. package/dist/governed-run.js +406 -0
  263. package/dist/governed-run.js.map +1 -0
  264. package/dist/grant-reconcile.d.ts +63 -0
  265. package/dist/grant-reconcile.d.ts.map +1 -0
  266. package/dist/grant-reconcile.js +121 -0
  267. package/dist/grant-reconcile.js.map +1 -0
  268. package/dist/index-for-head.d.ts +56 -0
  269. package/dist/index-for-head.d.ts.map +1 -0
  270. package/dist/index-for-head.js +103 -0
  271. package/dist/index-for-head.js.map +1 -0
  272. package/dist/index.d.ts +39 -0
  273. package/dist/index.d.ts.map +1 -0
  274. package/dist/index.js +55 -0
  275. package/dist/index.js.map +1 -0
  276. package/dist/init-detect.d.ts +39 -0
  277. package/dist/init-detect.d.ts.map +1 -0
  278. package/dist/init-detect.js +188 -0
  279. package/dist/init-detect.js.map +1 -0
  280. package/dist/integration-deps.d.ts +62 -0
  281. package/dist/integration-deps.d.ts.map +1 -0
  282. package/dist/integration-deps.js +251 -0
  283. package/dist/integration-deps.js.map +1 -0
  284. package/dist/integration-runtime.d.ts +458 -0
  285. package/dist/integration-runtime.d.ts.map +1 -0
  286. package/dist/integration-runtime.js +681 -0
  287. package/dist/integration-runtime.js.map +1 -0
  288. package/dist/integration.d.ts +45 -0
  289. package/dist/integration.d.ts.map +1 -0
  290. package/dist/integration.js +87 -0
  291. package/dist/integration.js.map +1 -0
  292. package/dist/integrator.d.ts +84 -0
  293. package/dist/integrator.d.ts.map +1 -0
  294. package/dist/integrator.js +193 -0
  295. package/dist/integrator.js.map +1 -0
  296. package/dist/lane-claims.d.ts +174 -0
  297. package/dist/lane-claims.d.ts.map +1 -0
  298. package/dist/lane-claims.js +218 -0
  299. package/dist/lane-claims.js.map +1 -0
  300. package/dist/lane-coverage.d.ts +87 -0
  301. package/dist/lane-coverage.d.ts.map +1 -0
  302. package/dist/lane-coverage.js +129 -0
  303. package/dist/lane-coverage.js.map +1 -0
  304. package/dist/ledger-replay.d.ts +115 -0
  305. package/dist/ledger-replay.d.ts.map +1 -0
  306. package/dist/ledger-replay.js +155 -0
  307. package/dist/ledger-replay.js.map +1 -0
  308. package/dist/ledger-store.d.ts +68 -0
  309. package/dist/ledger-store.d.ts.map +1 -0
  310. package/dist/ledger-store.js +111 -0
  311. package/dist/ledger-store.js.map +1 -0
  312. package/dist/loop-safety-observer.d.ts +132 -0
  313. package/dist/loop-safety-observer.d.ts.map +1 -0
  314. package/dist/loop-safety-observer.js +76 -0
  315. package/dist/loop-safety-observer.js.map +1 -0
  316. package/dist/loop-safety-store.d.ts +339 -0
  317. package/dist/loop-safety-store.d.ts.map +1 -0
  318. package/dist/loop-safety-store.js +800 -0
  319. package/dist/loop-safety-store.js.map +1 -0
  320. package/dist/machine-store.d.ts +54 -0
  321. package/dist/machine-store.d.ts.map +1 -0
  322. package/dist/machine-store.js +149 -0
  323. package/dist/machine-store.js.map +1 -0
  324. package/dist/mcp-main.d.ts +2 -0
  325. package/dist/mcp-main.d.ts.map +1 -0
  326. package/dist/mcp-main.js +116 -0
  327. package/dist/mcp-main.js.map +1 -0
  328. package/dist/mcp-server.d.ts +72 -0
  329. package/dist/mcp-server.d.ts.map +1 -0
  330. package/dist/mcp-server.js +259 -0
  331. package/dist/mcp-server.js.map +1 -0
  332. package/dist/model-routing.d.ts +75 -0
  333. package/dist/model-routing.d.ts.map +1 -0
  334. package/dist/model-routing.js +108 -0
  335. package/dist/model-routing.js.map +1 -0
  336. package/dist/model-transport.d.ts +188 -0
  337. package/dist/model-transport.d.ts.map +1 -0
  338. package/dist/model-transport.js +625 -0
  339. package/dist/model-transport.js.map +1 -0
  340. package/dist/notify-cadence.d.ts +55 -0
  341. package/dist/notify-cadence.d.ts.map +1 -0
  342. package/dist/notify-cadence.js +68 -0
  343. package/dist/notify-cadence.js.map +1 -0
  344. package/dist/notify-channel.d.ts +69 -0
  345. package/dist/notify-channel.d.ts.map +1 -0
  346. package/dist/notify-channel.js +151 -0
  347. package/dist/notify-channel.js.map +1 -0
  348. package/dist/notify.d.ts +71 -0
  349. package/dist/notify.d.ts.map +1 -0
  350. package/dist/notify.js +125 -0
  351. package/dist/notify.js.map +1 -0
  352. package/dist/observation-inventory.d.ts +65 -0
  353. package/dist/observation-inventory.d.ts.map +1 -0
  354. package/dist/observation-inventory.js +139 -0
  355. package/dist/observation-inventory.js.map +1 -0
  356. package/dist/owned-children.d.ts +45 -0
  357. package/dist/owned-children.d.ts.map +1 -0
  358. package/dist/owned-children.js +64 -0
  359. package/dist/owned-children.js.map +1 -0
  360. package/dist/packet-for-goal.d.ts +19 -0
  361. package/dist/packet-for-goal.d.ts.map +1 -0
  362. package/dist/packet-for-goal.js +32 -0
  363. package/dist/packet-for-goal.js.map +1 -0
  364. package/dist/pair-cmd.d.ts +85 -0
  365. package/dist/pair-cmd.d.ts.map +1 -0
  366. package/dist/pair-cmd.js +205 -0
  367. package/dist/pair-cmd.js.map +1 -0
  368. package/dist/partial-asker.d.ts +96 -0
  369. package/dist/partial-asker.d.ts.map +1 -0
  370. package/dist/partial-asker.js +117 -0
  371. package/dist/partial-asker.js.map +1 -0
  372. package/dist/pdf-text-lines.d.ts +17 -0
  373. package/dist/pdf-text-lines.d.ts.map +1 -0
  374. package/dist/pdf-text-lines.js +70 -0
  375. package/dist/pdf-text-lines.js.map +1 -0
  376. package/dist/pdf-text-worker.d.ts +2 -0
  377. package/dist/pdf-text-worker.d.ts.map +1 -0
  378. package/dist/pdf-text-worker.js +81 -0
  379. package/dist/pdf-text-worker.js.map +1 -0
  380. package/dist/pdf-text.d.ts +56 -0
  381. package/dist/pdf-text.d.ts.map +1 -0
  382. package/dist/pdf-text.js +64 -0
  383. package/dist/pdf-text.js.map +1 -0
  384. package/dist/pending-action.d.ts +154 -0
  385. package/dist/pending-action.d.ts.map +1 -0
  386. package/dist/pending-action.js +148 -0
  387. package/dist/pending-action.js.map +1 -0
  388. package/dist/preemptor.d.ts +40 -0
  389. package/dist/preemptor.d.ts.map +1 -0
  390. package/dist/preemptor.js +49 -0
  391. package/dist/preemptor.js.map +1 -0
  392. package/dist/programme-mode.d.ts +29 -0
  393. package/dist/programme-mode.d.ts.map +1 -0
  394. package/dist/programme-mode.js +50 -0
  395. package/dist/programme-mode.js.map +1 -0
  396. package/dist/progress-view.d.ts +14 -0
  397. package/dist/progress-view.d.ts.map +1 -0
  398. package/dist/progress-view.js +114 -0
  399. package/dist/progress-view.js.map +1 -0
  400. package/dist/project-graph-builder.d.ts +81 -0
  401. package/dist/project-graph-builder.d.ts.map +1 -0
  402. package/dist/project-graph-builder.js +246 -0
  403. package/dist/project-graph-builder.js.map +1 -0
  404. package/dist/project-graph-runtime.d.ts +86 -0
  405. package/dist/project-graph-runtime.d.ts.map +1 -0
  406. package/dist/project-graph-runtime.js +112 -0
  407. package/dist/project-graph-runtime.js.map +1 -0
  408. package/dist/project-index-builder.d.ts +96 -0
  409. package/dist/project-index-builder.d.ts.map +1 -0
  410. package/dist/project-index-builder.js +298 -0
  411. package/dist/project-index-builder.js.map +1 -0
  412. package/dist/project-index-facts.d.ts +51 -0
  413. package/dist/project-index-facts.d.ts.map +1 -0
  414. package/dist/project-index-facts.js +117 -0
  415. package/dist/project-index-facts.js.map +1 -0
  416. package/dist/project-index-store.d.ts +97 -0
  417. package/dist/project-index-store.d.ts.map +1 -0
  418. package/dist/project-index-store.js +140 -0
  419. package/dist/project-index-store.js.map +1 -0
  420. package/dist/project-memory-store.d.ts +127 -0
  421. package/dist/project-memory-store.d.ts.map +1 -0
  422. package/dist/project-memory-store.js +302 -0
  423. package/dist/project-memory-store.js.map +1 -0
  424. package/dist/proposal-store.d.ts +14 -0
  425. package/dist/proposal-store.d.ts.map +1 -0
  426. package/dist/proposal-store.js +19 -0
  427. package/dist/proposal-store.js.map +1 -0
  428. package/dist/prover.d.ts +80 -0
  429. package/dist/prover.d.ts.map +1 -0
  430. package/dist/prover.js +137 -0
  431. package/dist/prover.js.map +1 -0
  432. package/dist/provider-identity-store.d.ts +34 -0
  433. package/dist/provider-identity-store.d.ts.map +1 -0
  434. package/dist/provider-identity-store.js +72 -0
  435. package/dist/provider-identity-store.js.map +1 -0
  436. package/dist/provider-identity.d.ts +104 -0
  437. package/dist/provider-identity.d.ts.map +1 -0
  438. package/dist/provider-identity.js +167 -0
  439. package/dist/provider-identity.js.map +1 -0
  440. package/dist/provider-limit.d.ts +79 -0
  441. package/dist/provider-limit.d.ts.map +1 -0
  442. package/dist/provider-limit.js +148 -0
  443. package/dist/provider-limit.js.map +1 -0
  444. package/dist/provider-preflight.d.ts +171 -0
  445. package/dist/provider-preflight.d.ts.map +1 -0
  446. package/dist/provider-preflight.js +395 -0
  447. package/dist/provider-preflight.js.map +1 -0
  448. package/dist/provider-state.d.ts +120 -0
  449. package/dist/provider-state.d.ts.map +1 -0
  450. package/dist/provider-state.js +182 -0
  451. package/dist/provider-state.js.map +1 -0
  452. package/dist/providers.d.ts +132 -0
  453. package/dist/providers.d.ts.map +1 -0
  454. package/dist/providers.js +161 -0
  455. package/dist/providers.js.map +1 -0
  456. package/dist/publication-recorder.d.ts +117 -0
  457. package/dist/publication-recorder.d.ts.map +1 -0
  458. package/dist/publication-recorder.js +124 -0
  459. package/dist/publication-recorder.js.map +1 -0
  460. package/dist/pursuit-delivery.d.ts +24 -0
  461. package/dist/pursuit-delivery.d.ts.map +1 -0
  462. package/dist/pursuit-delivery.js +38 -0
  463. package/dist/pursuit-delivery.js.map +1 -0
  464. package/dist/queue-store.d.ts +132 -0
  465. package/dist/queue-store.d.ts.map +1 -0
  466. package/dist/queue-store.js +185 -0
  467. package/dist/queue-store.js.map +1 -0
  468. package/dist/queue-summary.d.ts +14 -0
  469. package/dist/queue-summary.d.ts.map +1 -0
  470. package/dist/queue-summary.js +82 -0
  471. package/dist/queue-summary.js.map +1 -0
  472. package/dist/queue-view.d.ts +20 -0
  473. package/dist/queue-view.d.ts.map +1 -0
  474. package/dist/queue-view.js +163 -0
  475. package/dist/queue-view.js.map +1 -0
  476. package/dist/queue-write-lease.d.ts +106 -0
  477. package/dist/queue-write-lease.d.ts.map +1 -0
  478. package/dist/queue-write-lease.js +282 -0
  479. package/dist/queue-write-lease.js.map +1 -0
  480. package/dist/rails-home.d.ts +162 -0
  481. package/dist/rails-home.d.ts.map +1 -0
  482. package/dist/rails-home.js +452 -0
  483. package/dist/rails-home.js.map +1 -0
  484. package/dist/rails-migrations.d.ts +75 -0
  485. package/dist/rails-migrations.d.ts.map +1 -0
  486. package/dist/rails-migrations.js +199 -0
  487. package/dist/rails-migrations.js.map +1 -0
  488. package/dist/rails-stores.d.ts +49 -0
  489. package/dist/rails-stores.d.ts.map +1 -0
  490. package/dist/rails-stores.js +100 -0
  491. package/dist/rails-stores.js.map +1 -0
  492. package/dist/reaper.d.ts +69 -0
  493. package/dist/reaper.d.ts.map +1 -0
  494. package/dist/reaper.js +152 -0
  495. package/dist/reaper.js.map +1 -0
  496. package/dist/record-store.d.ts +36 -0
  497. package/dist/record-store.d.ts.map +1 -0
  498. package/dist/record-store.js +78 -0
  499. package/dist/record-store.js.map +1 -0
  500. package/dist/recovery-io.d.ts +50 -0
  501. package/dist/recovery-io.d.ts.map +1 -0
  502. package/dist/recovery-io.js +122 -0
  503. package/dist/recovery-io.js.map +1 -0
  504. package/dist/recovery.d.ts +146 -0
  505. package/dist/recovery.d.ts.map +1 -0
  506. package/dist/recovery.js +110 -0
  507. package/dist/recovery.js.map +1 -0
  508. package/dist/redraw.d.ts +34 -0
  509. package/dist/redraw.d.ts.map +1 -0
  510. package/dist/redraw.js +62 -0
  511. package/dist/redraw.js.map +1 -0
  512. package/dist/rejected-evidence.d.ts +255 -0
  513. package/dist/rejected-evidence.d.ts.map +1 -0
  514. package/dist/rejected-evidence.js +324 -0
  515. package/dist/rejected-evidence.js.map +1 -0
  516. package/dist/report-cmd.d.ts +32 -0
  517. package/dist/report-cmd.d.ts.map +1 -0
  518. package/dist/report-cmd.js +201 -0
  519. package/dist/report-cmd.js.map +1 -0
  520. package/dist/repos-cmd.d.ts +80 -0
  521. package/dist/repos-cmd.d.ts.map +1 -0
  522. package/dist/repos-cmd.js +240 -0
  523. package/dist/repos-cmd.js.map +1 -0
  524. package/dist/request-body-shape.d.ts +93 -0
  525. package/dist/request-body-shape.d.ts.map +1 -0
  526. package/dist/request-body-shape.js +407 -0
  527. package/dist/request-body-shape.js.map +1 -0
  528. package/dist/requirement-claims.d.ts +89 -0
  529. package/dist/requirement-claims.d.ts.map +1 -0
  530. package/dist/requirement-claims.js +92 -0
  531. package/dist/requirement-claims.js.map +1 -0
  532. package/dist/retention-apply-runtime.d.ts +105 -0
  533. package/dist/retention-apply-runtime.d.ts.map +1 -0
  534. package/dist/retention-apply-runtime.js +269 -0
  535. package/dist/retention-apply-runtime.js.map +1 -0
  536. package/dist/reverify.d.ts +41 -0
  537. package/dist/reverify.d.ts.map +1 -0
  538. package/dist/reverify.js +69 -0
  539. package/dist/reverify.js.map +1 -0
  540. package/dist/round-records.d.ts +65 -0
  541. package/dist/round-records.d.ts.map +1 -0
  542. package/dist/round-records.js +61 -0
  543. package/dist/round-records.js.map +1 -0
  544. package/dist/round-runner.d.ts +924 -0
  545. package/dist/round-runner.d.ts.map +1 -0
  546. package/dist/round-runner.js +1693 -0
  547. package/dist/round-runner.js.map +1 -0
  548. package/dist/run-approval.d.ts +180 -0
  549. package/dist/run-approval.d.ts.map +1 -0
  550. package/dist/run-approval.js +199 -0
  551. package/dist/run-approval.js.map +1 -0
  552. package/dist/run-cmd.d.ts +359 -0
  553. package/dist/run-cmd.d.ts.map +1 -0
  554. package/dist/run-cmd.js +4418 -0
  555. package/dist/run-cmd.js.map +1 -0
  556. package/dist/run-delivery.d.ts +71 -0
  557. package/dist/run-delivery.d.ts.map +1 -0
  558. package/dist/run-delivery.js +104 -0
  559. package/dist/run-delivery.js.map +1 -0
  560. package/dist/run-ended.d.ts +75 -0
  561. package/dist/run-ended.d.ts.map +1 -0
  562. package/dist/run-ended.js +27 -0
  563. package/dist/run-ended.js.map +1 -0
  564. package/dist/run-ending-locator.d.ts +125 -0
  565. package/dist/run-ending-locator.d.ts.map +1 -0
  566. package/dist/run-ending-locator.js +133 -0
  567. package/dist/run-ending-locator.js.map +1 -0
  568. package/dist/run-launcher.d.ts +459 -0
  569. package/dist/run-launcher.d.ts.map +1 -0
  570. package/dist/run-launcher.js +652 -0
  571. package/dist/run-launcher.js.map +1 -0
  572. package/dist/run-lease.d.ts +208 -0
  573. package/dist/run-lease.d.ts.map +1 -0
  574. package/dist/run-lease.js +301 -0
  575. package/dist/run-lease.js.map +1 -0
  576. package/dist/run-refusal-marks.d.ts +189 -0
  577. package/dist/run-refusal-marks.d.ts.map +1 -0
  578. package/dist/run-refusal-marks.js +249 -0
  579. package/dist/run-refusal-marks.js.map +1 -0
  580. package/dist/run-start-marks.d.ts +153 -0
  581. package/dist/run-start-marks.d.ts.map +1 -0
  582. package/dist/run-start-marks.js +269 -0
  583. package/dist/run-start-marks.js.map +1 -0
  584. package/dist/scan-cmd.d.ts +14 -0
  585. package/dist/scan-cmd.d.ts.map +1 -0
  586. package/dist/scan-cmd.js +270 -0
  587. package/dist/scan-cmd.js.map +1 -0
  588. package/dist/scan-events.d.ts +50 -0
  589. package/dist/scan-events.d.ts.map +1 -0
  590. package/dist/scan-events.js +91 -0
  591. package/dist/scan-events.js.map +1 -0
  592. package/dist/scan.d.ts +191 -0
  593. package/dist/scan.d.ts.map +1 -0
  594. package/dist/scan.js +417 -0
  595. package/dist/scan.js.map +1 -0
  596. package/dist/scope-rule.d.ts +148 -0
  597. package/dist/scope-rule.d.ts.map +1 -0
  598. package/dist/scope-rule.js +121 -0
  599. package/dist/scope-rule.js.map +1 -0
  600. package/dist/self-repo-id.d.ts +18 -0
  601. package/dist/self-repo-id.d.ts.map +1 -0
  602. package/dist/self-repo-id.js +70 -0
  603. package/dist/self-repo-id.js.map +1 -0
  604. package/dist/serve-cmd.d.ts +115 -0
  605. package/dist/serve-cmd.d.ts.map +1 -0
  606. package/dist/serve-cmd.js +505 -0
  607. package/dist/serve-cmd.js.map +1 -0
  608. package/dist/serve.d.ts +167 -0
  609. package/dist/serve.d.ts.map +1 -0
  610. package/dist/serve.js +336 -0
  611. package/dist/serve.js.map +1 -0
  612. package/dist/server-client.d.ts +766 -0
  613. package/dist/server-client.d.ts.map +1 -0
  614. package/dist/server-client.js +475 -0
  615. package/dist/server-client.js.map +1 -0
  616. package/dist/session-adapter-runtime.d.ts +195 -0
  617. package/dist/session-adapter-runtime.d.ts.map +1 -0
  618. package/dist/session-adapter-runtime.js +373 -0
  619. package/dist/session-adapter-runtime.js.map +1 -0
  620. package/dist/session-checkpoint-runtime.d.ts +62 -0
  621. package/dist/session-checkpoint-runtime.d.ts.map +1 -0
  622. package/dist/session-checkpoint-runtime.js +268 -0
  623. package/dist/session-checkpoint-runtime.js.map +1 -0
  624. package/dist/session-control-transport.d.ts +106 -0
  625. package/dist/session-control-transport.d.ts.map +1 -0
  626. package/dist/session-control-transport.js +232 -0
  627. package/dist/session-control-transport.js.map +1 -0
  628. package/dist/session-observation-store.d.ts +98 -0
  629. package/dist/session-observation-store.d.ts.map +1 -0
  630. package/dist/session-observation-store.js +155 -0
  631. package/dist/session-observation-store.js.map +1 -0
  632. package/dist/session-observe-runtime.d.ts +123 -0
  633. package/dist/session-observe-runtime.d.ts.map +1 -0
  634. package/dist/session-observe-runtime.js +317 -0
  635. package/dist/session-observe-runtime.js.map +1 -0
  636. package/dist/session-store.d.ts +98 -0
  637. package/dist/session-store.d.ts.map +1 -0
  638. package/dist/session-store.js +116 -0
  639. package/dist/session-store.js.map +1 -0
  640. package/dist/sessions-cmd.d.ts +202 -0
  641. package/dist/sessions-cmd.d.ts.map +1 -0
  642. package/dist/sessions-cmd.js +609 -0
  643. package/dist/sessions-cmd.js.map +1 -0
  644. package/dist/settings-overlay.d.ts +53 -0
  645. package/dist/settings-overlay.d.ts.map +1 -0
  646. package/dist/settings-overlay.js +175 -0
  647. package/dist/settings-overlay.js.map +1 -0
  648. package/dist/setup-prompt.d.ts +34 -0
  649. package/dist/setup-prompt.d.ts.map +1 -0
  650. package/dist/setup-prompt.js +92 -0
  651. package/dist/setup-prompt.js.map +1 -0
  652. package/dist/setup.d.ts +103 -0
  653. package/dist/setup.d.ts.map +1 -0
  654. package/dist/setup.js +283 -0
  655. package/dist/setup.js.map +1 -0
  656. package/dist/shared-grants.d.ts +164 -0
  657. package/dist/shared-grants.d.ts.map +1 -0
  658. package/dist/shared-grants.js +242 -0
  659. package/dist/shared-grants.js.map +1 -0
  660. package/dist/signals.d.ts +55 -0
  661. package/dist/signals.d.ts.map +1 -0
  662. package/dist/signals.js +85 -0
  663. package/dist/signals.js.map +1 -0
  664. package/dist/source-cmd.d.ts +201 -0
  665. package/dist/source-cmd.d.ts.map +1 -0
  666. package/dist/source-cmd.js +684 -0
  667. package/dist/source-cmd.js.map +1 -0
  668. package/dist/source-verdict.d.ts +99 -0
  669. package/dist/source-verdict.d.ts.map +1 -0
  670. package/dist/source-verdict.js +182 -0
  671. package/dist/source-verdict.js.map +1 -0
  672. package/dist/spend-ledger.d.ts +350 -0
  673. package/dist/spend-ledger.d.ts.map +1 -0
  674. package/dist/spend-ledger.js +546 -0
  675. package/dist/spend-ledger.js.map +1 -0
  676. package/dist/stale-run-sweep.d.ts +79 -0
  677. package/dist/stale-run-sweep.d.ts.map +1 -0
  678. package/dist/stale-run-sweep.js +116 -0
  679. package/dist/stale-run-sweep.js.map +1 -0
  680. package/dist/start-attempts.d.ts +385 -0
  681. package/dist/start-attempts.d.ts.map +1 -0
  682. package/dist/start-attempts.js +613 -0
  683. package/dist/start-attempts.js.map +1 -0
  684. package/dist/status-cmd.d.ts +28 -0
  685. package/dist/status-cmd.d.ts.map +1 -0
  686. package/dist/status-cmd.js +116 -0
  687. package/dist/status-cmd.js.map +1 -0
  688. package/dist/stop-follow-up.d.ts +107 -0
  689. package/dist/stop-follow-up.d.ts.map +1 -0
  690. package/dist/stop-follow-up.js +172 -0
  691. package/dist/stop-follow-up.js.map +1 -0
  692. package/dist/surface-lease.d.ts +118 -0
  693. package/dist/surface-lease.d.ts.map +1 -0
  694. package/dist/surface-lease.js +485 -0
  695. package/dist/surface-lease.js.map +1 -0
  696. package/dist/sync.d.ts +54 -0
  697. package/dist/sync.d.ts.map +1 -0
  698. package/dist/sync.js +93 -0
  699. package/dist/sync.js.map +1 -0
  700. package/dist/syncing-ledger.d.ts +45 -0
  701. package/dist/syncing-ledger.d.ts.map +1 -0
  702. package/dist/syncing-ledger.js +53 -0
  703. package/dist/syncing-ledger.js.map +1 -0
  704. package/dist/temp-fixtures.d.ts +68 -0
  705. package/dist/temp-fixtures.d.ts.map +1 -0
  706. package/dist/temp-fixtures.js +38 -0
  707. package/dist/temp-fixtures.js.map +1 -0
  708. package/dist/token-window.d.ts +84 -0
  709. package/dist/token-window.d.ts.map +1 -0
  710. package/dist/token-window.js +143 -0
  711. package/dist/token-window.js.map +1 -0
  712. package/dist/tool-bridge.d.ts +177 -0
  713. package/dist/tool-bridge.d.ts.map +1 -0
  714. package/dist/tool-bridge.js +329 -0
  715. package/dist/tool-bridge.js.map +1 -0
  716. package/dist/tool-call-record.d.ts +197 -0
  717. package/dist/tool-call-record.d.ts.map +1 -0
  718. package/dist/tool-call-record.js +276 -0
  719. package/dist/tool-call-record.js.map +1 -0
  720. package/dist/tool-protocol.d.ts +135 -0
  721. package/dist/tool-protocol.d.ts.map +1 -0
  722. package/dist/tool-protocol.js +104 -0
  723. package/dist/tool-protocol.js.map +1 -0
  724. package/dist/tool-worker.d.ts +3 -0
  725. package/dist/tool-worker.d.ts.map +1 -0
  726. package/dist/tool-worker.js +478 -0
  727. package/dist/tool-worker.js.map +1 -0
  728. package/dist/toolchain-mirror.d.ts +86 -0
  729. package/dist/toolchain-mirror.d.ts.map +1 -0
  730. package/dist/toolchain-mirror.js +307 -0
  731. package/dist/toolchain-mirror.js.map +1 -0
  732. package/dist/trusted-git.d.ts +243 -0
  733. package/dist/trusted-git.d.ts.map +1 -0
  734. package/dist/trusted-git.js +920 -0
  735. package/dist/trusted-git.js.map +1 -0
  736. package/dist/ui.d.ts +76 -0
  737. package/dist/ui.d.ts.map +1 -0
  738. package/dist/ui.js +118 -0
  739. package/dist/ui.js.map +1 -0
  740. package/dist/untrusted-exec.d.ts +275 -0
  741. package/dist/untrusted-exec.d.ts.map +1 -0
  742. package/dist/untrusted-exec.js +479 -0
  743. package/dist/untrusted-exec.js.map +1 -0
  744. package/dist/untrusted-gate.d.ts +73 -0
  745. package/dist/untrusted-gate.d.ts.map +1 -0
  746. package/dist/untrusted-gate.js +226 -0
  747. package/dist/untrusted-gate.js.map +1 -0
  748. package/dist/uploader.d.ts +153 -0
  749. package/dist/uploader.d.ts.map +1 -0
  750. package/dist/uploader.js +204 -0
  751. package/dist/uploader.js.map +1 -0
  752. package/dist/verifier.d.ts +66 -0
  753. package/dist/verifier.d.ts.map +1 -0
  754. package/dist/verifier.js +170 -0
  755. package/dist/verifier.js.map +1 -0
  756. package/dist/verify-apply.d.ts +26 -0
  757. package/dist/verify-apply.d.ts.map +1 -0
  758. package/dist/verify-apply.js +36 -0
  759. package/dist/verify-apply.js.map +1 -0
  760. package/dist/verify-cmd.d.ts +44 -0
  761. package/dist/verify-cmd.d.ts.map +1 -0
  762. package/dist/verify-cmd.js +125 -0
  763. package/dist/verify-cmd.js.map +1 -0
  764. package/dist/verify-pass.d.ts +73 -0
  765. package/dist/verify-pass.d.ts.map +1 -0
  766. package/dist/verify-pass.js +103 -0
  767. package/dist/verify-pass.js.map +1 -0
  768. package/dist/welcome.d.ts +43 -0
  769. package/dist/welcome.d.ts.map +1 -0
  770. package/dist/welcome.js +116 -0
  771. package/dist/welcome.js.map +1 -0
  772. package/dist/workspace-provisioner.d.ts +65 -0
  773. package/dist/workspace-provisioner.d.ts.map +1 -0
  774. package/dist/workspace-provisioner.js +66 -0
  775. package/dist/workspace-provisioner.js.map +1 -0
  776. package/dist/workspace-quarantine.d.ts +64 -0
  777. package/dist/workspace-quarantine.d.ts.map +1 -0
  778. package/dist/workspace-quarantine.js +156 -0
  779. package/dist/workspace-quarantine.js.map +1 -0
  780. package/dist/workspace-residue-sweep.d.ts +113 -0
  781. package/dist/workspace-residue-sweep.d.ts.map +1 -0
  782. package/dist/workspace-residue-sweep.js +158 -0
  783. package/dist/workspace-residue-sweep.js.map +1 -0
  784. package/dist/workspace.d.ts +639 -0
  785. package/dist/workspace.d.ts.map +1 -0
  786. package/dist/workspace.js +2026 -0
  787. package/dist/workspace.js.map +1 -0
  788. package/package.json +52 -4
  789. package/win/CredProbe.cs +64 -0
  790. package/win/FakeClaude.cs +56 -0
  791. package/win/HandleProbe.cs +116 -0
  792. package/win/TokenProbe.cs +53 -0
  793. package/win/appcontainer.ps1 +500 -0
@@ -0,0 +1,681 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.asCheckReport = asCheckReport;
4
+ exports.reviewsOwed = reviewsOwed;
5
+ exports.integrationLogPath = integrationLogPath;
6
+ exports.recordAttempt = recordAttempt;
7
+ exports.readAttempts = readAttempts;
8
+ exports.initialiseIntegration = initialiseIntegration;
9
+ exports.admitCandidateChecks = admitCandidateChecks;
10
+ exports.integrationBaselinePath = integrationBaselinePath;
11
+ exports.recordBaseline = recordBaseline;
12
+ exports.readBaseline = readBaseline;
13
+ exports.integrationTick = integrationTick;
14
+ const node_fs_1 = require("node:fs");
15
+ const node_path_1 = require("node:path");
16
+ const git_driver_1 = require("./git-driver");
17
+ const checkout_carry_1 = require("./checkout-carry");
18
+ const integration_1 = require("./integration");
19
+ const exclusive_lock_1 = require("./exclusive-lock");
20
+ const core_1 = require("@looply/core");
21
+ /**
22
+ * The commit a ref points at.
23
+ *
24
+ * ⚠️ THROUGH `mergeBase(ref, ref)`, WHICH IS THE DRIVER'S OWN RESOLVER. Adding a
25
+ * `rev-parse <ref>` verb would widen the trusted surface for something the
26
+ * existing convergence verbs already answer: the merge base of a ref with
27
+ * itself IS that ref's commit.
28
+ */
29
+ async function shaOf(git, ref) {
30
+ const sha = await git.mergeBase(ref, ref);
31
+ if (sha === null)
32
+ throw new Error(`could not resolve ${ref} to a commit`);
33
+ return sha;
34
+ }
35
+ /**
36
+ * Normalise either arm into the report shape.
37
+ *
38
+ * 🔴 `'checks' in r`, NOT `Array.isArray(r)`. Measured with this repository's own
39
+ * TypeScript under `strict`: the `Array.isArray` form does not narrow a
40
+ * `readonly T[]` union member — its lib predicate is `arg is any[]` — and the
41
+ * result is a type error in both branches rather than a narrowing.
42
+ */
43
+ function asCheckReport(r) {
44
+ return 'checks' in r ? r : { checks: r };
45
+ }
46
+ /**
47
+ * Every attempt that owes an evaluator verdict, newest first.
48
+ *
49
+ * 🔴 THE `unresolvedOf` OF THIS SEAM. `coverageOf` could not carry an open
50
+ * question, so a reader was added beside it rather than the question being
51
+ * forced into a shape that did not fit; the same move, for the same reason. An
52
+ * obligation nothing can enumerate is an obligation nobody will discharge.
53
+ *
54
+ * ⚠️ AN ATTEMPT THAT WAS NEVER PUBLISHED STILL OWES NOTHING YET. The verdict is
55
+ * owed on what went onto the integration branch; a refused attempt put nothing
56
+ * there. Callers that want both can ask for `published` themselves — this
57
+ * answers the question the charter asked.
58
+ */
59
+ function reviewsOwed(attempts) {
60
+ return attempts
61
+ .filter((a) => a.reviewOwed !== undefined && a.published !== undefined)
62
+ .sort((a, b) => (a.at < b.at ? 1 : a.at > b.at ? -1 : 0));
63
+ }
64
+ function integrationLogPath(cwd) {
65
+ return (0, node_path_1.join)((0, git_driver_1.projectStateDir)(cwd), 'integration.jsonl');
66
+ }
67
+ function integrationLockPath(cwd) {
68
+ return (0, node_path_1.join)((0, git_driver_1.projectStateDir)(cwd), '.integration.lock');
69
+ }
70
+ /**
71
+ * ⚠️ LED BY A NEWLINE, for the reason every ledger here is: a torn write must
72
+ * cost one record rather than two.
73
+ */
74
+ function recordAttempt(cwd, attempt) {
75
+ const path = integrationLogPath(cwd);
76
+ try {
77
+ (0, node_fs_1.mkdirSync)((0, node_path_1.dirname)(path), { recursive: true });
78
+ (0, node_fs_1.appendFileSync)(path, `\n${JSON.stringify(attempt)}\n`, 'utf8');
79
+ return true;
80
+ }
81
+ catch {
82
+ return false;
83
+ }
84
+ }
85
+ function readAttempts(cwd) {
86
+ let raw;
87
+ try {
88
+ raw = (0, node_fs_1.readFileSync)(integrationLogPath(cwd), 'utf8');
89
+ }
90
+ catch {
91
+ return [];
92
+ }
93
+ const out = [];
94
+ for (const line of raw.split('\n')) {
95
+ const text = line.trim();
96
+ if (text === '')
97
+ continue;
98
+ try {
99
+ const parsed = JSON.parse(text);
100
+ if (typeof parsed?.attemptId === 'string' && typeof parsed?.commitSha === 'string')
101
+ out.push(parsed);
102
+ }
103
+ catch {
104
+ /* a fragment from a torn write; the leading newline is what bounds it */
105
+ }
106
+ }
107
+ return out;
108
+ }
109
+ /**
110
+ * CREATE THE INTEGRATION BASE, FROM A BASE SOMEBODY CHOSE.
111
+ *
112
+ * 🔴 NOT FROM WHATEVER HEAD HAPPENS TO BE NEARBY. Where every future run starts
113
+ * is a decision about the project, and inferring it from the cwd's current
114
+ * checkout would make it depend on which branch somebody left themselves on.
115
+ * The ref is named explicitly and resolved before anything is written.
116
+ */
117
+ async function initialiseIntegration(cwd, from, git = new git_driver_1.GitDriver((0, git_driver_1.nodeGitExec)(cwd))) {
118
+ if (await git.refExists(integration_1.INTEGRATION_BRANCH)) {
119
+ const sha = await shaOf(git, integration_1.INTEGRATION_BRANCH);
120
+ return { ok: true, ref: integration_1.INTEGRATION_BRANCH, sha, already: true };
121
+ }
122
+ if (!(await git.refExists(from))) {
123
+ return { ok: false, because: `there is no such ref to start integration from: ${from}` };
124
+ }
125
+ const sha = await shaOf(git, from);
126
+ const created = await git.compareAndSetRef(integration_1.INTEGRATION_BRANCH, sha, null);
127
+ return created
128
+ ? { ok: true, ref: integration_1.INTEGRATION_BRANCH, sha, already: false }
129
+ : {
130
+ ok: false,
131
+ because: `${integration_1.INTEGRATION_BRANCH} could not be created at ${sha} — something else created it first`,
132
+ };
133
+ }
134
+ /** The rule itself, on facts somebody else gathered. Pure. */
135
+ function admitCandidateChecks(checks, rule) {
136
+ const refusing = [];
137
+ const notYetMet = [];
138
+ for (const check of checks) {
139
+ if (check.ok)
140
+ continue;
141
+ const before = rule.baseline?.get(check.name);
142
+ const because = !rule.admission.declared.has(check.name)
143
+ ? 'undeclared'
144
+ : rule.admission.required.has(check.name)
145
+ ? 'required'
146
+ : rule.claimed.has(check.name)
147
+ ? 'claimed'
148
+ : check.inconclusive !== undefined
149
+ ? 'inconclusive'
150
+ : before === undefined
151
+ ? 'no-baseline'
152
+ : before
153
+ ? 'passed-on-base'
154
+ : null;
155
+ if (because === null)
156
+ notYetMet.push(check.name);
157
+ else
158
+ refusing.push({ check, because });
159
+ }
160
+ /**
161
+ * ⚠️ A DECLARED STEP THAT DID NOT RUN AGAINST THE CANDIDATE REFUSES IT. The rule above judges the
162
+ * red checks it is shown; a pass that silently lacks one would otherwise be judged on less than the
163
+ * map declares — and a candidate that could not even be prepared reports one synthetic check.
164
+ */
165
+ const ran = new Set(checks.map((c) => c.name));
166
+ for (const name of rule.admission.declared) {
167
+ if (!ran.has(name))
168
+ refusing.push({ check: { name, ok: false, detail: 'did not run against the candidate' }, because: 'did-not-run' });
169
+ }
170
+ return { refusing, notYetMet };
171
+ }
172
+ const ADMISSION_WORDS = {
173
+ required: 'required',
174
+ 'passed-on-base': 'passed on the base',
175
+ claimed: 'claimed by this candidate',
176
+ undeclared: 'not in the acceptance map',
177
+ 'no-baseline': 'no baseline',
178
+ inconclusive: 'it reached no verdict',
179
+ 'did-not-run': 'it did not run against the candidate',
180
+ unclaimed: 'no claim reached the lane, so nothing says what this candidate proves',
181
+ };
182
+ /** One line per base the lane has measured, keyed by revision AND acceptance map. */
183
+ function integrationBaselinePath(cwd) {
184
+ return (0, node_path_1.join)((0, git_driver_1.projectStateDir)(cwd), 'integration-baseline.jsonl');
185
+ }
186
+ /** ⚠️ LED BY A NEWLINE, like every ledger here. */
187
+ function recordBaseline(cwd, record) {
188
+ const path = integrationBaselinePath(cwd);
189
+ try {
190
+ (0, node_fs_1.mkdirSync)((0, node_path_1.dirname)(path), { recursive: true });
191
+ (0, node_fs_1.appendFileSync)(path, `\n${JSON.stringify(record)}\n`, 'utf8');
192
+ return true;
193
+ }
194
+ catch {
195
+ return false;
196
+ }
197
+ }
198
+ /**
199
+ * The newest baseline for this revision under THIS acceptance map, or null.
200
+ *
201
+ * ⚠️ THE DIGEST IS PART OF THE KEY. A check name is not its command: under a
202
+ * different map "R3 was red on the base" may be about a different check.
203
+ */
204
+ function readBaseline(cwd, sha, acceptanceDigest) {
205
+ let raw;
206
+ try {
207
+ raw = (0, node_fs_1.readFileSync)(integrationBaselinePath(cwd), 'utf8');
208
+ }
209
+ catch {
210
+ return null;
211
+ }
212
+ let found = null;
213
+ for (const line of raw.split('\n')) {
214
+ const text = line.trim();
215
+ if (text === '')
216
+ continue;
217
+ try {
218
+ const r = JSON.parse(text);
219
+ /**
220
+ * ⚠️ EVERY ENTRY OR NONE. A record whose checks are not all `{ name: string, ok: boolean }` is
221
+ * skipped whole: `ok` read loosely would turn "not sure" into "red on the base", which is the
222
+ * permissive answer.
223
+ */
224
+ const wellFormed = Array.isArray(r?.checks) &&
225
+ r.checks.every((c) => c !== null && typeof c === 'object' && typeof c.name === 'string' && typeof c.ok === 'boolean');
226
+ if (r?.sha === sha && r.acceptanceDigest === acceptanceDigest && wellFormed)
227
+ found = r;
228
+ }
229
+ catch {
230
+ /* a fragment from a torn write */
231
+ }
232
+ }
233
+ return found === null ? null : new Map(found.checks.map((c) => [c.name, c.ok]));
234
+ }
235
+ /**
236
+ * THE BASE, MEASURED THE WAY A CANDIDATE IS — its own throwaway checkout, the
237
+ * same carry, the same `check` — when no baseline is on record for it.
238
+ *
239
+ * ⚠️ NULL ON ANY FAILURE, AND NULL FAILS CLOSED in `admitCandidateChecks`. A base
240
+ * whose checks could not be run proves nothing about which of them were red.
241
+ */
242
+ async function measureBaseline(cwd, deps, carry, base, attemptId) {
243
+ const dir = (0, node_path_1.join)((0, git_driver_1.projectStateDir)(cwd), 'integration-candidates', `${attemptId}-base`);
244
+ try {
245
+ await deps.git.addWorktree(dir, `looply/candidate-${attemptId}-base`, base);
246
+ if (carry.length > 0)
247
+ (0, checkout_carry_1.carryIntoCheckout)(cwd, dir, carry);
248
+ const report = asCheckReport(await deps.check({ dir, sha: base }));
249
+ if (report.abort !== undefined || report.checks.length === 0)
250
+ return null;
251
+ return [...report.checks];
252
+ }
253
+ catch {
254
+ return null;
255
+ }
256
+ finally {
257
+ try {
258
+ await deps.git.removeWorktree(dir);
259
+ }
260
+ catch {
261
+ /* a checkout left behind is not a verdict */
262
+ }
263
+ try {
264
+ (0, node_fs_1.rmSync)(dir, { recursive: true, force: true, maxRetries: 2 });
265
+ }
266
+ catch {
267
+ /* same */
268
+ }
269
+ }
270
+ }
271
+ /** The rule, with the base it needs: read from the record, measured once when missing. */
272
+ async function admitAgainstBase(cwd, deps, admission, checks, candidate, at) {
273
+ /**
274
+ * 🔴 NO CLAIM, NO ADMISSION. Rule (c) — "a check this candidate cites as proof must pass" — is the
275
+ * lane's only hold on the goal's OWN proof, and it needs the claim. A candidate with none (a person's
276
+ * `integrate` of a branch nothing recorded, a delivery record that failed to write, a tip that moved)
277
+ * gets the strict lane: every red check refuses, and says why.
278
+ */
279
+ if (candidate.claim === undefined) {
280
+ return { refusing: checks.filter((c) => !c.ok).map((check) => ({ check, because: 'unclaimed' })), notYetMet: [] };
281
+ }
282
+ const claimed = new Set(candidate.claim.servings.flatMap((s) => s.serves.map((x) => x.provenBy)));
283
+ const judge = (baseline) => admitCandidateChecks(checks, { admission, baseline, claimed });
284
+ const verdict = judge(readBaseline(cwd, at.base, admission.acceptanceDigest));
285
+ if (!verdict.refusing.some((r) => r.because === 'no-baseline'))
286
+ return verdict;
287
+ // Refused already for a reason no baseline can change: measuring the base would buy nothing.
288
+ if (verdict.refusing.some((r) => r.because !== 'no-baseline'))
289
+ return verdict;
290
+ const measured = await measureBaseline(cwd, deps, at.carry, at.base, at.attemptId);
291
+ if (measured === null)
292
+ return verdict;
293
+ // Only checks that reached a verdict are evidence about the base; the rest stay unknown, and unknown refuses.
294
+ const checksAtBase = measured.filter((c) => c.inconclusive === undefined).map((c) => ({ name: c.name, ok: c.ok }));
295
+ recordBaseline(cwd, { sha: at.base, acceptanceDigest: admission.acceptanceDigest, at: at.when, checks: checksAtBase });
296
+ return judge(new Map(checksAtBase.map((c) => [c.name, c.ok])));
297
+ }
298
+ /**
299
+ * ONE CANDIDATE, ONE INVOCATION, ONE AT A TIME.
300
+ *
301
+ * ⚠️ SERIALISED ON THE PROJECT'S OWN LOCK, so two daemons cannot both validate
302
+ * against the same base and both publish. The shared mutex is the one in
303
+ * `exclusive-lock`; there is no second implementation.
304
+ */
305
+ async function integrationTick(cwd, candidate, enabled, deps) {
306
+ if (!enabled)
307
+ return { kind: 'off' };
308
+ const { git } = deps;
309
+ const carry = deps.carry ?? [];
310
+ if (!(await git.refExists(integration_1.INTEGRATION_BRANCH))) {
311
+ return {
312
+ kind: 'uninitialised',
313
+ because: `${integration_1.INTEGRATION_BRANCH} does not exist — nothing can be integrated until it is created`,
314
+ };
315
+ }
316
+ if (!(await git.refExists(candidate.branch))) {
317
+ return { kind: 'idle', because: `there is no branch ${candidate.branch} to integrate` };
318
+ }
319
+ const attemptId = deps.newId();
320
+ const at = new Date(deps.now()).toISOString();
321
+ /**
322
+ * ALREADY DONE IS NOT DONE AGAIN.
323
+ *
324
+ * 🔴 RESTART MUST NOT REPUBLISH. A crash between publishing and recording
325
+ * leaves a moved ref and no line saying so; a crash the other way round
326
+ * cannot happen, because the record is written after the swap. So the check
327
+ * that matters is against the REF, not the log: if integration already
328
+ * contains this commit, the work is in and this is a no-op.
329
+ */
330
+ const commitSha = await shaOf(git, candidate.branch);
331
+ const base = await shaOf(git, integration_1.INTEGRATION_BRANCH);
332
+ const mergeBase = await git.mergeBase(integration_1.INTEGRATION_BRANCH, candidate.branch);
333
+ if (mergeBase === commitSha) {
334
+ return {
335
+ kind: 'idle',
336
+ because: `${candidate.branch} is already contained in ${integration_1.INTEGRATION_BRANCH}`,
337
+ };
338
+ }
339
+ const verdict = await (0, integration_1.canIntegrate)(git, candidate.branch, true);
340
+ /**
341
+ * 🔴 R3 — A REFUSAL IS NO LONGER THE END OF THE WORK.
342
+ *
343
+ * The base moved, so this candidate cannot fast-forward and never will. The
344
+ * forbidden answer is to rebase it onto the new base; the honest one is to
345
+ * carry the CHANGE across as a new candidate and make it earn its own way
346
+ * through this same function.
347
+ *
348
+ * ⚠️ THE ORIGINAL REFUSAL IS STILL RECORDED. What the ledger says about this
349
+ * branch does not change: it was offered, it was behind, it was refused. The
350
+ * replay is a different candidate with a different sha, and it is written
351
+ * down as one.
352
+ *
353
+ * ⚠️ ONE REPLAY PER TICK, ENFORCED BY DROPPING THE DEP ON THE WAY IN. A
354
+ * replayed candidate that is itself refused — because a third worker landed
355
+ * while this one was being prepared — must not spawn another replay, or a
356
+ * busy lane would chase its own tail instead of reporting that it is busy.
357
+ */
358
+ if (verdict.kind === 'needs-rebase' && deps.replay !== undefined) {
359
+ const carried = await deps.replay({ branch: candidate.branch, attemptId });
360
+ if (carried.kind === 'replayed') {
361
+ recordAttempt(cwd, {
362
+ attemptId,
363
+ at,
364
+ ...(candidate.goalId === undefined ? {} : { goalId: candidate.goalId }),
365
+ ...(candidate.runId === undefined ? {} : { runId: candidate.runId }),
366
+ branch: candidate.branch,
367
+ commitSha,
368
+ expectedBase: base,
369
+ candidateSha: commitSha,
370
+ verdict: verdict.kind,
371
+ replayedAs: carried.branch,
372
+ /**
373
+ * The same fact the sentence below carries, in a shape something can
374
+ * read. Set when and only when the verdict did not carry.
375
+ */
376
+ ...(carried.judgement === 'stands' || carried.contract === 'independent'
377
+ ? {}
378
+ : {
379
+ reviewOwed: {
380
+ reason: carried.contract,
381
+ because: carried.because,
382
+ },
383
+ }),
384
+ because: `${verdict.because} — carried onto ${integration_1.INTEGRATION_BRANCH} as ${carried.branch}, which is offered next` +
385
+ (carried.judgement === 'stands'
386
+ ? ''
387
+ : '; its evaluator verdict does not carry across and must be taken again'),
388
+ });
389
+ deps.log(`integrate: ${candidate.branch} was behind; carried it onto ${integration_1.INTEGRATION_BRANCH} as ${carried.branch}` +
390
+ (carried.judgement === 'stands' ? '' : ' — its verdict must be taken again'));
391
+ const { replay: _dropped, ...once } = deps;
392
+ return integrationTick(cwd, {
393
+ ...candidate,
394
+ branch: carried.branch,
395
+ ...(carried.judgement === 'stands' || carried.contract === 'independent'
396
+ ? {}
397
+ : { reviewOwed: { reason: carried.contract, because: carried.because } }),
398
+ ...(carried.disjoint === true ? { replayDisjoint: true } : {}),
399
+ }, enabled, once);
400
+ }
401
+ /**
402
+ * 🔴 A STALE EVALUATOR VERDICT IS RECORDED, NOT A REASON TO REFUSE — AND
403
+ * THIS REVERSES WHAT THIS FUNCTION DID WHEN THE REPLAY LANDED.
404
+ *
405
+ * The first version refused to publish a carried change whose judgement no
406
+ * longer stood. Two things were wrong with it.
407
+ *
408
+ * ⚠️ IT WAS STRICTER THAN THE PRODUCT'S OWN ANSWER TO THE SAME QUESTION.
409
+ * `check` exists because *"between them the base may have moved and the
410
+ * run's evidence is about a different tree"* — and the lane's answer to
411
+ * that is to RE-GATE the commit that would actually be published, which is
412
+ * exactly what still happens here. Refusing on top of re-gating applied a
413
+ * second, harsher rule to the same fact.
414
+ *
415
+ * 🔴 AND IT MADE THE FEATURE INERT WHERE IT MATTERS. The verdict comes from
416
+ * `revalidationVerdict`, which answers `unmeasurable` whenever no project
417
+ * graph is held — so in any project without one, every carried change would
418
+ * have been refused and R2-J-1's measured loss would have stood unchanged.
419
+ * A safeguard that only ever fires is not a safeguard.
420
+ *
421
+ * So the change is published on a GREEN GATE, as any candidate is, and the
422
+ * disposition of the model's verdict is written into the attempt where a
423
+ * person or a later evaluator can act on it. Nothing is hidden: the ledger
424
+ * says the verdict did not carry.
425
+ */
426
+ }
427
+ if (verdict.kind !== 'fast-forward') {
428
+ const attempt = {
429
+ attemptId,
430
+ at,
431
+ ...(candidate.goalId === undefined ? {} : { goalId: candidate.goalId }),
432
+ ...(candidate.runId === undefined ? {} : { runId: candidate.runId }),
433
+ branch: candidate.branch,
434
+ commitSha,
435
+ expectedBase: base,
436
+ candidateSha: commitSha,
437
+ verdict: verdict.kind,
438
+ because: verdict.kind === 'needs-rebase'
439
+ ? verdict.because
440
+ : `nothing to integrate from ${candidate.branch}`,
441
+ };
442
+ recordAttempt(cwd, attempt);
443
+ return { kind: 'refused', attempt };
444
+ }
445
+ /**
446
+ * THE CANDIDATE IS CHECKED IN ITS OWN CHECKOUT, AT THE COMMIT THAT WOULD BE
447
+ * PUBLISHED — never in the run's workspace, and never at an older sha.
448
+ */
449
+ const dir = (0, node_path_1.join)((0, git_driver_1.projectStateDir)(cwd), 'integration-candidates', attemptId);
450
+ let checks = [];
451
+ /**
452
+ * What those checks ran under, and why there were none. Both stay undefined
453
+ * for a `check` that returns a bare array, which is every existing caller.
454
+ */
455
+ let environment;
456
+ let abort;
457
+ try {
458
+ // A throwaway branch for a throwaway checkout: `worktree add` needs one,
459
+ // and it is removed with the directory a few lines below.
460
+ await git.addWorktree(dir, `looply/candidate-${attemptId}`, commitSha);
461
+ /**
462
+ * 🔴 THE CANDIDATE'S CHECKOUT NEEDS WHAT GIT DOES NOT CARRY, TOO.
463
+ *
464
+ * This tree is made in order to be gated, and a worktree holds only what git
465
+ * tracks — so for any project with a dependency the checks below failed for
466
+ * a reason that had nothing to do with the candidate. Measured: two finished
467
+ * branches refused with "2 required check(s) failed against the candidate:
468
+ * tsc, test", while the identical commit passed 8/8 in a checkout that
469
+ * happened to have `node_modules`. A lane that refuses correct work for a
470
+ * missing toolchain is worse than one that refuses nothing.
471
+ *
472
+ * ⚠️ A COPY, NEVER A LINK: this directory is deleted recursively in the
473
+ * `finally` a few lines below, and a recursive delete walks a junction.
474
+ */
475
+ if (carry.length > 0)
476
+ (0, checkout_carry_1.carryIntoCheckout)(cwd, dir, carry);
477
+ const report = asCheckReport(await deps.check({ dir, sha: commitSha }));
478
+ checks = [...report.checks];
479
+ environment = report.environment;
480
+ abort = report.abort;
481
+ }
482
+ catch (e) {
483
+ checks = [{ name: 'candidate', ok: false, detail: `the candidate could not be prepared: ${e.message}` }];
484
+ }
485
+ finally {
486
+ try {
487
+ await git.removeWorktree(dir);
488
+ }
489
+ catch {
490
+ /* a checkout left behind is not a reason to publish or to refuse */
491
+ }
492
+ try {
493
+ (0, node_fs_1.rmSync)(dir, { recursive: true, force: true, maxRetries: 2 });
494
+ }
495
+ catch {
496
+ /* same */
497
+ }
498
+ }
499
+ const failed = checks.filter((c) => !c.ok);
500
+ /**
501
+ * WHICH RED CHECKS REFUSE: every one — unless programme mode's admission rule
502
+ * says a check was red on the base too and nothing makes this candidate
503
+ * answer for it. See `LaneAdmission`.
504
+ */
505
+ const admitted = deps.admission === undefined || checks.length === 0 || failed.length === 0
506
+ ? null
507
+ : await admitAgainstBase(cwd, deps, deps.admission, checks, candidate, { base, attemptId, when: at, carry });
508
+ const notYetMet = admitted?.notYetMet ?? [];
509
+ /**
510
+ * THE OWNER'S REPLAY POLICY (F23; owner decision 2026-09-24, clarified): a replay owes
511
+ * no fresh evaluator verdict when its change touched no file the base had moved AND
512
+ * the lane publishes it under programme admission — which already means every
513
+ * required, claimed and previously-green check passed, only checks no goal has met
514
+ * yet staying red. Programme mode only; anywhere else, and on any overlap, the
515
+ * verdict is still owed and the controller holds for it.
516
+ */
517
+ const settledByPolicy = candidate.reviewOwed !== undefined && candidate.replayDisjoint === true && deps.admission !== undefined;
518
+ if ((admitted === null ? failed.length > 0 : admitted.refusing.length > 0) || checks.length === 0) {
519
+ const attempt = {
520
+ attemptId,
521
+ at,
522
+ ...(candidate.goalId === undefined ? {} : { goalId: candidate.goalId }),
523
+ ...(candidate.runId === undefined ? {} : { runId: candidate.runId }),
524
+ branch: candidate.branch,
525
+ commitSha,
526
+ expectedBase: base,
527
+ candidateSha: commitSha,
528
+ verdict: 'fast-forward',
529
+ checks,
530
+ ...(environment === undefined ? {} : { environment }),
531
+ ...(abort === undefined ? {} : { abort }),
532
+ because: checks.length === 0
533
+ ? // ⚠️ THE INTERLOCK'S REASON, WHEN THERE WAS ONE. The empty check set
534
+ // already refuses; what it could not say was why nothing ran.
535
+ `no required check ran against the candidate, so nothing showed it was safe to publish${abort === undefined ? '' : ` — ${abort.reason}`}`
536
+ : admitted === null
537
+ ? `${failed.length} required check(s) failed against the candidate: ${failed.map((c) => c.name).join(', ')}`
538
+ : `${admitted.refusing.length} check(s) this candidate must pass failed against it: ` +
539
+ admitted.refusing.map((r) => `${r.check.name} (${ADMISSION_WORDS[r.because]})`).join(', '),
540
+ ...(notYetMet.length === 0 ? {} : { notYetMet }),
541
+ };
542
+ recordAttempt(cwd, attempt);
543
+ return { kind: 'refused', attempt };
544
+ }
545
+ /**
546
+ * 🔴 PUBLICATION IS A COMPARE-AND-SWAP AGAINST THE BASE WE VALIDATED.
547
+ *
548
+ * Between the checks and this line the base may have moved — another daemon,
549
+ * a person, another candidate. Advancing it anyway would publish validation
550
+ * that describes a different tree. `compareAndSetRef` hands git the old value
551
+ * it must still have, so git itself refuses atomically and this code never
552
+ * has to re-read and hope.
553
+ */
554
+ /**
555
+ * 🔴 RULE #2 — REQUIREMENT ACCEPTANCE, REGENERATED ON THE COMMIT ABOUT TO BE
556
+ * PUBLISHED.
557
+ *
558
+ * Read OUTSIDE the lock because it reaches the server and a lock held across a
559
+ * network call is a lane one unreachable host can stop. The fold itself is
560
+ * pure and runs inside, on the sha that actually swapped.
561
+ *
562
+ * ⚠️ EVERY ABSENCE ANSWERS "NO RECEIPT", NEVER "REFUSED": no `currency` dep
563
+ * (simple mode), no claim on the candidate (a project that holds none), or a
564
+ * goal the server cannot answer for. Completion is then withheld — or not —
565
+ * by the coverage gate, which is where that decision belongs.
566
+ */
567
+ let currency = null;
568
+ if (deps.currency !== undefined && candidate.claim !== undefined) {
569
+ try {
570
+ currency = await deps.currency({ goalId: candidate.claim.goalId });
571
+ }
572
+ catch {
573
+ // An unreachable server is not evidence that a claim is stale.
574
+ currency = null;
575
+ }
576
+ }
577
+ return (0, exclusive_lock_1.withExclusiveLock)(integrationLockPath(cwd), async () => {
578
+ const stillThere = await shaOf(git, integration_1.INTEGRATION_BRANCH);
579
+ const swapped = stillThere === base ? await git.compareAndSetRef(integration_1.INTEGRATION_BRANCH, commitSha, base) : false;
580
+ /**
581
+ * ⚠️ ONLY WHEN THE SWAP HAPPENED. A receipt naming a sha this project is
582
+ * not standing on would be a claim about a tree that was never published.
583
+ */
584
+ const requirements = swapped && currency !== null && candidate.claim !== undefined
585
+ ? (0, core_1.integratedReceipt)({
586
+ claim: candidate.claim,
587
+ now: currency,
588
+ sha: commitSha,
589
+ laneChecks: new Map(checks.map((c) => [c.name, c.ok ? 'passed' : 'failed'])),
590
+ environment: environment === undefined
591
+ ? // The specification requires facts and the gate observed
592
+ // none: unknown is not evidence, so every fact it names is
593
+ // refused rather than waved through.
594
+ Object.keys(currency.requiredProfile).map((fact) => ({
595
+ kind: 'fact-unobserved',
596
+ fact,
597
+ required: (0, core_1.describePredicate)(currency.requiredProfile[fact]),
598
+ }))
599
+ : (0, core_1.matchProfile)(currency.requiredProfile, environment.facts),
600
+ })
601
+ : undefined;
602
+ const attempt = {
603
+ attemptId,
604
+ at,
605
+ ...(candidate.goalId === undefined ? {} : { goalId: candidate.goalId }),
606
+ ...(candidate.runId === undefined ? {} : { runId: candidate.runId }),
607
+ branch: candidate.branch,
608
+ commitSha,
609
+ expectedBase: base,
610
+ candidateSha: commitSha,
611
+ verdict: 'fast-forward',
612
+ checks,
613
+ ...(notYetMet.length === 0 ? {} : { notYetMet }),
614
+ /**
615
+ * 🔴 ON THE PUBLISHING ATTEMPT, WHICH IS THE ONE AN ACCEPTANCE IS ABOUT.
616
+ * Rule #1 binds a receipt to the observed profile AND the integrated
617
+ * revision; `published.to` below is that revision, and this is that
618
+ * profile, on the same record.
619
+ */
620
+ ...(environment === undefined ? {} : { environment }),
621
+ ...(requirements === undefined ? {} : { requirements }),
622
+ // Stamped on the attempt that actually publishes, which is the one an
623
+ // obligation is about — unless the owner's replay policy settles it (F23).
624
+ ...(candidate.reviewOwed === undefined
625
+ ? {}
626
+ : settledByPolicy
627
+ ? {
628
+ reviewSettled: {
629
+ by: 'owner-policy',
630
+ because: 'the carried change touched no file the base had moved, and the lane published it on its full acceptance pass ' +
631
+ '(every required, claimed and previously-green check passed) — owner decision 2026-09-24',
632
+ },
633
+ }
634
+ : { reviewOwed: candidate.reviewOwed }),
635
+ ...(swapped ? { published: { ref: integration_1.INTEGRATION_BRANCH, from: base, to: commitSha } } : {}),
636
+ ...(swapped
637
+ ? {}
638
+ : {
639
+ because: `${integration_1.INTEGRATION_BRANCH} moved from ${base} to ${stillThere} while this candidate was ` +
640
+ 'being checked, so its validation describes a tree that is no longer the base. ' +
641
+ 'Nothing was published; the branch is offered again from the new base',
642
+ }),
643
+ };
644
+ recordAttempt(cwd, attempt);
645
+ /**
646
+ * The published revision is the next base, and these are its checks under
647
+ * this map — recorded so the next candidate is judged against them without
648
+ * measuring the base again.
649
+ */
650
+ if (swapped && deps.admission !== undefined) {
651
+ recordBaseline(cwd, {
652
+ sha: commitSha,
653
+ acceptanceDigest: deps.admission.acceptanceDigest,
654
+ at,
655
+ // Only checks that reached a verdict describe the new base.
656
+ checks: checks.filter((c) => c.inconclusive === undefined).map((c) => ({ name: c.name, ok: c.ok })),
657
+ });
658
+ }
659
+ deps.log(swapped
660
+ ? `integrate: ${candidate.branch} → ${integration_1.INTEGRATION_BRANCH} (${base.slice(0, 7)}..${commitSha.slice(0, 7)})` +
661
+ (notYetMet.length === 0
662
+ ? ''
663
+ : ` — not yet met on the lane: ${notYetMet.join(', ')} (red on the base and still red; not credited)`)
664
+ : `integrate: not published — ${attempt.because}`);
665
+ return swapped ? { kind: 'published', attempt } : { kind: 'refused', attempt };
666
+ }, (why) => Promise.resolve({
667
+ kind: 'refused',
668
+ attempt: {
669
+ attemptId,
670
+ at,
671
+ branch: candidate.branch,
672
+ commitSha,
673
+ expectedBase: base,
674
+ candidateSha: commitSha,
675
+ verdict: 'fast-forward',
676
+ checks,
677
+ because: `publication could not be serialised (${why}), so nothing was published`,
678
+ },
679
+ }));
680
+ }
681
+ //# sourceMappingURL=integration-runtime.js.map