openpond-sdk 0.1.14 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,9 +1,9 @@
1
1
  // src/model-starters.ts
2
- import { z as z3 } from "zod";
3
- import { TasksetReleaseSchema, assertTasksetRelease } from "@openpond/evals/tasksets";
4
- import { LearningTextAssetSchema, TaskDefinitionSchema, learningRef as learningRef2, sameLearningRef, sealLearningContent as sealLearningContent2 } from "@openpond/evals/learning";
5
- import { RewardBindingSchema, RewardReleaseSchema, compileBoundGraders } from "@openpond/evals/rewards";
6
- import { assertBoundedTaskJson as assertBoundedTaskJson3, validateTaskValue } from "@openpond/evals/task-schema";
2
+ import { z as z5 } from "zod";
3
+ import { TasksetReleaseSchema as TasksetReleaseSchema2, assertTasksetRelease as assertTasksetRelease2 } from "@openpond/evals/tasksets";
4
+ import { LearningTextAssetSchema as LearningTextAssetSchema2, TaskDefinitionSchema as TaskDefinitionSchema2, learningRef as learningRef3, sameLearningRef as sameLearningRef2, sealLearningContent as sealLearningContent4 } from "@openpond/evals/learning";
5
+ import { RewardBindingSchema as RewardBindingSchema2, RewardReleaseSchema as RewardReleaseSchema2, compileBoundGraders as compileBoundGraders2 } from "@openpond/evals/rewards";
6
+ import { assertBoundedTaskJson as assertBoundedTaskJson3, validateTaskValue as validateTaskValue2 } from "@openpond/evals/task-schema";
7
7
 
8
8
  // src/model-projects.ts
9
9
  import { z } from "zod";
@@ -357,29 +357,186 @@ function validateModelStarterExecution(execution, taskset, assets) {
357
357
  }
358
358
  }
359
359
 
