openpond-sdk 0.10.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (234) hide show
  1. package/dist/advanced-refiner-evaluations.js +42 -0
  2. package/dist/advanced-refiner-evaluations.js.map +7 -0
  3. package/dist/candidate-evaluations.js +25 -0
  4. package/dist/candidate-evaluations.js.map +7 -0
  5. package/dist/{chunk-W5TXWVFS.js → chunk-2JKV5OJO.js} +88 -59
  6. package/dist/chunk-2JKV5OJO.js.map +7 -0
  7. package/dist/{chunk-2ZJRG3KL.js → chunk-2NSNBED7.js} +7 -3
  8. package/dist/chunk-2NSNBED7.js.map +7 -0
  9. package/dist/chunk-5RZAPZWI.js +445 -0
  10. package/dist/chunk-5RZAPZWI.js.map +7 -0
  11. package/dist/{chunk-JCPLAIZL.js → chunk-5U25KAJM.js} +106 -76
  12. package/dist/chunk-5U25KAJM.js.map +7 -0
  13. package/dist/chunk-7Q7I6FAT.js +139 -0
  14. package/dist/chunk-7Q7I6FAT.js.map +7 -0
  15. package/dist/chunk-A64VYVXN.js +64 -0
  16. package/dist/chunk-A64VYVXN.js.map +7 -0
  17. package/dist/{chunk-DT7FRNIZ.js → chunk-CSWVE3E6.js} +2 -2
  18. package/dist/chunk-DJWHN7NU.js +394 -0
  19. package/dist/chunk-DJWHN7NU.js.map +7 -0
  20. package/dist/chunk-GDJRGRHA.js +144 -0
  21. package/dist/chunk-GDJRGRHA.js.map +7 -0
  22. package/dist/chunk-HOAYWW33.js +587 -0
  23. package/dist/chunk-HOAYWW33.js.map +7 -0
  24. package/dist/{chunk-Y4NGWGTA.js → chunk-I2MBVOVX.js} +265 -264
  25. package/dist/chunk-I2MBVOVX.js.map +7 -0
  26. package/dist/{chunk-I3TQTXKB.js → chunk-IXBSFJCX.js} +4 -4
  27. package/dist/chunk-JMQ4HBWP.js +160 -0
  28. package/dist/chunk-JMQ4HBWP.js.map +7 -0
  29. package/dist/chunk-KQWCXW3A.js +294 -0
  30. package/dist/chunk-KQWCXW3A.js.map +7 -0
  31. package/dist/{chunk-I2YM3UY4.js → chunk-NHCGOFQW.js} +2 -2
  32. package/dist/{chunk-32H2EJRA.js → chunk-R3M6BIOK.js} +2 -2
  33. package/dist/chunk-SLS3GFPG.js +125 -0
  34. package/dist/chunk-SLS3GFPG.js.map +7 -0
  35. package/dist/chunk-SVU4RZ4K.js +70 -0
  36. package/dist/chunk-SVU4RZ4K.js.map +7 -0
  37. package/dist/chunk-T4APHDES.js +74 -0
  38. package/dist/chunk-T4APHDES.js.map +7 -0
  39. package/dist/chunk-VC5OV5AS.js +174 -0
  40. package/dist/chunk-VC5OV5AS.js.map +7 -0
  41. package/dist/{chunk-7B44TQZD.js → chunk-WX22WN33.js} +13 -7
  42. package/dist/chunk-WX22WN33.js.map +7 -0
  43. package/dist/chunk-XEUOJ5WF.js +31 -0
  44. package/dist/chunk-XEUOJ5WF.js.map +7 -0
  45. package/dist/{chunk-LGEF4S5I.js → chunk-XJDWHTH5.js} +390 -362
  46. package/dist/chunk-XJDWHTH5.js.map +7 -0
  47. package/dist/chunk-YCQVVFE5.js +37 -0
  48. package/dist/chunk-YCQVVFE5.js.map +7 -0
  49. package/dist/chunk-ZVJU5CJ5.js +267 -0
  50. package/dist/chunk-ZVJU5CJ5.js.map +7 -0
  51. package/dist/connected-evidence.js +81 -0
  52. package/dist/connected-evidence.js.map +7 -0
  53. package/dist/dataset-workspaces.js +44 -79
  54. package/dist/dataset-workspaces.js.map +4 -4
  55. package/dist/experiment-evaluation-schedules.js +48 -0
  56. package/dist/experiment-evaluation-schedules.js.map +7 -0
  57. package/dist/experiment-improvements.js +52 -0
  58. package/dist/experiment-improvements.js.map +7 -0
  59. package/dist/experiments.js +48 -90
  60. package/dist/experiments.js.map +3 -3
  61. package/dist/human-review.js +13 -0
  62. package/dist/human-review.js.map +7 -0
  63. package/dist/index.js +208 -17
  64. package/dist/index.js.map +2 -2
  65. package/dist/learning.js +1 -1
  66. package/dist/model-starter-attempts.js +2 -2
  67. package/dist/model-starter-catalog.js +7 -2
  68. package/dist/model-starter-catalog.js.map +1 -1
  69. package/dist/model-starters.js +7 -2
  70. package/dist/model-taskset-runs.js +3 -3
  71. package/dist/post-training.js +47 -0
  72. package/dist/post-training.js.map +7 -0
  73. package/dist/taskset-drafts.js +11 -4
  74. package/dist/taskset-drafts.js.map +2 -2
  75. package/dist/taskset-packages.js +26 -556
  76. package/dist/taskset-packages.js.map +4 -4
  77. package/dist/training-bundle.js +58 -17
  78. package/dist/training-bundle.js.map +2 -2
  79. package/dist/training-projects.js +1 -1
  80. package/dist/training.js +7 -2
  81. package/dist/types/packages/sdk/src/advanced-refiner-evaluations.d.ts +2673 -0
  82. package/dist/types/packages/sdk/src/advanced-refiner-evaluations.d.ts.map +1 -0
  83. package/dist/types/packages/sdk/src/candidate-evaluation-client.d.ts +1079 -0
  84. package/dist/types/packages/sdk/src/candidate-evaluation-client.d.ts.map +1 -0
  85. package/dist/types/packages/sdk/src/candidate-evaluations.d.ts +845 -0
  86. package/dist/types/packages/sdk/src/candidate-evaluations.d.ts.map +1 -0
  87. package/dist/types/packages/sdk/src/claude-code-runtime.d.ts +51 -0
  88. package/dist/types/packages/sdk/src/claude-code-runtime.d.ts.map +1 -0
  89. package/dist/types/packages/sdk/src/connected-dataset-publication.d.ts +15 -0
  90. package/dist/types/packages/sdk/src/connected-dataset-publication.d.ts.map +1 -0
  91. package/dist/types/packages/sdk/src/connected-dataset-source.d.ts +48 -0
  92. package/dist/types/packages/sdk/src/connected-dataset-source.d.ts.map +1 -0
  93. package/dist/types/packages/sdk/src/connected-evidence-client.d.ts +2460 -0
  94. package/dist/types/packages/sdk/src/connected-evidence-client.d.ts.map +1 -0
  95. package/dist/types/packages/sdk/src/connected-evidence-contracts.d.ts +215 -0
  96. package/dist/types/packages/sdk/src/connected-evidence-contracts.d.ts.map +1 -0
  97. package/dist/types/packages/sdk/src/connected-evidence-http.d.ts +6 -0
  98. package/dist/types/packages/sdk/src/connected-evidence-http.d.ts.map +1 -0
  99. package/dist/types/packages/sdk/src/connected-evidence.d.ts +6 -0
  100. package/dist/types/packages/sdk/src/connected-evidence.d.ts.map +1 -0
  101. package/dist/types/packages/sdk/src/connected-recorded-execution.d.ts +690 -0
  102. package/dist/types/packages/sdk/src/connected-recorded-execution.d.ts.map +1 -0
  103. package/dist/types/packages/sdk/src/dataset-workspace-client.d.ts +771 -120
  104. package/dist/types/packages/sdk/src/dataset-workspace-client.d.ts.map +1 -1
  105. package/dist/types/packages/sdk/src/dataset-workspace-contracts.d.ts +278 -38
  106. package/dist/types/packages/sdk/src/dataset-workspace-contracts.d.ts.map +1 -1
  107. package/dist/types/packages/sdk/src/dataset-workspace-operations.d.ts +280 -40
  108. package/dist/types/packages/sdk/src/dataset-workspace-operations.d.ts.map +1 -1
  109. package/dist/types/packages/sdk/src/evaluation-coordination-http.d.ts +17 -0
  110. package/dist/types/packages/sdk/src/evaluation-coordination-http.d.ts.map +1 -0
  111. package/dist/types/packages/sdk/src/experiment-client.d.ts +3513 -52
  112. package/dist/types/packages/sdk/src/experiment-client.d.ts.map +1 -1
  113. package/dist/types/packages/sdk/src/experiment-contracts.d.ts +1017 -1
  114. package/dist/types/packages/sdk/src/experiment-contracts.d.ts.map +1 -1
  115. package/dist/types/packages/sdk/src/experiment-evaluation-schedules.d.ts +2780 -0
  116. package/dist/types/packages/sdk/src/experiment-evaluation-schedules.d.ts.map +1 -0
  117. package/dist/types/packages/sdk/src/experiment-grading-contracts.d.ts +8 -0
  118. package/dist/types/packages/sdk/src/experiment-grading-contracts.d.ts.map +1 -1
  119. package/dist/types/packages/sdk/src/experiment-improvement-client.d.ts +5724 -0
  120. package/dist/types/packages/sdk/src/experiment-improvement-client.d.ts.map +1 -0
  121. package/dist/types/packages/sdk/src/experiment-improvement-contracts.d.ts +13024 -0
  122. package/dist/types/packages/sdk/src/experiment-improvement-contracts.d.ts.map +1 -0
  123. package/dist/types/packages/sdk/src/experiment-improvement-hosted-adoption.d.ts +1361 -0
  124. package/dist/types/packages/sdk/src/experiment-improvement-hosted-adoption.d.ts.map +1 -0
  125. package/dist/types/packages/sdk/src/experiment-improvements.d.ts +4 -0
  126. package/dist/types/packages/sdk/src/experiment-improvements.d.ts.map +1 -0
  127. package/dist/types/packages/sdk/src/experiment-run-contracts.d.ts +262 -0
  128. package/dist/types/packages/sdk/src/experiment-run-contracts.d.ts.map +1 -1
  129. package/dist/types/packages/sdk/src/experiment-run-details.d.ts +1388 -1
  130. package/dist/types/packages/sdk/src/experiment-run-details.d.ts.map +1 -1
  131. package/dist/types/packages/sdk/src/experiment-scoring-contracts.d.ts +5 -2
  132. package/dist/types/packages/sdk/src/experiment-scoring-contracts.d.ts.map +1 -1
  133. package/dist/types/packages/sdk/src/experiments.d.ts +3 -0
  134. package/dist/types/packages/sdk/src/experiments.d.ts.map +1 -1
  135. package/dist/types/packages/sdk/src/grader-inspection.d.ts +307 -5
  136. package/dist/types/packages/sdk/src/grader-inspection.d.ts.map +1 -1
  137. package/dist/types/packages/sdk/src/harness-experiment-policy.d.ts +238 -0
  138. package/dist/types/packages/sdk/src/harness-experiment-policy.d.ts.map +1 -1
  139. package/dist/types/packages/sdk/src/human-review-client.d.ts +1267 -0
  140. package/dist/types/packages/sdk/src/human-review-client.d.ts.map +1 -0
  141. package/dist/types/packages/sdk/src/human-review.d.ts +3 -0
  142. package/dist/types/packages/sdk/src/human-review.d.ts.map +1 -0
  143. package/dist/types/packages/sdk/src/index.d.ts +10 -0
  144. package/dist/types/packages/sdk/src/index.d.ts.map +1 -1
  145. package/dist/types/packages/sdk/src/managed-training-preparation.d.ts +181 -0
  146. package/dist/types/packages/sdk/src/managed-training-preparation.d.ts.map +1 -1
  147. package/dist/types/packages/sdk/src/model-batch-review-contracts.d.ts +20 -4
  148. package/dist/types/packages/sdk/src/model-batch-review-contracts.d.ts.map +1 -1
  149. package/dist/types/packages/sdk/src/model-batch-review-preparation.d.ts +79 -5
  150. package/dist/types/packages/sdk/src/model-batch-review-preparation.d.ts.map +1 -1
  151. package/dist/types/packages/sdk/src/model-batch-review.d.ts +15 -13
  152. package/dist/types/packages/sdk/src/model-batch-review.d.ts.map +1 -1
  153. package/dist/types/packages/sdk/src/model-learning-policy.d.ts +359 -1
  154. package/dist/types/packages/sdk/src/model-learning-policy.d.ts.map +1 -1
  155. package/dist/types/packages/sdk/src/model-starter-attempts.d.ts +288 -19
  156. package/dist/types/packages/sdk/src/model-starter-attempts.d.ts.map +1 -1
  157. package/dist/types/packages/sdk/src/model-starter-catalog.d.ts +234 -12
  158. package/dist/types/packages/sdk/src/model-starter-catalog.d.ts.map +1 -1
  159. package/dist/types/packages/sdk/src/model-starter-execution.d.ts +78 -1
  160. package/dist/types/packages/sdk/src/model-starter-execution.d.ts.map +1 -1
  161. package/dist/types/packages/sdk/src/model-starters.d.ts +466 -13
  162. package/dist/types/packages/sdk/src/model-starters.d.ts.map +1 -1
  163. package/dist/types/packages/sdk/src/model-taskset-derivation.d.ts +312 -4
  164. package/dist/types/packages/sdk/src/model-taskset-derivation.d.ts.map +1 -1
  165. package/dist/types/packages/sdk/src/model-taskset-resources.d.ts +78 -1
  166. package/dist/types/packages/sdk/src/model-taskset-resources.d.ts.map +1 -1
  167. package/dist/types/packages/sdk/src/model-taskset-runs-contracts.d.ts +1282 -4
  168. package/dist/types/packages/sdk/src/model-taskset-runs-contracts.d.ts.map +1 -1
  169. package/dist/types/packages/sdk/src/model-taskset-runs.d.ts +1285 -5
  170. package/dist/types/packages/sdk/src/model-taskset-runs.d.ts.map +1 -1
  171. package/dist/types/packages/sdk/src/post-training.d.ts +3518 -0
  172. package/dist/types/packages/sdk/src/post-training.d.ts.map +1 -0
  173. package/dist/types/packages/sdk/src/profile-evaluation-discovery.d.ts +1127 -0
  174. package/dist/types/packages/sdk/src/profile-evaluation-discovery.d.ts.map +1 -0
  175. package/dist/types/packages/sdk/src/profile-external-dataset-package.d.ts +1369 -0
  176. package/dist/types/packages/sdk/src/profile-external-dataset-package.d.ts.map +1 -0
  177. package/dist/types/packages/sdk/src/taskset-authored-contracts.d.ts +142 -22
  178. package/dist/types/packages/sdk/src/taskset-authored-contracts.d.ts.map +1 -1
  179. package/dist/types/packages/sdk/src/taskset-authored-files.d.ts +111 -18
  180. package/dist/types/packages/sdk/src/taskset-authored-files.d.ts.map +1 -1
  181. package/dist/types/packages/sdk/src/taskset-draft-api-contracts.d.ts +278 -38
  182. package/dist/types/packages/sdk/src/taskset-draft-api-contracts.d.ts.map +1 -1
  183. package/dist/types/packages/sdk/src/taskset-draft-client.d.ts +661 -103
  184. package/dist/types/packages/sdk/src/taskset-draft-client.d.ts.map +1 -1
  185. package/dist/types/packages/sdk/src/taskset-draft-core.d.ts +217 -20
  186. package/dist/types/packages/sdk/src/taskset-draft-core.d.ts.map +1 -1
  187. package/dist/types/packages/sdk/src/taskset-draft-dataset-artifacts.d.ts +12 -12
  188. package/dist/types/packages/sdk/src/taskset-draft-dataset-sources.d.ts +17 -17
  189. package/dist/types/packages/sdk/src/taskset-draft-document.d.ts +140 -20
  190. package/dist/types/packages/sdk/src/taskset-draft-document.d.ts.map +1 -1
  191. package/dist/types/packages/sdk/src/taskset-draft-package-compiler.d.ts +638 -42
  192. package/dist/types/packages/sdk/src/taskset-draft-package-compiler.d.ts.map +1 -1
  193. package/dist/types/packages/sdk/src/taskset-draft-source.d.ts +249 -36
  194. package/dist/types/packages/sdk/src/taskset-draft-source.d.ts.map +1 -1
  195. package/dist/types/packages/sdk/src/taskset-draft-workspace.d.ts +278 -38
  196. package/dist/types/packages/sdk/src/taskset-draft-workspace.d.ts.map +1 -1
  197. package/dist/types/packages/sdk/src/taskset-drafts.d.ts +1 -0
  198. package/dist/types/packages/sdk/src/taskset-drafts.d.ts.map +1 -1
  199. package/dist/types/packages/sdk/src/taskset-package-client.d.ts +1322 -26
  200. package/dist/types/packages/sdk/src/taskset-package-client.d.ts.map +1 -1
  201. package/dist/types/packages/sdk/src/taskset-package-contracts.d.ts +660 -12
  202. package/dist/types/packages/sdk/src/taskset-package-contracts.d.ts.map +1 -1
  203. package/dist/types/packages/sdk/src/taskset-package-grader-projection.d.ts +77 -3
  204. package/dist/types/packages/sdk/src/taskset-package-grader-projection.d.ts.map +1 -1
  205. package/dist/types/packages/sdk/src/taskset-package-learning.d.ts +29 -11
  206. package/dist/types/packages/sdk/src/taskset-package-learning.d.ts.map +1 -1
  207. package/dist/types/packages/sdk/src/taskset-package-projection.d.ts +430 -39
  208. package/dist/types/packages/sdk/src/taskset-package-projection.d.ts.map +1 -1
  209. package/dist/types/packages/sdk/src/training-acceptance.d.ts +10 -10
  210. package/dist/types/packages/sdk/src/training-candidate-decisions.d.ts +2 -2
  211. package/dist/types/packages/sdk/src/training-evaluation-results.d.ts +1 -1
  212. package/dist/types/packages/sdk/src/training-learning-batch.d.ts +376 -42
  213. package/dist/types/packages/sdk/src/training-learning-batch.d.ts.map +1 -1
  214. package/dist/types/packages/sdk/src/training-preparations.d.ts +3930 -0
  215. package/dist/types/packages/sdk/src/training-preparations.d.ts.map +1 -1
  216. package/dist/types/packages/sdk/src/training-project-client.d.ts +776 -8
  217. package/dist/types/packages/sdk/src/training-project-client.d.ts.map +1 -1
  218. package/dist/types/packages/sdk/src/training-project-contracts.d.ts +1161 -11
  219. package/dist/types/packages/sdk/src/training-project-contracts.d.ts.map +1 -1
  220. package/dist/types/packages/sdk/src/training.d.ts +2655 -24
  221. package/dist/types/packages/sdk/src/training.d.ts.map +1 -1
  222. package/package.json +30 -2
  223. package/dist/chunk-2ZJRG3KL.js.map +0 -7
  224. package/dist/chunk-7B44TQZD.js.map +0 -7
  225. package/dist/chunk-JCPLAIZL.js.map +0 -7
  226. package/dist/chunk-LGEF4S5I.js.map +0 -7
  227. package/dist/chunk-PRRUBH2B.js +0 -314
  228. package/dist/chunk-PRRUBH2B.js.map +0 -7
  229. package/dist/chunk-W5TXWVFS.js.map +0 -7
  230. package/dist/chunk-Y4NGWGTA.js.map +0 -7
  231. /package/dist/{chunk-DT7FRNIZ.js.map → chunk-CSWVE3E6.js.map} +0 -0
  232. /package/dist/{chunk-I3TQTXKB.js.map → chunk-IXBSFJCX.js.map} +0 -0
  233. /package/dist/{chunk-I2YM3UY4.js.map → chunk-NHCGOFQW.js.map} +0 -0
  234. /package/dist/{chunk-32H2EJRA.js.map → chunk-R3M6BIOK.js.map} +0 -0
