openpond-sdk 0.5.5 → 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 (45) hide show
  1. package/TRAINING_PROTOCOL.md +44 -0
  2. package/dist/chunk-ARUJ3FJT.js +447 -0
  3. package/dist/chunk-ARUJ3FJT.js.map +7 -0
  4. package/dist/{chunk-M6MM6IGG.js → chunk-F5JBFRAH.js} +300 -220
  5. package/dist/chunk-F5JBFRAH.js.map +7 -0
  6. package/dist/chunk-QFT2MCIC.js +1526 -0
  7. package/dist/chunk-QFT2MCIC.js.map +7 -0
  8. package/dist/{chunk-NF63YMOL.js → chunk-QUOW6URQ.js} +7 -9
  9. package/dist/{chunk-NF63YMOL.js.map → chunk-QUOW6URQ.js.map} +3 -3
  10. package/dist/{chunk-25TBEGXB.js → chunk-TKJU3BOW.js} +2 -2
  11. package/dist/chunk-UJZ3XEE3.js +902 -0
  12. package/dist/chunk-UJZ3XEE3.js.map +7 -0
  13. package/dist/{chunk-EV4PKJWN.js → chunk-UKVK7MRJ.js} +320 -208
  14. package/dist/chunk-UKVK7MRJ.js.map +7 -0
  15. package/dist/index.js +3 -3
  16. package/dist/learning.js +3 -3
  17. package/dist/model-taskset-runs.js +2 -2
  18. package/dist/refiner.js +1 -1
  19. package/dist/taskset-drafts.js +36 -34
  20. package/dist/taskset-drafts.js.map +1 -1
  21. package/dist/taskset-packages.js +52 -466
  22. package/dist/taskset-packages.js.map +4 -4
  23. package/dist/training-bundle.js +459 -0
  24. package/dist/training-bundle.js.map +7 -0
  25. package/dist/training.js +9 -1
  26. package/dist/types/packages/sdk/src/taskset-authored-contracts.d.ts +2 -2
  27. package/dist/types/packages/sdk/src/taskset-authored-files.d.ts +1 -1
  28. package/dist/types/packages/sdk/src/taskset-draft-dataset-artifacts.d.ts +2 -2
  29. package/dist/types/packages/sdk/src/taskset-package-projection.d.ts +1 -1
  30. package/dist/types/packages/sdk/src/training-bundle-contracts.d.ts +287 -0
  31. package/dist/types/packages/sdk/src/training-bundle-contracts.d.ts.map +1 -0
  32. package/dist/types/packages/sdk/src/training-bundle.d.ts +48 -0
  33. package/dist/types/packages/sdk/src/training-bundle.d.ts.map +1 -0
  34. package/dist/types/packages/sdk/src/training-candidate-decisions.d.ts +90 -0
  35. package/dist/types/packages/sdk/src/training-candidate-decisions.d.ts.map +1 -0
  36. package/dist/types/packages/sdk/src/training-learning-batch.d.ts +719 -0
  37. package/dist/types/packages/sdk/src/training-learning-batch.d.ts.map +1 -0
  38. package/dist/types/packages/sdk/src/training.d.ts +8 -0
  39. package/dist/types/packages/sdk/src/training.d.ts.map +1 -1
  40. package/package.json +6 -2
  41. package/dist/chunk-EV4PKJWN.js.map +0 -7
  42. package/dist/chunk-M6MM6IGG.js.map +0 -7
  43. package/dist/chunk-PXB6YY36.js +0 -2395
  44. package/dist/chunk-PXB6YY36.js.map +0 -7
  45. /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
+ }
package/dist/training.js CHANGED
@@ -4,6 +4,8 @@ import {
4
4
  RewardModelTrainingRequestSchema,
5
5
  TRAINING_EVALUATION_SOURCE_PATH,
6
6
  TrainingApiErrorSchema,
7
+ TrainingCandidateDecisionRequestSchema,
8
+ TrainingCandidateDecisionSchema,
7
9
  TrainingCapabilitiesSchema,
8
10
  TrainingCapabilityRequirementSchema,
9
11
  TrainingEvaluationSourceSchema,
@@ -28,16 +30,18 @@ import {
28
30
  assertTrainingEvaluationIsolation,
29
31
  createTrainingClient,
30
32
  deterministicTrainingRewardSource,
33
+ parseAndVerifyTrainingCandidateDecision,
31
34
  parseAndVerifyTrainingEvaluationTaskPage,
32
35
  parseAndVerifyTrainingExecutionReceipt,
33
36
  parseAndVerifyTrainingInputArtifactUpload,
34
37
  parseAndVerifyTrainingJobSubmission,
38
+ trainingCandidateDecisionHash,
35
39
  trainingEvaluationSourceRef,
36
40
  trainingEvaluationTaskPageHash,
37
41
  trainingExecutionReceiptHash,
38
42
  trainingInputArtifactUploadHash,
39
43
  trainingJobSubmissionHash
40
- } from "./chunk-M6MM6IGG.js";
44
+ } from "./chunk-F5JBFRAH.js";
41
45
  import {
42
46
  OPENPOND_TRAINING_MEDIA_TYPE,
43
47
  OPENPOND_TRAINING_PROTOCOL_MAJOR,
@@ -63,6 +67,8 @@ export {
63
67
  TRAINING_INPUT_ARTIFACT_MAX_BYTES,
64
68
  TRAINING_JOB_SUBMISSION_MAX_BYTES,
65
69
  TrainingApiErrorSchema,
70
+ TrainingCandidateDecisionRequestSchema,
71
+ TrainingCandidateDecisionSchema,
66
72
  TrainingCapabilitiesSchema,
67
73
  TrainingCapabilityRequirementSchema,
68
74
  TrainingEvaluationSourceSchema,
@@ -91,11 +97,13 @@ export {
91
97
  canonicalSha256,
92
98
  createTrainingClient,
93
99
  deterministicTrainingRewardSource,
100
+ parseAndVerifyTrainingCandidateDecision,
94
101
  parseAndVerifyTrainingEvaluationTaskPage,
95
102
  parseAndVerifyTrainingExecutionReceipt,
96
103
  parseAndVerifyTrainingInputArtifactUpload,
97
104
  parseAndVerifyTrainingJobSubmission,
98
105
  parseBoundedJson,
106
+ trainingCandidateDecisionHash,
99
107
  trainingEvaluationSourceRef,
100
108
  trainingEvaluationTaskPageHash,
101
109
  trainingExecutionReceiptHash,
@@ -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;