@tangle-network/agent-eval 0.216.1 → 0.218.1
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/CHANGELOG.md +137 -57
- package/README.md +2 -2
- package/dist/adapters/http.d.ts +2 -2
- package/dist/{agent-profile-VFcQncbW.d.ts → agent-profile-DTt8uGP9.d.ts} +4 -17
- package/dist/agent-profile-DTt8uGP9.d.ts.map +1 -0
- package/dist/{agent-profile-cell-BK8mlqlq.js → agent-profile-cell-B1V1gUZs.js} +4 -53
- package/dist/agent-profile-cell-B1V1gUZs.js.map +1 -0
- package/dist/{agent-profile-cell-BNp-Js9F.d.ts → agent-profile-cell-BcpFbNd5.d.ts} +2 -22
- package/dist/agent-profile-cell-BcpFbNd5.d.ts.map +1 -0
- package/dist/{agreement-irr-BEWLIF3_.js → agreement-irr-BhAqjluA.js} +5 -5
- package/dist/agreement-irr-BhAqjluA.js.map +1 -0
- package/dist/analyst/index.d.ts +36 -169
- package/dist/analyst/index.d.ts.map +1 -1
- package/dist/analyst/index.js +17 -192
- package/dist/analyst/index.js.map +1 -1
- package/dist/{analyze-runs-D68fd-su.d.ts → analyze-runs-DjlZOVXx.d.ts} +5 -5
- package/dist/{analyze-runs-D68fd-su.d.ts.map → analyze-runs-DjlZOVXx.d.ts.map} +1 -1
- package/dist/{analyze-runs-C84irm4i.js → analyze-runs-DqPJaJ4X.js} +225 -21
- package/dist/analyze-runs-DqPJaJ4X.js.map +1 -0
- package/dist/authenticity/index.d.ts +0 -23
- package/dist/authenticity/index.d.ts.map +1 -1
- package/dist/authenticity/index.js +1 -34
- package/dist/authenticity/index.js.map +1 -1
- package/dist/{benchmark-command-By0vh8q7.js → benchmark-command-BupdHRyf.js} +1225 -661
- package/dist/benchmark-command-BupdHRyf.js.map +1 -0
- package/dist/benchmarks/index.d.ts +5 -6
- package/dist/benchmarks/index.d.ts.map +1 -1
- package/dist/benchmarks/index.js +4 -4
- package/dist/benchmarks/index.js.map +1 -1
- package/dist/builder-eval/index.d.ts +3 -3
- package/dist/builder-eval/index.js +2 -2
- package/dist/builder-eval/index.js.map +1 -1
- package/dist/campaign/index.d.ts +7 -7
- package/dist/campaign/index.js +15 -15
- package/dist/{campaign-BudZ70zo.js → campaign-CGvUTnmc.js} +324 -800
- package/dist/campaign-CGvUTnmc.js.map +1 -0
- package/dist/{campaign-evidence-Clrn4hBV.js → campaign-evidence-DunzcJGv.js} +10 -18
- package/dist/{campaign-evidence-Clrn4hBV.js.map → campaign-evidence-DunzcJGv.js.map} +1 -1
- package/dist/{canonical-B2RqLofv.js → canonical-Dq2hOQ8L.js} +2 -2
- package/dist/{canonical-B2RqLofv.js.map → canonical-Dq2hOQ8L.js.map} +1 -1
- package/dist/cell-spend-DEWR3nj-.js +90 -0
- package/dist/cell-spend-DEWR3nj-.js.map +1 -0
- package/dist/{chat-client-l-MVDlDk.js → chat-client-B2pXlPdx.js} +2 -2
- package/dist/{chat-client-l-MVDlDk.js.map → chat-client-B2pXlPdx.js.map} +1 -1
- package/dist/{chat-json-call-puMArmtW.js → chat-json-call-Dm9c-b41.js} +3 -2
- package/dist/chat-json-call-Dm9c-b41.js.map +1 -0
- package/dist/{claim-q4HQhK1G.js → claim-BPVuyHuy.js} +3 -3
- package/dist/{claim-q4HQhK1G.js.map → claim-BPVuyHuy.js.map} +1 -1
- package/dist/cli.js +113 -12
- package/dist/cli.js.map +1 -1
- package/dist/{client-BzL9niqi.d.ts → client-hwo3cJjR.d.ts} +3 -16
- package/dist/client-hwo3cJjR.d.ts.map +1 -0
- package/dist/{cluster-bootstrap-qcUWYFl-.js → cluster-bootstrap-DEwwhl0C.js} +3 -3
- package/dist/{cluster-bootstrap-qcUWYFl-.js.map → cluster-bootstrap-DEwwhl0C.js.map} +1 -1
- package/dist/{produced-state-BsDmnwxc.js → completion-verifier-DbLVf3i8.js} +9 -64
- package/dist/completion-verifier-DbLVf3i8.js.map +1 -0
- package/dist/contract/index.d.ts +12 -12
- package/dist/contract/index.js +107 -403
- package/dist/contract/index.js.map +1 -1
- package/dist/{cost-ledger-BP8V4kUQ.js → cost-ledger-D0352Z4d.js} +4 -8
- package/dist/cost-ledger-D0352Z4d.js.map +1 -0
- package/dist/dataset-DQqhOCPt.d.ts.map +1 -1
- package/dist/{default-registry-COhk9g36.js → default-registry-BJ-Pq6yL.js} +314 -285
- package/dist/default-registry-BJ-Pq6yL.js.map +1 -0
- package/dist/{default-registry-DzHiGruW.d.ts → default-registry-DXgLmoDI.d.ts} +7 -50
- package/dist/default-registry-DXgLmoDI.d.ts.map +1 -0
- package/dist/{define-agent-eval-CNTPzIkp.js → define-agent-eval-BGdFKlrc.js} +170 -110
- package/dist/define-agent-eval-BGdFKlrc.js.map +1 -0
- package/dist/{define-agent-eval-WSck0CZJ.d.ts → define-agent-eval-BlH10zEw.d.ts} +8 -8
- package/dist/define-agent-eval-BlH10zEw.d.ts.map +1 -0
- package/dist/{descriptive-DboxPZrG.js → descriptive-CVNy48rR.js} +2 -2
- package/dist/{descriptive-DboxPZrG.js.map → descriptive-CVNy48rR.js.map} +1 -1
- package/dist/diagnosis/index.d.ts +4 -14
- package/dist/diagnosis/index.d.ts.map +1 -1
- package/dist/diagnosis/index.js +67 -28
- package/dist/diagnosis/index.js.map +1 -1
- package/dist/{dspy-rlm-engine-LRCu61m5.js → dspy-rlm-engine-CSMwudLO.js} +5 -10
- package/dist/dspy-rlm-engine-CSMwudLO.js.map +1 -0
- package/dist/{emitter-HcCmFQl_.d.ts → emitter-DABYYTcH.d.ts} +5 -5
- package/dist/emitter-DABYYTcH.d.ts.map +1 -0
- package/dist/emitter-DbMXUIVP.js.map +1 -1
- package/dist/{engine-3A_4jOlI.d.ts → engine-BvZ0R-36.d.ts} +17 -21
- package/dist/engine-BvZ0R-36.d.ts.map +1 -0
- package/dist/{equal-terms-BtdXayCJ.js → equal-terms-DbPGcVtI.js} +2 -2
- package/dist/equal-terms-DbPGcVtI.js.map +1 -0
- package/dist/{errors-DVZiqS7K.js → errors-BcOs5MKW.js} +2 -8
- package/dist/{errors-DVZiqS7K.js.map → errors-BcOs5MKW.js.map} +1 -1
- package/dist/eval-campaign-BUMIxKTE.js +393 -0
- package/dist/eval-campaign-BUMIxKTE.js.map +1 -0
- package/dist/{evaluation-6Yoi74gM.d.ts → evaluation-BOZ38vOH.d.ts} +7 -7
- package/dist/evaluation-BOZ38vOH.d.ts.map +1 -0
- package/dist/evaluation.d.ts +2 -2
- package/dist/evaluation.js +1 -1
- package/dist/evaluation.js.map +1 -1
- package/dist/{exact-types-ClugMJfI.d.ts → exact-types-CflbJ9f3.d.ts} +2 -2
- package/dist/{exact-types-ClugMJfI.d.ts.map → exact-types-CflbJ9f3.d.ts.map} +1 -1
- package/dist/{exec-ChJ6d5if.js → exec-CpbtOXVt.js} +2 -24
- package/dist/{exec-ChJ6d5if.js.map → exec-CpbtOXVt.js.map} +1 -1
- package/dist/execution-tracks-CpgFPpS5.js.map +1 -1
- package/dist/experiment/index.d.ts +9 -112
- package/dist/experiment/index.d.ts.map +1 -1
- package/dist/experiment/index.js +258 -311
- package/dist/experiment/index.js.map +1 -1
- package/dist/{exporters-X4xwla8A.js → exporters-DWvM16LE.js} +3 -3
- package/dist/exporters-DWvM16LE.js.map +1 -0
- package/dist/{exporters-ChTnR90l.d.ts → exporters-Dk3oEbK_.d.ts} +2 -4
- package/dist/{exporters-ChTnR90l.d.ts.map → exporters-Dk3oEbK_.d.ts.map} +1 -1
- package/dist/{external-optimizer-process-BjMGUuds.js → external-optimizer-process-C3Wm7Vhn.js} +4 -3
- package/dist/external-optimizer-process-C3Wm7Vhn.js.map +1 -0
- package/dist/{external-optimizer-subprocess-BqW0hHcI.js → external-optimizer-subprocess-B5gdLRZv.js} +9 -11
- package/dist/external-optimizer-subprocess-B5gdLRZv.js.map +1 -0
- package/dist/{extract-usage-BrnzRJ6H.js → extract-usage-BZLU01kR.js} +2 -23
- package/dist/{extract-usage-BrnzRJ6H.js.map → extract-usage-BZLU01kR.js.map} +1 -1
- package/dist/{failure-cluster-CbgEDcFJ.d.ts → failure-cluster-DN0t63Z0.d.ts} +4 -43
- package/dist/failure-cluster-DN0t63Z0.d.ts.map +1 -0
- package/dist/{failure-taxonomy-CjabTATj.js → failure-taxonomy-Bx5oWqaW.js} +2 -19
- package/dist/{failure-taxonomy-CjabTATj.js.map → failure-taxonomy-Bx5oWqaW.js.map} +1 -1
- package/dist/{feedback-trajectory-C4EG0nNH.d.ts → feedback-trajectory-BWmhRBGu.d.ts} +7 -9
- package/dist/feedback-trajectory-BWmhRBGu.d.ts.map +1 -0
- package/dist/{semantic-concept-judge-BQF8te0T.js → findings-store-BtTzPL0d.js} +9 -249
- package/dist/findings-store-BtTzPL0d.js.map +1 -0
- package/dist/fuzz.d.ts +19 -62
- package/dist/fuzz.d.ts.map +1 -1
- package/dist/fuzz.js +62 -108
- package/dist/fuzz.js.map +1 -1
- package/dist/{hf-dataset-BR2yhuNn.js → hf-dataset-CKxIJQba.js} +4 -24
- package/dist/hf-dataset-CKxIJQba.js.map +1 -0
- package/dist/hosted/index.d.ts +2 -2
- package/dist/hosted/index.js +2 -2
- package/dist/{index-CyszSg4O.d.ts → index-B16FNdW5.d.ts} +145 -360
- package/dist/index-B16FNdW5.d.ts.map +1 -0
- package/dist/{index-DV-jSzxF.d.ts → index-BLGqZ81N.d.ts} +10 -15
- package/dist/{index-DV-jSzxF.d.ts.map → index-BLGqZ81N.d.ts.map} +1 -1
- package/dist/{index-BO41eGj5.d.ts → index-CX-GAUpw.d.ts} +3 -7
- package/dist/index-CX-GAUpw.d.ts.map +1 -0
- package/dist/{index-DHKEAv3s.d.ts → index-CalAsXMR.d.ts} +8 -68
- package/dist/index-CalAsXMR.d.ts.map +1 -0
- package/dist/{index-BFRO6chs.d.ts → index-CiRwLv2R.d.ts} +5 -69
- package/dist/index-CiRwLv2R.d.ts.map +1 -0
- package/dist/{index-DPcngtwt.d.ts → index-DbMOXYnP.d.ts} +11 -36
- package/dist/index-DbMOXYnP.d.ts.map +1 -0
- package/dist/index.d.ts +211 -218
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +999 -1714
- package/dist/index.js.map +1 -1
- package/dist/{integrity-dLiDe2kD.js → integrity-C8oUeB0g.js} +326 -203
- package/dist/integrity-C8oUeB0g.js.map +1 -0
- package/dist/{integrity-BXOsAb3i.js → integrity-W4CADcFc.js} +3 -7
- package/dist/{integrity-BXOsAb3i.js.map → integrity-W4CADcFc.js.map} +1 -1
- package/dist/{integrity-DAMEDFaC.d.ts → integrity-_qgZLA5p.d.ts} +4 -6
- package/dist/{integrity-DAMEDFaC.d.ts.map → integrity-_qgZLA5p.d.ts.map} +1 -1
- package/dist/{internal-Epl-YBZW.js → internal-BTK91Bqt.js} +3 -3
- package/dist/{internal-Epl-YBZW.js.map → internal-BTK91Bqt.js.map} +1 -1
- package/dist/{interval-CELpye1n.js → interval-Dq9gt7jx.js} +3 -3
- package/dist/{interval-CELpye1n.js.map → interval-Dq9gt7jx.js.map} +1 -1
- package/dist/{journal-DfRz9kps.js → journal-C7om8Gum.js} +157 -147
- package/dist/journal-C7om8Gum.js.map +1 -0
- package/dist/json-BhdsJaOQ.js +111 -0
- package/dist/json-BhdsJaOQ.js.map +1 -0
- package/dist/{judge-calibration-BpCy5XQl.js → judge-calibration-BkXMIWA4.js} +3 -3
- package/dist/{judge-calibration-BpCy5XQl.js.map → judge-calibration-BkXMIWA4.js.map} +1 -1
- package/dist/{judge-gate-iY9s4L44.js → judge-gate-Co5tuh57.js} +4 -27
- package/dist/{judge-gate-iY9s4L44.js.map → judge-gate-Co5tuh57.js.map} +1 -1
- package/dist/{judge-gate-CE7CQAgt.d.ts → judge-gate-DsL0yFcb.d.ts} +8 -9
- package/dist/judge-gate-DsL0yFcb.d.ts.map +1 -0
- package/dist/{kind-factory-BobI5Jy3.js → kind-factory-Gy4fXixd.js} +88 -17
- package/dist/kind-factory-Gy4fXixd.js.map +1 -0
- package/dist/ledger-core/index.d.ts +2 -2
- package/dist/ledger-core/index.js +4 -4
- package/dist/ledger-core/lock-holder.d.ts +2 -0
- package/dist/ledger-core/lock-holder.js +181 -0
- package/dist/ledger-core/lock-holder.js.map +1 -0
- package/dist/{ledger-core-Gq7yp8lP.js → ledger-core-CAxUdDk0.js} +5 -84
- package/dist/ledger-core-CAxUdDk0.js.map +1 -0
- package/dist/{llm-client-CyBAoYiX.js → llm-client-_Y6ic-tf.js} +243 -355
- package/dist/llm-client-_Y6ic-tf.js.map +1 -0
- package/dist/{llm-judge-CG12SQJq.js → llm-judge-Djxh-Uhs.js} +662 -482
- package/dist/llm-judge-Djxh-Uhs.js.map +1 -0
- package/dist/lock-holder-DaJbfpci.d.ts +86 -0
- package/dist/lock-holder-DaJbfpci.d.ts.map +1 -0
- package/dist/matrix/index.d.ts +3 -3
- package/dist/matrix/index.js +3 -2
- package/dist/{matrix-Dm0BQW7U.js → matrix-B8l-Nsxd.js} +3 -88
- package/dist/matrix-B8l-Nsxd.js.map +1 -0
- package/dist/{matrix-DSrSxjjy.d.ts → matrix-CCSBna4q.d.ts} +9 -18
- package/dist/matrix-CCSBna4q.d.ts.map +1 -0
- package/dist/{mean-DHoMiudD.js → mean-BbA_JCzW.js} +39 -5
- package/dist/mean-BbA_JCzW.js.map +1 -0
- package/dist/meta-eval/index.d.ts +5 -5
- package/dist/meta-eval/index.js +10 -10
- package/dist/metrics-BKaPBtIG.js.map +1 -1
- package/dist/{mint-DNU8QPG4.d.ts → mint-BRZXuwRi.d.ts} +4 -4
- package/dist/{mint-DNU8QPG4.d.ts.map → mint-BRZXuwRi.d.ts.map} +1 -1
- package/dist/{mint-QaD5cA0u.js → mint-CbdwjTPW.js} +4 -4
- package/dist/{mint-QaD5cA0u.js.map → mint-CbdwjTPW.js.map} +1 -1
- package/dist/{multi-layer-verifier-BUaQ4C17.d.ts → multi-layer-verifier-DEgMUk6v.d.ts} +2 -2
- package/dist/{multi-layer-verifier-BUaQ4C17.d.ts.map → multi-layer-verifier-DEgMUk6v.d.ts.map} +1 -1
- package/dist/{multiplicity-DQUFcbW4.js → multiplicity-Sg0U7h8j.js} +2 -2
- package/dist/{multiplicity-DQUFcbW4.js.map → multiplicity-Sg0U7h8j.js.map} +1 -1
- package/dist/multishot/golden/index.d.ts +1 -23
- package/dist/multishot/golden/index.d.ts.map +1 -1
- package/dist/multishot/golden/index.js +3 -3
- package/dist/multishot/golden/index.js.map +1 -1
- package/dist/multishot/index.d.ts +3 -12
- package/dist/multishot/index.d.ts.map +1 -1
- package/dist/multishot/index.js +4 -3
- package/dist/multishot/index.js.map +1 -1
- package/dist/openapi.json +114 -10
- package/dist/{otel-spans-B9tUXRHF.js → otel-spans-CdN909k1.js} +3 -3
- package/dist/{otel-spans-B9tUXRHF.js.map → otel-spans-CdN909k1.js.map} +1 -1
- package/dist/{paired-arms-CwMGJsrS.js → paired-arms-Ct4LTKc1.js} +32 -9
- package/dist/paired-arms-Ct4LTKc1.js.map +1 -0
- package/dist/{paired-binary-CvpFHfKZ.js → paired-binary-B_nejA44.js} +3 -36
- package/dist/paired-binary-B_nejA44.js.map +1 -0
- package/dist/{paired-promotion-decision-DPKz8ZnF.d.ts → paired-promotion-decision-CQMJ5xGN.d.ts} +2 -34
- package/dist/paired-promotion-decision-CQMJ5xGN.d.ts.map +1 -0
- package/dist/{paired-promotion-decision-DsAPYGCm.js → paired-promotion-decision-D0SHb-ZL.js} +3 -3
- package/dist/{paired-promotion-decision-DsAPYGCm.js.map → paired-promotion-decision-D0SHb-ZL.js.map} +1 -1
- package/dist/{pareto-Cm6ndrWN.js → pareto-CTv8vozZ.js} +11 -11
- package/dist/pareto-CTv8vozZ.js.map +1 -0
- package/dist/pipelines/index.d.ts +16 -19
- package/dist/pipelines/index.d.ts.map +1 -1
- package/dist/pipelines/index.js +4 -68
- package/dist/pipelines/index.js.map +1 -1
- package/dist/{power-and-mde-Hj2ubb4B.js → power-and-mde-N5nU4_Ly.js} +3 -3
- package/dist/{power-and-mde-Hj2ubb4B.js.map → power-and-mde-N5nU4_Ly.js.map} +1 -1
- package/dist/{prime-protocol-CHKgA3a6.js → prime-protocol-BFgGrEMP.js} +3 -3
- package/dist/prime-protocol-BFgGrEMP.js.map +1 -0
- package/dist/{prime-protocol-HiB9HX7E.d.ts → prime-protocol-BWG2DQIk.d.ts} +3 -21
- package/dist/prime-protocol-BWG2DQIk.d.ts.map +1 -0
- package/dist/profile-cell.d.ts +2 -2
- package/dist/profile-cell.js +2 -2
- package/dist/{promotion-gate-BawrdPYr.d.ts → promotion-gate-CxEHRsZW.d.ts} +7 -8
- package/dist/{promotion-gate-BawrdPYr.d.ts.map → promotion-gate-CxEHRsZW.d.ts.map} +1 -1
- package/dist/{promotion-policy-KO57gbyV.js → promotion-policy-6A8osGr_.js} +4 -4
- package/dist/{promotion-policy-KO57gbyV.js.map → promotion-policy-6A8osGr_.js.map} +1 -1
- package/dist/{proposal-findings-CY1xKn_a.js → proposal-findings-n-5WBbEx.js} +3 -3
- package/dist/proposal-findings-n-5WBbEx.js.map +1 -0
- package/dist/{query-BUCZCK7F.js → query-B_RZ36an.js} +5 -5
- package/dist/query-B_RZ36an.js.map +1 -0
- package/dist/{query-DK1nWcmp.d.ts → query-Cmv_U8vf.d.ts} +4 -24
- package/dist/{query-DK1nWcmp.d.ts.map → query-Cmv_U8vf.d.ts.map} +1 -1
- package/dist/{random-ByUSnV9w.js → random-DDDcC7YU.js} +2 -2
- package/dist/{random-ByUSnV9w.js.map → random-DDDcC7YU.js.map} +1 -1
- package/dist/{raw-provider-sink-DoHz4JNG.js → raw-provider-sink-75w4FWBj.js} +2 -2
- package/dist/{raw-provider-sink-DoHz4JNG.js.map → raw-provider-sink-75w4FWBj.js.map} +1 -1
- package/dist/{redact-mtCCcT8z.d.ts → redact-DXdlFb_U.d.ts} +2 -3
- package/dist/redact-DXdlFb_U.d.ts.map +1 -0
- package/dist/{redact-B5xXKqQ3.js → redact-mtkTiJVk.js} +2 -7
- package/dist/{redact-B5xXKqQ3.js.map → redact-mtkTiJVk.js.map} +1 -1
- package/dist/{registry-D7_hm2fK.d.ts → registry-ssNoHzwD.d.ts} +4 -4
- package/dist/{registry-D7_hm2fK.d.ts.map → registry-ssNoHzwD.d.ts.map} +1 -1
- package/dist/{release-confidence-CpuP65S5.js → release-confidence-CYIFH-fp.js} +6 -11
- package/dist/release-confidence-CYIFH-fp.js.map +1 -0
- package/dist/{report-command-SC9nqb4M.js → render-Cs34y0iX.js} +625 -587
- package/dist/render-Cs34y0iX.js.map +1 -0
- package/dist/reporting.d.ts +6 -6
- package/dist/reporting.js +8 -8
- package/dist/{researcher-CEcfku-T.d.ts → researcher-GU1tV4dn.d.ts} +9 -9
- package/dist/{researcher-CEcfku-T.d.ts.map → researcher-GU1tV4dn.d.ts.map} +1 -1
- package/dist/{reward-CpCmAM8L.d.ts → reward-DrZ71vnf.d.ts} +3 -26
- package/dist/reward-DrZ71vnf.d.ts.map +1 -0
- package/dist/{reward-hacking-E0d-WVcP.js → reward-hacking-ByuETaIb.js} +3 -3
- package/dist/{reward-hacking-E0d-WVcP.js.map → reward-hacking-ByuETaIb.js.map} +1 -1
- package/dist/{reward-hacking-RVdZ6Kkt.d.ts → reward-hacking-E52wq86n.d.ts} +5 -18
- package/dist/reward-hacking-E52wq86n.d.ts.map +1 -0
- package/dist/reward-nw2xZGZG.js.map +1 -1
- package/dist/rl.d.ts +117 -295
- package/dist/rl.d.ts.map +1 -1
- package/dist/rl.js +27 -747
- package/dist/rl.js.map +1 -1
- package/dist/rollout/index.d.ts +5 -5
- package/dist/rollout/index.js +7 -8
- package/dist/{rollout-DZV1t2Wg.js → rollout-Dd1ucT_M.js} +88 -13
- package/dist/rollout-Dd1ucT_M.js.map +1 -0
- package/dist/{rubric-predictive-validity-DaFW70y9.js → rubric-predictive-validity-D3_oI72N.js} +3 -3
- package/dist/{rubric-predictive-validity-DaFW70y9.js.map → rubric-predictive-validity-D3_oI72N.js.map} +1 -1
- package/dist/{rubric-predictive-validity-C03EC7ZE.d.ts → rubric-predictive-validity-DiwT8PbL.d.ts} +2 -2
- package/dist/{rubric-predictive-validity-C03EC7ZE.d.ts.map → rubric-predictive-validity-DiwT8PbL.d.ts.map} +1 -1
- package/dist/{run-record-C1E24G2A.d.ts → run-record-CaxbLq6Y.d.ts} +4 -10
- package/dist/run-record-CaxbLq6Y.d.ts.map +1 -0
- package/dist/{run-record-C5e7FjhJ.js → run-record-CysKLB93.js} +3 -3
- package/dist/run-record-CysKLB93.js.map +1 -0
- package/dist/{run-record-Boc5IUTp.js → run-record-DhEJgoPz.js} +4 -4
- package/dist/{run-record-Boc5IUTp.js.map → run-record-DhEJgoPz.js.map} +1 -1
- package/dist/sandbox-harness-BlSOu4LX.d.ts.map +1 -1
- package/dist/{schema-CSf6qWgZ.js → schema-Bt2vLFm3.js} +2 -14
- package/dist/schema-Bt2vLFm3.js.map +1 -0
- package/dist/schema-C-ziyJD7.d.ts.map +1 -1
- package/dist/{schema-BuiujZ-g.js → schema-CvhfLjtZ.js} +78 -48
- package/dist/schema-CvhfLjtZ.js.map +1 -0
- package/dist/{schema-2g7trUwH.d.ts → schema-D6EVKzTB.d.ts} +4 -5
- package/dist/schema-D6EVKzTB.d.ts.map +1 -0
- package/dist/search/index.d.ts +3 -31
- package/dist/search/index.d.ts.map +1 -1
- package/dist/search/index.js +4 -4
- package/dist/{search-kernel-DyNEa6IU.d.ts → search-kernel-p9JB3SmL.d.ts} +10 -27
- package/dist/search-kernel-p9JB3SmL.d.ts.map +1 -0
- package/dist/{search-ledger-CVUGLDZp.js → search-ledger-ClpN4I3e.js} +7 -7
- package/dist/{search-ledger-CVUGLDZp.js.map → search-ledger-ClpN4I3e.js.map} +1 -1
- package/dist/{search-ledger-file-DDQUgvCg.js → search-ledger-file-Bd5Tioq6.js} +4 -4
- package/dist/search-ledger-file-Bd5Tioq6.js.map +1 -0
- package/dist/{search-shipper-BOSD46qv.js → search-shipper-Bg2HW3Uv.js} +4 -4
- package/dist/search-shipper-Bg2HW3Uv.js.map +1 -0
- package/dist/{search-summary-BQCSWf1g.js → search-summary-CrBuvVnf.js} +5 -5
- package/dist/{search-summary-BQCSWf1g.js.map → search-summary-CrBuvVnf.js.map} +1 -1
- package/dist/{sequential-CzK5DarL.js → sequential-BVv1sjsw.js} +2 -32
- package/dist/{sequential-CzK5DarL.js.map → sequential-BVv1sjsw.js.map} +1 -1
- package/dist/{sequential-Bf_pbE50.js → sequential-CimQrbjv.js} +5 -5
- package/dist/sequential-CimQrbjv.js.map +1 -0
- package/dist/{sequential-BhsrMupG.d.ts → sequential-KwGspfeR.d.ts} +2 -9
- package/dist/{sequential-BhsrMupG.d.ts.map → sequential-KwGspfeR.d.ts.map} +1 -1
- package/dist/{sequential-eprocess-DM_qENCl.js → sequential-eprocess-DodI6RoF.js} +2 -2
- package/dist/{sequential-eprocess-DM_qENCl.js.map → sequential-eprocess-DodI6RoF.js.map} +1 -1
- package/dist/{server-e9oWO_bN.js → server-C6M0qR8h.js} +101 -101
- package/dist/server-C6M0qR8h.js.map +1 -0
- package/dist/{single-run-lock-CV9Eyd_q.js → single-run-lock-Dekd8_Wv.js} +7 -7
- package/dist/single-run-lock-Dekd8_Wv.js.map +1 -0
- package/dist/{skillopt-optimization-method-BiwA8nfX.js → skillopt-optimization-method-5dlex7MJ.js} +1386 -1184
- package/dist/skillopt-optimization-method-5dlex7MJ.js.map +1 -0
- package/dist/{spans-BHAUXMGN.d.ts → spans-CVngGij3.d.ts} +2 -2
- package/dist/{spans-BHAUXMGN.d.ts.map → spans-CVngGij3.d.ts.map} +1 -1
- package/dist/{statistical-heldout-CYpGaoDH.d.ts → statistical-heldout-BHfLZHrm.d.ts} +8 -67
- package/dist/statistical-heldout-BHfLZHrm.d.ts.map +1 -0
- package/dist/{statistical-heldout-42NlCNDe.js → statistical-heldout-Bksv92Th.js} +3 -3
- package/dist/statistical-heldout-Bksv92Th.js.map +1 -0
- package/dist/{steps-Bg5-KVx1.d.ts → steps-DlepJPwD.d.ts} +2 -56
- package/dist/steps-DlepJPwD.d.ts.map +1 -0
- package/dist/{store-C4avFjIi.d.ts → store-B3nWRy3B.d.ts} +2 -2
- package/dist/{store-C4avFjIi.d.ts.map → store-B3nWRy3B.d.ts.map} +1 -1
- package/dist/{store-otlp-DJ9dtA5x.js → store-otlp-BteDAbHK.js} +3 -3
- package/dist/{store-otlp-DJ9dtA5x.js.map → store-otlp-BteDAbHK.js.map} +1 -1
- package/dist/{store-tool-spans-CIX5arAG.js → store-tool-spans-D5l_OfTJ.js} +8 -8
- package/dist/store-tool-spans-D5l_OfTJ.js.map +1 -0
- package/dist/{store-tool-spans-DdCSPa7C.d.ts → store-tool-spans-DZS0HWVf.d.ts} +9 -18
- package/dist/store-tool-spans-DZS0HWVf.d.ts.map +1 -0
- package/dist/storyboard/index.d.ts +4 -11
- package/dist/storyboard/index.d.ts.map +1 -1
- package/dist/storyboard/index.js +1 -16
- package/dist/storyboard/index.js.map +1 -1
- package/dist/{summary-report-V_JACR4Y.js → summary-report-BsXJoYX5.js} +88 -10
- package/dist/summary-report-BsXJoYX5.js.map +1 -0
- package/dist/{summary-report-bdFDXq0b.d.ts → summary-report-CkbRcSuu.d.ts} +25 -19
- package/dist/summary-report-CkbRcSuu.d.ts.map +1 -0
- package/dist/supervisor-run/index.d.ts +60 -28
- package/dist/supervisor-run/index.d.ts.map +1 -1
- package/dist/supervisor-run/index.js +4 -458
- package/dist/supervisor-run/index.js.map +1 -1
- package/dist/{systemone-BomhHr2c.d.ts → systemone-BMzDJb1i.d.ts} +5 -5
- package/dist/{systemone-BomhHr2c.d.ts.map → systemone-BMzDJb1i.d.ts.map} +1 -1
- package/dist/systemone-protocol.js +1 -1
- package/dist/{systemone-review-CUVcQJu6.d.ts → systemone-review-CwE6JGIp.d.ts} +2 -2
- package/dist/{systemone-review-CUVcQJu6.d.ts.map → systemone-review-CwE6JGIp.d.ts.map} +1 -1
- package/dist/{systemone-review-D7sXwsqq.js → systemone-review-DzdOJ8I6.js} +3 -3
- package/dist/{systemone-review-D7sXwsqq.js.map → systemone-review-DzdOJ8I6.js.map} +1 -1
- package/dist/systemone.d.ts +5 -5
- package/dist/systemone.js +5 -5
- package/dist/systemone.js.map +1 -1
- package/dist/{task-failure-attributes-hEmASjix.js → task-failure-attributes-BMsblaDh.js} +3 -3
- package/dist/task-failure-attributes-BMsblaDh.js.map +1 -0
- package/dist/{terminal-record-DZyQZ3pz.js → terminal-record-D4Rv-j1W.js} +244 -196
- package/dist/terminal-record-D4Rv-j1W.js.map +1 -0
- package/dist/{tool-groups-C3NEcdCM.d.ts → tool-groups-DyNz2JZ_.d.ts} +3 -3
- package/dist/tool-groups-DyNz2JZ_.d.ts.map +1 -0
- package/dist/{tool-waste-BKgvd-TP.d.ts → tool-waste-CkjzWmeY.d.ts} +25 -28
- package/dist/tool-waste-CkjzWmeY.d.ts.map +1 -0
- package/dist/{tool-waste-BlesqTqW.js → tool-waste-DLsjS_p-.js} +5 -5
- package/dist/{tool-waste-BlesqTqW.js.map → tool-waste-DLsjS_p-.js.map} +1 -1
- package/dist/{trace-questions-CM2CAocU.d.ts → trace-questions-xxwgsuMi.d.ts} +4 -9
- package/dist/{trace-questions-CM2CAocU.d.ts.map → trace-questions-xxwgsuMi.d.ts.map} +1 -1
- package/dist/trace-repair/index.d.ts +14 -211
- package/dist/trace-repair/index.d.ts.map +1 -1
- package/dist/trace-repair/index.js +865 -981
- package/dist/trace-repair/index.js.map +1 -1
- package/dist/traces.d.ts +18 -46
- package/dist/traces.d.ts.map +1 -1
- package/dist/traces.js +13 -13
- package/dist/traces.js.map +1 -1
- package/dist/trajectory-replay/index.d.ts +7 -118
- package/dist/trajectory-replay/index.d.ts.map +1 -1
- package/dist/trajectory-replay/index.js +921 -869
- package/dist/trajectory-replay/index.js.map +1 -1
- package/dist/{tree-C1XYeXvy.js → tree-B5e1uAeL.js} +132 -21
- package/dist/tree-B5e1uAeL.js.map +1 -0
- package/dist/{types-Cbe2fWBa.d.ts → types-BKCzzmit.d.ts} +3 -3
- package/dist/{types-Cbe2fWBa.d.ts.map → types-BKCzzmit.d.ts.map} +1 -1
- package/dist/{types-B3jzCp0p.js → types-BXgASBCL.js} +2 -2
- package/dist/{types-B3jzCp0p.js.map → types-BXgASBCL.js.map} +1 -1
- package/dist/{types-C1tnkEgM.d.ts → types-CW8ewATZ.d.ts} +4 -113
- package/dist/types-CW8ewATZ.d.ts.map +1 -0
- package/dist/{types-BqkVmHfv.d.ts → types-CmXY0PQf.d.ts} +2 -4
- package/dist/types-CmXY0PQf.d.ts.map +1 -0
- package/dist/{types-C02qtnG8.d.ts → types-D-mgRzlh.d.ts} +7 -28
- package/dist/types-D-mgRzlh.d.ts.map +1 -0
- package/dist/{types-IXD2HJzu.js → types-DqFMNTgK.js} +2 -4
- package/dist/types-DqFMNTgK.js.map +1 -0
- package/dist/{types-Cq8mSbq8.d.ts → types-DtkO1G9L.d.ts} +7 -9
- package/dist/{types-Cq8mSbq8.d.ts.map → types-DtkO1G9L.d.ts.map} +1 -1
- package/dist/{verdict-Dl0tiT1X.js → verdict-BGQmxQ8A.js} +3 -3
- package/dist/verdict-BGQmxQ8A.js.map +1 -0
- package/dist/{verdict-E4eRNf7-.d.ts → verdict-C24NELtN.d.ts} +2 -15
- package/dist/{verdict-E4eRNf7-.d.ts.map → verdict-C24NELtN.d.ts.map} +1 -1
- package/dist/{verdict-cache-Bm8EKL2s.js → verdict-cache-CL_7tePD.js} +2 -2
- package/dist/verdict-cache-CL_7tePD.js.map +1 -0
- package/dist/wire/index.d.ts +31 -410
- package/dist/wire/index.d.ts.map +1 -1
- package/dist/wire/index.js +2 -2
- package/docs/changes/jev-evidence-review.md +1 -1
- package/docs/changes/jev-product-adoption.md +1 -1
- package/docs/changes/jev-recorded-evidence.md +1 -1
- package/docs/design/statistics-decisions.md +18 -18
- package/docs/design.md +1 -1
- package/docs/eval-surface-map.md +1 -0
- package/docs/evaluation-integrity.md +1 -1
- package/docs/profile-json-identity.md +1 -2
- package/docs/proofs/campaign-attempt-retention-20261001/README.md +2 -2
- package/docs/public-api.md +158 -538
- package/docs/rollout.md +1 -1
- package/docs/trace-repair-admission.md +1 -1
- package/docs/wire-protocol.md +1 -1
- package/package.json +7 -2
- package/dist/active-curriculum-B_Lc9kfO.js +0 -61
- package/dist/active-curriculum-B_Lc9kfO.js.map +0 -1
- package/dist/agent-profile-VFcQncbW.d.ts.map +0 -1
- package/dist/agent-profile-cell-BK8mlqlq.js.map +0 -1
- package/dist/agent-profile-cell-BNp-Js9F.d.ts.map +0 -1
- package/dist/agreement-irr-BEWLIF3_.js.map +0 -1
- package/dist/analyze-runs-C84irm4i.js.map +0 -1
- package/dist/baseline-Udi_PLuT.js +0 -259
- package/dist/baseline-Udi_PLuT.js.map +0 -1
- package/dist/benchmark-CXmVVHH2.js +0 -562
- package/dist/benchmark-CXmVVHH2.js.map +0 -1
- package/dist/benchmark-command-By0vh8q7.js.map +0 -1
- package/dist/campaign-BudZ70zo.js.map +0 -1
- package/dist/chat-json-call-puMArmtW.js.map +0 -1
- package/dist/claude-jsonl-dZir12m6.js +0 -86
- package/dist/claude-jsonl-dZir12m6.js.map +0 -1
- package/dist/client-BzL9niqi.d.ts.map +0 -1
- package/dist/cost-ledger-BP8V4kUQ.js.map +0 -1
- package/dist/counterfactual-CPaWN99-.d.ts +0 -60
- package/dist/counterfactual-CPaWN99-.d.ts.map +0 -1
- package/dist/counterfactual-Dn3veueY.js +0 -98
- package/dist/counterfactual-Dn3veueY.js.map +0 -1
- package/dist/default-registry-COhk9g36.js.map +0 -1
- package/dist/default-registry-DzHiGruW.d.ts.map +0 -1
- package/dist/define-agent-eval-CNTPzIkp.js.map +0 -1
- package/dist/define-agent-eval-WSck0CZJ.d.ts.map +0 -1
- package/dist/dspy-rlm-engine-LRCu61m5.js.map +0 -1
- package/dist/effect-sizes-BhzEpXMc.js +0 -82
- package/dist/effect-sizes-BhzEpXMc.js.map +0 -1
- package/dist/emitter-HcCmFQl_.d.ts.map +0 -1
- package/dist/engine-3A_4jOlI.d.ts.map +0 -1
- package/dist/equal-terms-BtdXayCJ.js.map +0 -1
- package/dist/eval-campaign-90jeaCAI.js +0 -343
- package/dist/eval-campaign-90jeaCAI.js.map +0 -1
- package/dist/evaluation-6Yoi74gM.d.ts.map +0 -1
- package/dist/exporters-X4xwla8A.js.map +0 -1
- package/dist/external-optimizer-process-BjMGUuds.js.map +0 -1
- package/dist/external-optimizer-subprocess-BqW0hHcI.js.map +0 -1
- package/dist/failure-cluster-CbgEDcFJ.d.ts.map +0 -1
- package/dist/feedback-trajectory-C4EG0nNH.d.ts.map +0 -1
- package/dist/hf-dataset-BR2yhuNn.js.map +0 -1
- package/dist/index-BFRO6chs.d.ts.map +0 -1
- package/dist/index-BO41eGj5.d.ts.map +0 -1
- package/dist/index-CyszSg4O.d.ts.map +0 -1
- package/dist/index-DHKEAv3s.d.ts.map +0 -1
- package/dist/index-DPcngtwt.d.ts.map +0 -1
- package/dist/integrity-dLiDe2kD.js.map +0 -1
- package/dist/journal-DfRz9kps.js.map +0 -1
- package/dist/judge-gate-CE7CQAgt.d.ts.map +0 -1
- package/dist/kind-factory-BobI5Jy3.js.map +0 -1
- package/dist/ledger-core-Gq7yp8lP.js.map +0 -1
- package/dist/llm-client-CyBAoYiX.js.map +0 -1
- package/dist/llm-judge-CG12SQJq.js.map +0 -1
- package/dist/matrix-DSrSxjjy.d.ts.map +0 -1
- package/dist/matrix-Dm0BQW7U.js.map +0 -1
- package/dist/mean-DHoMiudD.js.map +0 -1
- package/dist/normal-DsJZtrJc.js +0 -25
- package/dist/normal-DsJZtrJc.js.map +0 -1
- package/dist/paired-arms-CwMGJsrS.js.map +0 -1
- package/dist/paired-binary-CvpFHfKZ.js.map +0 -1
- package/dist/paired-promotion-decision-DPKz8ZnF.d.ts.map +0 -1
- package/dist/pareto-Cm6ndrWN.js.map +0 -1
- package/dist/prime-protocol-CHKgA3a6.js.map +0 -1
- package/dist/prime-protocol-HiB9HX7E.d.ts.map +0 -1
- package/dist/produced-state-BsDmnwxc.js.map +0 -1
- package/dist/proposal-findings-CY1xKn_a.js.map +0 -1
- package/dist/query-BUCZCK7F.js.map +0 -1
- package/dist/redact-mtCCcT8z.d.ts.map +0 -1
- package/dist/release-confidence-CpuP65S5.js.map +0 -1
- package/dist/report-command-SC9nqb4M.js.map +0 -1
- package/dist/reward-CpCmAM8L.d.ts.map +0 -1
- package/dist/reward-hacking-RVdZ6Kkt.d.ts.map +0 -1
- package/dist/rollout-DZV1t2Wg.js.map +0 -1
- package/dist/run-record-C1E24G2A.d.ts.map +0 -1
- package/dist/run-record-C5e7FjhJ.js.map +0 -1
- package/dist/schema-2g7trUwH.d.ts.map +0 -1
- package/dist/schema-BuiujZ-g.js.map +0 -1
- package/dist/schema-CSf6qWgZ.js.map +0 -1
- package/dist/search-kernel-DyNEa6IU.d.ts.map +0 -1
- package/dist/search-ledger-file-DDQUgvCg.js.map +0 -1
- package/dist/search-shipper-BOSD46qv.js.map +0 -1
- package/dist/semantic-concept-judge-BQF8te0T.js.map +0 -1
- package/dist/sequential-Bf_pbE50.js.map +0 -1
- package/dist/server-e9oWO_bN.js.map +0 -1
- package/dist/single-run-lock-CV9Eyd_q.js.map +0 -1
- package/dist/skillopt-optimization-method-BiwA8nfX.js.map +0 -1
- package/dist/statistical-heldout-42NlCNDe.js.map +0 -1
- package/dist/statistical-heldout-CYpGaoDH.d.ts.map +0 -1
- package/dist/steps-Bg5-KVx1.d.ts.map +0 -1
- package/dist/store-tool-spans-CIX5arAG.js.map +0 -1
- package/dist/store-tool-spans-DdCSPa7C.d.ts.map +0 -1
- package/dist/student-t-DVPW7CdL.js +0 -39
- package/dist/student-t-DVPW7CdL.js.map +0 -1
- package/dist/summary-report-V_JACR4Y.js.map +0 -1
- package/dist/summary-report-bdFDXq0b.d.ts.map +0 -1
- package/dist/task-failure-attributes-hEmASjix.js.map +0 -1
- package/dist/terminal-record-DZyQZ3pz.js.map +0 -1
- package/dist/tool-groups-C3NEcdCM.d.ts.map +0 -1
- package/dist/tool-waste-BKgvd-TP.d.ts.map +0 -1
- package/dist/trajectory-Y1fmdlw7.d.ts +0 -24
- package/dist/trajectory-Y1fmdlw7.d.ts.map +0 -1
- package/dist/tree-C1XYeXvy.js.map +0 -1
- package/dist/types-BqkVmHfv.d.ts.map +0 -1
- package/dist/types-C02qtnG8.d.ts.map +0 -1
- package/dist/types-C1tnkEgM.d.ts.map +0 -1
- package/dist/types-IXD2HJzu.js.map +0 -1
- package/dist/usage-receipt-Cx3xNeyB.js +0 -76
- package/dist/usage-receipt-Cx3xNeyB.js.map +0 -1
- package/dist/verdict-Dl0tiT1X.js.map +0 -1
- package/dist/verdict-cache-Bm8EKL2s.js.map +0 -1
- package/docs/design/self-improvement-evidence-audit.md +0 -263
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integrity-C8oUeB0g.js","names":["transcriptIssues","transcriptIssues"],"sources":["../src/supervisor-run/integrity-issues.ts","../src/supervisor-run/integrity-steer.ts","../src/supervisor-run/integrity-transcript.ts","../src/supervisor-run/integrity-source.ts","../src/supervisor-run/integrity-tree.ts","../src/supervisor-run/integrity-types.ts","../src/supervisor-run/rollout-nodes.ts","../src/supervisor-run/integrity.ts"],"sourcesContent":["import type { SupervisorRunIntegrityEvidence, SupervisorRunIntegrityIssue } from './integrity-types'\n\nexport const MAX_EXAMPLES = 20\n\nexport function evidence(path: string, value: unknown): SupervisorRunIntegrityEvidence {\n return { path, value }\n}\n\nexport function issue(\n init: Omit<SupervisorRunIntegrityIssue, 'evidence'> & {\n evidence?: readonly SupervisorRunIntegrityEvidence[]\n },\n): SupervisorRunIntegrityIssue {\n return { ...init, evidence: init.evidence ?? [] }\n}\n","import { evidence, issue, MAX_EXAMPLES } from './integrity-issues'\nimport type { JoinedWorker } from './integrity-source'\nimport type { SupervisorRunIntegrityIssue } from './integrity-types'\n\nfunction idListDetail(ids: readonly string[]): string {\n const examples = ids\n .slice(0, MAX_EXAMPLES)\n .map((id) => JSON.stringify(id))\n .join(', ')\n return ids.length <= MAX_EXAMPLES\n ? examples\n : `${examples}, and ${ids.length - MAX_EXAMPLES} more`\n}\n\nexport function steerIssues(\n joined: JoinedWorker,\n rootCompleted: boolean,\n): SupervisorRunIntegrityIssue[] {\n const { facts } = joined\n const subject = facts.workerId ?? joined.spawn.id\n const prefix = `workers/${facts.sourceIndex}`\n const out: SupervisorRunIntegrityIssue[] = []\n if (\n !facts.inboxCaptured ||\n !facts.eventsCaptured ||\n facts.inboxInvalidRows > 0 ||\n facts.eventsInvalidRows > 0\n ) {\n const missing = [\n ...(facts.inboxCaptured ? [] : ['inbox']),\n ...(facts.eventsCaptured ? [] : ['events']),\n ]\n const malformed = [\n ...(facts.inboxInvalidRows > 0 ? [`inbox:${facts.inboxInvalidRows}`] : []),\n ...(facts.eventsInvalidRows > 0 ? [`events:${facts.eventsInvalidRows}`] : []),\n ]\n out.push(\n issue({\n code: 'worker-controls-unavailable',\n area: 'capture-integrity',\n severity: 'medium',\n subject,\n claim:\n 'Steer delivery integrity is unavailable for a worker with missing control artifacts',\n detail:\n missing.length > 0\n ? `${JSON.stringify(subject)} is missing ${missing.join(' and ')}.`\n : `${JSON.stringify(subject)} has malformed control rows (${malformed.join(', ')}).`,\n evidence: [\n ...missing.map((artifact) => evidence(`${prefix}/${artifact}`, null)),\n ...(facts.inboxInvalidRows > 0\n ? [evidence(`${prefix}/inbox/malformed-rows/count`, facts.inboxInvalidRows)]\n : []),\n ...(facts.eventsInvalidRows > 0\n ? [evidence(`${prefix}/events/malformed-rows/count`, facts.eventsInvalidRows)]\n : []),\n ],\n recommendedAction:\n 'Retain both control artifacts and repair malformed rows before correlating requests.',\n metadata: {\n assessment: 'unavailable',\n missing_artifacts: missing,\n malformed_rows: malformed,\n },\n }),\n )\n return out\n }\n\n const requestsById = new Map<string, typeof facts.steerRequests>()\n const unidentifiedRequests = facts.steerRequests.filter((request) => request.requestId === null)\n for (const request of facts.steerRequests) {\n if (request.requestId === null) continue\n const rows = requestsById.get(request.requestId) ?? []\n rows.push(request)\n requestsById.set(request.requestId, rows)\n }\n if (unidentifiedRequests.length > 0) {\n out.push(\n issue({\n code: 'steer-request-id-unavailable',\n area: 'capture-integrity',\n severity: 'high',\n subject,\n claim: 'Some queued steer requests cannot be correlated because their ids are missing',\n detail: `${unidentifiedRequests.length} queued request(s) omit id.`,\n evidence: unidentifiedRequests\n .slice(0, MAX_EXAMPLES)\n .map((request) => evidence(`${prefix}/inbox/${request.row}/id`, null)),\n recommendedAction: 'Assign one stable request id before appending a steer to the inbox.',\n metadata: { assessment: 'unavailable', unavailable_count: unidentifiedRequests.length },\n }),\n )\n }\n const duplicateRequestIds = [...requestsById]\n .filter(([, rows]) => rows.length > 1)\n .map(([id]) => id)\n if (duplicateRequestIds.length > 0) {\n out.push(\n issue({\n code: 'duplicate-steer-request-id',\n area: 'control-integrity',\n severity: 'high',\n subject,\n claim: 'A worker inbox contains duplicate steer request ids',\n detail: `${duplicateRequestIds.length} duplicate id(s): ${idListDetail(duplicateRequestIds)}.`,\n evidence: [\n evidence(\n `${prefix}/inbox/duplicate-request-ids`,\n duplicateRequestIds.slice(0, MAX_EXAMPLES),\n ),\n ],\n recommendedAction: 'Generate a unique request id for every queued steer.',\n }),\n )\n }\n\n const acknowledgementsById = new Map<string, typeof facts.steerAcknowledgements>()\n const unidentifiedAcks = facts.steerAcknowledgements.filter((ack) => ack.requestId === null)\n for (const ack of facts.steerAcknowledgements) {\n if (ack.requestId === null) continue\n const rows = acknowledgementsById.get(ack.requestId) ?? []\n rows.push(ack)\n acknowledgementsById.set(ack.requestId, rows)\n }\n if (unidentifiedAcks.length > 0) {\n out.push(\n issue({\n code: 'steer-ack-id-unavailable',\n area: 'capture-integrity',\n severity: 'high',\n subject,\n claim: 'Some steer acknowledgements cannot be correlated because requestId is missing',\n detail: `${unidentifiedAcks.length} down-leg event(s) omit requestId.`,\n evidence: unidentifiedAcks\n .slice(0, MAX_EXAMPLES)\n .map((ack) => evidence(`${prefix}/events/${ack.row}/requestId`, null)),\n recommendedAction: 'Echo the queued request id on every worker acknowledgement.',\n metadata: { assessment: 'unavailable', unavailable_count: unidentifiedAcks.length },\n }),\n )\n }\n\n const unknownAckIds = [...acknowledgementsById.keys()].filter((id) => !requestsById.has(id))\n if (unknownAckIds.length > 0) {\n out.push(\n issue({\n code: 'unknown-steer-ack',\n area: 'control-integrity',\n severity: 'high',\n subject,\n claim: 'A worker acknowledged steer request ids absent from its captured inbox',\n detail: `${unknownAckIds.length} unknown id(s): ${idListDetail(unknownAckIds)}.`,\n evidence: [\n evidence(`${prefix}/events/unknown-request-ids`, unknownAckIds.slice(0, MAX_EXAMPLES)),\n ],\n recommendedAction:\n 'Reject acknowledgements whose request id was not queued for this worker.',\n }),\n )\n }\n\n const duplicateAckIds = [...acknowledgementsById]\n .filter(([, rows]) => rows.length > 1)\n .map(([id]) => id)\n if (duplicateAckIds.length > 0) {\n out.push(\n issue({\n code: 'duplicate-steer-ack',\n area: 'control-integrity',\n severity: 'high',\n subject,\n claim: 'A worker emitted duplicate acknowledgements for steer request ids',\n detail: `${duplicateAckIds.length} duplicated id(s): ${idListDetail(duplicateAckIds)}.`,\n evidence: [\n evidence(\n `${prefix}/events/duplicate-request-ids`,\n duplicateAckIds.slice(0, MAX_EXAMPLES),\n ),\n ],\n recommendedAction: 'Make steer acknowledgement append idempotent by request id.',\n }),\n )\n }\n\n const missingAckIds = [...requestsById.keys()].filter((id) => !acknowledgementsById.has(id))\n if (rootCompleted && missingAckIds.length > 0) {\n out.push(\n issue({\n code: 'missing-steer-ack',\n area: 'control-integrity',\n severity: 'high',\n subject,\n claim: 'A completed supervisor run has queued steer requests without acknowledgements',\n detail: `${missingAckIds.length}/${requestsById.size} request id(s) are unacknowledged: ${idListDetail(missingAckIds)}.`,\n evidence: [\n evidence(\n `${prefix}/inbox/unacknowledged-request-ids`,\n missingAckIds.slice(0, MAX_EXAMPLES),\n ),\n ],\n recommendedAction:\n 'Record one delivered or failed acknowledgement for every queued request id.',\n }),\n )\n }\n\n const statusUnavailableIds: string[] = []\n const notDeliveredIds: string[] = []\n for (const [id, acknowledgements] of acknowledgementsById) {\n if (!requestsById.has(id) || acknowledgements.length !== 1) continue\n const delivered = acknowledgements[0]?.delivered\n if (delivered === null || delivered === undefined) statusUnavailableIds.push(id)\n else if (!delivered) notDeliveredIds.push(id)\n }\n if (statusUnavailableIds.length > 0) {\n out.push(\n issue({\n code: 'steer-ack-status-unavailable',\n area: 'capture-integrity',\n severity: 'high',\n subject,\n claim: 'Some steer acknowledgements omit delivery status',\n detail: `${statusUnavailableIds.length} id(s): ${idListDetail(statusUnavailableIds)}.`,\n evidence: [\n evidence(\n `${prefix}/events/status-unavailable-request-ids`,\n statusUnavailableIds.slice(0, MAX_EXAMPLES),\n ),\n ],\n recommendedAction: 'Record delivered: true or delivered: false on each acknowledgement.',\n metadata: { assessment: 'unavailable', unavailable_count: statusUnavailableIds.length },\n }),\n )\n }\n if (notDeliveredIds.length > 0) {\n out.push(\n issue({\n code: 'steer-not-delivered',\n area: 'control-integrity',\n severity: 'high',\n subject,\n claim: 'Queued steer requests were acknowledged but not delivered',\n detail: `${notDeliveredIds.length} id(s): ${idListDetail(notDeliveredIds)}.`,\n evidence: [\n evidence(\n `${prefix}/events/not-delivered-request-ids`,\n notDeliveredIds.slice(0, MAX_EXAMPLES),\n ),\n ],\n recommendedAction:\n 'Retry or explicitly fail the control request instead of treating it as delivered.',\n }),\n )\n }\n return out\n}\n","import { evidence, issue, MAX_EXAMPLES } from './integrity-issues'\nimport type { SupervisorRunIntegrityIssue } from './integrity-types'\nimport type { SupervisorTreeFacts } from './source-facts'\nimport type { SupervisorRunSources, WorkerLogSource } from './types'\n\n/**\n * Transcript coverage a tree row cannot show: turns a closed worker dispatched whose record was\n * not retained, and native harness sessions the store has no copy of. Both are judged only for\n * workers with a terminal event, because a live worker's current turn and session are still\n * being written. A worker whose store records neither fact is not counted either way.\n */\nexport function transcriptIssues(\n source: SupervisorRunSources,\n facts: SupervisorTreeFacts,\n): SupervisorRunIntegrityIssue[] {\n if (source.workers === null) return []\n const closed = new Set(facts.closes.map((close) => close.id).filter((id) => id.length > 0))\n const closedWorkers = source.workers.filter(\n (worker): worker is WorkerLogSource & { workerId: string } =>\n worker.workerId !== undefined && closed.has(worker.workerId),\n )\n const out: SupervisorRunIntegrityIssue[] = []\n\n const lost = closedWorkers.flatMap((worker) => {\n const turns = worker.turns\n if (turns == null || turns.retained >= turns.dispatched) return []\n return [{ id: worker.workerId, lost: turns.dispatched - turns.retained, turns }]\n })\n if (lost.length > 0) {\n const lostTurns = lost.reduce((sum, row) => sum + row.lost, 0)\n out.push(\n issue({\n code: 'transcript-incomplete',\n area: 'capture-integrity',\n severity: 'medium',\n subject: 'turn-transcripts',\n claim: 'Some closed workers dispatched turns whose record was not retained',\n detail: `${lost.length}/${closedWorkers.length} closed worker(s) lost ${lostTurns} dispatched turn record(s).`,\n evidence: [\n evidence('capture/lost-turns/count', lostTurns),\n ...lost\n .slice(0, MAX_EXAMPLES)\n .map((row) => evidence(`workers/${encodeURIComponent(row.id)}/turns`, row.turns)),\n ],\n recommendedAction:\n \"Persist each turn's output before the worker settles, including a turn that ends in failure.\",\n metadata: {\n assessment: 'unavailable',\n unavailable_count: lost.length,\n lost_turns: lostTurns,\n },\n }),\n )\n }\n\n const unavailable = closedWorkers.flatMap((worker) =>\n worker.nativeSession?.status === 'unavailable'\n ? [{ id: worker.workerId, reason: worker.nativeSession.reason }]\n : [],\n )\n if (unavailable.length > 0) {\n const reasons: Record<string, number> = {}\n for (const row of unavailable) reasons[row.reason] = (reasons[row.reason] ?? 0) + 1\n out.push(\n issue({\n code: 'native-session-unavailable',\n area: 'capture-integrity',\n severity: 'medium',\n subject: 'native-harness-sessions',\n claim: 'Some closed workers have no retained native harness session',\n detail: `${unavailable.length}/${closedWorkers.length} closed worker(s) have no native session; reasons: ${Object.entries(\n reasons,\n )\n .map(([reason, count]) => `${reason} ${count}`)\n .join(', ')}. What their harness-native subagents did is unobserved.`,\n evidence: [\n evidence('capture/native-sessions-unavailable/reasons', reasons),\n ...unavailable\n .slice(0, MAX_EXAMPLES)\n .map((row) =>\n evidence(`workers/${encodeURIComponent(row.id)}/nativeSession/reason`, row.reason),\n ),\n ],\n recommendedAction:\n 'Capture the harness session store from the box before it is released, at the path the harness actually wrote.',\n metadata: { assessment: 'unavailable', unavailable_count: unavailable.length, reasons },\n }),\n )\n }\n return out\n}\n","import { evidence, issue, MAX_EXAMPLES } from './integrity-issues'\nimport { steerIssues } from './integrity-steer'\nimport { transcriptIssues } from './integrity-transcript'\nimport type { SupervisorRunIntegrityIssue } from './integrity-types'\nimport type { SpawnRow, SupervisorTreeFacts, WorkerLogFacts } from './source-facts'\nimport type { SupervisorRunSources, SupervisorRunTree } from './types'\n\nfunction sourceIdentityIssues(facts: SupervisorTreeFacts): SupervisorRunIntegrityIssue[] {\n const out: SupervisorRunIntegrityIssue[] = []\n const malformedSpawns = facts.spawns.filter((spawn) => !spawn.valid)\n if (facts.journalInvalidRows > 0 || malformedSpawns.length > 0) {\n out.push(\n issue({\n code: 'source-row-malformed',\n area: 'capture-integrity',\n severity: 'high',\n subject: 'journal-rows',\n claim: 'Some supervisor journal rows could not be interpreted',\n detail: `${facts.journalInvalidRows} of ${facts.journalRows} row(s) could not be interpreted (${facts.journalMalformedJsonRows} were not JSON objects) and ${malformedSpawns.length} malformed spawn row(s) were excluded from structural conclusions.`,\n evidence: [\n evidence('journal/uninterpretable-rows/count', facts.journalInvalidRows),\n evidence('journal/malformed-json-rows/count', facts.journalMalformedJsonRows),\n evidence('journal/rows/count', facts.journalRows),\n evidence('journal/dialect', facts.journalDialect),\n ...malformedSpawns\n .slice(0, MAX_EXAMPLES)\n .map((spawn) =>\n evidence(`journal/spawns/${spawn.sourceRow}/invalid-fields`, spawn.invalidFields),\n ),\n ],\n recommendedAction:\n 'Repair the rows, or teach the parser the shape they are in, before using the run for structural analysis. A row nobody can read must never be silently absent from the tree.',\n metadata: {\n assessment: 'unavailable',\n journal_rows: facts.journalRows,\n uninterpretable_rows: facts.journalInvalidRows,\n malformed_json_rows: facts.journalMalformedJsonRows,\n malformed_spawn_rows: malformedSpawns.length,\n journal_dialect: facts.journalDialect,\n },\n }),\n )\n }\n const unidentifiedSpawns = malformedSpawns.filter((spawn) => spawn.id.length === 0)\n const unidentifiedCloses = facts.closes.filter((close) => close.id.length === 0)\n if (unidentifiedSpawns.length + unidentifiedCloses.length > 0) {\n out.push(\n issue({\n code: 'source-event-identity-unavailable',\n area: 'capture-integrity',\n severity: 'high',\n subject: 'journal-event-identity',\n claim: 'Some supervisor journal events have no usable invocation id',\n detail: `${unidentifiedSpawns.length} spawn and ${unidentifiedCloses.length} terminal event(s) lack an id.`,\n evidence: [\n evidence('journal/unidentified-spawns/count', unidentifiedSpawns.length),\n evidence('journal/unidentified-terminals/count', unidentifiedCloses.length),\n ],\n recommendedAction: 'Reject or repair control events that omit their stable invocation id.',\n metadata: { assessment: 'unavailable', checks: ['journal-event-linkage'] },\n }),\n )\n }\n\n const spawnCounts = new Map<string, number>()\n for (const spawn of facts.spawns) {\n if (!spawn.valid || spawn.id.length === 0) continue\n spawnCounts.set(spawn.id, (spawnCounts.get(spawn.id) ?? 0) + 1)\n }\n for (const [id, count] of spawnCounts) {\n if (count < 2) continue\n out.push(\n issue({\n code: 'duplicate-spawn',\n area: 'control-integrity',\n severity: 'critical',\n subject: id,\n claim: 'An invocation has more than one spawned control event',\n detail: `${count} spawned events name invocation ${JSON.stringify(id)}.`,\n evidence: [evidence(`journal/spawn-count/${encodeURIComponent(id)}`, count)],\n recommendedAction: 'Make spawn event append idempotent.',\n }),\n )\n }\n\n const closeCounts = new Map<string, number>()\n for (const close of facts.closes) {\n if (close.id.length === 0) continue\n closeCounts.set(close.id, (closeCounts.get(close.id) ?? 0) + 1)\n }\n const uncertainSpawnIds = new Set(\n malformedSpawns.filter((spawn) => spawn.id.length > 0).map((spawn) => spawn.id),\n )\n if (unidentifiedSpawns.length === 0 && facts.journalInvalidRows === 0) {\n const orphanCloses = new Map<string, Array<(typeof facts.closes)[number]>>()\n for (const close of facts.closes) {\n if (close.id.length === 0 || spawnCounts.has(close.id) || uncertainSpawnIds.has(close.id)) {\n continue\n }\n const rows = orphanCloses.get(close.id) ?? []\n rows.push(close)\n orphanCloses.set(close.id, rows)\n }\n for (const [id, closes] of orphanCloses) {\n out.push(\n issue({\n code: 'orphan-terminal',\n area: 'control-integrity',\n severity: 'critical',\n subject: id,\n claim: 'A terminal control event names an invocation that was never spawned',\n detail: `${closes.length} terminal event(s) for ${JSON.stringify(id)} have no matching spawn.`,\n evidence: [\n evidence(`journal/closes/${encodeURIComponent(id)}/count`, closes.length),\n ...closes\n .slice(0, MAX_EXAMPLES)\n .map((close, index) =>\n evidence(`journal/closes/${encodeURIComponent(id)}/${index}`, close),\n ),\n ],\n recommendedAction: 'Retain the matching spawn event or reject the orphan terminal event.',\n }),\n )\n }\n }\n for (const [id, count] of closeCounts) {\n if (count < 2) continue\n out.push(\n issue({\n code: 'duplicate-terminal',\n area: 'control-integrity',\n severity: 'critical',\n subject: id,\n claim: 'An invocation has more than one terminal control event',\n detail: `${count} settled/cancelled events name invocation ${JSON.stringify(id)}.`,\n evidence: [evidence(`journal/terminal-count/${encodeURIComponent(id)}`, count)],\n recommendedAction: 'Make terminal event append idempotent.',\n }),\n )\n }\n return out\n}\n\nexport interface JoinedWorker {\n readonly spawn: SpawnRow\n readonly facts: WorkerLogFacts\n}\n\nfunction joinWorkerControls(facts: SupervisorTreeFacts): {\n joined: JoinedWorker[]\n issue: SupervisorRunIntegrityIssue | null\n} {\n const spawnsById = new Map<string, SpawnRow[]>()\n const spawnsByLabel = new Map<string, SpawnRow[]>()\n for (const spawn of facts.workerSpawns) {\n const ids = spawnsById.get(spawn.id) ?? []\n ids.push(spawn)\n spawnsById.set(spawn.id, ids)\n const labels = spawnsByLabel.get(spawn.label) ?? []\n labels.push(spawn)\n spawnsByLabel.set(spawn.label, labels)\n }\n const rowsWithoutIdByLabel = new Map<string, WorkerLogFacts[]>()\n for (const row of facts.workerLogRows) {\n if (row.workerId !== null && row.workerId.length > 0) continue\n const matches = rowsWithoutIdByLabel.get(row.label) ?? []\n matches.push(row)\n rowsWithoutIdByLabel.set(row.label, matches)\n }\n\n const rowsBySpawn = new Map<string, WorkerLogFacts[]>()\n const unmatchedRows: number[] = []\n const ambiguousRows: number[] = []\n for (const row of facts.workerLogRows) {\n const matches =\n row.workerId !== null && row.workerId.length > 0\n ? (spawnsById.get(row.workerId) ?? [])\n : (rowsWithoutIdByLabel.get(row.label)?.length ?? 0) === 1\n ? (spawnsByLabel.get(row.label) ?? [])\n : []\n if (matches.length === 0) {\n unmatchedRows.push(row.sourceIndex)\n continue\n }\n if (matches.length !== 1) {\n ambiguousRows.push(row.sourceIndex)\n continue\n }\n const spawn = matches[0] as SpawnRow\n const joined = rowsBySpawn.get(spawn.id) ?? []\n joined.push(row)\n rowsBySpawn.set(spawn.id, joined)\n }\n\n const joined: JoinedWorker[] = []\n const missingSpawnIds: string[] = []\n const duplicateSpawnIds: string[] = []\n for (const spawn of facts.workerSpawns) {\n if ((spawnsById.get(spawn.id)?.length ?? 0) !== 1) continue\n const rows = rowsBySpawn.get(spawn.id) ?? []\n if (rows.length === 0) missingSpawnIds.push(spawn.id)\n else if (rows.length > 1) duplicateSpawnIds.push(spawn.id)\n else joined.push({ spawn, facts: rows[0] as WorkerLogFacts })\n }\n\n if (\n missingSpawnIds.length === 0 &&\n duplicateSpawnIds.length === 0 &&\n unmatchedRows.length === 0 &&\n ambiguousRows.length === 0\n ) {\n return { joined, issue: null }\n }\n return {\n joined,\n issue: issue({\n code: 'worker-control-join-unavailable',\n area: 'capture-integrity',\n severity: 'high',\n subject: 'worker-control-join',\n claim: 'Worker control-log coverage does not match recorded child invocations',\n detail: `${missingSpawnIds.length} spawn(s) have no log, ${duplicateSpawnIds.length} have duplicate logs, ${unmatchedRows.length} log row(s) match no spawn, and ${ambiguousRows.length} row(s) are ambiguous.`,\n evidence: [\n evidence('workers/join/missing-spawn-ids', missingSpawnIds.slice(0, MAX_EXAMPLES)),\n evidence('workers/join/duplicate-spawn-ids', duplicateSpawnIds.slice(0, MAX_EXAMPLES)),\n evidence('workers/join/unmatched-source-rows', unmatchedRows.slice(0, MAX_EXAMPLES)),\n evidence('workers/join/ambiguous-source-rows', ambiguousRows.slice(0, MAX_EXAMPLES)),\n ],\n recommendedAction:\n 'Retain exactly one worker control row with workerId for every spawned invocation.',\n metadata: {\n assessment: 'unavailable',\n missing_count: missingSpawnIds.length,\n duplicate_count: duplicateSpawnIds.length,\n unmatched_count: unmatchedRows.length,\n ambiguous_count: ambiguousRows.length,\n },\n }),\n }\n}\n\nexport function sourceIssues(\n source: SupervisorRunSources,\n facts: SupervisorTreeFacts,\n tree: SupervisorRunTree,\n): SupervisorRunIntegrityIssue[] {\n const out = sourceIdentityIssues(facts)\n if (source.workers === null) {\n const reason = source.workersMissingReason ?? 'worker control-log store was not captured'\n out.push(\n issue({\n code: 'worker-controls-unavailable',\n area: 'capture-integrity',\n severity: 'medium',\n subject: 'steer-delivery',\n claim:\n 'Steer delivery integrity is unavailable because worker control logs were not captured',\n detail: reason,\n evidence: [evidence('sources/workers', null)],\n recommendedAction: 'Retain each worker inbox and event stream.',\n metadata: { assessment: 'unavailable', reason },\n }),\n )\n return out\n }\n\n out.push(...transcriptIssues(source, facts))\n const joined = joinWorkerControls(facts)\n if (joined.issue !== null) out.push(joined.issue)\n const rootCompleted =\n tree.rootId !== null &&\n tree.nodes.filter((node) => node.rollout_id === tree.rootId).length === 1 &&\n tree.nodes.find((node) => node.rollout_id === tree.rootId)?.outcome.is_completed === true\n for (const row of joined.joined) out.push(...steerIssues(row, rootCompleted))\n return out\n}\n","import { isRecord } from '../llm-client/json'\nimport { validateRolloutLine } from '../rollout/schema'\nimport { evidence, issue, MAX_EXAMPLES } from './integrity-issues'\nimport type { SupervisorRunIntegrityEvidence, SupervisorRunIntegrityIssue } from './integrity-types'\nimport { nonEmptyString } from './source-facts'\nimport type { SupervisorRunTree } from './types'\n\ninterface NodeRecord {\n readonly index: number\n readonly raw: Record<string, unknown>\n readonly errors: readonly string[]\n readonly id: string | null\n readonly parent: string | null | undefined\n readonly runId: string | null\n readonly role: string | null\n readonly messages: readonly unknown[] | null\n /** The row's declared transcript artifact; null when the source retained none. */\n readonly transcriptRef: string | null\n readonly profileId: string | null\n readonly completed: boolean | null\n readonly terminal: boolean | null\n}\n\nfunction parentValue(raw: Record<string, unknown>): string | null | undefined {\n if (raw.parent_rollout_id === null) return null\n return nonEmptyString(raw.parent_rollout_id) ?? undefined\n}\n\nfunction terminalValue(outcome: Record<string, unknown> | null): boolean | null {\n if (outcome === null) return null\n if (typeof outcome.is_completed !== 'boolean' || typeof outcome.is_truncated !== 'boolean') {\n return null\n }\n if (outcome.error !== null && typeof outcome.error !== 'string') return null\n return outcome.is_completed || outcome.is_truncated || outcome.error !== null\n}\n\nfunction nodeRecord(value: unknown, index: number): NodeRecord {\n const raw = isRecord(value) ? value : {}\n const policy = isRecord(raw.policy) ? raw.policy : null\n const outcome = isRecord(raw.outcome) ? raw.outcome : null\n const artifacts = isRecord(raw.artifacts) ? raw.artifacts : null\n return {\n index,\n raw,\n errors: validateRolloutLine(value),\n id: nonEmptyString(raw.rollout_id),\n parent: parentValue(raw),\n runId: nonEmptyString(raw.run_id),\n role: nonEmptyString(raw.role),\n messages: Array.isArray(raw.messages) ? raw.messages : null,\n transcriptRef: artifacts === null ? null : nonEmptyString(artifacts.transcript_ref),\n profileId: policy === null ? null : nonEmptyString(policy.agent_profile_cell_id),\n completed:\n outcome !== null && typeof outcome.is_completed === 'boolean' ? outcome.is_completed : null,\n terminal: terminalValue(outcome),\n }\n}\n\nfunction metric(\n record: NodeRecord,\n keys: readonly string[],\n): { key: string; value: number } | null {\n const outcome = isRecord(record.raw.outcome) ? record.raw.outcome : null\n const metrics = outcome !== null && isRecord(outcome.metrics) ? outcome.metrics : null\n if (metrics === null) return null\n for (const key of keys) {\n const value = metrics[key]\n if (typeof value === 'number' && Number.isFinite(value)) return { key, value }\n }\n return null\n}\n\nfunction nodeEvidence(\n record: NodeRecord,\n path: string,\n value: unknown,\n): SupervisorRunIntegrityEvidence {\n const key = record.id ?? `index-${record.index}`\n return evidence(`nodes/${encodeURIComponent(key)}/${path}`, value)\n}\n\nfunction unavailableNodeChecks(record: NodeRecord): string[] {\n const checks: string[] = []\n if (record.id === null) checks.push('identity', 'root-membership', 'parent-link', 'cycle')\n if (record.parent === undefined) checks.push('parent-link', 'cycle')\n if (record.runId === null) checks.push('cross-run-parent')\n if (record.role === null) checks.push('root-role')\n if (!isRecord(record.raw.outcome)) checks.push('timing', 'terminal-state')\n return [...new Set(checks)]\n}\n\ninterface TreeIssueUncertainty {\n readonly unknownIdentityRows?: number\n readonly uncertainIds?: ReadonlySet<string>\n}\n\n/** What the checks share about one tree: its node rows, the rows by id, and how many rows have no usable id. */\ninterface TreeView {\n tree: SupervisorRunTree\n uncertainty: TreeIssueUncertainty\n records: NodeRecord[]\n byId: Map<string, NodeRecord[]>\n unique: (NodeRecord & { readonly id: string })[]\n unknownIdentityRows: number\n}\n\nfunction buildTreeView(tree: SupervisorRunTree, uncertainty: TreeIssueUncertainty): TreeView {\n const records = (tree.nodes as readonly unknown[]).map(nodeRecord)\n const malformedSourceRows = tree.gaps\n .filter((gap) => gap.code === 'source-row-malformed')\n .reduce((count, gap) => count + (gap.count ?? 1), 0)\n\n const byId = new Map<string, NodeRecord[]>()\n for (const record of records) {\n if (record.id === null) continue\n const matches = byId.get(record.id) ?? []\n matches.push(record)\n byId.set(record.id, matches)\n }\n\n const unknownIdentityRows =\n records.filter((record) => record.id === null).length +\n Math.max(malformedSourceRows, uncertainty.unknownIdentityRows ?? 0)\n const unique = records.filter(\n (record): record is NodeRecord & { readonly id: string } =>\n record.id !== null && byId.get(record.id)?.length === 1,\n )\n\n return { tree, uncertainty, records, byId, unique, unknownIdentityRows }\n}\n\n/** Nodes that fail canonical rollout validation, and the checks that cannot run for them. */\nfunction schemaIssues(view: TreeView): SupervisorRunIntegrityIssue[] {\n const { records } = view\n const out: SupervisorRunIntegrityIssue[] = []\n for (const record of records) {\n if (record.errors.length === 0) continue\n out.push(\n issue({\n code: 'node-schema-invalid',\n area: 'capture-integrity',\n severity: 'high',\n subject: record.id ?? `node-${record.index}`,\n claim: 'A supervisor-tree node fails canonical rollout validation',\n detail: record.errors.join('; '),\n evidence: [evidence(`nodes/${record.index}/validation`, record.errors)],\n recommendedAction:\n 'Fix the producer so every node validates as the existing tangle.rollout.v1 shape before analysis.',\n metadata: { validation_errors: record.errors },\n }),\n )\n const unavailableChecks = unavailableNodeChecks(record)\n if (unavailableChecks.length === 0) continue\n out.push(\n issue({\n code: 'node-checks-unavailable',\n area: 'capture-integrity',\n severity: 'medium',\n subject: record.id ?? `node-${record.index}`,\n claim: 'Some integrity checks are unavailable for a malformed supervisor-tree node',\n detail: `Unavailable checks: ${unavailableChecks.join(', ')}.`,\n evidence: [evidence(`nodes/${record.index}/unavailable-checks`, unavailableChecks)],\n recommendedAction:\n 'Retain the named identity and relationship fields with their canonical types.',\n metadata: { assessment: 'unavailable', checks: unavailableChecks },\n }),\n )\n }\n return out\n}\n\n/** Rollout ids claimed by more than one node. */\nfunction duplicateIdIssues(view: TreeView): SupervisorRunIntegrityIssue[] {\n const { byId } = view\n const out: SupervisorRunIntegrityIssue[] = []\n for (const [rolloutId, matches] of byId) {\n if (matches.length < 2) continue\n out.push(\n issue({\n code: 'duplicate-rollout-id',\n area: 'control-integrity',\n severity: 'critical',\n subject: rolloutId,\n claim: 'A rollout id is duplicated within one supervisor tree',\n detail: `${matches.length} nodes claim rollout_id ${JSON.stringify(rolloutId)}, so references are ambiguous.`,\n evidence: [\n evidence(`duplicates/${encodeURIComponent(rolloutId)}/count`, matches.length),\n ...matches.slice(0, MAX_EXAMPLES).map((record) =>\n evidence(`nodes/${record.index}/identity`, {\n rollout_id: record.id,\n parent_rollout_id: record.parent,\n role: record.role,\n }),\n ),\n ],\n recommendedAction: 'Give every invocation one stable rollout id and regenerate the tree.',\n }),\n )\n }\n return out\n}\n\n/** Whether the declared root exists and is unambiguous; returns the root row when it does. */\nfunction rootIssues(view: TreeView): {\n issues: SupervisorRunIntegrityIssue[]\n root: NodeRecord | undefined\n} {\n const { tree, records, byId, unknownIdentityRows } = view\n const out: SupervisorRunIntegrityIssue[] = []\n let root: NodeRecord | undefined\n if (tree.rootId === null) {\n out.push(\n issue({\n code: 'root-unavailable',\n area: 'capture-integrity',\n severity: 'high',\n subject: 'tree-root',\n claim: 'The supervisor-tree root is unavailable',\n detail: `rootId is null while ${records.length} node row(s) were captured.`,\n evidence: [evidence('rootId', null)],\n recommendedAction: 'Capture the root spawned event and preserve its rollout id as rootId.',\n metadata: { assessment: 'unavailable', node_rows: records.length },\n }),\n )\n } else {\n const rootRows = byId.get(tree.rootId) ?? []\n if (rootRows.length === 1) {\n root = rootRows[0]\n } else if (rootRows.length === 0 && unknownIdentityRows > 0) {\n out.push(\n issue({\n code: 'node-checks-unavailable',\n area: 'capture-integrity',\n severity: 'high',\n subject: tree.rootId,\n claim: 'Root membership is unavailable because a malformed node lost its rollout id',\n detail: `${unknownIdentityRows} malformed node row(s) have no usable rollout_id, so absence of root ${JSON.stringify(tree.rootId)} cannot be established.`,\n evidence: [evidence('rootId', tree.rootId)],\n recommendedAction: 'Retain rollout_id even when another node field fails validation.',\n metadata: { assessment: 'unavailable', checks: ['root-membership'] },\n }),\n )\n } else if (rootRows.length === 0) {\n out.push(\n issue({\n code: 'declared-root-missing',\n area: 'control-integrity',\n severity: 'critical',\n subject: tree.rootId,\n claim: 'The declared supervisor-tree root has no matching invocation node',\n detail: `rootId ${JSON.stringify(tree.rootId)} is absent from ${records.length} node row(s).`,\n evidence: [evidence('rootId', tree.rootId)],\n recommendedAction: 'Restore the root rollout row or correct rootId.',\n }),\n )\n }\n }\n\n return { issues: out, root }\n}\n\n/** The root must be parentless and labeled a supervisor. */\nfunction rootShapeIssues(\n view: TreeView,\n root: NodeRecord | undefined,\n): SupervisorRunIntegrityIssue[] {\n const { tree } = view\n const out: SupervisorRunIntegrityIssue[] = []\n if (root !== undefined) {\n if (root.parent !== undefined && root.parent !== null) {\n out.push(\n issue({\n code: 'root-has-parent',\n area: 'control-integrity',\n severity: 'critical',\n subject: root.id ?? tree.rootId ?? 'tree-root',\n claim: 'The declared supervisor-tree root has a parent',\n detail: `Root points to parent ${JSON.stringify(root.parent)}.`,\n evidence: [nodeEvidence(root, 'parent_rollout_id', root.parent)],\n recommendedAction: 'Record the root with parent_rollout_id null.',\n }),\n )\n }\n if (root.role !== null && root.role !== 'supervisor') {\n out.push(\n issue({\n code: 'root-role-invalid',\n area: 'control-integrity',\n severity: 'high',\n subject: root.id ?? tree.rootId ?? 'tree-root',\n claim: 'The declared supervisor-tree root is not labeled as a supervisor',\n detail: `Root has role ${JSON.stringify(root.role)}.`,\n evidence: [nodeEvidence(root, 'role', root.role)],\n recommendedAction:\n 'Preserve the root invocation role as supervisor when minting rollout rows.',\n }),\n )\n }\n }\n return out\n}\n\n/** Parent-child edges: detached nodes, missing parents, cross-run edges and impossible orderings. */\nfunction edgeIssues(view: TreeView): SupervisorRunIntegrityIssue[] {\n const { tree, uncertainty, byId, unique, unknownIdentityRows } = view\n const out: SupervisorRunIntegrityIssue[] = []\n for (const record of unique) {\n if (record.parent === undefined) continue\n if (record.parent === null) {\n if (record.id !== tree.rootId) {\n out.push(\n issue({\n code: 'detached-node',\n area: 'control-integrity',\n severity: 'critical',\n subject: record.id,\n claim: 'A non-root invocation is recorded as a detached parentless root',\n detail: `Node ${JSON.stringify(record.id)} is parentless while rootId is ${JSON.stringify(tree.rootId)}.`,\n evidence: [\n nodeEvidence(record, 'parent_rollout_id', null),\n evidence('rootId', tree.rootId),\n ],\n recommendedAction:\n 'Attach the invocation to its spawning parent or record a separate run.',\n }),\n )\n }\n continue\n }\n\n const parentRows = byId.get(record.parent) ?? []\n if (parentRows.length === 0) {\n if (unknownIdentityRows > 0 || uncertainty.uncertainIds?.has(record.parent) === true) {\n out.push(\n issue({\n code: 'node-checks-unavailable',\n area: 'capture-integrity',\n severity: 'high',\n subject: record.id,\n claim: 'Parent membership is unavailable because a malformed node lost its rollout id',\n detail:\n uncertainty.uncertainIds?.has(record.parent) === true\n ? `Parent ${JSON.stringify(record.parent)} appears only in a malformed source row, so its absence cannot be established.`\n : `Parent ${JSON.stringify(record.parent)} cannot be matched while ${unknownIdentityRows} row(s) have no usable rollout_id.`,\n evidence: [nodeEvidence(record, 'parent_rollout_id', record.parent)],\n recommendedAction: 'Retain rollout_id on every row before assessing detached children.',\n metadata: { assessment: 'unavailable', checks: ['parent-membership'] },\n }),\n )\n } else {\n out.push(\n issue({\n code: 'parent-missing',\n area: 'control-integrity',\n severity: 'critical',\n subject: record.id,\n claim: 'An invocation points to a parent absent from the supervisor tree',\n detail: `Node ${JSON.stringify(record.id)} names missing parent ${JSON.stringify(record.parent)}.`,\n evidence: [nodeEvidence(record, 'parent_rollout_id', record.parent)],\n recommendedAction: 'Retain the parent invocation or remove the dangling edge.',\n }),\n )\n }\n continue\n }\n if (parentRows.length !== 1) continue\n const parent = parentRows[0] as NodeRecord\n\n if (record.runId !== null && parent.runId !== null && record.runId !== parent.runId) {\n out.push(\n issue({\n code: 'cross-run-parent',\n area: 'control-integrity',\n severity: 'critical',\n subject: record.id,\n claim: 'A parent-child edge crosses supervisor-run identities',\n detail: `Child run_id ${JSON.stringify(record.runId)} differs from parent run_id ${JSON.stringify(parent.runId)}.`,\n evidence: [\n nodeEvidence(record, 'run_id', record.runId),\n nodeEvidence(parent, 'run_id', parent.runId),\n ],\n recommendedAction:\n 'Keep one run_id across a supervision tree or remove the cross-run edge.',\n }),\n )\n }\n\n const childStart = metric(record, ['spawned_at', 'started_at'])\n const parentStart = metric(parent, ['spawned_at', 'started_at'])\n if (childStart !== null && parentStart !== null && childStart.value < parentStart.value) {\n out.push(\n issue({\n code: 'child-before-parent',\n area: 'control-integrity',\n severity: 'high',\n subject: record.id,\n claim: 'A child invocation is timestamped before its parent started',\n detail: `Child ${childStart.key} ${childStart.value} precedes parent ${parentStart.key} ${parentStart.value}.`,\n evidence: [\n nodeEvidence(record, `outcome.metrics.${childStart.key}`, childStart.value),\n nodeEvidence(parent, `outcome.metrics.${parentStart.key}`, parentStart.value),\n ],\n recommendedAction: 'Use one ordered clock for spawn events or retain clock metadata.',\n }),\n )\n }\n\n const parentClose = metric(parent, ['settled_at', 'completed_at', 'finished_at'])\n if (childStart !== null && parentClose !== null && childStart.value > parentClose.value) {\n out.push(\n issue({\n code: 'child-after-parent-close',\n area: 'control-integrity',\n severity: 'critical',\n subject: record.id,\n claim: 'A child invocation is timestamped after its parent closed',\n detail: `Child ${childStart.key} ${childStart.value} follows parent ${parentClose.key} ${parentClose.value}.`,\n evidence: [\n nodeEvidence(record, `outcome.metrics.${childStart.key}`, childStart.value),\n nodeEvidence(parent, `outcome.metrics.${parentClose.key}`, parentClose.value),\n ],\n recommendedAction:\n 'Correct the causal timestamps or attach the child to its actual spawner.',\n }),\n )\n }\n }\n\n return out\n}\n\n/** Invocations timestamped as closing before they started. */\nfunction closeBeforeStartIssues(view: TreeView): SupervisorRunIntegrityIssue[] {\n const { unique } = view\n const out: SupervisorRunIntegrityIssue[] = []\n for (const record of unique) {\n const start = metric(record, ['spawned_at', 'started_at'])\n const close = metric(record, ['settled_at', 'completed_at', 'finished_at'])\n if (start === null || close === null || close.value >= start.value) continue\n out.push(\n issue({\n code: 'close-before-start',\n area: 'control-integrity',\n severity: 'high',\n subject: record.id,\n claim: 'An invocation is timestamped as closing before it started',\n detail: `${start.key} is ${start.value} and ${close.key} is ${close.value}.`,\n evidence: [\n nodeEvidence(record, `outcome.metrics.${start.key}`, start.value),\n nodeEvidence(record, `outcome.metrics.${close.key}`, close.value),\n ],\n recommendedAction: 'Correct the event ordering or retain clock-domain metadata.',\n }),\n )\n }\n\n return out\n}\n\n/** Parent cycles, each reported once. */\nfunction parentCycleIssues(view: TreeView): SupervisorRunIntegrityIssue[] {\n const { byId, unique } = view\n const out: SupervisorRunIntegrityIssue[] = []\n const emittedCycles = new Set<string>()\n const resolved = new Set<string>()\n for (const start of unique) {\n if (resolved.has(start.id)) continue\n const path: string[] = []\n const positions = new Map<string, number>()\n let current: string | null = start.id\n while (current !== null) {\n if (resolved.has(current)) break\n const position = positions.get(current)\n if (position !== undefined) {\n const cycle = path.slice(position)\n const key = [...cycle].sort().join('\\u0000')\n if (!emittedCycles.has(key)) {\n emittedCycles.add(key)\n out.push(\n issue({\n code: 'parent-cycle',\n area: 'control-integrity',\n severity: 'critical',\n subject: [...cycle].sort()[0] ?? 'cycle',\n claim: 'The supervisor tree contains a parent cycle',\n detail: `${cycle.join(' -> ')} -> ${cycle[0]}`,\n evidence: cycle.slice(0, MAX_EXAMPLES).flatMap((id) => {\n const rows = byId.get(id)\n const record = rows?.length === 1 ? rows[0] : undefined\n return record === undefined\n ? []\n : [nodeEvidence(record, 'parent_rollout_id', record.parent)]\n }),\n recommendedAction:\n 'Correct parent ids at ingestion; a cyclic graph is not a run tree.',\n }),\n )\n }\n break\n }\n positions.set(current, path.length)\n path.push(current)\n const rows = byId.get(current)\n if (rows?.length !== 1) break\n const parent = rows[0]?.parent\n if (parent === undefined) break\n current = parent\n }\n for (const id of path) resolved.add(id)\n }\n\n return out\n}\n\n/** A completed run whose children never recorded a terminal outcome. */\nfunction childTerminalIssues(\n view: TreeView,\n root: NodeRecord | undefined,\n): SupervisorRunIntegrityIssue[] {\n const { unique } = view\n const out: SupervisorRunIntegrityIssue[] = []\n if (root?.completed === true) {\n const missingTerminal = unique.filter(\n (record) => record.id !== root?.id && record.terminal === false,\n )\n if (missingTerminal.length > 0) {\n out.push(\n issue({\n code: 'child-terminal-unavailable',\n area: 'capture-integrity',\n severity: 'high',\n subject: 'child-terminal-outcomes',\n claim: 'A completed supervisor run has children with no captured terminal outcome',\n detail: `${missingTerminal.length}/${Math.max(0, unique.length - 1)} child node(s) are neither completed, truncated, nor errored.`,\n evidence: [\n evidence('children/missing-terminal/count', missingTerminal.length),\n ...missingTerminal\n .slice(0, MAX_EXAMPLES)\n .map((record) => nodeEvidence(record, 'outcome', record.raw.outcome)),\n ],\n recommendedAction: 'Retain each child settlement or cancellation event.',\n metadata: { assessment: 'unavailable', unavailable_count: missingTerminal.length },\n }),\n )\n }\n }\n\n return out\n}\n\n/** Rows with neither inlined messages nor a retained transcript. */\nfunction transcriptIssues(view: TreeView): SupervisorRunIntegrityIssue[] {\n const { records } = view\n const out: SupervisorRunIntegrityIssue[] = []\n // A row whose messages are not inlined still has its transcript when the source retained it\n // by reference; only a row with neither is missing one.\n const uninlined = records.filter((record) => record.messages?.length === 0)\n const missingTranscripts = uninlined.filter((record) => record.transcriptRef === null)\n if (missingTranscripts.length > 0) {\n out.push(\n issue({\n code: 'transcript-unavailable',\n area: 'capture-integrity',\n severity: 'medium',\n subject: 'decision-transcripts',\n claim: 'Decision transcripts are unavailable for some supervisor-tree invocations',\n detail: `${missingTranscripts.length}/${records.length} node row(s) have no inlined messages and no retained transcript; ${uninlined.length - missingTranscripts.length} more are retained by reference only.`,\n evidence: [\n evidence('capture/missing-transcripts/count', missingTranscripts.length),\n ...missingTranscripts\n .slice(0, MAX_EXAMPLES)\n .map((record) => nodeEvidence(record, 'artifacts/transcript_ref', null)),\n ],\n recommendedAction:\n 'Retain each invocation transcript and name it in artifacts.transcript_ref.',\n metadata: {\n assessment: 'unavailable',\n unavailable_count: missingTranscripts.length,\n retained_by_reference_count: uninlined.length - missingTranscripts.length,\n },\n }),\n )\n }\n\n return out\n}\n\n/** Rows without the canonical agent-profile identity. */\nfunction profileIssues(view: TreeView): SupervisorRunIntegrityIssue[] {\n const { records } = view\n const out: SupervisorRunIntegrityIssue[] = []\n const missingProfiles = records.filter((record) => record.profileId === null)\n if (missingProfiles.length > 0) {\n out.push(\n issue({\n code: 'profile-id-unavailable',\n area: 'capture-integrity',\n severity: 'medium',\n subject: 'agent-profile-identity',\n claim:\n 'Canonical agent-profile identity is unavailable for some supervisor-tree invocations',\n detail: `${missingProfiles.length}/${records.length} node row(s) omit policy.agent_profile_cell_id.`,\n evidence: [\n evidence('capture/missing-agent-profile-cell-id/count', missingProfiles.length),\n ...missingProfiles\n .slice(0, MAX_EXAMPLES)\n .map((record) => nodeEvidence(record, 'policy.agent_profile_cell_id', null)),\n ],\n recommendedAction:\n 'Record policy.agent_profile_cell_id on every invocation at dispatch time.',\n metadata: { assessment: 'unavailable', unavailable_count: missingProfiles.length },\n }),\n )\n }\n\n return out\n}\n\nexport function treeIssues(\n tree: SupervisorRunTree,\n uncertainty: TreeIssueUncertainty = {},\n): SupervisorRunIntegrityIssue[] {\n const view = buildTreeView(tree, uncertainty)\n const { issues: rootProblems, root } = rootIssues(view)\n return [\n ...schemaIssues(view),\n ...duplicateIdIssues(view),\n ...rootProblems,\n ...rootShapeIssues(view, root),\n ...edgeIssues(view),\n ...closeBeforeStartIssues(view),\n ...parentCycleIssues(view),\n ...childTerminalIssues(view, root),\n ...transcriptIssues(view),\n ...profileIssues(view),\n ]\n}\n","import type { SupervisorRunTree } from './types'\n\nexport const SUPERVISOR_RUN_INTEGRITY_SCHEMA = 'tangle.supervisor-run-integrity@1'\n\nexport type SupervisorRunIntegritySeverity = 'critical' | 'high' | 'medium' | 'low' | 'info'\n\nexport type SupervisorRunSourceOnlyCheckCode =\n | 'journal-event-cardinality'\n | 'worker-control-join'\n | 'steer-ack-correlation'\n\nexport type SupervisorRunIntegrityIssueCode =\n | 'source-checks-unavailable'\n | 'node-schema-invalid'\n | 'node-checks-unavailable'\n | 'root-unavailable'\n | 'duplicate-rollout-id'\n | 'declared-root-missing'\n | 'root-has-parent'\n | 'root-role-invalid'\n | 'detached-node'\n | 'parent-missing'\n | 'cross-run-parent'\n | 'child-before-parent'\n | 'child-after-parent-close'\n | 'close-before-start'\n | 'parent-cycle'\n | 'child-terminal-unavailable'\n | 'transcript-unavailable'\n | 'transcript-incomplete'\n | 'native-session-unavailable'\n | 'profile-id-unavailable'\n | 'source-row-malformed'\n | 'source-event-identity-unavailable'\n | 'duplicate-spawn'\n | 'orphan-terminal'\n | 'duplicate-terminal'\n | 'worker-controls-unavailable'\n | 'worker-control-join-unavailable'\n | 'steer-request-id-unavailable'\n | 'steer-ack-id-unavailable'\n | 'steer-ack-status-unavailable'\n | 'duplicate-steer-request-id'\n | 'missing-steer-ack'\n | 'duplicate-steer-ack'\n | 'unknown-steer-ack'\n | 'steer-not-delivered'\n\nexport interface SupervisorRunIntegrityEvidence {\n readonly path: string\n readonly value: unknown\n}\n\nexport interface SupervisorRunIntegrityIssue {\n readonly code: SupervisorRunIntegrityIssueCode\n readonly area: 'control-integrity' | 'capture-integrity'\n readonly severity: SupervisorRunIntegritySeverity\n readonly subject: string\n readonly claim: string\n readonly detail: string\n readonly evidence: readonly SupervisorRunIntegrityEvidence[]\n readonly recommendedAction: string\n readonly metadata?: Readonly<Record<string, unknown>>\n}\n\nexport interface SupervisorRunIntegrityReport {\n readonly schema: typeof SUPERVISOR_RUN_INTEGRITY_SCHEMA\n readonly runRef: string\n readonly input: 'sources' | 'tree'\n readonly tree: SupervisorRunTree\n readonly issues: readonly SupervisorRunIntegrityIssue[]\n}\n\nexport interface SupervisorRunIntegrityOptions {\n /** Pins rollout provenance when source input must be projected into a tree. */\n readonly capturedAt?: string\n}\n","/**\n * The supervision tree as `tangle.rollout.v1` rows.\n *\n * A supervisor run IS a tree of rollouts, so its nodes are not a new shape:\n * the root becomes one `RolloutLine` with `role: 'supervisor'`, and every\n * spawned invocation keeps its explicit supervisor/worker role with\n * `parent_rollout_id` pointing at its spawner. The rows append to the same\n * ledger as solo-agent rollouts and join to them with the same keys.\n *\n * What the journal CANNOT supply is the transcript: a worker's messages live\n * in its harness store (opencode sqlite, Claude Code jsonl), which the\n * `src/rollout/readers/*` intake readers own. Rows minted here are therefore\n * GAP lines (`messages: []`, `provenance.gap` set) carrying identity,\n * structure, outcome and cost. Runtime workspace receipts remain attached in\n * `provenance.workspace_captures`; their archives stay at the recorded refs.\n * Hydrating messages is the intake readers' job, keyed on `artifacts.transcript_ref`.\n *\n * Timing lives in `outcome.metrics` (`spawned_at` / `settled_at` / `wall_ms`)\n * rather than a schema field: `tangle.rollout.v1` describes ONE invocation,\n * and the inter-invocation event timeline — which is what waves, concurrency,\n * idle and utilization are computed from — is a property of the journal, not\n * of any single row. The analyzer reads that timeline; these rows carry the\n * per-node facts.\n */\n\nimport { unscreenedRewardFields } from '../rollout/reward'\nimport {\n isRolloutLine,\n ROLLOUT_SCHEMA,\n type RolloutLine,\n type RolloutSplit,\n} from '../rollout/schema'\nimport {\n asRecord,\n parseJsonRecord,\n parseSupervisorTree,\n type SpawnRow,\n type SupervisorTreeFacts,\n} from './source-facts'\nimport { readTerminalRecord } from './terminal-record'\nimport {\n isUnavailable,\n type SupervisorRunSources,\n type SupervisorRunTree,\n type SupervisorRunTreeGap,\n type WorkerLogSource,\n} from './types'\n\nexport interface SupervisorRolloutOptions {\n /** Benchmark/suite id for `task.suite`. Defaults to `'supervisor-run'`. */\n readonly suite?: string\n /** `task.split`. Defaults to `'search'` (the trainable pool). */\n readonly split?: RolloutSplit\n /** Replicate index. Defaults to 0. */\n readonly rep?: number\n /** Sampling seed the campaign pinned. Defaults to null (not recorded). */\n readonly seed?: number | null\n /** `run_id` for every node. Defaults to the supervisor root id, else `runRef`. */\n readonly runId?: string\n /** Harness that drove the supervisor. */\n readonly supervisorHarness?: string | null\n /** Harness that drove the workers. */\n readonly workerHarness?: string | null\n /** Model the supervisor ran on. */\n readonly supervisorModel?: string | null\n /** Model the workers ran on. */\n readonly workerModel?: string | null\n readonly experimentId?: string | null\n readonly candidateId?: string | null\n readonly generation?: number | null\n readonly candidateIndex?: number | null\n /** Pins `provenance.captured_at`; defaults to now. */\n readonly capturedAt?: string\n}\n\nconst EMPTY_COST = {\n usd: null,\n tokens_in: null,\n tokens_out: null,\n tokens_reasoning: null,\n cache_read: null,\n cache_write: null,\n wall_s: null,\n} as const\n\nfunction hasWorkerId(\n worker: WorkerLogSource,\n): worker is WorkerLogSource & { readonly workerId: string } {\n return worker.workerId !== undefined\n}\n\n/**\n * Mint the supervision tree as rollout rows. Returns the rows plus the gaps\n * that made any of them incomplete — same unavailable-vs-zero discipline as\n * the report: a row with no transcript says WHY, it never pretends to be empty.\n */\nexport function supervisorRunRolloutLines(\n src: SupervisorRunSources,\n opts: SupervisorRolloutOptions = {},\n): SupervisorRunTree {\n return supervisorRunRolloutLinesFromFacts(src, parseSupervisorTree(src), opts)\n}\n\n/** What the root and worker rows share: the parsed run record, the row template and the gap collector. */\nfunction rolloutContext(\n src: SupervisorRunSources,\n tree: SupervisorTreeFacts,\n opts: SupervisorRolloutOptions,\n gaps: SupervisorRunTreeGap[],\n) {\n const state = tree.state\n const result = parseJsonRecord(src.result)\n const judge = parseJsonRecord(src.judge)\n const stateResult = asRecord(state?.result)\n // One derivation with the analyzer, so the root row and the report never\n // disagree about which record the status came from.\n const terminal = readTerminalRecord({\n state,\n result,\n failure: src.failure === undefined ? undefined : parseJsonRecord(src.failure),\n })\n\n const rootId = tree.rootId\n const runId = opts.runId ?? rootId ?? src.runRef\n const suite = opts.suite ?? 'supervisor-run'\n const instanceId = src.instanceId ?? src.runRef\n const split: RolloutSplit = opts.split ?? 'search'\n const capturedAt = opts.capturedAt ?? new Date().toISOString()\n\n const base = {\n schema: ROLLOUT_SCHEMA,\n run_id: runId,\n experiment_id: opts.experimentId ?? null,\n candidate_id: opts.candidateId ?? null,\n generation: opts.generation ?? null,\n candidate_index: opts.candidateIndex ?? null,\n task: {\n suite,\n instance_id: instanceId,\n split,\n seed: opts.seed ?? null,\n rep: opts.rep ?? 0,\n },\n messages: [] as RolloutLine['messages'],\n tool_defs: [] as RolloutLine['tool_defs'],\n } satisfies Partial<RolloutLine> & Record<string, unknown>\n\n const noteCaptureGaps = (\n owner: string,\n nodeId: string,\n captures: SupervisorRunSources['rootWorkspaceCaptures'],\n ): string | null => {\n if (captures === null || captures?.length === 0) {\n gaps.push({\n code: 'workspace-capture-unavailable',\n message: `${owner} has no retained output capture evidence`,\n nodeId,\n })\n return 'workspace capture evidence unavailable'\n }\n let incomplete = false\n for (const [index, capture] of captures?.entries() ?? []) {\n const reasons = [\n capture.projectionGap,\n capture.coverageComplete === false\n ? (capture.incompleteReason ?? 'provider reported incomplete coverage')\n : capture.coverageComplete === null\n ? 'capture coverage was not recorded'\n : null,\n ].filter((reason): reason is string => reason !== null)\n if (reasons.length > 0) {\n incomplete = true\n gaps.push({\n code: 'workspace-capture-incomplete',\n message: `${owner} result ${index + 1}: ${reasons.join('; ')}`,\n nodeId,\n })\n }\n }\n return incomplete ? 'workspace capture evidence incomplete' : null\n }\n return {\n src,\n tree,\n opts,\n gaps,\n state,\n result,\n judge,\n stateResult,\n terminal,\n rootId,\n capturedAt,\n base,\n noteCaptureGaps,\n }\n}\n\ntype RolloutContext = ReturnType<typeof rolloutContext>\n\n/** The supervisor invocation row, or nothing when the journal never named a root. */\nfunction rootRolloutNode(ctx: RolloutContext): RolloutLine | null {\n const {\n src,\n tree,\n opts,\n gaps,\n state,\n result,\n judge,\n stateResult,\n terminal,\n rootId,\n capturedAt,\n noteCaptureGaps,\n base,\n } = ctx\n if (rootId === null) {\n gaps.push({\n code: 'root-spawn-unavailable',\n message: 'no parentless spawned event in the journal',\n })\n return null\n }\n const rootSpawn = tree.spawns.find((spawn) => spawn.valid && spawn.id === rootId)\n const judgeResolved = typeof judge?.resolved === 'boolean' ? judge.resolved : null\n const judgeScore = typeof judge?.score === 'number' ? judge.score : null\n const reward = judgeScore ?? (judgeResolved === null ? null : judgeResolved ? 1 : 0)\n if (reward === null) {\n gaps.push({\n code: 'root-reward-unavailable',\n message: 'no judge verdict for this run',\n nodeId: rootId,\n })\n }\n const wallMs =\n tree.startedAt !== null && tree.completedAt !== null && tree.completedAt >= tree.startedAt\n ? tree.completedAt - tree.startedAt\n : null\n const captures = src.rootWorkspaceCaptures\n const captureGap = noteCaptureGaps(`root ${JSON.stringify(rootId)}`, rootId, captures)\n return {\n ...base,\n rollout_id: rootId,\n parent_rollout_id: null,\n role: rootSpawn?.role ?? 'supervisor',\n policy: {\n harness: opts.supervisorHarness ?? null,\n harness_version: null,\n model: opts.supervisorModel ?? null,\n provider: null,\n profile_commit: null,\n agent_profile_cell_id: rootSpawn?.profileDigest ?? null,\n sampling: null,\n },\n outcome: {\n // `reward` and `realness_gated` are written by one call, in the module\n // that owns the gate. This is the SECOND producer of rollout rewards —\n // the judge verdict in the supervision run dir, not `mintRolloutRows` —\n // and it wrote `reward` by hand while never stating the flag, so\n // `isLineRealnessGated` was structurally false for every supervisor and\n // worker row ever emitted here. `unscreenedRewardFields` is the honest\n // name for what this producer can claim: a supervision journal carries\n // no `RunRecord.outcome.realness`, so no authenticity gate has run on\n // this score, and `realness_gated: false` states that rather than\n // implying it by omission. These rows stay plain `RolloutLine`s, so a\n // caller feeding them to a training exporter must `assertMinted` first.\n ...unscreenedRewardFields(reward),\n reward_source: src.judgeSource,\n verdict: judge ?? null,\n metrics: {\n arm: src.arm,\n sup_status: isUnavailable(terminal.supStatus) ? null : terminal.supStatus,\n sup_verdict: typeof state?.verdict === 'string' ? state.verdict : null,\n delivered: typeof stateResult.delivered === 'boolean' ? stateResult.delivered : null,\n verify_pass: typeof result?.verify_pass === 'boolean' ? result.verify_pass : null,\n started_at: tree.startedAt,\n completed_at: tree.completedAt,\n workers_spawned: tree.workerSpawns.length,\n brain_metered_events: tree.brain.meteredCount,\n runtime: rootSpawn?.runtime ?? null,\n profile_digest: rootSpawn?.profileDigest ?? null,\n },\n is_completed: terminal.completed === true,\n is_truncated: false,\n // A recorded non-delivery names its cause: Runtime's no-winner reason,\n // else the recorded error's message. A run with no terminal record has\n // no error to report, and a delivered run has none.\n error:\n terminal.completed !== false\n ? null\n : !isUnavailable(terminal.supReason) && terminal.supReason !== null\n ? terminal.supReason\n : !isUnavailable(terminal.failure) && terminal.failure !== null\n ? (terminal.failure.message ?? terminal.failure.name)\n : null,\n realness_gated: false,\n },\n cost: {\n ...EMPTY_COST,\n usd:\n src.limits.spendUsd !== null\n ? null\n : typeof stateResult.spentUsd === 'number'\n ? stateResult.spentUsd\n : tree.brain.usd,\n tokens_in: src.limits.managerTokens === null ? tree.brain.tokensIn : null,\n tokens_out: src.limits.managerTokens === null ? tree.brain.tokensOut : null,\n cache_read:\n src.limits.managerTokens === null && tree.brain.hasCache ? tree.brain.cacheRead : null,\n cache_write:\n src.limits.managerTokens === null && tree.brain.hasCache ? tree.brain.cacheWrite : null,\n wall_s: wallMs === null ? null : wallMs / 1000,\n },\n artifacts: {\n patch_path: typeof result?.patchPath === 'string' ? result.patchPath : null,\n run_dir: src.supRunDir,\n // Only a reader's declared artifact: a guessed path would read as retained evidence.\n transcript_ref: src.rootTranscriptRef ?? null,\n },\n provenance: {\n captured_at: capturedAt,\n capture: 'backfill',\n lossy_projection: true,\n ...(captures === undefined ? {} : { workspace_captures: captures }),\n gap: [\n src.rootTranscriptRef == null\n ? 'supervision journal carries structure and spend, not the brain transcript'\n : 'brain transcript retained by reference; messages not inlined into this row',\n captureGap,\n ]\n .filter((reason): reason is string => reason !== null)\n .join('; '),\n },\n }\n}\n\n/** The journal closes and the reader's worker sources, joined to spawns by stable id first and by label only as a fallback. */\nfunction workerLookups(ctx: RolloutContext) {\n const { src, tree } = ctx\n const closeById = new Map(tree.closes.map((c) => [c.id, c]))\n const sourceById = new Map(\n (src.workers ?? []).filter(hasWorkerId).map((worker) => [worker.workerId, worker]),\n )\n const fallbackSourceByLabel = new Map(\n (src.workers ?? [])\n .filter((worker) => worker.workerId === undefined)\n .map((worker) => [worker.label, worker]),\n )\n return { closeById, sourceById, fallbackSourceByLabel }\n}\n\ntype WorkerLookups = ReturnType<typeof workerLookups>\n\n/** One worker row, or nothing when its spawn has no explicit role. */\nfunction workerRolloutNode(\n ctx: RolloutContext,\n lookups: WorkerLookups,\n spawn: SpawnRow,\n): RolloutLine | null {\n const { src, tree, opts, gaps, capturedAt, noteCaptureGaps, base } = ctx\n const { closeById, sourceById, fallbackSourceByLabel } = lookups\n if (spawn.role === null) {\n gaps.push({\n code: 'node-role-unavailable',\n message: `child ${JSON.stringify(spawn.label)} has no explicit invocation role`,\n nodeId: spawn.id,\n })\n return null\n }\n const close = closeById.get(spawn.id) ?? null\n const workerSource = sourceById.get(spawn.id) ?? fallbackSourceByLabel.get(spawn.label) ?? null\n const facts =\n tree.workerLogs.get(workerSource?.workerId ?? workerSource?.label ?? spawn.label) ?? null\n const wallMs =\n facts?.started != null && facts.finishedAt != null ? facts.finishedAt - facts.started : null\n const score = close?.score ?? facts?.score ?? null\n const passed = close?.valid ?? facts?.passed ?? null\n const reward = score ?? (passed === null ? null : passed ? 1 : 0)\n if (reward === null) {\n gaps.push({\n code: 'child-reward-unavailable',\n message: `child ${JSON.stringify(spawn.label)} has no verify verdict`,\n nodeId: spawn.id,\n })\n }\n const isSupervisor = spawn.role === 'supervisor'\n const captures = workerSource?.workspaceCaptures\n const captureGap = noteCaptureGaps(`child ${JSON.stringify(spawn.label)}`, spawn.id, captures)\n return {\n ...base,\n rollout_id: spawn.id,\n parent_rollout_id: spawn.parent,\n role: spawn.role,\n policy: {\n harness: isSupervisor ? (opts.supervisorHarness ?? null) : (opts.workerHarness ?? null),\n harness_version: null,\n model: isSupervisor ? (opts.supervisorModel ?? null) : (opts.workerModel ?? null),\n provider: null,\n profile_commit: null,\n agent_profile_cell_id: spawn.profileDigest,\n sampling: null,\n },\n outcome: {\n // Same producer, same claim: a child reward is a self-verify verdict\n // from the journal that no realness gate has seen.\n ...unscreenedRewardFields(reward),\n reward_source:\n reward === null ? null : score === null ? 'worker-self-verify' : 'worker-verdict-score',\n verdict:\n close === null\n ? null\n : {\n kind: close.kind,\n status: close.status,\n verdict: close.rawVerdict,\n valid: close.valid,\n score: close.score,\n },\n metrics: {\n label: spawn.label,\n spawned_at: spawn.at,\n settled_at: close?.at ?? null,\n started_at: facts?.started ?? null,\n finished_at: facts?.finishedAt ?? null,\n wall_ms: wallMs,\n patch_bytes: workerSource?.patchBytes ?? facts?.finishedPatchBytes ?? null,\n evidence_bytes: facts?.evidenceBytes ?? null,\n steers_queued: facts?.steersQueued ?? null,\n steers_delivered: facts?.steersDelivered ?? null,\n questions: facts?.questions ?? null,\n runtime: spawn.runtime,\n profile_digest: spawn.profileDigest,\n },\n is_completed: close?.kind === 'settled' && close.status === 'done',\n is_truncated: close?.kind === 'cancelled',\n error:\n close?.kind === 'cancelled'\n ? (close.reason ?? 'cancelled')\n : close?.status === 'down'\n ? (close.reason ?? 'child down')\n : null,\n realness_gated: false,\n },\n // `close.spend` is only a measurement when the close event carried one;\n // a store that never priced this worker must leave null, not 0.\n cost: {\n ...EMPTY_COST,\n usd: src.limits.spendUsd !== null || !close?.hasSpend ? null : close.spend.usd,\n tokens_in: workerSource?.tokensIn ?? (close?.hasSpend ? close.spend.tokens.input : null),\n tokens_out: workerSource?.tokensOut ?? (close?.hasSpend ? close.spend.tokens.output : null),\n // Mirror the tokens_in/out journal fallback so a source whose\n // `settled` spend carries cache counters is not reported as null cache\n // beside real tokens. Gate on `hasCache` — a spend object without cache\n // counters must stay null, not a fabricated 0.\n cache_read:\n workerSource?.cacheRead ??\n (close?.hasSpend && close.spend.tokens.hasCache ? close.spend.tokens.cacheRead : null),\n cache_write:\n workerSource?.cacheWrite ??\n (close?.hasSpend && close.spend.tokens.hasCache ? close.spend.tokens.cacheWrite : null),\n wall_s: wallMs === null ? null : wallMs / 1000,\n },\n // Only artifacts a reader declares: a guessed path would mint rows pointing at files that\n // never existed, and a transcript reference reads as retained evidence.\n artifacts: {\n patch_path: workerSource?.patchPath ?? null,\n run_dir: src.supRunDir,\n transcript_ref: workerSource?.transcriptRef ?? null,\n },\n provenance: {\n captured_at: capturedAt,\n capture: 'backfill',\n lossy_projection: true,\n ...(captures === undefined ? {} : { workspace_captures: captures }),\n gap: [\n workerSource?.transcriptRef == null\n ? 'no worker transcript was retained; messages unavailable'\n : 'worker transcript retained by reference; messages not inlined into this row',\n captureGap,\n ]\n .filter((reason): reason is string => reason !== null)\n .join('; '),\n },\n }\n}\n\n/** Mint rollout rows from an already parsed source without reading its JSONL again. */\nexport function supervisorRunRolloutLinesFromFacts(\n src: SupervisorRunSources,\n tree: SupervisorTreeFacts,\n opts: SupervisorRolloutOptions = {},\n): SupervisorRunTree {\n const gaps: SupervisorRunTreeGap[] = []\n if (src.journal === null) {\n gaps.push({\n code: 'journal-unavailable',\n message: `${src.supRunDir === null ? 'no supervisor run dir' : 'journal absent'}; no nodes recoverable`,\n })\n return { rootId: null, nodes: [], gaps }\n }\n // `journalInvalidRows` covers rows the parser could not interpret at all, including JSON\n // objects in a shape it does not recognize — so a journal it read but understood none of\n // reports an explicit gap instead of an empty tree.\n const malformedSourceRows =\n tree.journalInvalidRows + tree.spawns.filter((spawn) => !spawn.valid).length\n if (malformedSourceRows > 0) {\n gaps.push({\n code: 'source-row-malformed',\n message: `${malformedSourceRows} of ${tree.journalRows} journal row(s) were unusable and excluded from the tree`,\n count: malformedSourceRows,\n })\n }\n const ctx = rolloutContext(src, tree, opts, gaps)\n const nodes: RolloutLine[] = []\n const root = rootRolloutNode(ctx)\n if (root) nodes.push(root)\n const lookups = workerLookups(ctx)\n for (const spawn of tree.workerSpawns) {\n const node = workerRolloutNode(ctx, lookups, spawn)\n if (node) nodes.push(node)\n }\n\n const invalid = nodes.filter((n) => !isRolloutLine(n))\n if (invalid.length > 0) {\n gaps.push({\n code: 'node-schema-invalid',\n message: `${invalid.length} node(s) failed tangle.rollout.v1 validation`,\n count: invalid.length,\n })\n }\n return { rootId: tree.rootId, nodes, gaps }\n}\n","import { evidence, issue } from './integrity-issues'\nimport { sourceIssues } from './integrity-source'\nimport { treeIssues } from './integrity-tree'\nimport {\n SUPERVISOR_RUN_INTEGRITY_SCHEMA,\n type SupervisorRunIntegrityOptions,\n type SupervisorRunIntegrityReport,\n type SupervisorRunSourceOnlyCheckCode,\n} from './integrity-types'\nimport { supervisorRunRolloutLinesFromFacts } from './rollout-nodes'\nimport { parseSupervisorTree } from './source-facts'\nimport type { SupervisorRunSources, SupervisorRunTree } from './types'\n\nexport {\n SUPERVISOR_RUN_INTEGRITY_SCHEMA,\n type SupervisorRunIntegrityEvidence,\n type SupervisorRunIntegrityIssue,\n type SupervisorRunIntegrityIssueCode,\n type SupervisorRunIntegrityOptions,\n type SupervisorRunIntegrityReport,\n type SupervisorRunIntegritySeverity,\n type SupervisorRunSourceOnlyCheckCode,\n} from './integrity-types'\n\nfunction isTree(input: SupervisorRunSources | SupervisorRunTree): input is SupervisorRunTree {\n return 'nodes' in input && Array.isArray(input.nodes)\n}\n\nfunction treeRunRef(tree: SupervisorRunTree): string {\n const runIds = [\n ...new Set(\n tree.nodes\n .map((node) => node.run_id)\n .filter((runId): runId is string => typeof runId === 'string' && runId.length > 0),\n ),\n ].sort()\n if (runIds.length === 1) return runIds[0]!\n if (runIds.length > 1) return `mixed-runs:${runIds.join(',')}`\n return tree.rootId ?? 'unidentified-tree'\n}\n\n/**\n * Run deterministic integrity checks over source bytes or an already minted tree.\n * Source input is parsed exactly once and reused by projection and source-only checks.\n */\nexport function analyzeSupervisorRunIntegrity(\n input: SupervisorRunSources | SupervisorRunTree,\n options: SupervisorRunIntegrityOptions = {},\n): SupervisorRunIntegrityReport {\n if (isTree(input)) {\n const sourceOnlyChecks: readonly SupervisorRunSourceOnlyCheckCode[] = [\n 'journal-event-cardinality',\n 'worker-control-join',\n 'steer-ack-correlation',\n ]\n return {\n schema: SUPERVISOR_RUN_INTEGRITY_SCHEMA,\n runRef: treeRunRef(input),\n input: 'tree',\n tree: input,\n issues: [\n ...treeIssues(input),\n issue({\n code: 'source-checks-unavailable',\n area: 'capture-integrity',\n severity: 'medium',\n subject: 'source-only-control-checks',\n claim: 'Source-only control checks are unavailable for SupervisorRunTree input',\n detail:\n 'Rollout rows do not retain journal event multiplicity or worker inbox and acknowledgement rows.',\n evidence: [evidence('input/source-only-checks', sourceOnlyChecks)],\n recommendedAction:\n 'Pass SupervisorRunSources when journal and worker control checks are required.',\n metadata: { assessment: 'unavailable', checks: sourceOnlyChecks },\n }),\n ],\n }\n }\n\n const facts = parseSupervisorTree(input)\n const tree = supervisorRunRolloutLinesFromFacts(input, facts, {\n capturedAt: options.capturedAt,\n })\n return {\n schema: SUPERVISOR_RUN_INTEGRITY_SCHEMA,\n runRef: input.runRef,\n input: 'sources',\n tree,\n issues: [\n ...treeIssues(tree, {\n unknownIdentityRows:\n facts.journalInvalidRows +\n facts.spawns.filter((spawn) => !spawn.valid && spawn.id.length === 0).length,\n uncertainIds: new Set(\n facts.spawns\n .filter((spawn) => !spawn.valid && spawn.id.length > 0)\n .map((spawn) => spawn.id),\n ),\n }),\n ...sourceIssues(input, facts, tree),\n ],\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as CaptureIntegrityError } from "./errors-
|
|
1
|
+
import { n as CaptureIntegrityError } from "./errors-BcOs5MKW.js";
|
|
2
2
|
//#region src/trace/integrity.ts
|
|
3
3
|
/**
|
|
4
4
|
* Run-completion integrity check — at end of run, verify the expected event
|
|
@@ -137,11 +137,7 @@ async function assertRunCaptured(store, runId, expectations = {}) {
|
|
|
137
137
|
issues
|
|
138
138
|
};
|
|
139
139
|
}
|
|
140
|
-
/** Strict mode: throws `RunIntegrityError` when the report isn't ok. */
|
|
141
|
-
function throwIfRunIncomplete(report) {
|
|
142
|
-
if (!report.ok) throw new RunIntegrityError(report);
|
|
143
|
-
}
|
|
144
140
|
//#endregion
|
|
145
|
-
export { assertRunCaptured as n,
|
|
141
|
+
export { assertRunCaptured as n, RunIntegrityError as t };
|
|
146
142
|
|
|
147
|
-
//# sourceMappingURL=integrity-
|
|
143
|
+
//# sourceMappingURL=integrity-W4CADcFc.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"integrity-BXOsAb3i.js","names":[],"sources":["../src/trace/integrity.ts"],"sourcesContent":["/**\n * Run-completion integrity check — at end of run, verify the expected event\n * types were actually captured. The point is the launch-review failure mode:\n * a run *appears* successful but the raw provider events were never written,\n * so a downstream reviewer can't reconstruct what happened.\n *\n * Pattern:\n *\n * const report = await assertRunCaptured(store, runId, {\n * llmSpansMin: 1,\n * judgeSpansMin: 1,\n * rawSink: providerSink, // must have ≥ 1 event for this run\n * requireRawCoverageOfLlmSpans: true, // every llm span has matching raw events\n * })\n * if (!report.ok) throwIfRunIncomplete(report) // or mark run failed and continue\n *\n * The function is read-only on the store and returns a structured report;\n * the caller chooses the failure mode (throw, mark run failed, log warning).\n * `throwIfRunIncomplete` is the convenient strict mode.\n */\n\nimport { CaptureIntegrityError } from '../errors'\nimport type { RawProviderSink } from './raw-provider-sink'\nimport type { TraceStore } from './store'\n\nexport interface RunIntegrityExpectations {\n /** Minimum LLM span count. Default 0 (no requirement). */\n llmSpansMin?: number\n /** Minimum judge span count. Default 0. */\n judgeSpansMin?: number\n /** Minimum tool span count. Default 0. */\n toolSpansMin?: number\n /**\n * Raw provider sink to consult for capture verification. When present,\n * the check requires at least one raw event for the run.\n */\n rawSink?: RawProviderSink\n /** Minimum raw provider event count. Default 0; ignored when `rawSink` absent. */\n rawProviderEventsMin?: number\n /**\n * Every LLM span must have at least one matching raw `request` event\n * (matched by spanId). Catches the common bug where the structured span\n * was emitted but the raw HTTP capture was wired to a different sink.\n */\n requireRawCoverageOfLlmSpans?: boolean\n /** Run outcome must be set (not null/undefined). Default false. */\n requireOutcome?: boolean\n}\n\nexport type RunIntegrityIssueCode =\n | 'no_run'\n | 'missing_llm_spans'\n | 'missing_judge_spans'\n | 'missing_tool_spans'\n | 'missing_raw_events'\n | 'no_raw_sink'\n | 'orphan_llm_span'\n | 'missing_outcome'\n | 'dropped_writes'\n\nexport interface RunIntegrityIssue {\n code: RunIntegrityIssueCode\n message: string\n detail?: Record<string, unknown>\n}\n\nexport interface RunIntegrityReport {\n ok: boolean\n runId: string\n llmSpanCount: number\n judgeSpanCount: number\n toolSpanCount: number\n rawProviderEventCount: number\n /**\n * Coverage of LLM spans by raw provider events keyed on spanId.\n * `total` is the number of LLM spans; `covered` is the count with at\n * least one matching `request` raw event.\n */\n rawSpanCoverage: { covered: number; total: number }\n issues: RunIntegrityIssue[]\n}\n\nexport class RunIntegrityError extends CaptureIntegrityError {\n constructor(public readonly report: RunIntegrityReport) {\n super(\n `Run ${report.runId} failed integrity check: ${report.issues.map((i) => i.code).join(', ')}`,\n )\n }\n}\n\nexport async function assertRunCaptured(\n store: TraceStore,\n runId: string,\n expectations: RunIntegrityExpectations = {},\n): Promise<RunIntegrityReport> {\n const issues: RunIntegrityIssue[] = []\n const run = await store.getRun(runId)\n if (!run) {\n return {\n ok: false,\n runId,\n llmSpanCount: 0,\n judgeSpanCount: 0,\n toolSpanCount: 0,\n rawProviderEventCount: 0,\n rawSpanCoverage: { covered: 0, total: 0 },\n issues: [{ code: 'no_run', message: `Run ${runId} not found in store.` }],\n }\n }\n\n const spans = await store.spans({ runId })\n const llmSpans = spans.filter((s) => s.kind === 'llm')\n const judgeSpans = spans.filter((s) => s.kind === 'judge')\n const toolSpans = spans.filter((s) => s.kind === 'tool')\n\n const llmMin = expectations.llmSpansMin ?? 0\n const judgeMin = expectations.judgeSpansMin ?? 0\n const toolMin = expectations.toolSpansMin ?? 0\n\n if (llmSpans.length < llmMin) {\n issues.push({\n code: 'missing_llm_spans',\n message: `Expected ≥ ${llmMin} LLM spans, found ${llmSpans.length}.`,\n detail: { expected: llmMin, found: llmSpans.length },\n })\n }\n if (judgeSpans.length < judgeMin) {\n issues.push({\n code: 'missing_judge_spans',\n message: `Expected ≥ ${judgeMin} judge spans, found ${judgeSpans.length}.`,\n detail: { expected: judgeMin, found: judgeSpans.length },\n })\n }\n if (toolSpans.length < toolMin) {\n issues.push({\n code: 'missing_tool_spans',\n message: `Expected ≥ ${toolMin} tool spans, found ${toolSpans.length}.`,\n detail: { expected: toolMin, found: toolSpans.length },\n })\n }\n\n let rawEventCount = 0\n let coverage = { covered: 0, total: llmSpans.length }\n\n if (expectations.rawSink) {\n if (!expectations.rawSink.list) {\n issues.push({\n code: 'no_raw_sink',\n message: 'Provided rawSink does not implement list(); cannot verify capture.',\n })\n } else {\n const events = await expectations.rawSink.list({ runId })\n rawEventCount = events.length\n const rawMin = expectations.rawProviderEventsMin ?? 1\n if (rawEventCount < rawMin) {\n issues.push({\n code: 'missing_raw_events',\n message: `Expected ≥ ${rawMin} raw provider events, found ${rawEventCount}.`,\n detail: { expected: rawMin, found: rawEventCount },\n })\n }\n if (expectations.requireRawCoverageOfLlmSpans) {\n const requestEventsBySpan = new Set(\n events.filter((e) => e.direction === 'request' && e.spanId).map((e) => e.spanId!),\n )\n const orphaned = llmSpans.filter((s) => !requestEventsBySpan.has(s.spanId))\n coverage = { covered: llmSpans.length - orphaned.length, total: llmSpans.length }\n if (orphaned.length > 0) {\n issues.push({\n code: 'orphan_llm_span',\n message: `${orphaned.length} LLM span(s) have no matching raw provider request event.`,\n detail: { orphanedSpanIds: orphaned.map((s) => s.spanId) },\n })\n }\n }\n }\n } else if (expectations.requireRawCoverageOfLlmSpans || expectations.rawProviderEventsMin) {\n issues.push({\n code: 'no_raw_sink',\n message: 'Raw coverage required but no rawSink supplied to the integrity check.',\n })\n }\n\n // The producer's own count of failed store writes. Every threshold above\n // counts what reached the store; this is the record of what did not.\n if (run.capture && run.capture.dropped > 0) {\n issues.push({\n code: 'dropped_writes',\n message: `Run ${runId} dropped ${run.capture.dropped} of ${run.capture.written + run.capture.dropped} store writes; its records are incomplete.`,\n detail: { ...run.capture },\n })\n }\n\n if (expectations.requireOutcome && (run.outcome === undefined || run.outcome === null)) {\n issues.push({\n code: 'missing_outcome',\n message: `Run ${runId} has no outcome recorded.`,\n })\n }\n\n return {\n ok: issues.length === 0,\n runId,\n llmSpanCount: llmSpans.length,\n judgeSpanCount: judgeSpans.length,\n toolSpanCount: toolSpans.length,\n rawProviderEventCount: rawEventCount,\n rawSpanCoverage: coverage,\n issues,\n }\n}\n\n/** Strict mode: throws `RunIntegrityError` when the report isn't ok. */\nexport function throwIfRunIncomplete(report: RunIntegrityReport): void {\n if (!report.ok) throw new RunIntegrityError(report)\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"integrity-W4CADcFc.js","names":[],"sources":["../src/trace/integrity.ts"],"sourcesContent":["/**\n * Run-completion integrity check — at end of run, verify the expected event\n * types were actually captured. The point is the launch-review failure mode:\n * a run *appears* successful but the raw provider events were never written,\n * so a downstream reviewer can't reconstruct what happened.\n *\n * Pattern:\n *\n * const report = await assertRunCaptured(store, runId, {\n * llmSpansMin: 1,\n * judgeSpansMin: 1,\n * rawSink: providerSink, // must have ≥ 1 event for this run\n * requireRawCoverageOfLlmSpans: true, // every llm span has matching raw events\n * })\n * if (!report.ok) throwIfRunIncomplete(report) // or mark run failed and continue\n *\n * The function is read-only on the store and returns a structured report;\n * the caller chooses the failure mode (throw, mark run failed, log warning).\n * `throwIfRunIncomplete` is the convenient strict mode.\n */\n\nimport { CaptureIntegrityError } from '../errors'\nimport type { RawProviderSink } from './raw-provider-sink'\nimport type { TraceStore } from './store'\n\nexport interface RunIntegrityExpectations {\n /** Minimum LLM span count. Default 0 (no requirement). */\n llmSpansMin?: number\n /** Minimum judge span count. Default 0. */\n judgeSpansMin?: number\n /** Minimum tool span count. Default 0. */\n toolSpansMin?: number\n /**\n * Raw provider sink to consult for capture verification. When present,\n * the check requires at least one raw event for the run.\n */\n rawSink?: RawProviderSink\n /** Minimum raw provider event count. Default 0; ignored when `rawSink` absent. */\n rawProviderEventsMin?: number\n /**\n * Every LLM span must have at least one matching raw `request` event\n * (matched by spanId). Catches the common bug where the structured span\n * was emitted but the raw HTTP capture was wired to a different sink.\n */\n requireRawCoverageOfLlmSpans?: boolean\n /** Run outcome must be set (not null/undefined). Default false. */\n requireOutcome?: boolean\n}\n\nexport type RunIntegrityIssueCode =\n | 'no_run'\n | 'missing_llm_spans'\n | 'missing_judge_spans'\n | 'missing_tool_spans'\n | 'missing_raw_events'\n | 'no_raw_sink'\n | 'orphan_llm_span'\n | 'missing_outcome'\n | 'dropped_writes'\n\nexport interface RunIntegrityIssue {\n code: RunIntegrityIssueCode\n message: string\n detail?: Record<string, unknown>\n}\n\nexport interface RunIntegrityReport {\n ok: boolean\n runId: string\n llmSpanCount: number\n judgeSpanCount: number\n toolSpanCount: number\n rawProviderEventCount: number\n /**\n * Coverage of LLM spans by raw provider events keyed on spanId.\n * `total` is the number of LLM spans; `covered` is the count with at\n * least one matching `request` raw event.\n */\n rawSpanCoverage: { covered: number; total: number }\n issues: RunIntegrityIssue[]\n}\n\nexport class RunIntegrityError extends CaptureIntegrityError {\n constructor(public readonly report: RunIntegrityReport) {\n super(\n `Run ${report.runId} failed integrity check: ${report.issues.map((i) => i.code).join(', ')}`,\n )\n }\n}\n\nexport async function assertRunCaptured(\n store: TraceStore,\n runId: string,\n expectations: RunIntegrityExpectations = {},\n): Promise<RunIntegrityReport> {\n const issues: RunIntegrityIssue[] = []\n const run = await store.getRun(runId)\n if (!run) {\n return {\n ok: false,\n runId,\n llmSpanCount: 0,\n judgeSpanCount: 0,\n toolSpanCount: 0,\n rawProviderEventCount: 0,\n rawSpanCoverage: { covered: 0, total: 0 },\n issues: [{ code: 'no_run', message: `Run ${runId} not found in store.` }],\n }\n }\n\n const spans = await store.spans({ runId })\n const llmSpans = spans.filter((s) => s.kind === 'llm')\n const judgeSpans = spans.filter((s) => s.kind === 'judge')\n const toolSpans = spans.filter((s) => s.kind === 'tool')\n\n const llmMin = expectations.llmSpansMin ?? 0\n const judgeMin = expectations.judgeSpansMin ?? 0\n const toolMin = expectations.toolSpansMin ?? 0\n\n if (llmSpans.length < llmMin) {\n issues.push({\n code: 'missing_llm_spans',\n message: `Expected ≥ ${llmMin} LLM spans, found ${llmSpans.length}.`,\n detail: { expected: llmMin, found: llmSpans.length },\n })\n }\n if (judgeSpans.length < judgeMin) {\n issues.push({\n code: 'missing_judge_spans',\n message: `Expected ≥ ${judgeMin} judge spans, found ${judgeSpans.length}.`,\n detail: { expected: judgeMin, found: judgeSpans.length },\n })\n }\n if (toolSpans.length < toolMin) {\n issues.push({\n code: 'missing_tool_spans',\n message: `Expected ≥ ${toolMin} tool spans, found ${toolSpans.length}.`,\n detail: { expected: toolMin, found: toolSpans.length },\n })\n }\n\n let rawEventCount = 0\n let coverage = { covered: 0, total: llmSpans.length }\n\n if (expectations.rawSink) {\n if (!expectations.rawSink.list) {\n issues.push({\n code: 'no_raw_sink',\n message: 'Provided rawSink does not implement list(); cannot verify capture.',\n })\n } else {\n const events = await expectations.rawSink.list({ runId })\n rawEventCount = events.length\n const rawMin = expectations.rawProviderEventsMin ?? 1\n if (rawEventCount < rawMin) {\n issues.push({\n code: 'missing_raw_events',\n message: `Expected ≥ ${rawMin} raw provider events, found ${rawEventCount}.`,\n detail: { expected: rawMin, found: rawEventCount },\n })\n }\n if (expectations.requireRawCoverageOfLlmSpans) {\n const requestEventsBySpan = new Set(\n events.filter((e) => e.direction === 'request' && e.spanId).map((e) => e.spanId!),\n )\n const orphaned = llmSpans.filter((s) => !requestEventsBySpan.has(s.spanId))\n coverage = { covered: llmSpans.length - orphaned.length, total: llmSpans.length }\n if (orphaned.length > 0) {\n issues.push({\n code: 'orphan_llm_span',\n message: `${orphaned.length} LLM span(s) have no matching raw provider request event.`,\n detail: { orphanedSpanIds: orphaned.map((s) => s.spanId) },\n })\n }\n }\n }\n } else if (expectations.requireRawCoverageOfLlmSpans || expectations.rawProviderEventsMin) {\n issues.push({\n code: 'no_raw_sink',\n message: 'Raw coverage required but no rawSink supplied to the integrity check.',\n })\n }\n\n // The producer's own count of failed store writes. Every threshold above\n // counts what reached the store; this is the record of what did not.\n if (run.capture && run.capture.dropped > 0) {\n issues.push({\n code: 'dropped_writes',\n message: `Run ${runId} dropped ${run.capture.dropped} of ${run.capture.written + run.capture.dropped} store writes; its records are incomplete.`,\n detail: { ...run.capture },\n })\n }\n\n if (expectations.requireOutcome && (run.outcome === undefined || run.outcome === null)) {\n issues.push({\n code: 'missing_outcome',\n message: `Run ${runId} has no outcome recorded.`,\n })\n }\n\n return {\n ok: issues.length === 0,\n runId,\n llmSpanCount: llmSpans.length,\n judgeSpanCount: judgeSpans.length,\n toolSpanCount: toolSpans.length,\n rawProviderEventCount: rawEventCount,\n rawSpanCoverage: coverage,\n issues,\n }\n}\n\n/** Strict mode: throws `RunIntegrityError` when the report isn't ok. */\nexport function throwIfRunIncomplete(report: RunIntegrityReport): void {\n if (!report.ok) throw new RunIntegrityError(report)\n}\n"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { r as CaptureIntegrityError } from "./errors-DEE6u6ot.js";
|
|
2
|
-
import { X as RawProviderSink } from "./types-
|
|
3
|
-
import { s as TraceStore } from "./store-
|
|
2
|
+
import { X as RawProviderSink } from "./types-D-mgRzlh.js";
|
|
3
|
+
import { s as TraceStore } from "./store-B3nWRy3B.js";
|
|
4
4
|
//#region src/trace/integrity.d.ts
|
|
5
5
|
interface RunIntegrityExpectations {
|
|
6
6
|
/** Minimum LLM span count. Default 0 (no requirement). */
|
|
@@ -54,8 +54,6 @@ declare class RunIntegrityError extends CaptureIntegrityError {
|
|
|
54
54
|
constructor(report: RunIntegrityReport);
|
|
55
55
|
}
|
|
56
56
|
declare function assertRunCaptured(store: TraceStore, runId: string, expectations?: RunIntegrityExpectations): Promise<RunIntegrityReport>;
|
|
57
|
-
/** Strict mode: throws `RunIntegrityError` when the report isn't ok. */
|
|
58
|
-
declare function throwIfRunIncomplete(report: RunIntegrityReport): void;
|
|
59
57
|
//#endregion
|
|
60
|
-
export { RunIntegrityReport as a, RunIntegrityIssueCode as i, RunIntegrityExpectations as n, assertRunCaptured as o, RunIntegrityIssue as r,
|
|
61
|
-
//# sourceMappingURL=integrity-
|
|
58
|
+
export { RunIntegrityReport as a, RunIntegrityIssueCode as i, RunIntegrityExpectations as n, assertRunCaptured as o, RunIntegrityIssue as r, RunIntegrityError as t };
|
|
59
|
+
//# sourceMappingURL=integrity-_qgZLA5p.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"integrity-
|
|
1
|
+
{"version":3,"file":"integrity-_qgZLA5p.d.ts","names":[],"sources":["../src/trace/integrity.ts"],"mappings":";;;;UAyBiB;;EAEf;;EAEA;;EAEA;;;;;EAKA,UAAU;;EAEV;;;;;;EAMA;;EAEA;;KAGU;UAWK;EACf,MAAM;EACN;EACA,SAAS;;UAGM;EACf;EACA;EACA;EACA;EACA;EACA;;;;;;EAMA;IAAmB;IAAiB;;EACpC,QAAQ;;cAGG,0BAA0B;WACT,QAAQ;EAApC,YAA4B,QAAQ;;iBAOhB,kBACpB,OAAO,YACP,eACA,eAAc,2BACb,QAAQ"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { s as ValidationError } from "./errors-
|
|
1
|
+
import { s as ValidationError } from "./errors-BcOs5MKW.js";
|
|
2
2
|
import { t as interpolatedQuantile } from "./quantile--0yb07pD.js";
|
|
3
|
-
import { t as mulberry32 } from "./random-
|
|
3
|
+
import { t as mulberry32 } from "./random-DDDcC7YU.js";
|
|
4
4
|
//#region src/math/special-functions.ts
|
|
5
5
|
/** Lanczos approximation to ln Gamma(z). */
|
|
6
6
|
function lnGamma(z) {
|
|
@@ -211,4 +211,4 @@ function symmetricTwoSampleSeed(a, b) {
|
|
|
211
211
|
//#endregion
|
|
212
212
|
export { medianInPlace as a, lnGamma as c, makeRng as i, regularizedIncompleteBeta as l, binomialHalfUpperTail as n, symmetricTwoSampleSeed as o, binomialSignTwoSided as r, zQuantile as s, assertFiniteSample as t };
|
|
213
213
|
|
|
214
|
-
//# sourceMappingURL=internal-
|
|
214
|
+
//# sourceMappingURL=internal-BTK91Bqt.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"internal-Epl-YBZW.js","names":[],"sources":["../src/math/special-functions.ts","../src/statistics/internal.ts"],"sourcesContent":["/** Lanczos approximation to ln Gamma(z). */\nexport function lnGamma(z: number): number {\n const g = 7\n const coefficients = [\n 0.99999999999980993, 676.5203681218851, -1259.1392167224028, 771.32342877765313,\n -176.61502916214059, 12.507343278686905, -0.13857109526572012, 9.9843695780195716e-6,\n 1.5056327351493116e-7,\n ]\n if (z < 0.5) {\n return Math.log(Math.PI / Math.sin(Math.PI * z)) - lnGamma(1 - z)\n }\n z -= 1\n let x = coefficients[0]!\n for (let i = 1; i < g + 2; i++) x += coefficients[i]! / (z + i)\n const t = z + g + 0.5\n return 0.5 * Math.log(2 * Math.PI) + (z + 0.5) * Math.log(t) - t + Math.log(x)\n}\n\n/**\n * Regularized incomplete beta function I_x(a, b).\n *\n * The Lentz continued fraction converges only for `x < (a+1)/(a+b+2)`; outside\n * that domain it must be reached through the symmetry `I_x(a,b) = 1 −\n * I_{1−x}(b,a)`. `studentTCdf` drives `x → 1` as `|t| → 0`, so the mirrored\n * branch is the one every near-null t-statistic takes.\n */\nexport function regularizedIncompleteBeta(x: number, a: number, b: number): number {\n if (x <= 0) return 0\n if (x >= 1) return 1\n const logBeta = lnGamma(a) + lnGamma(b) - lnGamma(a + b)\n // x^a·(1−x)^b / B(a,b) — symmetric under (x,a,b) → (1−x,b,a), so the\n // mirrored branch reuses it unchanged.\n const front = Math.exp(Math.log(x) * a + Math.log(1 - x) * b - logBeta)\n if (x < (a + 1) / (a + b + 2)) {\n return (front * betaContinuedFraction(x, a, b)) / a\n }\n return 1 - (front * betaContinuedFraction(1 - x, b, a)) / b\n}\n\n/** Modified Lentz evaluation of the beta continued fraction at `x`. */\nfunction betaContinuedFraction(x: number, a: number, b: number): number {\n const maxIterations = 300\n const epsilon = 3e-15\n let c = 1\n let d = 1 - ((a + b) * x) / (a + 1)\n if (Math.abs(d) < 1e-30) d = 1e-30\n d = 1 / d\n let fraction = d\n for (let m = 1; m <= maxIterations; m++) {\n const m2 = 2 * m\n let numerator = (m * (b - m) * x) / ((a + m2 - 1) * (a + m2))\n d = 1 + numerator * d\n if (Math.abs(d) < 1e-30) d = 1e-30\n c = 1 + numerator / c\n if (Math.abs(c) < 1e-30) c = 1e-30\n d = 1 / d\n fraction *= d * c\n numerator = -((a + m) * (a + b + m) * x) / ((a + m2) * (a + m2 + 1))\n d = 1 + numerator * d\n if (Math.abs(d) < 1e-30) d = 1e-30\n c = 1 + numerator / c\n if (Math.abs(c) < 1e-30) c = 1e-30\n d = 1 / d\n const delta = d * c\n fraction *= delta\n if (Math.abs(delta - 1) < epsilon) break\n }\n return fraction\n}\n","/**\n * Shared internals for the statistics modules. Nothing here is part of the\n * public statistics surface — `./index` does not re-export this module.\n */\n\nimport { ValidationError } from '../errors'\nimport { interpolatedQuantile } from '../math/quantile'\nimport { lnGamma } from '../math/special-functions'\nimport { mulberry32 } from './random'\n\n/** Every rank test refuses non-finite input. Beyond the arithmetic being\n * undefined, the tie-grouping scan compares values with `===`, and\n * `NaN === NaN` is false, so a NaN would leave the group boundary unable to\n * advance and spin the loop forever. */\nexport function assertFiniteSample(fn: string, label: string, xs: readonly number[]): void {\n for (let i = 0; i < xs.length; i++) {\n if (!Number.isFinite(xs[i])) {\n throw new ValidationError(`${fn}: ${label}[${i}] must be finite, got ${xs[i]}`)\n }\n }\n}\n\n/**\n * Two-sided exact p-value for b successes out of (b + c) Bernoulli(0.5) trials —\n * the exact-binomial core of {@link mcnemar}. `min(1, 2·P(X ≤ min(b,c)))`. No\n * discordant pairs ⇒ no evidence ⇒ p = 1. Summed in log space (lnGamma) so it\n * stays exact at large discordant counts without overflow.\n */\nexport function binomialSignTwoSided(b: number, c: number): number {\n const nd = b + c\n if (nd === 0) return 1\n return Math.min(1, 2 * binomialHalfLowerTail(Math.min(b, c), nd))\n}\n\n/** P(X >= successes) for X ~ Binomial(n, 0.5). */\nexport function binomialHalfUpperTail(successes: number, n: number): number {\n if (successes <= 0) return 1\n if (successes > n) return 0\n\n // Use the smaller side of the distribution. For lower thresholds the\n // complement sums at most half the mass; for upper thresholds symmetry\n // maps the upper tail to a lower tail without subtraction.\n if (successes <= n / 2) {\n return Math.max(0, 1 - binomialHalfLowerTail(successes - 1, n))\n }\n return binomialHalfLowerTail(n - successes, n)\n}\n\n/** P(X <= maxSuccesses) for X ~ Binomial(n, 0.5), accumulated in log space. */\nfunction binomialHalfLowerTail(maxSuccesses: number, n: number): number {\n if (maxSuccesses < 0) return 0\n if (maxSuccesses >= n) return 1\n if (maxSuccesses === 0) return 2 ** -n\n\n const logHalfN = n * Math.log(0.5)\n let logTail = Number.NEGATIVE_INFINITY\n for (let i = 0; i <= maxSuccesses; i++) {\n const logChoose = lnGamma(n + 1) - lnGamma(i + 1) - lnGamma(n - i + 1)\n logTail = logAddExp(logTail, logChoose + logHalfN)\n }\n return Math.min(1, Math.exp(logTail))\n}\n\nfunction logAddExp(a: number, b: number): number {\n if (a === Number.NEGATIVE_INFINITY) return b\n if (b === Number.NEGATIVE_INFINITY) return a\n const max = Math.max(a, b)\n const min = Math.min(a, b)\n return max + Math.log1p(Math.exp(min - max))\n}\n\n/** Standard-normal inverse CDF (Acklam approximation). */\nexport function zQuantile(p: number): number {\n if (p <= 0 || p >= 1) {\n if (p === 0) return -Infinity\n if (p === 1) return Infinity\n return NaN\n }\n const a = [\n -3.969683028665376e1, 2.209460984245205e2, -2.759285104469687e2, 1.38357751867269e2,\n -3.066479806614716e1, 2.506628277459239,\n ]\n const b = [\n -5.447609879822406e1, 1.615858368580409e2, -1.556989798598866e2, 6.680131188771972e1,\n -1.328068155288572e1,\n ]\n const c = [\n -7.784894002430293e-3, -3.223964580411365e-1, -2.400758277161838, -2.549732539343734,\n 4.374664141464968, 2.938163982698783,\n ]\n const d = [7.784695709041462e-3, 3.224671290700398e-1, 2.445134137142996, 3.754408661907416]\n const pLow = 0.02425\n const pHigh = 1 - pLow\n let q: number\n let r: number\n if (p < pLow) {\n q = Math.sqrt(-2 * Math.log(p))\n return (\n (((((c[0]! * q + c[1]!) * q + c[2]!) * q + c[3]!) * q + c[4]!) * q + c[5]!) /\n ((((d[0]! * q + d[1]!) * q + d[2]!) * q + d[3]!) * q + 1)\n )\n }\n if (p <= pHigh) {\n q = p - 0.5\n r = q * q\n return (\n ((((((a[0]! * r + a[1]!) * r + a[2]!) * r + a[3]!) * r + a[4]!) * r + a[5]!) * q) /\n (((((b[0]! * r + b[1]!) * r + b[2]!) * r + b[3]!) * r + b[4]!) * r + 1)\n )\n }\n q = Math.sqrt(-2 * Math.log(1 - p))\n return (\n -(((((c[0]! * q + c[1]!) * q + c[2]!) * q + c[3]!) * q + c[4]!) * q + c[5]!) /\n ((((d[0]! * q + d[1]!) * q + d[2]!) * q + d[3]!) * q + 1)\n )\n}\n\nexport function medianInPlace(xs: number[]): number {\n if (xs.length === 0) return 0\n xs.sort((a, b) => a - b)\n return interpolatedQuantile(xs, 0.5)\n}\n\n/**\n * PRNG for every resampling path in this module.\n *\n * With no caller seed the seed is DERIVED FROM THE DATA rather than taken from\n * `Math.random`, so re-running the same input reproduces the same interval —\n * a gate verdict that cannot be re-derived is not evidence. Distinct data\n * still gets a distinct stream. Same pattern as `promotion-gate.ts`.\n */\nexport function makeRng(\n seed: number | undefined,\n ...series: readonly (readonly number[])[]\n): () => number {\n return mulberry32(seed ?? seedFromData(series))\n}\n\n/** FNV-1a over the IEEE-754 bytes of every observation. */\nfunction seedFromData(series: readonly (readonly number[])[]): number {\n const view = new DataView(new ArrayBuffer(8))\n // 32-bit FNV-1a over the IEEE-754 BYTES of each observation, not over a\n // string. Frozen: it seeds the unseeded bootstrap from the data itself, so a\n // change moves every interval this package has already published. The\n // string-input variants elsewhere cannot be substituted here.\n let hash = 0x811c9dc5\n for (const xs of series) {\n for (const x of xs) {\n view.setFloat64(0, x)\n for (let byte = 0; byte < 8; byte++) {\n hash = Math.imul(hash ^ view.getUint8(byte), 0x01000193)\n }\n }\n // Separator, so ([1],[2]) and ([1,2],[]) do not collide.\n hash = Math.imul(hash ^ 0xff, 0x01000193)\n }\n return hash | 0\n}\n\n/** Order-independent seed for a symmetric two-sample statistic. */\nexport function symmetricTwoSampleSeed(a: readonly number[], b: readonly number[]): number {\n const sortedA = [...a].sort((left, right) => left - right)\n const sortedB = [...b].sort((left, right) => left - right)\n const forward = seedFromData([sortedA, sortedB]) >>> 0\n const reversed = seedFromData([sortedB, sortedA]) >>> 0\n return Math.min(forward, reversed)\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"internal-BTK91Bqt.js","names":[],"sources":["../src/math/special-functions.ts","../src/statistics/internal.ts"],"sourcesContent":["/** Lanczos approximation to ln Gamma(z). */\nexport function lnGamma(z: number): number {\n const g = 7\n const coefficients = [\n 0.99999999999980993, 676.5203681218851, -1259.1392167224028, 771.32342877765313,\n -176.61502916214059, 12.507343278686905, -0.13857109526572012, 9.9843695780195716e-6,\n 1.5056327351493116e-7,\n ]\n if (z < 0.5) {\n return Math.log(Math.PI / Math.sin(Math.PI * z)) - lnGamma(1 - z)\n }\n z -= 1\n let x = coefficients[0]!\n for (let i = 1; i < g + 2; i++) x += coefficients[i]! / (z + i)\n const t = z + g + 0.5\n return 0.5 * Math.log(2 * Math.PI) + (z + 0.5) * Math.log(t) - t + Math.log(x)\n}\n\n/**\n * Regularized incomplete beta function I_x(a, b).\n *\n * The Lentz continued fraction converges only for `x < (a+1)/(a+b+2)`; outside\n * that domain it must be reached through the symmetry `I_x(a,b) = 1 −\n * I_{1−x}(b,a)`. `studentTCdf` drives `x → 1` as `|t| → 0`, so the mirrored\n * branch is the one every near-null t-statistic takes.\n */\nexport function regularizedIncompleteBeta(x: number, a: number, b: number): number {\n if (x <= 0) return 0\n if (x >= 1) return 1\n const logBeta = lnGamma(a) + lnGamma(b) - lnGamma(a + b)\n // x^a·(1−x)^b / B(a,b) — symmetric under (x,a,b) → (1−x,b,a), so the\n // mirrored branch reuses it unchanged.\n const front = Math.exp(Math.log(x) * a + Math.log(1 - x) * b - logBeta)\n if (x < (a + 1) / (a + b + 2)) {\n return (front * betaContinuedFraction(x, a, b)) / a\n }\n return 1 - (front * betaContinuedFraction(1 - x, b, a)) / b\n}\n\n/** Modified Lentz evaluation of the beta continued fraction at `x`. */\nfunction betaContinuedFraction(x: number, a: number, b: number): number {\n const maxIterations = 300\n const epsilon = 3e-15\n let c = 1\n let d = 1 - ((a + b) * x) / (a + 1)\n if (Math.abs(d) < 1e-30) d = 1e-30\n d = 1 / d\n let fraction = d\n for (let m = 1; m <= maxIterations; m++) {\n const m2 = 2 * m\n let numerator = (m * (b - m) * x) / ((a + m2 - 1) * (a + m2))\n d = 1 + numerator * d\n if (Math.abs(d) < 1e-30) d = 1e-30\n c = 1 + numerator / c\n if (Math.abs(c) < 1e-30) c = 1e-30\n d = 1 / d\n fraction *= d * c\n numerator = -((a + m) * (a + b + m) * x) / ((a + m2) * (a + m2 + 1))\n d = 1 + numerator * d\n if (Math.abs(d) < 1e-30) d = 1e-30\n c = 1 + numerator / c\n if (Math.abs(c) < 1e-30) c = 1e-30\n d = 1 / d\n const delta = d * c\n fraction *= delta\n if (Math.abs(delta - 1) < epsilon) break\n }\n return fraction\n}\n","/**\n * Shared internals for the statistics modules. Nothing here is part of the\n * public statistics surface — `./index` does not re-export this module.\n */\n\nimport { ValidationError } from '../errors'\nimport { interpolatedQuantile } from '../math/quantile'\nimport { lnGamma } from '../math/special-functions'\nimport { mulberry32 } from './random'\n\n/** Every rank test refuses non-finite input. Beyond the arithmetic being\n * undefined, the tie-grouping scan compares values with `===`, and\n * `NaN === NaN` is false, so a NaN would leave the group boundary unable to\n * advance and spin the loop forever. */\nexport function assertFiniteSample(fn: string, label: string, xs: readonly number[]): void {\n for (let i = 0; i < xs.length; i++) {\n if (!Number.isFinite(xs[i])) {\n throw new ValidationError(`${fn}: ${label}[${i}] must be finite, got ${xs[i]}`)\n }\n }\n}\n\n/**\n * Two-sided exact p-value for b successes out of (b + c) Bernoulli(0.5) trials —\n * the exact-binomial core of {@link mcnemar}. `min(1, 2·P(X ≤ min(b,c)))`. No\n * discordant pairs ⇒ no evidence ⇒ p = 1. Summed in log space (lnGamma) so it\n * stays exact at large discordant counts without overflow.\n */\nexport function binomialSignTwoSided(b: number, c: number): number {\n const nd = b + c\n if (nd === 0) return 1\n return Math.min(1, 2 * binomialHalfLowerTail(Math.min(b, c), nd))\n}\n\n/** P(X >= successes) for X ~ Binomial(n, 0.5). */\nexport function binomialHalfUpperTail(successes: number, n: number): number {\n if (successes <= 0) return 1\n if (successes > n) return 0\n\n // Use the smaller side of the distribution. For lower thresholds the\n // complement sums at most half the mass; for upper thresholds symmetry\n // maps the upper tail to a lower tail without subtraction.\n if (successes <= n / 2) {\n return Math.max(0, 1 - binomialHalfLowerTail(successes - 1, n))\n }\n return binomialHalfLowerTail(n - successes, n)\n}\n\n/** P(X <= maxSuccesses) for X ~ Binomial(n, 0.5), accumulated in log space. */\nfunction binomialHalfLowerTail(maxSuccesses: number, n: number): number {\n if (maxSuccesses < 0) return 0\n if (maxSuccesses >= n) return 1\n if (maxSuccesses === 0) return 2 ** -n\n\n const logHalfN = n * Math.log(0.5)\n let logTail = Number.NEGATIVE_INFINITY\n for (let i = 0; i <= maxSuccesses; i++) {\n const logChoose = lnGamma(n + 1) - lnGamma(i + 1) - lnGamma(n - i + 1)\n logTail = logAddExp(logTail, logChoose + logHalfN)\n }\n return Math.min(1, Math.exp(logTail))\n}\n\nfunction logAddExp(a: number, b: number): number {\n if (a === Number.NEGATIVE_INFINITY) return b\n if (b === Number.NEGATIVE_INFINITY) return a\n const max = Math.max(a, b)\n const min = Math.min(a, b)\n return max + Math.log1p(Math.exp(min - max))\n}\n\n/** Standard-normal inverse CDF (Acklam approximation). */\nexport function zQuantile(p: number): number {\n if (p <= 0 || p >= 1) {\n if (p === 0) return -Infinity\n if (p === 1) return Infinity\n return NaN\n }\n const a = [\n -3.969683028665376e1, 2.209460984245205e2, -2.759285104469687e2, 1.38357751867269e2,\n -3.066479806614716e1, 2.506628277459239,\n ]\n const b = [\n -5.447609879822406e1, 1.615858368580409e2, -1.556989798598866e2, 6.680131188771972e1,\n -1.328068155288572e1,\n ]\n const c = [\n -7.784894002430293e-3, -3.223964580411365e-1, -2.400758277161838, -2.549732539343734,\n 4.374664141464968, 2.938163982698783,\n ]\n const d = [7.784695709041462e-3, 3.224671290700398e-1, 2.445134137142996, 3.754408661907416]\n const pLow = 0.02425\n const pHigh = 1 - pLow\n let q: number\n let r: number\n if (p < pLow) {\n q = Math.sqrt(-2 * Math.log(p))\n return (\n (((((c[0]! * q + c[1]!) * q + c[2]!) * q + c[3]!) * q + c[4]!) * q + c[5]!) /\n ((((d[0]! * q + d[1]!) * q + d[2]!) * q + d[3]!) * q + 1)\n )\n }\n if (p <= pHigh) {\n q = p - 0.5\n r = q * q\n return (\n ((((((a[0]! * r + a[1]!) * r + a[2]!) * r + a[3]!) * r + a[4]!) * r + a[5]!) * q) /\n (((((b[0]! * r + b[1]!) * r + b[2]!) * r + b[3]!) * r + b[4]!) * r + 1)\n )\n }\n q = Math.sqrt(-2 * Math.log(1 - p))\n return (\n -(((((c[0]! * q + c[1]!) * q + c[2]!) * q + c[3]!) * q + c[4]!) * q + c[5]!) /\n ((((d[0]! * q + d[1]!) * q + d[2]!) * q + d[3]!) * q + 1)\n )\n}\n\nexport function medianInPlace(xs: number[]): number {\n if (xs.length === 0) return 0\n xs.sort((a, b) => a - b)\n return interpolatedQuantile(xs, 0.5)\n}\n\n/**\n * PRNG for every resampling path in this module.\n *\n * With no caller seed the seed is DERIVED FROM THE DATA rather than taken from\n * `Math.random`, so re-running the same input reproduces the same interval —\n * a gate verdict that cannot be re-derived is not evidence. Distinct data\n * still gets a distinct stream. Same pattern as `promotion-gate.ts`.\n */\nexport function makeRng(\n seed: number | undefined,\n ...series: readonly (readonly number[])[]\n): () => number {\n return mulberry32(seed ?? seedFromData(series))\n}\n\n/** FNV-1a over the IEEE-754 bytes of every observation. */\nfunction seedFromData(series: readonly (readonly number[])[]): number {\n const view = new DataView(new ArrayBuffer(8))\n // 32-bit FNV-1a over the IEEE-754 BYTES of each observation, not over a\n // string. Frozen: it seeds the unseeded bootstrap from the data itself, so a\n // change moves every interval this package has already published. The\n // string-input variants elsewhere cannot be substituted here.\n let hash = 0x811c9dc5\n for (const xs of series) {\n for (const x of xs) {\n view.setFloat64(0, x)\n for (let byte = 0; byte < 8; byte++) {\n hash = Math.imul(hash ^ view.getUint8(byte), 0x01000193)\n }\n }\n // Separator, so ([1],[2]) and ([1,2],[]) do not collide.\n hash = Math.imul(hash ^ 0xff, 0x01000193)\n }\n return hash | 0\n}\n\n/** Order-independent seed for a symmetric two-sample statistic. */\nexport function symmetricTwoSampleSeed(a: readonly number[], b: readonly number[]): number {\n const sortedA = [...a].sort((left, right) => left - right)\n const sortedB = [...b].sort((left, right) => left - right)\n const forward = seedFromData([sortedA, sortedB]) >>> 0\n const reversed = seedFromData([sortedB, sortedA]) >>> 0\n return Math.min(forward, reversed)\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { s as ValidationError } from "./errors-
|
|
2
|
-
import { t as mulberry32 } from "./random-
|
|
1
|
+
import { s as ValidationError } from "./errors-BcOs5MKW.js";
|
|
2
|
+
import { t as mulberry32 } from "./random-DDDcC7YU.js";
|
|
3
3
|
import { n as evaluatePredicate, r as readField } from "./predicate-FdKmElA_.js";
|
|
4
4
|
//#region src/experiment/ast/estimand.ts
|
|
5
5
|
function evaluateSetExpr(expr, rows, armField, idField) {
|
|
@@ -216,4 +216,4 @@ function logFactorial(n) {
|
|
|
216
216
|
//#endregion
|
|
217
217
|
export { intervalSpecProblems as n, computeEstimand as r, computeInterval as t };
|
|
218
218
|
|
|
219
|
-
//# sourceMappingURL=interval-
|
|
219
|
+
//# sourceMappingURL=interval-Dq9gt7jx.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interval-CELpye1n.js","names":[],"sources":["../src/experiment/ast/estimand.ts","../src/experiment/ast/interval.ts"],"sourcesContent":["import { ValidationError } from '../../errors'\nimport type { EvidenceRecord } from './evidence'\nimport { evaluatePredicate, type Predicate, readField } from './predicate'\n\n// ── Estimands ────────────────────────────────────────────────────────\n\n/** A named set of row identities, built from arm rows and an event predicate. */\nexport type SetExpr =\n | { kind: 'rows-where'; arm: string; event: Predicate }\n | { kind: 'intersect'; of: SetExpr[] }\n\n/**\n * What the experiment measures. Every estimand names the fields it reads, so\n * the sealed tree records the full data dependency of the number.\n */\nexport type Estimand =\n | { kind: 'rate'; event: Predicate; over: 'rollouts' }\n | { kind: 'rate-at-least-once'; event: Predicate; groupBy: string }\n | {\n kind: 'paired-mean-diff'\n armField: string\n treatment: string\n control: string\n pairBy: string\n /**\n * Field path to the per-row outcome. A boolean reads as 1 or 0, so a\n * binary pass/fail outcome gives the risk difference directly.\n */\n value: string\n /** A pair one arm did not answer contributes a difference of exactly zero. */\n missing: 'zero-diff'\n }\n | {\n kind: 'set-ratio'\n armField: string\n idField: string\n numerator: SetExpr\n denominator: SetExpr\n }\n\nexport interface EstimandResult {\n value: number\n numerator: number\n denominator: number\n}\n\nfunction evaluateSetExpr(\n expr: SetExpr,\n rows: readonly EvidenceRecord[],\n armField: string,\n idField: string,\n): Set<string> {\n if (expr.kind === 'rows-where') {\n const ids = new Set<string>()\n for (const row of rows) {\n if (String(readField(row, armField)) !== expr.arm) continue\n if (evaluatePredicate(expr.event, row)) ids.add(String(readField(row, idField)))\n }\n return ids\n }\n if (expr.of.length === 0) throw new ValidationError('computeEstimand: empty intersect')\n const sets = expr.of.map((e) => evaluateSetExpr(e, rows, armField, idField))\n const [first, ...rest] = sets\n const out = new Set<string>()\n for (const id of first!) {\n if (rest.every((s) => s.has(id))) out.add(id)\n }\n return out\n}\n\n/**\n * Read one registered outcome field as a number.\n *\n * A binary outcome reaches evidence as `true` or `false`. Its mean is the pass\n * rate and the mean of its paired differences is the risk difference, so\n * `true` reads as 1 and `false` as 0 — the same quantity a caller would\n * otherwise encode by hand, and the same reading in every interpreter here.\n * Every other type, and a non-finite number, is a measurement defect: it\n * rejects instead of poisoning the mean with `NaN` or a coerced zero.\n */\nexport function readNumericOutcome(\n raw: unknown,\n context: string,\n field: string,\n where: string,\n): number {\n if (typeof raw === 'boolean') return raw ? 1 : 0\n if (typeof raw === 'number' && Number.isFinite(raw)) return raw\n throw new ValidationError(\n `${context}: value field '${field}' is not a finite number or a boolean on ${where}`,\n )\n}\n\n/** Compute an estimand over evidence rows. Pure; reads only registered fields. */\nexport function computeEstimand(\n estimand: Estimand,\n rows: readonly EvidenceRecord[],\n): EstimandResult {\n switch (estimand.kind) {\n case 'rate': {\n const numerator = rows.filter((r) => evaluatePredicate(estimand.event, r)).length\n if (rows.length === 0) throw new ValidationError('computeEstimand: rate over zero rows')\n return { value: numerator / rows.length, numerator, denominator: rows.length }\n }\n case 'rate-at-least-once': {\n const byGroup = new Map<string, boolean>()\n for (const row of rows) {\n const group = String(readField(row, estimand.groupBy))\n const hit = evaluatePredicate(estimand.event, row)\n byGroup.set(group, (byGroup.get(group) ?? false) || hit)\n }\n if (byGroup.size === 0) {\n throw new ValidationError('computeEstimand: rate-at-least-once over zero groups')\n }\n const numerator = [...byGroup.values()].filter(Boolean).length\n return { value: numerator / byGroup.size, numerator, denominator: byGroup.size }\n }\n case 'paired-mean-diff': {\n const byPair = new Map<string, { treatment?: number; control?: number }>()\n for (const row of rows) {\n const arm = String(readField(row, estimand.armField))\n if (arm !== estimand.treatment && arm !== estimand.control) continue\n const pair = String(readField(row, estimand.pairBy))\n const value = readNumericOutcome(\n readField(row, estimand.value),\n 'computeEstimand paired-mean-diff',\n estimand.value,\n `pair '${pair}'`,\n )\n const slot = byPair.get(pair) ?? {}\n if (arm === estimand.treatment) slot.treatment = value\n else slot.control = value\n byPair.set(pair, slot)\n }\n if (byPair.size === 0) {\n throw new ValidationError('computeEstimand: paired-mean-diff over zero pairs')\n }\n let sum = 0\n for (const slot of byPair.values()) {\n // missing: 'zero-diff' — an unanswered side contributes zero, never a drop\n sum += (slot.treatment ?? 0) - (slot.control ?? 0)\n }\n return { value: sum / byPair.size, numerator: sum, denominator: byPair.size }\n }\n case 'set-ratio': {\n const numeratorSet = evaluateSetExpr(\n estimand.numerator,\n rows,\n estimand.armField,\n estimand.idField,\n )\n const denominatorSet = evaluateSetExpr(\n estimand.denominator,\n rows,\n estimand.armField,\n estimand.idField,\n )\n if (denominatorSet.size === 0) {\n throw new ValidationError('computeEstimand: set-ratio denominator set is empty')\n }\n return {\n value: numeratorSet.size / denominatorSet.size,\n numerator: numeratorSet.size,\n denominator: denominatorSet.size,\n }\n }\n }\n}\n","import { ValidationError } from '../../errors'\nimport { mulberry32 } from '../../statistics'\nimport { readNumericOutcome } from './estimand'\nimport type { EvidenceRecord } from './evidence'\nimport { readField } from './predicate'\n\n// ── Intervals ────────────────────────────────────────────────────────\n\n/** How uncertainty is computed. The seed is part of the registration. */\nexport type IntervalSpec =\n | {\n kind: 'cluster-bootstrap'\n clusterBy: string\n /** Registered numeric or boolean outcome field, including a prepared paired difference. */\n value: string\n resamples: number\n seed: number\n level: number\n method: 'percentile'\n }\n | { kind: 'clopper-pearson'; level: number }\n\nexport interface ComputedInterval {\n lower: number\n upper: number\n level: number\n}\n\n/** Shared by registration and direct execution so malformed intervals cannot produce evidence. */\nexport function intervalSpecProblems(spec: IntervalSpec): string[] {\n if (spec === null || typeof spec !== 'object' || Array.isArray(spec)) {\n return ['interval must be an object']\n }\n if (spec.kind !== 'cluster-bootstrap' && spec.kind !== 'clopper-pearson') {\n return ['interval kind must be cluster-bootstrap or clopper-pearson']\n }\n const problems: string[] = []\n if (!Number.isFinite(spec.level) || spec.level <= 0 || spec.level >= 1) {\n problems.push('level must be a finite number between zero and one')\n }\n if (spec.kind === 'cluster-bootstrap') {\n for (const field of ['clusterBy', 'value'] as const) {\n const path = spec[field]\n if (\n typeof path !== 'string' ||\n path.split('.').some((segment) => segment.length === 0 || segment.trim() !== segment)\n ) {\n problems.push(`${field} must be a nonempty dot-separated field path`)\n }\n }\n if (\n !Number.isSafeInteger(spec.resamples) ||\n spec.resamples < 1 ||\n spec.resamples > 0xffff_ffff\n ) {\n problems.push('resamples must be a positive integer within the supported array length')\n }\n if (!Number.isSafeInteger(spec.seed)) problems.push('seed must be a safe integer')\n if (spec.method !== 'percentile') problems.push('method must be percentile')\n }\n return problems\n}\n\n/**\n * Execute an interval spec.\n *\n * Cluster-bootstrap resamples whole clusters of its registered `value` field and\n * takes percentile bounds of the pooled mean. Clopper-Pearson computes the\n * exact binomial interval and requires `successes`/`trials` evidence instead\n * of rows.\n */\nexport function computeInterval(\n spec: IntervalSpec,\n evidence:\n | { kind: 'rows'; rows: readonly EvidenceRecord[] }\n | { kind: 'binomial'; successes: number; trials: number },\n): ComputedInterval {\n const problems = intervalSpecProblems(spec)\n if (problems.length > 0) throw new ValidationError(`computeInterval: ${problems.join('; ')}`)\n if (evidence === null || typeof evidence !== 'object' || Array.isArray(evidence)) {\n throw new ValidationError('computeInterval: evidence must be an object')\n }\n if (spec.kind === 'cluster-bootstrap') {\n if (evidence.kind !== 'rows') {\n throw new ValidationError('computeInterval: cluster-bootstrap requires row evidence')\n }\n if ('value' in evidence) {\n throw new ValidationError(\n 'computeInterval: register value in the interval spec, not row evidence',\n )\n }\n if (!Array.isArray(evidence.rows))\n throw new ValidationError('computeInterval: rows must be an array')\n const clusters = new Map<string, number[]>()\n for (const [index, row] of evidence.rows.entries()) {\n if (row === null || typeof row !== 'object' || Array.isArray(row)) {\n throw new ValidationError(`computeInterval: row ${index} must be an object`)\n }\n const cluster = readField(row, spec.clusterBy)\n if (\n !(typeof cluster === 'string' && cluster.length > 0 && cluster.trim() === cluster) &&\n !(typeof cluster === 'number' && Number.isFinite(cluster))\n ) {\n throw new ValidationError(\n `computeInterval: cluster field '${spec.clusterBy}' must be a nonempty string or finite number on row ${index}`,\n )\n }\n const clusterKey = `${typeof cluster}:${cluster}`\n const value = readNumericOutcome(\n readField(row, spec.value),\n 'computeInterval cluster-bootstrap',\n spec.value,\n `cluster '${cluster}'`,\n )\n const bucket = clusters.get(clusterKey)\n if (bucket) bucket.push(value)\n else clusters.set(clusterKey, [value])\n }\n const clusterValues = [...clusters.entries()]\n .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))\n .map(([, values]) => values)\n if (clusterValues.length < 2) {\n throw new ValidationError(\n `computeInterval: cluster-bootstrap needs >= 2 clusters, got ${clusterValues.length}`,\n )\n }\n const rng = mulberry32(spec.seed)\n const means = new Array<number>(spec.resamples)\n for (let draw = 0; draw < spec.resamples; draw++) {\n let sum = 0\n let count = 0\n for (let pick = 0; pick < clusterValues.length; pick++) {\n const cluster = clusterValues[Math.floor(rng() * clusterValues.length)]!\n for (const value of cluster) sum += value\n count += cluster.length\n }\n means[draw] = sum / count\n if (!Number.isFinite(means[draw])) {\n throw new ValidationError(\n 'computeInterval: cluster mean overflowed the finite numeric range',\n )\n }\n }\n means.sort((a, b) => a - b)\n const alpha = 1 - spec.level\n const lowerIndex = Math.floor((alpha / 2) * spec.resamples)\n const upperIndex = Math.min(spec.resamples - 1, Math.ceil((1 - alpha / 2) * spec.resamples) - 1)\n return {\n lower: means[lowerIndex]!,\n upper: means[Math.max(lowerIndex, upperIndex)]!,\n level: spec.level,\n }\n }\n\n if (evidence.kind !== 'binomial') {\n throw new ValidationError('computeInterval: clopper-pearson requires binomial evidence')\n }\n const { successes, trials } = evidence\n if (\n !Number.isSafeInteger(successes) ||\n !Number.isSafeInteger(trials) ||\n trials <= 0 ||\n successes < 0\n ) {\n throw new ValidationError(\n `computeInterval: clopper-pearson needs 0 <= successes <= trials, got ${successes}/${trials}`,\n )\n }\n if (successes > trials) {\n throw new ValidationError(\n `computeInterval: clopper-pearson successes ${successes} exceed trials ${trials}`,\n )\n }\n const alpha = 1 - spec.level\n const lower = successes === 0 ? 0 : binomialQuantile(successes, trials, alpha / 2, 'lower')\n const upper = successes === trials ? 1 : binomialQuantile(successes, trials, alpha / 2, 'upper')\n return { lower, upper, level: spec.level }\n}\n\n/**\n * Clopper-Pearson bound by bisection on the binomial tail. The lower bound is\n * the p with P(X >= successes | p) = alpha; the upper is the p with\n * P(X <= successes | p) = alpha. Deterministic, no special functions.\n */\nfunction binomialQuantile(\n successes: number,\n trials: number,\n alpha: number,\n side: 'lower' | 'upper',\n): number {\n const tail = (p: number): number => {\n // log-space binomial pmf accumulation for numeric stability\n let sum = 0\n for (let k = 0; k <= trials; k++) {\n const inTail = side === 'lower' ? k >= successes : k <= successes\n if (!inTail) continue\n sum += Math.exp(logBinomialPmf(k, trials, p))\n }\n return sum\n }\n let lo = 0\n let hi = 1\n for (let iter = 0; iter < 100; iter++) {\n const mid = (lo + hi) / 2\n if (tail(mid) < alpha) {\n if (side === 'lower') lo = mid\n else hi = mid\n } else {\n if (side === 'lower') hi = mid\n else lo = mid\n }\n }\n return (lo + hi) / 2\n}\n\nfunction logBinomialPmf(k: number, n: number, p: number): number {\n if (p <= 0) return k === 0 ? 0 : Number.NEGATIVE_INFINITY\n if (p >= 1) return k === n ? 0 : Number.NEGATIVE_INFINITY\n return logChoose(n, k) + k * Math.log(p) + (n - k) * Math.log(1 - p)\n}\n\nfunction logChoose(n: number, k: number): number {\n return logFactorial(n) - logFactorial(k) - logFactorial(n - k)\n}\n\nconst LOG_FACTORIAL_CACHE: number[] = [0]\n\nfunction logFactorial(n: number): number {\n for (let i = LOG_FACTORIAL_CACHE.length; i <= n; i++) {\n LOG_FACTORIAL_CACHE[i] = LOG_FACTORIAL_CACHE[i - 1]! + Math.log(i)\n }\n return LOG_FACTORIAL_CACHE[n]!\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"interval-Dq9gt7jx.js","names":[],"sources":["../src/experiment/ast/estimand.ts","../src/experiment/ast/interval.ts"],"sourcesContent":["import { ValidationError } from '../../errors'\nimport type { EvidenceRecord } from './evidence'\nimport { evaluatePredicate, type Predicate, readField } from './predicate'\n\n// ── Estimands ────────────────────────────────────────────────────────\n\n/** A named set of row identities, built from arm rows and an event predicate. */\nexport type SetExpr =\n | { kind: 'rows-where'; arm: string; event: Predicate }\n | { kind: 'intersect'; of: SetExpr[] }\n\n/**\n * What the experiment measures. Every estimand names the fields it reads, so\n * the sealed tree records the full data dependency of the number.\n */\nexport type Estimand =\n | { kind: 'rate'; event: Predicate; over: 'rollouts' }\n | { kind: 'rate-at-least-once'; event: Predicate; groupBy: string }\n | {\n kind: 'paired-mean-diff'\n armField: string\n treatment: string\n control: string\n pairBy: string\n /**\n * Field path to the per-row outcome. A boolean reads as 1 or 0, so a\n * binary pass/fail outcome gives the risk difference directly.\n */\n value: string\n /** A pair one arm did not answer contributes a difference of exactly zero. */\n missing: 'zero-diff'\n }\n | {\n kind: 'set-ratio'\n armField: string\n idField: string\n numerator: SetExpr\n denominator: SetExpr\n }\n\nexport interface EstimandResult {\n value: number\n numerator: number\n denominator: number\n}\n\nfunction evaluateSetExpr(\n expr: SetExpr,\n rows: readonly EvidenceRecord[],\n armField: string,\n idField: string,\n): Set<string> {\n if (expr.kind === 'rows-where') {\n const ids = new Set<string>()\n for (const row of rows) {\n if (String(readField(row, armField)) !== expr.arm) continue\n if (evaluatePredicate(expr.event, row)) ids.add(String(readField(row, idField)))\n }\n return ids\n }\n if (expr.of.length === 0) throw new ValidationError('computeEstimand: empty intersect')\n const sets = expr.of.map((e) => evaluateSetExpr(e, rows, armField, idField))\n const [first, ...rest] = sets\n const out = new Set<string>()\n for (const id of first!) {\n if (rest.every((s) => s.has(id))) out.add(id)\n }\n return out\n}\n\n/**\n * Read one registered outcome field as a number.\n *\n * A binary outcome reaches evidence as `true` or `false`. Its mean is the pass\n * rate and the mean of its paired differences is the risk difference, so\n * `true` reads as 1 and `false` as 0 — the same quantity a caller would\n * otherwise encode by hand, and the same reading in every interpreter here.\n * Every other type, and a non-finite number, is a measurement defect: it\n * rejects instead of poisoning the mean with `NaN` or a coerced zero.\n */\nexport function readNumericOutcome(\n raw: unknown,\n context: string,\n field: string,\n where: string,\n): number {\n if (typeof raw === 'boolean') return raw ? 1 : 0\n if (typeof raw === 'number' && Number.isFinite(raw)) return raw\n throw new ValidationError(\n `${context}: value field '${field}' is not a finite number or a boolean on ${where}`,\n )\n}\n\n/** Compute an estimand over evidence rows. Pure; reads only registered fields. */\nexport function computeEstimand(\n estimand: Estimand,\n rows: readonly EvidenceRecord[],\n): EstimandResult {\n switch (estimand.kind) {\n case 'rate': {\n const numerator = rows.filter((r) => evaluatePredicate(estimand.event, r)).length\n if (rows.length === 0) throw new ValidationError('computeEstimand: rate over zero rows')\n return { value: numerator / rows.length, numerator, denominator: rows.length }\n }\n case 'rate-at-least-once': {\n const byGroup = new Map<string, boolean>()\n for (const row of rows) {\n const group = String(readField(row, estimand.groupBy))\n const hit = evaluatePredicate(estimand.event, row)\n byGroup.set(group, (byGroup.get(group) ?? false) || hit)\n }\n if (byGroup.size === 0) {\n throw new ValidationError('computeEstimand: rate-at-least-once over zero groups')\n }\n const numerator = [...byGroup.values()].filter(Boolean).length\n return { value: numerator / byGroup.size, numerator, denominator: byGroup.size }\n }\n case 'paired-mean-diff': {\n const byPair = new Map<string, { treatment?: number; control?: number }>()\n for (const row of rows) {\n const arm = String(readField(row, estimand.armField))\n if (arm !== estimand.treatment && arm !== estimand.control) continue\n const pair = String(readField(row, estimand.pairBy))\n const value = readNumericOutcome(\n readField(row, estimand.value),\n 'computeEstimand paired-mean-diff',\n estimand.value,\n `pair '${pair}'`,\n )\n const slot = byPair.get(pair) ?? {}\n if (arm === estimand.treatment) slot.treatment = value\n else slot.control = value\n byPair.set(pair, slot)\n }\n if (byPair.size === 0) {\n throw new ValidationError('computeEstimand: paired-mean-diff over zero pairs')\n }\n let sum = 0\n for (const slot of byPair.values()) {\n // missing: 'zero-diff' — an unanswered side contributes zero, never a drop\n sum += (slot.treatment ?? 0) - (slot.control ?? 0)\n }\n return { value: sum / byPair.size, numerator: sum, denominator: byPair.size }\n }\n case 'set-ratio': {\n const numeratorSet = evaluateSetExpr(\n estimand.numerator,\n rows,\n estimand.armField,\n estimand.idField,\n )\n const denominatorSet = evaluateSetExpr(\n estimand.denominator,\n rows,\n estimand.armField,\n estimand.idField,\n )\n if (denominatorSet.size === 0) {\n throw new ValidationError('computeEstimand: set-ratio denominator set is empty')\n }\n return {\n value: numeratorSet.size / denominatorSet.size,\n numerator: numeratorSet.size,\n denominator: denominatorSet.size,\n }\n }\n }\n}\n","import { ValidationError } from '../../errors'\nimport { mulberry32 } from '../../statistics'\nimport { readNumericOutcome } from './estimand'\nimport type { EvidenceRecord } from './evidence'\nimport { readField } from './predicate'\n\n// ── Intervals ────────────────────────────────────────────────────────\n\n/** How uncertainty is computed. The seed is part of the registration. */\nexport type IntervalSpec =\n | {\n kind: 'cluster-bootstrap'\n clusterBy: string\n /** Registered numeric or boolean outcome field, including a prepared paired difference. */\n value: string\n resamples: number\n seed: number\n level: number\n method: 'percentile'\n }\n | { kind: 'clopper-pearson'; level: number }\n\nexport interface ComputedInterval {\n lower: number\n upper: number\n level: number\n}\n\n/** Shared by registration and direct execution so malformed intervals cannot produce evidence. */\nexport function intervalSpecProblems(spec: IntervalSpec): string[] {\n if (spec === null || typeof spec !== 'object' || Array.isArray(spec)) {\n return ['interval must be an object']\n }\n if (spec.kind !== 'cluster-bootstrap' && spec.kind !== 'clopper-pearson') {\n return ['interval kind must be cluster-bootstrap or clopper-pearson']\n }\n const problems: string[] = []\n if (!Number.isFinite(spec.level) || spec.level <= 0 || spec.level >= 1) {\n problems.push('level must be a finite number between zero and one')\n }\n if (spec.kind === 'cluster-bootstrap') {\n for (const field of ['clusterBy', 'value'] as const) {\n const path = spec[field]\n if (\n typeof path !== 'string' ||\n path.split('.').some((segment) => segment.length === 0 || segment.trim() !== segment)\n ) {\n problems.push(`${field} must be a nonempty dot-separated field path`)\n }\n }\n if (\n !Number.isSafeInteger(spec.resamples) ||\n spec.resamples < 1 ||\n spec.resamples > 0xffff_ffff\n ) {\n problems.push('resamples must be a positive integer within the supported array length')\n }\n if (!Number.isSafeInteger(spec.seed)) problems.push('seed must be a safe integer')\n if (spec.method !== 'percentile') problems.push('method must be percentile')\n }\n return problems\n}\n\n/**\n * Execute an interval spec.\n *\n * Cluster-bootstrap resamples whole clusters of its registered `value` field and\n * takes percentile bounds of the pooled mean. Clopper-Pearson computes the\n * exact binomial interval and requires `successes`/`trials` evidence instead\n * of rows.\n */\nexport function computeInterval(\n spec: IntervalSpec,\n evidence:\n | { kind: 'rows'; rows: readonly EvidenceRecord[] }\n | { kind: 'binomial'; successes: number; trials: number },\n): ComputedInterval {\n const problems = intervalSpecProblems(spec)\n if (problems.length > 0) throw new ValidationError(`computeInterval: ${problems.join('; ')}`)\n if (evidence === null || typeof evidence !== 'object' || Array.isArray(evidence)) {\n throw new ValidationError('computeInterval: evidence must be an object')\n }\n if (spec.kind === 'cluster-bootstrap') {\n if (evidence.kind !== 'rows') {\n throw new ValidationError('computeInterval: cluster-bootstrap requires row evidence')\n }\n if ('value' in evidence) {\n throw new ValidationError(\n 'computeInterval: register value in the interval spec, not row evidence',\n )\n }\n if (!Array.isArray(evidence.rows))\n throw new ValidationError('computeInterval: rows must be an array')\n const clusters = new Map<string, number[]>()\n for (const [index, row] of evidence.rows.entries()) {\n if (row === null || typeof row !== 'object' || Array.isArray(row)) {\n throw new ValidationError(`computeInterval: row ${index} must be an object`)\n }\n const cluster = readField(row, spec.clusterBy)\n if (\n !(typeof cluster === 'string' && cluster.length > 0 && cluster.trim() === cluster) &&\n !(typeof cluster === 'number' && Number.isFinite(cluster))\n ) {\n throw new ValidationError(\n `computeInterval: cluster field '${spec.clusterBy}' must be a nonempty string or finite number on row ${index}`,\n )\n }\n const clusterKey = `${typeof cluster}:${cluster}`\n const value = readNumericOutcome(\n readField(row, spec.value),\n 'computeInterval cluster-bootstrap',\n spec.value,\n `cluster '${cluster}'`,\n )\n const bucket = clusters.get(clusterKey)\n if (bucket) bucket.push(value)\n else clusters.set(clusterKey, [value])\n }\n const clusterValues = [...clusters.entries()]\n .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))\n .map(([, values]) => values)\n if (clusterValues.length < 2) {\n throw new ValidationError(\n `computeInterval: cluster-bootstrap needs >= 2 clusters, got ${clusterValues.length}`,\n )\n }\n const rng = mulberry32(spec.seed)\n const means = new Array<number>(spec.resamples)\n for (let draw = 0; draw < spec.resamples; draw++) {\n let sum = 0\n let count = 0\n for (let pick = 0; pick < clusterValues.length; pick++) {\n const cluster = clusterValues[Math.floor(rng() * clusterValues.length)]!\n for (const value of cluster) sum += value\n count += cluster.length\n }\n means[draw] = sum / count\n if (!Number.isFinite(means[draw])) {\n throw new ValidationError(\n 'computeInterval: cluster mean overflowed the finite numeric range',\n )\n }\n }\n means.sort((a, b) => a - b)\n const alpha = 1 - spec.level\n const lowerIndex = Math.floor((alpha / 2) * spec.resamples)\n const upperIndex = Math.min(spec.resamples - 1, Math.ceil((1 - alpha / 2) * spec.resamples) - 1)\n return {\n lower: means[lowerIndex]!,\n upper: means[Math.max(lowerIndex, upperIndex)]!,\n level: spec.level,\n }\n }\n\n if (evidence.kind !== 'binomial') {\n throw new ValidationError('computeInterval: clopper-pearson requires binomial evidence')\n }\n const { successes, trials } = evidence\n if (\n !Number.isSafeInteger(successes) ||\n !Number.isSafeInteger(trials) ||\n trials <= 0 ||\n successes < 0\n ) {\n throw new ValidationError(\n `computeInterval: clopper-pearson needs 0 <= successes <= trials, got ${successes}/${trials}`,\n )\n }\n if (successes > trials) {\n throw new ValidationError(\n `computeInterval: clopper-pearson successes ${successes} exceed trials ${trials}`,\n )\n }\n const alpha = 1 - spec.level\n const lower = successes === 0 ? 0 : binomialQuantile(successes, trials, alpha / 2, 'lower')\n const upper = successes === trials ? 1 : binomialQuantile(successes, trials, alpha / 2, 'upper')\n return { lower, upper, level: spec.level }\n}\n\n/**\n * Clopper-Pearson bound by bisection on the binomial tail. The lower bound is\n * the p with P(X >= successes | p) = alpha; the upper is the p with\n * P(X <= successes | p) = alpha. Deterministic, no special functions.\n */\nfunction binomialQuantile(\n successes: number,\n trials: number,\n alpha: number,\n side: 'lower' | 'upper',\n): number {\n const tail = (p: number): number => {\n // log-space binomial pmf accumulation for numeric stability\n let sum = 0\n for (let k = 0; k <= trials; k++) {\n const inTail = side === 'lower' ? k >= successes : k <= successes\n if (!inTail) continue\n sum += Math.exp(logBinomialPmf(k, trials, p))\n }\n return sum\n }\n let lo = 0\n let hi = 1\n for (let iter = 0; iter < 100; iter++) {\n const mid = (lo + hi) / 2\n if (tail(mid) < alpha) {\n if (side === 'lower') lo = mid\n else hi = mid\n } else {\n if (side === 'lower') hi = mid\n else lo = mid\n }\n }\n return (lo + hi) / 2\n}\n\nfunction logBinomialPmf(k: number, n: number, p: number): number {\n if (p <= 0) return k === 0 ? 0 : Number.NEGATIVE_INFINITY\n if (p >= 1) return k === n ? 0 : Number.NEGATIVE_INFINITY\n return logChoose(n, k) + k * Math.log(p) + (n - k) * Math.log(1 - p)\n}\n\nfunction logChoose(n: number, k: number): number {\n return logFactorial(n) - logFactorial(k) - logFactorial(n - k)\n}\n\nconst LOG_FACTORIAL_CACHE: number[] = [0]\n\nfunction logFactorial(n: number): number {\n for (let i = LOG_FACTORIAL_CACHE.length; i <= n; i++) {\n LOG_FACTORIAL_CACHE[i] = LOG_FACTORIAL_CACHE[i - 1]! + Math.log(i)\n }\n return LOG_FACTORIAL_CACHE[n]!\n}\n"],"mappings":"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"}
|