chainlesschain 0.166.97 → 0.166.98

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 (175) hide show
  1. package/package.json +3 -3
  2. package/src/assets/linux-subreaper/linux-arm64/manifest.json +1 -1
  3. package/src/assets/linux-subreaper/linux-x64/manifest.json +1 -1
  4. package/src/assets/web-panel/assets/{AIOps-BB9kKNVw.js → AIOps-DCIQFtF1.js} +1 -1
  5. package/src/assets/web-panel/assets/{ActionButton-DTg-lWE0.js → ActionButton-BxhHU3nE.js} +1 -1
  6. package/src/assets/web-panel/assets/{Analytics-BWUZ0Tpc.js → Analytics-DdM_307O.js} +3 -3
  7. package/src/assets/web-panel/assets/{AppLayout-Dj8WDnCf.js → AppLayout-C43-kSrh.js} +5 -5
  8. package/src/assets/web-panel/assets/{Artifacts-x8NiiPTg.js → Artifacts-B2Vp2Am6.js} +1 -1
  9. package/src/assets/web-panel/assets/{Audit-q7otRAqO.js → Audit-s-lYUfOp.js} +1 -1
  10. package/src/assets/web-panel/assets/{BackgroundAgents-f6qlO2au.js → BackgroundAgents-DTE7Kzio.js} +1 -1
  11. package/src/assets/web-panel/assets/{Backup-BbuX9qQS.js → Backup-9k1q4Mt6.js} +1 -1
  12. package/src/assets/web-panel/assets/{BaseInput-amgV-Y0y.js → BaseInput-DlpUtK5R.js} +1 -1
  13. package/src/assets/web-panel/assets/{Chat-CZW3DW7j.js → Chat-CR9S8Rmb.js} +5 -5
  14. package/src/assets/web-panel/assets/ChatBubbleRenderer-Xtgfw3-c.js +1 -0
  15. package/src/assets/web-panel/assets/{Checkbox-DXHXC52i.js → Checkbox-DpFRu7Df.js} +1 -1
  16. package/src/assets/web-panel/assets/{Codegen-DQh47r4e.js → Codegen-BIl72E4Y.js} +1 -1
  17. package/src/assets/web-panel/assets/{Col-lBOOXCD7.js → Col-91tl_err.js} +1 -1
  18. package/src/assets/web-panel/assets/{Community-BNFPnBu9.js → Community-CswahO9-.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compact-7MOWfBGb.js → Compact-D9pfHmaM.js} +1 -1
  20. package/src/assets/web-panel/assets/{Compliance-x0UA-rxk.js → Compliance-CXSZzAO9.js} +1 -1
  21. package/src/assets/web-panel/assets/{Cowork-C_eLfk_Q.js → Cowork-CuT9RWTn.js} +2 -2
  22. package/src/assets/web-panel/assets/{Cron-BP2-_Fja.js → Cron-B71aJWDV.js} +2 -2
  23. package/src/assets/web-panel/assets/{Crosschain-Dn-e1217.js → Crosschain-CcUuWyx8.js} +1 -1
  24. package/src/assets/web-panel/assets/{DID-D_jverif.js → DID-CtVVGOPL.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dashboard-BysweBms.js → Dashboard-CV7ZCYQq.js} +2 -2
  26. package/src/assets/web-panel/assets/{Dropdown-osJi0Pci.js → Dropdown-DKHxwLgE.js} +1 -1
  27. package/src/assets/web-panel/assets/{EmailListRenderer-C72k1SKQ.js → EmailListRenderer-Bd03UIvv.js} +1 -1
  28. package/src/assets/web-panel/assets/{EvolutionSettings-CAtA1F9s.js → EvolutionSettings-CTrG03B_.js} +1 -1
  29. package/src/assets/web-panel/assets/{FamilyGuardDashboard-Bi0luzvO.js → FamilyGuardDashboard-DXS4bS6Q.js} +1 -1
  30. package/src/assets/web-panel/assets/{Federation-CIwntDLI.js → Federation-BODG2Szj.js} +1 -1
  31. package/src/assets/web-panel/assets/{FormItemContext-DRfwhPW-.js → FormItemContext-D32ccUqD.js} +1 -1
  32. package/src/assets/web-panel/assets/{GenericCardRenderer-COJTzZ61.js → GenericCardRenderer-ClsyrKvF.js} +1 -1
  33. package/src/assets/web-panel/assets/{Git-CwsR46lj.js → Git-DcM2yhbL.js} +2 -2
  34. package/src/assets/web-panel/assets/{Governance-B1U-u9BN.js → Governance-BhUzM87n.js} +1 -1
  35. package/src/assets/web-panel/assets/{Inference-vPsdYTS_.js → Inference-Dq1n0Ifg.js} +1 -1
  36. package/src/assets/web-panel/assets/{KnowledgeGraph-CVDRZM5h.js → KnowledgeGraph-dmmPwEks.js} +1 -1
  37. package/src/assets/web-panel/assets/{Logs-YRslKbRL.js → Logs-CBSYrPmh.js} +2 -2
  38. package/src/assets/web-panel/assets/MarkdownRenderer-CRoDI77y.js +1 -0
  39. package/src/assets/web-panel/assets/{Marketplace-CtxYHchd.js → Marketplace-Cfw7XLck.js} +1 -1
  40. package/src/assets/web-panel/assets/{McpTools-BkfCbpAk.js → McpTools-CNrZRy4n.js} +3 -3
  41. package/src/assets/web-panel/assets/{Memory-COp-8Z20.js → Memory-BESjTxdd.js} +2 -2
  42. package/src/assets/web-panel/assets/{MobileBridge-7fX-n_xn.js → MobileBridge-Boyjo07i.js} +1 -1
  43. package/src/assets/web-panel/assets/{MobileProjects-DUyTVgId.js → MobileProjects-BmxmpTWz.js} +1 -1
  44. package/src/assets/web-panel/assets/{Mtc-CLXFZ5dV.js → Mtc-CBkrD0Fq.js} +5 -5
  45. package/src/assets/web-panel/assets/{MtcAudit-yJ4eP1wB.js → MtcAudit-BA7cAK8h.js} +5 -5
  46. package/src/assets/web-panel/assets/{Multisig-Cwb_qTh0.js → Multisig-m0RGzkKO.js} +3 -3
  47. package/src/assets/web-panel/assets/{NLProgramming-CkuojSSJ.js → NLProgramming-D_TgzifU.js} +1 -1
  48. package/src/assets/web-panel/assets/{Notes-ju-QtUhJ.js → Notes-Dr-Yr9LL.js} +3 -3
  49. package/src/assets/web-panel/assets/{NotificationSettings-DjryXIC3.js → NotificationSettings-DGanpkqO.js} +1 -1
  50. package/src/assets/web-panel/assets/{OrderTableRenderer-B4KNF8xr.js → OrderTableRenderer-D1FX50QY.js} +1 -1
  51. package/src/assets/web-panel/assets/{Organization-6-EtcVaO.js → Organization-DRbPg-gs.js} +2 -2
  52. package/src/assets/web-panel/assets/{Overflow-BKja8nqr.js → Overflow-flEO37z6.js} +1 -1
  53. package/src/assets/web-panel/assets/{P2P-BX20f9uL.js → P2P-DqfqFbCW.js} +2 -2
  54. package/src/assets/web-panel/assets/{PdhVaultBrowser-C9zwOEUo.js → PdhVaultBrowser-Cmi5a5dW.js} +3 -3
  55. package/src/assets/web-panel/assets/{Permissions-YQjQVrfE.js → Permissions-DBVRlvBW.js} +4 -4
  56. package/src/assets/web-panel/assets/{PersonalDataHub-yZYclXxq.js → PersonalDataHub-gQqjPr9X.js} +4 -4
  57. package/src/assets/web-panel/assets/{Pipeline-ChZCCXAI.js → Pipeline-6HlifUc9.js} +1 -1
  58. package/src/assets/web-panel/assets/{Privacy-Ds7R-a0H.js → Privacy-bm_2-Zwg.js} +1 -1
  59. package/src/assets/web-panel/assets/{ProjectInit-B3qz_xab.js → ProjectInit-BJW3isuq.js} +2 -2
  60. package/src/assets/web-panel/assets/{ProjectSettings-BlwNctdF.js → ProjectSettings-DD3yolz7.js} +2 -2
  61. package/src/assets/web-panel/assets/{Projects-BxtYpNl7.js → Projects-BF3GtWny.js} +1 -1
  62. package/src/assets/web-panel/assets/{Providers-BE_1SS_-.js → Providers-CQA6WAK7.js} +1 -1
  63. package/src/assets/web-panel/assets/{QrScannerModal-CMQ25oLb.js → QrScannerModal-DOAwp5Xo.js} +1 -1
  64. package/src/assets/web-panel/assets/{QuickAsk-DQRFLDeP.js → QuickAsk-qeFXsAZT.js} +1 -1
  65. package/src/assets/web-panel/assets/{Recommend-ChVra4Pk.js → Recommend-zDWXwZN8.js} +1 -1
  66. package/src/assets/web-panel/assets/{RemoteSession-9vPBIowJ.js → RemoteSession-toe6Ip06.js} +3 -3
  67. package/src/assets/web-panel/assets/{Reputation-MdbWbyQQ.js → Reputation-DRDi_Eqp.js} +1 -1
  68. package/src/assets/web-panel/assets/{Row-JLcBncLR.js → Row-Do2UbYkf.js} +1 -1
  69. package/src/assets/web-panel/assets/{RssFeed-CnMXnpFv.js → RssFeed-B57C6_Sa.js} +3 -3
  70. package/src/assets/web-panel/assets/{Search-Cf5ISVUe.js → Search-DfDyBpe9.js} +1 -1
  71. package/src/assets/web-panel/assets/{Security-CywFo2EM.js → Security-CulNxeAM.js} +3 -3
  72. package/src/assets/web-panel/assets/{Services-CLYnSCG3.js → Services-COfAYvs4.js} +2 -2
  73. package/src/assets/web-panel/assets/{Skeleton-BtbhOlo1.js → Skeleton-0fn0T146.js} +1 -1
  74. package/src/assets/web-panel/assets/{Skills-DPeqcIo2.js → Skills-pPQgAhvJ.js} +1 -1
  75. package/src/assets/web-panel/assets/{Sla-BRb4SqDn.js → Sla-CIsRmePR.js} +1 -1
  76. package/src/assets/web-panel/assets/{SpeechSettings-0Wuxts-7.js → SpeechSettings-Bn01d-8b.js} +1 -1
  77. package/src/assets/web-panel/assets/{SyncSettings-BXtsOjXL.js → SyncSettings-Cx_Znk7L.js} +2 -2
  78. package/src/assets/web-panel/assets/{Tasks-D455Wfhx.js → Tasks-DvaskzpG.js} +1 -1
  79. package/src/assets/web-panel/assets/{Templates-LGc4O0fj.js → Templates-DmHCEiDO.js} +1 -1
  80. package/src/assets/web-panel/assets/{Tenant-DA--0GFz.js → Tenant-CqHyvnbW.js} +1 -1
  81. package/src/assets/web-panel/assets/{Terminal-DQsA0xCq.js → Terminal-DTt3yqWL.js} +2 -2
  82. package/src/assets/web-panel/assets/{TimelineRenderer-VH8AuSLp.js → TimelineRenderer-BhkIxcR3.js} +1 -1
  83. package/src/assets/web-panel/assets/{Tokens-B8RyzFRN.js → Tokens-mhjYcBBP.js} +1 -1
  84. package/src/assets/web-panel/assets/{Trigger-CA7lVVEf.js → Trigger-CdlMQfwX.js} +1 -1
  85. package/src/assets/web-panel/assets/{Trust-wUoRRLg9.js → Trust-Bzovg_Gw.js} +1 -1
  86. package/src/assets/web-panel/assets/{UkeySign-ByoT_alW.js → UkeySign-ph3EuYi7.js} +1 -1
  87. package/src/assets/web-panel/assets/{VideoEditing-D9fgAxJV.js → VideoEditing-Bo2B4VZE.js} +1 -1
  88. package/src/assets/web-panel/assets/{Wallet-CRkTndvj.js → Wallet-BQTKsSUT.js} +2 -2
  89. package/src/assets/web-panel/assets/{WebAuthn-VwmHOxJK.js → WebAuthn-nJxsXNHV.js} +5 -5
  90. package/src/assets/web-panel/assets/{WorkflowEditor-Z0bPZc2O.js → WorkflowEditor-CjH8g2N7.js} +1 -1
  91. package/src/assets/web-panel/assets/{chat-CfX_5qUm.js → chat-CkbNmnQD.js} +1 -1
  92. package/src/assets/web-panel/assets/{colors-BK7mXUnR.js → colors-BY9JcObR.js} +1 -1
  93. package/src/assets/web-panel/assets/{compact-item-Uq755CeO.js → compact-item-Dzzq-d8n.js} +1 -1
  94. package/src/assets/web-panel/assets/{createContext-DWXq8Qnk.js → createContext-DiJxxdTx.js} +1 -1
  95. package/src/assets/web-panel/assets/devWarning-D502_Z3w.js +1 -0
  96. package/src/assets/web-panel/assets/{hasIn-BXgy5JZA.js → hasIn-DaXPOw3D.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-_I4nSJFc.js → index-6Z6Z4UwN.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-D4yvdQCj.js → index-7YVCjSqG.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-D63nsr0a.js → index-B31oMRmK.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-DdwC1i3O.js → index-B4Sf1AMk.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-CRLOeoFE.js → index-BGvIb1Sr.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-JX7mXB5a.js → index-BHeHyLRM.js} +3 -3
  103. package/src/assets/web-panel/assets/{index-Ct41B4y4.js → index-BQvtlYUd.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-VrR8eMCk.js → index-Bhsxh-rH.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-C8e4SYX4.js → index-BlWg1bRA.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-C3VnhfYU.js → index-BqCHe05H.js} +1 -1
  107. package/src/assets/web-panel/assets/index-BrQ4nI4W.js +1 -0
  108. package/src/assets/web-panel/assets/{index-DSb7SKp5.js → index-BvgMt6Io.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-Y77S-ZC0.js → index-BycyBM6g.js} +1 -1
  110. package/src/assets/web-panel/assets/index-C0_sewGO.js +1 -0
  111. package/src/assets/web-panel/assets/{index-CGy7b2rd.js → index-C6XSCXeb.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-XdoslBhl.js → index-CAzfu6k5.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-B09haI0M.js → index-CVblRqUN.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-Bt3tjvj-.js → index-CWLpEg34.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-wYTro42F.js → index-C_OMH_FT.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-H13lvPme.js → index-CbOOm8I8.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-TDPkVyse.js → index-CnLO1_yN.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-DuhlVXh4.js → index-CqOkm6kW.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-CfYb8FjC.js → index-DDnqjZa2.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-VPLA-GO7.js → index-DObXhPhH.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-CarQiRSA.js → index-DSqQyS9-.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-Ait-_UUh.js → index-DWT9-E5b.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-D-8lN1rG.js → index-D_Eoh740.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-DiVH_NiY.js → index-DaylJfw6.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-DbjUfyVq.js → index-DbmHmeP-.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-LsBPnXHh.js → index-Djeh6rAb.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-Dg9P9EDV.js → index-Dl8U-0hn.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-BRQSkXde.js → index-EiaWq1TH.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-BZD1My0S.js → index-Igq-72Ep.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-QXKuGlOS.js → index-Jmlk_lDX.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-p3BlIre2.js → index-LRZSVBxC.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-CUR7dnMg.js → index-Uh9SjtgW.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-CqJw5WsH.js → index-cu1J4avY.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-9XsaovMH.js → index-dC2JACyJ.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-BxSClhg5.js → index-i9eu2Kir.js} +1 -1
  136. package/src/assets/web-panel/assets/{initDefaultProps-DTuF67Yy.js → initDefaultProps-B0WuG3fa.js} +1 -1
  137. package/src/assets/web-panel/assets/{motion-DZasLgsl.js → motion-1r5YB22w.js} +1 -1
  138. package/src/assets/web-panel/assets/{move-pPR4O1Du.js → move-CvtXWA_V.js} +1 -1
  139. package/src/assets/web-panel/assets/{mtc-parser-Dc7fidhm.js → mtc-parser-ChedmEE_.js} +1 -1
  140. package/src/assets/web-panel/assets/{omit-CZ1IcubN.js → omit-DpEA3MP0.js} +1 -1
  141. package/src/assets/web-panel/assets/{pickAttrs-BMtJilhr.js → pickAttrs-BWgrUZF6.js} +1 -1
  142. package/src/assets/web-panel/assets/{placementArrow-D0EXaZA7.js → placementArrow-BWfo_VbI.js} +1 -1
  143. package/src/assets/web-panel/assets/{responsiveObserve-HftdThc5.js → responsiveObserve-CRft03Vk.js} +1 -1
  144. package/src/assets/web-panel/assets/{slide-CT1JEPWV.js → slide-l5LeXusH.js} +1 -1
  145. package/src/assets/web-panel/assets/{statusUtils-rwE-IPZB.js → statusUtils-CCEC0JR-.js} +1 -1
  146. package/src/assets/web-panel/assets/{styleChecker-B2B8XHVq.js → styleChecker-Bw5Gw_2w.js} +1 -1
  147. package/src/assets/web-panel/assets/{useFlexGapSupport-TXNvIFVa.js → useFlexGapSupport-BAuxWB7K.js} +1 -1
  148. package/src/assets/web-panel/assets/{useFs-BcWgJKvf.js → useFs-CxUP97Cw.js} +1 -1
  149. package/src/assets/web-panel/assets/{usePersonalDataHub-DWBDnOSR.js → usePersonalDataHub-BJDjT4Sy.js} +1 -1
  150. package/src/assets/web-panel/assets/{vnode-Cf_LjUuu.js → vnode-BcCsFzIs.js} +1 -1
  151. package/src/assets/web-panel/assets/{zoom-DM2Bfuyl.js → zoom-MLmG09h6.js} +1 -1
  152. package/src/assets/web-panel/index.html +1 -1
  153. package/src/commands/eval.js +79 -3
  154. package/src/commands/llm.js +40 -5
  155. package/src/data/changelog.json +13 -0
  156. package/src/lib/context-memory-kernel/message-adapter.js +41 -24
  157. package/src/lib/context-memory-kernel/segmented-memory-port.js +18 -0
  158. package/src/lib/eval/runner.js +22 -1
  159. package/src/lib/eval/verify01-contracts.js +106 -51
  160. package/src/lib/eval/verify01-execution.js +148 -166
  161. package/src/lib/eval/verify01-host-evidence.js +34 -2
  162. package/src/lib/eval/verify01-workspace.js +302 -0
  163. package/src/lib/execution-location-failure-site.js +18 -0
  164. package/src/lib/execution-location-target.js +10 -0
  165. package/src/lib/llm-connection-probe.js +147 -6
  166. package/src/lib/provider-http-error.js +30 -11
  167. package/src/lib/task-progress-tracker.js +1 -0
  168. package/src/runtime/agent-core.js +22 -0
  169. package/src/runtime/headless-runner.js +30 -20
  170. package/src/runtime/headless-stream.js +15 -10
  171. package/src/assets/web-panel/assets/ChatBubbleRenderer-DgMYDmBW.js +0 -1
  172. package/src/assets/web-panel/assets/MarkdownRenderer-CUBuc97a.js +0 -1
  173. package/src/assets/web-panel/assets/devWarning-CbtBfs7a.js +0 -1
  174. package/src/assets/web-panel/assets/index-CicoHC0s.js +0 -1
  175. package/src/assets/web-panel/assets/index-DttyUwDx.js +0 -1
