chainlesschain 0.166.96 → 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.
- package/README.md +27 -18
- package/package.json +3 -3
- package/src/assets/linux-subreaper/linux-arm64/manifest.json +1 -1
- package/src/assets/linux-subreaper/linux-x64/manifest.json +1 -1
- package/src/assets/web-panel/assets/{AIOps-TNYT0Ehu.js → AIOps-DCIQFtF1.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-GAU5WRiJ.js → ActionButton-BxhHU3nE.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-CGBIObIC.js → Analytics-DdM_307O.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-oOSmcEm1.js → AppLayout-C43-kSrh.js} +4 -4
- package/src/assets/web-panel/assets/{Artifacts-CmEZTNjU.js → Artifacts-B2Vp2Am6.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-Dbt3E2nA.js → Audit-s-lYUfOp.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-D_BZmYk4.js → BackgroundAgents-DTE7Kzio.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-DgDOxdZF.js → Backup-9k1q4Mt6.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-Bo2pg8D_.js → BaseInput-DlpUtK5R.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-BF6Lb0W_.js → Chat-CR9S8Rmb.js} +5 -5
- package/src/assets/web-panel/assets/ChatBubbleRenderer-Xtgfw3-c.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-ZJM64PMU.js → Checkbox-DpFRu7Df.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-CCauMpRn.js → Codegen-BIl72E4Y.js} +1 -1
- package/src/assets/web-panel/assets/{Col-CA_MU4xw.js → Col-91tl_err.js} +1 -1
- package/src/assets/web-panel/assets/{Community-B5VQptTJ.js → Community-CswahO9-.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-C7Ehqru2.js → Compact-D9pfHmaM.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-Dyt6kfTg.js → Compliance-CXSZzAO9.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-B_yOOOHo.js → Cowork-CuT9RWTn.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-cbhAQANJ.js → Cron-B71aJWDV.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-BYC4ITZo.js → Crosschain-CcUuWyx8.js} +1 -1
- package/src/assets/web-panel/assets/{DID-Cc2Czj0c.js → DID-CtVVGOPL.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-B4VX9dth.js → Dashboard-CV7ZCYQq.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-g7e6T92p.js → Dropdown-DKHxwLgE.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-CzUK_NJA.js → EmailListRenderer-Bd03UIvv.js} +1 -1
- package/src/assets/web-panel/assets/{EvolutionSettings-ameoB_GI.js → EvolutionSettings-CTrG03B_.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-DuehDwv2.js → FamilyGuardDashboard-DXS4bS6Q.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-DuMbIjYG.js → Federation-BODG2Szj.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-CS-om7RD.js → FormItemContext-D32ccUqD.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-CuKgo9Q0.js → GenericCardRenderer-ClsyrKvF.js} +1 -1
- package/src/assets/web-panel/assets/{Git-Bp6I9kxu.js → Git-DcM2yhbL.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-C_AzSOmj.js → Governance-BhUzM87n.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-C-qkoYD5.js → Inference-Dq1n0Ifg.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-D8Q4D_EN.js → KnowledgeGraph-dmmPwEks.js} +1 -1
- package/src/assets/web-panel/assets/Logs-CBSYrPmh.js +2 -0
- package/src/assets/web-panel/assets/{MarkdownRenderer-CaGz2EYV.js → MarkdownRenderer-CRoDI77y.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-BWFjqLRM.js → Marketplace-Cfw7XLck.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-BJngUzks.js → McpTools-CNrZRy4n.js} +2 -2
- package/src/assets/web-panel/assets/{Memory-DcFAqj9b.js → Memory-BESjTxdd.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-CQjRXWWS.js → MobileBridge-Boyjo07i.js} +1 -1
- package/src/assets/web-panel/assets/MobileProjects-BmxmpTWz.js +1 -0
- package/src/assets/web-panel/assets/{Mtc-C_7mSz17.js → Mtc-CBkrD0Fq.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-DcYdxIWN.js → MtcAudit-BA7cAK8h.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-ypAr20wL.js → Multisig-m0RGzkKO.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-CJWFA8xg.js → NLProgramming-D_TgzifU.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-D1GhvZvR.js → Notes-Dr-Yr9LL.js} +4 -4
- package/src/assets/web-panel/assets/{NotificationSettings-CWOgdSHm.js → NotificationSettings-DGanpkqO.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-CE5Oqf07.js → OrderTableRenderer-D1FX50QY.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-wddxd4Ka.js → Organization-DRbPg-gs.js} +2 -2
- package/src/assets/web-panel/assets/{Overflow-Dczw5Ggs.js → Overflow-flEO37z6.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-Bmlos4fT.js → P2P-DqfqFbCW.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-DNp_WBr0.js → PdhVaultBrowser-Cmi5a5dW.js} +5 -5
- package/src/assets/web-panel/assets/{Permissions-tt7tio9B.js → Permissions-DBVRlvBW.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-C_ItcMUf.js → PersonalDataHub-gQqjPr9X.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-BS0NENVX.js → Pipeline-6HlifUc9.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-o9QNmXcZ.js → Privacy-bm_2-Zwg.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-g3r30nEt.js → ProjectInit-BJW3isuq.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-CQCKz8vR.js → ProjectSettings-DD3yolz7.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-DWH5cBmp.js → Projects-BF3GtWny.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-KGyPcaEb.js → Providers-CQA6WAK7.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-CFgEHopX.js → QrScannerModal-DOAwp5Xo.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-hLl0Nel4.js → QuickAsk-qeFXsAZT.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-BX6FCAMS.js → Recommend-zDWXwZN8.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-C5BLLEcs.js → RemoteSession-toe6Ip06.js} +3 -3
- package/src/assets/web-panel/assets/{Reputation-DVUhhjBy.js → Reputation-DRDi_Eqp.js} +1 -1
- package/src/assets/web-panel/assets/{Row-Bx3-cvc4.js → Row-Do2UbYkf.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-DA091bsm.js → RssFeed-B57C6_Sa.js} +3 -3
- package/src/assets/web-panel/assets/{Search-CJqXJFAx.js → Search-DfDyBpe9.js} +1 -1
- package/src/assets/web-panel/assets/{Security-BWZ5dHzy.js → Security-CulNxeAM.js} +3 -3
- package/src/assets/web-panel/assets/{Services-QhwMuZb3.js → Services-COfAYvs4.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-DgbULoTC.js → Skeleton-0fn0T146.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-cl7ldo6F.js → Skills-pPQgAhvJ.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-Cek1zXct.js → Sla-CIsRmePR.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-D6iXwMpA.js → SpeechSettings-Bn01d-8b.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-bC93x91L.js → SyncSettings-Cx_Znk7L.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-CcZOqgkI.js → Tasks-DvaskzpG.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-BTq2AoyQ.js → Templates-DmHCEiDO.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-D7qU02Di.js → Tenant-CqHyvnbW.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-YZpeH0oN.js → Terminal-DTt3yqWL.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-DDg43Omm.js → TimelineRenderer-BhkIxcR3.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-D-RO6fo4.js → Tokens-mhjYcBBP.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-TEnd7fo4.js → Trigger-CdlMQfwX.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-DVnK8TWT.js → Trust-Bzovg_Gw.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-B8FmpNyk.js → UkeySign-ph3EuYi7.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-DxIs_fZY.js → VideoEditing-Bo2B4VZE.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-BOyELv3w.js → Wallet-BQTKsSUT.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-CIHCpt3j.js → WebAuthn-nJxsXNHV.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-Bz7cskus.js → WorkflowEditor-CjH8g2N7.js} +1 -1
- package/src/assets/web-panel/assets/{chat-Dv8SddNl.js → chat-CkbNmnQD.js} +1 -1
- package/src/assets/web-panel/assets/{colors-BEV5nkv4.js → colors-BY9JcObR.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-9vwfkqFB.js → compact-item-Dzzq-d8n.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-ent1l9xX.js → createContext-DiJxxdTx.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-D502_Z3w.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-Q8eEU5e7.js → hasIn-DaXPOw3D.js} +1 -1
- package/src/assets/web-panel/assets/{index-DLQRUzgc.js → index-6Z6Z4UwN.js} +1 -1
- package/src/assets/web-panel/assets/{index-CdQo1l-5.js → index-7YVCjSqG.js} +1 -1
- package/src/assets/web-panel/assets/{index-ByAsMed4.js → index-B31oMRmK.js} +1 -1
- package/src/assets/web-panel/assets/{index-CArObCCc.js → index-B4Sf1AMk.js} +1 -1
- package/src/assets/web-panel/assets/{index-DBdMxZA0.js → index-BGvIb1Sr.js} +1 -1
- package/src/assets/web-panel/assets/{index-hfXZTN5I.js → index-BHeHyLRM.js} +3 -3
- package/src/assets/web-panel/assets/{index-CusIdZ6c.js → index-BQvtlYUd.js} +1 -1
- package/src/assets/web-panel/assets/{index-CfqytzM2.js → index-Bhsxh-rH.js} +1 -1
- package/src/assets/web-panel/assets/{index-IjNq0ymK.js → index-BlWg1bRA.js} +1 -1
- package/src/assets/web-panel/assets/{index-DtCVUwNB.js → index-BqCHe05H.js} +1 -1
- package/src/assets/web-panel/assets/index-BrQ4nI4W.js +1 -0
- package/src/assets/web-panel/assets/{index-DjhTxtXx.js → index-BvgMt6Io.js} +1 -1
- package/src/assets/web-panel/assets/{index-wlQxhwWL.js → index-BycyBM6g.js} +1 -1
- package/src/assets/web-panel/assets/index-C0_sewGO.js +1 -0
- package/src/assets/web-panel/assets/{index-ClayrGw1.js → index-C6XSCXeb.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bbxhm1Ul.js → index-CAzfu6k5.js} +1 -1
- package/src/assets/web-panel/assets/{index-BBTcn6Fs.js → index-CVblRqUN.js} +1 -1
- package/src/assets/web-panel/assets/{index-BUxM7YPq.js → index-CWLpEg34.js} +1 -1
- package/src/assets/web-panel/assets/{index-Defz9gay.js → index-C_OMH_FT.js} +1 -1
- package/src/assets/web-panel/assets/{index-BCfGsk6N.js → index-CbOOm8I8.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dx-mnFrM.js → index-CnLO1_yN.js} +1 -1
- package/src/assets/web-panel/assets/{index-CxvqZN65.js → index-CqOkm6kW.js} +1 -1
- package/src/assets/web-panel/assets/{index-JdyMJF72.js → index-DDnqjZa2.js} +1 -1
- package/src/assets/web-panel/assets/{index-6eOIwKrl.js → index-DObXhPhH.js} +1 -1
- package/src/assets/web-panel/assets/{index-De1Gm9FM.js → index-DSqQyS9-.js} +1 -1
- package/src/assets/web-panel/assets/{index-ChNGj01l.js → index-DWT9-E5b.js} +1 -1
- package/src/assets/web-panel/assets/{index-FySnx-ic.js → index-D_Eoh740.js} +1 -1
- package/src/assets/web-panel/assets/{index-D6oYsDxS.js → index-DaylJfw6.js} +1 -1
- package/src/assets/web-panel/assets/{index-D1zf7Wim.js → index-DbmHmeP-.js} +1 -1
- package/src/assets/web-panel/assets/{index-DeXt9bwV.js → index-Djeh6rAb.js} +1 -1
- package/src/assets/web-panel/assets/{index-XSnRyYOQ.js → index-Dl8U-0hn.js} +1 -1
- package/src/assets/web-panel/assets/{index-B7Gu0QHO.js → index-EiaWq1TH.js} +1 -1
- package/src/assets/web-panel/assets/{index-bys1L9Zm.js → index-Igq-72Ep.js} +1 -1
- package/src/assets/web-panel/assets/{index-CAdPA5MQ.js → index-Jmlk_lDX.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cn3XO8jc.js → index-LRZSVBxC.js} +1 -1
- package/src/assets/web-panel/assets/{index-Zj25PNra.js → index-Uh9SjtgW.js} +1 -1
- package/src/assets/web-panel/assets/{index-BSa4k_WD.js → index-cu1J4avY.js} +1 -1
- package/src/assets/web-panel/assets/{index-qM_auh7p.js → index-dC2JACyJ.js} +1 -1
- package/src/assets/web-panel/assets/{index--G-igD6F.js → index-i9eu2Kir.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-e8NWdeA7.js → initDefaultProps-B0WuG3fa.js} +1 -1
- package/src/assets/web-panel/assets/{motion-Dqj2qiL6.js → motion-1r5YB22w.js} +1 -1
- package/src/assets/web-panel/assets/{move-ucHeQCeV.js → move-CvtXWA_V.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-OY2ylE6m.js → mtc-parser-ChedmEE_.js} +1 -1
- package/src/assets/web-panel/assets/{omit-M4uSoAew.js → omit-DpEA3MP0.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-D2R8ck78.js → pickAttrs-BWgrUZF6.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-CkAkyODp.js → placementArrow-BWfo_VbI.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-D5Z1gXYW.js → responsiveObserve-CRft03Vk.js} +1 -1
- package/src/assets/web-panel/assets/{slide-DCLsPpEU.js → slide-l5LeXusH.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-COLrD1tR.js → statusUtils-CCEC0JR-.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-CyViVm6O.js → styleChecker-Bw5Gw_2w.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-qUsgJGGb.js → useFlexGapSupport-BAuxWB7K.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-BNGZrXAO.js → useFs-CxUP97Cw.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-CI8d0Z8T.js → usePersonalDataHub-BJDjT4Sy.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-DuM7m61_.js → vnode-BcCsFzIs.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-SdK0_dHD.js → zoom-MLmG09h6.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/eval.js +79 -3
- package/src/commands/llm.js +40 -5
- package/src/data/changelog.json +26 -0
- package/src/lib/context-memory-kernel/message-adapter.js +41 -24
- package/src/lib/context-memory-kernel/segmented-memory-port.js +18 -0
- package/src/lib/eval/runner.js +22 -1
- package/src/lib/eval/verify01-contracts.js +106 -51
- package/src/lib/eval/verify01-execution.js +148 -166
- package/src/lib/eval/verify01-host-evidence.js +34 -2
- package/src/lib/eval/verify01-workspace.js +302 -0
- package/src/lib/execution-location-failure-site.js +18 -0
- package/src/lib/execution-location-target.js +10 -0
- package/src/lib/llm-connection-probe.js +147 -6
- package/src/lib/provider-http-error.js +30 -11
- package/src/lib/task-progress-tracker.js +1 -0
- package/src/runtime/agent-core.js +22 -0
- package/src/runtime/headless-runner.js +30 -20
- package/src/runtime/headless-stream.js +15 -10
- package/src/assets/web-panel/assets/ChatBubbleRenderer-BEmIX0R1.js +0 -1
- package/src/assets/web-panel/assets/Logs-BzkfZQQF.js +0 -2
- package/src/assets/web-panel/assets/MobileProjects-Cvg9bcvQ.js +0 -1
- package/src/assets/web-panel/assets/devWarning-DcHR2Rj6.js +0 -1
- package/src/assets/web-panel/assets/index-BZYMgiHf.js +0 -1
- package/src/assets/web-panel/assets/index-CnRInbAW.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
|
|
20
|
-
const
|
|
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.
|
|
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(
|
|
547
|
-
|
|
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.
|
|
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
|
-
|
|
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];
|