@welldot/core 0.2.3 → 0.4.0-next.20261014.26249fd

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.
@@ -1,6 +1,6 @@
1
- # `.well` File Format Specification — Version 2.0: Format Reference
1
+ # `.well` File Format Specification — Version 2.3: Format Reference
2
2
 
3
- **See also:** [overview.md](./overview.md) · [object-schemas.md](./object-schemas.md) · [interoperability.md](./interoperability.md)
3
+ **See also:** [overview.md](./overview.md) · [object-schemas.md](./object-schemas.md) · [interoperability.md](./interoperability.md) · [water-quality.md](./water-quality.md)
4
4
 
5
5
  ---
6
6
 
@@ -16,6 +16,7 @@
16
16
 
17
17
  "name": "...",
18
18
  "well_type": "...",
19
+ "well_purpose": [ ... ],
19
20
  "well_driller": "...",
20
21
  "construction_date": "YYYY-MM-DD",
21
22
  "obs": "...",
@@ -28,6 +29,7 @@
28
29
  "well_screen": [ ... ],
29
30
  "surface_case": [ ... ],
30
31
  "hole_fill": [ ... ],
32
+ "centralizers": [ ... ],
31
33
  "cement_pad": { ... },
32
34
 
33
35
  "lithology": [ ... ],
@@ -36,7 +38,16 @@
36
38
 
37
39
  "hydrodynamic_events": [ ... ],
38
40
  "aquifer_analysis": [ ... ],
39
- "history_logs": [ ... ]
41
+ "history_logs": [ ... ],
42
+
43
+ "attachments": [ ... ],
44
+ "pump_installations": [ ... ],
45
+ "permits": [ ... ],
46
+ "meters": [ ... ],
47
+ "production": [ ... ],
48
+ "operating_regime": [ ... ],
49
+
50
+ "water_samples": [ ... ]
40
51
  }
