Exports never change
Why exporting the same project twice gives identical files, what the freeze instant does, and when ruumica refuses an export.
When an authority accepts a delivery, everyone must be able to say later exactly what was delivered. ruumica therefore makes every export reproducible: the same input gives the same files, down to the last byte, on any machine with the same tool versions.
The freeze instant
A project’s records keep changing while work goes on. An export takes the records that existed at one instant, given with --frozen-at (for example 2026-01-01T00:00:00Z): everything captured at or before that instant and not retired by then. Nodes, spans, traces and photos captured later are not in the package, and something retired later still is.
ruumica keeps no history of edits, though. If a record that was already there is corrected afterwards, such as a node’s label or position, the next export with the same freeze instant shows the corrected value. That is why a recorded package is protected (below).
The result is the frozen package: every fact the delivery is made from, in one canonical document (package.json). Every drawing, data file and the closeout book are written from that document alone. The same package can be exported again without the database (asbuilt export --from-package), and gives the same files.
One number for the whole package
The package’s manifest.json lists every file with its SHA-256 fingerprint, the profile used (with its own fingerprint), the coordinate pipeline and the versions of the tools that wrote the files. The fingerprint of that manifest, the manifest_sha256, identifies the whole package. Two exports with the same manifest_sha256 are the same delivery.
Nothing that varies by itself goes into the files: no current time, no host name, no random id. Every ZIP entry is dated at the freeze instant, and lists are always in the same order.
What changes the number
| Change | Same manifest_sha256? |
|---|---|
| Exporting again, on any day, on any machine with the same tool versions | Yes |
Exporting again from package.json, without a database |
Yes |
| Something captured after the freeze instant | Yes; it is not in the package |
| A record that existed at the freeze instant was corrected later | No. If the package was recorded, recording the new one is refused |
| A different freeze instant that includes new records | No: a new package |
| A different or edited export profile | No: the profile’s fingerprint is in the manifest |
| A new version of ruumica, GDAL or Typst | Possibly: the versions are in the manifest |
| A grid installed, such as the Estonian geoid | Yes, if nothing depends on it; otherwise the heights and the package change |
Recording a package
asbuilt export --record also records the package in the database, with who made it. From then on that package is fixed:
- recording the same package again changes nothing;
- recording a package with the same project, profile and freeze instant but different files is refused, and nothing is written (
FROZEN_PACKAGE_CHANGED). The message lists what differs.
An export without --record is never refused for this; it just gives the package as the records are now. Always record what you deliver, so that a later change cannot pass unnoticed.
To deliver a corrected state, export with a new freeze instant. The earlier package stays recorded as it was.