@@ -1,5 +1,16 @@
1
+ import {
2
+ MAX_SNAPSHOT_BYTES,
3
+ canonicalDirectory,
4
+ within,
5
+ regularPath,
6
+ seedVerify01Deliverables,
7
+ snapshotVerify01Workspace as snapshot,
8
+ diffVerify01Workspace as diff,
9
+ } from "./verify01-workspace.js";
10
+ export { seedVerify01Deliverables } from "./verify01-workspace.js";
1
11
  import fs from "node:fs";
2
12
  import path from "node:path";
13
+ import os from "node:os";
3
14
  import { createHash } from "node:crypto";
4
15
  import executionBroker from "../process-execution-broker/index.js";
5
16
  import { evalDigest, createEvalComparison } from "./evidence.js";
@@ -16,8 +27,79 @@ export const VERIFY01_SUITES = [
16
27
  "verify01-plan-2026-10-04",
17
28
  "verify01-project-36",
18
29
  ];
19
- const MAX_SNAPSHOT_BYTES = 512 * 1024 * 1024;
20
- const MAX_DIFF_BYTES = 32 * 1024 * 1024;
30
+ const agentBindings = new WeakSet();
31
+ const EMPTY_DELIVERABLE_DIGEST = evalDigest(Buffer.alloc(0));
32
+
33
+ function createAgentBinding(directory, allowedPaths, provider, model) {
34
+ const workspace = canonicalDirectory(directory);
35
+ for (const relative of allowedPaths) {
36
+ const file = regularPath(workspace, relative);
37
+ requireValue(
38
+ fs.statSync(file).nlink === 1,
39
+ "allowed task files must not have hard-link aliases",
40
+ );
41
+ }
42
+ const temporaryRoot = (fs.realpathSync.native || fs.realpathSync)(
43
+ os.tmpdir(),
44
+ );
45
+ const root = fs.mkdtempSync(path.join(temporaryRoot, "cc-verify01-agent-"));
46
+ const userHome = path.join(root, "user-home");
47
+ const configHome = path.join(root, "chainlesschain-home");
48
+ for (const dir of [userHome, configHome]) fs.mkdirSync(dir, { mode: 0o700 });
49
+ const environment = Object.freeze({
50
+ // Keep downstream temp-root containment checks on the same canonical root.
51
+ TMPDIR: temporaryRoot,
52
+ TEMP: temporaryRoot,
53
+ TMP: temporaryRoot,
54
+ HOME: userHome,
55
+ USERPROFILE: userHome,
56
+ APPDATA: path.join(userHome, "app-data"),
57
+ LOCALAPPDATA: path.join(userHome, "local-app-data"),
58
+ XDG_CONFIG_HOME: path.join(userHome, "xdg-config"),
59
+ XDG_CACHE_HOME: path.join(userHome, "xdg-cache"),
60
+ XDG_DATA_HOME: path.join(userHome, "xdg-data"),
61
+ CHAINLESSCHAIN_HOME: configHome,
62
+ CC_FORMAL_QUALITY_EVAL_HERMETIC: "1",
63
+ CC_FORMAL_QUALITY_EVAL_PROVIDER: provider,
64
+ CC_FORMAL_QUALITY_EVAL_ISOLATION_ROOT: root,
65
+ CC_FORMAL_QUALITY_EVAL_ALLOWED_FILES: JSON.stringify(allowedPaths),
66
+ ...(process.platform === "win32"
67
+ ? { HOMEDRIVE: userHome.slice(0, 2), HOMEPATH: userHome.slice(2) }
68
+ : {}),
69
+ });
70
+ const binding = Object.freeze({
71
+ workspace,
72
+ root,
73
+ provider,
74
+ model,
75
+ allowedPaths: Object.freeze([...allowedPaths]),
76
+ environment,
77
+ });
78
+ agentBindings.add(binding);
79
+ return binding;
80
+ }
81
+
82
+ /** Only suite-created immutable authority can narrow a formal child. The
83
+ * prompt, generic task metadata and inherited environment cannot mint it. */
84
+ export function captureVerify01AgentBinding(binding, directory) {
85
+ requireValue(
86
+ agentBindings.has(binding),
87
+ "unrecognized VERIFY01 agent binding",
88
+ );
89
+ requireValue(
90
+ canonicalDirectory(directory) === binding.workspace,
91
+ "VERIFY01 agent binding belongs to another workspace",
92
+ );
93
+ canonicalDirectory(binding.root);
94
+ for (const relative of binding.allowedPaths) {
95
+ const file = regularPath(binding.workspace, relative);
96
+ requireValue(
97
+ fs.statSync(file).nlink === 1,
98
+ "allowed task file acquired a hard-link alias",
99
+ );
100
+ }
101
+ return binding;
102
+ }
21
103
 