41
52
  ```
42
53
 
@@ -49,6 +60,10 @@
49
60
  | `1` | Initial release — constructive and geologic data only |
50
61
  | `2` | Adds location, well_id (array), profiles, texture object, hydrodynamic_events, aquifer_analysis, history_logs, optional @context, \*\_precision fields, and extensibility conventions. Tightens unit semantics: all values are canonical SI, no per-file declaration. |
51
62
 
63
+ Minor revisions (`2.1`, `2.3`, …) are additive and do not change the `version` integer: a v2.3 document still declares `"version": 2`. A v2.0 parser reading a v2.1 document sees the v2.1 fields (`well_purpose`, `centralizers`) as unrecognized members without the `x-` prefix. Per § Extensibility it MUST preserve them and MUST NOT reject the file, and it SHOULD emit a warning.
64
+
65
+ The same rule applies to v2.3: a v2.0 or v2.1 parser reading a v2.3 document sees `attachments`, `pump_installations`, `permits`, `meters`, `production`, `operating_regime`, `water_samples`, `hydrodynamic_events[].corrects`, the `history_logs` data links (`hydrodynamic_event_ids`, `sample_ids`) and category-specific fields (`maintenance`, `status_change`) and the nested `attachments` arrays as unrecognized members. It MUST preserve them, MUST NOT reject the file, and SHOULD emit a warning. Such a parser does not know `corrects`, so it may still count a retracted event; this is the expected degradation.
66
+
52
67
  ### Parser version handling
53
68
 
54
69
  The `version` field is an integer and must always be present.
@@ -58,7 +73,7 @@ The `version` field is an integer and must always be present.
58
73
  - Either parser encountering an unrecognized integer version MUST reject the file with a clear error.
59
74
  - A file without a `version` field SHOULD be rejected. Parsers MAY emit a warning and attempt to read the file as v1 if all required v1 fields are present and no v2-specific blocks are detected, but this fallback behavior is implementation-specific and not guaranteed by the spec.
60
75
 
61
- Files with `version: 1` MUST NOT contain any v2-only blocks (`hydrodynamic_events`, `aquifer_analysis`, `history_logs`, `profiles`, `well_id` as array, `location` object, `@context`). A v1 file containing such fields is malformed.
76
+ Files with `version: 1` MUST NOT contain any v2-only blocks (`hydrodynamic_events`, `aquifer_analysis`, `history_logs`, `attachments`, `pump_installations`, `permits`, `meters`, `production`, `operating_regime`, `water_samples`, `profiles`, `well_id` as array, `location` object, `@context`). A v1 file containing such fields is malformed.
62
77
 
63
78
  ---
64
79
 
@@ -119,7 +134,7 @@ Each minor revision of this spec MUST include a "Deprecations" subsection in its
119
134
  | Field | Type | Required | Description |
120
135
  | ------------------- | ------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
121
136
  | `version` | integer | yes | Format version. Must be `2` for this spec. |
122
- | `well_type` | string | yes | Classification of the well. See vocabulary below. |
137
+ | `well_type` | string | yes | Construction method of the well. See vocabulary below. |
123
138
  | `name` | string | no | Well name or local identifier. |
124
139
  | `well_driller` | string | no | Name of the drilling company or individual. |
125
140
  | `construction_date` | string | no | ISO 8601 calendar date of well completion (`YYYY-MM-DD`). Date-only by design — time of day for construction completion is not meaningful at the precision the well registry cares about. Interpreted as the local civil date at the well site. |
@@ -135,13 +150,61 @@ Each minor revision of this spec MUST include a "Deprecations" subsection in its
135
150
  | `location` | `Location` | no | Geographic position and elevation. See § location. |
136
151
  | `profiles` | string[] | no | Array of JSON Schema URLs declaring conformance to profiles. See § profiles. |
137
152
 
153
+ ### v2.1 additions
154
+
155
+ | Field | Type | Required | Description |
156
+ | -------------- | --------------- | -------- | ---------------------------------------------------------------- |
157
+ | `well_purpose` | string[] | no | Intended use(s) of the well. See § well_purpose. |
158
+ | `centralizers` | `Centralizer[]` | no | Casing/screen centralizers. See object-schemas.md § Centralizer. |
159
+
160
+ ### v2.3 additions
161
+
162
+ | Field | Type | Required | Description |
163
+ | -------------------- | -------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------- |
164
+ | `attachments` | `Attachment[]` | no | Documents about the well as a whole, not tied to any record. See object-schemas.md § Attachment. |
165
+ | `pump_installations` | `PumpInstallation[]` | no | Pump installation history (installation block). See object-schemas.md § `pump_installations[]`. |
166
+ | `permits` | `Permit[]` | no | Legal instruments governing abstraction (mutable record block). See object-schemas.md § `permits[]`. |
167
+ | `meters` | `Meter[]` | no | Totalizer (hidrômetro) installation history (installation block). See object-schemas.md § `meters[]`. |
168
+ | `production` | `ProductionEntry[]` | no | Append-only ledger of meter readings and declared volumes (ledger block). See object-schemas.md § `production[]`. |
169
+ | `operating_regime` | `OperatingRegime[]` | no | Declared operating regimes, each in force from `effective_from` (mutable record block). See object-schemas.md § `operating_regime[]`. |
170
+ | `water_samples` | `WaterSample[]` | no | Water samples and their field and laboratory results (ledger block). See water-quality.md. |
171
+
172
+ ### Block kinds _(since v2.3)_
173
+
174
+ Every top-level array is one of three kinds. The kind decides how records are corrected.
175
+
176
+ | Kind | Blocks | Correction | Edit tracking |
177
+ | -------------- | ---------------------------------------------------- | ---------------------------------------------------------------------------------------- | --------------------------------------- |
178
+ | Ledger | `hydrodynamic_events`, `production`, `water_samples` | Append a new entry with `corrects` pointing to the retracted entry. Never edit in place. | None needed; the ledger is the history. |
179
+ | Mutable record | `history_logs`, `permits`, `operating_regime` | Edit in place. | `updated_at` (instant) on the record. |
180
+ | Installation | `pump_installations`, `meters` | Edit in place. | `updated_at` (instant) on the record. |
181
+
182
+ Constructive and geologic arrays describe the well as built and are edited in place. `aquifer_analysis` entries are interpretations: a new interpretation is a new entry, and earlier ones coexist.
183
+
184
+ **Ledger corrections.** A ledger entry referenced by any `corrects` field is excluded from every derivation but stays in the file. Chains are allowed (C corrects B, which corrected A); only the last uncorrected entry counts. A `corrects` cycle is malformed and emits a warning. An `aquifer_analysis` whose `source_event_ids` or `static_level_source_id` points to a retracted event emits a warning naming both ids.
185
+
186
+ **Installation pattern.** Installation blocks describe equipment present in the well for a period, with `installed_at` (required) and `removed_at` (absent means currently installed).
187
+
188
+ - `removed_at` earlier than or equal to `installed_at` is malformed and emits a warning.
189
+ - Each entry is one installation, not one piece of equipment. A unit pulled and reinstalled gets a new entry with the same `serial`.
190
+ - Overlapping open installations in the same block emit a warning, not an error. Standby pumps and secondary meters exist.
191
+
192
+ ### Naming rules _(since v2.3)_
193
+
194
+ - No unit in a field name. Units are bound by the field-to-unit table (§ Units).
195
+ - `flow_rate` is the canonical name for a volumetric rate; nameplate values use the `rated_` prefix (`rated_flow_rate`, `rated_head`, `rated_power`).
196
+ - `from` / `to` are reserved for depth intervals in meters. Time intervals use `period_start` / `period_end`.
197
+ - References to another array end in `_id` (single) or `_ids` (array), plus the two relationship fields `corrects` and `supersedes`.
198
+
199
+ **`supersedes` vs `corrects`.** `supersedes` expresses legal succession between two valid permits and appears only on `permits`. It is not a correction mechanism: `corrects` retracts ledger entries.
200
+
138
201
  ---
139
202
 
140
203
  ## Datetime Conventions
141
204
 
142
205
  The `.well` format distinguishes two kinds of temporal values:
143
206
 
144
- **Calendar dates** — `YYYY-MM-DD`, no time, no offset. Used for `construction_date` only. Interpreted as the local civil date at the well site. The well site's timezone is not stored separately; calendar dates are sortable lexicographically and applications MUST NOT attempt to derive an instant from them.
207
+ **Calendar dates** — `YYYY-MM-DD`, no time, no offset. Used for `construction_date` and, since v2.3, for legal documents: `permits[].issued_at`, `valid_from`, `valid_until`, `renewal_requested_at`; `permits[].conditions[].first_due`, `last_due`; `permits[].conditions[].fulfillments[].due_date`; and `permits[].history[].date`, `due_date`. Interpreted as the local civil date at the well site. The well site's timezone is not stored separately; calendar dates are sortable lexicographically and applications MUST NOT attempt to derive an instant from them.
145
208
 
146
209
  **Instants** — RFC 3339 datetime strings with a mandatory UTC offset (e.g. `2006-03-14T08:00:00-03:00` or `2006-03-14T11:00:00Z`). Used for all event, analysis, and log timestamps:
147
210
 
@@ -149,6 +212,28 @@ The `.well` format distinguishes two kinds of temporal values:
149
212
  - `aquifer_analysis[].datetime`
150
213
  - `history_logs[].datetime`
151
214
  - `history_logs[].updated_at`
215
+ - `pump_installations[].installed_at`, `removed_at`, `updated_at` _(since v2.3)_
216
+ - `permits[].updated_at`, `permits[].history[].updated_at`, `permits[].conditions[].fulfillments[].datetime`, `updated_at` _(since v2.3)_
217
+ - `meters[].installed_at`, `removed_at`, `updated_at` _(since v2.3)_
218
+ - `production[].datetime` (`meter_reading`); `production[].period_start`, `period_end` (`estimated_volume`) _(since v2.3)_
219
+ - `operating_regime[].effective_from`, `updated_at` _(since v2.3)_
220
+ - `water_samples[].datetime`, `laboratory.received_at`, `results[].analyzed_at`, `results[].validation.validated_at` _(since v2.3)_
221
+
222
+ Validity and deadline checks compare calendar dates, never UTC instants. When an instant must be compared with a calendar date — for example a condition fulfillment's `datetime` against its `due_date` — the instant's local date is the date part of the string, in the offset it carries. Producers SHOULD therefore write such instants in the well site's local offset.
223
+
224
+ Relative deadlines and recurrences are ISO 8601 date durations (`P90D`, `P6M`, `P1Y6M`); see object-schemas.md § Date duration.
225
+
226
+ ### Instants known only by date _(since v2.3)_
227
+
228
+ Laboratory reports often give only the date of receipt or analysis. Such an instant is written at 00:00 local time at the well site, and a sibling field named after it with the `_resolution` suffix is set to `"day"`:
229
+
230
+ ```json
231
+ { "analyzed_at": "2026-09-17T00:00:00-03:00", "analyzed_at_resolution": "day" }
232
+ ```
233
+
234
+ - Consumers MUST ignore the time of day when `_resolution` is `day`. Ordering, holding-time and deadline calculations on that field use day resolution.
235
+ - `day` is the only allowed value; any other value is malformed. An absent `_resolution` means the instant is exact.
236
+ - In v2.3 the convention applies to `water_samples[].laboratory.received_at` and `water_samples[].results[].analyzed_at`. It is the candidate general convention for any instant known only by its date.
152
237
 
153
238
  A datetime without an offset (naked `YYYY-MM-DDTHH:MM:SS`) is malformed and parsers MUST reject it. Time zone abbreviations (`EST`, `BRT`) are not RFC 3339 and MUST NOT be used.
154
239
 
@@ -160,20 +245,323 @@ When two events share the same instant, the optional `sequence` integer breaks t
160
245
 
161
246
  ---
162
247
 
248
+ ## Recommended vocabularies
249
+
250
+ Many string fields are **open**: they accept any value, but recommend a vocabulary for interoperability. The sections below list each one. Non-canonical values SHOULD use the `x-` prefix, and tools MUST preserve unrecognized values and display them as-is.
251
+
252
+ Every recommended vocabulary is also published as data by `@welldot/core` (e.g. `PERMIT_TYPES`, `CONSTRUCTION_MATERIALS`, `SAMPLE_TYPES`), each entry carrying its `value` and display labels keyed by BCP 47 language tag (at least `en` and `pt`). The field types use the `OpenVocab<T>` pattern (`T | (string & {})`): the recommended values are typed while any other string stays valid. The Portuguese column in the tables below may be more descriptive than the short display label.
253
+
163
254
  ## `well_type` — Recommended values
164
255
 
165
- The `well_type` field accepts any string. The values below are the recommended vocabulary for interoperability. Tools should treat unrecognized values gracefully.
256
+ The `well_type` field accepts any string and describes the well's **construction method**. The values below are the recommended vocabulary for interoperability. Tools should treat unrecognized values gracefully.
166
257
 
167
258
  | Value | Portuguese (BR) | Description |
168
259
  | ---------------------- | ----------------------- | ---------------------------------------------- |
169
260
  | `tubular` | Tubular | Conventional rotary or percussion drilled well |
170
- | `artesian` | Artesiano | Free-flowing artesian well |
171
261
  | `hand_dug` | Cacimba / poço escavado | Manually excavated well or cistern |
172
262
  | `horizontal` | Horizontal | Horizontal or sub-horizontal well |
173
263
  | `infiltration_gallery` | Galeria de infiltração | Horizontal subsurface infiltration gallery |
264
+ | `artesian` | Artesiano | **Deprecated in v2.1** — see below |
174
265
 
175
266
  Non-canonical values SHOULD use the `x-` prefix (e.g. `x-radial_collector`).
176
267
 
268
+ **`artesian` (deprecated in v2.1, removal in v3).** Artesianism is a hydraulic condition, not a construction method: an artesian well is usually a `tubular` well. A flowing artesian condition is recorded as a `hydrodynamic_events` entry whose `static_level` is negative (see § Level sign convention), and applications derive the label from it. Parsers MUST continue to accept `well_type: "artesian"` and MUST NOT rewrite it. Authoring tools SHOULD offer to migrate it to the actual construction method on edit.
269
+
270
+ ---
271
+
272
+ ## `well_purpose` — Recommended values _(since v2.1)_
273
+
274
+ `well_purpose` is an optional array of strings giving the well's current intended use(s). A well may have more than one purpose (e.g. `["production", "monitoring"]`). Changes of use over time belong in `history_logs` (category `event`). Non-canonical values SHOULD use the `x-` prefix.
275
+
276
+ | Value | Portuguese (BR) | Description |
277
+ | ----------------------- | ------------------------------- | ---------------------------------------------------------------- |
278
+ | `production` | Produção / captação | Water supply abstraction |
279
+ | `monitoring` | Poço de monitoramento | Groundwater level and/or quality monitoring |
280
+ | `piezometer` | Piezômetro | Measures hydraulic head at a discrete depth interval |
281
+ | `water_level_indicator` | INA — indicador de nível d'água | Open standpipe for water table readings (typically geotechnical) |
282
+ | `observation` | Poço de observação | Observation well for aquifer tests on a nearby pumping well |
283
+ | `exploration` | Pesquisa / exploratório | Investigation or test well |
284
+ | `injection` | Injeção / recarga | Managed aquifer recharge or injection |
285
+ | `dewatering` | Rebaixamento | Construction or mining dewatering |
286
+
287
+ ---
288
+
289
+ ## `bore_hole[].drilling_method` — Recommended values _(since v2.3)_
290
+
291
+ | Value | English | Portuguese (BR) |
292
+ | ------------ | ---------- | ------------------ |
293
+ | `rotary` | Rotary | Rotativo |
294
+ | `percussion` | Percussion | Percussão |
295
+ | `cable_tool` | Cable tool | Percussão a cabo |
296
+ | `auger` | Auger | Trado |
297
+ | `air_hammer` | Air hammer | Martelo pneumático |
298
+
299
+ Non-canonical values SHOULD use the `x-` prefix.
300
+
301
+ ## Construction materials — Recommended values _(since v2.3)_
302
+
303
+ Shared by `well_case[].type`, `well_screen[].type`, `reduction[].type` and `pump_installations[].riser_material`.
304
+
305
+ | Value | English | Portuguese (BR) |
306
+ | ------------------- | ----------------- | --------------- |
307
+ | `pvc` | PVC | PVC |
308
+ | `geomechanical_pvc` | Geomechanical PVC | PVC geomecânico |
309
+ | `carbon_steel` | Carbon steel | Aço carbono |
310
+ | `galvanized_steel` | Galvanized steel | Aço galvanizado |
311
+ | `stainless_steel` | Stainless steel | Aço inox |
312
+ | `fiberglass` | Fiberglass | Fibra de vidro |
313
+
314
+ Non-canonical values SHOULD use the `x-` prefix.
315
+
316
+ ## `well_screen[].slot_type` — Recommended values _(since v2.3)_
317
+
318
+ The screen design, independent of its material (`well_screen[].type`).
319
+
320
+ | Value | English | Portuguese (BR) |
321
+ | ----------------- | --------------- | ------------------------- |
322
+ | `continuous_slot` | Continuous slot | Espiralado (tipo Johnson) |
323
+ | `slotted` | Slotted | Ranhurado |
324
+ | `bridge_slot` | Bridge slot | Tipo ponte |
325
+ | `louver` | Louver | Veneziana |
326
+ | `perforated` | Perforated | Perfurado |
327
+ | `nold` | Nold type | Tipo Nold |
328
+
329
+ `continuous_slot` is the wire-wrapped (wire-wound) screen. `nold` is the steel screen sold under that trade designation (_filtro tipo Nold_). Non-canonical values SHOULD use the `x-` prefix.
330
+
331
+ ## `centralizers[].type` — Recommended values _(since v2.1)_
332
+
333
+ | Value | English | Portuguese (BR) |
334
+ | ------------------ | ---------------- | ----------------- |
335
+ | `spring_bow` | Spring bow | Mola (spring bow) |
336
+ | `rigid` | Rigid | Rígido |
337
+ | `semi_rigid` | Semi-rigid | Semirrígido |
338
+ | `polymer` | Polymer | Polimérico |
339
+ | `carbon_steel` | Carbon steel | Aço carbono |
340
+ | `galvanized_steel` | Galvanized steel | Aço galvanizado |
341
+ | `stainless_steel` | Stainless steel | Aço inox |
342
+
343
+ The steel values name rigid centralizers by their material. Non-canonical values SHOULD use the `x-` prefix.
344
+
345
+ ## `cement_pad.type` — Recommended values _(since v2.3)_
346
+
347
+ | Value | English | Portuguese (BR) |
348
+ | --------------------- | ------------------- | --------------- |
349
+ | `concrete` | Concrete | Concreto |
350
+ | `reinforced_concrete` | Reinforced concrete | Concreto armado |
351
+ | `cement` | Cement | Cimento |
352
+ | `mortar` | Mortar | Argamassa |
353
+
354
+ `type` describes the pad material; other free text (e.g. a shape) remains valid.
355
+
356
+ ---
357
+
358
+ ## `pump_installations[].type` — Recommended values _(since v2.3)_
359
+
360
+ | Value | Portuguese (BR) | Description |
361
+ | -------------------- | ---------------------- | ------------------------------------------------- |
362
+ | `submersible` | Bomba submersa | Electric submersible pump. |
363
+ | `vertical_turbine` | Bomba de eixo vertical | Surface motor with line shaft. |
364
+ | `jet` | Bomba injetora | Surface jet pump. |
365
+ | `progressive_cavity` | Bomba helicoidal | Progressive cavity pump, common with solar power. |
366
+ | `hand_pump` | Bomba manual | |
367
+ | `compressor_airlift` | Compressor (air-lift) | Permanent airlift production. |
368
+
369
+ Solar is a `power_source`, never a `type`. Non-canonical values SHOULD use the `x-` prefix.
370
+
371
+ ## `pump_installations[].power_source` — Recommended values _(since v2.3)_
372
+
373
+ | Value | Portuguese (BR) |
374
+ | -------- | -------------------- |
375
+ | `grid` | Rede elétrica |
376
+ | `solar` | Solar (fotovoltaico) |
377
+ | `diesel` | Gerador a diesel |
378
+ | `hybrid` | Híbrido |
379
+
380
+ ## `permits[].type` — Recommended values _(since v2.3)_
381
+
382
+ | Value | Portuguese (BR) | Description |
383
+ | -------------------- | -------------------------------------- | ----------------------------------- |
384
+ | `abstraction_permit` | Outorga de direito de uso | Grant to abstract groundwater. |
385
+ | `preliminary_permit` | Outorga prévia / declaração de reserva | Permission before drilling. |
386
+ | `exemption` | Dispensa / uso insignificante | Formal exemption for small users. |
387
+ | `registration` | Cadastro (e.g. CNARH) | Registration without a grant. |
388
+ | `dewatering_permit` | Outorga para rebaixamento | Mining and construction dewatering. |
389
+ | `drilling_permit` | Autorização de perfuração | Authorization to drill the well. |
390
+
391
+ `renewal` is not a type: a renewal is a new permit of the same type whose `supersedes` points to the previous one. Non-canonical values SHOULD use the `x-` prefix.
392
+
393
+ ## `permits[].water_use` — Recommended values _(since v2.3)_
394
+
395
+ | Value | Portuguese (BR) |
396
+ | -------------- | -------------------------------------- |
397
+ | `human_supply` | Abastecimento público / consumo humano |
398
+ | `industrial` | Industrial |
399
+ | `mining` | Mineração |
400
+ | `irrigation` | Irrigação |
401
+ | `livestock` | Dessedentação animal |
402
+ | `commercial` | Comercial / serviços |
403
+
404
+ `water_use` describes what the abstracted water is for; `well_purpose` describes the well's role.
405
+
406
+ ## `permits[].conditions[].category` — Recommended values _(since v2.3)_
407
+
408
+ | Value | Portuguese (BR) | Covers |
409
+ | ------------------------ | -------------------------- | -------------------------------------------------------------------------- |
410
+ | `monitoring` | Monitoramento | Water level, flow, abstracted volume and water quality monitoring/sampling |
411
+ | `reporting` | Relatórios e declarações | Periodic reports and volume/flow declarations submitted to the authority |
412
+ | `equipment_installation` | Instalação de equipamentos | Meters (hidrômetro), level gauges, sampling taps, telemetry |
413
+ | `well_protection` | Proteção do poço | Sanitary slab, seal, protection perimeter, wellhead closure |
414
+ | `environmental` | Ambiental | Environmental measures, compensation, licensing of the activity |
415
+ | `legal` | Legal / administrativo | Renewal request, fees, registrations, document submissions |
416
+
417
+ Non-canonical values SHOULD use the `x-` prefix.
418
+
419
+ ## `permits[].history[].type` — Recommended values _(since v2.3)_
420
+
421
+ | Value | Portuguese (BR) |
422
+ | -------------- | -------------------------------- |
423
+ | `filing` | Protocolo / requerimento |
424
+ | `process` | Andamento do processo / despacho |
425
+ | `notification` | Notificação / ofício |
426
+ | `fee` | Taxa / emolumento |
427
+ | `inspection` | Vistoria |
428
+ | `decision` | Decisão / publicação |
429
+ | `renewal` | Renovação |
430
+
431
+ Non-canonical values SHOULD use the `x-` prefix. The administrative `status` of a permit is a closed vocabulary; see object-schemas.md § `permits[]` — Administrative status.
432
+
433
+ ## `meters[].type` — Recommended values _(since v2.3)_
434
+
435
+ | Value | Portuguese (BR) |
436
+ | ----------------- | ----------------------- |
437
+ | `mechanical` | Hidrômetro mecânico |
438
+ | `electromagnetic` | Medidor eletromagnético |
439
+ | `ultrasonic` | Medidor ultrassônico |
440
+
441
+ Non-canonical values SHOULD use the `x-` prefix.
442
+
443
+ ## `production[]` — Recommended values _(since v2.3)_
444
+
445
+ **`type`** — the entry discriminator: `meter_reading` (a totalizer register value) or `estimated_volume` (a volume estimated for a period, without a meter). Non-canonical entry types SHOULD use the `x-` prefix; parsers preserve them and exclude them from volume derivations.
446
+
447
+ **`source`** (`meter_reading`):
448
+
449
+ | Value | Portuguese (BR) |
450
+ | ----------- | --------------- |
451
+ | `manual` | Leitura manual |
452
+ | `telemetry` | Telemetria |
453
+
454
+ **`method`** (`estimated_volume`) — the basis of the estimate. Descriptive only: it never changes how the volume is counted.
455
+
456
+ | Value | Portuguese (BR) | Description |
457
+ | ---------------- | ------------------------- | ------------------------------------------------------------------ |
458
+ | `flow_time` | Vazão × tempo de operação | Flow rate times operating time (hour meter, operating regime). |
459
+ | `energy` | Consumo de energia | Derived from the pump's energy consumption. |
460
+ | `user_statement` | Informado pelo usuário | Stated by the owner or operator, without a documented calculation. |
461
+
462
+ ## `water_samples[]` — Recommended values _(since v2.3)_
463
+
464
+ Recommended values for `sample_type`, `sampling_method`, `sampling_point.type` and `sampling_point.device` are listed in [water-quality.md](water-quality.md) § Recommended values.
465
+
466
+ ## `hydrodynamic_events[].measurement_method` — Recommended values
467
+
468
+ Used by `spot_measurement` events.
469
+
470
+ | Value | English | Portuguese (BR) |
471
+ | --------------------- | ------------------- | --------------------- |
472
+ | `electric_probe` | Electric probe | Sonda elétrica |
473
+ | `pressure_transducer` | Pressure transducer | Transdutor de pressão |
474
+ | `air_line` | Air line | Linha de ar |
475
+ | `tape` | Tape | Trena |
476
+
477
+ Non-canonical values SHOULD use the `x-` prefix.
478
+
479
+ ## `aquifer_analysis[].method` — Recommended values
480
+
481
+ | Value | English | Portuguese (BR) |
482
+ | ------------------- | ----------------- | --------------- |
483
+ | `cooper_jacob` | Cooper-Jacob | Cooper-Jacob |
484
+ | `theis` | Theis | Theis |
485
+ | `neuman` | Neuman | Neuman |
486
+ | `hantush` | Hantush | Hantush |
487
+ | `birsoy_summers` | Birsoy-Summers | Birsoy-Summers |
488
+ | `eden_hazel` | Eden-Hazel | Eden-Hazel |
489
+ | `visual_inspection` | Visual inspection | Inspeção visual |
490
+
491
+ Non-canonical values SHOULD use the `x-` prefix.
492
+
493
+ ## `history_logs[].category` — Recommended values
494
+
495
+ | Value | Portuguese (BR) | Category-specific fields |
496
+ | --------------- | ------------------- | --------------------------------------------------------------------- |
497
+ | `maintenance` | Manutenção | `maintenance_type`, `pump_installation_id`, `meter_id` _(since v2.3)_ |
498
+ | `inspection` | Inspeção | — |
499
+ | `incident` | Incidente | — |
500
+ | `event` | Evento | — |
501
+ | `status_change` | Mudança de situação | `status` _(since v2.3)_ |
502
+
503
+ Descriptions are in object-schemas.md § `history_logs[]`. Category-specific fields MUST be absent on entries of other categories; their presence emits a warning. Non-canonical values SHOULD use the `x-` prefix.
504
+
505
+ ## `history_logs[].severity` — Recommended values
506
+
507
+ | Value | English | Portuguese (BR) |
508
+ | ---------- | -------- | --------------- |
509
+ | `low` | Low | Baixa |
510
+ | `medium` | Medium | Média |
511
+ | `high` | High | Alta |
512
+ | `critical` | Critical | Crítica |
513
+
514
+ Non-canonical values SHOULD use the `x-` prefix.
515
+
516
+ ## `history_logs[].maintenance_type` — Recommended values _(since v2.3)_
517
+
518
+ | Value | Portuguese (BR) |
519
+ | ------------------- | --------------------------- |
520
+ | `inspection` | Inspeção |
521
+ | `cleaning` | Limpeza |
522
+ | `redevelopment` | Redesenvolvimento |
523
+ | `disinfection` | Desinfecção |
524
+ | `pump_service` | Manutenção da bomba |
525
+ | `meter_calibration` | Aferição do hidrômetro |
526
+ | `video_inspection` | Filmagem / perfilagem ótica |
527
+ | `level_measurement` | Medição de nível |
528
+ | `pump_test` | Teste de bombeamento |
529
+ | `water_sampling` | Coleta de água |
530
+
531
+ Non-canonical values SHOULD use the `x-` prefix.
532
+
533
+ ## `history_logs[].status` — Allowed values _(since v2.3)_
534
+
535
+ Used by entries of category `status_change`. This is a **closed vocabulary**: `status` MUST be one of the five values below. Any other value, including an `x-` value, is a schema error and the file is rejected.
536
+
537
+ | Value | Portuguese (BR) | Semantics |
538
+ | ---------------- | ---------------------- | --------------------------------------- |
539
+ | `active` | Ativo / em operação | Normal operation. |
540
+ | `maintenance` | Em manutenção | Temporarily out of service for work. |
541
+ | `inactive` | Paralisado | Out of service, recoverable. |
542
+ | `decommissioned` | Desativado / tamponado | Permanently closed and properly sealed. |
543
+ | `abandoned` | Abandonado | Left without proper sealing. |
544
+
545
+ The well's current status is the `status` of the `status_change` entry with the latest `datetime`; with no such entry, the status is unknown.
546
+
547
+ ## `Attachment.document_type` — Recommended values _(since v2.3)_
548
+
549
+ | Value | Portuguese (BR) | Typical location |
550
+ | -------------------- | ------------------------------------------- | --------------------- |
551
+ | `drilling_report` | Relatório de perfuração / relatório técnico | Root |
552
+ | `as_built_drawing` | Perfil construtivo as-built | Root |
553
+ | `registry_record` | Ficha cadastral (SIAGAS, CNARH) | Root |
554
+ | `photo` | Fotografia | Any |
555
+ | `permit_document` | Portaria / certificado de outorga | `permits` |
556
+ | `condition_evidence` | Comprovante de cumprimento de condicionante | `history_logs` |
557
+ | `pump_curve` | Curva da bomba | `pump_installations` |
558
+ | `field_sheet` | Planilha de campo | `hydrodynamic_events` |
559
+ | `test_report` | Relatório de teste de bombeamento | `aquifer_analysis` |
560
+ | `lab_report` | Laudo laboratorial | `water_samples` |
561
+ | `invoice` | Nota fiscal | Any |
562
+
563
+ The vocabulary is open; non-canonical values SHOULD use the `x-` prefix.
564
+
177
565
  ---
178
566
 
179
567
  ## `well_id`
@@ -271,19 +659,33 @@ All numeric values in a `.well` file are in **SI**. The format does not encode u
271
659
 
272
660
  ### Canonical units
273
661
 
274
- | Quantity | Unit | UCUM | Stored as |
275
- | ------------------------ | ------------------------ | ------ | ---------------------------------------- |
276
- | Depth, length, elevation | meter | `m` | number |
277
- | Diameter | millimeter | `mm` | number |
278
- | Volumetric flow rate | cubic meter per hour | `m3/h` | number |
279
- | Elapsed time, duration | minute | `min` | number |
280
- | Transmissivity | square meter per second | `m2/s` | number |
281
- | Hydraulic conductivity | meter per second | `m/s` | number |
282
- | Pressure | kilopascal | `kPa` | number |
283
- | Angle (azimuth, dip) | degree | `deg` | number (0–360 for azimuth, 0–90 for dip) |
284
- | Geographic coordinates | decimal degree (WGS84) | `deg` | number |
285
- | Calendar date | ISO 8601 | — | string `YYYY-MM-DD` |
286
- | Instant | RFC 3339 with UTC offset | — | string |
662
+ | Quantity | Unit | UCUM | Stored as |
663
+ | ------------------------ | -------------------------------------------------- | ---------------------------------------------- | ---------------------------------------- |
664
+ | Depth, length, elevation | meter | `m` | number |
665
+ | Diameter | millimeter | `mm` | number |
666
+ | Volumetric flow rate | cubic meter per hour | `m3/h` | number |
667
+ | Elapsed time, duration | minute | `min` | number |
668
+ | Daily operating time | hour | `h` | number (0–24) |
669
+ | Volume | cubic meter | `m3` | number |
670
+ | Power | kilowatt | `kW` | number |
671
+ | Voltage | volt | `V` | number |
672
+ | Cross-sectional area | square millimeter | `mm2` | number |
673
+ | Mass concentration | milligram per liter | `mg/L` | number _(since v2.3)_ |
674
+ | Electrical conductivity | microsiemens per centimeter at 25 °C | `uS/cm` | number _(since v2.3)_ |
675
+ | Temperature | degree Celsius | `Cel` | number _(since v2.3)_ |
676
+ | Redox potential | millivolt | `mV` | number _(since v2.3)_ |
677
+ | Turbidity | NTU, FNU, FAU, FTU (by parameter code) | — | number _(since v2.3)_ |
678
+ | Color | Hazen unit (uH = mg Pt-Co/L) | — | number _(since v2.3)_ |
679
+ | Microbiological count | MPN/100 mL, CFU/100 mL, CFU/mL (by parameter code) | `{MPN}/(100.mL)`, `{CFU}/(100.mL)`, `{CFU}/mL` | number _(since v2.3)_ |
680
+ | Activity concentration | becquerel per liter | `Bq/L` | number _(since v2.3)_ |
681
+ | Filter pore size | micrometer | `um` | number _(since v2.3)_ |
682
+ | Transmissivity | square meter per second | `m2/s` | number |
683
+ | Hydraulic conductivity | meter per second | `m/s` | number |
684
+ | Pressure | kilopascal | `kPa` | number |
685
+ | Angle (azimuth, dip) | degree | `deg` | number (0–360 for azimuth, 0–90 for dip) |
686
+ | Geographic coordinates | decimal degree (WGS84) | `deg` | number |
687
+ | Calendar date | ISO 8601 | — | string `YYYY-MM-DD` |
688
+ | Instant | RFC 3339 with UTC offset | — | string |
287
689
 
288
690
  UCUM is the **Unified Code for Units of Measure**, the international machine-parseable unit standard used by OGC SWE and the scientific community. The UCUM column above documents the canonical encoding of each unit for use in JSON-LD contexts, profile schemas, and downstream interoperability — it is not encoded in `.well` files themselves.
289
691
 
@@ -298,6 +700,7 @@ UCUM is the **Unified Code for Units of Measure**, the international machine-par
298
700
  - `well_screen[].from`, `well_screen[].to`
299
701
  - `surface_case[].from`, `surface_case[].to`
300
702
  - `hole_fill[].from`, `hole_fill[].to`
703
+ - `centralizers[].from`, `centralizers[].to`, `centralizers[].spacing`
301
704
  - `cement_pad.width`, `cement_pad.length`, `cement_pad.thickness`
302
705
  - `lithology[].from`, `lithology[].to`
303
706
  - `fractures[].depth`, `fractures[].depth_precision`
@@ -309,6 +712,8 @@ UCUM is the **Unified Code for Units of Measure**, the international machine-par
309
712
  - `aquifer_analysis[].dynamic_level`, `dynamic_level_precision`
310
713
  - `aquifer_analysis[].aquifer_thickness`
311
714
  - `location.elevation`, `location.properties.elevation_precision`
715
+ - `pump_installations[].intake_depth`, `rated_head`, `electrical.cable_length` _(since v2.3)_
716
+ - `water_samples[].sampling_point.depth`, `depth_precision`, `from`, `to` _(since v2.3)_
312
717
 
313
718
  **Millimeter (`mm`)** — all diameters and slot openings:
314
719
 
@@ -318,18 +723,40 @@ UCUM is the **Unified Code for Units of Measure**, the international machine-par
318
723
  - `well_screen[].diameter`, `well_screen[].screen_slot`
319
724
  - `surface_case[].diameter`
320
725
  - `hole_fill[].diameter`
726
+ - `centralizers[].diameter`
727
+ - `pump_installations[].riser_diameter` _(since v2.3)_
728
+ - `meters[].nominal_diameter` _(since v2.3)_
321
729
 
322
730
  **Cubic meter per hour (`m3/h`)** — all volumetric flow rates:
323
731
 
324
732
  - `PumpingStep.rate`, `rate_precision`
325
733
  - `aquifer_analysis[].flow_rate`, `flow_rate_precision`
326
734
  - `recovery_only.pumping_rate`
735
+ - `pump_installations[].rated_flow_rate` _(since v2.3)_
736
+ - `permits[].flow_rate`, `permits[].monthly_schedule[].flow_rate` _(since v2.3)_
737
+ - `operating_regime[].flow_rate` _(since v2.3)_
738
+ - `water_samples[].purge.flow_rate` _(since v2.3)_
327
739
 
328
740
  **Minute (`min`)** — all elapsed times and durations:
329
741
 
330
742
  - `PumpingStep.duration`
331
743
  - `LevelReading.elapsed`
332
744
  - `recovery_only.pumping_duration`
745
+ - `water_samples[].purge.duration`, `purge.readings[].elapsed` _(since v2.3)_
746
+
747
+ **Cubic meter (`m3`)** — volume _(since v2.3)_:
748
+
749
+ - `permits[].volume_limits[].volume`
750
+ - `meters[].max_reading`
751
+ - `production[].reading` (`meter_reading`), `production[].volume` (`estimated_volume`)
752
+ - `water_samples[].purge.volume`
753
+
754
+ **Hour (`h`)** — daily operating time _(since v2.3)_:
755
+
756
+ - `permits[].daily_operating_time`, `permits[].monthly_schedule[].daily_operating_time`
757
+ - `operating_regime[].daily_operating_time`
758
+
759
+ The minute remains the canonical unit for elapsed time and durations. The hour is bound only to `daily_operating_time`, which regulators always express in hours.
333
760
 
334
761
  **Square meter per second (`m2/s`)** — transmissivity:
335
762
 
@@ -343,6 +770,28 @@ UCUM is the **Unified Code for Units of Measure**, the international machine-par
343
770
 
344
771
  - `LevelReading.pressure`
345
772
 
773
+ **Kilowatt (`kW`)** — power _(since v2.3)_:
774
+
775
+ - `pump_installations[].rated_power`
776
+
777
+ **Volt (`V`)** — voltage _(since v2.3)_:
778
+
779
+ - `pump_installations[].electrical.voltage`
780
+
781
+ **Square millimeter (`mm2`)** — cross-sectional area _(since v2.3)_:
782
+
783
+ - `pump_installations[].electrical.cable_section`
784
+
785
+ **Degree Celsius (`Cel`)** — temperature _(since v2.3)_:
786
+
787
+ - `water_samples[].laboratory.received_temperature`
788
+
789
+ **Micrometer (`um`)** — filter pore size _(since v2.3)_:
790
+
791
+ - `water_samples[].results[].filtration.pore_size`
792
+
793
+ **Unit by parameter code** _(since v2.3)_ — `water_samples[].results[].value`, `detection_limit`, `quantification_limit`, `value_precision` and `purge.readings[].value` are in the canonical unit of the result's parameter (see water-quality.md § Units).
794
+
346
795
  **Degree (`deg`)** — angles and geographic coordinates:
347
796
 
348
797
  - `fractures[].azimuth`, `fractures[].dip`
@@ -355,6 +804,17 @@ UCUM is the **Unified Code for Units of Measure**, the international machine-par
355
804
  - `aquifer_analysis[].well_efficiency_pct` (percentage, 0–100)
356
805
  - `aquifer_analysis[].specific_capacity` (derived ratio in m³/h per m, i.e. `m2/h`)
357
806
  - Lithology `color` (CSS hex string)
807
+ - `pump_installations[].stages`, `electrical.phases` (counts)
808
+ - `permits[].monthly_schedule[].month`, `days`; `permits[].conditions[].occurrences` (counts)
809
+ - `operating_regime[].days_per_week` (count, 1–7)
810
+
811
+ ### Water quality units _(since v2.3)_
812
+
813
+ Water quality results take their unit from the parameter code; only `x-` vocabulary codes declare `unit` (UCUM). The unit-by-code rule and regional unit normalization are specified in [water-quality.md](water-quality.md) § Units.
814
+
815
+ ### Level sign convention
816
+
817
+ Depths are measured from ground level (0) and increase downward. Water levels above ground level are therefore **negative**. This applies to `static_level`, `LevelReading.depth`, and `aquifer_analysis[].static_level` / `dynamic_level`. A negative static level is how a flowing artesian condition is recorded (see § `well_type`). This convention was implicit in v2.0 and is made explicit in v2.1 without changing semantics. It does not apply to `pump_installations[].intake_depth`, which is an equipment depth and is always positive.
358
818
 
359
819
  ### Diameter and the as-built convention
360
820
 
@@ -370,7 +830,13 @@ An interchange format with configurable units multiplies the number of valid enc
370
830
 
371
831
  Producers receiving non-SI source data (imperial drilling reports, US gpm flow measurements, inch casing designations, slot-number screens) MUST convert to SI before writing. Consumers presenting the data to users in non-SI units MUST convert on read.
372
832
 
373
- Conversion utilities for the common transformations are provided in `@welldot/core` under the `units` module — m ↔ ft, mm ↔ in, m³/h ↔ L/s, m³/h ↔ US gpm, m²/s ↔ m²/d, DD ↔ DMS, slot-number ↔ mm, and similar.
833
+ Conversion utilities for the common transformations are provided in `@welldot/core` under the `units` module — m ↔ ft, mm ↔ in, m³/h ↔ L/s, m³/h ↔ US gpm, m²/s ↔ m²/d, DD ↔ DMS, slot-number ↔ mm, cv/hp ↔ kW, L / ft³ / US gal ↔ m³, µg/L ↔ mg/L, mS/m ↔ µS/cm, and similar.
834
+
835
+ ---
836
+
837
+ ## Water quality parameter vocabulary _(since v2.3)_
838
+
839
+ The `welldot` parameter vocabulary (98 codes), its rules, the CAS equivalences and the treatment of limit sets are specified in [water-quality.md](water-quality.md) § Parameter vocabulary.
374
840
 
375
841
  ---
376
842
 
@@ -392,6 +858,10 @@ An optional array of HTTPS URLs declaring formal extensions to the spec that the
392
858
  - The schema MAY link to human documentation via its `description` field or a custom `x-documentation` field pointing to a Markdown or PDF URL.
393
859
  - Profiles MAY impose additional required fields, constrain vocabulary values, or mandate the use of specific `x-` extensions for a regulatory context.
394
860
 
861
+ ### Example: a regulatory water quality profile _(since v2.3)_
862
+
863
+ See [water-quality.md](water-quality.md) § Regulatory profiles.
864
+
395
865
  ### Profile validation
396
866
 
397
867
  - If a profile URL is unreachable, returns a non-JSON document, or fails to parse as JSON Schema, the profile is silently ignored. Parsers MUST NOT reject files whose profile URLs are unavailable.
@@ -427,20 +897,20 @@ Top-level blocks not defined in this spec MUST use the `x-` prefix. Parsers MUST
427
897
  ```json
