owlrunkit 0.18.2 → 0.18.4

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 (40) hide show
  1. package/CHANGELOG.md +63 -0
  2. package/README.md +159 -52
  3. package/docs/architecture/OWLCODA_RUNKIT_0184_EXTERNAL_DELIVERY_INTAKE_PRODUCT_DECISION_20260812.md +209 -0
  4. package/docs/architecture/OWLCODA_RUNKIT_018_PROJECT_DRIVER_PRODUCT_DEFINITION.md +16 -5
  5. package/docs/architecture/OWLCODA_RUNKIT_USAGE_MODE_SELECTION_PRODUCT_DECISION_20260811.md +54 -3
  6. package/docs/architecture/OWLCODA_RUN_KIT_CONTRACT_V0_2.md +7 -0
  7. package/integrations/codex/skills/owlcoda-runkit/SKILL.md +125 -74
  8. package/integrations/codex/skills/owlcoda-runkit/assets/templates/config.json +3 -3
  9. package/integrations/codex/skills/owlcoda-runkit/references/contract-v0.1.md +160 -0
  10. package/integrations/codex/skills/owlcoda-runkit/references/contract-v0.2.md +545 -0
  11. package/package.json +1 -1
  12. package/packages/attest/README.md +4 -3
  13. package/packages/attest/consumer-surface-v1.json +1 -0
  14. package/packages/attest/distribution-manifest-v1.json +12 -1
  15. package/packages/attest/schemas/quick-verification-receipt-v2.schema.json +232 -0
  16. package/packages/attest/src/index.mjs +4 -1
  17. package/packages/attest/src/quick-receipt-contract.mjs +16 -6
  18. package/packages/attest/src/quick.mjs +21 -2
  19. package/packages/attest/src/workspace-snapshot.mjs +10 -1
  20. package/registry-release-policy-v1.json +5 -5
  21. package/sbom.spdx.json +5 -5
  22. package/scripts/runkit-contract/assurance-router.mjs +25 -6
  23. package/scripts/runkit-contract/core-contract.mjs +10 -1
  24. package/scripts/runkit-contract/onboarding-doctor.mjs +1 -1
  25. package/scripts/runkit-contract/profile-onboarding.mjs +263 -15
  26. package/scripts/runkit-contract/project-cli-resolver.mjs +6 -0
  27. package/scripts/runkit-contract/project-external-delivery.mjs +707 -0
  28. package/scripts/runkit-contract/quick-metrics.mjs +3 -3
  29. package/scripts/runkit-contract/quick-receipt.mjs +79 -12
  30. package/scripts/runkit-contract/quick-verify.mjs +89 -12
  31. package/scripts/runkit-contract/runkit-bootstrap.mjs +6 -1
  32. package/scripts/runkit-contract/runkit-cli.mjs +363 -143
  33. package/scripts/runkit-contract/schemas/assurance-route-v2.schema.json +26 -0
  34. package/scripts/runkit-contract/schemas/profile-detection-v3.schema.json +170 -0
  35. package/scripts/runkit-contract/schemas/team-project-event-v2.schema.json +128 -0
  36. package/scripts/runkit-contract/schemas/team-project-event-v3.schema.json +146 -0
  37. package/scripts/runkit-contract/schemas/team-project-status-v2.schema.json +85 -0
  38. package/scripts/runkit-contract/schemas/usage-mode-recommendation-v2.schema.json +136 -0
  39. package/scripts/runkit-contract/team-project.mjs +782 -55
  40. package/scripts/runkit-contract/usage-mode.mjs +28 -7
