@bsv/dpp-profiles 0.3.0-beta.1

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 (96) hide show
  1. package/LICENSE +58 -0
  2. package/README.md +64 -0
  3. package/dist/applicability.d.ts +96 -0
  4. package/dist/applicability.d.ts.map +1 -0
  5. package/dist/applicability.js +181 -0
  6. package/dist/applicability.js.map +1 -0
  7. package/dist/combinations.d.ts +30 -0
  8. package/dist/combinations.d.ts.map +1 -0
  9. package/dist/combinations.js +103 -0
  10. package/dist/combinations.js.map +1 -0
  11. package/dist/evidence-shapes.d.ts +198 -0
  12. package/dist/evidence-shapes.d.ts.map +1 -0
  13. package/dist/evidence-shapes.js +123 -0
  14. package/dist/evidence-shapes.js.map +1 -0
  15. package/dist/gs1-epc-binary.d.ts +81 -0
  16. package/dist/gs1-epc-binary.d.ts.map +1 -0
  17. package/dist/gs1-epc-binary.js +252 -0
  18. package/dist/gs1-epc-binary.js.map +1 -0
  19. package/dist/gs1-resolution.d.ts +392 -0
  20. package/dist/gs1-resolution.d.ts.map +1 -0
  21. package/dist/gs1-resolution.js +696 -0
  22. package/dist/gs1-resolution.js.map +1 -0
  23. package/dist/identifiers.d.ts +57 -0
  24. package/dist/identifiers.d.ts.map +1 -0
  25. package/dist/identifiers.js +117 -0
  26. package/dist/identifiers.js.map +1 -0
  27. package/dist/index.d.ts +235 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +124 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/manifest-v2.d.ts +87 -0
  32. package/dist/manifest-v2.d.ts.map +1 -0
  33. package/dist/manifest-v2.js +31 -0
  34. package/dist/manifest-v2.js.map +1 -0
  35. package/dist/mapping.d.ts +84 -0
  36. package/dist/mapping.d.ts.map +1 -0
  37. package/dist/mapping.js +88 -0
  38. package/dist/mapping.js.map +1 -0
  39. package/dist/projections.d.ts +233 -0
  40. package/dist/projections.d.ts.map +1 -0
  41. package/dist/projections.js +466 -0
  42. package/dist/projections.js.map +1 -0
  43. package/frozen.json +42 -0
  44. package/generated/consumer/battery-v2.json +2248 -0
  45. package/generated/consumer/battery-v3.json +4354 -0
  46. package/generated/consumer/general-v1.json +9 -0
  47. package/generated/consumer/general-v2.json +714 -0
  48. package/generated/consumer/textile-v1.json +101 -0
  49. package/generated/consumer/textile-v2.json +1033 -0
  50. package/generated/consumer/textile-v3.json +2011 -0
  51. package/generated/index.json +86 -0
  52. package/generated/mapping/battery@2.md +116 -0
  53. package/generated/mapping/battery@3.md +130 -0
  54. package/generated/mapping/general@2.md +50 -0
  55. package/generated/mapping/textile@2.md +61 -0
  56. package/generated/mapping/textile@3.md +73 -0
  57. package/generated/payload-schema/battery@2.public.schema.json +609 -0
  58. package/generated/payload-schema/battery@2.restricted.schema.json +377 -0
  59. package/generated/payload-schema/battery@3.public.schema.json +1364 -0
  60. package/generated/payload-schema/battery@3.restricted.schema.json +1097 -0
  61. package/generated/payload-schema/general@1.public.schema.json +37 -0
  62. package/generated/payload-schema/general@1.restricted.schema.json +9 -0
  63. package/generated/payload-schema/general@2.public.schema.json +352 -0
  64. package/generated/payload-schema/general@2.restricted.schema.json +52 -0
  65. package/generated/payload-schema/textile@1.public.schema.json +82 -0
  66. package/generated/payload-schema/textile@1.restricted.schema.json +22 -0
  67. package/generated/payload-schema/textile@2.public.schema.json +464 -0
  68. package/generated/payload-schema/textile@2.restricted.schema.json +78 -0
  69. package/generated/payload-schema/textile@3.public.schema.json +1299 -0
  70. package/generated/payload-schema/textile@3.restricted.schema.json +78 -0
  71. package/manifests/battery@2.json +4047 -0
  72. package/manifests/battery@3.json +6164 -0
  73. package/manifests/exchange/untp-0.7.0-jose@1.json +191 -0
  74. package/manifests/exchange/vc-di-ecdsa-rdfc-2019@1.json +74 -0
  75. package/manifests/exchange/vsc-draft-compat@0.1.0.json +64 -0
  76. package/manifests/general@1.json +148 -0
  77. package/manifests/general@2.json +1266 -0
  78. package/manifests/interoperability/epcis-json@1.json +69 -0
  79. package/manifests/interoperability/epcis-vsc@1.json +64 -0
  80. package/manifests/interoperability/gs1-digital-link@1.json +71 -0
  81. package/manifests/operator/federated-operators@1.json +54 -0
  82. package/manifests/operator/single-operator@1.json +52 -0
  83. package/manifests/textile@1.json +383 -0
  84. package/manifests/textile@2.json +1682 -0
  85. package/manifests/textile@3.json +2763 -0
  86. package/package.json +59 -0
  87. package/schemas/exchange-profile.schema.json +134 -0
  88. package/schemas/gs1/NOTICE.md +11 -0
  89. package/schemas/gs1/resolver-description-file-schema-1.2.0.json +124 -0
  90. package/schemas/gs1/resolver-linkset-context-1.2.1.jsonld +39 -0
  91. package/schemas/gs1/resolver-linkset-schema-1.2.1.json +96 -0
  92. package/schemas/interoperability-profile.schema.json +347 -0
  93. package/schemas/operator-profile.schema.json +108 -0
  94. package/schemas/product-identity.schema.json +45 -0
  95. package/schemas/profile-manifest-v2.schema.json +1087 -0
  96. package/schemas/profile-manifest.schema.json +291 -0
