ruumica documentation

Closeout package format

What is inside the closeout ZIP, and every field of its manifest.json and package.json.

asbuilt export writes a closeout package: one folder with every delivery file, and the same files in one ZIP for sending. The same project, freeze instant and profile always give the same bytes, down to the ZIP. Two exports can therefore be compared by one number, the manifest_sha256.

The folder and the ZIP

The ZIP is named closeout-<project>-<freeze instant>.zip, for example closeout-ee-demo-20260101T000000Z.zip. Every entry is dated at the freeze instant.

Entry What it is
<project>.dxf The drawing, with the layers and symbols of the export profile.
<project>.geojson The network as GeoJSON, in the delivery coordinate system.
<project>.gpkg The network as a GeoPackage, for GIS software.
<project>.pdf The closeout book: verdicts, OTDR results, evidence list and their SHA-256.
package.json Everything the files above were made from, in one document. Fields below.
manifest.json The list of every other entry with its SHA-256. Fields below.
evidence/<sha256>.<ext> Each photo or sketch, named by its SHA-256.
traces/<sha256>.sor Each OTDR file as it was measured, named by its SHA-256.

The folder holds the same files and the ZIP. Files exported with a provisional profile carry the marking PROFILE NOT AUTHORITY-VERIFIED.

The manifest_sha256

The manifest_sha256 is the SHA-256 of manifest.json. Since the manifest lists the SHA-256 of every other entry, this one number identifies the whole package. asbuilt export prints it; a recorded package keeps it.

$ asbuilt export --project ee-demo --profile ee.default.v1 --frozen-at 2026-01-01T00:00:00Z --out closeout --allow-grid-absent 'ee.*' --allow-unverified-profile
…
manifest_sha256 d0b2a38e6d15840031a1bf30c8defc48c72994c218b2bd569fc0da82c178e3df
$ sha256sum closeout/manifest.json
d0b2a38e6d15840031a1bf30c8defc48c72994c218b2bd569fc0da82c178e3df  closeout/manifest.json

To check a package you received, compute the SHA-256 of its manifest.json and of every entry it lists, and compare.

manifest.json

Key Type Meaning
schema text The manifest format: asbuilt.closeout-manifest/1.
project_id id The project’s id.
project_name text The project’s name.
frozen_at time The freeze instant, YYYY-MM-DDTHH:MM:SSZ.
profile.id text The export profile used.
profile.version text Its version.
profile.sha256 text SHA-256 of the profile file used, so a profile change shows.
profile.production true or false Whether the profile is a production profile.
crs.horizontal_srid number EPSG code of the horizontal coordinate system, such as 3301 (L-EST97).
crs.vertical_epsg number EPSG code of the height system, such as 9663 (EH2000).
crs.pipeline_id text The pinned coordinate pipeline of the project.
toolchain.asbuilt text The ruumica program version.
toolchain.gdal text The GDAL version that wrote the GeoPackage.
toolchain.typst text The Typst version that wrote the closeout book.
entries[].path text Path of the entry in the ZIP. manifest.json itself is not listed.
entries[].sha256 text SHA-256 of the entry.
entries[].bytes number Size of the entry in bytes.
entries[].exporter text What made it: dxf-ee, geojson, gpkg, pdf, or package, evidence, trace for copied inputs.
entries[].version text Version of what made it.

package.json

The frozen package: every fact the delivery files were made from, as of the freeze instant. Lists are sorted, so the same facts always give the same bytes. All coordinates are in the delivery coordinate system: easting e and northing n in metres, and h an elevation in metres in the height system, never a depth. Lengths ending in _mm are whole millimetres.

Key Type Meaning
schema_version number The package format, currently 1. A program refuses a version it does not know.

meta