@@ -0,0 +1,70 @@
1
+ import {
2
+ ExperimentFieldMappingsSchema,
3
+ ExperimentGraderPinSchema
4
+ } from "./chunk-2NSNBED7.js";
5
+ import {
6
+ ImmutableReleaseRefSchema,
7
+ contentHash
8
+ } from "./chunk-QUOW6URQ.js";
9
+
10
+ // src/experiment-scoring-contracts.ts
11
+ import { z } from "zod";
12
+ import { RewardReleaseRefSchema } from "@openpond/evals/rewards";
13
+ var Id = z.string().trim().min(1).max(200);
14
+ var ExperimentScoringRequestSchema = z.object({
15
+ operationId: Id,
16
+ execution: ImmutableReleaseRefSchema,
17
+ /** Recorded executions retain observed evidence and never invoke a target. */
18
+ executionKind: z.literal("recorded_evidence").optional(),
19
+ graders: z.array(RewardReleaseRefSchema).min(1).max(100),
20
+ maximumCostUsd: z.number().finite().min(1e-6).max(1e4),
21
+ mappings: z.array(z.object({ graderId: Id, fields: ExperimentFieldMappingsSchema }).strict()).max(100).optional()
22
+ }).strict().superRefine((value, context) => {
23
+ if (new Set(value.graders.map((grader) => grader.id)).size !== value.graders.length)
24
+ context.addIssue({ code: "custom", path: ["graders"], message: "Select each grader once." });
25
+ if (value.mappings && (new Set(value.mappings.map((mapping) => mapping.graderId)).size !== value.mappings.length || value.mappings.some((mapping) => !value.graders.some((grader) => grader.id === mapping.graderId))))
26
+ context.addIssue({ code: "custom", path: ["mappings"], message: "Map each selected grader at most once." });
27
+ });
28
+ var ScoringPassContent = z.object({
29
+ schemaVersion: z.literal("openpond.experimentScoringPass.v1"),
30
+ id: Id,
31
+ teamId: Id,
32
+ revision: z.number().int().positive(),
33
+ request: ExperimentScoringRequestSchema,
34
+ graders: z.array(ExperimentGraderPinSchema).min(1).max(100),
35
+ status: z.enum(["queued", "running", "cancelling", "completed", "failed", "cancelled"]),
36
+ totalCount: z.number().int().min(1).max(1e4),
37
+ counts: z.object({
38
+ pending: z.number().int().nonnegative(),
39
+ running: z.number().int().nonnegative(),
40
+ scored: z.number().int().nonnegative(),
41
+ unavailable: z.number().int().nonnegative(),
42
+ failed: z.number().int().nonnegative(),
43
+ cancelled: z.number().int().nonnegative()
44
+ }).strict(),
45
+ resultAvailable: z.boolean(),
46
+ createdAt: z.iso.datetime(),
47
+ startedAt: z.iso.datetime().nullable(),
48
+ completedAt: z.iso.datetime().nullable(),
49
+ error: z.object({ code: Id, message: z.string().max(2e3) }).strict().nullable()
50
+ }).strict();
51
+ var ExperimentScoringPassSchema = ScoringPassContent.extend({ contentHash: z.string().regex(/^[a-f0-9]{64}$/) });
52
+ function verifyExperimentScoringPass(value) {
53
+ const pass = ExperimentScoringPassSchema.parse(value);
54
+ const { contentHash: actual, ...content } = pass;
55
+ if (contentHash(content) !== actual || Object.values(pass.counts).reduce((sum, count) => sum + count, 0) !== pass.totalCount)
56
+ throw new Error("Scoring pass integrity or population accounting failed.");
57
+ const terminal = ["completed", "failed", "cancelled"].includes(pass.status);
58
+ if (terminal && (!pass.completedAt || pass.counts.pending || pass.counts.running) || !terminal && (pass.completedAt !== null || pass.resultAvailable) || pass.status === "completed" && !pass.resultAvailable)
59
+ throw new Error("Scoring pass lifecycle differs from its retained result.");
60
+ if (pass.graders.length !== pass.request.graders.length || new Set(pass.graders.map((grader) => grader.feedbackKey)).size !== pass.graders.length || pass.graders.some((grader, index) => contentHash(grader.release) !== contentHash(pass.request.graders[index]) || contentHash(grader.mappings ?? []) !== contentHash(pass.request.mappings?.find((mapping) => mapping.graderId === grader.release?.id)?.fields ?? [])))
61
+ throw new Error("Scoring pass graders differ from their exact admission.");
62
+ return pass;
63
+ }
64
+
65
+ export {
66
+ ExperimentScoringRequestSchema,
67
+ ExperimentScoringPassSchema,
68
+ verifyExperimentScoringPass
69
+ };
70
+ //# sourceMappingURL=chunk-SVU4RZ4K.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/experiment-scoring-contracts.ts"],
4
+ "sourcesContent": ["import { z } from \"zod\";\nimport { contentHash, ImmutableReleaseRefSchema } from \"@openpond/harness\";\nimport { RewardReleaseRefSchema } from \"@openpond/evals/rewards\";\nimport { ExperimentGraderPinSchema } from \"./experiment-contracts.js\";\nimport { ExperimentFieldMappingsSchema } from \"./experiment-field-mappings.js\";\n\nconst Id = z.string().trim().min(1).max(200);\nexport const ExperimentScoringRequestSchema = z.object({\n operationId: Id,\n execution: ImmutableReleaseRefSchema,\n /** Recorded executions retain observed evidence and never invoke a target. */\n executionKind: z.literal(\"recorded_evidence\").optional(),\n graders: z.array(RewardReleaseRefSchema).min(1).max(100),\n maximumCostUsd: z.number().finite().min(0.000001).max(10_000),\n mappings: z.array(z.object({ graderId: Id, fields: ExperimentFieldMappingsSchema }).strict()).max(100).optional(),\n}).strict().superRefine((value, context) => {\n if (new Set(value.graders.map(grader => grader.id)).size !== value.graders.length)\n context.addIssue({ code: \"custom\", path: [\"graders\"], message: \"Select each grader once.\" });\n if (value.mappings && (new Set(value.mappings.map(mapping => mapping.graderId)).size !== value.mappings.length\n || value.mappings.some(mapping => !value.graders.some(grader => grader.id === mapping.graderId))))\n context.addIssue({ code: \"custom\", path: [\"mappings\"], message: \"Map each selected grader at most once.\" });\n});\nexport type ExperimentScoringRequest = z.infer<typeof ExperimentScoringRequestSchema>;\n\nconst ScoringPassContent = z.object({\n schemaVersion: z.literal(\"openpond.experimentScoringPass.v1\"),\n id: Id, teamId: Id, revision: z.number().int().positive(),\n request: ExperimentScoringRequestSchema,\n graders: z.array(ExperimentGraderPinSchema).min(1).max(100),\n status: z.enum([\"queued\", \"running\", \"cancelling\", \"completed\", \"failed\", \"cancelled\"]),\n totalCount: z.number().int().min(1).max(10_000),\n counts: z.object({ pending: z.number().int().nonnegative(), running: z.number().int().nonnegative(),\n scored: z.number().int().nonnegative(), unavailable: z.number().int().nonnegative(),\n failed: z.number().int().nonnegative(), cancelled: z.number().int().nonnegative() }).strict(),\n resultAvailable: z.boolean(), createdAt: z.iso.datetime(), startedAt: z.iso.datetime().nullable(),\n completedAt: z.iso.datetime().nullable(),\n error: z.object({ code: Id, message: z.string().max(2_000) }).strict().nullable(),\n}).strict();\nexport const ExperimentScoringPassSchema = ScoringPassContent.extend({ contentHash: z.string().regex(/^[a-f0-9]{64}$/) });\nexport type ExperimentScoringPass = z.infer<typeof ExperimentScoringPassSchema>;\n\n/** A pass grades owned output and carries no model-execution authority. */\nexport function verifyExperimentScoringPass(value: unknown) {\n const pass = ExperimentScoringPassSchema.parse(value);\n const { contentHash: actual, ...content } = pass;\n if (contentHash(content) !== actual || Object.values(pass.counts).reduce((sum, count) => sum + count, 0) !== pass.totalCount)\n throw new Error(\"Scoring pass integrity or population accounting failed.\");\n const terminal = [\"completed\", \"failed\", \"cancelled\"].includes(pass.status);\n if (terminal && (!pass.completedAt || pass.counts.pending || pass.counts.running)\n || !terminal && (pass.completedAt !== null || pass.resultAvailable)\n || pass.status === \"completed\" && !pass.resultAvailable)\n throw new Error(\"Scoring pass lifecycle differs from its retained result.\");\n if (pass.graders.length !== pass.request.graders.length || new Set(pass.graders.map(grader => grader.feedbackKey)).size !== pass.graders.length\n || pass.graders.some((grader, index) => contentHash(grader.release) !== contentHash(pass.request.graders[index]!)\n || contentHash(grader.mappings ?? []) !== contentHash(pass.request.mappings?.find(mapping => mapping.graderId === grader.release?.id)?.fields ?? [])))\n throw new Error(\"Scoring pass graders differ from their exact admission.\");\n return pass;\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,74 @@
1
+ // src/connected-evidence-http.ts
2
+ var MAX_RESPONSE_BYTES = 8 * 1024 * 1024;
3
+ async function fetchConnectedJson(fetcher, url, init, error) {
4
+ const controller = new AbortController(), external = init.signal;
5
+ const forward = () => controller.abort(external?.reason);
6
+ if (external?.aborted) forward();
7
+ else external?.addEventListener("abort", forward, { once: true });
8
+ const timer = setTimeout(() => controller.abort(new Error("Connected evidence request timed out.")), 6e4);
9
+ let reader;
10
+ const abortReader = () => {
11
+ if (reader) void reader.cancel(controller.signal.reason).catch(() => void 0);
12
+ };
13
+ controller.signal.addEventListener("abort", abortReader, { once: true });
14
+ const abortPromise = new Promise((_, reject) => {
15
+ const abort = () => reject(controller.signal.reason ?? new DOMException("Request aborted", "AbortError"));
16
+ if (controller.signal.aborted) abort();
17
+ else controller.signal.addEventListener("abort", abort, { once: true });
18
+ });
19
+ try {
20
+ const pendingResponse = fetcher(url, { ...init, signal: controller.signal }).then((response2) => {
21
+ if (controller.signal.aborted) {
22
+ void response2.body?.cancel(controller.signal.reason).catch(() => void 0);
23
+ throw controller.signal.reason;
24
+ }
25
+ return response2;
26
+ });
27
+ const response = await Promise.race([pendingResponse, abortPromise]);
28
+ const declared = response.headers.get("content-length");
29
+ reader = response.body?.getReader();
30
+ if (controller.signal.aborted) {
31
+ await reader?.cancel(controller.signal.reason);
32
+ throw controller.signal.reason;
33
+ }
34
+ if (declared && Number(declared) > MAX_RESPONSE_BYTES) {
35
+ await reader?.cancel();
36
+ throw error(502, "connected_response_too_large", "Connected evidence response exceeds 8 MiB.");
37
+ }
38
+ const chunks = [];
39
+ let size = 0;
40
+ if (reader) while (true) {
41
+ const part = await Promise.race([reader.read(), abortPromise]);
42
+ if (part.done) break;
43
+ size += part.value.byteLength;
44
+ if (size > MAX_RESPONSE_BYTES) {
45
+ await reader.cancel();
46
+ throw error(502, "connected_response_too_large", "Connected evidence response exceeds 8 MiB.");
47
+ }
48
+ chunks.push(part.value);
49
+ }
50
+ const bytes = new Uint8Array(size);
51
+ let offset = 0;
52
+ for (const chunk of chunks) {
53
+ bytes.set(chunk, offset);
54
+ offset += chunk.byteLength;
55
+ }
56
+ let value;
57
+ try {
58
+ value = JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(bytes));
59
+ } catch {
60
+ throw error(502, "connected_response_invalid", "Connected evidence response is not valid JSON.");
61
+ }
62
+ return { response, value };
63
+ } finally {
64
+ clearTimeout(timer);
65
+ external?.removeEventListener("abort", forward);
66
+ controller.signal.removeEventListener("abort", abortReader);
67
+ reader?.releaseLock();
68
+ }
69
+ }
70
+
71
+ export {
72
+ fetchConnectedJson
73
+ };
74
+ //# sourceMappingURL=chunk-T4APHDES.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/connected-evidence-http.ts"],
4
+ "sourcesContent": ["const MAX_RESPONSE_BYTES = 8 * 1024 * 1024;\n/** Bounds real streaming responses, including custom fetch adapters that do not honor abort themselves. */\nexport async function fetchConnectedJson(fetcher: typeof fetch, url: string, init: RequestInit, error: (status: number, code: string, message: string) => Error) {\n const controller = new AbortController(), external = init.signal;\n const forward = () => controller.abort(external?.reason);\n if (external?.aborted) forward(); else external?.addEventListener(\"abort\", forward, { once: true });\n const timer = setTimeout(() => controller.abort(new Error(\"Connected evidence request timed out.\")), 60_000);\n let reader: ReadableStreamDefaultReader<Uint8Array> | undefined;\n const abortReader = () => { if (reader) void reader.cancel(controller.signal.reason).catch(() => undefined); };\n controller.signal.addEventListener(\"abort\", abortReader, { once: true });\n const abortPromise = new Promise<never>((_, reject) => {\n const abort = () => reject(controller.signal.reason ?? new DOMException(\"Request aborted\", \"AbortError\"));\n if (controller.signal.aborted) abort(); else controller.signal.addEventListener(\"abort\", abort, { once: true });\n });\n try {\n const pendingResponse = fetcher(url, { ...init, signal: controller.signal }).then(response => {\n if (controller.signal.aborted) { void response.body?.cancel(controller.signal.reason).catch(() => undefined); throw controller.signal.reason; }\n return response;\n });\n const response = await Promise.race([pendingResponse, abortPromise]);\n const declared = response.headers.get(\"content-length\");\n reader = response.body?.getReader();\n if (controller.signal.aborted) { await reader?.cancel(controller.signal.reason); throw controller.signal.reason; }\n if (declared && Number(declared) > MAX_RESPONSE_BYTES) { await reader?.cancel(); throw error(502, \"connected_response_too_large\", \"Connected evidence response exceeds 8 MiB.\"); }\n const chunks: Uint8Array[] = []; let size = 0;\n if (reader) while (true) {\n const part = await Promise.race([reader.read(), abortPromise]);\n if (part.done) break;\n size += part.value.byteLength;\n if (size > MAX_RESPONSE_BYTES) { await reader.cancel(); throw error(502, \"connected_response_too_large\", \"Connected evidence response exceeds 8 MiB.\"); }\n chunks.push(part.value);\n }\n const bytes = new Uint8Array(size); let offset = 0;\n for (const chunk of chunks) { bytes.set(chunk, offset); offset += chunk.byteLength; }\n let value: unknown;\n try { value = JSON.parse(new TextDecoder(\"utf-8\", { fatal: true }).decode(bytes)); }\n catch { throw error(502, \"connected_response_invalid\", \"Connected evidence response is not valid JSON.\"); }\n return { response, value };\n } finally { clearTimeout(timer); external?.removeEventListener(\"abort\", forward); controller.signal.removeEventListener(\"abort\", abortReader); reader?.releaseLock(); }\n}\n"],
5
+ "mappings": ";AAAA,IAAM,qBAAqB,IAAI,OAAO;AAEtC,eAAsB,mBAAmB,SAAuB,KAAa,MAAmB,OAAiE;AAC/J,QAAM,aAAa,IAAI,gBAAgB,GAAG,WAAW,KAAK;AAC1D,QAAM,UAAU,MAAM,WAAW,MAAM,UAAU,MAAM;AACvD,MAAI,UAAU,QAAS,SAAQ;AAAA,MAAQ,WAAU,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AAClG,QAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,IAAI,MAAM,uCAAuC,CAAC,GAAG,GAAM;AAC3G,MAAI;AACJ,QAAM,cAAc,MAAM;AAAE,QAAI,OAAQ,MAAK,OAAO,OAAO,WAAW,OAAO,MAAM,EAAE,MAAM,MAAM,MAAS;AAAA,EAAG;AAC7G,aAAW,OAAO,iBAAiB,SAAS,aAAa,EAAE,MAAM,KAAK,CAAC;AACvE,QAAM,eAAe,IAAI,QAAe,CAAC,GAAG,WAAW;AACrD,UAAM,QAAQ,MAAM,OAAO,WAAW,OAAO,UAAU,IAAI,aAAa,mBAAmB,YAAY,CAAC;AACxG,QAAI,WAAW,OAAO,QAAS,OAAM;AAAA,QAAQ,YAAW,OAAO,iBAAiB,SAAS,OAAO,EAAE,MAAM,KAAK,CAAC;AAAA,EAChH,CAAC;AACD,MAAI;AACF,UAAM,kBAAkB,QAAQ,KAAK,EAAE,GAAG,MAAM,QAAQ,WAAW,OAAO,CAAC,EAAE,KAAK,CAAAA,cAAY;AAC5F,UAAI,WAAW,OAAO,SAAS;AAAE,aAAKA,UAAS,MAAM,OAAO,WAAW,OAAO,MAAM,EAAE,MAAM,MAAM,MAAS;AAAG,cAAM,WAAW,OAAO;AAAA,MAAQ;AAC9I,aAAOA;AAAA,IACT,CAAC;AACD,UAAM,WAAW,MAAM,QAAQ,KAAK,CAAC,iBAAiB,YAAY,CAAC;AACnE,UAAM,WAAW,SAAS,QAAQ,IAAI,gBAAgB;AACtD,aAAS,SAAS,MAAM,UAAU;AAClC,QAAI,WAAW,OAAO,SAAS;AAAE,YAAM,QAAQ,OAAO,WAAW,OAAO,MAAM;AAAG,YAAM,WAAW,OAAO;AAAA,IAAQ;AACjH,QAAI,YAAY,OAAO,QAAQ,IAAI,oBAAoB;AAAE,YAAM,QAAQ,OAAO;AAAG,YAAM,MAAM,KAAK,gCAAgC,4CAA4C;AAAA,IAAG;AACjL,UAAM,SAAuB,CAAC;AAAG,QAAI,OAAO;AAC5C,QAAI,OAAQ,QAAO,MAAM;AACvB,YAAM,OAAO,MAAM,QAAQ,KAAK,CAAC,OAAO,KAAK,GAAG,YAAY,CAAC;AAC7D,UAAI,KAAK,KAAM;AACf,cAAQ,KAAK,MAAM;AACnB,UAAI,OAAO,oBAAoB;AAAE,cAAM,OAAO,OAAO;AAAG,cAAM,MAAM,KAAK,gCAAgC,4CAA4C;AAAA,MAAG;AACxJ,aAAO,KAAK,KAAK,KAAK;AAAA,IACxB;AACA,UAAM,QAAQ,IAAI,WAAW,IAAI;AAAG,QAAI,SAAS;AACjD,eAAW,SAAS,QAAQ;AAAE,YAAM,IAAI,OAAO,MAAM;AAAG,gBAAU,MAAM;AAAA,IAAY;AACpF,QAAI;AACJ,QAAI;AAAE,cAAQ,KAAK,MAAM,IAAI,YAAY,SAAS,EAAE,OAAO,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;AAAA,IAAG,QAC7E;AAAE,YAAM,MAAM,KAAK,8BAA8B,gDAAgD;AAAA,IAAG;AAC1G,WAAO,EAAE,UAAU,MAAM;AAAA,EAC3B,UAAE;AAAU,iBAAa,KAAK;AAAG,cAAU,oBAAoB,SAAS,OAAO;AAAG,eAAW,OAAO,oBAAoB,SAAS,WAAW;AAAG,YAAQ,YAAY;AAAA,EAAG;AACxK;",
6
+ "names": ["response"]
7
+ }
@@ -0,0 +1,174 @@
1
+ import {
2
+ EvaluationCoordinationTransport
3
+ } from "./chunk-YCQVVFE5.js";
4
+ import {
5
+ RunExperimentSchema
6
+ } from "./chunk-XEUOJ5WF.js";
7
+ import {
8
+ ImmutableReleaseRefSchema,
9
+ assertContentHash,
10
+ contentHash
11
+ } from "./chunk-QUOW6URQ.js";
12
+
13
+ // src/experiment-evaluation-schedules.ts
14
+ import { z } from "zod";
15
+ import { NightlyScheduleSchema } from "@openpond/evals/learning";
16
+ var Id = z.string().trim().min(1).max(200);
17
+ var Hash = z.string().regex(/^[a-f0-9]{64}$/);
18
+ var Time = z.string().datetime();
19
+ var ExperimentEvaluationScheduleInputSchema = z.object({
20
+ operationId: Id,
21
+ id: Id.optional(),
22
+ expectedRevision: z.number().int().nonnegative(),
23
+ teamId: Id,
24
+ projectId: Id.nullable(),
25
+ enabled: z.boolean(),
26
+ configuration: RunExperimentSchema,
27
+ cadence: z.discriminatedUnion("kind", [
28
+ z.object({
29
+ kind: z.literal("interval"),
30
+ seconds: z.number().int().min(60).max(31536e3)
31
+ }).strict(),
32
+ z.object({ kind: z.literal("nightly"), calendar: NightlyScheduleSchema }).strict()
33
+ ]),
34
+ maximumTotalSpendUsd: z.number().finite().positive().max(1e4),
35
+ maximumAttempts: z.number().int().min(1).max(20)
36
+ }).strict().superRefine((v, c) => {
37
+ if (v.configuration.request.teamId !== v.teamId || (v.configuration.request.project?.id ?? null) !== v.projectId)
38
+ c.addIssue({
39
+ code: "custom",
40
+ message: "The scheduled Experiment must retain its actual workspace and Project."
41
+ });
42
+ if (v.configuration.maximumCostUsd > v.maximumTotalSpendUsd)
43
+ c.addIssue({
44
+ code: "custom",
45
+ message: "The run ceiling exceeds the approved cumulative schedule ceiling."
46
+ });
47
+ });
48
+ var ExperimentEvaluationFireSchema = z.object({
49
+ id: Id,
50
+ scheduledAt: Time,
51
+ coalescedThroughAt: Time,
52
+ coalescedCount: z.number().int().nonnegative(),
53
+ configurationHash: Hash,
54
+ operationId: Id,
55
+ state: z.enum([
56
+ "reserved",
57
+ "dispatching",
58
+ "running",
59
+ "cleaning",
60
+ "completed",
61
+ "failed",
62
+ "cancelled",
63
+ "uncertain"
64
+ ]),
65
+ executionId: Id.nullable(),
66
+ attempt: z.number().int().positive(),
67
+ maximumCostUsd: z.number().finite().positive(),
68
+ actualSpendUsd: z.number().finite().nonnegative().nullable(),
69
+ cleanupComplete: z.boolean(),
70
+ error: z.string().max(4e3).nullable()
71
+ }).strict();
72
+ var ExperimentEvaluationScheduleSchema = z.object({
73
+ schemaVersion: z.literal("openpond.experimentEvaluationSchedule.v1"),
74
+ id: Id,
75
+ revision: z.number().int().positive(),
76
+ actorId: Id,
77
+ teamId: Id,
78
+ projectId: Id.nullable(),
79
+ operationId: Id,
80
+ requestHash: Hash,
81
+ configuration: RunExperimentSchema,
82
+ configurationHash: Hash,
83
+ cadence: ExperimentEvaluationScheduleInputSchema.shape.cadence,
84
+ state: z.enum(["scheduled", "disabled", "blocked"]),
85
+ nextRunAt: Time.nullable(),
86
+ maximumTotalSpendUsd: z.number().finite().positive(),
87
+ maximumAttempts: z.number().int().positive(),
88
+ lastEvaluatedConfigurationHash: Hash.nullable(),
89
+ newerUnevaluatedRelease: ImmutableReleaseRefSchema.nullable(),
90
+ fires: z.array(ExperimentEvaluationFireSchema).max(1e4),
91
+ reason: z.string().max(4e3).nullable(),
92
+ createdAt: Time,
93
+ updatedAt: Time,
94
+ contentHash: Hash
95
+ }).strict();
96
+ function scheduledExperimentHash(value) {
97
+ const { operationId: _operation, request, ...rest } = value;
98
+ const { operationId: _requestOperation, ...body } = request;
99
+ void _operation;
100
+ void _requestOperation;
101
+ return contentHash({ ...rest, request: body });
102
+ }
103
+ function verifyExperimentEvaluationSchedule(raw) {
104
+ const v = ExperimentEvaluationScheduleSchema.parse(raw);
105
+ assertContentHash(v, "Scheduled Experiment");
106
+ if (v.configurationHash !== scheduledExperimentHash(v.configuration) || v.configuration.request.teamId !== v.teamId || (v.configuration.request.project?.id ?? null) !== v.projectId)
107
+ throw new Error(
108
+ "Scheduled Experiment immutable authority differs from its recipe."
109
+ );
110
+ return v;
111
+ }
112
+ function sealExperimentEvaluationSchedule(value) {
113
+ return verifyExperimentEvaluationSchedule({
114
+ ...value,
115
+ contentHash: contentHash(value)
116
+ });
117
+ }
118
+ var ExperimentEvaluationScheduleControlSchema = z.object({
119
+ teamId: Id,
120
+ id: Id,
121
+ operationId: Id,
122
+ expectedRevision: z.number().int().positive(),
123
+ action: z.enum(["cancel_active", "retry_active", "pause"])
124
+ }).strict();
125
+ var ExperimentEvaluationScheduleCommandSchema = z.discriminatedUnion(
126
+ "operation",
127
+ [
128
+ z.object({
129
+ operation: z.literal("publish"),
130
+ request: ExperimentEvaluationScheduleInputSchema
131
+ }).strict(),
132
+ z.object({
133
+ operation: z.literal("control"),
134
+ request: ExperimentEvaluationScheduleControlSchema
135
+ }).strict(),
136
+ z.object({ operation: z.literal("read"), id: Id }).strict(),
137
+ z.object({
138
+ operation: z.literal("list"),
139
+ cursor: Id.optional(),
140
+ limit: z.number().int().min(1).max(100).default(50)
141
+ }).strict()
142
+ ]
143
+ );
144
+ var OpenPondExperimentEvaluationScheduleClient = class {
145
+ transport;
146
+ constructor(access) {
147
+ this.transport = new EvaluationCoordinationTransport(access);
148
+ }
149
+ async command(raw, signal) {
150
+ const request = ExperimentEvaluationScheduleCommandSchema.parse(raw), access = this.transport.access;
151
+ if (request.operation === "publish" && (request.request.teamId !== access.teamId || request.request.projectId !== access.projectId) || request.operation === "control" && request.request.teamId !== access.teamId) throw new Error("The schedule command belongs to another workspace or Project.");
152
+ const value = await this.transport.post("experiment-evaluation-schedules", request, signal);
153
+ const page = request.operation === "list" ? z.object({ items: z.array(z.unknown()).max(request.limit), nextCursor: z.string().nullable() }).strict().parse(value) : null;
154
+ const items = (page?.items ?? [value]).map((raw2) => {
155
+ const schedule = verifyExperimentEvaluationSchedule(raw2);
156
+ if (schedule.actorId !== access.actorId || schedule.teamId !== access.teamId || schedule.projectId !== access.projectId || request.operation === "read" && schedule.id !== request.id || request.operation === "control" && schedule.id !== request.request.id || request.operation === "publish" && (schedule.requestHash !== contentHash(request.request) || Boolean(request.request.id && schedule.id !== request.request.id))) throw new Error("Schedule readback differs from its exact owner command.");
157
+ return schedule;
158
+ });
159
+ return page ? { items, nextCursor: page.nextCursor } : items[0];
160
+ }
161
+ };
162
+
163
+ export {
164
+ ExperimentEvaluationScheduleInputSchema,
165
+ ExperimentEvaluationFireSchema,
166
+ ExperimentEvaluationScheduleSchema,
167
+ scheduledExperimentHash,
168
+ verifyExperimentEvaluationSchedule,
169
+ sealExperimentEvaluationSchedule,
170
+ ExperimentEvaluationScheduleControlSchema,
171
+ ExperimentEvaluationScheduleCommandSchema,
172
+ OpenPondExperimentEvaluationScheduleClient
173
+ };
174
+ //# sourceMappingURL=chunk-VC5OV5AS.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/experiment-evaluation-schedules.ts"],
4
+ "sourcesContent": ["import {EvaluationCoordinationTransport,type EvaluationCoordinationAccess} from \"./evaluation-coordination-http.js\";\nimport { z } from \"zod\";\nimport {\n contentHash,\n assertContentHash,\n ImmutableReleaseRefSchema,\n} from \"@openpond/harness\";\nimport { NightlyScheduleSchema } from \"@openpond/evals/learning\";\nimport { RunExperimentSchema } from \"./experiments.js\";\nconst Id = z.string().trim().min(1).max(200),\n Hash = z.string().regex(/^[a-f0-9]{64}$/),\n Time = z.string().datetime();\nexport const ExperimentEvaluationScheduleInputSchema = z\n .object({\n operationId: Id,\n id: Id.optional(),\n expectedRevision: z.number().int().nonnegative(),\n teamId: Id,\n projectId: Id.nullable(),\n enabled: z.boolean(),\n configuration: RunExperimentSchema,\n cadence: z.discriminatedUnion(\"kind\", [\n z\n .object({\n kind: z.literal(\"interval\"),\n seconds: z.number().int().min(60).max(31536000),\n })\n .strict(),\n z\n .object({ kind: z.literal(\"nightly\"), calendar: NightlyScheduleSchema })\n .strict(),\n ]),\n maximumTotalSpendUsd: z.number().finite().positive().max(10000),\n maximumAttempts: z.number().int().min(1).max(20),\n })\n .strict()\n .superRefine((v, c) => {\n if (\n v.configuration.request.teamId !== v.teamId ||\n (v.configuration.request.project?.id ?? null) !== v.projectId\n )\n c.addIssue({\n code: \"custom\",\n message:\n \"The scheduled Experiment must retain its actual workspace and Project.\",\n });\n if (v.configuration.maximumCostUsd > v.maximumTotalSpendUsd)\n c.addIssue({\n code: \"custom\",\n message:\n \"The run ceiling exceeds the approved cumulative schedule ceiling.\",\n });\n });\nexport const ExperimentEvaluationFireSchema = z\n .object({\n id: Id,\n scheduledAt: Time,\n coalescedThroughAt: Time,\n coalescedCount: z.number().int().nonnegative(),\n configurationHash: Hash,\n operationId: Id,\n state: z.enum([\n \"reserved\",\n \"dispatching\",\n \"running\",\n \"cleaning\",\n \"completed\",\n \"failed\",\n \"cancelled\",\n \"uncertain\",\n ]),\n executionId: Id.nullable(),\n attempt: z.number().int().positive(),\n maximumCostUsd: z.number().finite().positive(),\n actualSpendUsd: z.number().finite().nonnegative().nullable(),\n cleanupComplete: z.boolean(),\n error: z.string().max(4000).nullable(),\n })\n .strict();\nexport const ExperimentEvaluationScheduleSchema = z\n .object({\n schemaVersion: z.literal(\"openpond.experimentEvaluationSchedule.v1\"),\n id: Id,\n revision: z.number().int().positive(),\n actorId: Id,\n teamId: Id,\n projectId: Id.nullable(),\n operationId: Id,\n requestHash: Hash,\n configuration: RunExperimentSchema,\n configurationHash: Hash,\n cadence: ExperimentEvaluationScheduleInputSchema.shape.cadence,\n state: z.enum([\"scheduled\", \"disabled\", \"blocked\"]),\n nextRunAt: Time.nullable(),\n maximumTotalSpendUsd: z.number().finite().positive(),\n maximumAttempts: z.number().int().positive(),\n lastEvaluatedConfigurationHash: Hash.nullable(),\n newerUnevaluatedRelease: ImmutableReleaseRefSchema.nullable(),\n fires: z.array(ExperimentEvaluationFireSchema).max(10000),\n reason: z.string().max(4000).nullable(),\n createdAt: Time,\n updatedAt: Time,\n contentHash: Hash,\n })\n .strict();\nexport type ExperimentEvaluationSchedule = z.infer<\n typeof ExperimentEvaluationScheduleSchema\n>;\nexport type ExperimentEvaluationScheduleInput = z.infer<\n typeof ExperimentEvaluationScheduleInputSchema\n>;\nexport type ExperimentEvaluationFire = z.infer<\n typeof ExperimentEvaluationFireSchema\n>;\nexport function scheduledExperimentHash(\n value: z.infer<typeof RunExperimentSchema>,\n) {\n const { operationId: _operation, request, ...rest } = value;\n const { operationId: _requestOperation, ...body } = request;\n void _operation;\n void _requestOperation;\n return contentHash({ ...rest, request: body });\n}\nexport function verifyExperimentEvaluationSchedule(raw: unknown) {\n const v = ExperimentEvaluationScheduleSchema.parse(raw);\n assertContentHash(v, \"Scheduled Experiment\");\n if (\n v.configurationHash !== scheduledExperimentHash(v.configuration) ||\n v.configuration.request.teamId !== v.teamId ||\n (v.configuration.request.project?.id ?? null) !== v.projectId\n )\n throw new Error(\n \"Scheduled Experiment immutable authority differs from its recipe.\",\n );\n return v;\n}\nexport function sealExperimentEvaluationSchedule(\n value: Omit<ExperimentEvaluationSchedule, \"contentHash\">,\n) {\n return verifyExperimentEvaluationSchedule({\n ...value,\n contentHash: contentHash(value),\n });\n}\nexport const ExperimentEvaluationScheduleControlSchema = z\n .object({\n teamId: Id,\n id: Id,\n operationId: Id,\n expectedRevision: z.number().int().positive(),\n action: z.enum([\"cancel_active\", \"retry_active\", \"pause\"]),\n })\n .strict();\n\nexport const ExperimentEvaluationScheduleCommandSchema = z.discriminatedUnion(\n \"operation\",\n [\n z\n .object({\n operation: z.literal(\"publish\"),\n request: ExperimentEvaluationScheduleInputSchema,\n })\n .strict(),\n z\n .object({\n operation: z.literal(\"control\"),\n request: ExperimentEvaluationScheduleControlSchema,\n })\n .strict(),\n z.object({ operation: z.literal(\"read\"), id: Id }).strict(),\n z\n .object({\n operation: z.literal(\"list\"),\n cursor: Id.optional(),\n limit: z.number().int().min(1).max(100).default(50),\n })\n .strict(),\n ],\n);\n\nexport class OpenPondExperimentEvaluationScheduleClient {\n private readonly transport:EvaluationCoordinationTransport;\n constructor(access:EvaluationCoordinationAccess){this.transport=new EvaluationCoordinationTransport(access);}\n async command(raw:z.input<typeof ExperimentEvaluationScheduleCommandSchema>,signal?:AbortSignal){\n const request=ExperimentEvaluationScheduleCommandSchema.parse(raw),access=this.transport.access;\n if((request.operation===\"publish\"&&(request.request.teamId!==access.teamId||request.request.projectId!==access.projectId))||(request.operation===\"control\"&&request.request.teamId!==access.teamId))throw new Error(\"The schedule command belongs to another workspace or Project.\");\n const value=await this.transport.post(\"experiment-evaluation-schedules\",request,signal);\n const page=request.operation===\"list\"?z.object({items:z.array(z.unknown()).max(request.limit),nextCursor:z.string().nullable()}).strict().parse(value):null;\n const items=(page?.items??[value]).map(raw=>{const schedule=verifyExperimentEvaluationSchedule(raw);if(schedule.actorId!==access.actorId||schedule.teamId!==access.teamId||schedule.projectId!==access.projectId||request.operation===\"read\"&&schedule.id!==request.id||request.operation===\"control\"&&schedule.id!==request.request.id||request.operation===\"publish\"&&(schedule.requestHash!==contentHash(request.request)||Boolean(request.request.id&&schedule.id!==request.request.id)))throw new Error(\"Schedule readback differs from its exact owner command.\");return schedule;});\n return page?{items,nextCursor:page.nextCursor}:items[0]!;\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["raw"]
7
+ }
@@ -2,7 +2,7 @@ import {
2
2
  EvaluationProjectContextSchema,
3
3
  ModelStarterAttemptPolicySchema,
4
4
  ModelStarterAttemptSummarySchema
5
- } from "./chunk-W5TXWVFS.js";
5
+ } from "./chunk-2JKV5OJO.js";
6
6
  import {
7
7
  ModelProjectVersionedRefSchema,
8
8
  canonicalJson,
@@ -15,18 +15,24 @@ import {
15
15
 
16
16
  // src/harness-experiment-policy.ts
17
17
  import { z } from "zod";
18
- import { ProfileEvaluationRunSourceSchema } from "@openpond/evals";
18
+ import { ProfileEvaluationRunSourceSchema, ProfileExternalDatasetBindingSchema } from "@openpond/evals";
19
19
  var Id = z.string().trim().min(1).max(240);
20
20
  var Hash = z.string().regex(/^[a-f0-9]{64}$/);
21
21
  var HarnessExperimentPolicySchema = z.object({
22
22
  kind: z.literal("hosted_harness"),
23
23
  modelId: Id,
24
+ candidate: z.object({ artifactId: Id, contentHash: Hash, preparationId: Id, dispatchId: Id, baseProfileId: Id, workerImageDigest: z.string().regex(/^sha256:[a-f0-9]{64}$/) }).strict().optional(),
25
+ sourceCandidate: ProfileEvaluationRunSourceSchema.shape.sourceCandidate,
24
26
  reasoningEffort: z.enum(["off", "low", "medium", "high", "xhigh", "max"]).optional(),
25
27
  profileRepositoryId: Id,
26
28
  source: ProfileEvaluationRunSourceSchema,
27
29
  modelConfigurationHash: Hash,
28
- packageHash: Hash
29
- }).strict();
30
+ packageHash: Hash,
31
+ externalDatasetBinding: ProfileExternalDatasetBindingSchema.optional()
32
+ }).strict().superRefine((value, context) => {
33
+ if (JSON.stringify(value.externalDatasetBinding ?? null) !== JSON.stringify(value.source.externalDatasetBinding ?? null)) context.addIssue({ code: "custom", message: "The policy and source must bind the same external Dataset recipe." });
34
+ if (JSON.stringify(value.sourceCandidate ?? null) !== JSON.stringify(value.source.sourceCandidate ?? null)) context.addIssue({ code: "custom", message: "The policy and prepared source must bind the same actual source candidate." });
35
+ });
30
36
 
