openpond-sdk 0.5.6 → 0.5.7

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 (37) hide show
  1. package/TRAINING_PROTOCOL.md +19 -0
  2. package/dist/chunk-ARUJ3FJT.js +447 -0
  3. package/dist/chunk-ARUJ3FJT.js.map +7 -0
  4. package/dist/chunk-QFT2MCIC.js +1526 -0
  5. package/dist/chunk-QFT2MCIC.js.map +7 -0
  6. package/dist/{chunk-NF63YMOL.js → chunk-QUOW6URQ.js} +7 -9
  7. package/dist/{chunk-NF63YMOL.js.map → chunk-QUOW6URQ.js.map} +3 -3
  8. package/dist/{chunk-25TBEGXB.js → chunk-TKJU3BOW.js} +2 -2
  9. package/dist/chunk-UJZ3XEE3.js +902 -0
  10. package/dist/chunk-UJZ3XEE3.js.map +7 -0
  11. package/dist/{chunk-EV4PKJWN.js → chunk-UKVK7MRJ.js} +320 -208
  12. package/dist/chunk-UKVK7MRJ.js.map +7 -0
  13. package/dist/index.js +3 -3
  14. package/dist/learning.js +3 -3
  15. package/dist/model-taskset-runs.js +2 -2
  16. package/dist/refiner.js +1 -1
  17. package/dist/taskset-drafts.js +35 -33
  18. package/dist/taskset-drafts.js.map +1 -1
  19. package/dist/taskset-packages.js +51 -465
  20. package/dist/taskset-packages.js.map +4 -4
  21. package/dist/training-bundle.js +459 -0
  22. package/dist/training-bundle.js.map +7 -0
  23. package/dist/types/packages/sdk/src/taskset-authored-contracts.d.ts +2 -2
  24. package/dist/types/packages/sdk/src/taskset-authored-files.d.ts +1 -1
  25. package/dist/types/packages/sdk/src/taskset-draft-dataset-artifacts.d.ts +2 -2
  26. package/dist/types/packages/sdk/src/taskset-package-projection.d.ts +1 -1
  27. package/dist/types/packages/sdk/src/training-bundle-contracts.d.ts +287 -0
  28. package/dist/types/packages/sdk/src/training-bundle-contracts.d.ts.map +1 -0
  29. package/dist/types/packages/sdk/src/training-bundle.d.ts +48 -0
  30. package/dist/types/packages/sdk/src/training-bundle.d.ts.map +1 -0
  31. package/dist/types/packages/sdk/src/training-learning-batch.d.ts +719 -0
  32. package/dist/types/packages/sdk/src/training-learning-batch.d.ts.map +1 -0
  33. package/package.json +6 -2
  34. package/dist/chunk-EV4PKJWN.js.map +0 -7
  35. package/dist/chunk-PXB6YY36.js +0 -2395
  36. package/dist/chunk-PXB6YY36.js.map +0 -7
  37. /package/dist/{chunk-25TBEGXB.js.map → chunk-TKJU3BOW.js.map} +0 -0