22
104
  // Host drivers use the same checkout, complete scan, dependency boundary and
23
105
  // pinned evaluator processes as the CLI executor; no second diff contract.
@@ -42,36 +124,6 @@ function git(directory, args, options = {}) {
42
124
  });
43
125
  }
44
126
 
45
- function within(root, file) {
46
- const relative = path.relative(root, file);
47
- requireValue(
48
- relative &&
49
- relative !== ".." &&
50
- !relative.startsWith(`..${path.sep}`) &&
51
- !path.isAbsolute(relative),
52
- "path escapes its declared root",
53
- );
54
- }
55
-
56
- function regularPath(root, relative) {
57
- relativeFile(relative);
58
- const file = path.join(root, relative);
59
- within(root, file);
60
- let current = root;
61
- for (const segment of relative.split("/")) {
62
- current = path.join(current, segment);
63
- requireValue(
64
- !fs.lstatSync(current).isSymbolicLink(),
65
- "review/project paths must not traverse links",
66
- );
67
- }
68
- requireValue(
69
- fs.lstatSync(file).isFile(),
70
- "review/project artifact must be a regular file",
71
- );
72
- return file;
73
- }
74
-
75
127
  /** Copy only committed blobs, checking their actual Git object identities.
76
128
  * Untracked credentials, .git metadata, and development dependency junctions
77
129
  * are never part of the evaluation checkout. Setup owns dependency preparation.
@@ -201,136 +253,6 @@ async function materializeCheckout(projectRoot, commit, destination, budget) {
201
253
  return { commit, files: entries.length, bytes: total };
202
254
  }
203
255
 
204
- function snapshot(directory, budget, stage) {
205
- const files = new Map();
206
- let total = 0;
207
- let dependencyBytes = 0;
208
- let dependencyFiles = 0;
209
- const dependencyHash = createHash("sha256");
210
- const buffer = Buffer.alloc(64 * 1024);
211
- const visit = (current) => {
212
- for (const entry of fs
213
- .readdirSync(current, { withFileTypes: true })
214
- .sort((a, b) => a.name.localeCompare(b.name, "en"))) {
215
- budget.remainingMs(stage);
216
- const full = path.join(current, entry.name);
217
- const relative = path.relative(directory, full).split(path.sep).join("/");
218
- if (entry.isDirectory()) visit(full);
219
- else {
220
- requireValue(
221
- entry.isFile() || entry.isSymbolicLink(),
222
- "task snapshot contains an unsupported filesystem object",
223
- );
224
- // Preserve link identities without following them into another root.
225
- const dependency = relative.split("/").includes("node_modules");
226
- if (dependency && entry.isSymbolicLink()) {
227
- // A dependency linked outside the isolated workspace cannot be
228
- // fingerprinted by this capture contract; never silently omit it.
229
- within(directory, fs.realpathSync(full));
230
- }
231
- let bytes = entry.isSymbolicLink()
232
- ? Buffer.from(fs.readlinkSync(full))
233
- : dependency
234
- ? null
235
- : readBytes(full);
236
- let digest, size;
237
- if (dependency && bytes === null) {
238
- const hash = createHash("sha256");
239
- const fd = fs.openSync(full, "r");
240
- size = 0;
241
- try {
242
- let count;
243
- while (
244
- (count = fs.readSync(fd, buffer, 0, buffer.length, null)) > 0
245
- ) {
246
- budget.remainingMs(stage);
247
- size += count;
248
- requireValue(
249
- dependencyBytes + size <= 16 * 1024 ** 3,
250
- "dependency fingerprint exceeds 16 GiB",
251
- );
252
- hash.update(buffer.subarray(0, count));
253
- }
254
- } finally {
255
- fs.closeSync(fd);
256
- }
257
- digest = `sha256:${hash.digest("hex")}`;
258
- } else {
259
- size = bytes.length;
260
- digest = evalDigest(bytes);
261
- }
262
- if (dependency) {
263
- dependencyBytes += size;
264
- dependencyFiles++;
265
- bytes = null;
266
- } else total += size;
267
- requireValue(
268
- total <= MAX_SNAPSHOT_BYTES &&
269
- files.size - dependencyFiles < 100000 &&
270
- dependencyFiles <= 1000000,
271
- "task snapshot exceeds its capture bound",
272
- );
273
- const value = {
274
- type: entry.isSymbolicLink() ? "link" : "file",
275
- mode: fs.lstatSync(full).mode & 0o777,
276
- bytes,
277
- size,
278
- digest,
279
- dependency,
280
- };
281
- files.set(relative, value);
282
- if (dependency)
283
- dependencyHash.update(
284
- JSON.stringify([relative, value.type, value.mode, size, digest]) +
285
- "\n",
286
- );
287
- }
288
- }
289
- };
290
- visit(directory);
291
- files.dependencyBoundary = {
292
- contract:
293
- "all node_modules files and link identities streamed with SHA-256; links never followed; dependency bodies omitted; every change rejected",
294
- files: dependencyFiles,
295
- bytes: dependencyBytes,
296
- digest: `sha256:${dependencyHash.digest("hex")}`,
297
- };
298
- return files;
299
- }
300
-
301
- function diff(before, after) {
302
- const result = [];
303
- let total = 0;
304
- for (const file of [...new Set([...before.keys(), ...after.keys()])].sort()) {
305
- const old = before.get(file),
306
- next = after.get(file);
307
- if (
308
- old?.digest === next?.digest &&
309
- old?.type === next?.type &&
310
- old?.mode === next?.mode
311
- )
312
- continue;
313
- total += (old?.bytes?.length || 0) + (next?.bytes?.length || 0);
314
- requireValue(
315
- total <= MAX_DIFF_BYTES,
316
- "task diff exceeds 32 MiB; preserve workspace for independent inspection",
317
- );
318
- const describe = (value) =>
319
- value
320
- ? {
321
- type: value.type,
322
- mode: value.mode,
323
- digest: value.digest,
324
- bytes: value.size,
325
- dependency: value.dependency,
326
- bytesBase64: value.bytes?.toString("base64") ?? null,
327
- }
328
- : null;
329
- result.push({ path: file, before: describe(old), after: describe(next) });
330
- }
331
- return result;
332
- }
333
-
334
256
  function reviewedProcess(bytes, directory, reviewRoot, kind, timeout) {
335
257
  // Execute the captured bytes, not a path that task code could replace between
336
258
  // digest verification and process startup. Evaluators are explicitly trusted
@@ -350,6 +272,21 @@ function reviewedProcess(bytes, directory, reviewRoot, kind, timeout) {
350
272
  timeout,
351
273
  maxBuffer: 8 * 1024 * 1024,
352
274
  windowsHide: true,
275
+ // Operator checks never receive model/account credentials, NODE_OPTIONS
276
+ // or ambient provider configuration. Docker may still need its context.
277
+ env: Object.fromEntries(
278
+ [
279
+ "PATH",
280
+ "SystemRoot",
281
+ "WINDIR",
282
+ "TEMP",
283
+ "TMP",
284
+ "DOCKER_HOST",
285
+ "DOCKER_CONTEXT",
286
+ ]
287
+ .filter((key) => process.env[key])
288
+ .map((key) => [key, process.env[key]]),
289
+ ),
353
290
  origin: `eval:verify01-${kind}`,
354
291
  policy: "allow",
355
292
  scope: "eval",
@@ -454,7 +391,7 @@ export function loadVerify01Suite(options = {}) {
454
391
  const tasks = samples.map((sample) => {
455
392
  const task = validated.tasks.get(sample.taskId),
456
393
  reviewed = validated.reviewed.get(sample.taskId);
457
- let baseline, after;
394
+ let baseline, after, agentBinding;
458
395
  const receipt = {
459
396
  sampleId: sample.id,
460
397
  taskId: task.id,
@@ -469,6 +406,9 @@ export function loadVerify01Suite(options = {}) {
469
406
  check: null,
470
407
  diff: null,
471
408
  execution: null,
409
+ deliverablePreparation: [],
410
+ agentDiff: null,
411
+ agentBinding: null,
472
412
  };
473
413
  receipts.push(receipt);
474
414
  return {
@@ -500,6 +440,38 @@ export function loadVerify01Suite(options = {}) {
500
440
  !receipt.setup.error,
501
441
  "reviewed setup failed",
502
442
  );
443
+ receipt.deliverablePreparation = seedVerify01Deliverables(
444
+ directory,
445
+ task.expectedFiles,
446
+ budget,
447
+ );
448
+ agentBinding = createAgentBinding(
449
+ directory,
450
+ reviewed.allowedChangedPaths,
451
+ options.provider,
452
+ options.model,
453
+ );
454
+ receipt.agentBinding = {
455
+ workspace: agentBinding.workspace,
456
+ isolationRoot: agentBinding.root,
457
+ userHome: agentBinding.environment.HOME,
458
+ configHome: agentBinding.environment.CHAINLESSCHAIN_HOME,
459
+ allowedChangedPaths: agentBinding.allowedPaths,
460
+ provider: agentBinding.provider,
461
+ model: agentBinding.model,
462
+ productionAttested: false,
463
+ };
464
+ },
465
+ agentLaunchBinding(directory) {
466
+ return captureVerify01AgentBinding(agentBinding, directory);
467
+ },
468
+ cleanup() {
469
+ if (!agentBinding) return;
470
+ canonicalDirectory(agentBinding.root);
471
+ fs.rmSync(agentBinding.root, { recursive: true, force: true });
472
+ agentBindings.delete(agentBinding);
473
+ receipt.agentBinding.profileRemoved = true;
474
+ agentBinding = null;
503
475
  },
504
476
  snapshotWorkspace(directory, budget, stage) {
505
477
  const captured = snapshot(directory, budget, stage);
@@ -530,7 +502,13 @@ export function loadVerify01Suite(options = {}) {
530
502
  };
531
503
  },
532
504
  check(directory, agentResult, budget) {
533
- receipt.diff = diff(baseline, after);
505
+ receipt.agentDiff = diff(baseline, after);
506
+ // The agent baseline contains empty seeds. Preserve that view, while
507
+ // the task-origin diff still describes absent -> candidate additions.
508
+ const originalBaseline = new Map(baseline);
509
+ for (const seed of receipt.deliverablePreparation)
510
+ originalBaseline.delete(seed.path);
511
+ receipt.diff = diff(originalBaseline, after);
534
512
  baseline = null;
535
513
  requireValue(
536
514
  receipt.diff.every(
@@ -543,8 +521,12 @@ export function loadVerify01Suite(options = {}) {
543
521
  "task modified a path outside independent review or introduced a deliverable link",
544
522
  );
545
523
  requireValue(
546
- task.expectedFiles.every((file) => after.get(file)?.type === "file"),
547
- "task did not produce all expected regular-file deliverables",
524
+ task.expectedFiles.every(
525
+ (file) =>
526
+ after.get(file)?.type === "file" &&
527
+ after.get(file)?.digest !== EMPTY_DELIVERABLE_DIGEST,
528
+ ),
529
+ "task did not replace all empty seeds with regular-file deliverables",
548
530
  );
549
531
  after = null;
550
532
  receipt.check = reviewedProcess(
@@ -5,11 +5,13 @@ import {
5
5
  } from "./evidence.js";
6
6
  import { outcomeDigest } from "./outcomes.js";
7
7
  import { verifyAgentTerminal } from "./stream-terminal.js";
8
+ import { LLM_PROBE_SCHEMA } from "../llm-connection-probe.js";
8
9
  import {
9
10
  relativeFile,
10
11
  requireValue,
11
12
  validateVerify01Review,
12
13
  validateVerify01Collection,
14
+ createVerify01FirstRunCost,
13
15
  } from "./verify01-contracts.js";
14
16
 
15
17
  const HOST_SCHEMA = "chainlesschain.verify01-host-capture/v1";
@@ -385,6 +387,7 @@ export function importVerify01HostCapture(
385
387
  failureCause: manifest.failureCause ?? "unknown",
386
388
  };
387
389
  const receiptDigests = [];
390
+ let authentication = null;
388
391
  if (sample.kind === "first-run") {
389
392
  requireValue(
390
393
  typeof manifest.firstRun?.cleanEnvironment === "boolean",
@@ -412,6 +415,15 @@ export function importVerify01HostCapture(
412
415
  receipt: entry.receipt.digest,
413
416
  };
414
417
  receiptDigests.push(entry.receipt.digest);
418
+ if (stage === "authenticate") {
419
+ let receipt;
420
+ try {
421
+ receipt = JSON.parse(bytes.toString("utf8"));
422
+ } catch {
423
+ /* Legacy receipts cannot establish authentication cost. */
424
+ }
425
+ if (receipt?.schema === LLM_PROBE_SCHEMA) authentication = receipt;
426
+ }
415
427
  stopped ||= !entry.passed;
