owlrunkit 0.19.2 → 0.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/CHANGELOG.md +63 -0
  2. package/README.md +94 -8
  3. package/docs/architecture/OWLCODA_RUNKIT_0201_RELEASE_TRUTH_AND_PROFILE_NORMALIZATION_PATCH_DECISION_20260813.md +95 -0
  4. package/docs/architecture/OWLCODA_RUNKIT_020_TEAM_DELIVERY_PHASE1_PRODUCT_DECISION_20260813.md +296 -0
  5. package/docs/architecture/OWLCODA_RUNKIT_021_TEAM_DELIVERY_PHASE2_PRODUCT_DECISION_20260813.md +249 -0
  6. package/integrations/codex/skills/owlcoda-runkit/SKILL.md +114 -12
  7. package/integrations/codex/skills/owlcoda-runkit/assets/templates/config.json +3 -3
  8. package/package.json +1 -1
  9. package/packages/attest/README.md +7 -1
  10. package/packages/attest/consumer-surface-v3.json +275 -0
  11. package/packages/attest/distribution-manifest-v1.json +19 -0
  12. package/packages/attest/schemas/canonical-candidate-identity-v1.schema.json +112 -0
  13. package/packages/attest/schemas/foreign-workspace-filesystem-identity-v1.schema.json +32 -0
  14. package/packages/attest/schemas/quick-verification-receipt-v4.schema.json +226 -0
  15. package/packages/attest/src/candidate-identity.mjs +454 -0
  16. package/packages/attest/src/index.mjs +11 -0
  17. package/packages/attest/src/quick-receipt-contract.mjs +126 -5
  18. package/packages/attest/src/quick.mjs +48 -8
  19. package/{registry-release-policy-v1.json → registry-release-policy-v2.json} +8 -9
  20. package/sbom.spdx.json +4 -4
  21. package/scripts/runkit-contract/core-contract.mjs +21 -1
  22. package/scripts/runkit-contract/fleet-skill-plan.mjs +223 -0
  23. package/scripts/runkit-contract/formal-workflow.mjs +3 -1
  24. package/scripts/runkit-contract/inspect-presentation.mjs +56 -0
  25. package/scripts/runkit-contract/install-codex-skill.mjs +1 -0
  26. package/scripts/runkit-contract/onboarding-bootstrap.mjs +15 -0
  27. package/scripts/runkit-contract/onboarding-doctor.mjs +201 -7
  28. package/scripts/runkit-contract/profile-onboarding.mjs +6 -0
  29. package/scripts/runkit-contract/project-cli-resolver.mjs +12 -1
  30. package/scripts/runkit-contract/quick-metrics.mjs +9 -5
  31. package/scripts/runkit-contract/quick-verify.mjs +108 -24
  32. package/scripts/runkit-contract/registry-adoption-gate.mjs +12 -3
  33. package/scripts/runkit-contract/registry-adoption.mjs +10 -5
  34. package/scripts/runkit-contract/runkit-cli.mjs +367 -20
  35. package/scripts/runkit-contract/schemas/candidate-transfer-packet-v1.schema.json +98 -0
  36. package/scripts/runkit-contract/schemas/delivery-lifecycle-v1.schema.json +91 -0
  37. package/scripts/runkit-contract/schemas/external-gate-v1.schema.json +68 -0
  38. package/scripts/runkit-contract/schemas/fleet-skill-upgrade-plan-v1.schema.json +140 -0
  39. package/scripts/runkit-contract/schemas/inspect-compact-v1.schema.json +93 -0
  40. package/scripts/runkit-contract/schemas/team-acceptance-packet-v2.schema.json +109 -0
  41. package/scripts/runkit-contract/schemas/team-delivery-status-v1.schema.json +72 -0
  42. package/scripts/runkit-contract/schemas/team-delivery-status-v2.schema.json +219 -0
  43. package/scripts/runkit-contract/schemas/team-packet-validation-v1.schema.json +33 -0
  44. package/scripts/runkit-contract/schemas/team-project-event-v6.schema.json +82 -0
  45. package/scripts/runkit-contract/schemas/team-project-event-v7.schema.json +80 -0
  46. package/scripts/runkit-contract/schemas/team-project-status-v4.schema.json +208 -0
  47. package/scripts/runkit-contract/schemas/team-recommendation-v1.schema.json +121 -0
  48. package/scripts/runkit-contract/schemas/team-task-packet-v2.schema.json +228 -0
  49. package/scripts/runkit-contract/sync-release-identity.mjs +87 -0
  50. package/scripts/runkit-contract/team-delivery.mjs +1031 -0
  51. package/scripts/runkit-contract/team-project.mjs +970 -9