@@ -0,0 +1,466 @@
1
+ /**
2
+ * Deterministic passport projections (`spec/passport-projections.md` §4,
3
+ * `contracts/passport-projection.schema.json`): from pinned source revisions,
4
+ * accepted relationships, a named policy, a cutoff and an audience, derive
5
+ * the value of every field the profile declares, with the source each value
6
+ * came from and a separate result for its availability, its applicability and
7
+ * any conflict. Pure: no storage, no network, no clock. The same inputs in
8
+ * any arrival order produce the same `projectionDigest`, which is SHA-256 of
9
+ * the RFC 8785 canonical JSON of the commitment body; the identity is derived
10
+ * from that digest and is never a secured-source digest.
11
+ *
12
+ * The precedence rules this file implements, numbered as the specification
13
+ * numbers them: (1) only field locations and granularities the profile
14
+ * declares are read, so a model specification never stands in for an item
15
+ * measurement; (2) the pinned revisions are read, never whichever revision is
16
+ * newest; (3) a batch or item value overrides the model's only where the
17
+ * field and the policy declare it, otherwise the two are a conflict with both
18
+ * sources named; (4) a dynamic measurement is matched on subject, property,
19
+ * method and unit exactly and selected by observation time under the policy,
20
+ * with a tie a conflict, so arrival order is never authority; (5) invalid,
21
+ * revoked and correction-unresolved evidence is excluded and listed; (6) zero
22
+ * and false are values, and availability, applicability and findings are
23
+ * separate axes; (7) traversal is bounded, and a cycle, a missing source or an
24
+ * exceeded limit is a finding, never a silent omission.
25
+ */
26
+ import { createHash } from 'node:crypto';
27
+ import canonicalize from 'canonicalize';
28
+ import { isFieldV2 } from './manifest-v2.js';
29
+ import { categoryOf, declaredInapplicable, evaluateFieldApplicability } from './applicability.js';
30
+ import { selectLanguage } from './evidence-shapes.js';
31
+ export const PROJECTION_VERSION = '1';
32
+ export const PROJECTION_ID_PREFIX = 'urn:bsv:dpp:projection:sha256:';
33
+ export const DEFAULT_PROJECTION_LIMITS = { maxDepth: 8, maxRefs: 100 };
34
+ const GRANULARITY_ORDER = { model: 0, batch: 1, item: 2, component: 3 };
35
+ const AUDIENCE = {
36
+ public: ['public'],
37
+ owner: ['public', 'owner'],
38
+ legitimate: ['public', 'legitimate'],
39
+ authority: ['public', 'legitimate', 'authority'],
40
+ };
41
+ const COMPLETENESS_FINDINGS = new Set(['limit', 'cycle', 'missing-source', 'duplicate-revision', 'profile-mismatch']);
42
+ /** SHA-256 of the RFC 8785 canonical JSON of an inline payload. A retained source's digest is over its exact retained bytes; this is the digest of a payload carried inline. */
43
+ export function payloadDigest(payload) {
44
+ return createHash('sha256').update(canonicalJson(payload), 'utf8').digest('hex');
45
+ }
46
+ function canonicalJson(value) {
47
+ const text = canonicalize(value);
48
+ if (text == null)
49
+ throw new Error('the value has no canonical JSON form');
50
+ return text;
51
+ }
52
+ /** Refuse a non-finite number anywhere in a value: it has no canonical form and no meaning as a fact. */
53
+ function assertFinite(value, path) {
54
+ if (typeof value === 'number') {
55
+ if (!Number.isFinite(value))
56
+ throw new Error(`${path} is not a finite number`);
57
+ return;
58
+ }
59
+ if (Array.isArray(value)) {
60
+ value.forEach((v, i) => assertFinite(v, `${path}[${i}]`));
61
+ return;
62
+ }
63
+ if (value != null && typeof value === 'object')
64
+ for (const [k, v] of Object.entries(value))
65
+ assertFinite(v, `${path}.${k}`);
66
+ }
67
+ const compare = (a, b) => (a < b ? -1 : a > b ? 1 : 0);
68
+ const instant = (value) => {
69
+ const t = Date.parse(value);
70
+ if (!Number.isFinite(t))
71
+ throw new Error(`${value} is not a date or instant`);
72
+ return t;
73
+ };
74
+ function hasValue(payload, key) {
75
+ const v = payload[key];
76
+ return v !== undefined && v !== null && v !== '';
77
+ }
78
+ /** The commitment body: every committed property, none of the derived or diagnostic ones (`spec/passport-projections.md` §4). */
79
+ export function projectionCommitmentBody(projection) {
80
+ return {
81
+ projectionVersion: projection.projectionVersion,
82
+ passportId: projection.passportId,
83
+ subjectId: projection.subjectId,
84
+ granularity: projection.granularity,
85
+ profileRef: projection.profileRef,
86
+ sourceRefs: projection.sourceRefs,
87
+ relationshipRefs: projection.relationshipRefs,
88
+ policyRef: projection.policyRef,
89
+ asOf: projection.asOf,
90
+ disclosureScope: projection.disclosureScope,
91
+ values: projection.values,
92
+ fieldResults: projection.fieldResults,
93
+ evidenceRefs: projection.evidenceRefs,
94
+ validationRefs: projection.validationRefs,
95
+ };
96
+ }
97
+ /** The canonical bytes of the commitment body, as a UTF-8 string. */
98
+ export function projectionCommitment(projection) {
99
+ return canonicalJson(projectionCommitmentBody(projection));
100
+ }
101
+ export function projectionDigest(projection) {
102
+ return createHash('sha256').update(projectionCommitment(projection), 'utf8').digest('hex');
103
+ }
104
+ /** Whether a projection's recorded identity and digest are the ones its committed body yields. */
105
+ export function verifyProjectionCommitment(projection) {
106
+ const digest = projectionDigest(projection);
107
+ return { digestValid: digest === projection.projectionDigest, idValid: projection.projectionId === `${PROJECTION_ID_PREFIX}${projection.projectionDigest}` };
108
+ }
109
+ /**
110
+ * Derive one passport's projection. Throws only for a caller error: a
111
+ * non-finite number in a payload or a measurement, or a date that is not one.
112
+ * Every other difficulty is a finding in the output.
113
+ */
114
+ export function projectPassport(input) {
115
+ const limits = { maxDepth: input.limits?.maxDepth ?? DEFAULT_PROJECTION_LIMITS.maxDepth, maxRefs: input.limits?.maxRefs ?? DEFAULT_PROJECTION_LIMITS.maxRefs };
116
+ const findings = [];
117
+ const finding = (code, detail, field) => { findings.push({ code, ...(field == null ? {} : { field }), detail }); };
118
+ const asOf = input.asOf ?? null;
119
+ const cutoff = asOf == null ? undefined : instant(asOf);
120
+ // The inputs in a canonical order, so nothing below depends on arrival order.
121
+ const sources = [...input.sources].sort((a, b) => compare(a.recordId, b.recordId) || compare(a.revisionId, b.revisionId));
122
+ const relationships = [...input.relationships].sort((a, b) => compare(a.relationshipId, b.relationshipId));
123
+ const measurements = [...(input.measurements ?? [])].sort((a, b) => compare(a.source.recordId, b.source.recordId) || compare(a.source.revisionId, b.source.revisionId) || compare(a.property, b.property) || compare(a.observedAt, b.observedAt));
124
+ for (const s of sources)
125
+ assertFinite(s.payload, `source ${s.recordId}@${s.revisionId} payload`);
126
+ for (const m of measurements)
127
+ assertFinite(m.value, `measurement ${m.property} of ${m.subject.id}`);
128
+ // (7) Bounded traversal of the subject graph: item to batch to model, with components and successors recorded and not entered.
129
+ const visited = new Map();
130
+ const followed = [];
131
+ let refs = 0;
132
+ let truncated = false;
133
+ const queue = [{ id: input.subject.id, granularity: input.subject.granularity, depth: 0, path: [input.subject.id] }];
134
+ while (queue.length > 0 && !truncated) {
135
+ const node = queue.shift();
136
+ if (visited.has(node.id))
137
+ continue;
138
+ visited.set(node.id, { id: node.id, granularity: node.granularity, depth: node.depth });
139
+ for (const rel of relationships) {
140
+ const outward = rel.source.id === node.id && (rel.kind === 'instance-of-model' || rel.kind === 'member-of-batch' || rel.kind === 'successor-of');
141
+ const inward = rel.target.id === node.id && rel.kind === 'component-of';
142
+ if (!outward && !inward)
143
+ continue;
144
+ refs += 1;
145
+ if (refs > limits.maxRefs) {
146
+ truncated = true;
147
+ finding('limit', `more than ${limits.maxRefs} source and relationship references; the projection is partial`);
148
+ break;
149
+ }
150
+ followed.push(rel);
151
+ if (!outward || rel.kind === 'successor-of')
152
+ continue;
153
+ if (node.path.includes(rel.target.id)) {
154
+ finding('cycle', `relationship ${rel.relationshipId} returns to ${rel.target.id}, which is already on the path ${node.path.join(' > ')}`);
155
+ continue;
156
+ }
157
+ if (node.depth + 1 > limits.maxDepth) {
158
+ finding('limit', `relationship ${rel.relationshipId} would exceed depth ${limits.maxDepth}; ${rel.target.id} was not resolved`);
159
+ truncated = true;
160
+ continue;
161
+ }
162
+ queue.push({ id: rel.target.id, granularity: rel.target.granularity, depth: node.depth + 1, path: [...node.path, rel.target.id] });
163
+ }
164
+ }
165
+ // (2) The pinned revisions of every visited subject, under the selected profile and cutoff; a record supplied at two revisions is used only when a relationship pins one.
166
+ const pinned = new Map();
167
+ for (const rel of followed)
168
+ if (rel.evidence.sourceRevision != null)
169
+ pinned.set(rel.evidence.sourceRevision.recordId, rel.evidence.sourceRevision.revisionId);
170
+ const byRecord = new Map();
171
+ for (const s of sources) {
172
+ if (!visited.has(s.subject.id))
173
+ continue;
174
+ if (cutoff != null && instant(s.recordedAt) > cutoff) {
175
+ finding('after-cutoff', `source ${s.recordId}@${s.revisionId} was recorded at ${s.recordedAt}, after the cutoff ${asOf}`);
176
+ continue;
177
+ }
178
+ if (s.profileRef.id !== input.profile.id || s.profileRef.version !== input.profile.version) {
179
+ finding('profile-mismatch', `source ${s.recordId}@${s.revisionId} is under ${s.profileRef.id}@${s.profileRef.version}, not ${input.profile.id}@${input.profile.version}, and is not read`);
180
+ continue;
181
+ }
182
+ byRecord.set(s.recordId, [...(byRecord.get(s.recordId) ?? []), s]);
183
+ }
184
+ const used = [];
185
+ for (const [recordId, revisions] of byRecord) {
186
+ if (revisions.length === 1) {
187
+ used.push(revisions[0]);
188
+ continue;
189
+ }
190
+ const chosen = pinned.get(recordId);
191
+ const match = chosen == null ? undefined : revisions.find((r) => r.revisionId === chosen);
192
+ if (match == null) {
193
+ finding('duplicate-revision', `record ${recordId} was supplied at revisions ${revisions.map((r) => r.revisionId).join(', ')} and no relationship pins one; none is read`);
194
+ continue;
195
+ }
196
+ used.push(match);
197
+ }
198
+ refs += used.length;
199
+ if (refs > limits.maxRefs && !truncated) {
200
+ truncated = true;
201
+ finding('limit', `more than ${limits.maxRefs} source and relationship references; the projection is partial`);
202
+ }
203
+ const byGranularity = new Map();
204
+ for (const s of used)
205
+ byGranularity.set(s.subject.granularity, [...(byGranularity.get(s.subject.granularity) ?? []), s]);
206
+ for (const node of visited.values()) {
207
+ if (node.granularity === 'component')
208
+ continue;
209
+ if (!used.some((s) => s.subject.id === node.id))
210
+ finding('missing-source', `no source revision was supplied for ${node.granularity} ${node.id}`);
211
+ }
212
+ // The applicability context: the category from the model's payload unless the caller names it, public values only.
213
+ const manifest = input.profile;
214
+ const stampKeys = new Set(manifest.stamps.map((s) => s.key));
215
+ const fields = manifest.fields;
216
+ const publicKeys = new Set(fields.filter((f) => f.accessTier === 'public').map((f) => f.key));
217
+ const publicValues = {};
218
+ for (const g of ['model', 'batch', 'item'])
219
+ for (const s of byGranularity.get(g) ?? [])
220
+ for (const [k, v] of Object.entries(s.payload))
221
+ if (publicKeys.has(k))
222
+ publicValues[k] = v;
223
+ const modelSource = (byGranularity.get('model') ?? [])[0];
224
+ const ctx = {
225
+ ...(input.category != null ? { category: input.category } : categoryOf(manifest, modelSource?.payload ?? publicValues) == null ? {} : { category: categoryOf(manifest, modelSource?.payload ?? publicValues) }),
226
+ ...(input.jurisdiction == null ? {} : { jurisdiction: input.jurisdiction }),
227
+ ...(asOf == null ? {} : { asOf }),
228
+ values: publicValues,
229
+ declaredNotApplicable: declaredInapplicable(publicValues),
230
+ };
231
+ const allowedTiers = AUDIENCE[input.disclosureScope];
232
+ const requested = GRANULARITY_ORDER[input.subject.granularity];
233
+ const values = {};
234
+ const fieldResults = {};
235
+ const evidence = new Set();
236
+ for (const field of fields) {
237
+ if (stampKeys.has(field.key))
238
+ continue;
239
+ const applicability = evaluateFieldApplicability(field, ctx);
240
+ const result = { availability: 'missing', applicability: applicability.outcome };
241
+ const reasons = applicability.outcome === 'unresolved' ? [...applicability.reasons] : [];
242
+ const finish = () => {
243
+ if (reasons.length > 0)
244
+ result.reason = reasons.join('; ');
245
+ fieldResults[field.key] = result;
246
+ };
247
+ if (!allowedTiers.includes(field.accessTier)) {
248
+ result.availability = 'withheld';
249
+ reasons.unshift(`the ${field.accessTier} tier is outside the ${input.disclosureScope} audience`);
250
+ finish();
251
+ continue;
252
+ }
253
+ const fieldGranularity = field.granularity;
254
+ if (GRANULARITY_ORDER[fieldGranularity] > requested) {
255
+ reasons.unshift(`the field describes a ${fieldGranularity} and the subject is a ${input.subject.granularity}`);
256
+ finish();
257
+ continue;
258
+ }
259
+ const dynamic = field.provenance.dynamic === true || field.valueType === 'measurement';
260
+ if (dynamic) {
261
+ projectMeasurement(field, fieldGranularity, result, reasons, values, evidence, measurements, visited, byGranularity, input.policy, cutoff, truncated);
262
+ finish();
263
+ continue;
264
+ }
265
+ // (1) and (3): the field's own granularity first, then declared overrides only.
266
+ const own = (byGranularity.get(fieldGranularity) ?? []).filter((s) => hasValue(s.payload, field.key));
267
+ const reachable = [...visited.values()].some((n) => n.granularity === fieldGranularity);
268
+ const hasSource = (byGranularity.get(fieldGranularity) ?? []).length > 0;
269
+ let chosen;
270
+ const conflicts = [];
271
+ if (own.length > 1) {
272
+ for (const s of own)
273
+ conflicts.push({ recordId: s.recordId, revisionId: s.revisionId, value: s.payload[field.key] });
274
+ }
275
+ else if (own.length === 1) {
276
+ chosen = own[0];
277
+ }
278
+ for (const g of ['batch', 'item']) {
279
+ if (GRANULARITY_ORDER[g] <= GRANULARITY_ORDER[fieldGranularity] || GRANULARITY_ORDER[g] > requested)
280
+ continue;
281
+ const carriers = (byGranularity.get(g) ?? []).filter((s) => hasValue(s.payload, field.key));
282
+ if (carriers.length === 0)
283
+ continue;
284
+ const declared = isFieldV2(field) ? field.overridable?.at === g : true;
285
+ const allowed = declared && (g === 'batch' ? input.policy.precedence.batchOverrides : input.policy.precedence.itemOverrides).includes(field.key);
286
+ if (allowed && carriers.length === 1) {
287
+ chosen = carriers[0];
288
+ conflicts.length = 0;
289
+ continue;
290
+ }
291
+ if (chosen != null)
292
+ conflicts.push({ recordId: chosen.recordId, revisionId: chosen.revisionId, value: chosen.payload[field.key] });
293
+ for (const s of carriers)
294
+ conflicts.push({ recordId: s.recordId, revisionId: s.revisionId, value: s.payload[field.key] });
295
+ chosen = undefined;
296
+ if (!allowed && own.length === 0 && carriers.length === 1) {
297
+ // A value carried at a finer granularity than the field declares, with no declared override: not a conflict, but not a permitted location either.
298
+ conflicts.length = 0;
299
+ result.finding = 'unsupported';
300
+ reasons.unshift(`the value is carried by ${g} ${carriers[0]?.subject.id} for a ${fieldGranularity} field without a declared override`);
301
+ }
302
+ else {
303
+ result.finding = 'conflict';
304
+ reasons.unshift(`${g} ${carriers.map((s) => s.subject.id).join(', ')} carries a value the ${fieldGranularity} does not delegate for ${field.key}`);
305
+ }
306
+ }
307
+ if (result.finding === 'conflict' || conflicts.length > 0) {
308
+ result.availability = 'present';
309
+ result.finding = 'conflict';
310
+ result.conflicts = conflicts;
311
+ if (!reasons.some((r) => r.includes('carries a value')))
312
+ reasons.unshift(`${conflicts.length} sources carry different authority for ${field.key}`);
313
+ finish();
314
+ continue;
315
+ }
316
+ if (result.finding === 'unsupported') {
317
+ finish();
318
+ continue;
319
+ }
320
+ if (chosen == null) {
321
+ if (!reachable || !hasSource) {
322
+ result.availability = 'unknown';
323
+ result.finding = truncated && !reachable ? 'limit' : 'missing-source';
324
+ reasons.unshift(!reachable ? `no ${fieldGranularity} is related to ${input.subject.id}` : `no source revision was supplied for the ${fieldGranularity}`);
325
+ }
326
+ else {
327
+ const coarser = ['model', 'batch'].filter((g) => GRANULARITY_ORDER[g] < GRANULARITY_ORDER[fieldGranularity]).find((g) => (byGranularity.get(g) ?? []).some((s) => hasValue(s.payload, field.key)));
328
+ if (coarser != null)
329
+ reasons.unshift(`${coarser}-only information: the ${coarser} carries ${field.key} and a ${fieldGranularity} value is not fabricated from it`);
330
+ }
331
+ finish();
332
+ continue;
333
+ }
334
+ const raw = chosen.payload[field.key];
335
+ const projected = interpretValue(field, raw, chosen, input.locale);
336
+ if ('reason' in projected) {
337
+ result.availability = 'present';
338
+ result.finding = 'unsupported';
339
+ reasons.unshift(projected.reason);
340
+ finish();
341
+ continue;
342
+ }
343
+ result.availability = 'present';
344
+ values[field.key] = projected.value;
345
+ finish();
346
+ }
347
+ const sourceRefs = used.map((s) => ({ recordId: s.recordId, revisionId: s.revisionId, digest: s.digest, subjectId: s.subject.id, granularity: s.subject.granularity }))
348
+ .sort((a, b) => compare(a.recordId, b.recordId) || compare(a.revisionId, b.revisionId));
349
+ const relationshipRefs = followed.map((r) => ({ relationshipId: r.relationshipId, kind: r.kind, sourceId: r.source.id, targetId: r.target.id, policyRef: r.policyRef }))
350
+ .sort((a, b) => compare(a.relationshipId, b.relationshipId));
351
+ for (const r of followed)
352
+ if (r.evidence.credentialRef != null)
353
+ evidence.add(`credential:${r.evidence.credentialRef.id}`);
354
+ for (const s of used)
355
+ if (s.authorisation.evidenceRef != null)
356
+ evidence.add(`authorisation:${s.authorisation.evidenceRef}`);
357
+ const projection = {
358
+ projectionId: '',
359
+ projectionVersion: PROJECTION_VERSION,
360
+ projectionDigest: '',
361
+ passportId: input.passportId,
362
+ subjectId: input.subject.id,
363
+ granularity: input.subject.granularity,
364
+ profileRef: { id: manifest.id, version: manifest.version },
365
+ sourceRefs,
366
+ relationshipRefs,
367
+ policyRef: input.policy.id,
368
+ asOf,
369
+ disclosureScope: input.disclosureScope,
370
+ values: Object.fromEntries(Object.entries(values).sort(([a], [b]) => compare(a, b))),
371
+ fieldResults: Object.fromEntries(Object.entries(fieldResults).sort(([a], [b]) => compare(a, b))),
372
+ evidenceRefs: [...evidence].sort(compare),
373
+ validationRefs: [...(input.validationRefs ?? [])].sort(compare),
374
+ diagnostics: { truncated, limits: { maxDepth: limits.maxDepth, maxRefs: limits.maxRefs, refsUsed: Math.min(refs, limits.maxRefs + 1) }, findings },
375
+ };
376
+ projection.projectionDigest = projectionDigest(projection);
377
+ projection.projectionId = `${PROJECTION_ID_PREFIX}${projection.projectionDigest}`;
378
+ const ok = !findings.some((f) => COMPLETENESS_FINDINGS.has(f.code));
379
+ return { projection, validation: { ok, findings } };
380
+ }
381
+ /** (4) and (5): the one accepted measurement of a dynamic field, or the reason there is none. */
382
+ function projectMeasurement(field, granularity, result, reasons, values, evidence, measurements, visited, byGranularity, policy, cutoff, truncated) {
383
+ const subjects = [...visited.values()].filter((n) => n.granularity === granularity).map((n) => n.id);
384
+ if (subjects.length === 0) {
385
+ result.availability = 'unknown';
386
+ result.finding = truncated ? 'limit' : 'missing-source';
387
+ reasons.unshift(`no ${granularity} is related to the subject, so no ${field.key} observation can be attributed`);
388
+ return;
389
+ }
390
+ const scoped = measurements.filter((m) => subjects.includes(m.subject.id) && m.subject.granularity === granularity && m.property === field.key && (field.unit == null || m.unit === field.unit));
391
+ const excluded = [];
392
+ const accepted = [];
393
+ for (const m of scoped) {
394
+ if (cutoff != null && instant(m.observedAt) > cutoff) {
395
+ excluded.push({ ...m.source, reason: `observed at ${m.observedAt}, after the cutoff` });
396
+ continue;
397
+ }
398
+ const status = m.status ?? 'accepted';
399
+ if (status !== 'accepted') {
400
+ excluded.push({ ...m.source, reason: `${status} evidence is not read` });
401
+ continue;
402
+ }
403
+ if (m.method == null || m.method === '') {
404
+ excluded.push({ ...m.source, reason: 'no method is named' });
405
+ continue;
406
+ }
407
+ accepted.push(m);
408
+ }
409
+ if (excluded.length > 0)
410
+ result.excluded = excluded;
411
+ const wrongUnit = measurements.filter((m) => subjects.includes(m.subject.id) && m.property === field.key && field.unit != null && m.unit !== field.unit);
412
+ if (accepted.length === 0) {
413
+ result.availability = 'missing';
414
+ const modelCarries = (byGranularity.get('model') ?? []).some((s) => hasValue(s.payload, field.key));
415
+ reasons.unshift(wrongUnit.length > 0 ? `${wrongUnit.length} observation(s) of ${field.key} are in another unit than ${field.unit}` : modelCarries ? `model-only information: the model declares ${field.key} and no accepted ${granularity} observation exists` : `no accepted ${granularity} observation of ${field.key}`);
416
+ return;
417
+ }
418
+ const methods = [...new Set(accepted.map((m) => m.method))].sort(compare);
419
+ if (methods.length > 1) {
420
+ result.availability = 'present';
421
+ result.finding = 'conflict';
422
+ result.conflicts = accepted.map((m) => ({ ...m.source, value: m.value }));
423
+ reasons.unshift(`observations under different methods (${methods.join(', ')}) are not compared`);
424
+ return;
425
+ }
426
+ const key = (m) => instant(policy.measurementSelection === 'latest-effective' ? m.effectiveAt ?? m.observedAt : m.observedAt);
427
+ const ordered = [...accepted].sort((a, b) => key(b) - key(a) || compare(a.source.recordId, b.source.recordId) || compare(a.source.revisionId, b.source.revisionId));
428
+ const top = ordered[0];
429
+ const ties = ordered.filter((m) => key(m) === key(top));
430
+ if (ties.some((m) => JSON.stringify(m.value) !== JSON.stringify(top.value))) {
431
+ result.availability = 'present';
432
+ result.finding = 'conflict';
433
+ result.conflicts = ties.map((m) => ({ ...m.source, value: m.value }));
434
+ reasons.unshift(`${ties.length} observations at ${top.observedAt} disagree and the policy resolves a tie as a conflict`);
435
+ return;
436
+ }
437
+ result.availability = 'present';
438
+ values[field.key] = { value: top.value, source: { recordId: top.source.recordId, revisionId: top.source.revisionId, pointer: `/${field.key}` }, granularity, observedAt: top.observedAt, method: top.method };
439
+ evidence.add(`source-revision:${top.source.recordId}@${top.source.revisionId}`);
440
+ }
441
+ /** A payload value read under the field's type: language selection for a localised text, an explicit basis for a percent, and the value as it is otherwise. */
442
+ function interpretValue(field, raw, source, locale) {
443
+ const base = { source: { recordId: source.recordId, revisionId: source.revisionId, pointer: field.pointer }, granularity: source.subject.granularity };
444
+ const isRecord = raw != null && typeof raw === 'object' && !Array.isArray(raw);
445
+ if (field.valueType === 'localisedText' || (isRecord && Array.isArray(raw.values) && raw.values.every((v) => v != null && typeof v === 'object' && 'language' in v && 'text' in v))) {
446
+ const candidates = raw.values;
447
+ if (locale == null)
448
+ return { value: { ...base, value: raw } };
449
+ const selected = selectLanguage(candidates, locale);
450
+ if (selected == null)
451
+ return { reason: `no value of ${field.key} in ${locale.exact ?? locale.base ?? locale.default} or its base language or the default ${locale.default}` };
452
+ return { value: { ...base, value: selected.text, language: selected.language, selection: selected.selection } };
453
+ }
454
+ if (field.valueType === 'percent' && isRecord) {
455
+ const record = raw;
456
+ if (typeof record.value !== 'number')
457
+ return { reason: `${field.key} carries no numeric value` };
458
+ if (record.basis === 'percent')
459
+ return { value: { ...base, value: record.value } };
460
+ if (record.basis === 'fraction')
461
+ return { value: { ...base, value: record.value * 100, conversion: { fromUnit: typeof record.unit === 'string' ? record.unit : 'fraction', toUnit: '%', rule: 'fraction to percent: multiplied by 100', explicit: true } } };
462
+ return { reason: `${field.key} carries the basis ${String(record.basis)}, which is not read as a percent` };
463
+ }
464
+ return { value: { ...base, value: raw } };
465
+ }
466
+ //# sourceMappingURL=projections.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projections.js","sourceRoot":"","sources":["../src/projections.ts"],"names":[],"mappings":"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"}
package/frozen.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "frozenAt": "2026-09-05",
3
+ "description": "Digests every published manifest and generated file is held to. A frozen version changes only by publishing a new version; an explicit, reviewed --refreeze is the one other way this file moves.",
4
+ "manifests": {
5
+ "battery@2": "a697852aba912b2f54193aaa0eac3990f49dd69364b555f5485bb30289b32aaf",
6
+ "battery@3": "98bae04f2b01db1cac0995dfe0849900f25072c55348249df446b9ff87dbe68e",
7
+ "general@1": "ef895946e243a9fdb7b0f303e7624038d0eb41e00da0ec8c894538f92effe37e",
8
+ "general@2": "70bbcaa8d145dd8928dcc61fc5e44343784c97d71783695e2b46cf91531b1c7d",
9
+ "textile@1": "6fae1897b61de2269eb9507a2437f93b0f9cfc0a13239b83359a04299a0271df",
10
+ "textile@2": "9aacfd62d465a82a8f4ae2a41c5ee4257c2b4943faf006e7f85a1e3ca2e8630e",
11
+ "textile@3": "db6df7376161fa334f84a2237581be6b076c20c29d873b6028381d08cbe31d66"
12
+ },
13
+ "generated": {
14
+ "generated/payload-schema/battery@2.public.schema.json": "4821b02554856db8bb3be9c8cc77c4e6222314ea623d0aec25898c4aba3a9e77",
15
+ "generated/payload-schema/battery@2.restricted.schema.json": "cc47f831e4b71f686c0623d961bb6a868b6e4dd117204983792d7af8dfb91ac8",
16
+ "generated/consumer/battery-v2.json": "244ac5038d0c3bfd60e541621d4fae5e9839addb756959253f71e29d89da3dda",
17
+ "generated/mapping/battery@2.md": "c6398774469b4d8b289e9f54605e6f43ddf12eb3adabf0720723c1be091825e9",
18
+ "generated/payload-schema/battery@3.public.schema.json": "52690cd9b6d78805da790ddb832df21b8b7c438bc721d9306f65965e4a2bf8ac",
19
+ "generated/payload-schema/battery@3.restricted.schema.json": "ed6b31c40d835d6c7f082b44dace265ec49c3405354f3b94fe8d365cadcbd5dc",
20
+ "generated/consumer/battery-v3.json": "97c9b7819dabee1ab8df44ef90b264a99a7c23ba27413c2d595a61e3408232b1",
21
+ "generated/mapping/battery@3.md": "8d4bf09221a53c22e57b238f35697efa0e882e5efa3cff073d2d238e28c77bc7",
22
+ "generated/payload-schema/general@1.public.schema.json": "57ea63b53d5d52371cbea3f93c1771aace73cf88cd07263fb70480efeb6802a9",
23
+ "generated/payload-schema/general@1.restricted.schema.json": "d7411945df53d498ac188dd74c9b77bddac14e1a9cbe9fb6f0cc441acbb2deb2",
24
+ "generated/consumer/general-v1.json": "e843346122ed595e75850c2063b81791fd113252e07fd746840b86026253b567",
25
+ "generated/payload-schema/general@2.public.schema.json": "fa82ad26b73ddfb99b7fea20b464b20c6f2e4c58ef750f567c880f83f5fa8a6c",
26
+ "generated/payload-schema/general@2.restricted.schema.json": "4960025fb10a0fd274f9527ca1d0184adf22621d950a0a72dad6c339639c6c1f",
27
+ "generated/consumer/general-v2.json": "769a433f1d53344c7e7ea36cd2bc79fd449a6ca04ebeb0f3881f029d6ed12696",
28
+ "generated/mapping/general@2.md": "2676806923b2b2a10d5a6259be244fffc1f38de480964cb57cd468d51a055ae3",
29
+ "generated/payload-schema/textile@1.public.schema.json": "6017bf5df2259def03169dfd9e538e05dd7fdb77095e0fc45eac997426d6bc4d",
30
+ "generated/payload-schema/textile@1.restricted.schema.json": "45e2b89c1289aee98fec03800b623c9ea9d4158ac178e9d84164018399812fc2",
31
+ "generated/consumer/textile-v1.json": "0f446466586421588093798b0d803a2af031553cc61004033b252da4546af885",
32
+ "generated/payload-schema/textile@2.public.schema.json": "521e102aff8dd621d98e5f0b5b6cafe075b3c445db05903d207e6f3d32005905",
33
+ "generated/payload-schema/textile@2.restricted.schema.json": "07ad1f72900cda3ff4e03adbad956402ab3eb60d0df444d7034abc28aa0e4819",
34
+ "generated/consumer/textile-v2.json": "c63cd9a7be8e66d8f75f00432e65c6901156cda71f47d3de542b5093d1d41ebe",
35
+ "generated/mapping/textile@2.md": "b8aee76d29b4b82a4cee4f9994fe543bd04b3e09002e958711dc5493e0d926fd",
36
+ "generated/payload-schema/textile@3.public.schema.json": "f5ef5ecff10277608d896d9ad13f17188408652f58c2130fb2b98340a9f6e09e",
37
+ "generated/payload-schema/textile@3.restricted.schema.json": "4352d7685bf93e62d9a773b5815086368ab97abe5f5d8887c1bc017ab5f1e164",
38
+ "generated/consumer/textile-v3.json": "330898b5c4fa07e83340f724cc343ff71222dfe666487a3588a39a1f3a790ff8",
39
+ "generated/mapping/textile@3.md": "626e136d03819f72c9f34eaca9d9c8fe7c65f3a6fe31d1cd158f2b106034bdb6",
40
+ "generated/index.json": "1ba35231c8cb4f75519a3445d6944967676f23013e672f78ec0c000cb751fee4"
41
+ }
42
+ }