428
898
  {
429
899
  "version": 2,
430
- "x-water_quality": [ ... ],
900
+ "x-gas_monitoring": [ ... ],
431
901
  "x-geophysical_logs": [ ... ]
432
902
  }
433
903
  ```
434
904
 
435
905
  ### Custom vocabulary values — `x-` prefix
436
906
 
437
- Open vocabulary fields in this spec (`type` in `hydrodynamic_events`, `category` in `history_logs`, `vocabulary` in `texture`, `method` in `aquifer_analysis`, `well_type`, and any other field documented as accepting any string) SHOULD use the `x-` prefix when the value is non-canonical — i.e. not listed in the recommended vocabulary of this spec.
907
+ Open vocabulary fields in this spec (`type` in `hydrodynamic_events`, `category` in `history_logs`, `vocabulary` in `texture` and in water quality `parameter` (as `x-…` vocabularies), `method` in `aquifer_analysis`, `well_type`, and any other field documented as accepting any string; not closed vocabularies such as `history_logs[].status`) SHOULD use the `x-` prefix when the value is non-canonical — i.e. not listed in the recommended vocabulary of this spec.
438
908
 
439
909
  Parsers MUST treat `x-` prefixed vocabulary values as valid. Promotion from `x-` form to canonical form follows the Deprecation Policy (see § Deprecation Policy — Vocabulary value promotion).
440
910
 
441
911
  ```json
