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.
package/MODEL_STARTERS.md CHANGED
@@ -37,6 +37,53 @@ Evidence references are nullable pointers to actual verifier, baseline, training
37
37
 
38
38
  The repository's invoice-extraction example authors 80 original synthetic text tasks and executes its verifier fixtures. Its baseline, training, evaluation and full product qualification remain pending. The local server includes preparation, atomic persistence and file-materialization adapters; catalog publication, route wiring and Desktop Get Started integration are separate delivery steps.
39
39
 
40
+ ## Model-owned Taskset revisions
41
+
42
+ `deriveModelTaskset` compiles a new immutable Taskset from an exact source package
43
+ and selected Reward binding. `ModelTasksetPackageSchema` and
44
+ `validateModelTasksetPackage` validate task formats, private assets, executable
45
+ graders, definition references and pinned execution resources. A package is
46
+ independent of its catalog listing.
47
+
48
+ ```ts
49
+ import { deriveModelTaskset } from "openpond-sdk/model-starters";
50
+
51
+ const derived = deriveModelTaskset({
52
+ owner: { scopeId, modelId },
53
+ source,
54
+ rewardBinding: selectedBinding,
55
+ rewards: selectedRewards,
56
+ assets: resolvedPrivateAssets,
57
+ });
58
+ ```
59
+
60
+ The host must authorize the owner and source before compilation. The first edit
61
+ creates a distinct model-owned identity; later edits to that owner's Taskset
62
+ retain its identity and advance its revision. Another owner's edit forks a new
63
+ identity. `metadata.modelTasksetDerivation` retains exact root and parent refs.
64
+ The compiler rebuilds the grader snapshot, verifier set and task definition;
65
+ it preserves task rows and the environment. Changed packages have no inherited
66
+ calibration receipts, qualification results or publisher privacy attestation.
67
+ Authored fixtures can be retained for checking again.
68
+
69
+ The result includes `executionResources` for text and tool packages. Persist
70
+ `createModelTasksetExecutionResourcesAsset(derived.executionResources)` with the
71
+ derived package. On another host, load that private asset using
72
+ `modelTasksetExecutionResourcesAssetId(taskset)` and validate it with
73
+ `resolveModelTasksetExecutionResourcesAsset(taskset, asset)` before another edit.
74
+ This preserves the exact environment and verifier set for text packages too. Tool
75
+ packages also include the updated private JavaScript `execution` closure; persist
76
+ `createModelStarterExecutionAsset(derived.execution)` with the new definition.
77
+ The Taskset's binding and embedded Reward snapshot must agree. A model-level
78
+ selection cannot override the published grader snapshot at execution time.
79
+
80
+ Compilation changes no model or storage. The host must materialize immutable
81
+ files first, then atomically commit the Taskset, dependencies, intended model
82
+ attachment/configuration, compare-and-set revision and original operation
83
+ receipt. Keep preparation state across uncertain outcomes. A lost model CAS
84
+ may leave unattached package files; it must not retarget a model or overwrite an
85
+ earlier package. Reusing an operation returns its original committed result.
86
+
40
87
  ## Hosted starter attempts
41
88
 
42
89
  The `openpond-sdk/model-starter-attempts` subpath defines a durable, workspace-scoped attempt API. Create requests select an attached Model Project, exact Taskset release, task, environment seed and explicit policy. They never carry replacement task input, private state, verifier source or evaluator context. Reuse the same `operationId` for a transport retry; use a new identity for a new evaluation.
@@ -1,5 +1,5 @@
1
1
  // src/model-starter-catalog.ts
2
- import { z as z4 } from "zod";
2
+ import { z as z6 } from "zod";
3
3
 
4
4
  // src/model-projects.ts
5
5
  import { z } from "zod";
@@ -195,11 +195,11 @@ var ModelProjectApiErrorSchema = z.object({
195
195
  }).strict();
196
196
 
