ruumica documentation

Codes and statuses

Every code and status ruumica prints, what it means, and what to do about it.

ruumica never fails silently. Every result that needs your attention carries a code in capital letters, such as GRID_ABSENT. This page explains each one. The list is checked against the program on every build, so a code you see is always here. Search for a code by its name, or link to it directly: GRID_ABSENT is at #grid-absent.

A finding has one of three severities:

Severity Effect
BLOCKING Stops the export or command. Nothing is written until it is fixed.
WARNING Recorded in the package and shown in the closeout book. The export goes ahead.
INFO For your information. Recorded, no action needed.

Offline work is reported differently: each change made in the field (an op) gets a status, sometimes with a reason. See Offline sync.

Coordinates and grids

Code Kind Meaning What to do
CRS_PIPELINE_UNKNOWN BLOCKING The project names a coordinate pipeline that is not in the pipeline registry used for the export. Check the --registry folder (default geodesy/pipelines) and the project’s pipeline. See asbuilt export.
CRS_GRID_ABSENT BLOCKING, or WARNING when --allow-grid-absent covers the pipeline A grid file the project’s pipeline needs, such as the Estonian geoid model, is not installed. Without it heights cannot be converted. Install the grid. While Estonian projects wait for the licensed geoid, exports run with --allow-grid-absent 'ee.*' and say so.
CRS_GRID_MISMATCH BLOCKING An installed grid file is not the file the registry expects: its SHA-256 differs. Replace it with the registered file. A different file would give different coordinates.
CRS_GRID_HASH_PENDING BLOCKING A grid file is installed, but the registry has not recorded its SHA-256 yet. Record the hash in the registry. The geoid installation procedure does this.
GEOJSON_WGS84_SKIPPED WARNING The extra GeoJSON copy in WGS 84 (RFC 7946) was not written. The GeoJSON in the delivery coordinate system is complete. Nothing, unless a recipient needs WGS 84. See Feature status.
OK grid status (asbuilt crs verify) The grid file is installed and its SHA-256 matches the registry. Nothing.
ABSENT grid status (asbuilt crs verify) The grid file is not installed. Install it, or run with --allow-grid-absent for that pipeline while you wait for it.
MISMATCH grid status (asbuilt crs verify) The installed grid file’s SHA-256 differs from the registry. As for CRS_GRID_MISMATCH.
HASH_PENDING grid status (asbuilt crs verify) The grid file is installed, but its SHA-256 is not recorded yet. As for CRS_GRID_HASH_PENDING.
PASS test point status (asbuilt crs verify); trace verdict A test point transforms to its official coordinates within tolerance. For an OTDR trace: every event and the total loss are within the limits, judged in both directions. Nothing.
FAIL test point status (asbuilt crs verify); trace verdict A test point does not reach its official coordinates within tolerance. For an OTDR trace: at least one event or the total loss is over its limit. For a test point: the pipeline or grid is wrong; do not deliver until it passes. For a trace: see the finding that names the event, such as OPTICAL_EVENT_OVER_LIMIT.
GRID_ABSENT test point status (asbuilt crs verify); hold reason (sync) The grid this pipeline needs is not installed. In verification, the test point cannot be checked. In sync, an Estonian height from the field waits for the geoid model: the raw height is kept, and the position is never stored without height. Install the grid. Held positions are then applied automatically.
ERROR test point status (asbuilt crs verify) The test point could not be transformed at all; the message says why. Read the message. Usually the pipeline definition or the PROJ installation is broken.

OTDR traces

The limits are the project’s. The defaults are 0.30 dB per splice, 0.75 dB per connector and −35.0 dB reflectance.

