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.
- package/CHANGELOG.md +63 -0
- package/README.md +159 -52
- package/docs/architecture/OWLCODA_RUNKIT_0184_EXTERNAL_DELIVERY_INTAKE_PRODUCT_DECISION_20260812.md +209 -0
- package/docs/architecture/OWLCODA_RUNKIT_018_PROJECT_DRIVER_PRODUCT_DEFINITION.md +16 -5
- package/docs/architecture/OWLCODA_RUNKIT_USAGE_MODE_SELECTION_PRODUCT_DECISION_20260811.md +54 -3
- package/docs/architecture/OWLCODA_RUN_KIT_CONTRACT_V0_2.md +7 -0
- package/integrations/codex/skills/owlcoda-runkit/SKILL.md +125 -74
- package/integrations/codex/skills/owlcoda-runkit/assets/templates/config.json +3 -3
- package/integrations/codex/skills/owlcoda-runkit/references/contract-v0.1.md +160 -0
- package/integrations/codex/skills/owlcoda-runkit/references/contract-v0.2.md +545 -0
- package/package.json +1 -1
- package/packages/attest/README.md +4 -3
- package/packages/attest/consumer-surface-v1.json +1 -0
- package/packages/attest/distribution-manifest-v1.json +12 -1
- package/packages/attest/schemas/quick-verification-receipt-v2.schema.json +232 -0
- package/packages/attest/src/index.mjs +4 -1
- package/packages/attest/src/quick-receipt-contract.mjs +16 -6
- package/packages/attest/src/quick.mjs +21 -2
- package/packages/attest/src/workspace-snapshot.mjs +10 -1
- package/registry-release-policy-v1.json +5 -5
- package/sbom.spdx.json +5 -5
- package/scripts/runkit-contract/assurance-router.mjs +25 -6
- package/scripts/runkit-contract/core-contract.mjs +10 -1
- package/scripts/runkit-contract/onboarding-doctor.mjs +1 -1
- package/scripts/runkit-contract/profile-onboarding.mjs +263 -15
- package/scripts/runkit-contract/project-cli-resolver.mjs +6 -0
- package/scripts/runkit-contract/project-external-delivery.mjs +707 -0
- package/scripts/runkit-contract/quick-metrics.mjs +3 -3
- package/scripts/runkit-contract/quick-receipt.mjs +79 -12
- package/scripts/runkit-contract/quick-verify.mjs +89 -12
- package/scripts/runkit-contract/runkit-bootstrap.mjs +6 -1
- package/scripts/runkit-contract/runkit-cli.mjs +363 -143
- package/scripts/runkit-contract/schemas/assurance-route-v2.schema.json +26 -0
- package/scripts/runkit-contract/schemas/profile-detection-v3.schema.json +170 -0
- package/scripts/runkit-contract/schemas/team-project-event-v2.schema.json +128 -0
- package/scripts/runkit-contract/schemas/team-project-event-v3.schema.json +146 -0
- package/scripts/runkit-contract/schemas/team-project-status-v2.schema.json +85 -0
- package/scripts/runkit-contract/schemas/usage-mode-recommendation-v2.schema.json +136 -0
- package/scripts/runkit-contract/team-project.mjs +782 -55
- 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 (
|
|
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
|
|
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
|
-
|
|
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.
|
|
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
|
-
|| !
|
|
122
|
-
|| !
|
|
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 = [
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
27
|
-
"shasum": "
|
|
28
|
-
"integrity": "sha512-
|
|
29
|
-
"tarballUrl": "https://registry.npmjs.org/owlrunkit/-/owlrunkit-0.18.
|
|
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.
|
|
6
|
-
"documentNamespace": "https://owlcoda.com/spdx/owlrunkit/0.18.
|
|
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.
|
|
18
|
-
"downloadLocation": "https://registry.npmjs.org/owlrunkit/-/owlrunkit-0.18.
|
|
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.
|
|
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
|
|
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
|
-
|
|
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:
|
|
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:
|
|
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:
|
|
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.
|
|
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}`]
|