360
+ // src/model-taskset-derivation.ts
361
+ import { z as z4 } from "zod";
362
+ import { createEnvironmentRelease, createVerifierSetRelease, verifyEnvironmentRelease as verifyEnvironmentRelease2, verifyVerifierSetRelease as verifyVerifierSetRelease2 } from "@openpond/evals";
363
+ import { LearningTextAssetSchema, TaskDefinitionSchema, assertLearningContentHash, learningRef as learningRef2, sameLearningRef, sealLearningContent as sealLearningContent3, verifyLearningTextAsset as verifyLearningTextAsset3 } from "@openpond/evals/learning";
364
+ import { RewardBindingSchema, RewardReleaseSchema, compileBoundGraders } from "@openpond/evals/rewards";
365
+ import { TasksetReleaseSchema, assertTasksetRelease } from "@openpond/evals/tasksets";
366
+ import { validateTaskValue } from "@openpond/evals/task-schema";
367
+
368
+ // src/model-taskset-resources.ts
369
+ import { z as z3 } from "zod";
370
+ import { EnvironmentReleaseSchema as EnvironmentReleaseSchema2, VerifierSetReleaseSchema as VerifierSetReleaseSchema2, verifyEnvironmentRelease, verifyVerifierSetRelease } from "@openpond/evals";
371
+ import { createLearningTextAsset as createLearningTextAsset2, sealLearningContent as sealLearningContent2, verifyLearningTextAsset as verifyLearningTextAsset2 } from "@openpond/evals/learning";
372
+ var ModelTasksetExecutionResourcesSchema = z3.object({ environment: EnvironmentReleaseSchema2, verifierSet: VerifierSetReleaseSchema2 }).strict();
373
+ function modelTasksetExecutionResourcesAssetId(context) {
374
+ if (!context.environmentRelease || !context.verifierSetRelease) throw new Error("Taskset execution references are missing.");
375
+ return `taskset-execution-${sealLearningContent2({ environment: context.environmentRelease, verifiers: context.verifierSetRelease }).contentHash}`;
376
+ }
377
+ function createModelTasksetExecutionResourcesAsset(value) {
378
+ const resources = ModelTasksetExecutionResourcesSchema.parse({ environment: value.environment, verifierSet: value.verifierSet });
379
+ assertIntegrity(resources);
380
+ const id = modelTasksetExecutionResourcesAssetId({ environmentRelease: { id: resources.environment.id, contentHash: resources.environment.contentHash }, verifierSetRelease: { id: resources.verifierSet.id, contentHash: resources.verifierSet.contentHash } });
381
+ const { contentHash: _hash, ...asset } = createLearningTextAsset2({ text: canonicalJson(resources), path: "environment/resources.json", mediaType: "application/json", visibility: "host_private" });
382
+ return sealLearningContent2({ ...asset, id, asset: { ...asset.asset, id } });
383
+ }
384
+ function resolveModelTasksetExecutionResourcesAsset(context, asset) {
385
+ if (asset.id !== modelTasksetExecutionResourcesAssetId(context) || asset.asset.visibility !== "host_private" || asset.asset.mediaType !== "application/json") throw new Error("Taskset execution asset differs from its published references.");
386
+ const resources = ModelTasksetExecutionResourcesSchema.parse(JSON.parse(verifyLearningTextAsset2(asset, asset.asset)));
387
+ assertIntegrity(resources);
388
+ if (asset.id !== createModelTasksetExecutionResourcesAsset(resources).id || canonicalJson(context.environment) !== canonicalJson(resources.environment.contract) || canonicalJson(context.graders) !== canonicalJson(resources.verifierSet.graders)) throw new Error("Taskset differs from its execution resources.");
389
+ return resources;
390
+ }
391
+ function assertIntegrity(resources) {
392
+ if (!verifyEnvironmentRelease(resources.environment) || !verifyVerifierSetRelease(resources.verifierSet)) throw new Error("Taskset execution resource integrity failed.");
393
+ }
394
+
395
+ // src/model-taskset-derivation.ts
396
+ var OwnerSchema = z4.object({ scopeId: z4.string().trim().min(1).max(500), modelId: z4.string().trim().min(1).max(500) }).strict();
397
+ var ModelTasksetDerivationSchema = z4.object({
398
+ schemaVersion: z4.literal("openpond.modelTasksetDerivation.v1"),
399
+ owner: OwnerSchema,
400
+ root: ModelProjectVersionedRefSchema,
401
+ parent: ModelProjectVersionedRefSchema
402
+ }).strict();
403
+ var ModelTasksetPackageSchema = z4.object({
404
+ taskset: TasksetReleaseSchema,
405
+ taskDefinition: TaskDefinitionSchema,
406
+ rewardBinding: RewardBindingSchema,
407
+ rewards: z4.array(RewardReleaseSchema).min(1).max(100),
408
+ assets: z4.array(LearningTextAssetSchema).max(1e3),
409
+ executionResources: ModelTasksetExecutionResourcesSchema.optional(),
410
+ execution: ModelStarterExecutionSchema.optional()
411
+ }).strict();
412
+ var same = (left, right) => sealLearningContent3({ value: left }).contentHash === sealLearningContent3({ value: right }).contentHash;
413
+ var identity = (owner, root) => `model-taskset-${sealLearningContent3({ owner, root }).contentHash}`;
414
+ function deriveModelTaskset(input) {
415
+ const owner = OwnerSchema.parse(input.owner);
416
+ const source = validateModelTasksetPackage(input.source);
417
+ const previous = source.taskset.metadata.modelTasksetDerivation === void 0 ? null : ModelTasksetDerivationSchema.parse(source.taskset.metadata.modelTasksetDerivation);
418
+ if (previous && source.taskset.id !== identity(previous.owner, previous.root)) throw new Error("Derived Taskset identity differs from its ownership lineage.");
419
+ const owned = previous && same(previous.owner, owner);
420
+ const root = owned ? previous.root : learningRef2(source.taskset);
421
+ const id = owned ? source.taskset.id : identity(owner, root);
422
+ const revision = owned ? source.taskset.revision + 1 : 1;
423
+ const rewardBinding = RewardBindingSchema.parse(input.rewardBinding);
424
+ const rewards = input.rewards.map((reward) => RewardReleaseSchema.parse(reward));
425
+ const graders = compileBoundGraders(rewardBinding, rewards);
426
+ if (rewardBinding.recipeRef) throw new Error("Resolve the Reward recipe into one standalone binding before deriving a Taskset.");
427
+ const policy = { ...source.taskset.policy, hiddenGraderRefs: graders.filter((grader) => grader.privileged).map((grader) => grader.id) };
428
+ const previousResources = source.executionResources ?? source.execution;
429
+ const environment = previousResources?.environment ?? createEnvironmentRelease({
430
+ schemaVersion: "openpond.environmentRelease.v1",
431
+ id: `${id}-environment`,
432
+ revision: 1,
433
+ contract: source.taskset.environment,
434
+ actionSchemaRef: null,
435
+ observationSchemaRef: null,
436
+ stateSchemaRef: null,
437
+ artifactCollection: { maxArtifacts: 1e5, maxTotalBytes: 25e7 },
438
+ adapterConformanceHashes: {},
439
+ metadata: {}
440
+ });
441
+ const verifierSet = createVerifierSetRelease({
442
+ schemaVersion: "openpond.verifierSetRelease.v1",
443
+ id: `${id}-verifiers`,
444
+ revision,
445
+ graders,
446
+ isolation: previousResources?.verifierSet.isolation ?? { processBoundary: "isolated_process", networkPolicy: "none", defaultTimeoutMs: Math.min(source.taskset.environment.defaultTimeoutMs, 3e5) },
447
+ calibrationReceiptRefs: [],
448
+ metadata: previousResources ? { sourceVerifierSet: learningRef2(previousResources.verifierSet) } : {}
449
+ });
450
+ const executionResources = { environment, verifierSet };
451
+ const execution = source.execution ? { ...source.execution, verifierSet } : void 0;
452
+ const { contentHash: _taskHash, ...taskContent } = source.taskset;
453
+ const { contentHash: _definitionHash, ...definitionContent } = source.taskDefinition;
454
+ const taskExecution = { ...definitionContent.execution, policy, environmentRelease: { id: environment.id, contentHash: environment.contentHash }, verifierSetRelease: { id: verifierSet.id, contentHash: verifierSet.contentHash } };
455
+ const taskDefinition = TaskDefinitionSchema.parse(sealLearningContent3({ ...definitionContent, id: `${id}-definition`, revision, rewardBinding: learningRef2(rewardBinding), execution: taskExecution }));
456
+ const authoring = source.taskset.metadata.starterAuthoring;
457
+ const graderFixtures = authoring && typeof authoring === "object" && !Array.isArray(authoring) && "graderFixtures" in authoring ? authoring.graderFixtures : void 0;
458
+ const taskset = TasksetReleaseSchema.parse(sealLearningContent3({
459
+ ...taskContent,
460
+ ...taskExecution,
461
+ id,
462
+ revision,
463
+ graders,
464
+ metadata: {
465
+ starter: { taskDefinition: learningRef2(taskDefinition), rewardBinding: learningRef2(rewardBinding) },
466
+ rewardExecution: { binding: rewardBinding, rewards },
467
+ ...graderFixtures === void 0 ? {} : { starterAuthoring: { graderFixtures } },
468
+ modelTasksetDerivation: { schemaVersion: "openpond.modelTasksetDerivation.v1", owner, root, parent: learningRef2(source.taskset) }
469
+ }
470
+ }));
471
+ return validateModelTasksetPackage({ taskset, taskDefinition, rewardBinding, rewards, assets: input.assets, executionResources, ...execution ? { execution } : {} });
472
+ }
473
+ function validateModelTasksetPackage(value) {
474
+ const result = ModelTasksetPackageSchema.parse(value);
475
+ const { taskset, taskDefinition, rewardBinding, rewards, assets, execution } = result;
476
+ for (const resource of [taskset, taskDefinition, rewardBinding, ...rewards, ...assets]) assertLearningContentHash(resource);
477
+ assertTasksetRelease(taskset);
478
+ if (rewardBinding.recipeRef) throw new Error("Resolve the Reward recipe into one standalone binding before deriving a Taskset.");
479
+ if (!sameLearningRef(taskDefinition.rewardBinding, learningRef2(rewardBinding))) throw new Error("Taskset definition differs from its Reward binding.");
480
+ const { policy, environment, environmentRelease, tools, capabilities, verifierSetRelease } = taskset;
481
+ if (!same(taskDefinition.execution, { policy, environment, ...environmentRelease ? { environmentRelease } : {}, tools, capabilities, ...verifierSetRelease ? { verifierSetRelease } : {} })) throw new Error("Taskset definition differs from its execution resources.");
482
+ if (!same(taskset.graders, compileBoundGraders(rewardBinding, rewards))) throw new Error("Taskset graders differ from its Reward binding.");
483
+ if (taskset.metadata.starter !== void 0) {
484
+ const metadata = z4.object({ taskDefinition: ModelProjectVersionedRefSchema, rewardBinding: ModelProjectVersionedRefSchema }).passthrough().parse(taskset.metadata.starter);
485
+ if (!sameLearningRef(metadata.taskDefinition, learningRef2(taskDefinition)) || !sameLearningRef(metadata.rewardBinding, learningRef2(rewardBinding))) throw new Error("Taskset metadata differs from its immutable grading resources.");
486
+ }
487
+ if (taskset.metadata.rewardExecution !== void 0 && !same(taskset.metadata.rewardExecution, { binding: rewardBinding, rewards })) throw new Error("Taskset embedded Rewards differ from its immutable grading resources.");
488
+ if (taskset.metadata.rewardBinding !== void 0 && !sameLearningRef(ModelProjectVersionedRefSchema.parse(taskset.metadata.rewardBinding), learningRef2(rewardBinding))) throw new Error("Taskset Reward reference differs from its immutable grading resources.");
489
+ const resources = result.executionResources ?? execution;
490
+ if (taskset.environmentRelease && !resources) throw new Error("Deriving a Taskset requires its pinned execution resources.");
491
+ if (resources && (!verifyEnvironmentRelease2(resources.environment) || !verifyVerifierSetRelease2(resources.verifierSet) || !same(taskset.environmentRelease, { id: resources.environment.id, contentHash: resources.environment.contentHash }) || !same(taskset.verifierSetRelease, { id: resources.verifierSet.id, contentHash: resources.verifierSet.contentHash }) || !same(taskset.environment, resources.environment.contract) || !same(taskset.graders, resources.verifierSet.graders))) throw new Error("Taskset differs from its pinned execution resources.");
492
+ validateModelStarterExecution(execution, taskset, assets);
493
+ if (new Set(assets.map((asset) => asset.id)).size !== assets.length) throw new Error("Taskset asset identities must be unique.");
494
+ for (const asset of assets) verifyLearningTextAsset3(asset, asset.asset);
495
+ for (const reference of resources ? [resources.environment.actionSchemaRef, resources.environment.observationSchemaRef, resources.environment.stateSchemaRef] : []) {
496
+ if (!reference) continue;
497
+ const asset = assets.find((asset2) => asset2.id === reference.id);
498
+ if (!asset) throw new Error(`Taskset environment asset is missing: ${reference.id}.`);
499
+ verifyLearningTextAsset3(asset, reference);
500
+ }
501
+ for (const task of taskset.tasks) {
502
+ if (task.policyVisibleContext.instructions !== taskDefinition.instructions || !validateTaskValue(taskDefinition.inputSchema, task.input).valid || task.expectedOutput !== null && !validateTaskValue(taskDefinition.outputSchema, task.expectedOutput).valid) throw new Error(`Taskset task differs from its declared format: ${task.id}.`);
503
+ if (task.privilegedContextRef && !assets.some((asset) => asset.id === task.privilegedContextRef && asset.asset.visibility === "host_private")) throw new Error(`Taskset private context is missing: ${task.id}.`);
504
+ }
505
+ for (const reward of rewards) {
506
+ const implementation = reward.implementation;
507
+ const references = [...reward.assets, ..."verifierRef" in implementation ? [implementation.verifierRef] : [], ..."rubricRef" in implementation ? [implementation.rubricRef] : [], ..."inputContract" in implementation ? [implementation.inputContract] : []];
508
+ for (const reference of references) {
509
+ const asset = assets.find((asset2) => asset2.id === reference.id);
510
+ if (!asset || reference.visibility === "policy") throw new Error(`Taskset Reward requires its private asset: ${reference.id}.`);
511
+ verifyLearningTextAsset3(asset, reference);
512
+ }
513
+ }
514
+ return result;
515
+ }
516
+
360
517
  // src/model-starters.ts
