@empressaio/atom-contract 1.14.0 → 1.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,36 @@
2
2
 
3
3
  All notable changes to `@empressaio/atom-contract` (formerly `@hauska/atom-contract`) are documented here.
4
4
 
5
+ ## [1.15.0] - 2026-08-09
6
+
7
+ Additive minor — first-class typed absence for `buildable-envelope`, closing the
8
+ last property-family gap where honest declines lived only as engine-extension
9
+ fields (`warmVerifyDecline` / `warmVerifyDeclineCode`).
10
+
11
+ ### Added
12
+
13
+ - **`buildable-envelope.absence`** — `{ kind, reason }` where `kind` is one of
14
+ the fourteen live decline codes lifted from Bastrop store population +
15
+ `bucketVerifyFailReasons` residual buckets. No invented taxonomy.
16
+ - **`buildable-envelope.verifiedAbsence`** — mandatory whenever `absence` is
17
+ present (`evaluated: true` + non-empty `provenanceScope`), same fail-closed
18
+ dialect as site-layer families. Decline envelopes require only a
19
+ zoning-fact input ref; positive envelopes still require the full
20
+ zoning-fact + setback-rule + geometry + front-edge chain.
21
+ - `BUILDABLE_ENVELOPE_ABSENCE_KINDS`, `BUILDABLE_ENVELOPE_ABSENCE_SCHEMA`,
22
+ `toBuildableEnvelopeAbsenceKind` (unknown producer strings collapse to
23
+ `other-verify-fail`).
24
+ - Fixtures and round-trip tests for every live kind; negative probes for
25
+ absence-without-verifiedAbsence and verifiedAbsence-without-absence.
26
+ - `PROPERTY_CONFORMANCE_TARGET_VERSION = "1.15.0"`.
27
+
28
+ ### Explicitly NOT in 1.15.0
29
+
30
+ - Data migration of existing store rows that carry only
31
+ `warmVerifyDecline*` — readers stay dual-path; rewrite is a separate lane.
32
+ - Changes to envelope geometry / outcome fields (engine extensions unchanged).
33
+ - Any new decline codes beyond the lifted live set.
34
+
5
35
  ## [1.14.0] - 2026-08-08
6
36
 
7
37
  Additive minor — three county-shape property rails with first-class typed absence:
@@ -80,7 +110,7 @@ shipped, with no producer behind it; this lands the shape so the engine can writ
80
110
  - A new relationship layer — `atom_links` already ships.
81
111
  - `cad-parcel-roll`, `land-use-fact`, `parcel-owner-facet`, `flood-hazard-fact`,
82
112
  `soil-survey-fact` — later rails in the same spec.
83
- - `buildable-envelope.absence` — still queued.
113
+ - `buildable-envelope.absence` — shipped in 1.15.0.
84
114
 
85
115
  ## [1.12.0] - 2026-08-05
86
116
 
@@ -22,7 +22,7 @@ export type ReasoningConformanceTargetVersion = typeof REASONING_CONFORMANCE_TAR
22
22
  /**
23
23
  * Pin property atom kind adopters to this semver (master WDLL 3.2–3.6).
24
24
  */
25
- export declare const PROPERTY_CONFORMANCE_TARGET_VERSION: "1.14.0";
25
+ export declare const PROPERTY_CONFORMANCE_TARGET_VERSION: "1.15.0";
26
26
  export type PropertyConformanceTargetVersion = typeof PROPERTY_CONFORMANCE_TARGET_VERSION;
27
27
  /** Data-level atoms carry signed history; app-level workflow containers skip it. */
28
28
  export type AtomTier = "data" | "app";
@@ -19,7 +19,7 @@ export const REASONING_CONFORMANCE_TARGET_VERSION = "1.8.0";
19
19
  /**
20
20
  * Pin property atom kind adopters to this semver (master WDLL 3.2–3.6).
21
21
  */
22
- export const PROPERTY_CONFORMANCE_TARGET_VERSION = "1.14.0";
22
+ export const PROPERTY_CONFORMANCE_TARGET_VERSION = "1.15.0";
23
23
  export const ATOM_TIER_VALUES = ["data", "app"];