@@ -29,6 +29,12 @@ import {
29
29
  parseOfflineAttestationBundle,
30
30
  } from "./offline-bundle.mjs";
31
31
  import { captureWorkspaceSnapshot } from "./workspace-snapshot.mjs";
32
+ import {
33
+ captureCanonicalCandidateIdentityV1,
34
+ captureForeignWorkspaceFilesystemIdentityV1,
35
+ validCanonicalCandidateIdentityV1,
36
+ validForeignWorkspaceFilesystemIdentityV1,
37
+ } from "./candidate-identity.mjs";
32
38
 
33
39
  function readSubject(subjectPath) {
34
40
  const { absolutePath, bytes } = readFileBytesBounded(subjectPath);
@@ -45,6 +51,7 @@ export function attestFile({ subjectPath, workspaceRoot }) {
45
51
  "OwlCodaQuickVerificationReceiptV1",
46
52
  "OwlCodaQuickVerificationReceiptV2",
47
53
  "OwlCodaQuickVerificationReceiptV3",
54
+ "OwlCodaQuickVerificationReceiptV4",
48
55
  ]).has(subject.value.schemaVersion)) {
49
56
  const details = attestQuickReceiptDetailsFromBytes({
50
57
  receiptPath: subject.absolutePath,
@@ -99,6 +106,8 @@ export {
99
106
  attestQuickReceipt,
100
107
  attestQuickReceiptDetails,
101
108
  canonicalJson,
109
+ captureCanonicalCandidateIdentityV1,
110
+ captureForeignWorkspaceFilesystemIdentityV1,
102
111
  captureWorkspaceSnapshot,
103
112
  createAttestationRef,
104
113
  createOfflineAttestationBundle,
@@ -113,5 +122,7 @@ export {
113
122
  sha256Bytes,
114
123
  sha256Canonical,
115
124
  validQuickReceiptShape,
125
+ validCanonicalCandidateIdentityV1,
126
+ validForeignWorkspaceFilesystemIdentityV1,
116
127
  verifyBundle,
117
128
  };
@@ -3,6 +3,10 @@ import {
3
3
  isSha256Ref,
4
4
  sha256Canonical,
5
5
  } from "./formal.mjs";
6
+ import {
7
+ validCanonicalCandidateIdentityV1,
8
+ validForeignWorkspaceFilesystemIdentityV1,
9
+ } from "./candidate-identity.mjs";
6
10
 
7
11
  const RECEIPT_REQUIRED_KEYS = [
8
12
  "schemaVersion",
@@ -52,6 +56,10 @@ const V3_RECEIPT_ISSUES = new Set([
52
56
  "consumer_source_mutated_during_verification",
53
57
  "quick_isolation_cleanup_failed",
54
58
  ]);
59
+ const V4_RECEIPT_ISSUES = new Set([
60
+ ...V3_RECEIPT_ISSUES,
61
+ "foreign_workspace_mutated_during_verification",
62
+ ]);
55
63
  const V3_MUTATION_DECISIONS = new Set([
56
64
  "source_unchanged",
57
65
  "invalidated_by_command_source_mutation",
@@ -61,6 +69,10 @@ const V3_MUTATION_DECISIONS = new Set([
61
69
  "invalidated_by_isolation_cleanup_failure",
62
70
  "invalidated_by_multiple_mutations",
63
71
  ]);
72
+ const V4_MUTATION_DECISIONS = new Set([
73
+ ...V3_MUTATION_DECISIONS,
74
+ "invalidated_by_foreign_workspace_mutation",
75
+ ]);
64
76
 
65
77
  function validDateTime(value) {
66
78
  return typeof value === "string"
@@ -237,6 +249,48 @@ function validMutationClasses(value) {
237
249
  && ["not_isolated", "none", "changed_and_discarded"].includes(value.consumerIgnoredArtifacts);
238
250
  }
239
251
 
252
+ function validForeignMutationClasses(value) {
253
+ return hasExactKeys(value, [
254
+ "workspaceSource",
255
+ "boundIgnoredPaths",
256
+ "dependencyEnvironment",
257
+ "consumerSource",
258
+ "consumerIgnoredArtifacts",
259
+ "foreignTarget",
260
+ ])
261
+ && ["unchanged", "changed"].includes(value.workspaceSource)
262
+ && ["not_bound", "unchanged", "changed"].includes(value.boundIgnoredPaths)
263
+ && ["not_bound", "unchanged", "changed"].includes(value.dependencyEnvironment)
264
+ && ["unchanged", "changed"].includes(value.consumerSource)
265
+ && ["none", "changed_and_discarded"].includes(value.consumerIgnoredArtifacts)
266
+ && ["unchanged", "changed"].includes(value.foreignTarget);
267
+ }
268
+
269
+ function validForeignWorkspace(value, sourceWorkspaceRoot) {
270
+ if (!hasExactKeys(value, [
271
+ "candidateBefore",
272
+ "candidateAfter",
273
+ "filesystemBefore",
274
+ "filesystemAfter",
275
+ "zeroWriteObserved",
276
+ ])) return false;
277
+ if (
278
+ !validCanonicalCandidateIdentityV1(value.candidateBefore)
279
+ || !validCanonicalCandidateIdentityV1(value.candidateAfter)
280
+ || !validForeignWorkspaceFilesystemIdentityV1(value.filesystemBefore)
281
+ || !validForeignWorkspaceFilesystemIdentityV1(value.filesystemAfter)
282
+ || value.candidateBefore.workspaceRoot !== sourceWorkspaceRoot
283
+ || value.candidateAfter.workspaceRoot !== sourceWorkspaceRoot
284
+ || value.filesystemBefore.workspaceRoot !== sourceWorkspaceRoot
285
+ || value.filesystemAfter.workspaceRoot !== sourceWorkspaceRoot
286
+ ) return false;
287
+ const unchanged = value.candidateBefore.candidateFingerprint
288
+ === value.candidateAfter.candidateFingerprint
289
+ && value.filesystemBefore.filesystemFingerprint
290
+ === value.filesystemAfter.filesystemFingerprint;
291
+ return value.zeroWriteObserved === unchanged;
292
+ }
293
+
240
294
  function validV3MutationTruth(receipt) {
241
295
  const workspaceSourceChanged = sourceStateFingerprint(receipt.workspaceBefore)
242
296
  !== sourceStateFingerprint(receipt.workspaceAfter);
@@ -283,17 +337,66 @@ function validV3MutationTruth(receipt) {
283
337
  && JSON.stringify([...receipt.issueCodes].sort()) === JSON.stringify(expectedIssues);
284
338
  }
285
339
 
340
+ function validV4MutationTruth(receipt) {
341
+ const workspaceSourceChanged = sourceStateFingerprint(receipt.workspaceBefore)
342
+ !== sourceStateFingerprint(receipt.workspaceAfter);
343
+ const boundIgnored = receipt.workspaceBefore.ignoredPathsBound === true;
344
+ const boundIgnoredChanged = boundIgnored
345
+ && receipt.workspaceBefore.ignoredPathsFingerprint
346
+ !== receipt.workspaceAfter.ignoredPathsFingerprint;
347
+ const isolation = receipt.executionIsolation;
348
+ const consumerSourceChanged = isolation.consumerDelta.sourcePaths.length > 0;
349
+ const consumerIgnoredChanged = isolation.consumerDelta.ignoredPaths.length > 0;
350
+ const dependencyBound = isolation.dependencyEnvironment !== null;
351
+ const dependencyChanged = dependencyBound
352
+ && (isolation.dependencyEnvironmentAfter === null
353
+ || isolation.dependencyEnvironmentAfter.fingerprint
354
+ !== isolation.dependencyEnvironment.fingerprint);
355
+ const cleanupFailed = isolation.cleanupStatus === "cleanup_failed";
356
+ const foreignChanged = receipt.foreignWorkspace.zeroWriteObserved !== true;
357
+ if (receipt.mutationClasses.workspaceSource !== (workspaceSourceChanged ? "changed" : "unchanged")
358
+ || receipt.mutationClasses.boundIgnoredPaths !== (boundIgnored
359
+ ? boundIgnoredChanged ? "changed" : "unchanged"
360
+ : "not_bound")
361
+ || receipt.mutationClasses.dependencyEnvironment !== (dependencyBound
362
+ ? dependencyChanged ? "changed" : "unchanged"
363
+ : "not_bound")
364
+ || receipt.mutationClasses.consumerSource !== (consumerSourceChanged ? "changed" : "unchanged")
365
+ || receipt.mutationClasses.consumerIgnoredArtifacts !== (consumerIgnoredChanged
366
+ ? "changed_and_discarded" : "none")
367
+ || receipt.mutationClasses.foreignTarget !== (foreignChanged ? "changed" : "unchanged")) {
368
+ return false;
369
+ }
370
+ const facts = [
371
+ [workspaceSourceChanged, "invalidated_by_command_source_mutation", "source_mutated_during_verification"],
372
+ [boundIgnoredChanged, "invalidated_by_bound_ignored_mutation", "bound_ignored_path_mutated_during_verification"],
373
+ [dependencyChanged, "invalidated_by_dependency_environment_mutation", "dependency_environment_mutated_during_verification"],
374
+ [consumerSourceChanged, "invalidated_by_consumer_source_mutation", "consumer_source_mutated_during_verification"],
375
+ [cleanupFailed, "invalidated_by_isolation_cleanup_failure", "quick_isolation_cleanup_failed"],
376
+ [foreignChanged, "invalidated_by_foreign_workspace_mutation", "foreign_workspace_mutated_during_verification"],
377
+ ].filter(([active]) => active);
378
+ const expectedDecision = facts.length === 0
379
+ ? "source_unchanged"
380
+ : facts.length === 1 ? facts[0][1] : "invalidated_by_multiple_mutations";
381
+ const expectedIssues = facts.map(([, , issue]) => issue).sort();
382
+ return receipt.mutationDecision === expectedDecision
383
+ && JSON.stringify([...receipt.issueCodes].sort()) === JSON.stringify(expectedIssues);
384
+ }
385
+
286
386
  export function validQuickReceiptShape(receipt) {
287
387
  const receiptV1 = receipt?.schemaVersion === "OwlCodaQuickVerificationReceiptV1";
288
388
  const receiptV2 = receipt?.schemaVersion === "OwlCodaQuickVerificationReceiptV2";
289
389
  const receiptV3 = receipt?.schemaVersion === "OwlCodaQuickVerificationReceiptV3";
290
- const requiredKeys = receiptV3
390
+ const receiptV4 = receipt?.schemaVersion === "OwlCodaQuickVerificationReceiptV4";
391
+ const requiredKeys = receiptV4
392
+ ? [...RECEIPT_REQUIRED_KEYS, "controllerWorkspaceRoot", "sourceWorkspaceRoot", "executionIsolation", "mutationClasses", "foreignWorkspace"]
393
+ : receiptV3
291
394
  ? [...RECEIPT_REQUIRED_KEYS, "sourceWorkspaceRoot", "executionIsolation", "mutationClasses"]
292
395
  : receiptV2
293
396
  ? [...RECEIPT_REQUIRED_KEYS, "inputArtifacts"]
294
397
  : RECEIPT_REQUIRED_KEYS;
295
- const optionalKeys = receiptV3 ? ["inputArtifacts", "signatureRef"] : ["signatureRef"];
296
- if (!(receiptV1 || receiptV2 || receiptV3) || !hasExactKeys(receipt, requiredKeys, optionalKeys)) return false;
398
+ const optionalKeys = receiptV3 || receiptV4 ? ["inputArtifacts", "signatureRef"] : ["signatureRef"];
399
+ if (!(receiptV1 || receiptV2 || receiptV3 || receiptV4) || !hasExactKeys(receipt, requiredKeys, optionalKeys)) return false;
297
400
  if (
298
401
  typeof receipt.receiptId !== "string"
299
402
  || receipt.receiptId.length === 0
@@ -320,13 +423,15 @@ export function validQuickReceiptShape(receipt) {
320
423
  || !hasExactKeys(receipt.outputArtifacts, ["stdout", "stderr"])
321
424
  || !validOutputArtifact(receipt.outputArtifacts.stdout)
322
425
  || !validOutputArtifact(receipt.outputArtifacts.stderr)
323
- || !(receiptV3
426
+ || !(receiptV4
427
+ ? V4_MUTATION_DECISIONS.has(receipt.mutationDecision)
428
+ : receiptV3
324
429
  ? V3_MUTATION_DECISIONS.has(receipt.mutationDecision)
325
430
  : ["source_unchanged", "invalidated_by_command_source_mutation"].includes(receipt.mutationDecision))
326
431
  || !Array.isArray(receipt.issueCodes)
327
432
  || new Set(receipt.issueCodes).size !== receipt.issueCodes.length
328
433
  || !receipt.issueCodes.every((entry) => typeof entry === "string"
329
- && (receiptV3 ? V3_RECEIPT_ISSUES : KNOWN_RECEIPT_ISSUES).has(entry))
434
+ && (receiptV4 ? V4_RECEIPT_ISSUES : receiptV3 ? V3_RECEIPT_ISSUES : KNOWN_RECEIPT_ISSUES).has(entry))
330
435
  ) {
331
436
  return false;
332
437
  }
@@ -348,6 +453,22 @@ export function validQuickReceiptShape(receipt) {
348
453
  )) {
349
454
  return false;
350
455
  }
456
+ if (receiptV4 && (
457
+ typeof receipt.controllerWorkspaceRoot !== "string"
458
+ || receipt.controllerWorkspaceRoot.length === 0
459
+ || typeof receipt.sourceWorkspaceRoot !== "string"
460
+ || receipt.sourceWorkspaceRoot.length === 0
461
+ || receipt.controllerWorkspaceRoot === receipt.sourceWorkspaceRoot
462
+ || !validForeignMutationClasses(receipt.mutationClasses)
463
+ || !validExecutionIsolation(receipt.executionIsolation, receipt)
464
+ || !validForeignWorkspace(receipt.foreignWorkspace, receipt.sourceWorkspaceRoot)
465
+ || receipt.inputArtifacts !== undefined
466
+ && (!hasExactKeys(receipt.inputArtifacts, ["stdin"])
467
+ || !validOutputArtifact(receipt.inputArtifacts.stdin))
468
+ || !validV4MutationTruth(receipt)
469
+ )) {
470
+ return false;
471
+ }
351
472
  if (receipt.signatureRef !== undefined) {
352
473
  if (!hasExactKeys(receipt.signatureRef, ["path", "sha256"])
353
474
  || typeof receipt.signatureRef.path !== "string"
@@ -15,10 +15,29 @@ import {
15
15
  } from "./quick-receipt-contract.mjs";
16
16
  import { captureDependencyEnvironment } from "./dependency-environment.mjs";
17
17
  import { captureWorkspaceSnapshot } from "./workspace-snapshot.mjs";
18
+ import {
19
+ captureCanonicalCandidateIdentityV1,
20
+ captureForeignWorkspaceFilesystemIdentityV1,
21
+ } from "./candidate-identity.mjs";
18
22
 
19
23
  export { validQuickReceiptShape } from "./quick-receipt-contract.mjs";
20
24
 
21
25
  export const SUPPORTED_QUICK_CORE_IDENTITIES = Object.freeze([
26
+ {
27
+ contractVersion: "0.2",
28
+ coreVersion: "0.21.0",
29
+ coreManifestSha256: "sha256:f85b9bf8c32705d5f5dfebdb653e83ac8d1ac0468214c17f230cbd2de04246fd",
30
+ },
31
+ {
32
+ contractVersion: "0.2",
33
+ coreVersion: "0.20.1",
34
+ coreManifestSha256: "sha256:8af2b9792731efa37f596255a7677dcec6e2fd3cc079dfdb0e6ff29e8017e784",
35
+ },
36
+ {
37
+ contractVersion: "0.2",
38
+ coreVersion: "0.20.0",
39
+ coreManifestSha256: "sha256:30098aa9344c17c1ed0b5ed45ef1c590b3214b824402f584029c1ecb38ca7a70",
40
+ },
22
41
  {
23
42
  contractVersion: "0.2",
24
43
  coreVersion: "0.19.2",
@@ -266,19 +285,25 @@ function attestQuickReceiptDetailsFromBytesWithCatalog({
266
285
  const selectedWorkspaceRoot = workspaceRoot === undefined
267
286
  ? undefined
268
287
  : realpathSync(workspaceRoot);
288
+ const foreignReceipt = receipt.schemaVersion === "OwlCodaQuickVerificationReceiptV4";
269
289
  if (selectedWorkspaceRoot === undefined) {
270
290
  issues.push("current_workspace_not_checked");
271
291
  }
272
292
  let receiptWorkspaceRoot;
293
+ let receiptSourceRoot;
273
294
  if (selectedWorkspaceRoot !== undefined) {
274
295
  try {
275
- receiptWorkspaceRoot = realpathSync(
276
- receipt.schemaVersion === "OwlCodaQuickVerificationReceiptV3"
296
+ receiptWorkspaceRoot = realpathSync(foreignReceipt
297
+ ? receipt.controllerWorkspaceRoot
298
+ : receipt.schemaVersion === "OwlCodaQuickVerificationReceiptV3"
277
299
  ? receipt.sourceWorkspaceRoot
278
- : receipt.exactCommand.cwd,
279
- );
300
+ : receipt.exactCommand.cwd);
301
+ receiptSourceRoot = realpathSync(foreignReceipt
302
+ ? receipt.sourceWorkspaceRoot
303
+ : receiptWorkspaceRoot);
280
304
  } catch {
281
305
  receiptWorkspaceRoot = undefined;
306
+ receiptSourceRoot = undefined;
282
307
  }
283
308
  }
284
309
  const commandWorkspaceMatches = selectedWorkspaceRoot !== undefined
@@ -312,10 +337,25 @@ function attestQuickReceiptDetailsFromBytesWithCatalog({
312
337
  const ignoredPaths = receipt.workspaceAfter.ignoredPathsBound === true
313
338
  ? receipt.workspaceAfter.ignoredPathBindings.map(entry => entry.path)
314
339
  : [];
315
- const currentSourceValid = selectedWorkspaceRoot === undefined
316
- || commandWorkspaceMatches
317
- && captureWorkspaceSnapshot(selectedWorkspaceRoot, { ignoredPaths }).sourceFingerprint
318
- === receipt.workspaceAfter.sourceFingerprint;
340
+ let currentSourceValid = selectedWorkspaceRoot === undefined;
341
+ if (selectedWorkspaceRoot !== undefined && commandWorkspaceMatches && receiptSourceRoot !== undefined) {
342
+ try {
343
+ currentSourceValid = captureWorkspaceSnapshot(receiptSourceRoot, { ignoredPaths }).sourceFingerprint
344
+ === receipt.workspaceAfter.sourceFingerprint;
345
+ if (foreignReceipt) {
346
+ const currentCandidate = captureCanonicalCandidateIdentityV1(receiptSourceRoot);
347
+ const currentFilesystem = captureForeignWorkspaceFilesystemIdentityV1(receiptSourceRoot);
348
+ currentSourceValid = currentSourceValid
349
+ && receipt.foreignWorkspace.zeroWriteObserved === true
350
+ && currentCandidate.candidateFingerprint
351
+ === receipt.foreignWorkspace.candidateAfter.candidateFingerprint
352
+ && currentFilesystem.filesystemFingerprint
353
+ === receipt.foreignWorkspace.filesystemAfter.filesystemFingerprint;
354
+ }
355
+ } catch {
356
+ currentSourceValid = false;
357
+ }
358
+ }
319
359
  const dependencyEnvironmentValid = dependencyEnvironmentCurrent(
320
360
  receipt.executionIsolation?.dependencyEnvironment,
321
361
  materials,
@@ -1,8 +1,8 @@
1
1
  {
2
- "schemaVersion": "OwlCodaRunKitRegistryReleasePolicyV1",
3
- "status": "release_candidate_unpublished",
2
+ "schemaVersion": "OwlCodaRunKitRegistryReleasePolicyV2",
3
+ "status": "release_artifact_registry_gated",
4
4
  "packageName": "owlrunkit",
5
- "candidateVersion": "0.19.2",
5
+ "artifactVersion": "0.21.0",
6
6
  "registry": "https://registry.npmjs.org",
7
7
  "registryRequiredBeforeAdoption": true,
8
8
  "exactVersionRequired": true,
@@ -21,14 +21,13 @@
21
21
  "symlink",
22
22
  "workspace"
23
23
  ],
24
- "currentPublishedRelease": {
24
+ "rollbackRelease": {
25
25
  "packageName": "owlrunkit",
26
- "version": "0.19.1",
27
- "shasum": "e14aac84fb680ec9051d786bc84848c8f3ca0ca4",
28
- "integrity": "sha512-I9sd41tD4kDXz8fOuZqMC06JOmofFDitveInGOPbsGJH5HCp7oa+dMdBCSO2KJjdfsVDXoiOPiTpxfahbTUfrg==",
29
- "tarballUrl": "https://registry.npmjs.org/owlrunkit/-/owlrunkit-0.19.1.tgz"
26
+ "version": "0.20.0",
27
+ "shasum": "b123f5ea33a4f500961a0df3226ed0ca409d111d",
28
+ "integrity": "sha512-VcXUh+q8DwR6RoO9JDoUMEzFrpFRBpSvpqgHvIY15Z+Oo+A31Ij2kFO5wCFki80nd6Tl/YT70t7UV2aG0TZ0GQ==",
29
+ "tarballUrl": "https://registry.npmjs.org/owlrunkit/-/owlrunkit-0.20.0.tgz"
30
30
  },
31
- "registryRelease": null,
32
31
  "registryEvidenceMustBeExternal": true,
33
32
  "registryEvidenceSchemaVersion": "OwlCodaRunKitRegistryReleaseEvidenceV1",
34
33
  "embeddedAttestComponentVersion": "0.2.0",
package/sbom.spdx.json CHANGED
@@ -2,8 +2,8 @@
2
2
  "spdxVersion": "SPDX-2.3",
3
3
  "dataLicense": "CC0-1.0",
4
4
  "SPDXID": "SPDXRef-DOCUMENT",
5
- "name": "owlrunkit-0.19.2",
6
- "documentNamespace": "https://owlcoda.com/spdx/owlrunkit/0.19.2",
5
+ "name": "owlrunkit-0.21.0",
6
+ "documentNamespace": "https://owlcoda.com/spdx/owlrunkit/0.21.0",
7
7
  "creationInfo": {
8
8
  "created": "2026-07-29T00:00:00Z",
9
9
  "creators": [
@@ -14,7 +14,7 @@
14
14
  {
15
15
  "name": "owlrunkit",
16
16
  "SPDXID": "SPDXRef-Package-OwlRunKit",
17
- "versionInfo": "0.19.2",
17
+ "versionInfo": "0.21.0",
18
18
  "downloadLocation": "NOASSERTION",
19
19
  "filesAnalyzed": false,
20
20
  "licenseConcluded": "GPL-3.0-or-later",
@@ -24,7 +24,7 @@
24
24
  {
25
25
  "referenceCategory": "PACKAGE-MANAGER",
26
26
  "referenceType": "purl",
27
- "referenceLocator": "pkg:npm/owlrunkit@0.19.2"
27
+ "referenceLocator": "pkg:npm/owlrunkit@0.21.0"
28
28
  }
29
29
  ]
30
30
  }
@@ -14,7 +14,7 @@ import { fileURLToPath } from "node:url";
14
14
  import { parseProjectControlState } from "./project-control-parser.mjs";
15
15
 
16
16
  export const CONTRACT_VERSION = "0.2";
17
- export const CORE_VERSION = "0.19.2";
17
+ export const CORE_VERSION = "0.21.0";
18
18
  export const RUNTIME_ROOT = ".owlcoda/runkit";
19
19
 
20
20
  const CORE_FILES = [
@@ -28,6 +28,7 @@ const CORE_FILES = [
28
28
  "deployment-workflow.mjs",
29
29
  "efficiency-metrics.mjs",
30
30
  "fleet-discovery.mjs",
31
+ "fleet-skill-plan.mjs",
31
32
  "finalize.mjs",
32
33
  "formal-workflow.mjs",
33
34
  "formal-preflight.mjs",
@@ -78,6 +79,7 @@ const CORE_FILES = [
78
79
  "sync-release-identity.mjs",
79
80
  "team-project-successor.mjs",
80
81
  "team-project.mjs",
82
+ "team-delivery.mjs",
81
83
  "usage-mode.mjs",
82
84
  "verification-envelope.mjs",
83
85
  "verification-envelope-check.mjs",
@@ -106,11 +108,13 @@ const CORE_FILES = [
106
108
  "schemas/fleet-discovery-v1.schema.json",
107
109
  "schemas/fleet-manifest-v1.schema.json",
108
110
  "schemas/fleet-root-registry-v1.schema.json",
111
+ "schemas/fleet-skill-upgrade-plan-v1.schema.json",
109
112
  "schemas/formal-check-v2.schema.json",
110
113
  "schemas/formal-envelope-preflight-v1.schema.json",
111
114
  "schemas/formal-evidence-summary-v1.schema.json",
112
115
  "schemas/formal-supplemental-evidence-v1.schema.json",
113
116
  "schemas/human-status-v1.schema.json",
117
+ "schemas/inspect-compact-v1.schema.json",
114
118
  "schemas/onboarding-bootstrap-plan-v1.schema.json",
115
119
  "schemas/onboarding-bootstrap-receipt-v1.schema.json",
116
120
  "schemas/outcome-summary-v1.schema.json",
@@ -146,6 +150,13 @@ const CORE_FILES = [
146
150
  "schemas/runtime-transition-receipt-v1.schema.json",
147
151
  "schemas/snapshot-v1.schema.json",
148
152
  "schemas/source-candidate-v2.schema.json",
153
+ "schemas/candidate-transfer-packet-v1.schema.json",
154
+ "schemas/team-acceptance-packet-v2.schema.json",
155
+ "schemas/team-delivery-status-v1.schema.json",
156
+ "schemas/team-delivery-status-v2.schema.json",
157
+ "schemas/team-packet-validation-v1.schema.json",
158
+ "schemas/team-recommendation-v1.schema.json",
159
+ "schemas/team-task-packet-v2.schema.json",
149
160
  "schemas/visual-smoke-request-v1.schema.json",
150
161
  "schemas/visual-smoke-result-v1.schema.json",
151
162
  "schemas/verification-context-v1.schema.json",
@@ -155,10 +166,15 @@ const CORE_FILES = [
155
166
  "schemas/team-project-event-v3.schema.json",
156
167
  "schemas/team-project-event-v4.schema.json",
157
168
  "schemas/team-project-event-v5.schema.json",
169
+ "schemas/team-project-event-v6.schema.json",
170
+ "schemas/team-project-event-v7.schema.json",
158
171
  "schemas/team-project-successor-receipt-v1.schema.json",
159
172
  "schemas/team-project-status-v1.schema.json",
160
173
  "schemas/team-project-status-v2.schema.json",
161
174
  "schemas/team-project-status-v3.schema.json",
175
+ "schemas/team-project-status-v4.schema.json",
176
+ "schemas/external-gate-v1.schema.json",
177
+ "schemas/delivery-lifecycle-v1.schema.json",
162
178
  "schemas/usage-mode-recommendation-v1.schema.json",
163
179
  "schemas/usage-mode-recommendation-v2.schema.json",
164
180
  "schemas/verification-envelope-v1.schema.json",
@@ -192,10 +208,14 @@ const CORE_FILES = [
192
208
  ];
193
209
 
194
210
  const CORE_DEPENDENCY_FILES = [
211
+ "packages/attest/src/candidate-identity.mjs",
195
212
  "packages/attest/src/dependency-environment.mjs",
213
+ "packages/attest/schemas/canonical-candidate-identity-v1.schema.json",
214
+ "packages/attest/schemas/foreign-workspace-filesystem-identity-v1.schema.json",
196
215
  "packages/attest/schemas/workspace-snapshot-v1.schema.json",
197
216
  "packages/attest/schemas/workspace-snapshot-v2.schema.json",
198
217
  "packages/attest/schemas/quick-verification-receipt-v3.schema.json",
218
+ "packages/attest/schemas/quick-verification-receipt-v4.schema.json",
199
219
  "packages/attest/src/formal.mjs",
200
220
  "packages/attest/src/offline-bundle.mjs",
201
221
  "packages/attest/src/quick-receipt-contract.mjs",