197
197
  // src/model-starters.ts
198
- import { z as z3 } from "zod";
199
- import { TasksetReleaseSchema, assertTasksetRelease } from "@openpond/evals/tasksets";
200
- import { LearningTextAssetSchema, TaskDefinitionSchema, learningRef as learningRef2, sameLearningRef, sealLearningContent as sealLearningContent2 } from "@openpond/evals/learning";
201
- import { RewardBindingSchema, RewardReleaseSchema, compileBoundGraders } from "@openpond/evals/rewards";
202
- import { assertBoundedTaskJson as assertBoundedTaskJson3, validateTaskValue } from "@openpond/evals/task-schema";
198
+ import { z as z5 } from "zod";
199
+ import { TasksetReleaseSchema as TasksetReleaseSchema2, assertTasksetRelease as assertTasksetRelease2 } from "@openpond/evals/tasksets";
200
+ import { LearningTextAssetSchema as LearningTextAssetSchema2, TaskDefinitionSchema as TaskDefinitionSchema2, learningRef as learningRef3, sameLearningRef as sameLearningRef2, sealLearningContent as sealLearningContent4 } from "@openpond/evals/learning";
201
+ import { RewardBindingSchema as RewardBindingSchema2, RewardReleaseSchema as RewardReleaseSchema2, compileBoundGraders as compileBoundGraders2 } from "@openpond/evals/rewards";
202
+ import { assertBoundedTaskJson as assertBoundedTaskJson3, validateTaskValue as validateTaskValue2 } from "@openpond/evals/task-schema";
203
203
 
204
204
  // src/model-starter-execution.ts
205
205
  import { z as z2 } from "zod";
@@ -270,29 +270,61 @@ function validateModelStarterExecution(execution, taskset, assets) {
270
270
  }
271
271
  }
272
272
 
273
+ // src/model-taskset-derivation.ts
274
+ import { z as z4 } from "zod";
275
+ import { createEnvironmentRelease, createVerifierSetRelease, verifyEnvironmentRelease as verifyEnvironmentRelease2, verifyVerifierSetRelease as verifyVerifierSetRelease2 } from "@openpond/evals";
276
+ import { LearningTextAssetSchema, TaskDefinitionSchema, assertLearningContentHash, learningRef as learningRef2, sameLearningRef, sealLearningContent as sealLearningContent3, verifyLearningTextAsset as verifyLearningTextAsset3 } from "@openpond/evals/learning";
277
+ import { RewardBindingSchema, RewardReleaseSchema, compileBoundGraders } from "@openpond/evals/rewards";
278
+ import { TasksetReleaseSchema, assertTasksetRelease } from "@openpond/evals/tasksets";
279
+ import { validateTaskValue } from "@openpond/evals/task-schema";
280
+
281
+ // src/model-taskset-resources.ts
282
+ import { z as z3 } from "zod";
283
+ import { EnvironmentReleaseSchema as EnvironmentReleaseSchema2, VerifierSetReleaseSchema as VerifierSetReleaseSchema2, verifyEnvironmentRelease, verifyVerifierSetRelease } from "@openpond/evals";
284
+ import { createLearningTextAsset as createLearningTextAsset2, sealLearningContent as sealLearningContent2, verifyLearningTextAsset as verifyLearningTextAsset2 } from "@openpond/evals/learning";
285
+ var ModelTasksetExecutionResourcesSchema = z3.object({ environment: EnvironmentReleaseSchema2, verifierSet: VerifierSetReleaseSchema2 }).strict();
286
+
287
+ // src/model-taskset-derivation.ts
288
+ var OwnerSchema = z4.object({ scopeId: z4.string().trim().min(1).max(500), modelId: z4.string().trim().min(1).max(500) }).strict();
289
+ var ModelTasksetDerivationSchema = z4.object({
290
+ schemaVersion: z4.literal("openpond.modelTasksetDerivation.v1"),
291
+ owner: OwnerSchema,
292
+ root: ModelProjectVersionedRefSchema,
293
+ parent: ModelProjectVersionedRefSchema
294
+ }).strict();
295
+ var ModelTasksetPackageSchema = z4.object({
296
+ taskset: TasksetReleaseSchema,
297
+ taskDefinition: TaskDefinitionSchema,
298
+ rewardBinding: RewardBindingSchema,
299
+ rewards: z4.array(RewardReleaseSchema).min(1).max(100),
300
+ assets: z4.array(LearningTextAssetSchema).max(1e3),
301
+ executionResources: ModelTasksetExecutionResourcesSchema.optional(),
302
+ execution: ModelStarterExecutionSchema.optional()
303
+ }).strict();
304
+
273
305
  // src/model-starters.ts
