@disclosureos/instruments 1.0.0 → 2.0.0-beta.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.
@@ -0,0 +1,268 @@
1
+ import { z } from 'zod';
2
+ import { compareUtcInstants } from '@disclosureos/records/experimental/v2';
3
+
4
+ // src/experimental/v2/schema.ts
5
+ var text = z.string().min(1).regex(/\S/);
6
+ var id = z.string().regex(/^[A-Za-z0-9][A-Za-z0-9._-]*(?![\s\S])/);
7
+ var ref = (kind) => z.string().regex(new RegExp(`^${kind}:[A-Za-z0-9][A-Za-z0-9._-]*(?![\\s\\S])`));
8
+ var instant = z.iso.datetime({ offset: true }).regex(/^(?!0000)/).regex(/T[0-9]{2}:[0-9]{2}:[0-9]{2}/).regex(/(?:Z|[+-][0-9]{2}:[0-9]{2})(?![\s\S])/);
9
+ var unknown = z.strictObject({ state: z.literal("unknown"), reason: text });
10
+ var knownText = z.union([z.strictObject({ state: z.literal("known"), value: text }), unknown]);
11
+ var knownInstant = z.union([z.strictObject({ state: z.literal("known"), value: instant }), unknown]);
12
+ var interval = z.strictObject({ state: z.literal("known"), start: instant, end: instant, timeScale: z.literal("UTC") });
13
+ var period = z.union([interval, unknown]);
14
+ var binding = (kind) => z.union([
15
+ z.strictObject({ state: z.literal("pinned"), ref: ref(kind) }),
16
+ z.strictObject({ state: z.literal("unresolved"), reason: text, legacyRef: text.optional() })
17
+ ]);
18
+ var ContextArtifactSchema = z.strictObject({
19
+ digest: z.strictObject({ algorithm: z.literal("sha256"), value: z.string().regex(/^[a-f0-9]{64}(?![\s\S])/) }),
20
+ mediaType: text,
21
+ byteLength: z.number().int().min(0).max(Number.MAX_SAFE_INTEGER),
22
+ uri: z.url().optional()
23
+ });
24
+ var InstrumentInstanceSchema = z.strictObject({
25
+ id,
26
+ identity: z.union([z.strictObject({ state: z.literal("known"), manufacturer: text, model: text, serialNumber: text.optional() }), unknown])
27
+ });
28
+ var channel = z.strictObject({ id, quantity: text, unit: text, sampling: z.union([z.strictObject({ state: z.literal("known"), rateHz: z.number().positive() }), unknown]) });
29
+ var ManifestRevisionSchema = z.strictObject({
30
+ id,
31
+ instrumentRef: ref("instrument"),
32
+ version: text,
33
+ publishedAt: instant,
34
+ artifact: ContextArtifactSchema,
35
+ configuration: z.strictObject({ hardware: knownText, firmware: knownText }),
36
+ channels: z.array(channel).min(1)
37
+ });
38
+ var DeploymentContextSchema = z.strictObject({ id, instrumentRef: ref("instrument"), manifest: binding("manifest"), period, site: knownText });
39
+ var quantified = { magnitude: z.number().min(0), unit: text };
40
+ var uncertainty = z.union([
41
+ z.strictObject({ kind: z.literal("unknown"), reason: text }),
42
+ z.strictObject({ kind: z.literal("standard"), ...quantified }),
43
+ z.strictObject({ kind: z.literal("bound"), ...quantified }),
44
+ z.strictObject({ kind: z.literal("expanded"), ...quantified, coverageFactor: z.number().positive(), coverageProbability: z.number().gt(0).lte(1).optional() })
45
+ ]);
46
+ var CalibrationContextSchema = z.strictObject({
47
+ id,
48
+ instrumentRef: ref("instrument"),
49
+ manifestRef: ref("manifest"),
50
+ channelId: id,
51
+ performedAt: knownInstant,
52
+ validity: period,
53
+ method: z.union([z.strictObject({ state: z.literal("known"), id: text, version: text, description: text }), unknown]),
54
+ report: z.union([z.strictObject({ state: z.literal("known"), artifact: ContextArtifactSchema }), unknown]),
55
+ uncertainty,
56
+ review: z.union([
57
+ z.strictObject({ state: z.literal("unreviewed") }),
58
+ unknown,
59
+ z.strictObject({ state: z.literal("reviewed"), reviewedBy: text, reviewedAt: instant, outcome: z.enum(["accepted", "rejected", "inconclusive"]), report: ContextArtifactSchema })
60
+ ])
61
+ });
62
+ var timingQuantity = (positive) => z.union([
63
+ z.strictObject({ state: z.literal("known"), magnitude: positive ? z.number().positive() : z.number().min(0), unit: z.enum(["s", "ms", "us", "ns"]) }),
64
+ unknown
65
+ ]);
66
+ var AcquisitionContextEntrySchema = z.strictObject({
67
+ id,
68
+ instrumentRef: ref("instrument"),
69
+ manifest: binding("manifest"),
70
+ deployment: binding("deployment"),
71
+ time: z.union([z.strictObject({ state: z.literal("known"), kind: z.literal("instant"), value: instant, timeScale: z.literal("UTC") }), interval.extend({ kind: z.literal("interval") }), unknown]),
72
+ classification: z.enum(["background", "known_control", "candidate", "other", "unknown"]),
73
+ clock: z.strictObject({ source: knownText, synchronization: knownText, resolution: timingQuantity(true), uncertainty: timingQuantity(false) }),
74
+ channels: z.array(z.strictObject({ channelId: id, calibration: binding("calibration") })).min(1)
75
+ });
76
+ var RawAcquisitionProductSchema = z.strictObject({ id, acquisitionRef: ref("acquisition"), kind: z.literal("raw"), artifact: ContextArtifactSchema });
77
+ var ACQUISITION_CONTEXT_SCHEMA_ID = "urn:disclosureos:experimental:acquisition-context:0.1.0";
78
+ var ACQUISITION_CONTEXT_RULESET_VERSION = "0.1.0";
79
+ var AcquisitionContextSchema = z.strictObject({
80
+ kind: z.literal("acquisition_context"),
81
+ schemaVersion: z.literal("0.1.0"),
82
+ id,
83
+ instruments: z.array(InstrumentInstanceSchema),
84
+ manifests: z.array(ManifestRevisionSchema),
85
+ deployments: z.array(DeploymentContextSchema),
86
+ calibrations: z.array(CalibrationContextSchema),
87
+ acquisitions: z.array(AcquisitionContextEntrySchema),
88
+ products: z.array(RawAcquisitionProductSchema),
89
+ extensions: z.record(z.string().regex(/^[a-z][a-z0-9_-]*(?:\.[a-z0-9_-]+)+(?![\s\S])/), z.json()).optional()
90
+ });
91
+ function acquisitionContextJsonSchema() {
92
+ return { ...z.toJSONSchema(AcquisitionContextSchema, { target: "draft-2020-12" }), $id: ACQUISITION_CONTEXT_SCHEMA_ID };
93
+ }
94
+ var pointer = (path) => path.map((p) => `/${String(p).replace(/~/g, "~0").replace(/\//g, "~1")}`).join("");
95
+ function parseAcquisitionContext(input) {
96
+ const contract = { schemaId: ACQUISITION_CONTEXT_SCHEMA_ID, rulesetVersion: ACQUISITION_CONTEXT_RULESET_VERSION };
97
+ const parsed = AcquisitionContextSchema.safeParse(input);
98
+ if (!parsed.success) return {
99
+ success: false,
100
+ contract,
101
+ checks: { structural: "failed", semantic: "not_checked", profile: "not_checked", external: "not_checked" },
102
+ uncheckedArtifactPointers: [],
103
+ issues: parsed.error.issues.map((issue) => ({ code: "STRUCT.VALUE", stage: "structural", severity: "error", pointer: pointer(issue.path), message: issue.message }))
104
+ };
105
+ const data = parsed.data;
106
+ const issues = [];
107
+ const uncheckedArtifactPointers = [];
108
+ const error = (code, path, message) => issues.push({ code, stage: "semantic", severity: "error", pointer: path, message });
109
+ function index(items, kind, collection) {
110
+ const map = /* @__PURE__ */ new Map();
111
+ items.forEach((value, i) => {
112
+ const ref2 = `${kind}:${value.id}`;
113
+ if (map.has(ref2)) error("REF.UNIQUE_ID", `/${collection}/${i}/id`, "Duplicate ID; pinned revisions must be unambiguous.");
114
+ else map.set(ref2, { value, pointer: `/${collection}/${i}` });
115
+ });
116
+ return map;
117
+ }
118
+ const instruments = index(data.instruments, "instrument", "instruments");
119
+ const manifests = index(data.manifests, "manifest", "manifests");
120
+ const deployments = index(data.deployments, "deployment", "deployments");
121
+ const calibrations = index(data.calibrations, "calibration", "calibrations");
122
+ const acquisitions = index(data.acquisitions, "acquisition", "acquisitions");
123
+ index(data.products, "product", "products");
124
+ function resolve(map, ref2, path) {
125
+ const value = map.get(ref2);
126
+ if (!value) error("REF.LOCAL_RESOLUTION", path, `Undeclared pinned reference: ${ref2}`);
127
+ return value;
128
+ }
129
+ function sameInstrument(expected, actual, path) {
130
+ if (expected !== actual) error("REF.INSTRUMENT_MISMATCH", path, "Pinned context belongs to a different instrument instance.");
131
+ }
132
+ function instant2(value, path) {
133
+ if (compareUtcInstants(value, value) === void 0) error("TIME.INSTANT", path, "Instant cannot be resolved with its UTC offset.");
134
+ }
135
+ function period2(value, path) {
136
+ if (value.state === "unknown") return;
137
+ instant2(value.start, `${path}/start`);
138
+ instant2(value.end, `${path}/end`);
139
+ const order = compareUtcInstants(value.start, value.end);
140
+ if (order !== void 0 && order >= 0) error("TIME.INTERVAL", `${path}/end`, "Half-open intervals require end strictly after start; represent a point acquisition as an instant.");
141
+ }
142
+ const channelMaps = /* @__PURE__ */ new Map();
143
+ const versions = /* @__PURE__ */ new Set();
144
+ for (const [i, manifest] of data.manifests.entries()) {
145
+ const path = `/manifests/${i}`;
146
+ resolve(instruments, manifest.instrumentRef, `${path}/instrumentRef`);
147
+ instant2(manifest.publishedAt, `${path}/publishedAt`);
148
+ const version = JSON.stringify([manifest.instrumentRef, manifest.version]);
149
+ if (versions.has(version)) error("MANIFEST.AMBIGUOUS_VERSION", `${path}/version`, "Instrument/version pair is declared more than once.");
150
+ versions.add(version);
151
+ const channels = /* @__PURE__ */ new Map();
152
+ for (const [j, channel2] of manifest.channels.entries()) {
153
+ if (channels.has(channel2.id)) error("REF.UNIQUE_ID", `${path}/channels/${j}/id`, "Duplicate channel ID within manifest revision.");
154
+ channels.set(channel2.id, { value: channel2, pointer: `${path}/channels/${j}` });
155
+ }
156
+ channelMaps.set(`manifest:${manifest.id}`, channels);
157
+ uncheckedArtifactPointers.push(`${path}/artifact`);
158
+ }
159
+ for (const [i, deployment] of data.deployments.entries()) {
160
+ const path = `/deployments/${i}`;
161
+ resolve(instruments, deployment.instrumentRef, `${path}/instrumentRef`);
162
+ period2(deployment.period, `${path}/period`);
163
+ if (deployment.manifest.state === "pinned") {
164
+ const manifest = resolve(manifests, deployment.manifest.ref, `${path}/manifest/ref`);
165
+ if (manifest) sameInstrument(deployment.instrumentRef, manifest.value.instrumentRef, `${path}/manifest/ref`);
166
+ }
167
+ }
168
+ for (const [i, calibration] of data.calibrations.entries()) {
169
+ const path = `/calibrations/${i}`;
170
+ resolve(instruments, calibration.instrumentRef, `${path}/instrumentRef`);
171
+ const manifest = resolve(manifests, calibration.manifestRef, `${path}/manifestRef`);
172
+ if (manifest) {
173
+ sameInstrument(calibration.instrumentRef, manifest.value.instrumentRef, `${path}/manifestRef`);
174
+ const channel2 = channelMaps.get(calibration.manifestRef)?.get(calibration.channelId);
175
+ if (!channel2) error("CHANNEL.UNKNOWN", `${path}/channelId`, "Calibration channel is not in its pinned manifest.");
176
+ else if (calibration.uncertainty.kind !== "unknown" && calibration.uncertainty.unit !== channel2.value.unit) error("UNIT.MISMATCH", `${path}/uncertainty/unit`, "Declared calibration uncertainty unit differs from its channel.");
177
+ }
178
+ if (calibration.performedAt.state === "known") instant2(calibration.performedAt.value, `${path}/performedAt/value`);
179
+ period2(calibration.validity, `${path}/validity`);
180
+ if (calibration.report.state === "known") uncheckedArtifactPointers.push(`${path}/report/artifact`);
181
+ if (calibration.review.state === "reviewed") {
182
+ instant2(calibration.review.reviewedAt, `${path}/review/reviewedAt`);
183
+ uncheckedArtifactPointers.push(`${path}/review/report`);
184
+ if (calibration.performedAt.state === "known" && compareUtcInstants(calibration.review.reviewedAt, calibration.performedAt.value) === -1) error("CALIBRATION.REVIEW_ORDER", `${path}/review/reviewedAt`, "Review cannot precede the declared calibration event.");
185
+ }
186
+ }
187
+ const resolutions = [];
188
+ function outside(time, window) {
189
+ if (time.state !== "known" || window.state !== "known") return false;
190
+ const start = time.kind === "instant" ? time.value : time.start;
191
+ const end = time.kind === "instant" ? time.value : time.end;
192
+ return compareUtcInstants(start, window.start) === -1 || (time.kind === "instant" ? compareUtcInstants(end, window.end) !== -1 : compareUtcInstants(end, window.end) === 1);
193
+ }
194
+ for (const [i, acquisition] of data.acquisitions.entries()) {
195
+ const path = `/acquisitions/${i}`;
196
+ const resolution = { acquisitionRef: `acquisition:${acquisition.id}`, status: "resolved", calibrationRefs: [], missingPointers: [] };
197
+ const missing = (code, pointer2, message) => {
198
+ resolution.status = "incomplete";
199
+ resolution.missingPointers.push(pointer2);
200
+ issues.push({ code, stage: "semantic", severity: "warning", pointer: pointer2, message });
201
+ };
202
+ const instrument = resolve(instruments, acquisition.instrumentRef, `${path}/instrumentRef`);
203
+ if (instrument?.value.identity.state === "unknown") missing("CONTEXT.UNKNOWN", `${instrument.pointer}/identity`, "Physical instrument identity is unknown beyond its local ID.");
204
+ if (acquisition.time.state === "unknown") missing("CONTEXT.UNKNOWN", `${path}/time`, "Acquisition time is unknown.");
205
+ else if (acquisition.time.kind === "instant") instant2(acquisition.time.value, `${path}/time/value`);
206
+ else period2(acquisition.time, `${path}/time`);
207
+ for (const [key, value] of Object.entries(acquisition.clock)) if (value.state === "unknown") missing("CONTEXT.UNKNOWN", `${path}/clock/${key}`, "Clock context is unknown.");
208
+ const manifest = acquisition.manifest.state === "pinned" ? resolve(manifests, acquisition.manifest.ref, `${path}/manifest/ref`) : void 0;
209
+ if (acquisition.manifest.state === "unresolved") missing("CONTEXT.UNRESOLVED", `${path}/manifest`, "No manifest revision is selected; legacy labels are never resolved automatically.");
210
+ if (manifest && acquisition.manifest.state === "pinned") {
211
+ resolution.manifestRef = acquisition.manifest.ref;
212
+ sameInstrument(acquisition.instrumentRef, manifest.value.instrumentRef, `${path}/manifest/ref`);
213
+ for (const [key, value] of Object.entries(manifest.value.configuration)) if (value.state === "unknown") missing("CONTEXT.UNKNOWN", `${manifest.pointer}/configuration/${key}`, "Configuration detail is unknown.");
214
+ }
215
+ if (acquisition.deployment.state === "unresolved") missing("CONTEXT.UNRESOLVED", `${path}/deployment`, "Deployment history is unresolved.");
216
+ else {
217
+ const deployment = resolve(deployments, acquisition.deployment.ref, `${path}/deployment/ref`);
218
+ if (deployment) {
219
+ sameInstrument(acquisition.instrumentRef, deployment.value.instrumentRef, `${path}/deployment/ref`);
220
+ if (deployment.value.manifest.state === "unresolved") missing("CONTEXT.UNRESOLVED", `${deployment.pointer}/manifest`, "Deployment configuration is unresolved.");
221
+ else if (acquisition.manifest.state === "pinned" && deployment.value.manifest.ref !== acquisition.manifest.ref) error("MANIFEST.MISMATCH", `${path}/manifest/ref`, "Acquisition and deployment pin different manifest revisions.");
222
+ if (deployment.value.site.state === "unknown") missing("CONTEXT.UNKNOWN", `${deployment.pointer}/site`, "Deployment site is unknown.");
223
+ if (deployment.value.period.state === "unknown") missing("CONTEXT.UNKNOWN", `${deployment.pointer}/period`, "Deployment time coverage is unknown.");
224
+ else if (outside(acquisition.time, deployment.value.period)) error("TIME.OUTSIDE_DEPLOYMENT", `${path}/time`, "Acquisition is not wholly contained in its deployment window.");
225
+ }
226
+ }
227
+ const channels = /* @__PURE__ */ new Set();
228
+ for (const [j, binding2] of acquisition.channels.entries()) {
229
+ const bindingPath = `${path}/channels/${j}`;
230
+ if (channels.has(binding2.channelId)) error("REF.UNIQUE_ID", `${bindingPath}/channelId`, "Channel is bound more than once; select an explicit calibration per channel.");
231
+ channels.add(binding2.channelId);
232
+ const selectedChannel = manifest ? channelMaps.get(`manifest:${manifest.value.id}`)?.get(binding2.channelId) : void 0;
233
+ if (manifest && !selectedChannel) error("CHANNEL.UNKNOWN", `${bindingPath}/channelId`, "Acquisition channel is not in its pinned manifest.");
234
+ if (selectedChannel?.value.sampling.state === "unknown") missing("CONTEXT.UNKNOWN", `${selectedChannel.pointer}/sampling`, "Declared channel sampling is unknown.");
235
+ if (binding2.calibration.state === "unresolved") {
236
+ missing("CONTEXT.UNRESOLVED", `${bindingPath}/calibration`, "Calibration history is unresolved.");
237
+ continue;
238
+ }
239
+ const calibration = resolve(calibrations, binding2.calibration.ref, `${bindingPath}/calibration/ref`);
240
+ if (!calibration) continue;
241
+ resolution.calibrationRefs.push(binding2.calibration.ref);
242
+ sameInstrument(acquisition.instrumentRef, calibration.value.instrumentRef, `${bindingPath}/calibration/ref`);
243
+ if (acquisition.manifest.state === "pinned" && calibration.value.manifestRef !== acquisition.manifest.ref) error("MANIFEST.MISMATCH", `${bindingPath}/calibration/ref`, "Calibration does not apply to the exact acquisition manifest revision.");
244
+ if (calibration.value.channelId !== binding2.channelId) error("CALIBRATION.CHANNEL_MISMATCH", `${bindingPath}/calibration/ref`, "Calibration covers a different channel.");
245
+ if (calibration.value.performedAt.state === "unknown") missing("CONTEXT.UNKNOWN", `${calibration.pointer}/performedAt`, "Calibration performance time is unknown.");
246
+ else if (acquisition.time.state === "known") {
247
+ const start = acquisition.time.kind === "instant" ? acquisition.time.value : acquisition.time.start;
248
+ if (compareUtcInstants(calibration.value.performedAt.value, start) === 1) error("CALIBRATION.AFTER_ACQUISITION", `${bindingPath}/calibration/ref`, "A calibration performed after acquisition cannot establish acquisition-time calibration.");
249
+ }
250
+ if (calibration.value.validity.state === "unknown") missing("CONTEXT.UNKNOWN", `${calibration.pointer}/validity`, "Declared calibration coverage is unknown.");
251
+ else if (outside(acquisition.time, calibration.value.validity)) error("CALIBRATION.OUTSIDE_VALIDITY", `${bindingPath}/calibration/ref`, "Acquisition is not wholly contained in declared calibration validity.");
252
+ for (const field of ["method", "report", "review"]) if (calibration.value[field].state === "unknown") missing("CONTEXT.UNKNOWN", `${calibration.pointer}/${field}`, "Calibration documentation is unknown.");
253
+ if (calibration.value.uncertainty.kind === "unknown") missing("CONTEXT.UNKNOWN", `${calibration.pointer}/uncertainty`, "Calibration uncertainty is unknown.");
254
+ }
255
+ resolutions.push(resolution);
256
+ }
257
+ for (const [i, product] of data.products.entries()) {
258
+ resolve(acquisitions, product.acquisitionRef, `/products/${i}/acquisitionRef`);
259
+ uncheckedArtifactPointers.push(`/products/${i}/artifact`);
260
+ }
261
+ const failed = issues.some((issue) => issue.severity === "error");
262
+ const base = { contract, issues, uncheckedArtifactPointers, checks: { structural: "passed", semantic: failed ? "failed" : "passed", profile: "not_checked", external: "not_checked" } };
263
+ return failed ? { ...base, success: false } : { ...base, success: true, data, acquisitions: resolutions };
264
+ }
265
+
266
+ export { ACQUISITION_CONTEXT_RULESET_VERSION, ACQUISITION_CONTEXT_SCHEMA_ID, AcquisitionContextEntrySchema, AcquisitionContextSchema, CalibrationContextSchema, ContextArtifactSchema, DeploymentContextSchema, InstrumentInstanceSchema, ManifestRevisionSchema, RawAcquisitionProductSchema, acquisitionContextJsonSchema, parseAcquisitionContext };
267
+ //# sourceMappingURL=index.js.map
268
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/experimental/v2/schema.ts","../../../src/experimental/v2/validate.ts"],"names":["ref","instant","period","channel","pointer","binding"],"mappings":"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","file":"index.js","sourcesContent":["import { z } from 'zod';\n\nconst text = z.string().min(1).regex(/\\S/);\nconst id = z.string().regex(/^[A-Za-z0-9][A-Za-z0-9._-]*(?![\\s\\S])/);\nconst ref = (kind: string) => z.string().regex(new RegExp(`^${kind}:[A-Za-z0-9][A-Za-z0-9._-]*(?![\\\\s\\\\S])`));\n// Locally owned schema, matching the records UTC lexical contract without crossing Zod instances.\nconst instant = z.iso.datetime({offset:true}).regex(/^(?!0000)/).regex(/T[0-9]{2}:[0-9]{2}:[0-9]{2}/).regex(/(?:Z|[+-][0-9]{2}:[0-9]{2})(?![\\s\\S])/);\nconst unknown = z.strictObject({state:z.literal('unknown'),reason:text});\nconst knownText = z.union([z.strictObject({state:z.literal('known'),value:text}),unknown]);\nconst knownInstant = z.union([z.strictObject({state:z.literal('known'),value:instant}),unknown]);\nconst interval = z.strictObject({state:z.literal('known'),start:instant,end:instant,timeScale:z.literal('UTC')});\nconst period = z.union([interval,unknown]);\nconst binding = (kind: string) => z.union([\n z.strictObject({state:z.literal('pinned'),ref:ref(kind)}),\n z.strictObject({state:z.literal('unresolved'),reason:text,legacyRef:text.optional()}),\n]);\nexport const ContextArtifactSchema = z.strictObject({\n digest:z.strictObject({algorithm:z.literal('sha256'),value:z.string().regex(/^[a-f0-9]{64}(?![\\s\\S])/)}),\n mediaType:text,byteLength:z.number().int().min(0).max(Number.MAX_SAFE_INTEGER),uri:z.url().optional(),\n});\nexport const InstrumentInstanceSchema = z.strictObject({\n id,identity:z.union([z.strictObject({state:z.literal('known'),manufacturer:text,model:text,serialNumber:text.optional()}),unknown]),\n});\nconst channel = z.strictObject({id,quantity:text,unit:text,sampling:z.union([z.strictObject({state:z.literal('known'),rateHz:z.number().positive()}),unknown])});\nexport const ManifestRevisionSchema = z.strictObject({\n id,instrumentRef:ref('instrument'),version:text,publishedAt:instant,artifact:ContextArtifactSchema,\n configuration:z.strictObject({hardware:knownText,firmware:knownText}),channels:z.array(channel).min(1),\n});\nexport const DeploymentContextSchema = z.strictObject({id,instrumentRef:ref('instrument'),manifest:binding('manifest'),period,site:knownText});\nconst quantified = {magnitude:z.number().min(0),unit:text};\nconst uncertainty = z.union([\n z.strictObject({kind:z.literal('unknown'),reason:text}),\n z.strictObject({kind:z.literal('standard'),...quantified}),z.strictObject({kind:z.literal('bound'),...quantified}),\n z.strictObject({kind:z.literal('expanded'),...quantified,coverageFactor:z.number().positive(),coverageProbability:z.number().gt(0).lte(1).optional()}),\n]);\nexport const CalibrationContextSchema = z.strictObject({\n id,instrumentRef:ref('instrument'),manifestRef:ref('manifest'),channelId:id,performedAt:knownInstant,validity:period,\n method:z.union([z.strictObject({state:z.literal('known'),id:text,version:text,description:text}),unknown]),\n report:z.union([z.strictObject({state:z.literal('known'),artifact:ContextArtifactSchema}),unknown]),uncertainty,\n review:z.union([z.strictObject({state:z.literal('unreviewed')}),unknown,\n z.strictObject({state:z.literal('reviewed'),reviewedBy:text,reviewedAt:instant,outcome:z.enum(['accepted','rejected','inconclusive']),report:ContextArtifactSchema})]),\n});\nconst timingQuantity = (positive: boolean) => z.union([\n z.strictObject({state:z.literal('known'),magnitude:positive ? z.number().positive() : z.number().min(0),unit:z.enum(['s','ms','us','ns'])}),unknown,\n]);\nexport const AcquisitionContextEntrySchema = z.strictObject({\n id,instrumentRef:ref('instrument'),manifest:binding('manifest'),deployment:binding('deployment'),\n time:z.union([z.strictObject({state:z.literal('known'),kind:z.literal('instant'),value:instant,timeScale:z.literal('UTC')}),interval.extend({kind:z.literal('interval')}),unknown]),\n classification:z.enum(['background','known_control','candidate','other','unknown']),\n clock:z.strictObject({source:knownText,synchronization:knownText,resolution:timingQuantity(true),uncertainty:timingQuantity(false)}),\n channels:z.array(z.strictObject({channelId:id,calibration:binding('calibration')})).min(1),\n});\nexport const RawAcquisitionProductSchema = z.strictObject({id,acquisitionRef:ref('acquisition'),kind:z.literal('raw'),artifact:ContextArtifactSchema});\nexport const ACQUISITION_CONTEXT_SCHEMA_ID = 'urn:disclosureos:experimental:acquisition-context:0.1.0';\nexport const ACQUISITION_CONTEXT_RULESET_VERSION = '0.1.0';\nexport const AcquisitionContextSchema = z.strictObject({\n kind:z.literal('acquisition_context'),schemaVersion:z.literal('0.1.0'),id,\n instruments:z.array(InstrumentInstanceSchema),manifests:z.array(ManifestRevisionSchema),deployments:z.array(DeploymentContextSchema),\n calibrations:z.array(CalibrationContextSchema),acquisitions:z.array(AcquisitionContextEntrySchema),products:z.array(RawAcquisitionProductSchema),\n extensions:z.record(z.string().regex(/^[a-z][a-z0-9_-]*(?:\\.[a-z0-9_-]+)+(?![\\s\\S])/),z.json()).optional(),\n});\nexport type AcquisitionContext = z.infer<typeof AcquisitionContextSchema>;\nexport type AcquisitionContextEntry = z.infer<typeof AcquisitionContextEntrySchema>;\nexport type CalibrationContext = z.infer<typeof CalibrationContextSchema>;\nexport type ManifestRevision = z.infer<typeof ManifestRevisionSchema>;\nexport type ContextArtifact = z.infer<typeof ContextArtifactSchema>;\nexport function acquisitionContextJsonSchema(): Record<string,unknown> {\n return {...z.toJSONSchema(AcquisitionContextSchema,{target:'draft-2020-12'}),$id:ACQUISITION_CONTEXT_SCHEMA_ID};\n}\n","import { compareUtcInstants } from '@disclosureos/records/experimental/v2';\nimport { AcquisitionContextSchema, ACQUISITION_CONTEXT_SCHEMA_ID, ACQUISITION_CONTEXT_RULESET_VERSION } from './schema';\nimport type { AcquisitionContext, AcquisitionContextEntry, ManifestRevision } from './schema';\n\nexport type AcquisitionContextIssueCode = 'STRUCT.VALUE' | 'REF.UNIQUE_ID' | 'REF.LOCAL_RESOLUTION' | 'REF.INSTRUMENT_MISMATCH'\n | 'MANIFEST.AMBIGUOUS_VERSION' | 'MANIFEST.MISMATCH' | 'CHANNEL.UNKNOWN' | 'TIME.INTERVAL' | 'TIME.INSTANT'\n | 'TIME.OUTSIDE_DEPLOYMENT' | 'CALIBRATION.CHANNEL_MISMATCH' | 'CALIBRATION.AFTER_ACQUISITION' | 'CALIBRATION.OUTSIDE_VALIDITY'\n | 'CALIBRATION.REVIEW_ORDER' | 'UNIT.MISMATCH' | 'CONTEXT.UNRESOLVED' | 'CONTEXT.UNKNOWN';\nexport interface AcquisitionContextIssue {code:AcquisitionContextIssueCode;stage:'structural'|'semantic';severity:'error'|'warning';pointer:string;message:string}\nexport interface AcquisitionResolution {acquisitionRef:string;status:'resolved'|'incomplete';manifestRef?:string;calibrationRefs:string[];missingPointers:string[]}\ninterface ResultBase {\n checks:{structural:'passed'|'failed';semantic:'passed'|'failed'|'not_checked';profile:'not_checked';external:'not_checked'};\n contract:{schemaId:typeof ACQUISITION_CONTEXT_SCHEMA_ID;rulesetVersion:typeof ACQUISITION_CONTEXT_RULESET_VERSION};\n issues:AcquisitionContextIssue[];uncheckedArtifactPointers:string[];\n}\nexport type AcquisitionContextResult = ResultBase & ({success:true;data:AcquisitionContext;acquisitions:AcquisitionResolution[]}|{success:false});\nconst pointer = (path:readonly PropertyKey[]) => path.map(p=>`/${String(p).replace(/~/g,'~0').replace(/\\//g,'~1')}`).join('');\ntype Period = {state:'known';start:string;end:string;timeScale:'UTC'} | {state:'unknown';reason:string};\n\n/** Validates pinned declarations, not scientific calibration adequacy or artifact bytes. */\nexport function parseAcquisitionContext(input:unknown):AcquisitionContextResult {\n const contract:ResultBase['contract']={schemaId:ACQUISITION_CONTEXT_SCHEMA_ID,rulesetVersion:ACQUISITION_CONTEXT_RULESET_VERSION};\n const parsed=AcquisitionContextSchema.safeParse(input);\n if(!parsed.success) return {success:false,contract,checks:{structural:'failed',semantic:'not_checked',profile:'not_checked',external:'not_checked'},uncheckedArtifactPointers:[],\n issues:parsed.error.issues.map(issue=>({code:'STRUCT.VALUE',stage:'structural',severity:'error',pointer:pointer(issue.path),message:issue.message}))};\n const data=parsed.data;\n const issues:AcquisitionContextIssue[]=[];\n const uncheckedArtifactPointers:string[]=[];\n const error=(code:AcquisitionContextIssueCode,path:string,message:string)=>issues.push({code,stage:'semantic',severity:'error',pointer:path,message});\n function index<T extends {id:string}>(items:T[],kind:string,collection:string) {\n const map=new Map<string,{value:T;pointer:string}>();\n items.forEach((value,i)=>{\n const ref=`${kind}:${value.id}`;\n if(map.has(ref)) error('REF.UNIQUE_ID',`/${collection}/${i}/id`,'Duplicate ID; pinned revisions must be unambiguous.');\n else map.set(ref,{value,pointer:`/${collection}/${i}`});\n });\n return map;\n }\n const instruments=index(data.instruments,'instrument','instruments');\n const manifests=index(data.manifests,'manifest','manifests');\n const deployments=index(data.deployments,'deployment','deployments');\n const calibrations=index(data.calibrations,'calibration','calibrations');\n const acquisitions=index(data.acquisitions,'acquisition','acquisitions');\n index(data.products,'product','products');\n function resolve<T>(map:Map<string,T>,ref:string,path:string):T|undefined {\n const value=map.get(ref);\n if(!value) error('REF.LOCAL_RESOLUTION',path,`Undeclared pinned reference: ${ref}`);\n return value;\n }\n function sameInstrument(expected:string,actual:string,path:string):void {\n if(expected!==actual) error('REF.INSTRUMENT_MISMATCH',path,'Pinned context belongs to a different instrument instance.');\n }\n function instant(value:string,path:string):void {\n if(compareUtcInstants(value,value)===undefined) error('TIME.INSTANT',path,'Instant cannot be resolved with its UTC offset.');\n }\n function period(value:Period,path:string):void {\n if(value.state==='unknown') return;\n instant(value.start,`${path}/start`);instant(value.end,`${path}/end`);\n const order=compareUtcInstants(value.start,value.end);\n if(order!==undefined && order>=0) error('TIME.INTERVAL',`${path}/end`,'Half-open intervals require end strictly after start; represent a point acquisition as an instant.');\n }\n const channelMaps=new Map<string,Map<string,{value:ManifestRevision['channels'][number];pointer:string}>>();\n const versions=new Set<string>();\n for(const [i,manifest] of data.manifests.entries()) {\n const path=`/manifests/${i}`;\n resolve(instruments,manifest.instrumentRef,`${path}/instrumentRef`);\n instant(manifest.publishedAt,`${path}/publishedAt`);\n const version=JSON.stringify([manifest.instrumentRef,manifest.version]);\n if(versions.has(version)) error('MANIFEST.AMBIGUOUS_VERSION',`${path}/version`,'Instrument/version pair is declared more than once.');\n versions.add(version);\n const channels=new Map<string,{value:ManifestRevision['channels'][number];pointer:string}>();\n for(const [j,channel] of manifest.channels.entries()) {\n if(channels.has(channel.id)) error('REF.UNIQUE_ID',`${path}/channels/${j}/id`,'Duplicate channel ID within manifest revision.');\n channels.set(channel.id,{value:channel,pointer:`${path}/channels/${j}`});\n }\n channelMaps.set(`manifest:${manifest.id}`,channels);\n uncheckedArtifactPointers.push(`${path}/artifact`);\n }\n for(const [i,deployment] of data.deployments.entries()) {\n const path=`/deployments/${i}`;\n resolve(instruments,deployment.instrumentRef,`${path}/instrumentRef`);period(deployment.period,`${path}/period`);\n if(deployment.manifest.state==='pinned') {\n const manifest=resolve(manifests,deployment.manifest.ref,`${path}/manifest/ref`);\n if(manifest) sameInstrument(deployment.instrumentRef,manifest.value.instrumentRef,`${path}/manifest/ref`);\n }\n }\n for(const [i,calibration] of data.calibrations.entries()) {\n const path=`/calibrations/${i}`;\n resolve(instruments,calibration.instrumentRef,`${path}/instrumentRef`);\n const manifest=resolve(manifests,calibration.manifestRef,`${path}/manifestRef`);\n if(manifest) {\n sameInstrument(calibration.instrumentRef,manifest.value.instrumentRef,`${path}/manifestRef`);\n const channel=channelMaps.get(calibration.manifestRef)?.get(calibration.channelId);\n if(!channel) error('CHANNEL.UNKNOWN',`${path}/channelId`,'Calibration channel is not in its pinned manifest.');\n else if(calibration.uncertainty.kind!=='unknown' && calibration.uncertainty.unit!==channel.value.unit) error('UNIT.MISMATCH',`${path}/uncertainty/unit`,'Declared calibration uncertainty unit differs from its channel.');\n }\n if(calibration.performedAt.state==='known') instant(calibration.performedAt.value,`${path}/performedAt/value`);\n period(calibration.validity,`${path}/validity`);\n if(calibration.report.state==='known') uncheckedArtifactPointers.push(`${path}/report/artifact`);\n if(calibration.review.state==='reviewed') {\n instant(calibration.review.reviewedAt,`${path}/review/reviewedAt`);uncheckedArtifactPointers.push(`${path}/review/report`);\n if(calibration.performedAt.state==='known' && compareUtcInstants(calibration.review.reviewedAt,calibration.performedAt.value)===-1) error('CALIBRATION.REVIEW_ORDER',`${path}/review/reviewedAt`,'Review cannot precede the declared calibration event.');\n }\n }\n const resolutions:AcquisitionResolution[]=[];\n function outside(time:AcquisitionContextEntry['time'],window:Period):boolean {\n if(time.state!=='known'||window.state!=='known') return false;\n const start=time.kind==='instant'?time.value:time.start;\n const end=time.kind==='instant'?time.value:time.end;\n return compareUtcInstants(start,window.start)===-1 || (time.kind==='instant' ? compareUtcInstants(end,window.end)!==-1 : compareUtcInstants(end,window.end)===1);\n }\n for(const [i,acquisition] of data.acquisitions.entries()) {\n const path=`/acquisitions/${i}`;\n const resolution:AcquisitionResolution={acquisitionRef:`acquisition:${acquisition.id}`,status:'resolved',calibrationRefs:[],missingPointers:[]};\n const missing=(code:'CONTEXT.UNKNOWN'|'CONTEXT.UNRESOLVED',pointer:string,message:string)=>{\n resolution.status='incomplete';resolution.missingPointers.push(pointer);issues.push({code,stage:'semantic',severity:'warning',pointer,message});\n };\n const instrument=resolve(instruments,acquisition.instrumentRef,`${path}/instrumentRef`);\n if(instrument?.value.identity.state==='unknown') missing('CONTEXT.UNKNOWN',`${instrument.pointer}/identity`,'Physical instrument identity is unknown beyond its local ID.');\n if(acquisition.time.state==='unknown') missing('CONTEXT.UNKNOWN',`${path}/time`,'Acquisition time is unknown.');\n else if(acquisition.time.kind==='instant') instant(acquisition.time.value,`${path}/time/value`);\n else period(acquisition.time,`${path}/time`);\n for(const [key,value] of Object.entries(acquisition.clock)) if(value.state==='unknown') missing('CONTEXT.UNKNOWN',`${path}/clock/${key}`,'Clock context is unknown.');\n const manifest=acquisition.manifest.state==='pinned'?resolve(manifests,acquisition.manifest.ref,`${path}/manifest/ref`):undefined;\n if(acquisition.manifest.state==='unresolved') missing('CONTEXT.UNRESOLVED',`${path}/manifest`, 'No manifest revision is selected; legacy labels are never resolved automatically.');\n if(manifest && acquisition.manifest.state==='pinned') {\n resolution.manifestRef=acquisition.manifest.ref;sameInstrument(acquisition.instrumentRef,manifest.value.instrumentRef,`${path}/manifest/ref`);\n for(const [key,value] of Object.entries(manifest.value.configuration)) if(value.state==='unknown') missing('CONTEXT.UNKNOWN',`${manifest.pointer}/configuration/${key}`,'Configuration detail is unknown.');\n }\n if(acquisition.deployment.state==='unresolved') missing('CONTEXT.UNRESOLVED',`${path}/deployment`,'Deployment history is unresolved.');\n else {\n const deployment=resolve(deployments,acquisition.deployment.ref,`${path}/deployment/ref`);\n if(deployment) {\n sameInstrument(acquisition.instrumentRef,deployment.value.instrumentRef,`${path}/deployment/ref`);\n if(deployment.value.manifest.state==='unresolved') missing('CONTEXT.UNRESOLVED',`${deployment.pointer}/manifest`,'Deployment configuration is unresolved.');\n else if(acquisition.manifest.state==='pinned' && deployment.value.manifest.ref!==acquisition.manifest.ref) error('MANIFEST.MISMATCH',`${path}/manifest/ref`,'Acquisition and deployment pin different manifest revisions.');\n if(deployment.value.site.state==='unknown') missing('CONTEXT.UNKNOWN',`${deployment.pointer}/site`,'Deployment site is unknown.');\n if(deployment.value.period.state==='unknown') missing('CONTEXT.UNKNOWN',`${deployment.pointer}/period`,'Deployment time coverage is unknown.');\n else if(outside(acquisition.time,deployment.value.period)) error('TIME.OUTSIDE_DEPLOYMENT',`${path}/time`,'Acquisition is not wholly contained in its deployment window.');\n }\n }\n const channels=new Set<string>();\n for(const [j,binding] of acquisition.channels.entries()) {\n const bindingPath=`${path}/channels/${j}`;\n if(channels.has(binding.channelId)) error('REF.UNIQUE_ID',`${bindingPath}/channelId`,'Channel is bound more than once; select an explicit calibration per channel.');\n channels.add(binding.channelId);\n const selectedChannel=manifest?channelMaps.get(`manifest:${manifest.value.id}`)?.get(binding.channelId):undefined;\n if(manifest && !selectedChannel) error('CHANNEL.UNKNOWN',`${bindingPath}/channelId`,'Acquisition channel is not in its pinned manifest.');\n if(selectedChannel?.value.sampling.state==='unknown') missing('CONTEXT.UNKNOWN',`${selectedChannel.pointer}/sampling`,'Declared channel sampling is unknown.');\n if(binding.calibration.state==='unresolved') {missing('CONTEXT.UNRESOLVED',`${bindingPath}/calibration`,'Calibration history is unresolved.');continue;}\n const calibration=resolve(calibrations,binding.calibration.ref,`${bindingPath}/calibration/ref`);\n if(!calibration) continue;\n resolution.calibrationRefs.push(binding.calibration.ref);\n sameInstrument(acquisition.instrumentRef,calibration.value.instrumentRef,`${bindingPath}/calibration/ref`);\n if(acquisition.manifest.state==='pinned' && calibration.value.manifestRef!==acquisition.manifest.ref) error('MANIFEST.MISMATCH',`${bindingPath}/calibration/ref`,'Calibration does not apply to the exact acquisition manifest revision.');\n if(calibration.value.channelId!==binding.channelId) error('CALIBRATION.CHANNEL_MISMATCH',`${bindingPath}/calibration/ref`,'Calibration covers a different channel.');\n if(calibration.value.performedAt.state==='unknown') missing('CONTEXT.UNKNOWN',`${calibration.pointer}/performedAt`,'Calibration performance time is unknown.');\n else if(acquisition.time.state==='known') {\n const start=acquisition.time.kind==='instant'?acquisition.time.value:acquisition.time.start;\n if(compareUtcInstants(calibration.value.performedAt.value,start)===1) error('CALIBRATION.AFTER_ACQUISITION',`${bindingPath}/calibration/ref`,'A calibration performed after acquisition cannot establish acquisition-time calibration.');\n }\n if(calibration.value.validity.state==='unknown') missing('CONTEXT.UNKNOWN',`${calibration.pointer}/validity`,'Declared calibration coverage is unknown.');\n else if(outside(acquisition.time,calibration.value.validity)) error('CALIBRATION.OUTSIDE_VALIDITY',`${bindingPath}/calibration/ref`,'Acquisition is not wholly contained in declared calibration validity.');\n for(const field of ['method','report','review'] as const) if(calibration.value[field].state==='unknown') missing('CONTEXT.UNKNOWN',`${calibration.pointer}/${field}`,'Calibration documentation is unknown.');\n if(calibration.value.uncertainty.kind==='unknown') missing('CONTEXT.UNKNOWN',`${calibration.pointer}/uncertainty`,'Calibration uncertainty is unknown.');\n }\n resolutions.push(resolution);\n }\n for(const [i,product] of data.products.entries()) {resolve(acquisitions,product.acquisitionRef,`/products/${i}/acquisitionRef`);uncheckedArtifactPointers.push(`/products/${i}/artifact`);}\n const failed=issues.some(issue=>issue.severity==='error');\n const base:ResultBase={contract,issues,uncheckedArtifactPointers,checks:{structural:'passed',semantic:failed?'failed':'passed',profile:'not_checked',external:'not_checked'}};\n return failed?{...base,success:false}:{...base,success:true,data,acquisitions:resolutions};\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@disclosureos/instruments",
3
- "version": "1.0.0",
3
+ "version": "2.0.0-beta.0",
4
4
  "description": "UAP Sensor Manifest — per-sensor specification standard for detection hardware in the DisclosureOS ecosystem",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -61,7 +61,13 @@
