@primust/artifact-core 1.0.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 (45) hide show
  1. package/dist/canonical.d.ts +24 -0
  2. package/dist/canonical.d.ts.map +1 -0
  3. package/dist/canonical.js +83 -0
  4. package/dist/canonical.js.map +1 -0
  5. package/dist/canonical.test.d.ts +2 -0
  6. package/dist/canonical.test.d.ts.map +1 -0
  7. package/dist/canonical.test.js +63 -0
  8. package/dist/canonical.test.js.map +1 -0
  9. package/dist/commitment.d.ts +56 -0
  10. package/dist/commitment.d.ts.map +1 -0
  11. package/dist/commitment.js +214 -0
  12. package/dist/commitment.js.map +1 -0
  13. package/dist/commitment.test.d.ts +7 -0
  14. package/dist/commitment.test.d.ts.map +1 -0
  15. package/dist/commitment.test.js +125 -0
  16. package/dist/commitment.test.js.map +1 -0
  17. package/dist/index.d.ts +9 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +6 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/signing.d.ts +80 -0
  22. package/dist/signing.d.ts.map +1 -0
  23. package/dist/signing.js +159 -0
  24. package/dist/signing.js.map +1 -0
  25. package/dist/signing.test.d.ts +2 -0
  26. package/dist/signing.test.d.ts.map +1 -0
  27. package/dist/signing.test.js +153 -0
  28. package/dist/signing.test.js.map +1 -0
  29. package/dist/types/artifact.d.ts +143 -0
  30. package/dist/types/artifact.d.ts.map +1 -0
  31. package/dist/types/artifact.js +18 -0
  32. package/dist/types/artifact.js.map +1 -0
  33. package/dist/types.d.ts +45 -0
  34. package/dist/types.d.ts.map +1 -0
  35. package/dist/types.js +7 -0
  36. package/dist/types.js.map +1 -0
  37. package/dist/validate-artifact.d.ts +23 -0
  38. package/dist/validate-artifact.d.ts.map +1 -0
  39. package/dist/validate-artifact.js +168 -0
  40. package/dist/validate-artifact.js.map +1 -0
  41. package/dist/validate-artifact.test.d.ts +2 -0
  42. package/dist/validate-artifact.test.d.ts.map +1 -0
  43. package/dist/validate-artifact.test.js +300 -0
  44. package/dist/validate-artifact.test.js.map +1 -0
  45. package/package.json +37 -0
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Primust Artifact Core — Type definitions
3
+ *
4
+ * Frozen schemas from P1-B spec. Do not modify without schema migration.
5
+ */
6
+ /** Key lifecycle states per SIGNER_TRUST_POLICY.md §2 */
7
+ export type KeyStatus = 'active' | 'rotated' | 'revoked';
8
+ /** Revocation reasons per SIGNER_TRUST_POLICY.md §3 */
9
+ export type RevocationReason = 'key_compromise' | 'decommissioned';
10
+ /** Signer purpose */
11
+ export type SignerType = 'artifact_signer' | 'manifest_signer' | 'policy_pack_signer';
12
+ /**
13
+ * SignerRecord — frozen schema.
14
+ *
15
+ * One record per kid. A signer_id may have multiple SignerRecords
16
+ * (one active, zero or more rotated/revoked).
17
+ */
18
+ export interface SignerRecord {
19
+ signer_id: string;
20
+ kid: string;
21
+ public_key_b64url: string;
22
+ algorithm: 'Ed25519';
23
+ status: KeyStatus;
24
+ revocation_reason: RevocationReason | null;
25
+ revoked_at: string | null;
26
+ superseded_by_kid: string | null;
27
+ activated_at: string;
28
+ deactivated_at: string | null;
29
+ org_id: string;
30
+ signer_type: SignerType;
31
+ }
32
+ /**
33
+ * SignatureEnvelope — frozen schema.
34
+ *
35
+ * Attached to every signed Primust artifact. Both signer_id and kid
36
+ * are required — no exceptions.
37
+ */
38
+ export interface SignatureEnvelope {
39
+ signer_id: string;
40
+ kid: string;
41
+ algorithm: 'Ed25519';
42
+ signature: string;
43
+ signed_at: string;
44
+ }
45
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,yDAAyD;AACzD,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;AAEzD,uDAAuD;AACvD,MAAM,MAAM,gBAAgB,GAAG,gBAAgB,GAAG,gBAAgB,CAAC;AAEnE,qBAAqB;AACrB,MAAM,MAAM,UAAU,GAAG,iBAAiB,GAAG,iBAAiB,GAAG,oBAAoB,CAAC;AAEtF;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,SAAS,CAAC;IACrB,MAAM,EAAE,SAAS,CAAC;IAClB,iBAAiB,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC3C,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,UAAU,CAAC;CACzB;AAED;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,SAAS,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB"}
package/dist/types.js ADDED
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Primust Artifact Core — Type definitions
3
+ *
4
+ * Frozen schemas from P1-B spec. Do not modify without schema migration.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * VPEC Artifact validation — enforces all critical invariants.
3
+ *
4
+ * This is structural/semantic validation beyond what JSON Schema covers.
5
+ * JSON Schema handles type checks; this function enforces cross-field invariants.
6
+ */
7
+ export interface ValidationError {
8
+ code: string;
9
+ message: string;
10
+ path?: string;
11
+ }
12
+ export interface ValidationResult {
13
+ valid: boolean;
14
+ errors: ValidationError[];
15
+ }
16
+ /**
17
+ * Validate a VPEC artifact against all critical invariants.
18
+ *
19
+ * @param artifact - The artifact payload (parsed JSON)
20
+ * @returns ValidationResult with errors if any invariants are violated
21
+ */
22
+ export declare function validateArtifact(artifact: Record<string, unknown>): ValidationResult;
23
+ //# sourceMappingURL=validate-artifact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-artifact.d.ts","sourceRoot":"","sources":["../src/validate-artifact.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B;AAiCD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,gBAAgB,CA6HpF"}
@@ -0,0 +1,168 @@
1
+ /**
2
+ * VPEC Artifact validation — enforces all critical invariants.
3
+ *
4
+ * This is structural/semantic validation beyond what JSON Schema covers.
5
+ * JSON Schema handles type checks; this function enforces cross-field invariants.
6
+ */
7
+ const PROOF_LEVELS = [
8
+ 'mathematical',
9
+ 'verifiable_inference',
10
+ 'execution',
11
+ 'witnessed',
12
+ 'attestation',
13
+ ];
14
+ const GAP_TYPES = new Set([
15
+ 'check_not_executed',
16
+ 'enforcement_override',
17
+ 'engine_error',
18
+ 'check_degraded',
19
+ 'external_boundary_traversal',
20
+ 'lineage_token_missing',
21
+ 'admission_gate_override',
22
+ 'check_timing_suspect',
23
+ 'reviewer_credential_invalid',
24
+ 'witnessed_display_missing',
25
+ 'witnessed_rationale_missing',
26
+ 'deterministic_consistency_violation',
27
+ 'skip_rationale_missing',
28
+ 'policy_config_drift',
29
+ 'zkml_proof_pending_timeout',
30
+ 'zkml_proof_failed',
31
+ ]);
32
+ const GAP_SEVERITIES = new Set(['Critical', 'High', 'Medium', 'Low', 'Informational']);
33
+ const PUBLIC_KEY_URL_PATTERN = /^https:\/\/primust\.com\/\.well-known\/primust-pubkeys\/.+\.pem$/;
34
+ /**
35
+ * Validate a VPEC artifact against all critical invariants.
36
+ *
37
+ * @param artifact - The artifact payload (parsed JSON)
38
+ * @returns ValidationResult with errors if any invariants are violated
39
+ */
40
+ export function validateArtifact(artifact) {
41
+ const errors = [];
42
+ // Invariant 2: reliance_mode field ANYWHERE → validation error
43
+ if ('reliance_mode' in artifact) {
44
+ errors.push({
45
+ code: 'RELIANCE_MODE_FORBIDDEN',
46
+ message: 'reliance_mode field is forbidden in VPEC artifacts',
47
+ path: 'reliance_mode',
48
+ });
49
+ }
50
+ checkNestedRelianceMode(artifact, '', errors);
51
+ // schema_version must be 4.0.0
52
+ if (artifact.schema_version !== '4.0.0') {
53
+ errors.push({
54
+ code: 'INVALID_SCHEMA_VERSION',
55
+ message: `schema_version must be "4.0.0", got "${artifact.schema_version}"`,
56
+ path: 'schema_version',
57
+ });
58
+ }
59
+ // Invariant 1: proof_level MUST equal proof_distribution.weakest_link
60
+ const proofDist = artifact.proof_distribution;
61
+ if (proofDist && artifact.proof_level !== proofDist.weakest_link) {
62
+ errors.push({
63
+ code: 'PROOF_LEVEL_MISMATCH',
64
+ message: `proof_level "${artifact.proof_level}" does not match proof_distribution.weakest_link "${proofDist.weakest_link}"`,
65
+ path: 'proof_level',
66
+ });
67
+ }
68
+ // Validate proof_level is a valid enum value
69
+ if (artifact.proof_level && !PROOF_LEVELS.includes(artifact.proof_level)) {
70
+ errors.push({
71
+ code: 'INVALID_PROOF_LEVEL',
72
+ message: `proof_level "${artifact.proof_level}" is not a valid proof level`,
73
+ path: 'proof_level',
74
+ });
75
+ }
76
+ // Invariant 3: manifest_hashes MUST be object (map), not array
77
+ if (Array.isArray(artifact.manifest_hashes)) {
78
+ errors.push({
79
+ code: 'MANIFEST_HASHES_NOT_MAP',
80
+ message: 'manifest_hashes must be an object (map), not an array',
81
+ path: 'manifest_hashes',
82
+ });
83
+ }
84
+ // Invariant 4: gaps[] entries MUST have gap_type and severity
85
+ const gaps = artifact.gaps;
86
+ if (Array.isArray(gaps)) {
87
+ for (let i = 0; i < gaps.length; i++) {
88
+ const gap = gaps[i];
89
+ if (typeof gap === 'string') {
90
+ errors.push({
91
+ code: 'GAP_BARE_STRING',
92
+ message: `gaps[${i}] is a bare string — must be an object with gap_type and severity`,
93
+ path: `gaps[${i}]`,
94
+ });
95
+ continue;
96
+ }
97
+ if (typeof gap !== 'object' || gap === null) {
98
+ errors.push({
99
+ code: 'GAP_INVALID_TYPE',
100
+ message: `gaps[${i}] must be an object with gap_type and severity`,
101
+ path: `gaps[${i}]`,
102
+ });
103
+ continue;
104
+ }
105
+ if (!gap.gap_type || !gap.severity) {
106
+ errors.push({
107
+ code: 'GAP_MISSING_FIELDS',
108
+ message: `gaps[${i}] must have gap_type and severity fields`,
109
+ path: `gaps[${i}]`,
110
+ });
111
+ }
112
+ if (gap.gap_type && !GAP_TYPES.has(gap.gap_type)) {
113
+ errors.push({
114
+ code: 'GAP_INVALID_TYPE_VALUE',
115
+ message: `gaps[${i}].gap_type "${gap.gap_type}" is not a valid gap type`,
116
+ path: `gaps[${i}].gap_type`,
117
+ });
118
+ }
119
+ if (gap.severity && !GAP_SEVERITIES.has(gap.severity)) {
120
+ errors.push({
121
+ code: 'GAP_INVALID_SEVERITY',
122
+ message: `gaps[${i}].severity "${gap.severity}" is not a valid severity`,
123
+ path: `gaps[${i}].severity`,
124
+ });
125
+ }
126
+ }
127
+ }
128
+ // Invariant 5: partial: true → policy_coverage_pct must be 0
129
+ const coverage = artifact.coverage;
130
+ if (artifact.partial === true && coverage) {
131
+ if (typeof coverage.policy_coverage_pct === 'number' && coverage.policy_coverage_pct !== 0) {
132
+ errors.push({
133
+ code: 'PARTIAL_COVERAGE_NOT_ZERO',
134
+ message: `partial: true requires policy_coverage_pct to be 0, got ${coverage.policy_coverage_pct}`,
135
+ path: 'coverage.policy_coverage_pct',
136
+ });
137
+ }
138
+ }
139
+ // Invariant 7: issuer.public_key_url must match primust.com/.well-known/ pattern
140
+ const issuer = artifact.issuer;
141
+ if (issuer && typeof issuer.public_key_url === 'string') {
142
+ if (!PUBLIC_KEY_URL_PATTERN.test(issuer.public_key_url)) {
143
+ errors.push({
144
+ code: 'ISSUER_URL_INVALID',
145
+ message: `issuer.public_key_url must match https://primust.com/.well-known/primust-pubkeys/*.pem, got "${issuer.public_key_url}"`,
146
+ path: 'issuer.public_key_url',
147
+ });
148
+ }
149
+ }
150
+ return { valid: errors.length === 0, errors };
151
+ }
152
+ /** Recursively check for reliance_mode in any nested object */
153
+ function checkNestedRelianceMode(obj, path, errors) {
154
+ for (const [key, value] of Object.entries(obj)) {
155
+ const currentPath = path ? `${path}.${key}` : key;
156
+ if (key === 'reliance_mode' && currentPath !== 'reliance_mode') {
157
+ errors.push({
158
+ code: 'RELIANCE_MODE_FORBIDDEN',
159
+ message: `reliance_mode field is forbidden in VPEC artifacts (found at ${currentPath})`,
160
+ path: currentPath,
161
+ });
162
+ }
163
+ if (value && typeof value === 'object' && !Array.isArray(value)) {
164
+ checkNestedRelianceMode(value, currentPath, errors);
165
+ }
166
+ }
167
+ }
168
+ //# sourceMappingURL=validate-artifact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-artifact.js","sourceRoot":"","sources":["../src/validate-artifact.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=validate-artifact.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-artifact.test.d.ts","sourceRoot":"","sources":["../src/validate-artifact.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,300 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { validateArtifact } from './validate-artifact.js';
3
+ /** Build a valid VPEC artifact fixture. Override fields as needed. */
4
+ function validArtifact(overrides = {}) {
5
+ const base = {
6
+ vpec_id: 'vpec_00000000-0000-0000-0000-000000000001',
7
+ schema_version: '4.0.0',
8
+ org_id: 'org_test',
9
+ run_id: 'run_00000000-0000-0000-0000-000000000001',
10
+ workflow_id: 'wf_test',
11
+ process_context_hash: null,
12
+ policy_snapshot_hash: 'sha256:' + 'a'.repeat(64),
13
+ policy_basis: 'P1_self_declared',
14
+ partial: false,
15
+ surface_summary: [
16
+ {
17
+ surface_id: 'surf_1',
18
+ surface_type: 'in_process_adapter',
19
+ observation_mode: 'pre_action',
20
+ proof_ceiling: 'execution',
21
+ scope_type: 'full_workflow',
22
+ scope_description: 'Full workflow adapter',
23
+ surface_coverage_statement: 'All tool calls in graph scope',
24
+ },
25
+ ],
26
+ proof_level: 'execution',
27
+ proof_distribution: {
28
+ mathematical: 0,
29
+ verifiable_inference: 0,
30
+ execution: 5,
31
+ witnessed: 0,
32
+ attestation: 0,
33
+ weakest_link: 'execution',
34
+ weakest_link_explanation: 'All checks ran in execution mode',
35
+ },
36
+ state: 'signed',
37
+ coverage: {
38
+ records_total: 5,
39
+ records_pass: 4,
40
+ records_fail: 0,
41
+ records_degraded: 1,
42
+ records_not_applicable: 0,
43
+ policy_coverage_pct: 100,
44
+ instrumentation_surface_pct: 95.5,
45
+ instrumentation_surface_basis: 'LangGraph full_workflow adapter — all tool calls in graph scope.',
46
+ },
47
+ gaps: [],
48
+ manifest_hashes: {
49
+ 'manifest_001': 'sha256:' + 'b'.repeat(64),
50
+ },
51
+ commitment_root: 'poseidon2:' + 'c'.repeat(64),
52
+ commitment_algorithm: 'poseidon2',
53
+ zk_proof: null,
54
+ issuer: {
55
+ signer_id: 'signer_test',
56
+ kid: 'kid_test',
57
+ algorithm: 'Ed25519',
58
+ public_key_url: 'https://primust.com/.well-known/primust-pubkeys/abc123.pem',
59
+ org_region: 'us',
60
+ },
61
+ signature: {
62
+ signer_id: 'signer_test',
63
+ kid: 'kid_test',
64
+ algorithm: 'Ed25519',
65
+ signature: 'dGVzdF9zaWduYXR1cmU',
66
+ signed_at: '2026-03-10T00:00:00Z',
67
+ },
68
+ timestamp_anchor: {
69
+ type: 'none',
70
+ tsa: 'none',
71
+ value: null,
72
+ },
73
+ transparency_log: {
74
+ rekor_log_id: null,
75
+ rekor_entry_url: null,
76
+ published_at: null,
77
+ },
78
+ issued_at: '2026-03-10T00:00:00Z',
79
+ pending_flags: {
80
+ signature_pending: false,
81
+ proof_pending: false,
82
+ zkml_proof_pending: false,
83
+ submission_pending: false,
84
+ rekor_pending: true,
85
+ },
86
+ test_mode: false,
87
+ };
88
+ return { ...base, ...overrides };
89
+ }
90
+ describe('validateArtifact', () => {
91
+ it('valid artifact passes validation', () => {
92
+ const result = validateArtifact(validArtifact());
93
+ expect(result.valid).toBe(true);
94
+ expect(result.errors).toHaveLength(0);
95
+ });
96
+ describe('MUST PASS: invariant enforcement', () => {
97
+ it('proof_level above weakest_link → validation error', () => {
98
+ const artifact = validArtifact({
99
+ proof_level: 'mathematical',
100
+ proof_distribution: {
101
+ mathematical: 0,
102
+ verifiable_inference: 0,
103
+ execution: 5,
104
+ witnessed: 0,
105
+ attestation: 0,
106
+ weakest_link: 'execution',
107
+ weakest_link_explanation: 'All checks ran in execution mode',
108
+ },
109
+ });
110
+ const result = validateArtifact(artifact);
111
+ expect(result.valid).toBe(false);
112
+ expect(result.errors.some((e) => e.code === 'PROOF_LEVEL_MISMATCH')).toBe(true);
113
+ });
114
+ it('reliance_mode field anywhere → validation error', () => {
115
+ const artifact = validArtifact({ reliance_mode: 'full' });
116
+ const result = validateArtifact(artifact);
117
+ expect(result.valid).toBe(false);
118
+ expect(result.errors.some((e) => e.code === 'RELIANCE_MODE_FORBIDDEN')).toBe(true);
119
+ });
120
+ it('reliance_mode nested in sub-object → validation error', () => {
121
+ const artifact = validArtifact();
122
+ artifact.coverage.reliance_mode = 'partial';
123
+ const result = validateArtifact(artifact);
124
+ expect(result.valid).toBe(false);
125
+ expect(result.errors.some((e) => e.code === 'RELIANCE_MODE_FORBIDDEN')).toBe(true);
126
+ });
127
+ it('manifest_hashes as array → validation error', () => {
128
+ const artifact = validArtifact({
129
+ manifest_hashes: ['sha256:' + 'a'.repeat(64)],
130
+ });
131
+ const result = validateArtifact(artifact);
132
+ expect(result.valid).toBe(false);
133
+ expect(result.errors.some((e) => e.code === 'MANIFEST_HASHES_NOT_MAP')).toBe(true);
134
+ });
135
+ it('gaps with bare string IDs → validation error', () => {
136
+ const artifact = validArtifact({
137
+ gaps: ['gap_001', 'gap_002'],
138
+ });
139
+ const result = validateArtifact(artifact);
140
+ expect(result.valid).toBe(false);
141
+ expect(result.errors.some((e) => e.code === 'GAP_BARE_STRING')).toBe(true);
142
+ });
143
+ it('test_mode: true + proof_pending: true → valid provisional artifact', () => {
144
+ const artifact = validArtifact({
145
+ test_mode: true,
146
+ state: 'provisional',
147
+ pending_flags: {
148
+ signature_pending: false,
149
+ proof_pending: true,
150
+ zkml_proof_pending: false,
151
+ submission_pending: false,
152
+ rekor_pending: true,
153
+ },
154
+ });
155
+ const result = validateArtifact(artifact);
156
+ expect(result.valid).toBe(true);
157
+ });
158
+ it('schema_version: "4.0.0" on all issued artifacts', () => {
159
+ const artifact = validArtifact({ schema_version: '2.0.0' });
160
+ const result = validateArtifact(artifact);
161
+ expect(result.valid).toBe(false);
162
+ expect(result.errors.some((e) => e.code === 'INVALID_SCHEMA_VERSION')).toBe(true);
163
+ });
164
+ it('all 5 proof levels valid in proof_level enum', () => {
165
+ const levels = ['mathematical', 'verifiable_inference', 'execution', 'witnessed', 'attestation'];
166
+ for (const level of levels) {
167
+ const artifact = validArtifact({
168
+ proof_level: level,
169
+ proof_distribution: {
170
+ mathematical: 0,
171
+ verifiable_inference: 0,
172
+ execution: 0,
173
+ witnessed: 0,
174
+ attestation: 0,
175
+ [level]: 5,
176
+ weakest_link: level,
177
+ weakest_link_explanation: `All at ${level}`,
178
+ },
179
+ });
180
+ const result = validateArtifact(artifact);
181
+ expect(result.errors.filter((e) => e.code === 'INVALID_PROOF_LEVEL')).toHaveLength(0);
182
+ }
183
+ });
184
+ it('all 16 gap types valid in gap_type enum', () => {
185
+ const gapTypes = [
186
+ 'check_not_executed',
187
+ 'enforcement_override',
188
+ 'engine_error',
189
+ 'check_degraded',
190
+ 'external_boundary_traversal',
191
+ 'lineage_token_missing',
192
+ 'admission_gate_override',
193
+ 'check_timing_suspect',
194
+ 'reviewer_credential_invalid',
195
+ 'witnessed_display_missing',
196
+ 'witnessed_rationale_missing',
197
+ 'deterministic_consistency_violation',
198
+ 'skip_rationale_missing',
199
+ 'policy_config_drift',
200
+ 'zkml_proof_pending_timeout',
201
+ 'zkml_proof_failed',
202
+ ];
203
+ // 16 gap types — spec says 15 but there are 16 in the enum
204
+ expect(gapTypes).toHaveLength(16);
205
+ const gaps = gapTypes.map((gt, i) => ({
206
+ gap_id: `gap_${i}`,
207
+ gap_type: gt,
208
+ severity: 'Medium',
209
+ }));
210
+ const artifact = validArtifact({ gaps });
211
+ const result = validateArtifact(artifact);
212
+ expect(result.errors.filter((e) => e.code === 'GAP_INVALID_TYPE_VALUE')).toHaveLength(0);
213
+ });
214
+ });
215
+ describe('additional invariants', () => {
216
+ it('partial: true with non-zero policy_coverage_pct → error', () => {
217
+ const artifact = validArtifact({
218
+ partial: true,
219
+ coverage: {
220
+ records_total: 5,
221
+ records_pass: 3,
222
+ records_fail: 0,
223
+ records_degraded: 0,
224
+ records_not_applicable: 2,
225
+ policy_coverage_pct: 60,
226
+ instrumentation_surface_pct: 100,
227
+ instrumentation_surface_basis: 'Full scope',
228
+ },
229
+ });
230
+ const result = validateArtifact(artifact);
231
+ expect(result.valid).toBe(false);
232
+ expect(result.errors.some((e) => e.code === 'PARTIAL_COVERAGE_NOT_ZERO')).toBe(true);
233
+ });
234
+ it('partial: true with policy_coverage_pct 0 → valid', () => {
235
+ const artifact = validArtifact({
236
+ partial: true,
237
+ coverage: {
238
+ records_total: 5,
239
+ records_pass: 3,
240
+ records_fail: 0,
241
+ records_degraded: 0,
242
+ records_not_applicable: 2,
243
+ policy_coverage_pct: 0,
244
+ instrumentation_surface_pct: null,
245
+ instrumentation_surface_basis: 'Partial — coverage not calculated',
246
+ },
247
+ });
248
+ const result = validateArtifact(artifact);
249
+ expect(result.valid).toBe(true);
250
+ });
251
+ it('issuer.public_key_url with wrong domain → error', () => {
252
+ const artifact = validArtifact({
253
+ issuer: {
254
+ signer_id: 'signer_test',
255
+ kid: 'kid_test',
256
+ algorithm: 'Ed25519',
257
+ public_key_url: 'https://evil.com/.well-known/primust-pubkeys/abc.pem',
258
+ org_region: 'us',
259
+ },
260
+ });
261
+ const result = validateArtifact(artifact);
262
+ expect(result.valid).toBe(false);
263
+ expect(result.errors.some((e) => e.code === 'ISSUER_URL_INVALID')).toBe(true);
264
+ });
265
+ it('invalid gap_type value → error', () => {
266
+ const artifact = validArtifact({
267
+ gaps: [{ gap_id: 'g1', gap_type: 'nonexistent_type', severity: 'High' }],
268
+ });
269
+ const result = validateArtifact(artifact);
270
+ expect(result.valid).toBe(false);
271
+ expect(result.errors.some((e) => e.code === 'GAP_INVALID_TYPE_VALUE')).toBe(true);
272
+ });
273
+ it('gap missing gap_type and severity → error', () => {
274
+ const artifact = validArtifact({
275
+ gaps: [{ gap_id: 'g1' }],
276
+ });
277
+ const result = validateArtifact(artifact);
278
+ expect(result.valid).toBe(false);
279
+ expect(result.errors.some((e) => e.code === 'GAP_MISSING_FIELDS')).toBe(true);
280
+ });
281
+ it('invalid proof_level value → error', () => {
282
+ const artifact = validArtifact({
283
+ proof_level: 'quantum_proof',
284
+ proof_distribution: {
285
+ mathematical: 0,
286
+ verifiable_inference: 0,
287
+ execution: 0,
288
+ witnessed: 0,
289
+ attestation: 5,
290
+ weakest_link: 'quantum_proof',
291
+ weakest_link_explanation: 'invalid',
292
+ },
293
+ });
294
+ const result = validateArtifact(artifact);
295
+ expect(result.valid).toBe(false);
296
+ expect(result.errors.some((e) => e.code === 'INVALID_PROOF_LEVEL')).toBe(true);
297
+ });
298
+ });
299
+ });
300
+ //# sourceMappingURL=validate-artifact.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-artifact.test.js","sourceRoot":"","sources":["../src/validate-artifact.test.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "@primust/artifact-core",
3
+ "version": "1.0.0",
4
+ "description": "Canonical JSON, commitment hashing, and Ed25519 signing primitives for Primust.",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "files": [
9
+ "dist"
10
+ ],
11
+ "license": "SEE LICENSE IN LICENSE",
12
+ "author": "Primust, Inc. <eng@primust.com>",
13
+ "homepage": "https://primust.com",
14
+ "repository": {
15
+ "type": "git",
16
+ "url": "https://github.com/primust-dev/primust.git",
17
+ "directory": "packages/artifact-core"
18
+ },
19
+ "publishConfig": {
20
+ "access": "public"
21
+ },
22
+ "dependencies": {
23
+ "@noble/ed25519": "^2.3.0",
24
+ "@noble/hashes": "^1.8.0",
25
+ "@zkpassport/poseidon2": "^0.6.2"
26
+ },
27
+ "exports": {
28
+ ".": {
29
+ "import": "./dist/index.js",
30
+ "types": "./dist/index.d.ts"
31
+ }
32
+ },
33
+ "scripts": {
34
+ "build": "tsc",
35
+ "test": "vitest run"
36
+ }
37
+ }