361
- var IdSchema2 = z3.string().trim().min(1).max(500);
518
+ var IdSchema2 = z5.string().trim().min(1).max(500);
362
519
  var RefSchema = ModelProjectVersionedRefSchema;
363
- var ModelStarterContentSchema = z3.object({
364
- schemaVersion: z3.literal("openpond.modelStarter.v1"),
520
+ var ModelStarterContentSchema = z5.object({
521
+ schemaVersion: z5.literal("openpond.modelStarter.v1"),
365
522
  id: IdSchema2,
366
- revision: z3.number().int().positive(),
367
- name: z3.string().trim().min(1).max(200),
368
- description: z3.string().trim().min(1).max(2e3),
369
- category: z3.enum(["extraction", "support", "operations", "knowledge", "coding", "writing", "classification"]),
523
+ revision: z5.number().int().positive(),
524
+ name: z5.string().trim().min(1).max(200),
525
+ description: z5.string().trim().min(1).max(2e3),
526
+ category: z5.enum(["extraction", "support", "operations", "knowledge", "coding", "writing", "classification"]),
370
527
  taskset: RefSchema,
371
528
  taskDefinition: RefSchema,
372
529
  rewardBinding: RefSchema,
373
- rewards: z3.array(RefSchema).min(1).max(100),
374
- assets: z3.array(RefSchema).max(1e3),
375
- previewTaskIds: z3.array(IdSchema2).min(1).max(8),
530
+ rewards: z5.array(RefSchema).min(1).max(100),
531
+ assets: z5.array(RefSchema).max(1e3),
532
+ previewTaskIds: z5.array(IdSchema2).min(1).max(8),
376
533
  startingModel: ModelProjectBaseModelSchema,
377
- supportedMethods: z3.array(ModelProjectTrainingMethodSchema).min(1).max(8),
534
+ supportedMethods: z5.array(ModelProjectTrainingMethodSchema).min(1).max(8),
378
535
  defaultMethod: ModelProjectTrainingMethodSchema,
379
- provenance: z3.object({ author: z3.string().min(1).max(200), license: z3.string().min(1).max(200), sourceDescription: z3.string().min(1).max(2e3) }).strict(),
536
+ provenance: z5.object({ author: z5.string().min(1).max(200), license: z5.string().min(1).max(200), sourceDescription: z5.string().min(1).max(2e3) }).strict(),
380
537
  // These are references to real results. Package publication does not create
381
538
  // evidence, qualify a starter, or enable continuous learning.
382
- evidence: z3.object({ verifierFixtures: RefSchema.nullable(), baseline: RefSchema.nullable(), training: RefSchema.nullable(), evaluation: RefSchema.nullable() }).strict()
539
+ evidence: z5.object({ verifierFixtures: RefSchema.nullable(), baseline: RefSchema.nullable(), training: RefSchema.nullable(), evaluation: RefSchema.nullable() }).strict()
383
540
  }).strict().superRefine((starter, context) => {
384
541
  if (!starter.supportedMethods.includes(starter.defaultMethod)) context.addIssue({ code: "custom", path: ["defaultMethod"], message: "The default method must be supported by the package." });
385
542
  for (const field of ["rewards", "assets"]) {
@@ -387,23 +544,23 @@ var ModelStarterContentSchema = z3.object({
387
544
  }
388
545
  if (new Set(starter.previewTaskIds).size !== starter.previewTaskIds.length) context.addIssue({ code: "custom", path: ["previewTaskIds"], message: "Preview tasks must be unique." });
389
546
  });
390
- var ModelStarterSchema = ModelStarterContentSchema.safeExtend({ contentHash: z3.string().regex(/^[a-f0-9]{64}$/) });
391
- var ResolvedModelStarterSchema = z3.object({
547
+ var ModelStarterSchema = ModelStarterContentSchema.safeExtend({ contentHash: z5.string().regex(/^[a-f0-9]{64}$/) });
548
+ var ResolvedModelStarterSchema = z5.object({
392
549
  starter: ModelStarterSchema,
393
- taskset: TasksetReleaseSchema,
394
- taskDefinition: TaskDefinitionSchema,
395
- rewardBinding: RewardBindingSchema,
396
- rewards: z3.array(RewardReleaseSchema).min(1).max(100),
397
- assets: z3.array(LearningTextAssetSchema).max(1e3),
550
+ taskset: TasksetReleaseSchema2,
551
+ taskDefinition: TaskDefinitionSchema2,
552
+ rewardBinding: RewardBindingSchema2,
553
+ rewards: z5.array(RewardReleaseSchema2).min(1).max(100),
554
+ assets: z5.array(LearningTextAssetSchema2).max(1e3),
398
555
  execution: ModelStarterExecutionSchema.optional()
399
556
  }).strict();
400
- var ModelStarterPrivacyReviewSchema = z3.object({
401
- schemaVersion: z3.literal("openpond.modelStarterPrivacyReview.v1"),
402
- disposition: z3.literal("synthetic_only"),
403
- reviewedBy: z3.string().trim().min(1).max(500),
404
- reviewedAt: z3.iso.datetime(),
405
- reviewedContentHash: z3.string().regex(/^[a-f0-9]{64}$/),
406
- note: z3.string().trim().min(1).max(2e3)
557
+ var ModelStarterPrivacyReviewSchema = z5.object({
558
+ schemaVersion: z5.literal("openpond.modelStarterPrivacyReview.v1"),
559
+ disposition: z5.literal("synthetic_only"),
560
+ reviewedBy: z5.string().trim().min(1).max(500),
561
+ reviewedAt: z5.iso.datetime(),
562
+ reviewedContentHash: z5.string().regex(/^[a-f0-9]{64}$/),
563
+ note: z5.string().trim().min(1).max(2e3)
407
564
  }).strict();
408
565
  function modelStarterPrivacyContentHash(value) {
409
566
  const { contentHash: _starterHash, ...starter } = value.starter;
@@ -415,19 +572,19 @@ function modelStarterPrivacyContentHash(value) {
415
572
  const { privacyReview: _review, ...content } = authoring;
416
573
  metadata.starterAuthoring = content;
417
574
  }
418
- return sealLearningContent2({ ...value, starter: { ...starter, taskset: tasksetRef }, taskset: { ...taskset, metadata } }).contentHash;
575
+ return sealLearningContent4({ ...value, starter: { ...starter, taskset: tasksetRef }, taskset: { ...taskset, metadata } }).contentHash;
419
576
  }
420
- var ModelStarterCreationIntentSchema = z3.object({
577
+ var ModelStarterCreationIntentSchema = z5.object({
421
578
  profileId: IdSchema2,
422
579
  modelId: IdSchema2,
423
- name: z3.string().trim().min(1).max(200),
580
+ name: z5.string().trim().min(1).max(200),
424
581
  starter: RefSchema,
425
582
  startingModel: ModelProjectBaseModelSchema,
426
583
  method: ModelProjectTrainingMethodSchema,
427
584
  rewardBindingRef: RefSchema.nullable().optional()
428
585
  }).strict();
429
586
  var ModelStarterCreationRequestSchema = ModelStarterCreationIntentSchema.extend({
430
- schemaVersion: z3.literal("openpond.modelStarterCreation.v1"),
587
+ schemaVersion: z5.literal("openpond.modelStarterCreation.v1"),
431
588
  operationId: IdSchema2
432
589
  }).strict();
433
590
  function parseModelStarterCreationRequest(value) {
@@ -446,7 +603,7 @@ async function createModelStarterCreationRequest(value) {
446
603
  function validateModelStarterCreation(value, packageValue) {
447
604
  const request = parseModelStarterCreationRequest(value);
448
605
  const resolved = validateResolvedModelStarter(packageValue);
449
- if (!sameLearningRef(request.starter, learningRef2(resolved.starter))) throw new Error("Starter creation references a different package revision.");
606
+ if (!sameLearningRef2(request.starter, learningRef3(resolved.starter))) throw new Error("Starter creation references a different package revision.");
450
607
  if (!resolved.starter.supportedMethods.includes(request.method)) throw new Error("The selected training method is not supported by this starter.");
451
608
  return { request, resolved };
452
609
  }
@@ -460,7 +617,7 @@ function previewModelStarter(value) {
460
617
  name: rewardBinding.name,
461
618
  description: rewardBinding.description,
462
619
  checks: rewardBinding.sources.map((source) => {
463
- const reward = rewards.find((reward2) => sameLearningRef(source.reward, learningRef2(reward2)));
620
+ const reward = rewards.find((reward2) => sameLearningRef2(source.reward, learningRef3(reward2)));
464
621
  return { name: reward.name, description: reward.description, kind: reward.implementation.kind, role: source.role, weight: source.weight, required: source.required, hardGate: source.hardGate };
465
622
  })
466
623
  },
@@ -487,12 +644,12 @@ function validateResolvedModelStarter(value) {
487
644
  const resources = [starter, taskset, taskDefinition, rewardBinding, ...rewards, ...assets];
488
645
  for (const resource of resources) {
489
646
  const { contentHash, ...content } = resource;
490
- if (sealLearningContent2(content).contentHash !== contentHash) throw new Error(`Starter resource integrity failed: ${resource.id}.`);
647
+ if (sealLearningContent4(content).contentHash !== contentHash) throw new Error(`Starter resource integrity failed: ${resource.id}.`);
491
648
  }
492
- assertTasksetRelease(taskset);
649
+ assertTasksetRelease2(taskset);
493
650
  validateModelStarterExecution(resolved.execution, taskset, assets);
494
651
  function exact(expected, resource) {
495
- if (!sameLearningRef(expected, learningRef2(resource))) throw new Error(`Starter dependency mismatch: ${expected.id}.`);
652
+ if (!sameLearningRef2(expected, learningRef3(resource))) throw new Error(`Starter dependency mismatch: ${expected.id}.`);
496
653
  }
497
654
  exact(starter.taskset, taskset);
498
655
  exact(starter.taskDefinition, taskDefinition);
@@ -501,8 +658,8 @@ function validateResolvedModelStarter(value) {
501
658
  if (rewardBinding.recipeRef) throw new Error("Starter binding recipes must be resolved into a standalone binding before publication.");
502
659
  const { policy, environment, environmentRelease, tools, capabilities, verifierSetRelease } = taskset;
503
660
  const execution = { policy, environment, ...environmentRelease ? { environmentRelease } : {}, tools, capabilities, ...verifierSetRelease ? { verifierSetRelease } : {} };
504
- if (sealLearningContent2(execution).contentHash !== sealLearningContent2(taskDefinition.execution).contentHash) throw new Error("Starter execution context differs from its task format.");
505
- if (sealLearningContent2({ graders: taskset.graders }).contentHash !== sealLearningContent2({ graders: compileBoundGraders(rewardBinding, rewards) }).contentHash) throw new Error("Starter executable graders differ from its Reward binding.");
661
+ if (sealLearningContent4(execution).contentHash !== sealLearningContent4(taskDefinition.execution).contentHash) throw new Error("Starter execution context differs from its task format.");
662
+ if (sealLearningContent4({ graders: taskset.graders }).contentHash !== sealLearningContent4({ graders: compileBoundGraders2(rewardBinding, rewards) }).contentHash) throw new Error("Starter executable graders differ from its Reward binding.");
506
663
  for (const [references, values] of [[starter.rewards, rewards], [starter.assets, assets]]) {
507
664
  if (references.length !== values.length || new Set(values.map((resource) => resource.id)).size !== values.length) throw new Error("Starter dependency inventory mismatch.");
508
665
  for (const ref of references) {
@@ -526,7 +683,7 @@ function validateResolvedModelStarter(value) {
526
683
  ];
527
684
  for (const ref of references) {
528
685
  const asset = assets.find((asset2) => asset2.id === ref.id);
529
- if (!asset || sealLearningContent2(asset.asset).contentHash !== sealLearningContent2(ref).contentHash) throw new Error(`Starter Reward source is missing or changed: ${ref.id}.`);
686
+ if (!asset || sealLearningContent4(asset.asset).contentHash !== sealLearningContent4(ref).contentHash) throw new Error(`Starter Reward source is missing or changed: ${ref.id}.`);
530
687
  if (ref.visibility === "policy") throw new Error(`Starter Reward source must remain private to its evaluator: ${ref.id}.`);
531
688
  }
532
689
  }
@@ -534,12 +691,12 @@ function validateResolvedModelStarter(value) {
534
691
  const inputSplits = /* @__PURE__ */ new Map();
535
692
  for (const task of taskset.tasks) {
536
693
  if (task.policyVisibleContext.instructions !== taskDefinition.instructions) throw new Error(`Starter task does not carry its declared model instructions: ${task.id}.`);
537
- const inputHash = sealLearningContent2({ input: task.input, context: task.policyVisibleContext }).contentHash;
694
+ const inputHash = sealLearningContent4({ input: task.input, context: task.policyVisibleContext }).contentHash;
538
695
  const priorSplit = inputSplits.get(inputHash);
539
696
  if (priorSplit && priorSplit !== task.split) throw new Error("Starter policy input appears in multiple splits.");
540
697
  inputSplits.set(inputHash, task.split);
541
- if (!validateTaskValue(taskDefinition.inputSchema, task.input).valid) throw new Error(`Starter task input does not match its format: ${task.id}.`);
542
- if (task.expectedOutput !== null && !validateTaskValue(taskDefinition.outputSchema, task.expectedOutput).valid) throw new Error(`Starter expected output does not match its format: ${task.id}.`);
698
+ if (!validateTaskValue2(taskDefinition.inputSchema, task.input).valid) throw new Error(`Starter task input does not match its format: ${task.id}.`);
699
+ if (task.expectedOutput !== null && !validateTaskValue2(taskDefinition.outputSchema, task.expectedOutput).valid) throw new Error(`Starter expected output does not match its format: ${task.id}.`);
543
700
  }
544
701
  for (const id of starter.previewTaskIds) {
545
702
  const task = taskset.tasks.find((task2) => task2.id === id);
@@ -556,15 +713,23 @@ export {
556
713
  ModelStarterPrivacyReviewSchema,
557
714
  ModelStarterSchema,
558
715
  ModelStarterToolFixtureScriptSchema,
716
+ ModelTasksetDerivationSchema,
717
+ ModelTasksetExecutionResourcesSchema,
718
+ ModelTasksetPackageSchema,
559
719
  ResolvedModelStarterSchema,
560
720
  createModelStarterCreationRequest,
561
721
  createModelStarterExecutionAsset,
722
+ createModelTasksetExecutionResourcesAsset,
723
+ deriveModelTaskset,
562
724
  modelStarterExecutionAssetId,
563
725
  modelStarterPrivacyContentHash,
726
+ modelTasksetExecutionResourcesAssetId,
564
727
  parseModelStarterCreationRequest,
565
728
  previewModelStarter,
566
729
  resolveModelStarterExecutionAsset,
730
+ resolveModelTasksetExecutionResourcesAsset,
567
731
  validateModelStarterCreation,
732
+ validateModelTasksetPackage,
568
733
  validateResolvedModelStarter,
569
734
  verifyModelStarterEnvironmentAttempt
570
735
  };