@@ -0,0 +1,459 @@
1
+ import {
2
+ learningVerifierModule,
3
+ projectLearningBatchGraders,
4
+ resolvePortableTasksetRewardExecution
5
+ } from "./chunk-ARUJ3FJT.js";
6
+ import {
7
+ TasksetSchema,
8
+ computeTasksetHash
9
+ } from "./chunk-QFT2MCIC.js";
10
+ import "./chunk-4IDTRFW2.js";
11
+ import "./chunk-S7I45WJQ.js";
12
+ import {
13
+ TRAINING_EVALUATION_SOURCE_PATH,
14
+ TrainingEvaluationSourceSchema,
15
+ assertTrainingEvaluationIsolation
16
+ } from "./chunk-F5JBFRAH.js";
17
+ import {
18
+ HarnessSourceSelectionSchema,
19
+ validateHarnessSourcePackage
20
+ } from "./chunk-UKVK7MRJ.js";
21
+ import {
22
+ ImmutableReleaseRefSchema,
23
+ ReleaseHashSchema,
24
+ ReleaseIdSchema,
25
+ ReleaseTimestampSchema,
26
+ canonicalJson,
27
+ contentHash,
28
+ sha256
29
+ } from "./chunk-QUOW6URQ.js";
30
+ import "./chunk-ZNFOVV7B.js";
31
+
32
+ // src/training-bundle.ts
33
+ import { compileBoundGraders } from "@openpond/evals/rewards";
34
+ import { verifyLearningTextAsset as verifyLearningTextAsset2 } from "@openpond/evals/learning";
35
+
36
+ // src/training-bundle-contracts.ts
37
+ import { z } from "zod";
38
+ var ScopedSecretDeclarationSchema = z.object({
39
+ id: ReleaseIdSchema,
40
+ purpose: z.string().trim().min(1).max(500),
41
+ audience: z.enum([
42
+ "orchestrator",
43
+ "environment",
44
+ "privileged_scorer",
45
+ "trainer",
46
+ "infrastructure"
47
+ ]),
48
+ required: z.boolean(),
49
+ ttlSeconds: z.number().int().positive().max(86400),
50
+ scopes: z.array(z.string().trim().min(1).max(500)).max(100).default([])
51
+ }).strict();
52
+ var OpaqueSecretLeaseRefSchema = z.object({
53
+ declarationId: ReleaseIdSchema,
54
+ leaseRef: z.string().trim().min(8).max(1e3),
55
+ audience: ScopedSecretDeclarationSchema.shape.audience,
56
+ expiresAt: ReleaseTimestampSchema
57
+ }).strict();
58
+ var HarnessRuntimeTargetBindingSchema = z.object({
59
+ adapterId: ReleaseIdSchema,
60
+ placement: z.enum(["local", "remote", "colocated", "provider_native"]),
61
+ capabilityReceipt: ReleaseHashSchema,
62
+ runtimeVersion: z.string().trim().min(1).max(200),
63
+ dataPlane: z.object({
64
+ provider: ReleaseIdSchema,
65
+ dataPlaneId: ReleaseIdSchema,
66
+ cellId: ReleaseIdSchema,
67
+ runnerPoolId: ReleaseIdSchema,
68
+ runtimeImageDigest: z.string().regex(/^sha256:[a-f0-9]{64}$/),
69
+ capabilityReceipt: ReleaseHashSchema
70
+ }).strict().nullable()
71
+ }).strict();
72
+ var ComputeTargetBindingSchema = z.object({
73
+ adapterId: ReleaseIdSchema,
74
+ kind: z.enum(["local", "ssh", "managed", "custom"]),
75
+ deviceOrPool: z.string().trim().min(1).max(1e3),
76
+ capabilityReceipt: ReleaseHashSchema,
77
+ provider: ReleaseIdSchema.nullable()
78
+ }).strict();
79
+ var TrainingEngineBindingSchema = z.object({
80
+ adapterId: ReleaseIdSchema,
81
+ workerVersion: z.string().trim().min(1).max(200),
82
+ workerImageDigest: z.string().regex(/^sha256:[a-f0-9]{64}$/).nullable(),
83
+ upstreamRevision: z.string().trim().min(1).max(500),
84
+ capabilityReceipt: ReleaseHashSchema
85
+ }).strict();
86
+ var HarnessRunManifestContentSchema = z.object({
87
+ schemaVersion: z.literal("openpond.harnessRunManifest.v1"),
88
+ id: ReleaseIdSchema,
89
+ harnessRelease: ImmutableReleaseRefSchema,
90
+ datasetRelease: ImmutableReleaseRefSchema,
91
+ evidenceSets: z.array(ImmutableReleaseRefSchema).max(1e4),
92
+ model: z.object({
93
+ source: z.string().trim().min(1).max(200),
94
+ revision: z.string().trim().min(1).max(500),
95
+ artifactHash: ReleaseHashSchema.nullable(),
96
+ tokenizerRevision: z.string().trim().min(1).max(500),
97
+ chatTemplateHash: ReleaseHashSchema
98
+ }).strict(),
99
+ recipe: z.object({
100
+ method: z.string().trim().min(1).max(100),
101
+ version: z.string().trim().min(1).max(200),
102
+ configHash: ReleaseHashSchema
103
+ }).strict(),
104
+ runtimeTarget: HarnessRuntimeTargetBindingSchema,
105
+ computeTarget: ComputeTargetBindingSchema,
106
+ engine: TrainingEngineBindingSchema,
107
+ resolvedBundleHash: ReleaseHashSchema,
108
+ secretLeaseRefs: z.array(OpaqueSecretLeaseRefSchema).max(1e3),
109
+ approval: z.object({
110
+ approvalHash: ReleaseHashSchema,
111
+ approvedAt: ReleaseTimestampSchema,
112
+ maximumSpendUsd: z.number().nonnegative().nullable()
113
+ }).strict(),
114
+ createdAt: ReleaseTimestampSchema
115
+ }).strict();
116
+ var HarnessRunManifestSchema = HarnessRunManifestContentSchema.extend({
117
+ contentHash: ReleaseHashSchema
118
+ }).strict();
119
+ var ResolvedTrainingBundleContentSchema = z.object({
120
+ schemaVersion: z.literal("openpond.resolvedTrainingBundle.v1"),
121
+ projection: z.literal("trainer"),
122
+ harnessRelease: ImmutableReleaseRefSchema,
123
+ datasetRelease: ImmutableReleaseRefSchema,
124
+ evidenceSetRelease: ImmutableReleaseRefSchema.nullable(),
125
+ files: z.array(
126
+ z.object({
127
+ path: z.string().trim().min(1).max(2e3),
128
+ sha256: ReleaseHashSchema,
129
+ sizeBytes: z.number().int().nonnegative()
130
+ }).strict()
131
+ ).max(1e5)
132
+ }).strict();
133
+ var ResolvedTrainingBundleManifestSchema = ResolvedTrainingBundleContentSchema.extend({
134
+ contentHash: ReleaseHashSchema
135
+ }).strict();
136
+
137
+ // src/training-learning-batch.ts
138
+ import { compileTaskBatch, learningRef, taskBatchPackageMetadata, verifyLearningTextAsset } from "@openpond/evals";
139
+ function materializeLearningBatchTaskset(input) {
140
+ const release = compileTaskBatch(input);
141
+ const metadata = taskBatchPackageMetadata(release);
142
+ if (release.environment.kind !== "text" || release.tools.length || release.tasks.some((task) => task.artifactRefs.length)) throw new Error("This learning batch requires an environment or asset adapter before training preparation.");
143
+ const sourceId = input.source.id;
144
+ const signals = { demonstrations: [], preferences: [], corrections: [], feedback: [], rewards: [], labels: [] };
145
+ const fixtures = [];
146
+ for (const admission of metadata.admissions) {
147
+ const evidence = input.evidence.find((item) => item.id === admission.evidence.id);
148
+ const decision = input.decisions.find((item) => item.id === admission.decision.id);
149
+ if (input.batch.purpose === "reward_training" && decision.grade?.training.status === "scored") signals.rewards.push({
150
+ id: `reward-${admission.taskId}`,
151
+ taskId: admission.taskId,
152
+ kind: "reward",
153
+ task: input.definition.instructions,
154
+ rules: [{ id: input.binding.id, points: 1, condition: "Execute the released Reward binding with its declared normalization, weights and gates." }],
155
+ otherwisePoints: 0,
156
+ executable: true,
157
+ approved: true,
158
+ confidence: 1,
159
+ sourceRefs: [sourceId],
160
+ artifactRef: input.binding.id,
161
+ metadata: { rewardBinding: learningRef(input.binding), evidence: admission.evidence, decision: admission.decision }
162
+ });
163
+ if (admission.supervisedTarget !== null) signals.demonstrations.push({ kind: "demonstration", id: `demo-${admission.taskId}`, taskId: admission.taskId, sourceRefs: [sourceId], artifactRef: admission.decision.id, approved: true, confidence: 1, prompt: null, response: JSON.stringify(admission.supervisedTarget), metadata: { evidence: admission.evidence, decision: admission.decision, targetGradeHash: decision.targetGrade?.contentHash } });
164
+ for (const [kind, output, grade] of [["observed", evidence.submission.observedOutput, decision.grade], ["target", decision.approvedTarget, decision.targetGrade]]) {
165
+ const outcome = fixtureOutcome(grade);
166
+ if (output === null || outcome === null) continue;
167
+ fixtures.push({ id: `fixture-${kind}-${admission.taskId}`, taskId: admission.taskId, label: outcome.passed ? "positive" : "negative", output, infrastructureError: null, expectedPassed: outcome.passed, expectedRewardEligible: outcome.rewardEligible, metadata: { gradeReceiptHash: grade.contentHash, evidence: admission.evidence, decision: admission.decision } });
168
+ }
169
+ }
170
+ if (!fixtures.length) throw new Error("Grade at least one reviewed response before preparing this batch. Grader fixtures must come from actual receipts.");
171
+ const graders = projectLearningBatchGraders(input.binding, input.rewards, input.assets);
172
+ const generatedFiles = [];
173
+ for (const grader of release.graders) {
174
+ if (grader.kind !== "custom_verifier") continue;
175
+ const asset = input.assets?.find((asset2) => asset2.id === grader.verifierRef.id);
176
+ if (!asset) throw new Error(`Reward ${grader.id} is missing its immutable verifier source.`);
177
+ const module = learningVerifierModule(grader.verifierRef.contentHash);
178
+ if (!generatedFiles.some((file) => file.path === module)) generatedFiles.push({ path: module, role: "verifier", content: verifyLearningTextAsset(asset, grader.verifierRef) });
179
+ }
180
+ const taskset = TasksetSchema.parse({
181
+ schemaVersion: "openpond.taskset.v1",
182
+ id: `learning-${contentHash([input.profileId, input.batch.contentHash]).slice(0, 40)}`,
183
+ revision: 1,
184
+ profileId: input.profileId,
185
+ profileRelease: null,
186
+ createImproveRunId: null,
187
+ name: `${input.definition.name} \xB7 ${input.batch.examples.length} approved examples`,
188
+ objective: input.definition.instructions,
189
+ purpose: "general",
190
+ benchmark: null,
191
+ status: "needs_review",
192
+ sourceRefs: [input.source],
193
+ datasetArtifact: null,
194
+ policy: release.policy,
195
+ environment: { protocolVersion: "openpond.taskEnvironment.v1", kind: "chat", entrypoint: "openpond.text.v1", stateful: false, deterministicSeeds: release.environment.deterministicSeeds, toolNames: [], lifecycle: ["create", "reset", "step", "grade", "cleanup"], defaultTimeoutMs: release.environment.defaultTimeoutMs, networkPolicy: release.environment.networkPolicy, metadata: { portableEnvironment: release.environment } },
196
+ capabilities: { schemaVersion: "openpond.tasksetCapabilities.v1", taskKind: "chat", supportedSignals: signals.demonstrations.length ? ["demonstration", "reward"] : ["reward"], compatibleMethods: input.batch.purpose === "supervised_training" ? ["sft"] : input.batch.purpose === "reward_training" ? ["grpo", "ppo"] : ["none"], rewardKinds: ["deterministic"], requiresTools: false, requiresState: false, requiresPrivilegedGrading: true, environmentPlacements: ["local", "remote"], exportable: true, portabilityBlockers: [] },
197
+ tasks: release.tasks.map(({ artifactRefs: _assets, ...task }) => ({ ...task, schemaVersion: "openpond.taskData.v1", sourceRefs: [sourceId], metadata: { admission: metadata.admissions.find((entry) => entry.taskId === task.id), exampleOrigin: input.evidence.find((evidence) => evidence.id === task.id)?.correctionFeedbackId ? "corrected" : "extracted" } })),
198
+ graders,
199
+ graderFixtures: fixtures,
200
+ learningSignals: signals,
201
+ authoringProvenance: { schemaVersion: "openpond.taskAuthoringProvenance.v1", model: null, modelConfig: {}, skillHash: contentHash("openpond-learning-batch-v1"), promptTemplateVersion: "learning-batch-v1", buildIntent: input.batch.purpose === "supervised_training" ? "demonstrations" : "verifiable_reward", buildSpecification: null, evidenceHashes: input.batch.examples.map((entry) => entry.evidence.contentHash), tasksetSdkVersion: "learning-batch-v1", sourceCommit: null, repairHistory: [], createdAt: input.batch.sealedAt },
202
+ readiness: null,
203
+ contentHash: "00000000",
204
+ createdAt: input.batch.sealedAt,
205
+ updatedAt: input.batch.sealedAt,
206
+ metadata: { learning: metadata, learningRelease: learningRef(release), trainingMethod: input.batch.purpose === "supervised_training" ? "sft" : input.batch.purpose === "reward_training" ? "grpo" : "none", tasksetOutputContract: { mode: "structured_json", jsonSchema: input.definition.outputSchema, renderer: null } }
207
+ });
208
+ return { taskset: TasksetSchema.parse({ ...taskset, contentHash: computeTasksetHash(taskset) }), release, generatedFiles };
209
+ }
210
+ function fixtureOutcome(grade) {
211
+ if (!grade) return null;
212
+ const outcome = grade.training.status === "not_configured" ? grade.evaluation : grade.training;
213
+ if (outcome.status !== "scored") return null;
214
+ return { passed: outcome.passed === true, rewardEligible: grade.training.status === "scored" };
215
+ }
216
+
217
+ // src/training-bundle.ts
218
+ function buildTasksetTrainingBundle(input) {
219
+ const { taskset, modelProject, harnessRelease, tasksetRelease } = input;
220
+ const setup = modelProject.trainingSetup;
221
+ const releasedHarness = ImmutableReleaseRefSchema.parse(harnessRelease);
222
+ const releasedTaskset = ImmutableReleaseRefSchema.parse(tasksetRelease);
223
+ void input.openpondRelease;
224
+ void input.workerProtocol;
225
+ const actualTasksetHash = computeTasksetHash(taskset);
226
+ if (actualTasksetHash !== taskset.contentHash) {
227
+ throw new Error(
228
+ "Taskset authoring state changed after its release was selected."
229
+ );
230
+ }
231
+ if (!setup.baseModel?.revision || !setup.baseModel.tokenizerRevision || !setup.baseModel.chatTemplateHash || !setup.recipe || !setup.tasksetRef || setup.tasksetRef.id !== taskset.id || setup.tasksetRef.contentHash !== taskset.contentHash) {
232
+ throw new Error(
233
+ "Model Run must bind an exact Taskset, Model revision, tokenizer, chat template, and Recipe."
234
+ );
235
+ }
236
+ const profileRelease = taskset.profileRelease ?? {
237
+ id: `profile_${taskset.profileId}`,
238
+ revision: taskset.revision,
239
+ contentHash: contentHash({
240
+ profileId: taskset.profileId,
241
+ sourceCommit: taskset.authoringProvenance.sourceCommit,
242
+ skillHash: taskset.authoringProvenance.skillHash
243
+ })
244
+ };
245
+ const assets = /* @__PURE__ */ new Map();
246
+ if (input.evaluationSource) {
247
+ const evaluation = TrainingEvaluationSourceSchema.parse(input.evaluationSource);
248
+ if (contentHash(evaluation.taskset) !== contentHash(setup.evaluationTasksetRef)) {
249
+ throw new Error("The evaluation source differs from the prepared Model configuration.");
250
+ }
251
+ assertTrainingEvaluationIsolation(taskset.tasks.filter((task) => task.split === "train"), evaluation.tasks);
252
+ assets.set(TRAINING_EVALUATION_SOURCE_PATH, new TextEncoder().encode(canonicalJson(evaluation)));
253
+ } else if (setup.evaluationTasksetRef) {
254
+ throw new Error("The prepared Model requires its pinned evaluation source bytes.");
255
+ }
256
+ const harnessSource = input.harnessSource ? validateHarnessSourcePackage(input.harnessSource, releasedHarness) : null;
257
+ if (setup.harnessRelease && !harnessSource) {
258
+ throw new Error("A selected Harness requires its complete immutable source package.");
259
+ }
260
+ if (harnessSource && (!setup.harnessRelease || setup.harnessRelease.id !== releasedHarness.id || setup.harnessRelease.contentHash !== releasedHarness.contentHash)) {
261
+ throw new Error("Harness source differs from the Model's explicit selection.");
262
+ }
263
+ if (harnessSource) {
264
+ const leavesLocalHost = input.runtime.placement !== "local" || input.compute.kind !== "local";
265
+ if (leavesLocalHost && (!harnessSource.agentSnapshot.portability.portable || harnessSource.harnessRelease.files.some((file) => file.visibility === "host_private"))) {
266
+ throw new Error("The selected Harness contains source that cannot leave its local host.");
267
+ }
268
+ addJsonAsset(assets, "harness/source-package.json", harnessSource);
269
+ }
270
+ addJsonAsset(assets, "harness/execution.json", HarnessSourceSelectionSchema.parse({
271
+ schemaVersion: "openpond.harnessSourceSelection.v1",
272
+ mode: harnessSource ? "selected_release" : "taskset_owned",
273
+ harnessRelease: releasedHarness,
274
+ sourcePackageHash: harnessSource?.contentHash ?? null
275
+ }));
276
+ const rewardExecution = resolvePortableTasksetRewardExecution(taskset, input.rewardExecution);
277
+ if (rewardExecution) {
278
+ const verifierAssets = input.verifierAssets ?? [];
279
+ const references = compileBoundGraders(rewardExecution.binding, rewardExecution.rewards).flatMap((grader) => grader.kind === "custom_verifier" ? [grader.verifierRef] : []);
280
+ const expected = new Set(references.map((reference) => reference.id));
281
+ if (new Set(verifierAssets.map((asset) => asset.id)).size !== verifierAssets.length || verifierAssets.some((asset) => !expected.has(asset.id))) throw new Error("Unexpected or duplicate private verifier asset.");
282
+ for (const reference of references) {
283
+ const asset = verifierAssets.find((asset2) => asset2.id === reference.id);
284
+ if (!asset || reference.visibility !== "verifier") throw new Error("Training bundle requires its private verifier asset.");
285
+ verifyLearningTextAsset2(asset, reference);
286
+ }
287
+ addJsonAsset(assets, "reward-binding.json", { kind: "reward_binding_v1", binding: rewardExecution.binding, rewards: rewardExecution.rewards, assets: verifierAssets });
288
+ } else if (input.verifierAssets?.length) {
289
+ throw new Error("Private verifier assets require a published Reward binding.");
290
+ }
291
+ addJsonAsset(assets, "environment.json", {
292
+ schemaVersion: "openpond.harnessEnvironment.v1",
293
+ environment: taskset.environment,
294
+ capabilities: taskset.capabilities,
295
+ policy: taskset.policy,
296
+ outputContract: taskset.metadata.tasksetOutputContract?.mode === "text" ? null : taskset.metadata.tasksetOutputContract ?? null
297
+ });
298
+ addJsonAsset(assets, "graders.json", {
299
+ schemaVersion: "openpond.harnessGraders.v1",
300
+ graders: taskset.graders,
301
+ fixtures: taskset.graderFixtures
302
+ });
303
+ addJsonAsset(assets, "tool-contract.json", {
304
+ schemaVersion: "openpond.harnessToolContract.v1",
305
+ toolNames: taskset.environment.toolNames,
306
+ actionBindings: taskset.environment.actionBindings ?? [],
307
+ capabilities: taskset.capabilities,
308
+ connectedAppScopes: taskset.policy.connectedAppScopes
309
+ });
310
+ const trainTasks = taskset.tasks.filter((task) => task.split === "train");
311
+ if (trainTasks.length > 0) {
312
+ addJsonAsset(assets, "dataset/train.json", {
313
+ schemaVersion: "openpond.datasetSplit.v1",
314
+ split: "train",
315
+ tasks: trainTasks
316
+ });
317
+ addTasksetAssets({
318
+ assets,
319
+ tasks: trainTasks,
320
+ tasksetAssetBytes: input.tasksetAssetBytes ?? /* @__PURE__ */ new Map()
321
+ });
322
+ } else if (taskset.datasetArtifact) {
323
+ addJsonAsset(assets, "dataset/artifact.json", taskset.datasetArtifact);
324
+ } else {
325
+ throw new Error("Taskset has no training dataset.");
326
+ }
327
+ const approvedSignals = Object.values(taskset.learningSignals).flat().filter((signal) => signal.approved);
328
+ for (const signal of approvedSignals) {
329
+ const value = bytes(signal);
330
+ assets.set(`evidence/signals/${sha256(value)}.json`, value);
331
+ }
332
+ const datasetRelease = {
333
+ id: `dataset_${taskset.id}_r${taskset.revision}`,
334
+ contentHash: contentHash({
335
+ taskset: releasedTaskset,
336
+ sourceRefs: taskset.sourceRefs,
337
+ datasetArtifact: taskset.datasetArtifact ?? null,
338
+ trainTasks
339
+ })
340
+ };
341
+ const evidenceSetRelease = approvedSignals.length > 0 ? {
342
+ id: `evidence_${taskset.id}_r${taskset.revision}`,
343
+ contentHash: contentHash({
344
+ taskset: releasedTaskset,
345
+ harnessRelease: releasedHarness,
346
+ datasetRelease,
347
+ profileRelease,
348
+ signals: approvedSignals
349
+ })
350
+ } : null;
351
+ const bundleContent = ResolvedTrainingBundleContentSchema.parse({
352
+ schemaVersion: "openpond.resolvedTrainingBundle.v1",
353
+ projection: "trainer",
354
+ harnessRelease: releasedHarness,
355
+ datasetRelease,
356
+ evidenceSetRelease,
357
+ files: [...assets.entries()].sort(([left], [right]) => left.localeCompare(right)).map(([assetPath, value]) => ({
358
+ path: assetPath,
359
+ sha256: sha256(value),
360
+ sizeBytes: value.byteLength
361
+ }))
362
+ });
363
+ const resolvedBundleManifest = ResolvedTrainingBundleManifestSchema.parse({
364
+ ...bundleContent,
365
+ contentHash: contentHash(bundleContent)
366
+ });
367
+ const manifestContent = HarnessRunManifestContentSchema.parse({
368
+ schemaVersion: "openpond.harnessRunManifest.v1",
369
+ id: `manifest_${input.modelRunId}_${input.approval.approvalHash.slice(0, 16)}`,
370
+ harnessRelease,
371
+ datasetRelease,
372
+ evidenceSets: evidenceSetRelease ? [evidenceSetRelease] : [],
373
+ model: {
374
+ source: setup.baseModel.modelId,
375
+ revision: setup.baseModel.revision,
376
+ artifactHash: null,
377
+ tokenizerRevision: setup.baseModel.tokenizerRevision,
378
+ chatTemplateHash: setup.baseModel.chatTemplateHash
379
+ },
380
+ recipe: {
381
+ method: setup.recipe.method,
382
+ version: "openpond.trainingRecipe.v1",
383
+ configHash: contentHash(setup.recipe)
384
+ },
385
+ runtimeTarget: input.runtime,
386
+ computeTarget: input.compute,
387
+ engine: input.engine,
388
+ resolvedBundleHash: resolvedBundleManifest.contentHash,
389
+ secretLeaseRefs: input.secretLeaseRefs ?? [],
390
+ approval: input.approval,
391
+ createdAt: modelProject.updatedAt
392
+ });
393
+ const manifest = HarnessRunManifestSchema.parse({
394
+ ...manifestContent,
395
+ contentHash: contentHash(manifestContent)
396
+ });
397
+ return {
398
+ manifest,
399
+ resolvedBundleManifest,
400
+ assets,
401
+ profileRelease,
402
+ harnessRelease: releasedHarness,
403
+ tasksetRelease: releasedTaskset,
404
+ datasetRelease,
405
+ evidenceSetRelease
406
+ };
407
+ }
408
+ function addTasksetAssets(input) {
409
+ const expected = /* @__PURE__ */ new Set();
410
+ for (const task of input.tasks) {
411
+ for (const asset of task.assets ?? []) {
412
+ if (expected.has(asset.artifactRef)) {
413
+ throw new Error(
414
+ `Training asset path ${asset.artifactRef} is shared by multiple tasks.`
415
+ );
416
+ }
417
+ expected.add(asset.artifactRef);
418
+ const value = input.tasksetAssetBytes.get(asset.artifactRef);
419
+ if (!value) {
420
+ throw new Error(
421
+ `Resolved Training Bundle is missing Work asset ${asset.artifactRef}.`
422
+ );
423
+ }
424
+ if (value.byteLength !== asset.sizeBytes || sha256(value) !== asset.sha256) {
425
+ throw new Error(
426
+ `Resolved Training Bundle Work asset ${asset.artifactRef} failed immutable verification.`
427
+ );
428
+ }
429
+ input.assets.set(asset.artifactRef, value);
430
+ }
431
+ }
432
+ for (const assetPath of input.tasksetAssetBytes.keys()) {
433
+ if (!expected.has(assetPath)) {
434
+ throw new Error(
435
+ `Resolved Training Bundle received unexpected Work asset ${assetPath}.`
436
+ );
437
+ }
438
+ }
439
+ }
440
+ function addJsonAsset(assets, assetPath, value) {
441
+ assets.set(assetPath, bytes(value));
442
+ }
443
+ function bytes(value) {
444
+ return Buffer.from(canonicalJson(value), "utf8");
445
+ }
446
+ export {
447
+ ComputeTargetBindingSchema,
448
+ HarnessRunManifestContentSchema,
449
+ HarnessRunManifestSchema,
450
+ HarnessRuntimeTargetBindingSchema,
451
+ OpaqueSecretLeaseRefSchema,
452
+ ResolvedTrainingBundleContentSchema,
453
+ ResolvedTrainingBundleManifestSchema,
454
+ ScopedSecretDeclarationSchema,
455
+ TrainingEngineBindingSchema,
456
+ buildTasksetTrainingBundle,
457
+ materializeLearningBatchTaskset
458
+ };
459
+ //# sourceMappingURL=training-bundle.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/training-bundle.ts", "../src/training-bundle-contracts.ts", "../src/training-learning-batch.ts"],
4
+ "sourcesContent": ["import { canonicalJson, contentHash, sha256, ImmutableReleaseRefSchema, HarnessSourceSelectionSchema, validateHarnessSourcePackage, type HarnessSourcePackage, type ImmutableReleaseRef, type VersionedReleaseRef } from \"@openpond/harness\";\nimport { compileBoundGraders } from \"@openpond/evals/rewards\";\nimport { verifyLearningTextAsset, type LearningTextAsset } from \"@openpond/evals/learning\";\nimport { HarnessRunManifestContentSchema, HarnessRunManifestSchema, ResolvedTrainingBundleContentSchema, ResolvedTrainingBundleManifestSchema, type ComputeTargetBinding, type HarnessRunManifest, type HarnessRuntimeTargetBinding, type OpaqueSecretLeaseRef, type ResolvedTrainingBundleManifest, type TrainingEngineBinding } from \"./training-bundle-contracts.js\";\nimport type { ModelProject } from \"./model-projects.js\";\nimport type { Taskset } from \"./taskset-authored-contracts.js\";\nimport { computeTasksetHash } from \"./taskset-authored-validation.js\";\nimport { resolvePortableTasksetRewardExecution, type TasksetRewardExecution } from \"./taskset-authored-portable-release.js\";\nimport { TRAINING_EVALUATION_SOURCE_PATH, TrainingEvaluationSourceSchema, assertTrainingEvaluationIsolation, type TrainingEvaluationSource } from \"./training-evaluation-source.js\";\n\nexport * from \"./training-bundle-contracts.js\";\nexport { materializeLearningBatchTaskset } from \"./training-learning-batch.js\";\n\nexport type TasksetTrainingBundle = {\n manifest: HarnessRunManifest;\n resolvedBundleManifest: ResolvedTrainingBundleManifest;\n assets: ReadonlyMap<string, Uint8Array>;\n profileRelease: VersionedReleaseRef;\n harnessRelease: ImmutableReleaseRef;\n tasksetRelease: ImmutableReleaseRef;\n datasetRelease: ImmutableReleaseRef;\n evidenceSetRelease: ImmutableReleaseRef | null;\n};\n\n/**\n * Produces the one artifact the training worker consumes. The release refs in\n * the manifest are immutable lineage identifiers, not separately materialized\n * release objects.\n */\nexport function buildTasksetTrainingBundle(input: {\n taskset: Taskset;\n modelProject: ModelProject;\n modelRunId: string;\n runtime: HarnessRuntimeTargetBinding;\n compute: ComputeTargetBinding;\n engine: TrainingEngineBinding;\n approval: {\n approvalHash: string;\n approvedAt: string;\n maximumSpendUsd: number | null;\n };\n secretLeaseRefs?: OpaqueSecretLeaseRef[];\n openpondRelease: string;\n workerProtocol: string;\n harnessRelease: ImmutableReleaseRef;\n tasksetRelease: ImmutableReleaseRef;\n harnessSource?: HarnessSourcePackage | null;\n tasksetAssetBytes?: ReadonlyMap<string, Uint8Array>;\n rewardExecution?: TasksetRewardExecution;\n verifierAssets?: LearningTextAsset[];\n evaluationSource?: TrainingEvaluationSource;\n}): TasksetTrainingBundle {\n const { taskset, modelProject, harnessRelease, tasksetRelease } = input;\n const setup = modelProject.trainingSetup;\n const releasedHarness = ImmutableReleaseRefSchema.parse(harnessRelease);\n const releasedTaskset = ImmutableReleaseRefSchema.parse(tasksetRelease);\n // These remain part of the preparation API for adapter compatibility; the\n // selected Harness release is now supplied explicitly and is never rebuilt\n // from mutable Profile/Taskset state here.\n void input.openpondRelease;\n void input.workerProtocol;\n const actualTasksetHash = computeTasksetHash(taskset);\n if (actualTasksetHash !== taskset.contentHash) {\n throw new Error(\n \"Taskset authoring state changed after its release was selected.\",\n );\n }\n if (\n !setup.baseModel?.revision ||\n !setup.baseModel.tokenizerRevision ||\n !setup.baseModel.chatTemplateHash ||\n !setup.recipe ||\n !setup.tasksetRef ||\n setup.tasksetRef.id !== taskset.id ||\n setup.tasksetRef.contentHash !== taskset.contentHash\n ) {\n throw new Error(\n \"Model Run must bind an exact Taskset, Model revision, tokenizer, chat template, and Recipe.\",\n );\n }\n\n const profileRelease = taskset.profileRelease ?? {\n id: `profile_${taskset.profileId}`,\n revision: taskset.revision,\n contentHash: contentHash({\n profileId: taskset.profileId,\n sourceCommit: taskset.authoringProvenance.sourceCommit,\n skillHash: taskset.authoringProvenance.skillHash,\n }),\n };\n const assets = new Map<string, Uint8Array>();\n if (input.evaluationSource) {\n const evaluation = TrainingEvaluationSourceSchema.parse(input.evaluationSource);\n if (contentHash(evaluation.taskset) !== contentHash(setup.evaluationTasksetRef)) {\n throw new Error(\"The evaluation source differs from the prepared Model configuration.\");\n }\n assertTrainingEvaluationIsolation(taskset.tasks.filter(task => task.split === \"train\"), evaluation.tasks);\n assets.set(TRAINING_EVALUATION_SOURCE_PATH, new TextEncoder().encode(canonicalJson(evaluation)));\n } else if (setup.evaluationTasksetRef) {\n throw new Error(\"The prepared Model requires its pinned evaluation source bytes.\");\n }\n const harnessSource = input.harnessSource\n ? validateHarnessSourcePackage(input.harnessSource, releasedHarness)\n : null;\n if (setup.harnessRelease && !harnessSource) {\n throw new Error(\"A selected Harness requires its complete immutable source package.\");\n }\n if (harnessSource && (!setup.harnessRelease\n || setup.harnessRelease.id !== releasedHarness.id\n || setup.harnessRelease.contentHash !== releasedHarness.contentHash)) {\n throw new Error(\"Harness source differs from the Model's explicit selection.\");\n }\n if (harnessSource) {\n const leavesLocalHost = input.runtime.placement !== \"local\" || input.compute.kind !== \"local\";\n if (leavesLocalHost && (!harnessSource.agentSnapshot.portability.portable\n || harnessSource.harnessRelease.files.some(file => file.visibility === \"host_private\"))) {\n throw new Error(\"The selected Harness contains source that cannot leave its local host.\");\n }\n addJsonAsset(assets, \"harness/source-package.json\", harnessSource);\n }\n addJsonAsset(assets, \"harness/execution.json\", HarnessSourceSelectionSchema.parse({\n schemaVersion: \"openpond.harnessSourceSelection.v1\",\n mode: harnessSource ? \"selected_release\" : \"taskset_owned\",\n harnessRelease: releasedHarness,\n sourcePackageHash: harnessSource?.contentHash ?? null,\n }));\n const rewardExecution = resolvePortableTasksetRewardExecution(taskset, input.rewardExecution);\n if (rewardExecution) {\n const verifierAssets = input.verifierAssets ?? [];\n const references = compileBoundGraders(rewardExecution.binding, rewardExecution.rewards)\n .flatMap(grader => grader.kind === \"custom_verifier\" ? [grader.verifierRef] : []);\n const expected = new Set(references.map(reference => reference.id));\n if (new Set(verifierAssets.map(asset => asset.id)).size !== verifierAssets.length\n || verifierAssets.some(asset => !expected.has(asset.id))) throw new Error(\"Unexpected or duplicate private verifier asset.\");\n for (const reference of references) {\n const asset = verifierAssets.find(asset => asset.id === reference.id);\n if (!asset || reference.visibility !== \"verifier\") throw new Error(\"Training bundle requires its private verifier asset.\");\n verifyLearningTextAsset(asset, reference);\n }\n addJsonAsset(assets, \"reward-binding.json\", { kind: \"reward_binding_v1\", binding: rewardExecution.binding, rewards: rewardExecution.rewards, assets: verifierAssets });\n } else if (input.verifierAssets?.length) {\n throw new Error(\"Private verifier assets require a published Reward binding.\");\n }\n addJsonAsset(assets, \"environment.json\", {\n schemaVersion: \"openpond.harnessEnvironment.v1\",\n environment: taskset.environment,\n capabilities: taskset.capabilities,\n policy: taskset.policy,\n outputContract:\n (taskset.metadata.tasksetOutputContract as { mode?: unknown } | undefined)\n ?.mode === \"text\"\n ? null\n : taskset.metadata.tasksetOutputContract ?? null,\n });\n addJsonAsset(assets, \"graders.json\", {\n schemaVersion: \"openpond.harnessGraders.v1\",\n graders: taskset.graders,\n fixtures: taskset.graderFixtures,\n });\n addJsonAsset(assets, \"tool-contract.json\", {\n schemaVersion: \"openpond.harnessToolContract.v1\",\n toolNames: taskset.environment.toolNames,\n actionBindings: taskset.environment.actionBindings ?? [],\n capabilities: taskset.capabilities,\n connectedAppScopes: taskset.policy.connectedAppScopes,\n });\n const trainTasks = taskset.tasks.filter((task) => task.split === \"train\");\n if (trainTasks.length > 0) {\n addJsonAsset(assets, \"dataset/train.json\", {\n schemaVersion: \"openpond.datasetSplit.v1\",\n split: \"train\",\n tasks: trainTasks,\n });\n addTasksetAssets({\n assets,\n tasks: trainTasks,\n tasksetAssetBytes: input.tasksetAssetBytes ?? new Map(),\n });\n } else if (taskset.datasetArtifact) {\n addJsonAsset(assets, \"dataset/artifact.json\", taskset.datasetArtifact);\n } else {\n throw new Error(\"Taskset has no training dataset.\");\n }\n\n const approvedSignals = Object.values(taskset.learningSignals)\n .flat()\n .filter((signal) => signal.approved);\n for (const signal of approvedSignals) {\n const value = bytes(signal);\n assets.set(`evidence/signals/${sha256(value)}.json`, value);\n }\n\n const datasetRelease = {\n id: `dataset_${taskset.id}_r${taskset.revision}`,\n contentHash: contentHash({\n taskset: releasedTaskset,\n sourceRefs: taskset.sourceRefs,\n datasetArtifact: taskset.datasetArtifact ?? null,\n trainTasks,\n }),\n };\n const evidenceSetRelease =\n approvedSignals.length > 0\n ? {\n id: `evidence_${taskset.id}_r${taskset.revision}`,\n contentHash: contentHash({\n taskset: releasedTaskset,\n harnessRelease: releasedHarness,\n datasetRelease,\n profileRelease,\n signals: approvedSignals,\n }),\n }\n : null;\n\n const bundleContent = ResolvedTrainingBundleContentSchema.parse({\n schemaVersion: \"openpond.resolvedTrainingBundle.v1\",\n projection: \"trainer\",\n harnessRelease: releasedHarness,\n datasetRelease,\n evidenceSetRelease,\n files: [...assets.entries()]\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([assetPath, value]) => ({\n path: assetPath,\n sha256: sha256(value),\n sizeBytes: value.byteLength,\n })),\n });\n const resolvedBundleManifest = ResolvedTrainingBundleManifestSchema.parse({\n ...bundleContent,\n contentHash: contentHash(bundleContent),\n });\n const manifestContent = HarnessRunManifestContentSchema.parse({\n schemaVersion: \"openpond.harnessRunManifest.v1\",\n id: `manifest_${input.modelRunId}_${input.approval.approvalHash.slice(0, 16)}`,\n harnessRelease,\n datasetRelease,\n evidenceSets: evidenceSetRelease ? [evidenceSetRelease] : [],\n model: {\n source: setup.baseModel.modelId,\n revision: setup.baseModel.revision,\n artifactHash: null,\n tokenizerRevision: setup.baseModel.tokenizerRevision,\n chatTemplateHash: setup.baseModel.chatTemplateHash,\n },\n recipe: {\n method: setup.recipe.method,\n version: \"openpond.trainingRecipe.v1\",\n configHash: contentHash(setup.recipe),\n },\n runtimeTarget: input.runtime,\n computeTarget: input.compute,\n engine: input.engine,\n resolvedBundleHash: resolvedBundleManifest.contentHash,\n secretLeaseRefs: input.secretLeaseRefs ?? [],\n approval: input.approval,\n createdAt: modelProject.updatedAt,\n });\n const manifest = HarnessRunManifestSchema.parse({\n ...manifestContent,\n contentHash: contentHash(manifestContent),\n });\n return {\n manifest,\n resolvedBundleManifest,\n assets,\n profileRelease,\n harnessRelease: releasedHarness,\n tasksetRelease: releasedTaskset,\n datasetRelease,\n evidenceSetRelease,\n };\n}\n\nfunction addTasksetAssets(input: {\n assets: Map<string, Uint8Array>;\n tasks: Taskset[\"tasks\"];\n tasksetAssetBytes: ReadonlyMap<string, Uint8Array>;\n}): void {\n const expected = new Set<string>();\n for (const task of input.tasks) {\n for (const asset of task.assets ?? []) {\n if (expected.has(asset.artifactRef)) {\n throw new Error(\n `Training asset path ${asset.artifactRef} is shared by multiple tasks.`,\n );\n }\n expected.add(asset.artifactRef);\n const value = input.tasksetAssetBytes.get(asset.artifactRef);\n if (!value) {\n throw new Error(\n `Resolved Training Bundle is missing Work asset ${asset.artifactRef}.`,\n );\n }\n if (value.byteLength !== asset.sizeBytes || sha256(value) !== asset.sha256) {\n throw new Error(\n `Resolved Training Bundle Work asset ${asset.artifactRef} failed immutable verification.`,\n );\n }\n input.assets.set(asset.artifactRef, value);\n }\n }\n for (const assetPath of input.tasksetAssetBytes.keys()) {\n if (!expected.has(assetPath)) {\n throw new Error(\n `Resolved Training Bundle received unexpected Work asset ${assetPath}.`,\n );\n }\n }\n}\n\nfunction addJsonAsset(\n assets: Map<string, Uint8Array>,\n assetPath: string,\n value: unknown,\n): void {\n assets.set(assetPath, bytes(value));\n}\n\nfunction bytes(value: unknown): Uint8Array {\n return Buffer.from(canonicalJson(value), \"utf8\");\n}\n", "import { z } from \"zod\";\nimport { ImmutableReleaseRefSchema, ReleaseHashSchema, ReleaseIdSchema, ReleaseTimestampSchema } from \"@openpond/harness\";\n\nexport const ScopedSecretDeclarationSchema = z\n .object({\n id: ReleaseIdSchema,\n purpose: z.string().trim().min(1).max(500),\n audience: z.enum([\n \"orchestrator\",\n \"environment\",\n \"privileged_scorer\",\n \"trainer\",\n \"infrastructure\",\n ]),\n required: z.boolean(),\n ttlSeconds: z.number().int().positive().max(86_400),\n scopes: z.array(z.string().trim().min(1).max(500)).max(100).default([]),\n })\n .strict();\n\nexport const OpaqueSecretLeaseRefSchema = z\n .object({\n declarationId: ReleaseIdSchema,\n leaseRef: z.string().trim().min(8).max(1_000),\n audience: ScopedSecretDeclarationSchema.shape.audience,\n expiresAt: ReleaseTimestampSchema,\n })\n .strict();\n\nexport type ScopedSecretDeclaration = z.infer<\n typeof ScopedSecretDeclarationSchema\n>;\nexport type OpaqueSecretLeaseRef = z.infer<typeof OpaqueSecretLeaseRefSchema>;\n\nexport const HarnessRuntimeTargetBindingSchema = z\n .object({\n adapterId: ReleaseIdSchema,\n placement: z.enum([\"local\", \"remote\", \"colocated\", \"provider_native\"]),\n capabilityReceipt: ReleaseHashSchema,\n runtimeVersion: z.string().trim().min(1).max(200),\n dataPlane: z\n .object({\n provider: ReleaseIdSchema,\n dataPlaneId: ReleaseIdSchema,\n cellId: ReleaseIdSchema,\n runnerPoolId: ReleaseIdSchema,\n runtimeImageDigest: z.string().regex(/^sha256:[a-f0-9]{64}$/),\n capabilityReceipt: ReleaseHashSchema,\n })\n .strict()\n .nullable(),\n })\n .strict();\n\nexport const ComputeTargetBindingSchema = z\n .object({\n adapterId: ReleaseIdSchema,\n kind: z.enum([\"local\", \"ssh\", \"managed\", \"custom\"]),\n deviceOrPool: z.string().trim().min(1).max(1_000),\n capabilityReceipt: ReleaseHashSchema,\n provider: ReleaseIdSchema.nullable(),\n })\n .strict();\n\nexport const TrainingEngineBindingSchema = z\n .object({\n adapterId: ReleaseIdSchema,\n workerVersion: z.string().trim().min(1).max(200),\n workerImageDigest: z\n .string()\n .regex(/^sha256:[a-f0-9]{64}$/)\n .nullable(),\n upstreamRevision: z.string().trim().min(1).max(500),\n capabilityReceipt: ReleaseHashSchema,\n })\n .strict();\n\nexport const HarnessRunManifestContentSchema = z\n .object({\n schemaVersion: z.literal(\"openpond.harnessRunManifest.v1\"),\n id: ReleaseIdSchema,\n harnessRelease: ImmutableReleaseRefSchema,\n datasetRelease: ImmutableReleaseRefSchema,\n evidenceSets: z.array(ImmutableReleaseRefSchema).max(10_000),\n model: z\n .object({\n source: z.string().trim().min(1).max(200),\n revision: z.string().trim().min(1).max(500),\n artifactHash: ReleaseHashSchema.nullable(),\n tokenizerRevision: z.string().trim().min(1).max(500),\n chatTemplateHash: ReleaseHashSchema,\n })\n .strict(),\n recipe: z\n .object({\n method: z.string().trim().min(1).max(100),\n version: z.string().trim().min(1).max(200),\n configHash: ReleaseHashSchema,\n })\n .strict(),\n runtimeTarget: HarnessRuntimeTargetBindingSchema,\n computeTarget: ComputeTargetBindingSchema,\n engine: TrainingEngineBindingSchema,\n resolvedBundleHash: ReleaseHashSchema,\n secretLeaseRefs: z.array(OpaqueSecretLeaseRefSchema).max(1_000),\n approval: z\n .object({\n approvalHash: ReleaseHashSchema,\n approvedAt: ReleaseTimestampSchema,\n maximumSpendUsd: z.number().nonnegative().nullable(),\n })\n .strict(),\n createdAt: ReleaseTimestampSchema,\n })\n .strict();\n\nexport const HarnessRunManifestSchema = HarnessRunManifestContentSchema.extend({\n contentHash: ReleaseHashSchema,\n}).strict();\n\nexport const ResolvedTrainingBundleContentSchema = z\n .object({\n schemaVersion: z.literal(\"openpond.resolvedTrainingBundle.v1\"),\n projection: z.literal(\"trainer\"),\n harnessRelease: ImmutableReleaseRefSchema,\n datasetRelease: ImmutableReleaseRefSchema,\n evidenceSetRelease: ImmutableReleaseRefSchema.nullable(),\n files: z\n .array(\n z\n .object({\n path: z.string().trim().min(1).max(2_000),\n sha256: ReleaseHashSchema,\n sizeBytes: z.number().int().nonnegative(),\n })\n .strict(),\n )\n .max(100_000),\n })\n .strict();\n\nexport const ResolvedTrainingBundleManifestSchema =\n ResolvedTrainingBundleContentSchema.extend({\n contentHash: ReleaseHashSchema,\n }).strict();\n\nexport type HarnessRuntimeTargetBinding = z.infer<\n typeof HarnessRuntimeTargetBindingSchema\n>;\nexport type ComputeTargetBinding = z.infer<typeof ComputeTargetBindingSchema>;\nexport type TrainingEngineBinding = z.infer<\n typeof TrainingEngineBindingSchema\n>;\nexport type HarnessRunManifest = z.infer<typeof HarnessRunManifestSchema>;\nexport type ResolvedTrainingBundleManifest = z.infer<\n typeof ResolvedTrainingBundleManifestSchema\n>;\n", "import { TasksetSchema, type GeneratedTaskFile } from \"./taskset-authored-contracts.js\";\nimport type { GraderFixture, LearningSignalInventory, TasksetSourceRef } from \"./taskset-draft-core.js\";\nimport { compileTaskBatch, learningRef, taskBatchPackageMetadata, verifyLearningTextAsset, type LearningTextAsset, type RewardBinding, type RewardComposition, type RewardRelease, type TaskAdmissionDecision, type TaskBatch, type TaskDefinition, type TaskEvidence } from \"@openpond/evals\";\nimport { computeTasksetHash } from \"./taskset-authored-validation.js\";\nimport { contentHash } from \"@openpond/harness\";\nimport { learningVerifierModule, projectLearningBatchGraders } from \"./taskset-package-grader-projection.js\";\n\n/** Projects a sealed batch into training inputs. The public batch compiler\n * rechecks every evidence/decision snapshot before adaptation. */\nexport function materializeLearningBatchTaskset(input: {\n batch: TaskBatch; definition: TaskDefinition; binding: RewardBinding; rewards: RewardRelease[];\n evidence: TaskEvidence[]; decisions: TaskAdmissionDecision[]; profileId: string;\n source: TasksetSourceRef;\n assets?: LearningTextAsset[];\n}) {\n const release = compileTaskBatch(input);\n const metadata = taskBatchPackageMetadata(release);\n if (release.environment.kind !== \"text\" || release.tools.length || release.tasks.some((task) => task.artifactRefs.length)) throw new Error(\"This learning batch requires an environment or asset adapter before training preparation.\");\n const sourceId = input.source.id;\n const signals: LearningSignalInventory = { demonstrations: [], preferences: [], corrections: [], feedback: [], rewards: [], labels: [] };\n const fixtures: GraderFixture[] = [];\n for (const admission of metadata.admissions) {\n const evidence = input.evidence.find((item) => item.id === admission.evidence.id)!;\n const decision = input.decisions.find((item) => item.id === admission.decision.id)!;\n if (input.batch.purpose === \"reward_training\" && decision.grade?.training.status === \"scored\") signals.rewards.push({\n id: `reward-${admission.taskId}`, taskId: admission.taskId, kind: \"reward\", task: input.definition.instructions,\n rules: [{ id: input.binding.id, points: 1, condition: \"Execute the released Reward binding with its declared normalization, weights and gates.\" }],\n otherwisePoints: 0, executable: true, approved: true, confidence: 1, sourceRefs: [sourceId], artifactRef: input.binding.id,\n metadata: { rewardBinding: learningRef(input.binding), evidence: admission.evidence, decision: admission.decision },\n });\n if (admission.supervisedTarget !== null) signals.demonstrations.push({ kind: \"demonstration\", id: `demo-${admission.taskId}`, taskId: admission.taskId, sourceRefs: [sourceId], artifactRef: admission.decision.id, approved: true, confidence: 1, prompt: null, response: JSON.stringify(admission.supervisedTarget), metadata: { evidence: admission.evidence, decision: admission.decision, targetGradeHash: decision.targetGrade?.contentHash } });\n for (const [kind, output, grade] of [[\"observed\", evidence.submission.observedOutput, decision.grade], [\"target\", decision.approvedTarget, decision.targetGrade]] as const) {\n const outcome = fixtureOutcome(grade);\n if (output === null || outcome === null) continue;\n fixtures.push({ id: `fixture-${kind}-${admission.taskId}`, taskId: admission.taskId, label: outcome.passed ? \"positive\" : \"negative\", output, infrastructureError: null, expectedPassed: outcome.passed, expectedRewardEligible: outcome.rewardEligible, metadata: { gradeReceiptHash: grade!.contentHash, evidence: admission.evidence, decision: admission.decision } });\n }\n }\n if (!fixtures.length) throw new Error(\"Grade at least one reviewed response before preparing this batch. Grader fixtures must come from actual receipts.\");\n const graders = projectLearningBatchGraders(input.binding, input.rewards, input.assets);\n const generatedFiles: GeneratedTaskFile[] = [];\n for (const grader of release.graders) {\n if (grader.kind !== \"custom_verifier\") continue;\n const asset = input.assets?.find((asset) => asset.id === grader.verifierRef.id);\n if (!asset) throw new Error(`Reward ${grader.id} is missing its immutable verifier source.`);\n const module = learningVerifierModule(grader.verifierRef.contentHash);\n if (!generatedFiles.some((file) => file.path === module)) generatedFiles.push({ path: module, role: \"verifier\", content: verifyLearningTextAsset(asset, grader.verifierRef) });\n }\n const taskset = TasksetSchema.parse({\n schemaVersion: \"openpond.taskset.v1\", id: `learning-${contentHash([input.profileId, input.batch.contentHash]).slice(0, 40)}`, revision: 1,\n profileId: input.profileId, profileRelease: null, createImproveRunId: null, name: `${input.definition.name} \u00B7 ${input.batch.examples.length} approved examples`, objective: input.definition.instructions,\n purpose: \"general\", benchmark: null, status: \"needs_review\", sourceRefs: [input.source], datasetArtifact: null,\n policy: release.policy,\n environment: { protocolVersion: \"openpond.taskEnvironment.v1\", kind: \"chat\", entrypoint: \"openpond.text.v1\", stateful: false, deterministicSeeds: release.environment.deterministicSeeds, toolNames: [], lifecycle: [\"create\", \"reset\", \"step\", \"grade\", \"cleanup\"], defaultTimeoutMs: release.environment.defaultTimeoutMs, networkPolicy: release.environment.networkPolicy, metadata: { portableEnvironment: release.environment } },\n capabilities: { schemaVersion: \"openpond.tasksetCapabilities.v1\", taskKind: \"chat\", supportedSignals: signals.demonstrations.length ? [\"demonstration\", \"reward\"] : [\"reward\"], compatibleMethods: input.batch.purpose === \"supervised_training\" ? [\"sft\"] : input.batch.purpose === \"reward_training\" ? [\"grpo\", \"ppo\"] : [\"none\"], rewardKinds: [\"deterministic\"], requiresTools: false, requiresState: false, requiresPrivilegedGrading: true, environmentPlacements: [\"local\", \"remote\"], exportable: true, portabilityBlockers: [] },\n tasks: release.tasks.map(({ artifactRefs: _assets, ...task }) => ({ ...task, schemaVersion: \"openpond.taskData.v1\", sourceRefs: [sourceId], metadata: { admission: metadata.admissions.find((entry) => entry.taskId === task.id), exampleOrigin: input.evidence.find((evidence) => evidence.id === task.id)?.correctionFeedbackId ? \"corrected\" : \"extracted\" } })),\n graders, graderFixtures: fixtures, learningSignals: signals,\n authoringProvenance: { schemaVersion: \"openpond.taskAuthoringProvenance.v1\", model: null, modelConfig: {}, skillHash: contentHash(\"openpond-learning-batch-v1\"), promptTemplateVersion: \"learning-batch-v1\", buildIntent: input.batch.purpose === \"supervised_training\" ? \"demonstrations\" : \"verifiable_reward\", buildSpecification: null, evidenceHashes: input.batch.examples.map((entry) => entry.evidence.contentHash), tasksetSdkVersion: \"learning-batch-v1\", sourceCommit: null, repairHistory: [], createdAt: input.batch.sealedAt },\n readiness: null, contentHash: \"00000000\", createdAt: input.batch.sealedAt, updatedAt: input.batch.sealedAt,\n metadata: { learning: metadata, learningRelease: learningRef(release), trainingMethod: input.batch.purpose === \"supervised_training\" ? \"sft\" : input.batch.purpose === \"reward_training\" ? \"grpo\" : \"none\", tasksetOutputContract: { mode: \"structured_json\", jsonSchema: input.definition.outputSchema, renderer: null } },\n });\n return { taskset: TasksetSchema.parse({ ...taskset, contentHash: computeTasksetHash(taskset) }), release, generatedFiles };\n}\n\nfunction fixtureOutcome(grade: RewardComposition | null) {\n if (!grade) return null;\n const outcome = grade.training.status === \"not_configured\" ? grade.evaluation : grade.training;\n if (outcome.status !== \"scored\") return null;\n return { passed: outcome.passed === true, rewardEligible: grade.training.status === \"scored\" };\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["verifyLearningTextAsset", "asset", "asset", "verifyLearningTextAsset"]
7
+ }
@@ -6,13 +6,13 @@ export declare const TasksetStatusSchema: z.ZodEnum<{
6
6
  archived: "archived";
7
7
  ready: "ready";
8
8
  draft: "draft";
9
+ blocked: "blocked";
9
10
  awaiting_disclosure_approval: "awaiting_disclosure_approval";
10
11
  awaiting_materialization_approval: "awaiting_materialization_approval";
11
12
  materializing: "materializing";
12
13
  validating: "validating";
13
14
  needs_review: "needs_review";
14
15
  baselining: "baselining";
15
- blocked: "blocked";
16
16
  }>;