31
37
  // src/model-taskset-runs-contracts.ts
32
38
  import { z as z2 } from "zod";
@@ -107,7 +113,7 @@ var ModelTasksetRunResultSchema = z2.object({
107
113
  function verifyHarnessExperimentManifest(request, manifest) {
108
114
  assertContentHash(manifest, "Taskset run manifest");
109
115
  const policy = request.policy;
110
- if (policy.kind !== "hosted_harness" || manifest.execution.kind !== "harness" || canonicalJson(manifest.profileEvaluation) !== canonicalJson(policy.source) || canonicalJson(manifest.execution.harnessRelease) !== canonicalJson(policy.source.harnessRelease) || manifest.metadata.profileRepositoryId !== policy.profileRepositoryId || manifest.packageHash !== policy.packageHash || manifest.policy.kind !== "model" || manifest.policy.model.provider !== "openpond" || manifest.policy.model.model !== policy.modelId || manifest.policy.model.revision !== null || manifest.policy.model.artifactHash !== null || manifest.policy.model.tokenizerRevision !== null || manifest.policy.model.chatTemplateHash !== null || manifest.policy.configurationHash !== policy.modelConfigurationHash || manifest.tasksetRelease.id !== request.taskset.id || manifest.tasksetRelease.contentHash !== request.taskset.contentHash || canonicalJson(manifest.population) !== canonicalJson(request.population) || manifest.population.some((member) => member.receiptId !== `evaluation-${contentHash([manifest.id, member.taskId, member.seed]).slice(0, 32)}`))
116
+ if (policy.kind !== "hosted_harness" || manifest.execution.kind !== "harness" || canonicalJson(manifest.profileEvaluation) !== canonicalJson(policy.source) || canonicalJson(manifest.execution.harnessRelease) !== canonicalJson(policy.source.harnessRelease) || manifest.metadata.profileRepositoryId !== policy.profileRepositoryId || manifest.packageHash !== policy.packageHash || manifest.policy.kind !== "model" || manifest.policy.model.provider !== "openpond" || manifest.policy.model.model !== policy.modelId || manifest.policy.model.revision !== null || manifest.policy.model.artifactHash !== (policy.candidate?.contentHash ?? null) || manifest.policy.model.tokenizerRevision !== null || manifest.policy.model.chatTemplateHash !== null || manifest.policy.configurationHash !== policy.modelConfigurationHash || manifest.tasksetRelease.id !== request.taskset.id || manifest.tasksetRelease.contentHash !== request.taskset.contentHash || canonicalJson(manifest.population) !== canonicalJson(request.population) || manifest.population.some((member) => member.receiptId !== `evaluation-${contentHash([manifest.id, member.taskId, member.seed]).slice(0, 32)}`))
111
117
  throw new Error("Harness evaluation differs from its admitted source, package or model configuration.");
112
118
  }
113
119
  async function verifyModelTasksetRunDetails(value) {
@@ -120,7 +126,7 @@ async function verifyModelTasksetRunDetails(value) {
120
126
  } else if (request.policy.kind === "hosted_harness") {
121
127
  verifyHarnessExperimentManifest(request, manifest);
122
128
  if (policySnapshot !== null) throw new Error("Harness evaluations retain the native host model configuration.");
123
- } else if (manifest.policy.kind !== "model" || !policySnapshot || policySnapshot.modelId !== request.policy.modelId || manifest.policy.model.provider !== policySnapshot.provider || manifest.policy.model.model !== policySnapshot.upstreamModelId || manifest.policy.model.revision !== null || manifest.policy.model.artifactHash !== null || manifest.policy.model.tokenizerRevision !== null || manifest.policy.model.chatTemplateHash !== null || manifest.policy.configurationHash !== await canonicalSha256({ policy: request.policy, snapshot: policySnapshot })) throw new Error("Evaluation model differs from its admitted policy.");
129
+ } else if (manifest.policy.kind !== "model" || !policySnapshot || policySnapshot.modelId !== request.policy.modelId || manifest.policy.model.provider !== policySnapshot.provider || manifest.policy.model.model !== policySnapshot.upstreamModelId || manifest.policy.model.revision !== null || manifest.policy.model.artifactHash !== (request.policy.candidate?.contentHash ?? null) || manifest.policy.model.tokenizerRevision !== null || manifest.policy.model.chatTemplateHash !== null || manifest.policy.configurationHash !== await canonicalSha256({ policy: request.policy, snapshot: policySnapshot })) throw new Error("Evaluation model differs from its admitted policy.");
124
130
  return result;
125
131
  }
126
132
  async function verifyModelTasksetRunResult(value) {
@@ -152,4 +158,4 @@ export {
152
158
  verifyModelTasksetRunDetails,
153
159
  verifyModelTasksetRunResult
154
160
  };
155
- //# sourceMappingURL=chunk-7B44TQZD.js.map
161
+ //# sourceMappingURL=chunk-WX22WN33.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/harness-experiment-policy.ts", "../src/model-taskset-runs-contracts.ts"],
4
+ "sourcesContent": ["import { z } from \"zod\";\nimport { ProfileEvaluationRunSourceSchema, ProfileExternalDatasetBindingSchema } from \"@openpond/evals\";\n\nconst Id = z.string().trim().min(1).max(240);\nconst Hash = z.string().regex(/^[a-f0-9]{64}$/);\n\n/** The host admits this released component through its native Harness engine.\n * Chat prompt/settings are owned by the released source, not replaced here. */\nexport const HarnessExperimentPolicySchema = z.object({\n kind: z.literal(\"hosted_harness\"),\n modelId: Id,\n candidate:z.object({artifactId:Id,contentHash:Hash,preparationId:Id,dispatchId:Id,baseProfileId:Id,workerImageDigest:z.string().regex(/^sha256:[a-f0-9]{64}$/)}).strict().optional(),\n sourceCandidate:ProfileEvaluationRunSourceSchema.shape.sourceCandidate,\n reasoningEffort: z.enum([\"off\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"]).optional(),\n profileRepositoryId: Id,\n source: ProfileEvaluationRunSourceSchema,\n modelConfigurationHash: Hash,\n packageHash: Hash,\n externalDatasetBinding: ProfileExternalDatasetBindingSchema.optional(),\n}).strict().superRefine((value,context)=>{if(JSON.stringify(value.externalDatasetBinding??null)!==JSON.stringify(value.source.externalDatasetBinding??null))context.addIssue({code:\"custom\",message:\"The policy and source must bind the same external Dataset recipe.\"});if(JSON.stringify(value.sourceCandidate??null)!==JSON.stringify(value.source.sourceCandidate??null))context.addIssue({code:\"custom\",message:\"The policy and prepared source must bind the same actual source candidate.\"});});\nexport type HarnessExperimentPolicy = z.infer<typeof HarnessExperimentPolicySchema>;\n", "import { z } from \"zod\";\nimport { EvaluationProjectContextSchema } from \"./evaluation-project-context.js\";\nimport { assertContentHash, contentHash } from \"@openpond/harness\";\nimport { TasksetRunManifestSchema, TasksetRunMemberSchema, TasksetMetricResultSchema, assertTasksetMetricResult, orderTasksetRunReceipts } from \"@openpond/evals/metrics\";\nimport { AttemptReceiptSchema } from \"@openpond/evals/runs\";\nimport { ModelProjectVersionedRefSchema } from \"./model-projects.js\";\nimport { ModelStarterAttemptPolicySchema, ModelStarterAttemptSummarySchema } from \"./model-starter-attempts.js\";\nimport { canonicalJson, canonicalSha256 } from \"./protocol.js\";\nimport { HarnessExperimentPolicySchema } from \"./harness-experiment-policy.js\";\nexport { HarnessExperimentPolicySchema, type HarnessExperimentPolicy } from \"./harness-experiment-policy.js\";\n\nconst IdSchema = z.string().trim().min(1).max(200);\nconst HashSchema = z.string().regex(/^[a-f0-9]{64}$/);\nexport const ModelTasksetRunPolicySchema = z.discriminatedUnion(\"kind\", [\n ModelStarterAttemptPolicySchema.options[0],\n z.object({ kind: z.literal(\"fixture\") }).strict(),\n HarnessExperimentPolicySchema,\n]);\nexport const ModelTasksetRunRequestSchema = z.object({\n schemaVersion: z.literal(\"openpond.modelTasksetRunRequest.v1\"),\n operationId: IdSchema, teamId: IdSchema, modelProjectId: IdSchema.nullable(),\n name: z.string().trim().min(1).max(200).optional(),\n project: EvaluationProjectContextSchema.optional(),\n taskset: ModelProjectVersionedRefSchema, policy: ModelTasksetRunPolicySchema,\n population: z.array(TasksetRunMemberSchema).min(1).max(10_000),\n}).strict().superRefine((value, context) => {\n if (new Set(value.population.map(member => member.receiptId)).size !== value.population.length) context.addIssue({ code: \"custom\", path: [\"population\"], message: \"Run receipt identities must be unique.\" });\n if (value.population.some(member => (member.fixtureId !== null) !== (value.policy.kind === \"fixture\"))) context.addIssue({ code: \"custom\", path: [\"population\"], message: \"Only fixture runs require a fixture identity for every member.\" });\n if (value.population.some(member => !/^(0|[1-9][0-9]*)$/.test(member.seed) || Number(member.seed) > 2_147_483_647)) context.addIssue({ code: \"custom\", path: [\"population\"], message: \"Hosted environment seeds must be integers from 0 to 2147483647.\" });\n if (value.policy.kind === \"hosted_harness\" && value.modelProjectId !== null)\n context.addIssue({ code: \"custom\", path: [\"modelProjectId\"], message: \"A Harness target retains its released Profile binding separately from Model artifacts.\" });\n if (value.policy.kind === \"hosted_harness\"\n && new Set(value.population.map(member => canonicalJson([member.taskId, member.seed]))).size !== value.population.length)\n context.addIssue({ code: \"custom\", path: [\"population\"], message: \"Harness case identities must be unique for each task and seed.\" });\n});\nexport type ModelTasksetRunRequest = z.infer<typeof ModelTasksetRunRequestSchema>;\nexport const ModelTasksetRunSummarySchema = z.object({\n schemaVersion: z.literal(\"openpond.modelTasksetRunSummary.v1\"),\n id: IdSchema, revision: z.number().int().positive(), teamId: IdSchema, modelProjectId: IdSchema.nullable(),\n name: z.string().trim().min(1).max(200).optional(),\n project: EvaluationProjectContextSchema.optional(),\n operationId: IdSchema, taskset: ModelProjectVersionedRefSchema, policyKind: z.enum([\"hosted_chat\", \"fixture\", \"hosted_harness\"]),\n manifestHash: HashSchema,\n status: z.enum([\"queued\", \"running\", \"cancelling\", \"completed\", \"failed\", \"cancelled\"]),\n totalCount: z.number().int().min(1).max(10_000),\n counts: z.object({ pending: z.number().int().nonnegative(), running: z.number().int().nonnegative(), completed: z.number().int().nonnegative(), failed: z.number().int().nonnegative(), cancelled: z.number().int().nonnegative() }).strict(),\n createdAt: z.iso.datetime(), startedAt: z.iso.datetime().nullable(), completedAt: z.iso.datetime().nullable(),\n cleanupComplete: z.boolean(), resultAvailable: z.boolean(), score: z.number().min(0).max(1).nullable(),\n metricName: z.string().min(1).max(240),\n error: z.object({ code: IdSchema, message: z.string().max(2_000) }).strict().nullable(),\n}).strict().superRefine((value, context) => {\n if (Object.values(value.counts).reduce((sum, count) => sum + count, 0) !== value.totalCount) context.addIssue({ code: \"custom\", path: [\"counts\"], message: \"Run counts must account for the complete population.\" });\n if (value.status !== \"completed\" && value.score !== null) context.addIssue({ code: \"custom\", path: [\"score\"], message: \"Only completed evaluations publish a metric value.\" });\n if ([\"completed\", \"failed\", \"cancelled\"].includes(value.status) && (!value.completedAt || value.counts.pending || value.counts.running)) context.addIssue({ code: \"custom\", message: \"Terminal runs require complete population accounting.\" });\n if (value.status === \"cancelled\" && !value.cleanupComplete) context.addIssue({ code: \"custom\", message: \"Cancelled runs require confirmed cleanup.\" });\n if (value.resultAvailable && ![\"completed\", \"failed\", \"cancelled\"].includes(value.status)) context.addIssue({ code: \"custom\", message: \"Run results require terminal population accounting.\" });\n if (value.status === \"completed\" && (!value.cleanupComplete || !value.resultAvailable)) context.addIssue({ code: \"custom\", message: \"Completed evaluations require retained results and confirmed cleanup.\" });\n});\nexport type ModelTasksetRunSummary = z.infer<typeof ModelTasksetRunSummarySchema>;\nexport const ModelTasksetRunDetailsSchema = z.object({\n summary: ModelTasksetRunSummarySchema,\n request: ModelTasksetRunRequestSchema,\n manifest: TasksetRunManifestSchema,\n policySnapshot: ModelStarterAttemptSummarySchema.shape.policySnapshot,\n}).strict();\nexport type ModelTasksetRunDetails = z.infer<typeof ModelTasksetRunDetailsSchema>;\nexport const ModelTasksetRunListQuerySchema = z.object({ modelProjectId: IdSchema.optional(), projectId: EvaluationProjectContextSchema.shape.id.optional(), afterId: IdSchema.optional(), limit: z.number().int().min(1).max(100).default(25) }).strict();\nexport const ModelTasksetRunPageSchema = z.object({ items: z.array(ModelTasksetRunSummarySchema).max(100), nextCursor: IdSchema.nullable() }).strict();\nexport const ModelTasksetRunResultSchema = z.object({\n schemaVersion: z.literal(\"openpond.modelTasksetRunResult.v1\"),\n run: ModelTasksetRunDetailsSchema,\n receipts: z.array(AttemptReceiptSchema).min(1).max(10_000),\n metric: TasksetMetricResultSchema.nullable(),\n contentHash: HashSchema,\n}).strict();\nexport type ModelTasksetRunResult = z.infer<typeof ModelTasksetRunResultSchema>;\n\nexport function verifyHarnessExperimentManifest(request: ModelTasksetRunRequest, manifest: z.infer<typeof TasksetRunManifestSchema>) {\n assertContentHash(manifest, \"Taskset run manifest\");\n const policy = request.policy;\n if (policy.kind !== \"hosted_harness\" || manifest.execution.kind !== \"harness\"\n || canonicalJson(manifest.profileEvaluation) !== canonicalJson(policy.source)\n || canonicalJson(manifest.execution.harnessRelease) !== canonicalJson(policy.source.harnessRelease)\n || manifest.metadata.profileRepositoryId !== policy.profileRepositoryId\n || manifest.packageHash !== policy.packageHash || manifest.policy.kind !== \"model\"\n || manifest.policy.model.provider !== \"openpond\" || manifest.policy.model.model !== policy.modelId\n || manifest.policy.model.revision !== null || manifest.policy.model.artifactHash !== (policy.candidate?.contentHash??null)\n || manifest.policy.model.tokenizerRevision !== null || manifest.policy.model.chatTemplateHash !== null\n || manifest.policy.configurationHash !== policy.modelConfigurationHash\n || manifest.tasksetRelease.id !== request.taskset.id || manifest.tasksetRelease.contentHash !== request.taskset.contentHash\n || canonicalJson(manifest.population) !== canonicalJson(request.population)\n || manifest.population.some(member => member.receiptId !== `evaluation-${contentHash([manifest.id, member.taskId, member.seed]).slice(0, 32)}`))\n throw new Error(\"Harness evaluation differs from its admitted source, package or model configuration.\");\n}\n\n/** Server artifact ownership authenticates the producer. These checks bind all\n * portable projections to the admitted request, population and policy. */\nexport async function verifyModelTasksetRunDetails(value: unknown): Promise<ModelTasksetRunDetails> {\n const result = ModelTasksetRunDetailsSchema.parse(value);\n const { summary, request, manifest, policySnapshot } = result;\n assertContentHash(manifest, \"Taskset run manifest\");\n if (manifest.contentHash !== summary.manifestHash\n || manifest.id !== summary.id || manifest.createdAt !== summary.createdAt || summary.teamId !== request.teamId || summary.modelProjectId !== request.modelProjectId\n || canonicalJson(summary.project ?? null) !== canonicalJson(request.project ?? null)\n || canonicalJson(manifest.metadata.project ?? null) !== canonicalJson(request.project ?? null)\n || (summary.name ?? null) !== (request.name ?? null)\n || summary.operationId !== request.operationId || summary.policyKind !== request.policy.kind\n || summary.totalCount !== request.population.length || summary.metricName !== manifest.metricPolicy.primaryMetric\n || canonicalJson(summary.taskset) !== canonicalJson(request.taskset)\n || manifest.tasksetRelease.id !== request.taskset.id || manifest.tasksetRelease.contentHash !== request.taskset.contentHash\n || canonicalJson(manifest.population) !== canonicalJson(request.population)) throw new Error(\"Evaluation run differs from its admitted request or manifest.\");\n if (request.policy.kind === \"fixture\") {\n if (manifest.policy.kind !== \"fixture\" || policySnapshot !== null) throw new Error(\"Fixture checks cannot claim a model identity.\");\n } else if (request.policy.kind === \"hosted_harness\") {\n verifyHarnessExperimentManifest(request, manifest);\n if (policySnapshot !== null) throw new Error(\"Harness evaluations retain the native host model configuration.\");\n } else if (manifest.policy.kind !== \"model\" || !policySnapshot || policySnapshot.modelId !== request.policy.modelId\n || manifest.policy.model.provider !== policySnapshot.provider || manifest.policy.model.model !== policySnapshot.upstreamModelId\n || manifest.policy.model.revision !== null || manifest.policy.model.artifactHash !== (request.policy.candidate?.contentHash ?? null) || manifest.policy.model.tokenizerRevision !== null || manifest.policy.model.chatTemplateHash !== null\n || manifest.policy.configurationHash !== await canonicalSha256({ policy: request.policy, snapshot: policySnapshot })) throw new Error(\"Evaluation model differs from its admitted policy.\");\n return result;\n}\n\nexport async function verifyModelTasksetRunResult(value: unknown): Promise<ModelTasksetRunResult> {\n const result = ModelTasksetRunResultSchema.parse(value);\n const { contentHash: actual, ...content } = result;\n if (await canonicalSha256(content) !== actual) throw new Error(\"Evaluation result integrity failed.\");\n const { summary, manifest } = await verifyModelTasksetRunDetails(result.run);\n if (!summary.resultAvailable || ![\"completed\", \"failed\", \"cancelled\"].includes(summary.status)) throw new Error(\"Evaluation result is not terminal.\");\n const ordered = orderTasksetRunReceipts(manifest, result.receipts);\n if (canonicalJson(ordered) !== canonicalJson(result.receipts)) throw new Error(\"Evaluation receipts differ from the admitted order.\");\n if ((summary.status === \"completed\") !== (result.metric !== null)) throw new Error(\"Only completed evaluations retain a metric.\");\n if (result.metric) {\n assertTasksetMetricResult(result.metric);\n if (result.metric.runManifest.id !== manifest.id || result.metric.runManifest.contentHash !== manifest.contentHash\n || canonicalJson(result.metric.tasksetRelease) !== canonicalJson(manifest.tasksetRelease)\n || canonicalJson(result.metric.policy) !== canonicalJson(manifest.metricPolicy)\n || canonicalJson(result.metric.receiptRefs) !== canonicalJson(result.receipts.map(({ id, contentHash }) => ({ id, contentHash })))\n || result.metric.value !== summary.score) throw new Error(\"Evaluation metric differs from its admitted run or receipt population.\");\n }\n return result;\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["z", "z", "contentHash"]
7
+ }
@@ -0,0 +1,31 @@
1
+ import {
2
+ ExperimentGraderSelectionSchema
3
+ } from "./chunk-2NSNBED7.js";
4
+ import {
5
+ ModelTasksetRunRequestSchema
6
+ } from "./chunk-WX22WN33.js";
7
+
8
+ // src/experiment-run-contracts.ts
9
+ import { z } from "zod";
10
+ var Id = z.string().trim().min(1).max(200);
11
+ var RunExperimentSchema = z.object({
12
+ operationId: Id,
13
+ request: ModelTasksetRunRequestSchema,
14
+ maximumCostUsd: z.number().finite().positive().max(1e4),
15
+ graders: z.array(ExperimentGraderSelectionSchema).min(1).max(100).optional(),
16
+ sourceExperimentId: Id.optional()
17
+ }).strict().superRefine((value, context) => {
18
+ if (!value.request.name)
19
+ context.addIssue({ code: "custom", path: ["request", "name"], message: "Name this Experiment before starting it." });
20
+ if (value.operationId !== value.request.operationId)
21
+ context.addIssue({ code: "custom", path: ["request", "operationId"], message: "Use one operation identity for this Experiment." });
22
+ if (Math.round(value.maximumCostUsd * 1e6) < 1)
23
+ context.addIssue({ code: "custom", path: ["maximumCostUsd"], message: "The spending cap must be at least $0.000001." });
24
+ if (value.graders && new Set(value.graders.map((grader) => grader.id)).size !== value.graders.length)
25
+ context.addIssue({ code: "custom", path: ["graders"], message: "Select each grader once." });
26
+ });
27
+
28
+ export {
29
+ RunExperimentSchema
30
+ };
31
+ //# sourceMappingURL=chunk-XEUOJ5WF.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/experiment-run-contracts.ts"],
4
+ "sourcesContent": ["import { z } from \"zod\";\nimport { ModelTasksetRunRequestSchema } from \"./model-taskset-runs-contracts.js\";\nimport { ExperimentGraderSelectionSchema } from \"./experiment-contracts.js\";\n\nconst Id = z.string().trim().min(1).max(200);\n\n/** One reviewed configuration admits one Experiment. A transport retry reuses\n * its operation identity; Duplicate and edit submits a new operation. */\nexport const RunExperimentSchema = z.object({\n operationId: Id,\n request: ModelTasksetRunRequestSchema,\n maximumCostUsd: z.number().finite().positive().max(10_000),\n graders: z.array(ExperimentGraderSelectionSchema).min(1).max(100).optional(),\n sourceExperimentId: Id.optional(),\n}).strict().superRefine((value, context) => {\n if (!value.request.name)\n context.addIssue({ code: \"custom\", path: [\"request\", \"name\"], message: \"Name this Experiment before starting it.\" });\n if (value.operationId !== value.request.operationId)\n context.addIssue({ code: \"custom\", path: [\"request\", \"operationId\"], message: \"Use one operation identity for this Experiment.\" });\n if (Math.round(value.maximumCostUsd * 1_000_000) < 1)\n context.addIssue({ code: \"custom\", path: [\"maximumCostUsd\"], message: \"The spending cap must be at least $0.000001.\" });\n if (value.graders && new Set(value.graders.map(grader => grader.id)).size !== value.graders.length)\n context.addIssue({ code: \"custom\", path: [\"graders\"], message: \"Select each grader once.\" });\n});\nexport type RunExperiment = z.infer<typeof RunExperimentSchema>;\n"],
5
+ "mappings": ";;;;;;;;AAAA,SAAS,SAAS;AAIlB,IAAM,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAIpC,IAAM,sBAAsB,EAAE,OAAO;AAAA,EAC1C,aAAa;AAAA,EACb,SAAS;AAAA,EACT,gBAAgB,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,GAAM;AAAA,EACzD,SAAS,EAAE,MAAM,+BAA+B,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS;AAAA,EAC3E,oBAAoB,GAAG,SAAS;AAClC,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,OAAO,YAAY;AAC1C,MAAI,CAAC,MAAM,QAAQ;AACjB,YAAQ,SAAS,EAAE,MAAM,UAAU,MAAM,CAAC,WAAW,MAAM,GAAG,SAAS,2CAA2C,CAAC;AACrH,MAAI,MAAM,gBAAgB,MAAM,QAAQ;AACtC,YAAQ,SAAS,EAAE,MAAM,UAAU,MAAM,CAAC,WAAW,aAAa,GAAG,SAAS,kDAAkD,CAAC;AACnI,MAAI,KAAK,MAAM,MAAM,iBAAiB,GAAS,IAAI;AACjD,YAAQ,SAAS,EAAE,MAAM,UAAU,MAAM,CAAC,gBAAgB,GAAG,SAAS,+CAA+C,CAAC;AACxH,MAAI,MAAM,WAAW,IAAI,IAAI,MAAM,QAAQ,IAAI,YAAU,OAAO,EAAE,CAAC,EAAE,SAAS,MAAM,QAAQ;AAC1F,YAAQ,SAAS,EAAE,MAAM,UAAU,MAAM,CAAC,SAAS,GAAG,SAAS,2BAA2B,CAAC;AAC/F,CAAC;",
6
+ "names": []
7
+ }