open-standards/map
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Transaction Science a800ebe3de
All checks were successful
standards workspaces build + test / eoc-rs (push) Successful in 1m54s
standards workspaces build + test / jcp-rs (push) Successful in 1m19s
standards workspaces build + test / proof-rs (push) Successful in 1m12s
standards workspaces build + test / jouleclaw-rs (push) Successful in 6m1s
standards workspaces build + test / sandbox-rs (push) Successful in 2m10s
standards workspaces build + test / aac-rs (push) Successful in 1m14s
standards workspaces build + test / smart-byte-rs (push) Successful in 2m34s
standards workspaces build + test / joule-code-rs (push) Successful in 4m20s
standards workspaces build + test / joulecontract-rs (push) Successful in 1m43s
standards workspaces build + test / map-rs (push) Successful in 1m38s
standards workspaces build + test / mesh-rs (push) Successful in 53s
standards workspaces build + test / openpay (push) Successful in 4m35s
standards workspaces build + test / arl-rs (push) Successful in 47m49s
standards workspaces build + test / joule-ui-rs (push) Successful in 56m18s
standards workspaces build + test / jouledesk-rs (push) Successful in 1h3m7s
standards workspaces build + test / joulehook-rs (push) Successful in 12m29s
standards workspaces build + test / sense-rs (push) Successful in 2m27s
map: read the published conformance pack, and pin a JSON round-trip defect
CI now runs map's main() harness (#93), but that harness computes both sides of
every comparison in process. Nothing reads map/conformance/v1/*.json — the files a
third-party implementation is told to certify against.

The gap is measured, not assumed. Changing the Merkle domain separator in
map-schema from "map:node" to "map:nodeX" -- a wire-format change, since a
third-party implementation would then compute different roots for the same
tileset -- leaves the harness reporting 15 passed, 0 failed. The new drift test is
the only thing that notices.

tests/pack.rs takes inputs from the pack and recomputes recorded outputs rather
than re-reading them: every published cell key is rebuilt from its scalar fields
and re-addressed to its recorded canonical CBOR and content id; the tileset is
rebuilt as gen-vectors builds it and compared to the published directory, manifest
and revision, with the Merkle root recomputed, both signatures verified, and the
revision chaining onto the manifest root; and the sealed JCR-1 receipt is
re-derived and compared byte for byte.

That receipt check was written expecting a third stale vector -- joulehook's and
jouledesk's published JCR-1 envelopes both fell behind when the receipt payload
gained a field. map's is current. The prediction was wrong, which is worth
recording as much as a hit would have been.

Two things the tests document rather than assert blindly:

  - Directory::root() commits to the sorted (key, content_id) leaves, so editing
    an entry's offset or len leaves it unchanged. That is by design and sound --
    the content_id authenticates whatever bytes a range fetch returns, so a moved
    range fails at the content check. An earlier draft of this test asserted the
    opposite and was wrong. The tamper case edits a content_id instead.

  - The published manifest does NOT survive a JSON round trip.
    AltSchedule::default() -- the schedule a 2.5D surface-only tileset uses, so
    the common case -- sets width_m to f64::INFINITY. JSON has no infinity, so
    serde_json writes null and f64 refuses null coming back. A third party
    deserializing tileset_vectors.json with the reference types fails on the first
    step. Signatures and content ids are unaffected: the canonical form is CBOR,
    which represents infinity. Fixing the JSON presentation is a normative change
    to a published artifact, so it is left to a maintainer; the test pins the
    defect so it is visible, and fails when it is fixed.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-18 11:40:48 -04:00
..
conformance Add aac, map, sandbox standards; catalog the standards family 2026-06-07 17:04:36 -04:00
map-rs map: read the published conformance pack, and pin a JSON round-trip defect 2026-09-18 11:40:48 -04:00
spec Add aac, map, sandbox standards; catalog the standards family 2026-06-07 17:04:36 -04:00
vocab map: point at maps.transaction.science (the only site) everywhere 2026-06-07 19:40:49 -04:00
CHANGELOG.md Add aac, map, sandbox standards; catalog the standards family 2026-06-07 17:04:36 -04:00
CONTRIBUTING.md Add aac, map, sandbox standards; catalog the standards family 2026-06-07 17:04:36 -04:00
LICENSE Add aac, map, sandbox standards; catalog the standards family 2026-06-07 17:04:36 -04:00
LICENSE-SPEC Add aac, map, sandbox standards; catalog the standards family 2026-06-07 17:04:36 -04:00
README.md Add aac, map, sandbox standards; catalog the standards family 2026-06-07 17:04:36 -04:00
ROADMAP.md docs: drop vanity test-counts (no-vanity-metrics policy) 2026-06-07 19:00:28 -04:00
SPEC.md Add aac, map, sandbox standards; catalog the standards family 2026-06-07 17:04:36 -04:00

Map

A carrier for place. Range-requestable, signed, energy-attributed, owned by no one.

Map is the geospatial cargo class of the Transaction Science substrate. Where Smart Byte carries value, EOC carries compute, and Joule Code carries coding work, Map carries place — a region of the world at a position, an altitude, an instant, and a fidelity — as a content-addressed, signed tile with its energy cost intrinsic.

A tile is not an image and not an API response. It is a vesicle carrying exactly five things: identity (the BLAKE3 content address of its canonical serialization), a 4D cell key (where, how high, when, and how detailed), provenance (the signed tileset root it was published under, and the author key that signed it), cargo (the payload — terrain, a scalar/vector field, vector features, or 3D Gaussian splats), and a two-part joule cost (measured + estimated, with an honest provenance tag on every reading). Render requests resolve through an explicit energy-tiered fidelity cascade — cache, then a terrain base floor, then fields, then features, then photoreal splats — and return the highest tier present for the cell at or below the requested fidelity, falling back to the floor, which is defined everywhere. Graceful fallback is a property of the standard, not of an implementation.

The substrate is intentionally ownerless: no protocol-level token, permissive licensing on the spec text and reference code, and conformance vectors so any implementer can verify canonicity without a trust relationship with the authors. A conforming reader resolves a cell, verifies it against a signed manifest, renders it, and meters it — against static storage, with no contact with any single company's servers as a condition of operation. Transaction Science is one steward: it publishes the spec, ships a reference implementation, and operates commercial services (capture pipelines, hosted tilesets, a registry) around the substrate — not its proprietor.

The doctrine

The map is a file, not a service. The durable layer of a mapping platform is not tile serving or per-load billing — both are commoditized and both expire. It is the published, signed, dated file that renders forever from dumb storage, measured in joules per resolved cell.

Three consequences, normative in SPEC.md:

  1. The cascade. Every render request resolves through F0:Cache → F1:Base → F2:Field → F3:Feature → F4:Photoreal and returns the highest tier ≤ the requested fidelity that holds data for the cell, falling back to the F1 base floor — which is defined everywhere on the datum, so a covered region never fails to render.
  2. The receipt. Every resolve/decode reports a two-part energy cost in microjoules — measured + estimated — with a Provenance tag (HwShunt | ModelBased | Estimator), sealed as a JCR-1 envelope (canonical det-CBOR + COSE_Sign1/EdDSA — the family's shared signed-receipt format).
  3. No capture. No protocol token. A tileset is a single range-requestable file on dumb storage; reading it requires the bytes and a public key, nothing more. Revisions (a new forecast hour, a new AIRAC cycle) are signed, dated transitions over the manifest root — never in-place mutations.

The 4D cell key

Map's one genuinely new primitive is the address. A tile is keyed by four orthogonal axes — S2 cell (horizontal, Hilbert-ordered), altitude band (signed; band 0 = datum), time bucket (half-open TAI interval; bucket 0 = atemporal), and within-tier LOD. The horizontal axis is what makes a tileset range-requestable; the temporal axis is first-class, which is exactly what 3D Tiles lacks and what weather and flight navigation require. A "map of Tuesday at 14:00Z" is a different, equally addressable region from the same place on Wednesday.

Contents

  • SPEC.md — the normative specification (RFC 2119). The tile cargo, the 4D cell key, canonical serialization, the tileset + manifest, the cascade, and the receipt.
  • spec/ — sub-specifications: the cell key, the tileset container, the manifest + revision chain, and the receipt format.
  • vocab/ — the controlled vocabulary and stable IRIs (LEXICON.md).
  • conformance/ — signed wire vectors. An implementation is conformant if it round-trips these.
  • map-rs/ — the Rust reference library: the protocol crates (schema, cascade, receipt, conformance) plus the ported substrate (index, tiles, orbital, route). This is the lean library a third party implements against — not a renderer.

Reference implementation and consumers

The Rust reference lives in map-rs/. The demonstrator pillar is maps.transaction.science — a WebGPU globe (Rust → WASM + native, on wgpu) that consumes map-rs: a satellite/terrain/weather basemap with live orbital, ADS-B, and AIS entity layers and an AI-native query surface. The demonstrator is a demonstration of the standard, the way the pillars demonstrate the other standards — not the product.

Status

v0.1.0 draft. Specification core published (SPEC.md + spec/). Reference workspace map-rs/: map-schema (the 4D cell key, tile, tileset directory, manifest + revision, content addressing), map-cascade (the F0–F4 fidelity resolver with guaranteed F1 fallback), map-receipt (JCR-1 sealing, interoperable with the family's verifiers), and the map-conformance harness. The substrate crates (map-index from joule-s2 + joule-spatial3d, map-tiles from joule-tiles, map-orbital from joule-orbital, map-route from joule-maps) are being ported from the existing engine; see ROADMAP.md. Not certified for primary navigation (see SPEC §9).

Licence

  • Reference code (map-rs/): Apache-2.0 — see LICENSE.
  • Specification text (SPEC.md, spec/, vocab/): CC-BY-4.0 — see LICENSE-SPEC.