Code Kind Meaning What to do
PROVISIONAL trace verdict The trace has been judged in one direction only. Losses measured from one end can be wrong by the difference between the two fibres at a splice. Measure the same fibre from the other end at the same wavelength and ingest that trace; the pair is judged together.
OPTICAL_UNIDIRECTIONAL WARNING Only one direction of this fibre is on record, so its verdict stays PROVISIONAL. As for PROVISIONAL.
OPTICAL_EVENT_OVER_LIMIT WARNING; the trace verdict is FAIL A splice or connector exceeds its limit, using the average of both directions. The message names the event, its distance and its losses. Repair the splice or clean the connector, measure again in both directions, ingest the new traces.
OPTICAL_EVENT_OVER_LIMIT_UNIDIRECTIONAL WARNING An event exceeds its limit, judged from one direction only. It may pass once the other direction is measured. Measure the other direction before repairing anything.
OPTICAL_TOTAL_LOSS_OVER_LIMIT WARNING; the trace verdict is FAIL The end-to-end loss, averaged over both directions, exceeds the project’s limit. Find the events that add the most loss; repair and measure again.
OPTICAL_TOTAL_LOSS_OVER_LIMIT_UNIDIRECTIONAL WARNING The end-to-end loss exceeds the limit, judged from one direction only. Measure the other direction first.
TRACE_FAIL WARNING (export) A trace in the package fails the optical rules. It is reported in the closeout book with its findings. Decide with the client whether to deliver with the failure or repair and measure again first.
BIDIR_WAVELENGTH_MISMATCH BLOCKING (pairing) The two traces were measured at different wavelengths, such as 1310 nm and 1550 nm, so they cannot be paired. Pair traces of the same wavelength.
BIDIR_LENGTH_MISMATCH BLOCKING (pairing) The two traces show fibre lengths further apart than the tolerance (2 m plus 0.5 % of the length). They are not two directions of the same fibre. Check the fibre number and direction of both files.
BIDIR_NO_END_EVENT BLOCKING (pairing) A trace has no end-of-fibre event, so the two directions cannot be lined up. Measure again with an end-of-fibre event, or set it in the OTDR software before export.
BIDIR_UNPAIRED_EVENT WARNING An event in one direction has no counterpart in the other. It is judged on that direction alone. Usually harmless (a ghost or a very small event). Look at it if it is near a splice.
BIDIR_UNPAIRED_EVENT_OVER_LIMIT WARNING; the trace verdict is FAIL As BIDIR_UNPAIRED_EVENT, and the event’s loss exceeds its limit. Inspect the event’s position on the route; measure again if needed.
SOR_BAD_GROUP_INDEX BLOCKING The trace’s group index (IOR) is missing or outside 1.40–1.60, so distances cannot be computed. Give the group index from the cable data sheet with --ior. See asbuilt sor ingest.
IOR_OVERRIDDEN INFO A group index given with --ior was used instead of the file’s. All distances are scaled accordingly. Nothing. It is recorded so the reader of the book knows.
SOR_NO_KEYEVENTS WARNING The file has no KeyEvents block (the OTDR’s event table), so there is nothing to judge. Reported by asbuilt sor inspect and whenever the trace is judged. Export the file again from the OTDR software with its event table.
SOR_NO_END_EVENT WARNING No end-of-fibre event (code letter E or D) is in the event table. Check the trace; set the fibre end in the OTDR software if it was missed.
SOR_NO_DATAPTS WARNING (asbuilt sor inspect) The file has no DataPts block, so it carries no trace curve. The event table can still be judged. Export the file with its trace data if the curve is needed.
SOR_CHECKSUM_MISMATCH WARNING (asbuilt sor inspect; an error with --strict-checksum) The file’s stored checksum matches neither known algorithm. Either the vendor writes it differently or the file is damaged. Compare with the original file from the OTDR. If they are identical, it is the vendor’s format.
SOR_NO_CKSUM_BLOCK WARNING (asbuilt sor inspect) The file has no checksum block, so damage cannot be detected. Use the original file from the OTDR where possible.
SOR_LANGUAGE_INVALID WARNING (asbuilt sor inspect) The language field of the file is not two letters. It is printed as found. Nothing. It does not affect any measurement.
SOR_TRAILING_BYTES INFO (asbuilt sor inspect) The file has bytes after its last declared block. They were ignored. Nothing.
SLACK_NO_GEOMETRY BLOCKING The cable’s route has no span lengths, so the trace’s distances cannot be placed on it. Record the cable route and its spans first.
SLACK_FACTOR_OUT_OF_RANGE BLOCKING The fibre is too long or too short for its route: the fitted length factor is outside 1.000–1.050. A slack loop is not recorded, or the route is wrong. Record the missing slack loop, or correct the cable route.
SLACK_RESIDUAL_OVER_TOLERANCE WARNING The measured fibre end differs from the modelled end by more than the tolerance. Event positions on the map may be off by about as much. Check slack loop lengths and lead lengths.

Point clouds