@@ -0,0 +1,232 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://owlcoda.dev/schemas/runkit/trust/quick-verification-receipt-v2.schema.json",
4
+ "title": "OwlCoda Quick Verification Receipt V2",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": [
8
+ "schemaVersion",
9
+ "receiptId",
10
+ "assurance",
11
+ "authorizationGranted",
12
+ "coreIdentity",
13
+ "workspaceBefore",
14
+ "exactCommand",
15
+ "inputArtifacts",
16
+ "verificationContext",
17
+ "startedAt",
18
+ "finishedAt",
19
+ "exitResult",
20
+ "outputArtifacts",
21
+ "workspaceAfter",
22
+ "mutationDecision",
23
+ "issueCodes"
24
+ ],
25
+ "properties": {
26
+ "schemaVersion": {
27
+ "const": "OwlCodaQuickVerificationReceiptV2"
28
+ },
29
+ "receiptId": {
30
+ "type": "string",
31
+ "minLength": 1
32
+ },
33
+ "assurance": {
34
+ "const": "captured_verification"
35
+ },
36
+ "authorizationGranted": {
37
+ "const": false
38
+ },
39
+ "coreIdentity": {
40
+ "type": "object",
41
+ "additionalProperties": false,
42
+ "required": [
43
+ "contractVersion",
44
+ "coreVersion",
45
+ "coreManifestSha256"
46
+ ],
47
+ "properties": {
48
+ "contractVersion": {
49
+ "type": "string",
50
+ "minLength": 1
51
+ },
52
+ "coreVersion": {
53
+ "type": "string",
54
+ "minLength": 1
55
+ },
56
+ "coreManifestSha256": {
57
+ "type": "string",
58
+ "pattern": "^sha256:[0-9a-f]{64}$"
59
+ }
60
+ }
61
+ },
62
+ "workspaceBefore": {
63
+ "$ref": "workspace-snapshot-v1.schema.json"
64
+ },
65
+ "exactCommand": {
66
+ "type": "object",
67
+ "additionalProperties": false,
68
+ "required": [
69
+ "executable",
70
+ "argv",
71
+ "cwd"
72
+ ],
73
+ "properties": {
74
+ "executable": {
75
+ "type": "string",
76
+ "minLength": 1
77
+ },
78
+ "argv": {
79
+ "type": "array",
80
+ "items": {
81
+ "type": "string"
82
+ }
83
+ },
84
+ "cwd": {
85
+ "type": "string",
86
+ "minLength": 1
87
+ }
88
+ }
89
+ },
90
+ "inputArtifacts": {
91
+ "type": "object",
92
+ "additionalProperties": false,
93
+ "required": [
94
+ "stdin"
95
+ ],
96
+ "properties": {
97
+ "stdin": {
98
+ "$ref": "#/$defs/materialArtifact"
99
+ }
100
+ }
101
+ },
102
+ "verificationContext": {
103
+ "type": "object",
104
+ "additionalProperties": false,
105
+ "required": [
106
+ "platform",
107
+ "architecture",
108
+ "runtime"
109
+ ],
110
+ "properties": {
111
+ "platform": {
112
+ "type": "string",
113
+ "minLength": 1
114
+ },
115
+ "architecture": {
116
+ "type": "string",
117
+ "minLength": 1
118
+ },
119
+ "runtime": {
120
+ "type": "string",
121
+ "minLength": 1
122
+ }
123
+ }
124
+ },
125
+ "startedAt": {
126
+ "type": "string",
127
+ "format": "date-time"
128
+ },
129
+ "finishedAt": {
130
+ "type": "string",
131
+ "format": "date-time"
132
+ },
133
+ "exitResult": {
134
+ "type": "object",
135
+ "additionalProperties": false,
136
+ "required": [
137
+ "exitCode",
138
+ "signal"
139
+ ],
140
+ "properties": {
141
+ "exitCode": {
142
+ "type": [
143
+ "integer",
144
+ "null"
145
+ ]
146
+ },
147
+ "signal": {
148
+ "type": [
149
+ "string",
150
+ "null"
151
+ ]
152
+ }
153
+ }
154
+ },
155
+ "outputArtifacts": {
156
+ "type": "object",
157
+ "additionalProperties": false,
158
+ "required": [
159
+ "stdout",
160
+ "stderr"
161
+ ],
162
+ "properties": {
163
+ "stdout": {
164
+ "$ref": "#/$defs/materialArtifact"
165
+ },
166
+ "stderr": {
167
+ "$ref": "#/$defs/materialArtifact"
168
+ }
169
+ }
170
+ },
171
+ "workspaceAfter": {
172
+ "$ref": "workspace-snapshot-v1.schema.json"
173
+ },
174
+ "mutationDecision": {
175
+ "enum": [
176
+ "source_unchanged",
177
+ "invalidated_by_command_source_mutation"
178
+ ]
179
+ },
180
+ "issueCodes": {
181
+ "type": "array",
182
+ "uniqueItems": true,
183
+ "items": {
184
+ "type": "string",
185
+ "minLength": 1
186
+ }
187
+ },
188
+ "signatureRef": {
189
+ "type": "object",
190
+ "additionalProperties": false,
191
+ "required": [
192
+ "path",
193
+ "sha256"
194
+ ],
195
+ "properties": {
196
+ "path": {
197
+ "type": "string",
198
+ "minLength": 1
199
+ },
200
+ "sha256": {
201
+ "type": "string",
202
+ "pattern": "^sha256:[0-9a-f]{64}$"
203
+ }
204
+ }
205
+ }
206
+ },
207
+ "$defs": {
208
+ "materialArtifact": {
209
+ "type": "object",
210
+ "additionalProperties": false,
211
+ "required": [
212
+ "path",
213
+ "sha256",
214
+ "sizeBytes"
215
+ ],
216
+ "properties": {
217
+ "path": {
218
+ "type": "string",
219
+ "minLength": 1
220
+ },
221
+ "sha256": {
222
+ "type": "string",
223
+ "pattern": "^sha256:[0-9a-f]{64}$"
224
+ },
225
+ "sizeBytes": {
226
+ "type": "integer",
227
+ "minimum": 0
228
+ }
229
+ }
230
+ }
231
+ }
232
+ }
@@ -41,7 +41,10 @@ function readSubject(subjectPath) {
41
41
 
42
42
  export function attestFile({ subjectPath, workspaceRoot }) {
43
43
  const subject = readSubject(subjectPath);
44
- if (subject.value.schemaVersion === "OwlCodaQuickVerificationReceiptV1") {
44
+ if (new Set([
45
+ "OwlCodaQuickVerificationReceiptV1",
46
+ "OwlCodaQuickVerificationReceiptV2",
47
+ ]).has(subject.value.schemaVersion)) {
45
48
  const details = attestQuickReceiptDetailsFromBytes({
46
49
  receiptPath: subject.absolutePath,
47
50
  receiptBytes: subject.bytes,
@@ -54,7 +54,7 @@ function validCoreIdentity(value) {
54
54
  && isSha256Ref(value.coreManifestSha256);
55
55
  }
56
56
 
57
- function validSnapshot(value) {
57
+ export function validWorkspaceSnapshotShape(value) {
58
58
  if (!hasExactKeys(value, SNAPSHOT_REQUIRED_KEYS)) return false;
59
59
  if (
60
60
  value.schemaVersion !== "OwlCodaWorkspaceSnapshotV1"
@@ -110,16 +110,20 @@ function validOutputArtifact(value) {
110
110
  }
111
111
 
112
112
  export function validQuickReceiptShape(receipt) {
113
- if (!hasExactKeys(receipt, RECEIPT_REQUIRED_KEYS, ["signatureRef"])) return false;
113
+ const receiptV1 = receipt?.schemaVersion === "OwlCodaQuickVerificationReceiptV1";
114
+ const receiptV2 = receipt?.schemaVersion === "OwlCodaQuickVerificationReceiptV2";
115
+ const requiredKeys = receiptV2
116
+ ? [...RECEIPT_REQUIRED_KEYS, "inputArtifacts"]
117
+ : RECEIPT_REQUIRED_KEYS;
118
+ if (!(receiptV1 || receiptV2) || !hasExactKeys(receipt, requiredKeys, ["signatureRef"])) return false;
114
119
  if (
115
- receipt.schemaVersion !== "OwlCodaQuickVerificationReceiptV1"
116
- || typeof receipt.receiptId !== "string"
120
+ typeof receipt.receiptId !== "string"
117
121
  || receipt.receiptId.length === 0
118
122
  || receipt.assurance !== "captured_verification"
119
123
  || receipt.authorizationGranted !== false
120
124
  || !validCoreIdentity(receipt.coreIdentity)
121
- || !validSnapshot(receipt.workspaceBefore)
122
- || !validSnapshot(receipt.workspaceAfter)
125
+ || !validWorkspaceSnapshotShape(receipt.workspaceBefore)
126
+ || !validWorkspaceSnapshotShape(receipt.workspaceAfter)
123
127
  || !hasExactKeys(receipt.exactCommand, ["executable", "argv", "cwd"])
124
128
  || typeof receipt.exactCommand.executable !== "string"
125
129
  || receipt.exactCommand.executable.length === 0
@@ -145,6 +149,12 @@ export function validQuickReceiptShape(receipt) {
145
149
  ) {
146
150
  return false;
147
151
  }
152
+ if (receiptV2 && (
153
+ !hasExactKeys(receipt.inputArtifacts, ["stdin"])
154
+ || !validOutputArtifact(receipt.inputArtifacts.stdin)
155
+ )) {
156
+ return false;
157
+ }
148
158
  if (receipt.signatureRef !== undefined) {
149
159
  if (!hasExactKeys(receipt.signatureRef, ["path", "sha256"])
150
160
  || typeof receipt.signatureRef.path !== "string"
@@ -18,6 +18,16 @@ import { captureWorkspaceSnapshot } from "./workspace-snapshot.mjs";
18
18
  export { validQuickReceiptShape } from "./quick-receipt-contract.mjs";
19
19
 
20
20
  export const SUPPORTED_QUICK_CORE_IDENTITIES = Object.freeze([
21
+ {
22
+ contractVersion: "0.2",
23
+ coreVersion: "0.18.4",
24
+ coreManifestSha256: "sha256:372d4c247e4b40b0fd2f3fe0f5bf928548095bfb7e2e92e9ac66790e2717f77d",
25
+ },
26
+ {
27
+ contractVersion: "0.2",
28
+ coreVersion: "0.18.3",
29
+ coreManifestSha256: "sha256:cc7a923649592084150828f24f0d90f280af92514bafdbc4999f4015b3175d5c",
30
+ },
21
31
  {
22
32
  contractVersion: "0.2",
23
33
  coreVersion: "0.18.2",
@@ -194,7 +204,11 @@ export function attestQuickReceiptDetailsFromBytes({
194
204
  throw error;
195
205
  }
196
206
 
197
- const issues = [...receipt.issueCodes, "signature_absent", "anchor_absent"];
207
+ const issues = [
208
+ ...receipt.issueCodes.filter((issue) => issue !== "quick_ignored_artifact_unbound"),
209
+ "signature_absent",
210
+ "anchor_absent",
211
+ ];
198
212
  const materials = [];
199
213
  let materialMissing = false;
200
214
  let materialMismatch = false;
@@ -233,7 +247,12 @@ export function attestQuickReceiptDetailsFromBytes({
233
247
  const commandWorkspaceMatches = selectedWorkspaceRoot !== undefined
234
248
  && receiptWorkspaceRoot === selectedWorkspaceRoot;
235
249
  if (commandWorkspaceMatches) {
236
- for (const artifact of [receipt.outputArtifacts.stdout, receipt.outputArtifacts.stderr]) {
250
+ const boundArtifacts = [
251
+ ...(receipt.inputArtifacts === undefined ? [] : [receipt.inputArtifacts.stdin]),
252
+ receipt.outputArtifacts.stdout,
253
+ receipt.outputArtifacts.stderr,
254
+ ];
255
+ for (const artifact of boundArtifacts) {
237
256
  try {
238
257
  const materialPath = resolveBoundMaterial(receiptWorkspaceRoot, artifact.path);
239
258
  const { bytes } = readFileBytesBounded(materialPath);
@@ -76,7 +76,16 @@ function parseStatus(root) {
76
76
  if (!field) continue;
77
77
  const status = field.slice(0, 2);
78
78
  const currentPath = normalizePath(field.slice(3));
79
- if (status.includes("R") || status.includes("C")) index += 1;
79
+ let priorPath = null;
80
+ if (status.includes("R") || status.includes("C")) {
81
+ const prior = fields[index + 1];
82
+ if (!prior) throw new Error("Git status rename entry is incomplete.");
83
+ priorPath = normalizePath(prior);
84
+ index += 1;
85
+ }
86
+ if (status.includes("R") && priorPath && !isControlPath(priorPath)) {
87
+ entries.set(priorPath, { path: priorPath, state: "deleted", sha256: null });
88
+ }
80
89
  if (!currentPath || isControlPath(currentPath)) continue;
81
90
  let state = "modified";
82
91
  if (status === "??") state = "untracked";
@@ -2,7 +2,7 @@
2
2
  "schemaVersion": "OwlCodaRunKitRegistryReleasePolicyV1",
3
3
  "status": "release_candidate_unpublished",
4
4
  "packageName": "owlrunkit",
5
- "candidateVersion": "0.18.2",
5
+ "candidateVersion": "0.18.4",
6
6
  "registry": "https://registry.npmjs.org",
7
7
  "registryRequiredBeforeAdoption": true,
8
8
  "exactVersionRequired": true,
@@ -23,10 +23,10 @@
23
23
  ],
24
24
  "currentPublishedRelease": {
25
25
  "packageName": "owlrunkit",
26
- "version": "0.18.1",
27
- "shasum": "6d35c15f90ed775c583356754b831856d1a3c0a6",
28
- "integrity": "sha512-07wWnSfY6RUavcb+ZpUbZ1S0nBjN7/8VIFHyP6blOB+PIrDnnST/8f7CoLgADYpfwjZiF5gR9U6XFwXa0kgVrg==",
29
- "tarballUrl": "https://registry.npmjs.org/owlrunkit/-/owlrunkit-0.18.1.tgz"
26
+ "version": "0.18.3",
27
+ "shasum": "f8ba5ab3d426aea21bbdd8f459fd3dd5e89ff08a",
28
+ "integrity": "sha512-zcsWY8sSKW1uJpa28VDqBx9coEMYnADKix9sr0rPz+kyoV6K/NDHHRMPx+24oFDKH9zVFaNyVyq5OAgoaMm8/Q==",
29
+ "tarballUrl": "https://registry.npmjs.org/owlrunkit/-/owlrunkit-0.18.3.tgz"
30
30
  },
31
31
  "registryRelease": null,
32
32
  "registryEvidenceMustBeExternal": true,
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.18.2",
6
- "documentNamespace": "https://owlcoda.com/spdx/owlrunkit/0.18.2",
5
+ "name": "owlrunkit-0.18.4",
6
+ "documentNamespace": "https://owlcoda.com/spdx/owlrunkit/0.18.4",
7
7
  "creationInfo": {
8
8
  "created": "2026-07-29T00:00:00Z",
9
9
  "creators": [
@@ -14,8 +14,8 @@
14
14
  {
15
15
  "name": "owlrunkit",
16
16
  "SPDXID": "SPDXRef-Package-OwlRunKit",
17
- "versionInfo": "0.18.2",
18
- "downloadLocation": "https://registry.npmjs.org/owlrunkit/-/owlrunkit-0.18.2.tgz",
17
+ "versionInfo": "0.18.4",
18
+ "downloadLocation": "https://registry.npmjs.org/owlrunkit/-/owlrunkit-0.18.4.tgz",
19
19
  "filesAnalyzed": false,
20
20
  "licenseConcluded": "GPL-3.0-or-later",
21
21
  "licenseDeclared": "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.18.2"
27
+ "referenceLocator": "pkg:npm/owlrunkit@0.18.4"
28
28
  }
29
29
  ]
30
30
  }
@@ -56,9 +56,9 @@ function incompleteReasons(input) {
56
56
  return [...new Set(reasons)].sort();
57
57
  }
58
58
 
59
- function result({ lane, riskMode, reasonCodes, nextCommand }) {
59
+ function result({ schemaVersion, lane, riskMode, reasonCodes, nextCommand }) {
60
60
  return {
61
- schemaVersion: "OwlCodaRunKitAssuranceRouteV1",
61
+ schemaVersion,
62
62
  status: "routed",
63
63
  lane,
64
64
  riskMode,
@@ -68,14 +68,15 @@ function result({ lane, riskMode, reasonCodes, nextCommand }) {
68
68
  };
69
69
  }
70
70
 
71
- export function routeRunKitAssuranceV1(input) {
71
+ function routeRunKitAssurance(input, { schemaVersion, commandPrefix }) {
72
72
  const incomplete = incompleteReasons(input);
73
73
  if (incomplete.length > 0) {
74
74
  return result({
75
+ schemaVersion,
75
76
  lane: "formal",
76
77
  riskMode: "full",
77
78
  reasonCodes: ["assurance_input_incomplete", ...incomplete],
78
- nextCommand: "owlrunkit formal start",
79
+ nextCommand: `${commandPrefix} formal start`,
79
80
  });
80
81
  }
81
82
 
@@ -95,15 +96,17 @@ export function routeRunKitAssuranceV1(input) {
95
96
  ];
96
97
  if (formalReasons.length > 0) {
97
98
  return result({
99
+ schemaVersion,
98
100
  lane: "formal",
99
101
  riskMode: "full",
100
102
  reasonCodes: [...new Set(formalReasons)].sort(),
101
- nextCommand: "owlrunkit formal start",
103
+ nextCommand: `${commandPrefix} formal start`,
102
104
  });
103
105
  }
104
106
 
105
107
  if (!input.needsDurableEvidence) {
106
108
  return result({
109
+ schemaVersion,
107
110
  lane: "none",
108
111
  riskMode: "lightweight",
109
112
  reasonCodes: ["durable_evidence_not_required"],
@@ -113,6 +116,7 @@ export function routeRunKitAssuranceV1(input) {
113
116
 
114
117
  if (input.exactCommandCount !== 1) {
115
118
  return result({
119
+ schemaVersion,
116
120
  lane: "none",
117
121
  riskMode: "lightweight",
118
122
  reasonCodes: ["quick_exact_command_required"],
@@ -121,9 +125,24 @@ export function routeRunKitAssuranceV1(input) {
121
125
  }
122
126
 
123
127
  return result({
128
+ schemaVersion,
124
129
  lane: "quick",
125
130
  riskMode: "lightweight",
126
131
  reasonCodes: ["single_bounded_verification"],
127
- nextCommand: "owlrunkit quick-verify",
132
+ nextCommand: `${commandPrefix} quick-verify`,
133
+ });
134
+ }
135
+
136
+ export function routeRunKitAssuranceV1(input) {
137
+ return routeRunKitAssurance(input, {
138
+ schemaVersion: "OwlCodaRunKitAssuranceRouteV1",
139
+ commandPrefix: "owlrunkit",
140
+ });
141
+ }
142
+
143
+ export function routeRunKitAssuranceV2(input) {
144
+ return routeRunKitAssurance(input, {
145
+ schemaVersion: "OwlCodaRunKitAssuranceRouteV2",
146
+ commandPrefix: "npx --no-install owlrunkit",
128
147
  });
129
148
  }
@@ -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.18.2";
17
+ export const CORE_VERSION = "0.18.4";
18
18
  export const RUNTIME_ROOT = ".owlcoda/runkit";
19
19
 
20
20
  const CORE_FILES = [
@@ -43,6 +43,7 @@ const CORE_FILES = [
43
43
  "project-cli-resolver.mjs",
44
44
  "project-control-parser.mjs",
45
45
  "project-control-state.mjs",
46
+ "project-external-delivery.mjs",
46
47
  "provenance-common.mjs",
47
48
  "quick-attest.mjs",
48
49
  "quick-canonical.mjs",
@@ -76,6 +77,7 @@ const CORE_FILES = [
76
77
  "verification-plan.mjs",
77
78
  "visual-smoke.mjs",
78
79
  "schemas/assurance-route-v1.schema.json",
80
+ "schemas/assurance-route-v2.schema.json",
79
81
  "schemas/closeout-receipt-v2.schema.json",
80
82
  "schemas/adoption-evidence-v1.schema.json",
81
83
  "schemas/coverage-adopt-request-v1.schema.json",
@@ -102,6 +104,7 @@ const CORE_FILES = [
102
104
  "schemas/owner-deployment-decision-v1.schema.json",
103
105
  "schemas/profile-apply-receipt-v1.schema.json",
104
106
  "schemas/profile-detection-v2.schema.json",
107
+ "schemas/profile-detection-v3.schema.json",
105
108
  "schemas/profile-reconcile-plan-v1.schema.json",
106
109
  "schemas/profile-reconcile-receipt-v1.schema.json",
107
110
  "schemas/project-config.schema.json",
@@ -126,9 +129,13 @@ const CORE_FILES = [
126
129
  "schemas/verification-context-v1.schema.json",
127
130
  "schemas/team-project-definition-v1.schema.json",
128
131
  "schemas/team-project-event-v1.schema.json",
132
+ "schemas/team-project-event-v2.schema.json",
133
+ "schemas/team-project-event-v3.schema.json",
129
134
  "schemas/team-project-successor-receipt-v1.schema.json",
130
135
  "schemas/team-project-status-v1.schema.json",
136
+ "schemas/team-project-status-v2.schema.json",
131
137
  "schemas/usage-mode-recommendation-v1.schema.json",
138
+ "schemas/usage-mode-recommendation-v2.schema.json",
132
139
  "schemas/verification-envelope-v1.schema.json",
133
140
  "schemas/verification-finalize-attempt-v1.schema.json",
134
141
  "schemas/verification-preflight-v1.schema.json",
@@ -160,10 +167,12 @@ const CORE_FILES = [
160
167
  ];
161
168
 
162
169
  const CORE_DEPENDENCY_FILES = [
170
+ "packages/attest/schemas/workspace-snapshot-v1.schema.json",
163
171
  "packages/attest/src/formal.mjs",
164
172
  "packages/attest/src/offline-bundle.mjs",
165
173
  "packages/attest/src/quick-receipt-contract.mjs",
166
174
  "packages/attest/src/reference-contract.mjs",
175
+ "packages/attest/src/workspace-snapshot.mjs",
167
176
  ];
168
177
 
169
178
  function sha256(value) {
@@ -818,7 +818,7 @@ export function formatDoctorHuman(report) {
818
818
  : []),
819
819
  ...(otherWarnings.length > 0 ? [`Warnings: ${otherWarnings.join(", ")}`] : []),
820
820
  `Next: ${report.nextAllowedAction === "adopt_current_release"
821
- ? `owlrunkit adopt --workspace . --exact ${PACKAGE_NAME}@${EXPECTED_VERSION}`
821
+ ? `npx --no-install owlrunkit adopt --workspace . --exact ${PACKAGE_NAME}@${EXPECTED_VERSION}`
822
822
  : report.nextAllowedAction}`,
823
823
  ...(report.maintenanceNextAction
824
824
  ? [`Maintenance: ${report.maintenanceNextAction}`]