274
- var IdSchema2 = z3.string().trim().min(1).max(500);
306
+ var IdSchema2 = z5.string().trim().min(1).max(500);
275
307
  var RefSchema = ModelProjectVersionedRefSchema;
276
- var ModelStarterContentSchema = z3.object({
277
- schemaVersion: z3.literal("openpond.modelStarter.v1"),
308
+ var ModelStarterContentSchema = z5.object({
309
+ schemaVersion: z5.literal("openpond.modelStarter.v1"),
278
310
  id: IdSchema2,
279
- revision: z3.number().int().positive(),
280
- name: z3.string().trim().min(1).max(200),
281
- description: z3.string().trim().min(1).max(2e3),
282
- category: z3.enum(["extraction", "support", "operations", "knowledge", "coding", "writing", "classification"]),
311
+ revision: z5.number().int().positive(),
312
+ name: z5.string().trim().min(1).max(200),
313
+ description: z5.string().trim().min(1).max(2e3),
314
+ category: z5.enum(["extraction", "support", "operations", "knowledge", "coding", "writing", "classification"]),
283
315
  taskset: RefSchema,
284
316
  taskDefinition: RefSchema,
285
317
  rewardBinding: RefSchema,
286
- rewards: z3.array(RefSchema).min(1).max(100),
287
- assets: z3.array(RefSchema).max(1e3),
288
- previewTaskIds: z3.array(IdSchema2).min(1).max(8),
318
+ rewards: z5.array(RefSchema).min(1).max(100),
319
+ assets: z5.array(RefSchema).max(1e3),
320
+ previewTaskIds: z5.array(IdSchema2).min(1).max(8),
289
321
  startingModel: ModelProjectBaseModelSchema,
290
- supportedMethods: z3.array(ModelProjectTrainingMethodSchema).min(1).max(8),
322
+ supportedMethods: z5.array(ModelProjectTrainingMethodSchema).min(1).max(8),
291
323
  defaultMethod: ModelProjectTrainingMethodSchema,
292
- 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(),
324
+ 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(),
293
325
  // These are references to real results. Package publication does not create
294
326
  // evidence, qualify a starter, or enable continuous learning.
295
- evidence: z3.object({ verifierFixtures: RefSchema.nullable(), baseline: RefSchema.nullable(), training: RefSchema.nullable(), evaluation: RefSchema.nullable() }).strict()
327
+ evidence: z5.object({ verifierFixtures: RefSchema.nullable(), baseline: RefSchema.nullable(), training: RefSchema.nullable(), evaluation: RefSchema.nullable() }).strict()
296
328
  }).strict().superRefine((starter, context) => {
297
329
  if (!starter.supportedMethods.includes(starter.defaultMethod)) context.addIssue({ code: "custom", path: ["defaultMethod"], message: "The default method must be supported by the package." });
298
330
  for (const field of ["rewards", "assets"]) {
@@ -300,23 +332,23 @@ var ModelStarterContentSchema = z3.object({
300
332
  }
301
333
  if (new Set(starter.previewTaskIds).size !== starter.previewTaskIds.length) context.addIssue({ code: "custom", path: ["previewTaskIds"], message: "Preview tasks must be unique." });
302
334
  });
303
- var ModelStarterSchema = ModelStarterContentSchema.safeExtend({ contentHash: z3.string().regex(/^[a-f0-9]{64}$/) });
304
- var ResolvedModelStarterSchema = z3.object({
335
+ var ModelStarterSchema = ModelStarterContentSchema.safeExtend({ contentHash: z5.string().regex(/^[a-f0-9]{64}$/) });
336
+ var ResolvedModelStarterSchema = z5.object({
305
337
  starter: ModelStarterSchema,
306
- taskset: TasksetReleaseSchema,
307
- taskDefinition: TaskDefinitionSchema,
308
- rewardBinding: RewardBindingSchema,
309
- rewards: z3.array(RewardReleaseSchema).min(1).max(100),
310
- assets: z3.array(LearningTextAssetSchema).max(1e3),
338
+ taskset: TasksetReleaseSchema2,
339
+ taskDefinition: TaskDefinitionSchema2,
340
+ rewardBinding: RewardBindingSchema2,
341
+ rewards: z5.array(RewardReleaseSchema2).min(1).max(100),
342
+ assets: z5.array(LearningTextAssetSchema2).max(1e3),
311
343
  execution: ModelStarterExecutionSchema.optional()
312
344
  }).strict();
313
- var ModelStarterPrivacyReviewSchema = z3.object({
314
- schemaVersion: z3.literal("openpond.modelStarterPrivacyReview.v1"),
315
- disposition: z3.literal("synthetic_only"),
316
- reviewedBy: z3.string().trim().min(1).max(500),
317
- reviewedAt: z3.iso.datetime(),
318
- reviewedContentHash: z3.string().regex(/^[a-f0-9]{64}$/),
319
- note: z3.string().trim().min(1).max(2e3)
345
+ var ModelStarterPrivacyReviewSchema = z5.object({
346
+ schemaVersion: z5.literal("openpond.modelStarterPrivacyReview.v1"),
347
+ disposition: z5.literal("synthetic_only"),
348
+ reviewedBy: z5.string().trim().min(1).max(500),
349
+ reviewedAt: z5.iso.datetime(),
350
+ reviewedContentHash: z5.string().regex(/^[a-f0-9]{64}$/),
351
+ note: z5.string().trim().min(1).max(2e3)
320
352
  }).strict();
321
353
  function modelStarterPrivacyContentHash(value) {
322
354
  const { contentHash: _starterHash, ...starter } = value.starter;
@@ -328,19 +360,19 @@ function modelStarterPrivacyContentHash(value) {
328
360
  const { privacyReview: _review, ...content } = authoring;
329
361
  metadata.starterAuthoring = content;
330
362
  }
331
- return sealLearningContent2({ ...value, starter: { ...starter, taskset: tasksetRef }, taskset: { ...taskset, metadata } }).contentHash;
363
+ return sealLearningContent4({ ...value, starter: { ...starter, taskset: tasksetRef }, taskset: { ...taskset, metadata } }).contentHash;
332
364
  }
333
- var ModelStarterCreationIntentSchema = z3.object({
365
+ var ModelStarterCreationIntentSchema = z5.object({
334
366
  profileId: IdSchema2,
335
367
  modelId: IdSchema2,
336
- name: z3.string().trim().min(1).max(200),
368
+ name: z5.string().trim().min(1).max(200),
337
369
  starter: RefSchema,
338
370
  startingModel: ModelProjectBaseModelSchema,
339
371
  method: ModelProjectTrainingMethodSchema,
340
372
  rewardBindingRef: RefSchema.nullable().optional()
341
373
  }).strict();
342
374
  var ModelStarterCreationRequestSchema = ModelStarterCreationIntentSchema.extend({
343
- schemaVersion: z3.literal("openpond.modelStarterCreation.v1"),
375
+ schemaVersion: z5.literal("openpond.modelStarterCreation.v1"),
344
376
  operationId: IdSchema2
345
377
  }).strict();
346
378
  function validateResolvedModelStarter(value) {
@@ -355,12 +387,12 @@ function validateResolvedModelStarter(value) {
355
387
  const resources = [starter, taskset, taskDefinition, rewardBinding, ...rewards, ...assets];
356
388
  for (const resource of resources) {
357
389
  const { contentHash, ...content } = resource;
358
- if (sealLearningContent2(content).contentHash !== contentHash) throw new Error(`Starter resource integrity failed: ${resource.id}.`);
390
+ if (sealLearningContent4(content).contentHash !== contentHash) throw new Error(`Starter resource integrity failed: ${resource.id}.`);
359
391
  }
360
- assertTasksetRelease(taskset);
392
+ assertTasksetRelease2(taskset);
361
393
  validateModelStarterExecution(resolved.execution, taskset, assets);
362
394
  function exact(expected, resource) {
363
- if (!sameLearningRef(expected, learningRef2(resource))) throw new Error(`Starter dependency mismatch: ${expected.id}.`);
395
+ if (!sameLearningRef2(expected, learningRef3(resource))) throw new Error(`Starter dependency mismatch: ${expected.id}.`);
364
396
  }
365
397
  exact(starter.taskset, taskset);
366
398
  exact(starter.taskDefinition, taskDefinition);
@@ -369,8 +401,8 @@ function validateResolvedModelStarter(value) {
369
401
  if (rewardBinding.recipeRef) throw new Error("Starter binding recipes must be resolved into a standalone binding before publication.");
370
402
  const { policy, environment, environmentRelease, tools, capabilities, verifierSetRelease } = taskset;
371
403
  const execution = { policy, environment, ...environmentRelease ? { environmentRelease } : {}, tools, capabilities, ...verifierSetRelease ? { verifierSetRelease } : {} };
372
- if (sealLearningContent2(execution).contentHash !== sealLearningContent2(taskDefinition.execution).contentHash) throw new Error("Starter execution context differs from its task format.");
373
- if (sealLearningContent2({ graders: taskset.graders }).contentHash !== sealLearningContent2({ graders: compileBoundGraders(rewardBinding, rewards) }).contentHash) throw new Error("Starter executable graders differ from its Reward binding.");
404
+ if (sealLearningContent4(execution).contentHash !== sealLearningContent4(taskDefinition.execution).contentHash) throw new Error("Starter execution context differs from its task format.");
405
+ if (sealLearningContent4({ graders: taskset.graders }).contentHash !== sealLearningContent4({ graders: compileBoundGraders2(rewardBinding, rewards) }).contentHash) throw new Error("Starter executable graders differ from its Reward binding.");
374
406
  for (const [references, values] of [[starter.rewards, rewards], [starter.assets, assets]]) {
375
407
  if (references.length !== values.length || new Set(values.map((resource) => resource.id)).size !== values.length) throw new Error("Starter dependency inventory mismatch.");
376
408
  for (const ref of references) {
@@ -394,7 +426,7 @@ function validateResolvedModelStarter(value) {
394
426
  ];
395
427
  for (const ref of references) {
396
428
  const asset = assets.find((asset2) => asset2.id === ref.id);
397
- if (!asset || sealLearningContent2(asset.asset).contentHash !== sealLearningContent2(ref).contentHash) throw new Error(`Starter Reward source is missing or changed: ${ref.id}.`);
429
+ if (!asset || sealLearningContent4(asset.asset).contentHash !== sealLearningContent4(ref).contentHash) throw new Error(`Starter Reward source is missing or changed: ${ref.id}.`);
398
430
  if (ref.visibility === "policy") throw new Error(`Starter Reward source must remain private to its evaluator: ${ref.id}.`);
399
431
  }
400
432
  }
@@ -402,12 +434,12 @@ function validateResolvedModelStarter(value) {
402
434
  const inputSplits = /* @__PURE__ */ new Map();
403
435
  for (const task of taskset.tasks) {
404
436
  if (task.policyVisibleContext.instructions !== taskDefinition.instructions) throw new Error(`Starter task does not carry its declared model instructions: ${task.id}.`);
405
- const inputHash = sealLearningContent2({ input: task.input, context: task.policyVisibleContext }).contentHash;
437
+ const inputHash = sealLearningContent4({ input: task.input, context: task.policyVisibleContext }).contentHash;
406
438
  const priorSplit = inputSplits.get(inputHash);
407
439
  if (priorSplit && priorSplit !== task.split) throw new Error("Starter policy input appears in multiple splits.");
408
440
  inputSplits.set(inputHash, task.split);
409
- if (!validateTaskValue(taskDefinition.inputSchema, task.input).valid) throw new Error(`Starter task input does not match its format: ${task.id}.`);
410
- if (task.expectedOutput !== null && !validateTaskValue(taskDefinition.outputSchema, task.expectedOutput).valid) throw new Error(`Starter expected output does not match its format: ${task.id}.`);
441
+ if (!validateTaskValue2(taskDefinition.inputSchema, task.input).valid) throw new Error(`Starter task input does not match its format: ${task.id}.`);
442
+ if (task.expectedOutput !== null && !validateTaskValue2(taskDefinition.outputSchema, task.expectedOutput).valid) throw new Error(`Starter expected output does not match its format: ${task.id}.`);
411
443
  }
412
444
  for (const id of starter.previewTaskIds) {
413
445
  const task = taskset.tasks.find((task2) => task2.id === id);
@@ -417,18 +449,18 @@ function validateResolvedModelStarter(value) {
417
449
  }
418
450
 
419
451
  // src/model-starter-catalog.ts
420
- var ModelStarterCatalogQuerySchema = z4.object({
421
- afterId: z4.string().trim().min(1).max(500).optional(),
422
- limit: z4.number().int().min(1).max(100).default(30)
452
+ var ModelStarterCatalogQuerySchema = z6.object({
453
+ afterId: z6.string().trim().min(1).max(500).optional(),
454
+ limit: z6.number().int().min(1).max(100).default(30)
423
455
  }).strict();
424
456
  var ModelStarterCatalogItemSchema = ModelStarterSchema.extend({
425
- rewardSummary: z4.array(z4.object({ name: z4.string().min(1).max(500), kind: z4.enum(["custom_verifier", "model_judge", "human", "learned_model", "content", "schema", "artifact", "runtime_event", "state"]) }).strict()).max(100).optional()
457
+ rewardSummary: z6.array(z6.object({ name: z6.string().min(1).max(500), kind: z6.enum(["custom_verifier", "model_judge", "human", "learned_model", "content", "schema", "artifact", "runtime_event", "state"]) }).strict()).max(100).optional()
426
458
  });
427
- var ModelStarterCatalogPageSchema = z4.object({
428
- items: z4.array(ModelStarterCatalogItemSchema).max(100),
429
- nextCursor: z4.string().min(1).max(500).nullable()
459
+ var ModelStarterCatalogPageSchema = z6.object({
460
+ items: z6.array(ModelStarterCatalogItemSchema).max(100),
461
+ nextCursor: z6.string().min(1).max(500).nullable()
430
462
  }).strict();
431
- var ModelStarterCatalogErrorSchema = z4.object({ code: z4.string().min(1).max(200), message: z4.string().min(1).max(5e3) }).strict();
463
+ var ModelStarterCatalogErrorSchema = z6.object({ code: z6.string().min(1).max(200), message: z6.string().min(1).max(5e3) }).strict();
432
464
  var OpenPondModelStarterCatalogError = class extends Error {
433
465
  constructor(status, code, message) {
434
466
  super(message);