416
428
  }
417
429
  }
@@ -435,7 +447,18 @@ export function importVerify01HostCapture(
435
447
  (Number.isFinite(manifest.cost) && manifest.cost >= 0),
436
448
  "invalid early-stop cost declaration",
437
449
  );
438
- observation.cost = manifest.cost;
450
+ observation.firstRun.costAccounting = createVerify01FirstRunCost({
451
+ authentication,
452
+ authenticationReceipt: observation.firstRun.stages.authenticate.receipt,
453
+ authenticated: observation.firstRun.stages.authenticate.passed,
454
+ comparison,
455
+ toolCostUsd: null,
456
+ });
457
+ observation.cost = observation.firstRun.costAccounting.totalCostUsd;
458
+ requireValue(
459
+ manifest.cost === null || manifest.cost === observation.cost,
460
+ "early-stop cost differs from authentication accounting",
461
+ );
439
462
  } else {
440
463
  requireValue(
441
464
  typeof manifest.runId === "string" && manifest.runId.trim().length > 0,
@@ -611,7 +634,16 @@ export function importVerify01HostCapture(
611
634
  },
612
635
  );
613
636
  observation.runId = run.runId;
614
- observation.cost = protocol.totalCostUsd;
637
+ if (sample.kind === "first-run") {
638
+ observation.firstRun.costAccounting = createVerify01FirstRunCost({
639
+ authentication,
640
+ authenticationReceipt: observation.firstRun.stages.authenticate.receipt,
641
+ authenticated: observation.firstRun.stages.authenticate.passed,
642
+ comparison,
643
+ toolCostUsd: protocol.totalCostUsd,
644
+ });
645
+ observation.cost = observation.firstRun.costAccounting.totalCostUsd;
646
+ } else observation.cost = protocol.totalCostUsd;
615
647
  }
616
648
  const history = { runs: run ? [run] : [], issues: [] };
617
649
  const observations = [observation];