Code Kind Meaning What to do
LAZ_COUNT_MISMATCH BLOCKING The file’s header declares a different number of points than the file holds. The file is damaged or was written incorrectly. Export the point cloud again from the scanner software.
LAZ_BOUNDS_MISMATCH BLOCKING The bounding box in the header does not match the points. As for LAZ_COUNT_MISMATCH.
LAZ_SCALE_TOO_COARSE BLOCKING The coordinate scale is coarser than 0.001 m, so millimetres are lost. Export with a scale of 0.001 m or finer.
LAZ_NO_GPS_TIME BLOCKING The points carry no GPS time, which is needed to correct scanner drift. Export with a point format that includes GPS time.
LAZ_NO_CRS BLOCKING The file does not say which coordinate system it is in, so it cannot be checked against the project. Export with the coordinate system written into the file.

Packages and exports

Code Kind Meaning What to do
PROFILE_UNVERIFIED WARNING with --allow-unverified-profile, otherwise BLOCKING The export profile is provisional: its layers have not been checked against the authority’s specification. Every file is marked PROFILE NOT AUTHORITY-VERIFIED. For a real submission, use a production profile. Until one exists, export with --allow-unverified-profile and say so to the recipient.
FROZEN_PACKAGE_CHANGED BLOCKING (with --record) A closeout package with this project, profile and freeze instant is already recorded, and the package being recorded differs from it. The message lists what differs. Nothing was written. A recorded package never changes. To deliver the new state, export with a new --frozen-at instant.
DXF_EMPTY BLOCKING The package has no nodes or spans to draw. Check that the project and freeze instant are the intended ones.
DXF_NO_LAYER BLOCKING A node or span type has no layer in the export profile. Add the type to the profile, as a new profile version.
DXF_LINETYPE_UNDEFINED BLOCKING A profile layer uses a linetype the drawing does not define. Only Continuous is defined. Correct the profile.
DXF_BAD_NAME BLOCKING A name in the profile is not allowed in DXF, or an attribute tag contains a space. Correct the profile.
DXF_BAD_TEXT BLOCKING A text going into the drawing, such as a label, contains a line break or a control character. Correct the text in the project data.
DXF_TEXT_TOO_LONG BLOCKING A text going into the drawing is longer than DXF allows (255 bytes). Shorten it in the project data.
LABELS_UNPLACED WARNING Some labels did not fit on the map without overlapping. They are listed in a numbered table above the title block instead. Nothing. The drawing stays complete.
GPKG_TOOL_MISSING BLOCKING ogr2ogr, which writes the GeoPackage, is not installed. Install it (package gdal-bin). The Debian 13 installation script does this.
PDF_TOOL_MISSING BLOCKING typst, which writes the closeout book, is not installed. Install the pinned version. The Debian 13 installation script does this.
PDF_TEMPLATE_UNKNOWN BLOCKING The profile names a closeout book template that this version of ruumica does not contain. Correct the profile, or use the ruumica version the profile was written for.

Offline sync

Every change made in the field app is an op. When it reaches the server, it gets one of six statuses. A status can change when later ops arrive. Only REJECTED is final.

Statuses

Code Kind Meaning What to do
APPLIED op status The change took effect as recorded. Nothing.
REBASED op status The change took effect, but on a newer part of the network than the one you saw. Usually someone else split the span, and your change was moved to the right new span. The message names the old and the new span. Nothing is lost. Check that the new span is the right one.
CONFLICT op status The change contradicts another change. It has no effect for now; its data is kept. The office decides. Conflict review is not built yet (Feature status).
PENDING op status The change has no effect yet and waits. The reason is MISSING_REFERENCE or HELD. It is checked again with every new op. Usually nothing. See the reason.
REJECTED op status The change was refused for good. The reason code says why. See the reason below.
MOOT op status A decision on a conflict that no longer exists. Recorded, with no effect. Nothing.
MISSING_REFERENCE pending reason The change refers to something the server has not received yet, for example a node created on another device that is still offline. Nothing. It applies by itself when the other change arrives. It never expires; asbuilt sync pending lists long waits.
HELD pending reason The server holds the change for the hold reason given with it. See the hold reason.
TRACE_SUMMARY_MISMATCH op finding The verdict the field app showed for an OTDR trace differs from the server’s own evaluation of the same file. The server’s evaluation counts; the op’s status is unchanged. Check the trace in the office. asbuilt sync pending lists these.

Hold reasons

A held change is never stored half-done: a position is never stored without its height.