Key Type Meaning
meta.project_id id The project’s id.
meta.project_name text The project’s name.
meta.jurisdiction text Country or region code: EE, NO, SE, FI, EU, US, UK.
meta.org_name text The organisation delivering.
meta.org_mtr_code text or empty The organisation’s Estonian MTR registration code, when it has one.
meta.surveyor.name text The organisation’s verified surveyor; surveyor is empty until one is on record.
meta.surveyor.certificate_no text The surveyor’s certificate number.
meta.surveyor.certificate_level number The surveyor’s certificate level.
meta.frozen_at time The freeze instant, YYYY-MM-DDTHH:MM:SSZ.
meta.frozen_at_unix number The same instant in seconds since 1970.
meta.horizontal_srid number EPSG code of the horizontal coordinate system.
meta.vertical_epsg number EPSG code of the height system.
meta.crs_pipeline_id text The pinned coordinate pipeline.
meta.authority_profile text The project’s export profile.
meta.control_points[].registry_id text Id of a control point in the national register.
meta.control_points[].name text or empty Its name.
meta.control_points[].point_class text Its class in the register.
meta.control_points[].e number, metres Its easting.
meta.control_points[].n number, metres Its northing.
meta.control_points[].h number, metres Its elevation.
meta.rules.max_splice_loss_db number, dB The project’s splice loss limit.
meta.rules.max_connector_loss_db number, dB The project’s connector loss limit.
meta.rules.max_reflectance_db number, dB The project’s reflectance limit.
meta.rules.min_cover_m number, metres The minimum cover over buried infrastructure.
meta.rules.deviation_threshold_m number, metres How far the built network may lie from the plan before it is listed as a deviation.
meta.rules.required_ql text The quality level the project requires: QL_A to QL_D.

nodes[]

Key Type Meaning
nodes[].id id The node’s id.
nodes[].node_type text HANDHOLE, MANHOLE, CABINET, SPLICE_CLOSURE, POLE, DEPTH_POINT, BEND or STRUCTURE.
nodes[].label text The node’s label, as on the drawing.
nodes[].e number, metres Easting.
nodes[].n number, metres Northing.
nodes[].h number, metres Elevation.
nodes[].burial_depth_m number, metres, or empty Depth below ground, when measured.
nodes[].fix_type text How the position was measured: RTK_FIXED, RTK_FLOAT, PPK_FIXED, DGPS, AUTONOMOUS, SCAN_REGISTERED, TOTAL_STATION or MANUAL_REDLINE.
nodes[].h_accuracy_mm number, millimetres, or empty Horizontal accuracy of the position.
nodes[].v_accuracy_mm number, millimetres, or empty Vertical accuracy of the position.
nodes[].captured_at time When the position was measured.
nodes[].ql text or empty The quality level, when assessed. Empty in this version (Feature status).

spans[]

Key Type Meaning
spans[].id id The span’s id.
spans[].start_node_id id The node it starts at.
spans[].end_node_id id The node it ends at.
spans[].span_type text Its type, such as TRENCH or CONDUIT_HDPE_40MM.
spans[].outer_diameter_mm number, millimetres, or empty Outer diameter of the duct, when known.
spans[].z_reference text What the elevations describe: TOP_OF_PIPE, AXIS or INVERT.
spans[].vertices list of [e, n, h] The course of the span, in drawing order.
spans[].length_2d_mm whole number, millimetres Length on the map.
spans[].length_3d_mm whole number, millimetres Length along the slope.
spans[].ql text or empty As nodes[].ql.

cables[]

Key Type Meaning
cables[].id id The cable’s id.
cables[].label text The cable’s label.
cables[].cable_spec text The cable’s specification.
cables[].fiber_count number Number of fibres.
cables[].length_factor number Optical length divided by route length (the fibre’s helix and excess length), from the cable data.
cables[].route[].seq number Position of the leg in the route.
cables[].route[].span_id id The span the leg runs through.
cables[].route[].direction 1 or −1 1 along the span’s drawing direction, -1 against it.
cables[].slack[].node_id id Where a slack loop is stored.
cables[].slack[].length_mm whole number, millimetres Its length.
cables[].slack[].storage text How it is stored: COIL_IN_VAULT, FIGURE8, TRAY or AERIAL_SNOWSHOE.

splices[]