24
24
  export const ACCESS_POLICY_VALUES = [
25
25
  "public-free",
@@ -4,10 +4,23 @@ import type { AtomTier } from "../conformance/common.js";
4
4
  import type { AtomInputRef } from "../reasoning-chain.js";
5
5
  import type { ReasoningChain } from "../reasoning-chain.js";
6
6
  import type { ReasoningReadContract } from "../read-contract/reasoning-axes.js";
7
+ import { type BuildableEnvelopeAbsence, type SiteLayerVerifiedAbsence } from "./common.js";
7
8
  /** Canonical derivation method for buildable envelope inset (master 3.6). */
8
9
  export declare const BUILDABLE_ENVELOPE_DERIVATION_METHOD: "buildable-envelope-inset-v1";
9
10
  /**
10
- * Buildable-envelope DERIVED atom — inputs cite fact + rule + reference fields.
11
+ * Buildable-envelope DERIVED atom — inputs cite fact + rule + reference fields,
12
+ * OR carry typed absence when the warm/cascade path deliberately declines.
13
+ *
14
+ * Typed absence (1.15.0): when the engine refuses to compute an envelope it
15
+ * emits `absence` (kind = live decline code) plus `verifiedAbsence` with a
16
+ * non-empty `provenanceScope`. That is the same fail-closed dialect as the
17
+ * site-layer families (`sourceTier: absent` → `verifiedAbsence`), expressed
18
+ * for a derived atom that has no source tier.
19
+ *
20
+ * Positive envelopes still require zoning-fact + setback-rule + geometry +
21
+ * front-edge reference inputs. Decline envelopes require only a zoning-fact
22
+ * fact ref (setbacks and rings may not exist — fabricating them is exactly
23
+ * the silent-fabrication mode honest absence exists to prevent).
11
24
  *
12
25
  * No `labeling x district` multiply field. `calibratedConfidence` on
13
26
  * {@link readContract} may be a placeholder asserted snapshot at write;
@@ -24,6 +37,13 @@ export interface BuildableEnvelopeAtomInstance {
24
37
  derivationMethod: typeof BUILDABLE_ENVELOPE_DERIVATION_METHOD;
25
38
  inputAtomRefs: AtomInputRef[];
26
39
  };
40
+ /** Present when warm/cascade evaluation deliberately refused an envelope. */
41
+ absence?: BuildableEnvelopeAbsence;
42
+ /**
43
+ * Required whenever `absence` is present — documents that the decline was
44
+ * evaluated against named sources (fail-closed; empty scope is a parse error).
45
+ */
46
+ verifiedAbsence?: SiteLayerVerifiedAbsence;
27
47
  accessPolicy: AccessPolicy;
28
48
  sourceCitation: string;
29
49
  extractedAt: string;
@@ -31,7 +51,7 @@ export interface BuildableEnvelopeAtomInstance {
31
51
  atomTier: AtomTier;
32
52
  readContract?: ReasoningReadContract;
33
53
  }
34
- export declare const BUILDABLE_ENVELOPE_SCHEMA: z.ZodObject<{
54
+ export declare const BUILDABLE_ENVELOPE_SCHEMA: z.ZodEffects<z.ZodObject<{
35
55
  atomTier: z.ZodLiteral<AtomTier>;
36
56
  readContract: z.ZodOptional<z.ZodReadonly<z.ZodObject<{
37
57
  axes: z.ZodReadonly<z.ZodObject<{
@@ -282,7 +302,7 @@ export declare const BUILDABLE_ENVELOPE_SCHEMA: z.ZodObject<{
282
302
  entityType: z.ZodLiteral<"buildable-envelope">;
283
303
  atomDid: z.ZodEffects<z.ZodString, string, string>;
284
304
  parcelNodeId: z.ZodEffects<z.ZodString, string, string>;
285
- reasoningChain: z.ZodEffects<z.ZodObject<{
305
+ reasoningChain: z.ZodObject<{
286
306
  reasoningKind: z.ZodLiteral<"derived">;
287
307
  derivationMethod: z.ZodString;
288
308
  inputAtomRefs: z.ZodArray<z.ZodReadonly<z.ZodObject<{
@@ -319,7 +339,36 @@ export declare const BUILDABLE_ENVELOPE_SCHEMA: z.ZodObject<{
319
339
  entityType?: string | undefined;
320
340
  citationLabel?: string | undefined;
321
341
  }>[];
322
- }>, {
342
+ }>;
343
+ absence: z.ZodOptional<z.ZodObject<{
344
+ kind: z.ZodEnum<["unzoned-no-district-basis", "no-district-on-record", "no-setback-row", "no-road-adjacency", "front-orientation-unresolved", "superseded-prop-id", "front-orientation", "road-classification-mismatch", "r32-per-edge-inset", "null-inset", "faces-answer", "geometry", "setback-edge-distance", "other-verify-fail"]>;
345
+ reason: z.ZodString;
346
+ }, "strict", z.ZodTypeAny, {
347
+ kind: "unzoned-no-district-basis" | "no-district-on-record" | "no-setback-row" | "no-road-adjacency" | "front-orientation-unresolved" | "superseded-prop-id" | "front-orientation" | "road-classification-mismatch" | "r32-per-edge-inset" | "null-inset" | "faces-answer" | "geometry" | "setback-edge-distance" | "other-verify-fail";
348
+ reason: string;
349
+ }, {
350
+ kind: "unzoned-no-district-basis" | "no-district-on-record" | "no-setback-row" | "no-road-adjacency" | "front-orientation-unresolved" | "superseded-prop-id" | "front-orientation" | "road-classification-mismatch" | "r32-per-edge-inset" | "null-inset" | "faces-answer" | "geometry" | "setback-edge-distance" | "other-verify-fail";
351
+ reason: string;
352
+ }>>;
353
+ verifiedAbsence: z.ZodOptional<z.ZodObject<{
354
+ evaluated: z.ZodLiteral<true>;
355
+ provenanceScope: z.ZodArray<z.ZodString, "many">;
356
+ }, "strict", z.ZodTypeAny, {
357
+ evaluated: true;
358
+ provenanceScope: string[];
359
+ }, {
360
+ evaluated: true;
361
+ provenanceScope: string[];
362
+ }>>;
363
+ accessPolicy: z.ZodEnum<["public-free", "public-paid", "platform-internal", "tenant-private", "tenant-shared"]>;
364
+ }, "strict", z.ZodTypeAny, {
365
+ accessPolicy: "public-free" | "public-paid" | "platform-internal" | "tenant-private" | "tenant-shared";
366
+ entityType: "buildable-envelope";
367
+ sourceCitation: string;
368
+ extractedAt: string;
369
+ atomDid: string;
370
+ parcelNodeId: string;
371
+ reasoningChain: {
323
372
  reasoningKind: "derived";
324
373
  derivationMethod: string;
325
374
  inputAtomRefs: Readonly<{
@@ -328,7 +377,66 @@ export declare const BUILDABLE_ENVELOPE_SCHEMA: z.ZodObject<{
328
377
  entityType?: string | undefined;
329
378
  citationLabel?: string | undefined;
330
379
  }>[];
331
- }, {
380
+ };
381
+ atomTier: AtomTier;
382
+ asOf?: string | undefined;
383
+ readContract?: Readonly<{
384
+ axes: Readonly<{
385
+ calibratedConfidence: Readonly<{
386
+ estimate: number;
387
+ n: number;
388
+ intervalWidth: number;
389
+ provenance: "asserted" | "backtest" | "seed" | "live";
390
+ }>;
391
+ assertedConfidence: Readonly<{
392
+ estimate: number;
393
+ n: number;
394
+ intervalWidth: number;
395
+ provenance: "asserted" | "backtest" | "seed" | "live";
396
+ }>;
397
+ consequence: {
398
+ stratum: import("../read-contract/reasoning-axes.js").PropertyRiskStratum;
399
+ assertedAt: string;
400
+ kind: "property-risk";
401
+ basis: string;
402
+ auditRef?: string | undefined;
403
+ } | {
404
+ assertedAt: string;
405
+ kind: "not-applicable";
406
+ reason: string;
407
+ };
408
+ }>;
409
+ assembledAt: string;
410
+ modelAttribution?: Readonly<{
411
+ modelId: string;
412
+ modelVersion: string;
413
+ promptTemplateVersion: string;
414
+ contextTemplateVersion: string;
415
+ samplingParams: Readonly<z.objectOutputType<{
416
+ temperature: z.ZodOptional<z.ZodNumber>;
417
+ topP: z.ZodOptional<z.ZodNumber>;
418
+ maxTokens: z.ZodOptional<z.ZodNumber>;
419
+ seed: z.ZodOptional<z.ZodNumber>;
420
+ }, z.ZodUnknown, "strip">>;
421
+ retrievedAtomSetId: string;
422
+ }> | undefined;
423
+ }> | undefined;
424
+ absence?: {
425
+ kind: "unzoned-no-district-basis" | "no-district-on-record" | "no-setback-row" | "no-road-adjacency" | "front-orientation-unresolved" | "superseded-prop-id" | "front-orientation" | "road-classification-mismatch" | "r32-per-edge-inset" | "null-inset" | "faces-answer" | "geometry" | "setback-edge-distance" | "other-verify-fail";
426
+ reason: string;
427
+ } | undefined;
428
+ verifiedAbsence?: {
429
+ evaluated: true;
430
+ provenanceScope: string[];
431
+ } | undefined;
432
+ }, {
433
+ accessPolicy: "public-free" | "public-paid" | "platform-internal" | "tenant-private" | "tenant-shared";
434
+ entityType: "buildable-envelope";
435
+ sourceCitation: string;
436
+ extractedAt: string;
437
+ atomDid: string;
438
+ parcelNodeId: string;
439
+ reasoningChain: {
332
440
  reasoningKind: "derived";
333
441
  derivationMethod: string;
334
442
  inputAtomRefs: Readonly<{
@@ -337,9 +445,59 @@ export declare const BUILDABLE_ENVELOPE_SCHEMA: z.ZodObject<{
337
445
  entityType?: string | undefined;
338
446
  citationLabel?: string | undefined;
339
447
  }>[];
340
- }>;
341
- accessPolicy: z.ZodEnum<["public-free", "public-paid", "platform-internal", "tenant-private", "tenant-shared"]>;
342
- }, "strict", z.ZodTypeAny, {
448
+ };
449
+ atomTier: AtomTier;
450
+ asOf?: string | undefined;
451
+ readContract?: Readonly<{
452
+ axes: Readonly<{
453
+ calibratedConfidence: Readonly<{
454
+ estimate: number;
455
+ n: number;
456
+ intervalWidth: number;
457
+ provenance: "asserted" | "backtest" | "seed" | "live";
458
+ }>;
459
+ assertedConfidence: Readonly<{
460
+ estimate: number;
461
+ n: number;
462
+ intervalWidth: number;
463
+ provenance: "asserted" | "backtest" | "seed" | "live";
464
+ }>;
465
+ consequence: {
466
+ stratum: import("../read-contract/reasoning-axes.js").PropertyRiskStratum;
467
+ assertedAt: string;
468
+ kind: "property-risk";
469
+ basis: string;
470
+ auditRef?: string | undefined;
471
+ } | {
472
+ assertedAt: string;
473
+ kind: "not-applicable";
474
+ reason: string;
475
+ };
476
+ }>;
477
+ assembledAt: string;
478
+ modelAttribution?: Readonly<{
479
+ modelId: string;
480
+ modelVersion: string;
481
+ promptTemplateVersion: string;
482
+ contextTemplateVersion: string;
483
+ samplingParams: Readonly<z.objectInputType<{
484
+ temperature: z.ZodOptional<z.ZodNumber>;
485
+ topP: z.ZodOptional<z.ZodNumber>;
486
+ maxTokens: z.ZodOptional<z.ZodNumber>;
487
+ seed: z.ZodOptional<z.ZodNumber>;
488
+ }, z.ZodUnknown, "strip">>;
489
+ retrievedAtomSetId: string;
490
+ }> | undefined;
491
+ }> | undefined;
492
+ absence?: {
493
+ kind: "unzoned-no-district-basis" | "no-district-on-record" | "no-setback-row" | "no-road-adjacency" | "front-orientation-unresolved" | "superseded-prop-id" | "front-orientation" | "road-classification-mismatch" | "r32-per-edge-inset" | "null-inset" | "faces-answer" | "geometry" | "setback-edge-distance" | "other-verify-fail";
494
+ reason: string;
495
+ } | undefined;
496
+ verifiedAbsence?: {
497
+ evaluated: true;
498
+ provenanceScope: string[];
499
+ } | undefined;
500
+ }>, {
343
501
  accessPolicy: "public-free" | "public-paid" | "platform-internal" | "tenant-private" | "tenant-shared";
344
502
  entityType: "buildable-envelope";
345
503
  sourceCitation: string;
@@ -399,6 +557,14 @@ export declare const BUILDABLE_ENVELOPE_SCHEMA: z.ZodObject<{
399
557
  retrievedAtomSetId: string;
400
558
  }> | undefined;
401
559
  }> | undefined;
560
+ absence?: {
561
+ kind: "unzoned-no-district-basis" | "no-district-on-record" | "no-setback-row" | "no-road-adjacency" | "front-orientation-unresolved" | "superseded-prop-id" | "front-orientation" | "road-classification-mismatch" | "r32-per-edge-inset" | "null-inset" | "faces-answer" | "geometry" | "setback-edge-distance" | "other-verify-fail";
562
+ reason: string;
563
+ } | undefined;
564
+ verifiedAbsence?: {
565
+ evaluated: true;
566
+ provenanceScope: string[];
567
+ } | undefined;
402
568
  }, {
403
569
  accessPolicy: "public-free" | "public-paid" | "platform-internal" | "tenant-private" | "tenant-shared";
404
570
  entityType: "buildable-envelope";
@@ -459,6 +625,14 @@ export declare const BUILDABLE_ENVELOPE_SCHEMA: z.ZodObject<{
459
625
  retrievedAtomSetId: string;
460
626
  }> | undefined;
461
627
  }> | undefined;
628
+ absence?: {
629
+ kind: "unzoned-no-district-basis" | "no-district-on-record" | "no-setback-row" | "no-road-adjacency" | "front-orientation-unresolved" | "superseded-prop-id" | "front-orientation" | "road-classification-mismatch" | "r32-per-edge-inset" | "null-inset" | "faces-answer" | "geometry" | "setback-edge-distance" | "other-verify-fail";
630
+ reason: string;
631
+ } | undefined;
632
+ verifiedAbsence?: {
633
+ evaluated: true;
634
+ provenanceScope: string[];
635
+ } | undefined;
462
636
  }>;
463
637
  export declare function createBuildableEnvelope(input: z.input<typeof BUILDABLE_ENVELOPE_SCHEMA>): BuildableEnvelopeAtomInstance;
464
638
  //# sourceMappingURL=buildable-envelope.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"buildable-envelope.d.ts","sourceRoot":"","sources":["../../src/property/buildable-envelope.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,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAUhF,6EAA6E;AAC7E,eAAO,MAAM,oCAAoC,EAAG,6BAAsC,CAAC;AAE3F;;;;;;;GAOG;AACH,MAAM,WAAW,6BAA6B;IAC5C,UAAU,EAAE,oBAAoB,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE;QAAE,aAAa,EAAE,SAAS,CAAA;KAAE,CAAC,GAAG;QACtE,gBAAgB,EAAE,OAAO,oCAAoC,CAAC;QAC9D,aAAa,EAAE,YAAY,EAAE,CAAC;KAC/B,CAAC;IACF,YAAY,EAAE,YAAY,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,QAAQ,CAAC;IACnB,YAAY,CAAC,EAAE,qBAAqB,CAAC;CACtC;AAED,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4D3B,CAAC;AAEZ,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,GAC/C,6BAA6B,CAE/B"}
1
+ {"version":3,"file":"buildable-envelope.d.ts","sourceRoot":"","sources":["../../src/property/buildable-envelope.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,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAEhF,OAAO,EAQL,KAAK,wBAAwB,EAC7B,KAAK,wBAAwB,EAC9B,MAAM,aAAa,CAAC;AAErB,6EAA6E;AAC7E,eAAO,MAAM,oCAAoC,EAAG,6BAAsC,CAAC;AAE3F;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,WAAW,6BAA6B;IAC5C,UAAU,EAAE,oBAAoB,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE;QAAE,aAAa,EAAE,SAAS,CAAA;KAAE,CAAC,GAAG;QACtE,gBAAgB,EAAE,OAAO,oCAAoC,CAAC;QAC9D,aAAa,EAAE,YAAY,EAAE,CAAC;KAC/B,CAAC;IACF,6EAA6E;IAC7E,OAAO,CAAC,EAAE,wBAAwB,CAAC;IACnC;;;OAGG;IACH,eAAe,CAAC,EAAE,wBAAwB,CAAC;IAC3C,YAAY,EAAE,YAAY,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,QAAQ,CAAC;IACnB,YAAY,CAAC,EAAE,qBAAqB,CAAC;CACtC;AAED,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2FlC,CAAC;AAEL,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,GAC/C,6BAA6B,CAE/B"}
@@ -1,6 +1,6 @@
1
1
  import { z } from "zod";
2
2
  import { REASONING_CHAIN_DERIVED_SCHEMA } from "../reasoning-chain.js";
3
- import { PARCEL_NODE_ID_PATTERN, PROPERTY_ACCESS_POLICY_SCHEMA, PROPERTY_ATOM_TIER, PROPERTY_QUALITY_GATE_FIELDS, PROPERTY_READ_CONTRACT_SCHEMA, } from "./common.js";
3
+ import { BUILDABLE_ENVELOPE_ABSENCE_SCHEMA, PARCEL_NODE_ID_PATTERN, PROPERTY_ACCESS_POLICY_SCHEMA, PROPERTY_ATOM_TIER, PROPERTY_QUALITY_GATE_FIELDS, PROPERTY_READ_CONTRACT_SCHEMA, SITE_LAYER_VERIFIED_ABSENCE_SCHEMA, } from "./common.js";
4
4
  /** Canonical derivation method for buildable envelope inset (master 3.6). */
5
5
  export const BUILDABLE_ENVELOPE_DERIVATION_METHOD = "buildable-envelope-inset-v1";
6
6
  export const BUILDABLE_ENVELOPE_SCHEMA = z
@@ -18,45 +18,69 @@ export const BUILDABLE_ENVELOPE_SCHEMA = z
18
18
  .refine((val) => PARCEL_NODE_ID_PATTERN.test(val), {
19
19
  message: "parcelNodeId must match {county_fips}:{prop_id}",
20
20
  }),
21
- reasoningChain: REASONING_CHAIN_DERIVED_SCHEMA.superRefine((chain, ctx) => {
22
- if (chain.derivationMethod !== BUILDABLE_ENVELOPE_DERIVATION_METHOD) {
23
- ctx.addIssue({
24
- code: z.ZodIssueCode.custom,
25
- message: `derivationMethod must be ${BUILDABLE_ENVELOPE_DERIVATION_METHOD}`,
26
- path: ["derivationMethod"],
27
- });
28
- }
29
- const hasZoningFact = chain.inputAtomRefs.some((r) => r.role === "fact" && r.entityType === "zoning-fact");
21
+ reasoningChain: REASONING_CHAIN_DERIVED_SCHEMA,
22
+ absence: BUILDABLE_ENVELOPE_ABSENCE_SCHEMA.optional(),
23
+ verifiedAbsence: SITE_LAYER_VERIFIED_ABSENCE_SCHEMA.optional(),
24
+ accessPolicy: PROPERTY_ACCESS_POLICY_SCHEMA,
25
+ ...PROPERTY_QUALITY_GATE_FIELDS,
26
+ atomTier: z.literal(PROPERTY_ATOM_TIER),
27
+ readContract: PROPERTY_READ_CONTRACT_SCHEMA.optional(),
28
+ })
29
+ .strict()
30
+ .superRefine((data, ctx) => {
31
+ const chain = data.reasoningChain;
32
+ if (chain.derivationMethod !== BUILDABLE_ENVELOPE_DERIVATION_METHOD) {
33
+ ctx.addIssue({
34
+ code: z.ZodIssueCode.custom,
35
+ message: `derivationMethod must be ${BUILDABLE_ENVELOPE_DERIVATION_METHOD}`,
36
+ path: ["reasoningChain", "derivationMethod"],
37
+ });
38
+ }
39
+ const hasAbsence = data.absence !== undefined;
40
+ const hasVerifiedAbsence = data.verifiedAbsence !== undefined;
41
+ if (hasAbsence && !hasVerifiedAbsence) {
42
+ ctx.addIssue({
43
+ code: z.ZodIssueCode.custom,
44
+ message: "buildable-envelope absence requires verifiedAbsence (evaluated + provenanceScope)",
45
+ path: ["verifiedAbsence"],
46
+ });
47
+ }
48
+ if (!hasAbsence && hasVerifiedAbsence) {
49
+ ctx.addIssue({
50
+ code: z.ZodIssueCode.custom,
51
+ message: "verifiedAbsence on buildable-envelope requires per-parcel absence kind",
52
+ path: ["absence"],
53
+ });
54
+ }
55
+ const hasZoningFact = chain.inputAtomRefs.some((r) => r.role === "fact" && r.entityType === "zoning-fact");
56
+ if (!hasZoningFact) {
57
+ ctx.addIssue({
58
+ code: z.ZodIssueCode.custom,
59
+ message: "buildable-envelope requires a zoning-fact input ref",
60
+ path: ["reasoningChain", "inputAtomRefs"],
61
+ });
62
+ }
63
+ // Positive envelopes keep the full derivation chain. Decline envelopes
64
+ // may lack setback-rule and geometry refs — refusing to invent them.
65
+ if (!hasAbsence) {
30
66
  const hasSetbackRule = chain.inputAtomRefs.some((r) => r.role === "rule" && r.entityType === "setback-rule");
31
67
  const refFieldCount = chain.inputAtomRefs.filter((r) => r.role === "reference-field").length;
32
- if (!hasZoningFact) {
33
- ctx.addIssue({
34
- code: z.ZodIssueCode.custom,
35
- message: "buildable-envelope requires a zoning-fact input ref",
36
- path: ["inputAtomRefs"],
37
- });
38
- }
39
68
  if (!hasSetbackRule) {
40
69
  ctx.addIssue({
41
70
  code: z.ZodIssueCode.custom,
42
71
  message: "buildable-envelope requires a setback-rule input ref",
43
- path: ["inputAtomRefs"],
72
+ path: ["reasoningChain", "inputAtomRefs"],
44
73
  });
45
74
  }
46
75
  if (refFieldCount < 2) {
47
76
  ctx.addIssue({
48
77
  code: z.ZodIssueCode.custom,
49
78
  message: "buildable-envelope requires geometry + front-edge reference-field inputs",
50
- path: ["inputAtomRefs"],
79
+ path: ["reasoningChain", "inputAtomRefs"],
51
80
  });
52
81
  }
53
- }),
54
- accessPolicy: PROPERTY_ACCESS_POLICY_SCHEMA,
55
- ...PROPERTY_QUALITY_GATE_FIELDS,
56
- atomTier: z.literal(PROPERTY_ATOM_TIER),
57
- readContract: PROPERTY_READ_CONTRACT_SCHEMA.optional(),
58
- })
59
- .strict();
82
+ }
83
+ });
60
84
  export function createBuildableEnvelope(input) {
61
85
  return BUILDABLE_ENVELOPE_SCHEMA.parse(input);
62
86
  }
@@ -1 +1 @@
1
- {"version":3,"file":"buildable-envelope.js","sourceRoot":"","sources":["../../src/property/buildable-envelope.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"buildable-envelope.js","sourceRoot":"","sources":["../../src/property/buildable-envelope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,OAAO,EAAE,8BAA8B,EAAE,MAAM,uBAAuB,CAAC;AAGvE,OAAO,EACL,iCAAiC,EACjC,sBAAsB,EACtB,6BAA6B,EAC7B,kBAAkB,EAClB,4BAA4B,EAC5B,6BAA6B,EAC7B,kCAAkC,GAGnC,MAAM,aAAa,CAAC;AAErB,6EAA6E;AAC7E,MAAM,CAAC,MAAM,oCAAoC,GAAG,6BAAsC,CAAC;AA6C3F,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC;KACvC,MAAM,CAAC;IACN,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC;IAC3C,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,0BAA0B,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;QACrD,OAAO,EAAE,oDAAoD;KAC9D,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,cAAc,EAAE,8BAA8B;IAC9C,OAAO,EAAE,iCAAiC,CAAC,QAAQ,EAAE;IACrD,eAAe,EAAE,kCAAkC,CAAC,QAAQ,EAAE;IAC9D,YAAY,EAAE,6BAA6B;IAC3C,GAAG,4BAA4B;IAC/B,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC;IACvC,YAAY,EAAE,6BAA6B,CAAC,QAAQ,EAAE;CACvD,CAAC;KACD,MAAM,EAAE;KACR,WAAW,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;IACzB,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC;IAClC,IAAI,KAAK,CAAC,gBAAgB,KAAK,oCAAoC,EAAE,CAAC;QACpE,GAAG,CAAC,QAAQ,CAAC;YACX,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM;YAC3B,OAAO,EAAE,4BAA4B,oCAAoC,EAAE;YAC3E,IAAI,EAAE,CAAC,gBAAgB,EAAE,kBAAkB,CAAC;SAC7C,CAAC,CAAC;IACL,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC;IAC9C,MAAM,kBAAkB,GAAG,IAAI,CAAC,eAAe,KAAK,SAAS,CAAC;IAE9D,IAAI,UAAU,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACtC,GAAG,CAAC,QAAQ,CAAC;YACX,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM;YAC3B,OAAO,EACL,mFAAmF;YACrF,IAAI,EAAE,CAAC,iBAAiB,CAAC;SAC1B,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,UAAU,IAAI,kBAAkB,EAAE,CAAC;QACtC,GAAG,CAAC,QAAQ,CAAC;YACX,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM;YAC3B,OAAO,EACL,wEAAwE;YAC1E,IAAI,EAAE,CAAC,SAAS,CAAC;SAClB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC,IAAI,CAC5C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,UAAU,KAAK,aAAa,CAC3D,CAAC;IACF,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,GAAG,CAAC,QAAQ,CAAC;YACX,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM;YAC3B,OAAO,EAAE,qDAAqD;YAC9D,IAAI,EAAE,CAAC,gBAAgB,EAAE,eAAe,CAAC;SAC1C,CAAC,CAAC;IACL,CAAC;IAED,uEAAuE;IACvE,qEAAqE;IACrE,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,cAAc,GAAG,KAAK,CAAC,aAAa,CAAC,IAAI,CAC7C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,UAAU,KAAK,cAAc,CAC5D,CAAC;QACF,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC,MAAM,CAC9C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,iBAAiB,CACpC,CAAC,MAAM,CAAC;QACT,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,GAAG,CAAC,QAAQ,CAAC;gBACX,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM;gBAC3B,OAAO,EAAE,sDAAsD;gBAC/D,IAAI,EAAE,CAAC,gBAAgB,EAAE,eAAe,CAAC;aAC1C,CAAC,CAAC;QACL,CAAC;QACD,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;YACtB,GAAG,CAAC,QAAQ,CAAC;gBACX,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM;gBAC3B,OAAO,EACL,0EAA0E;gBAC5E,IAAI,EAAE,CAAC,gBAAgB,EAAE,eAAe,CAAC;aAC1C,CAAC,CAAC;QACL,CAAC;IACH,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,MAAM,UAAU,uBAAuB,CACrC,KAAgD;IAEhD,OAAO,yBAAyB,CAAC,KAAK,CAAC,KAAK,CAAkC,CAAC;AACjF,CAAC"}
@@ -402,13 +402,6 @@ export declare const BUILDING_FOOTPRINT_SCHEMA: z.ZodEffects<z.ZodObject<{
402
402
  retrievedAtomSetId: string;
403
403
  }> | undefined;
404
404
  }> | undefined;
405
- footprintGeometry?: {
406
- type: "Polygon";
407
- coordinates: [number, number][][];
408
- } | {
409
- type: "MultiPolygon";
410
- coordinates: [number, number][][][];
411
- } | undefined;
412
405
  absence?: {
413
406
  kind: "no-footprint-feature";
414
407
  reason: string;
@@ -417,6 +410,13 @@ export declare const BUILDING_FOOTPRINT_SCHEMA: z.ZodEffects<z.ZodObject<{
417
410
  evaluated: true;
418
411
  provenanceScope: string[];
419
412
  } | undefined;
413
+ footprintGeometry?: {
414
+ type: "Polygon";
415
+ coordinates: [number, number][][];
416
+ } | {
417
+ type: "MultiPolygon";
418
+ coordinates: [number, number][][][];
419
+ } | undefined;
420
420
  structureRole?: "unknown" | "primary" | "accessory" | undefined;
421
421
  sourceVintage?: string | undefined;
422
422
  }, {
@@ -477,13 +477,6 @@ export declare const BUILDING_FOOTPRINT_SCHEMA: z.ZodEffects<z.ZodObject<{
477
477
  retrievedAtomSetId: string;
478
478
  }> | undefined;
479
479
  }> | undefined;
480
- footprintGeometry?: {
481
- type: "Polygon";
482
- coordinates: [number, number][][];
483
- } | {
484
- type: "MultiPolygon";
485
- coordinates: [number, number][][][];
486
- } | undefined;
487
480
  absence?: {
488
481
  kind: "no-footprint-feature";
489
482
  reason: string;
@@ -492,6 +485,13 @@ export declare const BUILDING_FOOTPRINT_SCHEMA: z.ZodEffects<z.ZodObject<{
492
485
  evaluated: true;
493
486
  provenanceScope: string[];
494
487
  } | undefined;
488
+ footprintGeometry?: {
489
+ type: "Polygon";
490
+ coordinates: [number, number][][];
491
+ } | {
492
+ type: "MultiPolygon";
493
+ coordinates: [number, number][][][];
494
+ } | undefined;
495
495
  structureRole?: "unknown" | "primary" | "accessory" | undefined;
496
496
  sourceVintage?: string | undefined;
497
497
  }>, {
@@ -552,13 +552,6 @@ export declare const BUILDING_FOOTPRINT_SCHEMA: z.ZodEffects<z.ZodObject<{
552
552
  retrievedAtomSetId: string;
553
553
  }> | undefined;
554
554
  }> | undefined;
555
- footprintGeometry?: {
556
- type: "Polygon";
557
- coordinates: [number, number][][];
558
- } | {
559
- type: "MultiPolygon";
560
- coordinates: [number, number][][][];
561
- } | undefined;
562
555
  absence?: {
563
556
  kind: "no-footprint-feature";
564
557
  reason: string;
@@ -567,6 +560,13 @@ export declare const BUILDING_FOOTPRINT_SCHEMA: z.ZodEffects<z.ZodObject<{
567
560
  evaluated: true;
568
561
  provenanceScope: string[];
569
562
  } | undefined;
563
+ footprintGeometry?: {
564
+ type: "Polygon";
565
+ coordinates: [number, number][][];
566
+ } | {
567
+ type: "MultiPolygon";
568
+ coordinates: [number, number][][][];
569
+ } | undefined;
570
570
  structureRole?: "unknown" | "primary" | "accessory" | undefined;
571
571
  sourceVintage?: string | undefined;
572
572
  }, {
@@ -627,13 +627,6 @@ export declare const BUILDING_FOOTPRINT_SCHEMA: z.ZodEffects<z.ZodObject<{
627
627
  retrievedAtomSetId: string;
628
628
  }> | undefined;
629
629
  }> | undefined;
630
- footprintGeometry?: {
631
- type: "Polygon";
632
- coordinates: [number, number][][];
633
- } | {
634
- type: "MultiPolygon";
635
- coordinates: [number, number][][][];
636
- } | undefined;
637
630
  absence?: {
638
631
  kind: "no-footprint-feature";
639
632
  reason: string;
@@ -642,6 +635,13 @@ export declare const BUILDING_FOOTPRINT_SCHEMA: z.ZodEffects<z.ZodObject<{
642
635
  evaluated: true;
643
636
  provenanceScope: string[];
644
637
  } | undefined;
638
+ footprintGeometry?: {
639
+ type: "Polygon";
640
+ coordinates: [number, number][][];
641
+ } | {
642
+ type: "MultiPolygon";
643
+ coordinates: [number, number][][][];
644
+ } | undefined;
645
645
  structureRole?: "unknown" | "primary" | "accessory" | undefined;
646
646
  sourceVintage?: string | undefined;
647
647
  }>;
@@ -24,6 +24,13 @@ export declare const PARCEL_NODE_ID_PATTERN: RegExp;
24
24
  export declare const ROAD_NODE_ID_PATTERN: RegExp;
25
25
  export declare const PROPERTY_ATOM_TIER: AtomTier;
26
26
  export declare const PROPERTY_DEFAULT_ACCESS_POLICY: AccessPolicy;
27
+ /**
28
+ * The paid property tier. Only `owner-fact` uses it today: owner identity was
29
+ * ruled `public-paid` at the atom level, and its schema pins this value so the
30
+ * policy cannot be dropped by a writer. Every other property atom pins
31
+ * `PROPERTY_DEFAULT_ACCESS_POLICY`.
32
+ */
33
+ export declare const PROPERTY_PAID_ACCESS_POLICY: AccessPolicy;
27
34
  export declare const PROPERTY_ACCESS_POLICY_SCHEMA: z.ZodEnum<["public-free", "public-paid", "platform-internal", "tenant-private", "tenant-shared"]>;
28
35
  /** Quality gate fields required on every property reasoning atom. */
29
36
  export declare const PROPERTY_QUALITY_GATE_FIELDS: {
@@ -57,6 +64,41 @@ export declare const SETBACK_ABSENCE_SCHEMA: z.ZodObject<{
57
64
  reason: string;
58
65
  }>;
59
66
  export type SetbackAbsence = z.infer<typeof SETBACK_ABSENCE_SCHEMA>;
67
+ /**
68
+ * Named decline codes actually written onto `buildable-envelope` atoms.
69
+ *
70
+ * Ground truth is Bastrop store population (2026-08-08 grade audit §8.1)
71
+ * plus the two residual buckets from `bucketVerifyFailReasons` that can be
72
+ * minted even when a cohort snapshot shows zero rows. Do NOT invent codes
73
+ * here — expand only when a live producer lands a new string.
74
+ *
75
+ * Grouping: each live code is its own kind. Compressing would erase
76
+ * agent-routing and cert-grade branches (cascade codes grade differently;
77
+ * edge-label early declines differ from verify-bucket orientation; R32 is
78
+ * a distinct inset path). The free-text `reason` carries path detail; the
79
+ * kind is the durable finding identity.
80
+ */
81
+ export declare const BUILDABLE_ENVELOPE_ABSENCE_KINDS: readonly ["unzoned-no-district-basis", "no-district-on-record", "no-setback-row", "no-road-adjacency", "front-orientation-unresolved", "superseded-prop-id", "front-orientation", "road-classification-mismatch", "r32-per-edge-inset", "null-inset", "faces-answer", "geometry", "setback-edge-distance", "other-verify-fail"];
82
+ export type BuildableEnvelopeAbsenceKind = (typeof BUILDABLE_ENVELOPE_ABSENCE_KINDS)[number];
83
+ export declare const BUILDABLE_ENVELOPE_ABSENCE_SCHEMA: z.ZodObject<{
84
+ kind: z.ZodEnum<["unzoned-no-district-basis", "no-district-on-record", "no-setback-row", "no-road-adjacency", "front-orientation-unresolved", "superseded-prop-id", "front-orientation", "road-classification-mismatch", "r32-per-edge-inset", "null-inset", "faces-answer", "geometry", "setback-edge-distance", "other-verify-fail"]>;
85
+ reason: z.ZodString;
86
+ }, "strict", z.ZodTypeAny, {
87
+ kind: "unzoned-no-district-basis" | "no-district-on-record" | "no-setback-row" | "no-road-adjacency" | "front-orientation-unresolved" | "superseded-prop-id" | "front-orientation" | "road-classification-mismatch" | "r32-per-edge-inset" | "null-inset" | "faces-answer" | "geometry" | "setback-edge-distance" | "other-verify-fail";
88
+ reason: string;
89
+ }, {
90
+ kind: "unzoned-no-district-basis" | "no-district-on-record" | "no-setback-row" | "no-road-adjacency" | "front-orientation-unresolved" | "superseded-prop-id" | "front-orientation" | "road-classification-mismatch" | "r32-per-edge-inset" | "null-inset" | "faces-answer" | "geometry" | "setback-edge-distance" | "other-verify-fail";
91
+ reason: string;
92
+ }>;
93
+ export type BuildableEnvelopeAbsence = z.infer<typeof BUILDABLE_ENVELOPE_ABSENCE_SCHEMA>;
94
+ /** Residual kind when a producer hands an unknown decline string. */
95
+ export declare const BUILDABLE_ENVELOPE_ABSENCE_FALLBACK_KIND: "other-verify-fail";
96
+ /**
97
+ * Map a live engine decline-code string onto a contract absence kind.
98
+ * Unknown codes collapse to {@link BUILDABLE_ENVELOPE_ABSENCE_FALLBACK_KIND}
99
+ * so writers never invent enum members off-band.
100
+ */
101
+ export declare function toBuildableEnvelopeAbsenceKind(declineCode: string): BuildableEnvelopeAbsenceKind;
60
102
  export type SetbackMatchBasis = "exact" | "prefix" | "fallback";
61
103
  export declare const SETBACK_MATCH_BASIS_VALUES: ReadonlyArray<SetbackMatchBasis>;
62
104
  export declare const SETBACK_MATCH_BASIS_SCHEMA: z.ZodEnum<["exact", "prefix", "fallback"]>;
@@ -803,6 +845,27 @@ export declare const LAND_USE_ABSENCE_SCHEMA: z.ZodObject<{
803
845
  reason: string;
804
846
  }>;
805
847
  export type LandUseAbsence = z.infer<typeof LAND_USE_ABSENCE_SCHEMA>;
848
+ /**
849
+ * Owner absence kinds. `owner-withheld` is the one that does NOT exist for the
850
+ * other CAD facets: a CAD may publish a parcel row while suppressing owner
851
+ * identity (confidentiality elections for judges, peace officers, and victims
852
+ * of family violence are statutory in Texas). That is a lawful, expected
853
+ * absence and must be representable as such — never as a missing row and never
854
+ * as an empty owner name.
855
+ */
856
+ export declare const OWNER_FACT_ABSENCE_KINDS: readonly ["no-owner-name", "owner-withheld", "no-cad-row", "join-hold"];
857
+ export type OwnerFactAbsenceKind = (typeof OWNER_FACT_ABSENCE_KINDS)[number];
858
+ export declare const OWNER_FACT_ABSENCE_SCHEMA: z.ZodObject<{
859
+ kind: z.ZodEnum<["no-owner-name", "owner-withheld", "no-cad-row", "join-hold"]>;
860
+ reason: z.ZodString;
861
+ }, "strict", z.ZodTypeAny, {
862
+ kind: "no-cad-row" | "join-hold" | "no-owner-name" | "owner-withheld";
863
+ reason: string;
864
+ }, {
865
+ kind: "no-cad-row" | "join-hold" | "no-owner-name" | "owner-withheld";
866
+ reason: string;
867
+ }>;
868
+ export type OwnerFactAbsence = z.infer<typeof OWNER_FACT_ABSENCE_SCHEMA>;
806
869
  /** CAD numeric export may carry acres as a string; accept either form. */
807
870
  export declare const LAND_ACRES_SCHEMA: z.ZodUnion<[z.ZodString, z.ZodNumber]>;
808
871
  //# sourceMappingURL=common.d.ts.map