442
912
  { "type": "x-slug_test" }
443
- { "category": "x-decommission" }
913
+ { "category": "x-site_visit" }
444
914
  { "method": "x-theis_recovery" }
445
915
  ```
446
916
 
@@ -457,7 +927,17 @@ Each ID-bearing array maintains its **own uniqueness scope**. The ID namespaces
457
927
  - `hydrodynamic_events[].id` — unique within `hydrodynamic_events`
458
928
  - `aquifer_analysis[].id` — unique within `aquifer_analysis`
459
929
  - `history_logs[].id` — unique within `history_logs`
460
- - `history_logs[].attachments[].id` — unique within the attachments array of the same log entry
930
+ - `pump_installations[].id` — unique within `pump_installations` _(since v2.3)_
931
+ - `permits[].id` — unique within `permits` _(since v2.3)_
932
+ - `permits[].conditions[].id` — unique within the `conditions` array of one permit _(since v2.3)_
933
+ - `permits[].conditions[].fulfillments[].id` — unique within the `fulfillments` array of one condition _(since v2.3)_
934
+ - `permits[].history[].id` — unique within the `history` array of one permit _(since v2.3)_
935
+ - `permits[].monthly_schedule[].month` and `permits[].volume_limits[].period` — unique within one permit _(since v2.3)_
936
+ - `meters[].id` — unique within `meters` _(since v2.3)_
937
+ - `production[].id` — unique within `production` _(since v2.3)_
938
+ - `operating_regime[].id` — unique within `operating_regime`; `operating_regime[].effective_from` is also unique within the block _(since v2.3)_
939
+ - `water_samples[].id` — unique within `water_samples` _(since v2.3)_
940
+ - `attachments[].id` — unique within its owning array: the root `attachments`, or the `attachments` array of one record (`history_logs`, `permits`, `pump_installations`, `hydrodynamic_events`, `aquifer_analysis`, `water_samples`). The same id may appear under different records.
461
941
  - `well_id[]` — uniqueness is on the composite key `(authority, id)`, not on `id` alone
462
942
 
463
943
  An ID value MAY repeat across different arrays without conflict (e.g. an event and an analysis MAY both use the ID `"001"`), though distinct values are recommended for clarity.
@@ -466,10 +946,26 @@ An ID value MAY repeat across different arrays without conflict (e.g. an event a
466
946
 
467
947
  The following fields hold references to IDs in other arrays:
468
948
 
469
- | Reference field | Points to | Resolution scope |
470
- | ------------------------------------------- | -------------------------- | ---------------- |
471
- | `aquifer_analysis[].source_event_ids[]` | `hydrodynamic_events[].id` | Same file only |
472
- | `aquifer_analysis[].static_level_source_id` | `hydrodynamic_events[].id` | Same file only |
949
+ | Reference field | Points to | Resolution scope |
950
+ | ----------------------------------------------------- | -------------------------- | ---------------- |
951
+ | `aquifer_analysis[].source_event_ids[]` | `hydrodynamic_events[].id` | Same file only |
952
+ | `aquifer_analysis[].static_level_source_id` | `hydrodynamic_events[].id` | Same file only |
953
+ | `hydrodynamic_events[].corrects` | `hydrodynamic_events[].id` | Same file only |
954
+ | `production[].corrects` | `production[].id` | Same file only |
955
+ | `production[].meter_id` | `meters[].id` | Same file only |
956
+ | `permits[].supersedes` | `permits[].id` | Same file only |
957
+ | `history_logs[].pump_installation_id` | `pump_installations[].id` | Same file only |
958
+ | `history_logs[].meter_id` | `meters[].id` | Same file only |
959
+ | `history_logs[].hydrodynamic_event_ids[]` | `hydrodynamic_events[].id` | Same file only |
960
+ | `history_logs[].sample_ids[]` | `water_samples[].id` | Same file only |
961
+ | `permits[].conditions[].fulfillments[].event_id` | `hydrodynamic_events[].id` | Same file only |
962
+ | `permits[].conditions[].fulfillments[].sample_id` | `water_samples[].id` | Same file only |
963
+ | `water_samples[].corrects` | `water_samples[].id` | Same file only |
964
+ | `water_samples[].parent_sample_id` | `water_samples[].id` | Same file only |
965
+ | `water_samples[].static_level_event_id` | `hydrodynamic_events[].id` | Same file only |
966
+ | `water_samples[].sampling_point.pump_installation_id` | `pump_installations[].id` | Same file only |
967
+
968
+ Root `attachments` is not a registry: records never reference root attachments by id. Nor is it an aggregate: it holds only general files about the well as a whole (e.g. the drilling report), never copies of the attachments of `history_logs`, `permits`, `pump_installations`, `hydrodynamic_events`, `aquifer_analysis` or `water_samples` entries. A document that concerns several records is repeated on each; `sha256` guarantees both copies point to the same file.
473
969
 
474
970
  Cross-file references are not supported in v2.
475
971
 
@@ -512,23 +1008,27 @@ The precision field name is the measurement field name suffixed with `_precision
512
1008
 