17
17
  export declare const DatasetBuildIntentSchema: z.ZodEnum<{
18
18
  rubric: "rubric";
@@ -352,13 +352,13 @@ export declare const TasksetSchema: z.ZodObject<{
352
352
  archived: "archived";
353
353
  ready: "ready";
354
354
  draft: "draft";
355
+ blocked: "blocked";
355
356
  awaiting_disclosure_approval: "awaiting_disclosure_approval";
356
357
  awaiting_materialization_approval: "awaiting_materialization_approval";
357
358
  materializing: "materializing";
358
359
  validating: "validating";
359
360
  needs_review: "needs_review";
360
361
  baselining: "baselining";
361
- blocked: "blocked";
362
362
  }>;
363
363
  sourceRefs: z.ZodArray<z.ZodUnion<readonly [z.ZodObject<{
364
364
  schemaVersion: z.ZodLiteral<"openpond.trainingSource.v1">;
@@ -47,7 +47,7 @@ export declare function prepareAuthoredTasksetSource(tasksetInput: Taskset, sour
47
47
  publishedAt: string;
48
48
  metadata: Record<string, unknown>;
49
49
  } | null;
50
- status: "failed" | "archived" | "ready" | "draft" | "awaiting_disclosure_approval" | "awaiting_materialization_approval" | "materializing" | "validating" | "needs_review" | "baselining" | "blocked";
50
+ status: "failed" | "archived" | "ready" | "draft" | "blocked" | "awaiting_disclosure_approval" | "awaiting_materialization_approval" | "materializing" | "validating" | "needs_review" | "baselining";
51
51
  sourceRefs: ({
52
52
  id: string;
53
53
  profileId: string;
@@ -188,13 +188,13 @@ export declare const DatasetCatalogItemSchema: z.ZodObject<{
188
188
  archived: "archived";
189
189
  ready: "ready";
190
190
  draft: "draft";
191
+ blocked: "blocked";
191
192
  awaiting_disclosure_approval: "awaiting_disclosure_approval";
192
193
  awaiting_materialization_approval: "awaiting_materialization_approval";
193
194
  materializing: "materializing";
194
195
  validating: "validating";
195
196
  needs_review: "needs_review";
196
197
  baselining: "baselining";
197
- blocked: "blocked";
198
198
  }>;
199
199
  storageKind: z.ZodEnum<{
200
200
  inline: "inline";
@@ -227,13 +227,13 @@ export declare const DatasetCatalogResponseSchema: z.ZodObject<{
227
227
  archived: "archived";
228
228
  ready: "ready";
229
229
  draft: "draft";
230
+ blocked: "blocked";
230
231
  awaiting_disclosure_approval: "awaiting_disclosure_approval";
231
232
  awaiting_materialization_approval: "awaiting_materialization_approval";
232
233
  materializing: "materializing";
233
234
  validating: "validating";
234
235
  needs_review: "needs_review";
235
236
  baselining: "baselining";
236
- blocked: "blocked";
237
237
  }>;
238
238
  storageKind: z.ZodEnum<{
239
239
  inline: "inline";
@@ -992,7 +992,7 @@ export declare function prepareImportedTasksetPackage(input: {
992
992
  publishedAt: string;
993
993
  metadata: Record<string, unknown>;
994
994
  } | null;
995
- status: "failed" | "archived" | "ready" | "draft" | "awaiting_disclosure_approval" | "awaiting_materialization_approval" | "materializing" | "validating" | "needs_review" | "baselining" | "blocked";
995
+ status: "failed" | "archived" | "ready" | "draft" | "blocked" | "awaiting_disclosure_approval" | "awaiting_materialization_approval" | "materializing" | "validating" | "needs_review" | "baselining";
996
996
  sourceRefs: ({
997
997
  id: string;
998
998
  profileId: string;