@empressaio/atom-contract 1.12.0 → 1.13.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 @@
1
+ {"version":3,"file":"parcel-node.d.ts","sourceRoot":"","sources":["../../src/property/parcel-node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAEhF,OAAO,EAeL,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,EAC7B,KAAK,sBAAsB,EAC3B,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,EAC9B,MAAM,aAAa,CAAC;AAErB;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,aAAa,CAAC;IAC1B,mFAAmF;IACnF,OAAO,EAAE,MAAM,CAAC;IAChB,0EAA0E;IAC1E,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,OAAO,EAAE,aAAa,CAAC;IACvB,8DAA8D;IAC9D,YAAY,CAAC,EAAE,aAAa,CAAC,iBAAiB,CAAC,CAAC;IAChD,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE;QAAE,aAAa,EAAE,UAAU,CAAA;KAAE,CAAC,CAAC;IACvE,kBAAkB,EAAE,wBAAwB,CAAC;IAC7C,2EAA2E;IAC3E,gBAAgB,CAAC,EAAE,sBAAsB,CAAC;IAC1C,8DAA8D;IAC9D,cAAc,EAAE,OAAO,CAAC;IACxB,4EAA4E;IAC5E,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,sEAAsE;IACtE,eAAe,CAAC,EAAE,wBAAwB,CAAC;IAC3C;;;;OAIG;IACH,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,YAAY,EAAE,YAAY,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,SAAS,GAAG,OAAO,GAAG,YAAY,CAAC;IACvD,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,QAAQ,CAAC;IACnB,YAAY,CAAC,EAAE,qBAAqB,CAAC;CACtC;AAED,iFAAiF;AACjF,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED,eAAO,MAAM,4BAA4B,QACS,CAAC;AAEnD,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+J3B,CAAC;AAEL,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,GACxC,sBAAsB,CAExB"}
@@ -0,0 +1,156 @@
1
+ import { z } from "zod";
2
+ import { REASONING_CHAIN_OBSERVED_SCHEMA } from "../reasoning-chain.js";
3
+ import { COUNTY_COVERAGE_PARCEL_NODE_SUFFIX, PARCEL_EXTERNAL_KEY_SCHEMA, PARCEL_GEOMETRY_SOURCE_TIER_SCHEMA, PARCEL_GEOMETRY_STORE_REF_SCHEMA, PARCEL_KEY_KIND_SCHEMA, PARCEL_NODE_ABSENCE_SCHEMA, PARCEL_NODE_ID_PATTERN, PROPERTY_ACCESS_POLICY_SCHEMA, PROPERTY_ATOM_TIER, PROPERTY_DEFAULT_ACCESS_POLICY, PROPERTY_QUALITY_GATE_FIELDS, PROPERTY_READ_CONTRACT_SCHEMA, SITE_LAYER_PROVENANCE_FIELDS, SITE_LAYER_VERIFIED_ABSENCE_SCHEMA, } from "./common.js";
4
+ /** Canonical parcel-node DID (matches the published MCP property-chain form). */
5
+ export function parcelNodeAtomDid(parcelNodeId) {
6
+ return `did:hauska:parcel-node:${parcelNodeId}`;
7
+ }
8
+ export const PARCEL_NODE_ATOM_DID_PATTERN = /^did:hauska:parcel-node:\d{5}:[A-Za-z0-9._-]+$/;
9
+ export const PARCEL_NODE_SCHEMA = z
10
+ .object({
11
+ entityType: z.literal("parcel-node"),
12
+ atomDid: z
13
+ .string()
14
+ .min(1)
15
+ .refine((val) => PARCEL_NODE_ATOM_DID_PATTERN.test(val), {
16
+ message: "atomDid must be did:hauska:parcel-node:{county_fips}:{key}",
17
+ }),
18
+ parcelNodeId: z
19
+ .string()
20
+ .min(1)
21
+ .refine((val) => PARCEL_NODE_ID_PATTERN.test(val), {
22
+ message: "parcelNodeId must match {county_fips}:{prop_id}",
23
+ }),
24
+ countyFips: z.string().regex(/^\d{5}$/, "countyFips must be 5 digits"),
25
+ keyKind: PARCEL_KEY_KIND_SCHEMA,
26
+ externalKeys: z.array(PARCEL_EXTERNAL_KEY_SCHEMA).min(1).readonly().optional(),
27
+ reasoningChain: REASONING_CHAIN_OBSERVED_SCHEMA,
28
+ geometrySourceTier: PARCEL_GEOMETRY_SOURCE_TIER_SCHEMA,
29
+ geometryStoreRef: PARCEL_GEOMETRY_STORE_REF_SCHEMA.optional(),
30
+ geometryLoaded: z.boolean(),
31
+ absence: PARCEL_NODE_ABSENCE_SCHEMA.optional(),
32
+ verifiedAbsence: SITE_LAYER_VERIFIED_ABSENCE_SCHEMA.optional(),
33
+ divergenceObservationCount: z.number().int().nonnegative().optional(),
34
+ accessPolicy: PROPERTY_ACCESS_POLICY_SCHEMA,
35
+ ...PROPERTY_QUALITY_GATE_FIELDS,
36
+ ...SITE_LAYER_PROVENANCE_FIELDS,
37
+ atomTier: z.literal(PROPERTY_ATOM_TIER),
38
+ readContract: PROPERTY_READ_CONTRACT_SCHEMA.optional(),
39
+ })
40
+ .superRefine((data, ctx) => {
41
+ const hasGeometryRef = data.geometryStoreRef !== undefined;
42
+ const hasAbsence = data.absence !== undefined;
43
+ const isAbsentTier = data.geometrySourceTier === "absent";
44
+ // Rule 1 — a resolved geometry pointer and a typed absence are contradictory.
45
+ if (hasGeometryRef && hasAbsence) {
46
+ ctx.addIssue({
47
+ code: z.ZodIssueCode.custom,
48
+ message: "geometryStoreRef and absence are mutually exclusive",
49
+ path: ["geometryStoreRef"],
50
+ });
51
+ }
52
+ if (isAbsentTier && hasGeometryRef) {
53
+ ctx.addIssue({
54
+ code: z.ZodIssueCode.custom,
55
+ message: "geometrySourceTier absent must not carry geometryStoreRef",
56
+ path: ["geometrySourceTier"],
57
+ });
58
+ }
59
+ // Rule 2 — fail closed on absent tier: verified absence with real scope.
60
+ if (isAbsentTier) {
61
+ if (!data.verifiedAbsence) {
62
+ ctx.addIssue({
63
+ code: z.ZodIssueCode.custom,
64
+ message: "geometrySourceTier absent requires verifiedAbsence (evaluated + provenanceScope)",
65
+ path: ["verifiedAbsence"],
66
+ });
67
+ }
68
+ if (data.geometryLoaded) {
69
+ ctx.addIssue({
70
+ code: z.ZodIssueCode.custom,
71
+ message: "geometrySourceTier absent requires geometryLoaded false",
72
+ path: ["geometryLoaded"],
73
+ });
74
+ }
75
+ }
76
+ else if (!hasGeometryRef && !hasAbsence) {
77
+ // Rule 3 — a present tier must resolve to a ring or say why it did not.
78
+ ctx.addIssue({
79
+ code: z.ZodIssueCode.custom,
80
+ message: "parcel-node requires geometryStoreRef OR per-parcel absence when geometrySourceTier is not absent",
81
+ path: ["geometryStoreRef"],
82
+ });
83
+ }
84
+ // Rule 4 — geometryLoaded is a claim about the pointer, not a mood.
85
+ if (data.geometryLoaded && !hasGeometryRef) {
86
+ ctx.addIssue({
87
+ code: z.ZodIssueCode.custom,
88
+ message: "geometryLoaded true requires geometryStoreRef",
89
+ path: ["geometryLoaded"],
90
+ });
91
+ }
92
+ if (!data.geometryLoaded && hasGeometryRef) {
93
+ ctx.addIssue({
94
+ code: z.ZodIssueCode.custom,
95
+ message: "geometryStoreRef present requires geometryLoaded true",
96
+ path: ["geometryLoaded"],
97
+ });
98
+ }
99
+ // Rule 5 — the pointer must name the same parcel the atom is about.
100
+ if (data.geometryStoreRef) {
101
+ if (data.geometryStoreRef.countyFips !== data.countyFips) {
102
+ ctx.addIssue({
103
+ code: z.ZodIssueCode.custom,
104
+ message: "geometryStoreRef.countyFips must equal countyFips",
105
+ path: ["geometryStoreRef", "countyFips"],
106
+ });
107
+ }
108
+ const expectedPrefix = `${data.countyFips}:`;
109
+ if (data.parcelNodeId.startsWith(expectedPrefix) &&
110
+ data.parcelNodeId.slice(expectedPrefix.length) !==
111
+ data.geometryStoreRef.propId) {
112
+ ctx.addIssue({
113
+ code: z.ZodIssueCode.custom,
114
+ message: "geometryStoreRef.propId must equal the parcelNodeId key token",
115
+ path: ["geometryStoreRef", "propId"],
116
+ });
117
+ }
118
+ }
119
+ // Rule 6 — atomDid embeds the parcel node id (MCP resolves by this form).
120
+ if (data.atomDid !== parcelNodeAtomDid(data.parcelNodeId)) {
121
+ ctx.addIssue({
122
+ code: z.ZodIssueCode.custom,
123
+ message: "atomDid must be did:hauska:parcel-node:{parcelNodeId}",
124
+ path: ["atomDid"],
125
+ });
126
+ }
127
+ // Rule 7 — the parcel node id must sit in the county the atom claims.
128
+ if (!data.parcelNodeId.startsWith(`${data.countyFips}:`)) {
129
+ ctx.addIssue({
130
+ code: z.ZodIssueCode.custom,
131
+ message: "parcelNodeId must begin with countyFips",
132
+ path: ["parcelNodeId"],
133
+ });
134
+ }
135
+ // Rule 8 — county-coverage anchors are county-level rows only.
136
+ const isCountyCoverage = data.parcelNodeId.endsWith(`:${COUNTY_COVERAGE_PARCEL_NODE_SUFFIX}`);
137
+ if (isCountyCoverage && !data.verifiedAbsence) {
138
+ ctx.addIssue({
139
+ code: z.ZodIssueCode.custom,
140
+ message: "county-coverage parcel-node anchor requires verifiedAbsence",
141
+ path: ["verifiedAbsence"],
142
+ });
143
+ }
144
+ // Rule 9 — public record; parcel identity is never gated.
145
+ if (data.accessPolicy !== PROPERTY_DEFAULT_ACCESS_POLICY) {
146
+ ctx.addIssue({
147
+ code: z.ZodIssueCode.custom,
148
+ message: "parcel-node must use accessPolicy public-free",
149
+ path: ["accessPolicy"],
150
+ });
151
+ }
152
+ });
153
+ export function createParcelNode(input) {
154
+ return PARCEL_NODE_SCHEMA.parse(input);
155
+ }
156
+ //# sourceMappingURL=parcel-node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parcel-node.js","sourceRoot":"","sources":["../../src/property/parcel-node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,OAAO,EAAE,+BAA+B,EAAE,MAAM,uBAAuB,CAAC;AAGxE,OAAO,EACL,kCAAkC,EAClC,0BAA0B,EAC1B,kCAAkC,EAClC,gCAAgC,EAChC,sBAAsB,EACtB,0BAA0B,EAC1B,sBAAsB,EACtB,6BAA6B,EAC7B,kBAAkB,EAClB,8BAA8B,EAC9B,4BAA4B,EAC5B,6BAA6B,EAC7B,4BAA4B,EAC5B,kCAAkC,GAOnC,MAAM,aAAa,CAAC;AAiErB,iFAAiF;AACjF,MAAM,UAAU,iBAAiB,CAAC,YAAoB;IACpD,OAAO,0BAA0B,YAAY,EAAE,CAAC;AAClD,CAAC;AAED,MAAM,CAAC,MAAM,4BAA4B,GACvC,gDAAgD,CAAC;AAEnD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC;KAChC,MAAM,CAAC;IACN,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC;IACpC,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,4BAA4B,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;QACvD,OAAO,EAAE,4DAA4D;KACtE,CAAC;IACJ,YAAY,EAAE,CAAC;SACZ,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,sBAAsB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;QACjD,OAAO,EAAE,iDAAiD;KAC3D,CAAC;IACJ,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,6BAA6B,CAAC;IACtE,OAAO,EAAE,sBAAsB;IAC/B,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC9E,cAAc,EAAE,+BAA+B;IAC/C,kBAAkB,EAAE,kCAAkC;IACtD,gBAAgB,EAAE,gCAAgC,CAAC,QAAQ,EAAE;IAC7D,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE;IAC3B,OAAO,EAAE,0BAA0B,CAAC,QAAQ,EAAE;IAC9C,eAAe,EAAE,kCAAkC,CAAC,QAAQ,EAAE;IAC9D,0BAA0B,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;IACrE,YAAY,EAAE,6BAA6B;IAC3C,GAAG,4BAA4B;IAC/B,GAAG,4BAA4B;IAC/B,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC;IACvC,YAAY,EAAE,6BAA6B,CAAC,QAAQ,EAAE;CACvD,CAAC;KACD,WAAW,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;IACzB,MAAM,cAAc,GAAG,IAAI,CAAC,gBAAgB,KAAK,SAAS,CAAC;IAC3D,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC;IAC9C,MAAM,YAAY,GAAG,IAAI,CAAC,kBAAkB,KAAK,QAAQ,CAAC;IAE1D,8EAA8E;IAC9E,IAAI,cAAc,IAAI,UAAU,EAAE,CAAC;QACjC,GAAG,CAAC,QAAQ,CAAC;YACX,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM;YAC3B,OAAO,EAAE,qDAAqD;YAC9D,IAAI,EAAE,CAAC,kBAAkB,CAAC;SAC3B,CAAC,CAAC;IACL,CAAC;IAED,IAAI,YAAY,IAAI,cAAc,EAAE,CAAC;QACnC,GAAG,CAAC,QAAQ,CAAC;YACX,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM;YAC3B,OAAO,EAAE,2DAA2D;YACpE,IAAI,EAAE,CAAC,oBAAoB,CAAC;SAC7B,CAAC,CAAC;IACL,CAAC;IAED,yEAAyE;IACzE,IAAI,YAAY,EAAE,CAAC;QACjB,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1B,GAAG,CAAC,QAAQ,CAAC;gBACX,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM;gBAC3B,OAAO,EACL,kFAAkF;gBACpF,IAAI,EAAE,CAAC,iBAAiB,CAAC;aAC1B,CAAC,CAAC;QACL,CAAC;QACD,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,GAAG,CAAC,QAAQ,CAAC;gBACX,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM;gBAC3B,OAAO,EAAE,yDAAyD;gBAClE,IAAI,EAAE,CAAC,gBAAgB,CAAC;aACzB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;SAAM,IAAI,CAAC,cAAc,IAAI,CAAC,UAAU,EAAE,CAAC;QAC1C,wEAAwE;QACxE,GAAG,CAAC,QAAQ,CAAC;YACX,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM;YAC3B,OAAO,EACL,mGAAmG;YACrG,IAAI,EAAE,CAAC,kBAAkB,CAAC;SAC3B,CAAC,CAAC;IACL,CAAC;IAED,oEAAoE;IACpE,IAAI,IAAI,CAAC,cAAc,IAAI,CAAC,cAAc,EAAE,CAAC;QAC3C,GAAG,CAAC,QAAQ,CAAC;YACX,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM;YAC3B,OAAO,EAAE,+CAA+C;YACxD,IAAI,EAAE,CAAC,gBAAgB,CAAC;SACzB,CAAC,CAAC;IACL,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,cAAc,EAAE,CAAC;QAC3C,GAAG,CAAC,QAAQ,CAAC;YACX,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM;YAC3B,OAAO,EAAE,uDAAuD;YAChE,IAAI,EAAE,CAAC,gBAAgB,CAAC;SACzB,CAAC,CAAC;IACL,CAAC;IAED,oEAAoE;IACpE,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC1B,IAAI,IAAI,CAAC,gBAAgB,CAAC,UAAU,KAAK,IAAI,CAAC,UAAU,EAAE,CAAC;YACzD,GAAG,CAAC,QAAQ,CAAC;gBACX,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM;gBAC3B,OAAO,EAAE,mDAAmD;gBAC5D,IAAI,EAAE,CAAC,kBAAkB,EAAE,YAAY,CAAC;aACzC,CAAC,CAAC;QACL,CAAC;QACD,MAAM,cAAc,GAAG,GAAG,IAAI,CAAC,UAAU,GAAG,CAAC;QAC7C,IACE,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,cAAc,CAAC;YAC5C,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC;gBAC5C,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAC9B,CAAC;YACD,GAAG,CAAC,QAAQ,CAAC;gBACX,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM;gBAC3B,OAAO,EACL,+DAA+D;gBACjE,IAAI,EAAE,CAAC,kBAAkB,EAAE,QAAQ,CAAC;aACrC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,0EAA0E;IAC1E,IAAI,IAAI,CAAC,OAAO,KAAK,iBAAiB,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;QAC1D,GAAG,CAAC,QAAQ,CAAC;YACX,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM;YAC3B,OAAO,EAAE,uDAAuD;YAChE,IAAI,EAAE,CAAC,SAAS,CAAC;SAClB,CAAC,CAAC;IACL,CAAC;IAED,sEAAsE;IACtE,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;QACzD,GAAG,CAAC,QAAQ,CAAC;YACX,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM;YAC3B,OAAO,EAAE,yCAAyC;YAClD,IAAI,EAAE,CAAC,cAAc,CAAC;SACvB,CAAC,CAAC;IACL,CAAC;IAED,+DAA+D;IAC/D,MAAM,gBAAgB,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CACjD,IAAI,kCAAkC,EAAE,CACzC,CAAC;IACF,IAAI,gBAAgB,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;QAC9C,GAAG,CAAC,QAAQ,CAAC;YACX,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM;YAC3B,OAAO,EACL,6DAA6D;YAC/D,IAAI,EAAE,CAAC,iBAAiB,CAAC;SAC1B,CAAC,CAAC;IACL,CAAC;IAED,0DAA0D;IAC1D,IAAI,IAAI,CAAC,YAAY,KAAK,8BAA8B,EAAE,CAAC;QACzD,GAAG,CAAC,QAAQ,CAAC;YACX,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM;YAC3B,OAAO,EAAE,+CAA+C;YACxD,IAAI,EAAE,CAAC,cAAc,CAAC;SACvB,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,MAAM,UAAU,gBAAgB,CAC9B,KAAyC;IAEzC,OAAO,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAA2B,CAAC;AACnE,CAAC"}
@@ -526,12 +526,12 @@ export declare const ROAD_NODE_SCHEMA: z.ZodObject<{
526
526
  sourceCitation: string;
527
527
  extractedAt: string;
528
528
  atomDid: string;
529
+ countyFips: string;
529
530
  reasoningChain: {
530
531
  reasoningKind: "observed";
531
532
  };
532
533
  atomTier: AtomTier;
533
534
  roadNodeId: string;
534
- countyFips: string;
535
535
  osmWayId: number;
536
536
  classification: "highway" | "major_collector" | "minor_collector" | "residential" | "alley" | "gravel" | "unclassified";
537
537
  centerline: {
@@ -610,12 +610,12 @@ export declare const ROAD_NODE_SCHEMA: z.ZodObject<{
610
610
  sourceCitation: string;
611
611
  extractedAt: string;
612
612
  atomDid: string;
613
+ countyFips: string;
613
614
  reasoningChain: {
614
615
  reasoningKind: "observed";
615
616
  };
616
617
  atomTier: AtomTier;
617
618
  roadNodeId: string;
618
- countyFips: string;
619
619
  osmWayId: number;
620
620
  classification: "highway" | "major_collector" | "minor_collector" | "residential" | "alley" | "gravel" | "unclassified";
621
621
  centerline: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@empressaio/atom-contract",
3
- "version": "1.12.0",
3
+ "version": "1.13.0",
4
4
  "description": "The typed-data substrate every Empressa atom satisfies: identity, context interface, composition declaration, and history anchoring. Peer to the Hauska SDK (`@hauska-sdk/*`); consumed directly by every product surface and MCP server.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",