513
1009
  ### Supported precision fields
514
1010
 
515
- | Measurement | Precision field | Defined on |
516
- | --------------- | ------------------------- | -------------------------- |
517
- | `lat` | `lat_precision` | `LocationProperties` |
518
- | `lng` | `lng_precision` | `LocationProperties` |
519
- | `elevation` | `elevation_precision` | `LocationProperties` |
520
- | `static_level` | `static_level_precision` | events, `AquiferAnalysis` |
521
- | `dynamic_level` | `dynamic_level_precision` | `AquiferAnalysis` |
522
- | `depth` | `depth_precision` | `LevelReading`, `Fracture` |
523
- | `rate` | `rate_precision` | `PumpingStep` |
524
- | `flow_rate` | `flow_rate_precision` | `AquiferAnalysis` |
1011
+ | Measurement | Precision field | Defined on |
1012
+ | --------------- | ------------------------- | ------------------------------------- |
1013
+ | `lat` | `lat_precision` | `LocationProperties` |
1014
+ | `lng` | `lng_precision` | `LocationProperties` |
1015
+ | `elevation` | `elevation_precision` | `LocationProperties` |
1016
+ | `static_level` | `static_level_precision` | events, `AquiferAnalysis` |
1017
+ | `dynamic_level` | `dynamic_level_precision` | `AquiferAnalysis` |
1018
+ | `depth` | `depth_precision` | `LevelReading`, `Fracture` |
1019
+ | `rate` | `rate_precision` | `PumpingStep` |
1020
+ | `flow_rate` | `flow_rate_precision` | `AquiferAnalysis` |
1021
+ | `depth` | `depth_precision` | `SamplingPoint` _(since v2.3)_ |
1022
+ | `value` | `value_precision` | water quality `Result` _(since v2.3)_ |
525
1023
 
526
1024
  All precision fields are optional. When omitted, the measurement value carries no documented precision. Precision is the one-sigma standard deviation in the same unit as the measurement.
527
1025
 
1026
+ Laboratory reports usually give an expanded uncertainty U with a coverage factor k (typically k = 2). Converters store `value_precision = U / k`, never U itself.
1027
+
528
1028
  ```json
529
1029
  { "depth": 44.8, "depth_precision": 0.01 }
530
1030
  ```
531
1031
 
532
1032
  ---
533
1033
 
534
- _Draft — `.well` Format Specification v2.0_
1034
+ _`.well` Format Specification v2.3_