61
61
  "import": "./dist/validators/index.js"
62
62
  },
63
63
  "./schema": "./schema/sensor-manifest.schema.json",
64
- "./package.json": "./package.json"
64
+ "./package.json": "./package.json",
65
+ "./experimental/v2": {
66
+ "types": "./dist/experimental/v2/index.d.ts",
67
+ "import": "./dist/experimental/v2/index.js"
68
+ },
69
+ "./experimental/v2/acquisition/schema": "./schema/experimental/acquisition-context-0.1.0.schema.json",
70
+ "./experimental/v2/acquisition/schema/0.1.0": "./schema/experimental/acquisition-context-0.1.0.schema.json"
65
71
  },
66
72
  "main": "./dist/index.js",
67
73
  "types": "./dist/index.d.ts",
@@ -73,8 +79,8 @@
73
79
  "LICENSE"
74
80
  ],
75
81
  "dependencies": {
76
- "zod": "^4.4.3",
77
- "@disclosureos/records": "1.1.0"
82
+ "zod": "4.4.3",
83
+ "@disclosureos/records": "2.0.0-beta.0"
78
84
  },
79
85
  "devDependencies": {
80
86
  "@types/node": "^20",
@@ -87,7 +93,8 @@
87
93
  "@repo/typescript-config": "0.0.0"
88
94
  },
89
95
  "publishConfig": {
90
- "access": "public"
96
+ "access": "public",
97
+ "tag": "beta"
91
98
  },
92
99
  "scripts": {
93
100
  "build": "tsup",