Key Type Meaning
splices[].id id The splice’s id.
splices[].node_id id The closure or node it is in.
splices[].tray_number number The tray.
splices[].in_cable_id id The incoming cable.
splices[].in_tube_color text The incoming fibre’s tube colour.
splices[].in_strand_color text The incoming fibre’s colour.
splices[].in_strand_index number The incoming fibre’s number.
splices[].out_cable_id id The outgoing cable.
splices[].out_tube_color text The outgoing fibre’s tube colour.
splices[].out_strand_color text The outgoing fibre’s colour.
splices[].out_strand_index number The outgoing fibre’s number.
splices[].loss_bidir_db number, dB, or empty The splice loss averaged over both directions, when both were measured.

traces[]

Key Type Meaning
traces[].id id The trace’s id.
traces[].cable_id id or empty The cable measured.
traces[].fiber_number number or empty The fibre measured.
traces[].direction text or empty A_TO_B (along the cable route) or B_TO_A.
traces[].from_node_id id or empty Where the OTDR was connected.
traces[].to_node_id id or empty The far end.
traces[].file_sha256 text SHA-256 of the .sor file.
traces[].zip_path text Path of the .sor file in the ZIP.
traces[].supplier text or empty The OTDR maker, as written in the file.
traces[].wavelength_nm number, nm Wavelength, such as 1310 or 1550.
traces[].pulse_width_ns number, ns Pulse width.
traces[].group_index number The group index (IOR) used for distances.
traces[].ior_override number or empty The group index given with --ior, when one was given.
traces[].total_loss_db number, dB End-to-end loss.
traces[].fiber_end_m number, metres Optical distance to the fibre end.
traces[].orl_db number, dB, or empty Optical return loss.
traces[].checksum_ok true or false Whether the file’s checksum is valid.
traces[].verdict text PASS, FAIL or PROVISIONAL.
traces[].rule_version text Version of the optical rules applied.
traces[].tested_at time When the trace was measured.
traces[].length_factor_fitted number or empty The length factor fitted from the measured fibre end; empty when the route has no lengths.
traces[].end_residual_m number, metres, or empty Measured end minus the end modelled with the recorded length factor.
traces[].findings list The trace’s findings: each with severity, code and message (see Codes and statuses).
traces[].events[].no number The event’s number in the OTDR’s table.
traces[].events[].optical_m number, metres Optical distance from the OTDR.
traces[].events[].loss_db number, dB Loss measured in this direction.
traces[].events[].reflectance_db number, dB, or empty Reflectance.
traces[].events[].code text The OTDR’s event code.
traces[].events[].class text SPLICE, CONNECTOR, END or LAUNCH.
traces[].events[].loss_bidir_db number, dB, or empty Loss averaged over both directions, when paired.
traces[].events[].verdict text PASS, FAIL, PROVISIONAL, UNPAIRED, or - for the launch and the end, which are not judged.
traces[].events[].node_id id or empty The node the event lies at; set when the event was placed at a node.
traces[].events[].span_id id or empty The span the event lies on; set when it was placed on a span.
traces[].events[].measure_m number, metres, or empty Its position along that span.
traces[].polyline list of [distance_m, dB] A simplified trace curve, for drawing only; never used for a verdict.

evidence[]

Key Type Meaning
evidence[].id id The evidence item’s id.
evidence[].kind text PHOTO, DEPTH_ROD_PHOTO, VIDEO or REDLINE_SKETCH.
evidence[].node_id id or empty The node it documents.
evidence[].span_id id or empty The span it documents.
evidence[].sha256 text SHA-256 of the file.
evidence[].bytes number Size in bytes.
evidence[].zip_path text Path of the file in the ZIP.
evidence[].captured_at time When it was captured.

deviations[]

Differences between the built network and the plan. Empty in this version: the comparison with the plan is not built.

Key Type Meaning
deviations[].entity_id id The node or span that deviates.
deviations[].kind text The kind of deviation.
deviations[].value_m number, metres How far it deviates.
deviations[].message text A description.

Last changed 2026-11-14