@vizejs/marquette 0.299.1 → 0.302.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.
package/README.md CHANGED
@@ -99,18 +99,39 @@ deployment tooling can bind a `tests` check to retained, immutable facts:
99
99
  import { defineTestRunEvidence } from "@vizejs/marquette/test-run";
100
100
  import { validateTestRunEvidence } from "@vizejs/marquette/test-run/validate";
101
101
  import { testRunAdmissionId } from "@vizejs/marquette/test-run/canonical";
102
- import { admitTestRun } from "@vizejs/marquette/test-run/admission";
102
+ import { admitTestRun, decideTestRunAdmission } from "@vizejs/marquette/test-run/admission";
103
+ import { verifyTestRunCheck } from "@vizejs/marquette/test-run/check";
104
+ import { verifyTestRunTransition } from "@vizejs/marquette/test-run/transition";
103
105
 
104
106
  const diagnostics = validateTestRunEvidence(evidence);
105
107
  const admissionId = await testRunAdmissionId(evidence); // test-run:<sha256>
106
108
  const rejections = await admitTestRun(evidence, candidate, admissionId, now);
109
+ const decision = await decideTestRunAdmission(evidence, candidate, admissionId, now);
110
+ if (!decision.allowed) {
111
+ console.error(decision.denialCodes); // e.g. ["record-expired"]
112
+ }
113
+ const release = await verifyTestRunCheck(retainedCheck, candidate, evidence, now);
114
+ const journal = await verifyTestRunTransition(nextTransition, chainTip);
107
115
  ```
108
116
 
109
117
  Validation shares its `VIZE_MARQUETTE_1xx` codes, paths, and ordering with the
110
118
  native implementation, and the canonical entry produces byte-identical
111
119
  serialization and SHA-256 fingerprints, proven by the shared fixtures in
112
- `tests/fixtures/test-run-evidence/`. The published record schema is available
113
- from `@vizejs/marquette/test-run/schema`.
120
+ `tests/fixtures/test-run-evidence/`. Admission decisions carry the stable,
121
+ append-only denial-code vocabulary shared by every backend family; the same
122
+ fixtures pin every decision so a JavaScript, Rust, Go, or JVM gate denies for
123
+ identical machine-readable causes. The check entry replaces every generic
124
+ test-result reference in release evidence: a retained `vize.test-run.check`
125
+ record may only name the exact `test-run:<sha256>` admission id, bind the six
126
+ candidate facts, and record an observer independent from the runner. The
127
+ transition entry makes each release decision and the complete accepted
128
+ anti-replay state one durable atomic record, chained by canonical SHA-256
129
+ fingerprints; hosts persist it with a write-then-atomic-rename and verify the
130
+ recovered tip before deciding anything new. The published record schema is
131
+ available from `@vizejs/marquette/test-run/schema`, the decision contract from
132
+ `@vizejs/marquette/test-run/admission/schema`, the tests-check contract from
133
+ `@vizejs/marquette/test-run/check/schema`, and the transition contract from
134
+ `@vizejs/marquette/test-run/transition/schema`.
114
135
 
115
136
  ## Guarantees
116
137
 
@@ -0,0 +1,167 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://vizejs.dev/schemas/marquette/application-contract.schema.json",
4
+ "title": "Vize Application Marquette",
5
+ "description": "Versioned language-neutral application target, environment, backend, protocol, and route graph.",
6
+ "$ref": "#/$defs/contract",
7
+ "$defs": {
8
+ "identifier": {
9
+ "type": "string",
10
+ "pattern": "^[a-z0-9][a-z0-9._-]*$"
11
+ },
12
+ "target": {
13
+ "enum": ["web", "native", "desktop", "terminal"]
14
+ },
15
+ "runtime": {
16
+ "enum": [
17
+ "browser",
18
+ "javascript",
19
+ "rust",
20
+ "go",
21
+ "jvm",
22
+ "native",
23
+ "desktop",
24
+ "terminal",
25
+ "external"
26
+ ]
27
+ },
28
+ "capabilityDefinition": {
29
+ "type": "object",
30
+ "additionalProperties": false,
31
+ "required": ["id", "description"],
32
+ "properties": {
33
+ "id": { "$ref": "#/$defs/identifier" },
34
+ "description": { "type": "string", "minLength": 1 },
35
+ "version": { "type": "integer", "minimum": 1, "default": 1 }
36
+ }
37
+ },
38
+ "environment": {
39
+ "type": "object",
40
+ "additionalProperties": false,
41
+ "required": ["id", "target", "consumer", "runtime"],
42
+ "properties": {
43
+ "id": { "$ref": "#/$defs/identifier" },
44
+ "target": { "$ref": "#/$defs/target" },
45
+ "consumer": { "enum": ["client", "server"] },
46
+ "runtime": { "$ref": "#/$defs/runtime" },
47
+ "entry": { "type": "string", "minLength": 1 },
48
+ "dependsOn": {
49
+ "type": "array",
50
+ "items": { "$ref": "#/$defs/identifier" },
51
+ "uniqueItems": true,
52
+ "default": []
53
+ },
54
+ "capabilities": {
55
+ "type": "array",
56
+ "items": { "$ref": "#/$defs/identifier" },
57
+ "uniqueItems": true,
58
+ "default": []
59
+ }
60
+ }
61
+ },
62
+ "backend": {
63
+ "type": "object",
64
+ "additionalProperties": false,
65
+ "required": ["id", "family"],
66
+ "properties": {
67
+ "id": { "$ref": "#/$defs/identifier" },
68
+ "family": { "enum": ["javascript", "rust", "go", "jvm", "external"] },
69
+ "environment": { "$ref": "#/$defs/identifier" },
70
+ "capabilities": {
71
+ "type": "array",
72
+ "items": { "$ref": "#/$defs/identifier" },
73
+ "uniqueItems": true,
74
+ "default": []
75
+ }
76
+ }
77
+ },
78
+ "protocol": {
79
+ "type": "object",
80
+ "additionalProperties": false,
81
+ "required": ["id", "family", "backend"],
82
+ "properties": {
83
+ "id": { "$ref": "#/$defs/identifier" },
84
+ "family": { "enum": ["schema-query", "typed-rpc", "binary-rpc"] },
85
+ "backend": { "$ref": "#/$defs/identifier" },
86
+ "capabilities": {
87
+ "type": "array",
88
+ "items": { "$ref": "#/$defs/identifier" },
89
+ "uniqueItems": true,
90
+ "default": []
91
+ }
92
+ }
93
+ },
94
+ "route": {
95
+ "type": "object",
96
+ "additionalProperties": false,
97
+ "required": ["id", "path", "environment", "rendering"],
98
+ "properties": {
99
+ "id": { "$ref": "#/$defs/identifier" },
100
+ "path": { "type": "string", "pattern": "^/" },
101
+ "environment": { "$ref": "#/$defs/identifier" },
102
+ "rendering": {
103
+ "enum": [
104
+ "client",
105
+ "static",
106
+ "server",
107
+ "stream",
108
+ "partial",
109
+ "hybrid",
110
+ "native",
111
+ "desktop",
112
+ "terminal"
113
+ ]
114
+ },
115
+ "backend": { "$ref": "#/$defs/identifier" },
116
+ "protocol": { "$ref": "#/$defs/identifier" },
117
+ "capabilities": {
118
+ "type": "array",
119
+ "items": { "$ref": "#/$defs/identifier" },
120
+ "uniqueItems": true,
121
+ "default": []
122
+ }
123
+ }
124
+ },
125
+ "contract": {
126
+ "type": "object",
127
+ "additionalProperties": false,
128
+ "required": ["application"],
129
+ "properties": {
130
+ "formatVersion": { "const": 1, "default": 1 },
131
+ "application": { "$ref": "#/$defs/identifier" },
132
+ "targets": {
133
+ "type": "array",
134
+ "items": { "$ref": "#/$defs/target" },
135
+ "uniqueItems": true,
136
+ "default": []
137
+ },
138
+ "capabilities": {
139
+ "type": "object",
140
+ "propertyNames": { "$ref": "#/$defs/identifier" },
141
+ "additionalProperties": { "$ref": "#/$defs/capabilityDefinition" },
142
+ "default": {}
143
+ },
144
+ "environments": {
145
+ "type": "array",
146
+ "items": { "$ref": "#/$defs/environment" },
147
+ "default": []
148
+ },
149
+ "backends": {
150
+ "type": "array",
151
+ "items": { "$ref": "#/$defs/backend" },
152
+ "default": []
153
+ },
154
+ "protocols": {
155
+ "type": "array",
156
+ "items": { "$ref": "#/$defs/protocol" },
157
+ "default": []
158
+ },
159
+ "routes": {
160
+ "type": "array",
161
+ "items": { "$ref": "#/$defs/route" },
162
+ "default": []
163
+ }
164
+ }
165
+ }
166
+ }
167
+ }
@@ -0,0 +1,266 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://vizejs.dev/schemas/marquette/test-run-evidence.schema.json",
4
+ "title": "Vize Test Run Evidence",
5
+ "description": "Language-neutral evidence that binds completed test executions to one application release candidate.",
6
+ "$ref": "#/$defs/evidence",
7
+ "$defs": {
8
+ "identifier": {
9
+ "type": "string",
10
+ "minLength": 1,
11
+ "maxLength": 128,
12
+ "pattern": "^[a-z0-9][a-z0-9._-]*$"
13
+ },
14
+ "digest": {
15
+ "type": "string",
16
+ "pattern": "^[a-f0-9]{64}$"
17
+ },
18
+ "sourceRevision": {
19
+ "type": "string",
20
+ "pattern": "^[a-f0-9]{40,128}$"
21
+ },
22
+ "contentReference": {
23
+ "type": "string",
24
+ "pattern": "^sha256:[a-f0-9]{64}$"
25
+ },
26
+ "nonEmptyString": {
27
+ "type": "string",
28
+ "minLength": 1,
29
+ "maxLength": 256
30
+ },
31
+ "nonNegativeCount": {
32
+ "type": "integer",
33
+ "minimum": 0,
34
+ "maximum": 4294967295
35
+ },
36
+ "timestamp": {
37
+ "type": "string",
38
+ "format": "date-time",
39
+ "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]\\.[0-9]{3}Z$"
40
+ },
41
+ "retainedEvidence": {
42
+ "type": "object",
43
+ "additionalProperties": false,
44
+ "required": ["reference", "fingerprint"],
45
+ "properties": {
46
+ "reference": { "$ref": "#/$defs/contentReference" },
47
+ "fingerprint": { "$ref": "#/$defs/digest" }
48
+ }
49
+ },
50
+ "artifact": {
51
+ "type": "object",
52
+ "additionalProperties": false,
53
+ "required": ["id", "fingerprint", "sizeBytes"],
54
+ "properties": {
55
+ "id": { "$ref": "#/$defs/identifier" },
56
+ "fingerprint": { "$ref": "#/$defs/digest" },
57
+ "sizeBytes": {
58
+ "type": "integer",
59
+ "minimum": 1,
60
+ "maximum": 9007199254740991
61
+ }
62
+ }
63
+ },
64
+ "runner": {
65
+ "type": "object",
66
+ "additionalProperties": false,
67
+ "required": [
68
+ "identity",
69
+ "authenticationEvidence",
70
+ "isolation",
71
+ "invocationFingerprint",
72
+ "environmentEvidence",
73
+ "environmentFingerprint"
74
+ ],
75
+ "properties": {
76
+ "identity": { "$ref": "#/$defs/identifier" },
77
+ "authenticationEvidence": { "$ref": "#/$defs/retainedEvidence" },
78
+ "isolation": { "enum": ["dedicated", "ephemeral"] },
79
+ "invocationFingerprint": { "$ref": "#/$defs/digest" },
80
+ "environmentEvidence": { "$ref": "#/$defs/retainedEvidence" },
81
+ "environmentFingerprint": { "$ref": "#/$defs/digest" }
82
+ }
83
+ },
84
+ "selection": {
85
+ "type": "object",
86
+ "additionalProperties": false,
87
+ "required": ["targetIds", "suiteIds"],
88
+ "properties": {
89
+ "targetIds": {
90
+ "type": "array",
91
+ "minItems": 1,
92
+ "maxItems": 32,
93
+ "uniqueItems": true,
94
+ "items": { "$ref": "#/$defs/identifier" }
95
+ },
96
+ "suiteIds": {
97
+ "type": "array",
98
+ "minItems": 1,
99
+ "maxItems": 512,
100
+ "uniqueItems": true,
101
+ "items": { "$ref": "#/$defs/identifier" }
102
+ }
103
+ }
104
+ },
105
+ "targetExecution": {
106
+ "type": "object",
107
+ "additionalProperties": false,
108
+ "required": ["id", "kind", "environment"],
109
+ "properties": {
110
+ "id": { "$ref": "#/$defs/identifier" },
111
+ "kind": { "enum": ["web", "native", "desktop", "terminal", "server"] },
112
+ "environment": { "$ref": "#/$defs/identifier" }
113
+ }
114
+ },
115
+ "suiteExecution": {
116
+ "type": "object",
117
+ "additionalProperties": false,
118
+ "required": [
119
+ "id",
120
+ "targetId",
121
+ "kind",
122
+ "shardIndex",
123
+ "shardCount",
124
+ "outcome",
125
+ "passed",
126
+ "failed",
127
+ "skipped",
128
+ "retries",
129
+ "durationMs",
130
+ "invocationFingerprint",
131
+ "report",
132
+ "log"
133
+ ],
134
+ "properties": {
135
+ "id": { "$ref": "#/$defs/identifier" },
136
+ "targetId": { "$ref": "#/$defs/identifier" },
137
+ "kind": {
138
+ "enum": [
139
+ "unit",
140
+ "integration",
141
+ "contract",
142
+ "end-to-end",
143
+ "accessibility",
144
+ "visual",
145
+ "performance",
146
+ "resilience",
147
+ "installation",
148
+ "upgrade",
149
+ "migration"
150
+ ]
151
+ },
152
+ "shardIndex": {
153
+ "type": "integer",
154
+ "minimum": 1,
155
+ "maximum": 1024
156
+ },
157
+ "shardCount": {
158
+ "type": "integer",
159
+ "minimum": 1,
160
+ "maximum": 1024
161
+ },
162
+ "outcome": { "enum": ["passed", "failed", "cancelled"] },
163
+ "passed": { "$ref": "#/$defs/nonNegativeCount" },
164
+ "failed": { "$ref": "#/$defs/nonNegativeCount" },
165
+ "skipped": { "$ref": "#/$defs/nonNegativeCount" },
166
+ "retries": { "$ref": "#/$defs/nonNegativeCount" },
167
+ "durationMs": {
168
+ "type": "integer",
169
+ "minimum": 0,
170
+ "maximum": 9007199254740991
171
+ },
172
+ "invocationFingerprint": { "$ref": "#/$defs/digest" },
173
+ "report": { "$ref": "#/$defs/retainedEvidence" },
174
+ "log": { "$ref": "#/$defs/retainedEvidence" }
175
+ }
176
+ },
177
+ "verification": {
178
+ "type": "object",
179
+ "additionalProperties": false,
180
+ "required": [
181
+ "verifier",
182
+ "completedAt",
183
+ "outcome",
184
+ "targetCount",
185
+ "suiteCount",
186
+ "passed",
187
+ "failed",
188
+ "skipped",
189
+ "retries",
190
+ "evidence"
191
+ ],
192
+ "properties": {
193
+ "verifier": { "$ref": "#/$defs/identifier" },
194
+ "completedAt": { "$ref": "#/$defs/timestamp" },
195
+ "outcome": { "enum": ["accepted", "rejected"] },
196
+ "targetCount": {
197
+ "type": "integer",
198
+ "minimum": 1,
199
+ "maximum": 32
200
+ },
201
+ "suiteCount": {
202
+ "type": "integer",
203
+ "minimum": 1,
204
+ "maximum": 512
205
+ },
206
+ "passed": { "$ref": "#/$defs/nonNegativeCount" },
207
+ "failed": { "$ref": "#/$defs/nonNegativeCount" },
208
+ "skipped": { "$ref": "#/$defs/nonNegativeCount" },
209
+ "retries": { "$ref": "#/$defs/nonNegativeCount" },
210
+ "evidence": { "$ref": "#/$defs/retainedEvidence" }
211
+ }
212
+ },
213
+ "evidence": {
214
+ "type": "object",
215
+ "additionalProperties": false,
216
+ "required": [
217
+ "format",
218
+ "formatVersion",
219
+ "id",
220
+ "application",
221
+ "environment",
222
+ "contractFingerprint",
223
+ "sourceRevision",
224
+ "release",
225
+ "artifact",
226
+ "startedAt",
227
+ "completedAt",
228
+ "validUntil",
229
+ "runner",
230
+ "selection",
231
+ "targets",
232
+ "suites",
233
+ "verification"
234
+ ],
235
+ "properties": {
236
+ "format": { "const": "vize.test-run.evidence" },
237
+ "formatVersion": { "const": 1, "default": 1 },
238
+ "id": { "$ref": "#/$defs/identifier" },
239
+ "application": { "$ref": "#/$defs/identifier" },
240
+ "environment": { "$ref": "#/$defs/identifier" },
241
+ "contractFingerprint": { "$ref": "#/$defs/digest" },
242
+ "sourceRevision": { "$ref": "#/$defs/sourceRevision" },
243
+ "release": { "$ref": "#/$defs/nonEmptyString" },
244
+ "artifact": { "$ref": "#/$defs/artifact" },
245
+ "startedAt": { "$ref": "#/$defs/timestamp" },
246
+ "completedAt": { "$ref": "#/$defs/timestamp" },
247
+ "validUntil": { "$ref": "#/$defs/timestamp" },
248
+ "runner": { "$ref": "#/$defs/runner" },
249
+ "selection": { "$ref": "#/$defs/selection" },
250
+ "targets": {
251
+ "type": "array",
252
+ "minItems": 1,
253
+ "maxItems": 32,
254
+ "items": { "$ref": "#/$defs/targetExecution" }
255
+ },
256
+ "suites": {
257
+ "type": "array",
258
+ "minItems": 1,
259
+ "maxItems": 512,
260
+ "items": { "$ref": "#/$defs/suiteExecution" }
261
+ },
262
+ "verification": { "$ref": "#/$defs/verification" }
263
+ }
264
+ }
265
+ }
266
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vizejs/marquette",
3
- "version": "0.299.1",
3
+ "version": "0.302.0",
4
4
  "description": "Typed application marquettes for every Vize target",
5
5
  "keywords": [
6
6
  "application-contract",
@@ -56,14 +56,27 @@
56
56
  "import": "./dist/test-run-admission.mjs",
57
57
  "default": "./dist/test-run-admission.mjs"
58
58
  },
59
+ "./test-run/check": {
60
+ "types": "./dist/test-run-check.d.mts",
61
+ "import": "./dist/test-run-check.mjs",
62
+ "default": "./dist/test-run-check.mjs"
63
+ },
64
+ "./test-run/transition": {
65
+ "types": "./dist/test-run-transition.d.mts",
66
+ "import": "./dist/test-run-transition.mjs",
67
+ "default": "./dist/test-run-transition.mjs"
68
+ },
59
69
  "./schema": "./dist/application-contract.schema.json",
60
- "./test-run/schema": "./dist/test-run-evidence.schema.json"
70
+ "./test-run/schema": "./dist/test-run-evidence.schema.json",
71
+ "./test-run/admission/schema": "./dist/test-run-admission.schema.json",
72
+ "./test-run/check/schema": "./dist/test-run-check.schema.json",
73
+ "./test-run/transition/schema": "./dist/test-run-transition.schema.json"
61
74
  },
62
75
  "publishConfig": {
63
76
  "access": "public"
64
77
  },
65
78
  "scripts": {
66
- "build": "vp pack && node scripts/copy-schema.mjs && node scripts/check-size.mjs",
79
+ "build": "vp pack && node scripts/check-size.mjs",
67
80
  "check": "vp check README.md package.json tsconfig.json src scripts vite.config.ts && tsgo --noEmit -p tsconfig.json",
68
81
  "check:fix": "vp check --fix README.md package.json tsconfig.json src scripts vite.config.ts",
69
82
  "check:size": "node scripts/check-size.mjs",