Code Kind Meaning What to do
BLOB_UNVERIFIED hold reason The photo or trace file the change needs has not been uploaded completely, or the server has not checked it yet. Nothing. The change applies once the file is verified. If it stays, let the app finish its uploads.
NO_HEIGHT hold reason A position or line point has no height. Record the position again with its height.
GNSS_NOT_DATUM_VERIFIED hold reason The position comes from a DGPS or autonomous GNSS fix, which is not accurate enough for delivery. Measure again with an RTK fix, or have the office record the node by hand.
GGA_NO_ALTITUDE hold reason The GNSS receiver sent no altitude. Check the receiver’s output settings and measure again.
GGA_NO_SEPARATION hold reason The receiver sent no geoid separation, so the height cannot be turned into an ellipsoidal height. Check the receiver’s output settings. Until then, the office records the node by hand.
GGA_SEPARATION_ZERO hold reason The receiver sent a geoid separation of 0. Some receivers do this when their altitude is already ellipsoidal; ruumica cannot know which. Set in the device record whether this receiver’s altitude is ellipsoidal. Until then, the office records the node by hand.
GGA_SEPARATION_CONFLICT hold reason The device record says the altitude is ellipsoidal, but the receiver sends a non-zero geoid separation. The two disagree. Correct the device record or the receiver’s settings.

Conflict kinds

The op that arrives later in the agreed order is the one in conflict. Its data is always kept.

Code Kind Meaning What to do
GEOMETRY_DIVERGED conflict kind Two people changed the course of the same span, each starting from a different version. The office chooses which course is right.
GEOMETRY_ON_RETIRED_SPAN conflict kind The course of a span was changed after the span was split or retired. Record the change on the new spans.
PROBABLE_DUPLICATE_HANDHOLE conflict kind A span was split twice within 1 m. Probably the same handhole was recorded twice. The office keeps one.
MEASURE_OUT_OF_RANGE conflict kind A position along a span is below 0 or beyond the span’s length. It is never moved silently. Check the measure. The office can keep a point at the stated measure.
NODE_RETIRED conflict kind The change refers to a node that has been retired. The office decides whether the change still applies.
NODE_HAS_ACTIVE_SPANS conflict kind Someone tried to retire a node that still has spans attached. The spans were not touched. Retire or reconnect the spans first.
DUPLICATE_ENTITY_ID conflict kind Two changes created something with the same id. The first one counts. Report it: ids are generated by the app and should never repeat.
REFERENCE_KIND_MISMATCH conflict kind The change refers to an id of the wrong kind, such as a span where a node is expected. Report it with the op; the field app should not produce this.
SPAN_NOT_AT_NODE conflict kind A splice or slack loop names a span that does not end at its node. Record it again on a span that ends at that node.
ROUTE_LEG_INVALID conflict kind A cable route passes through the same span twice. Correct the cable route.
DUPLICATE_SLACK_LOOP conflict kind A second slack loop was recorded for the same cable at the same node. The first one counts. The office keeps the right one.
DUPLICATE_SPLICE_STRAND conflict kind A second splice was recorded for the same fibre of the same cable at the same node. The first one counts. The office keeps the right one.
DUPLICATE_TRACE_BLOB conflict kind The same .sor file was attached twice in the project. The first one counts. Nothing, unless the second attachment was meant for another fibre.
LINEAGE_TOO_DEEP conflict kind A span has been split more than 50 times over. This guard protects the project data. Report it; this does not happen in normal work.

Rejection reasons

Code Kind Meaning What to do
BLOB_HASH_MISMATCH rejection reason The uploaded file does not match the fingerprint (SHA-256) the app recorded. It was damaged or replaced. Capture or attach the file again.
SOR_NOT_CERTIFIABLE rejection reason The attached trace file is not an OTDR file the server can evaluate. Attach the original .sor file from the OTDR.
USER_NOT_IN_ORG rejection reason The person who made the change does not belong to the project’s organisation. An administrator checks the person’s account and organisation.
USER_DISABLED rejection reason The person who made the change has a disabled account. An administrator checks the account.
INPUT_ERROR rejection reason The change could not be processed because its input is inconsistent, for example a position on a span that has no length. Report it with the op.
ALREADY_RESOLVED rejection reason A decision on a conflict that another decision had already settled. The message names that decision. Nothing; the first decision counts.
RESOLUTION_KIND_MISMATCH rejection reason A decision named a different kind of conflict than the one it was for. Decide again on the current conflict.
RESOLUTION_NOT_ALLOWED rejection reason The decision is not allowed for this kind of conflict, for example applying a split at a position outside the span. Choose the other decision.
APPLY_WOULD_BREAK_INTEGRITY rejection reason Applying the change after all would break the network’s consistency. The conflict stays open. Choose to discard the change instead.
APPLY_NOT_REACHED rejection reason The decision to apply the change could not be carried out. The conflict stays open. Decide again, or discard the change.

Last changed 2026-11-15