7. Example Manifests

While SpatialDDS keeps its on-bus messages small and generic, richer details about services, maps, and experiences are provided out-of-band through manifests. A manifest is a lightweight JSON document referenced by a manifest_uri in a discovery announce. In v1.3 those manifest pointers are canonical spatialdds:// URIs (e.g., spatialdds://acme.services/sf/service/vps-main) that resolve using the rules described in Section 6 (SpatialDDS URIs), guaranteeing stable identifiers even when manifests are hosted on rotating infrastructure. Manifests let providers describe capabilities, formats, coverage shapes, entry points, and assets without bloating the real-time data stream. The examples here show four common cases: a Visual Positioning Service (VPS) manifest that defines request/response topics and limits, a Mapping Service manifest that specifies tiling scheme and encodings, a Content/Experience manifest that lists anchors, tiles, and media for AR experiences, and an Anchors manifest that enumerates localization anchors with associated assets. Together they illustrate how manifests complement the DDS data plane by carrying descriptive metadata and policy.

Example discovery announcements would therefore carry manifest URIs such as:

  • spatial::disco::ServiceAnnounce.manifest_uri = spatialdds://acme.services/sf/service/vps-main
  • spatial::disco::ServiceAnnounce.manifest_uri = spatialdds://acme.services/sf/service/mapping-tiles
  • spatial::disco::ContentAnnounce.manifest_uri = spatialdds://acme.services/sf/content/market-stroll

Legacy HTTPS download links can still be advertised inside the manifest body, but the discovery announcements themselves now use the SpatialDDS URI scheme so clients have a consistent, scheme-agnostic handle to resolve.

Version 1.3 also gives manifests a lighter way to explain where a service operates. Publishers can name the frame for their coverage, add a few transforms back to "earth-fixed", and optionally list coarse coverage.volumes[] boxes. Those hints help clients decide, at a glance, whether a service overlaps the space they care about before loading heavier details.

Discovery mirrors that upgrade with optional CoverageVolume hints on announces and an opt-in CoverageQuery message for active volume requests. Implementations that ignore the new fields continue to interoperate.

A) VPS Manifest

This manifest describes a Visual Positioning Service (VPS). It specifies the service identifier, version, coverage area, and the topics used for queries and responses. It also lists supported input encodings and response types, allowing clients to determine compatibility before interacting with the service.

{
  "service_id": "svc:vps:acme/sf-downtown",
  "profiles": [
    "Core",
    "SLAM Frontend",
    "AR+Geo"
  ],
  "request": {
    "features_topic": "feat.keyframe",
    "image_blob_role": "image/jpeg",
    "prior_topic": "geo.fix"
  },
  "response": {
    "rich": "pg.nodegeo",
    "minimal": "geo.fix"
  },
  "limits": {
    "max_fps": 10,
    "max_image_px": 1920
  },
  "auth": {
    "scheme": "oauth2",
    "issuer": "https://auth.acme.com"
  },
  "coverage": {
    "$comment": "If multiple coverage elements are present, they must bound the same resource. geohash (if used) is always earth-fixed.",
    "geohash": [
      "9q8y",
      "9q8z"
    ],
    "elements": [
      {
        "type": "bbox",
        "frame": "earth-fixed",
        "crs": "EPSG:4979",
        "bbox": [
          -122.4186,
          37.7931,
          -122.4123,
          37.7982
        ],
        "$comment": "Earth-fixed bbox uses degrees [west,south,east,north]. If crossing 180°, west may be > east."
      },
      {
        "type": "volume",
        "frame": "ship-fixed",
        "aabb": {
          "min_xyz": [
            -25.0,
            -30.0,
            -5.0
          ],
          "max_xyz": [
            25.0,
            30.0,
            20.0
          ]
        },
        "$comment": "Local AABB in meters in the declared frame."
      }
    ]
  },
  "transforms": [
    {
      "from": "ship-fixed",
      "to": "earth-fixed",
      "stamp": "2025-05-01T12:00:00Z",
      "valid_for_s": 5,
      "pose": {
        "t_m": [
          -2650.4,
          15.2,
          8.6
        ],
        "q_wxyz": [
          0.9239,
          0.0,
          0.3827,
          0.0
        ]
      },
      "$comment": "Pose maps FROM 'from' TO 'to'. q_wxyz follows GeoPose: [w,x,y,z], unit-norm. Use freshest transform with age ≤ valid_for_s."
    }
  ]
}

B) Mapping Service Manifest

This manifest describes a Mapping service that publishes geometry tiles for a given coverage area. It defines the service identifier, version, supported encodings, and the DDS topics used for requesting and receiving tile data. It enables clients to subscribe to live or cached geometry without ambiguity about formats or endpoints.

{
  "service_id": "svc:mapping:acme/sf-downtown",
  "version": "1.0.0",
  "provider": {
    "id": "acme-maps",
    "org": "Acme Maps Inc."
  },
  "title": "Acme Downtown Map Service",
  "summary": "Tiled 3D meshes for SF downtown area",
  "profiles": [
    "Core"
  ],
  "topics": {
    "meta": "geom.tile.meta",
    "patch": "geom.tile.patch",
    "blob": "geom.tile.blob"
  },
  "tile_scheme": "quadtree",
  "encodings": [
    "glTF+Draco",
    "LASzip"
  ],
  "lod_range": [
    12,
    18
  ],
  "coverage": {
    "$comment": "If multiple coverage elements are present, they must bound the same resource. geohash (if used) is always earth-fixed.",
    "geohash": [
      "9q8y",
      "9q8z"
    ],
    "polygon_uri": "https://cdn.acme.example/downtown_poly.geojson",
    "elements": [
      {
        "type": "bbox",
        "frame": "earth-fixed",
        "bbox": [
          -122.4195,
          37.7925,
          -122.4115,
          37.799
        ],
        "$comment": "Earth-fixed bbox uses degrees [west,south,east,north]. If crossing 180°, west may be > east."
      },
      {
        "type": "volume",
        "frame": "earth-fixed",
        "aabb": {
          "min_xyz": [
            -122.4195,
            37.7925,
            -10.0
          ],
          "max_xyz": [
            -122.4115,
            37.799,
            250.0
          ]
        },
        "$comment": "Local AABB in meters in the declared frame."
      }
    ]
  },
  "auth": {
    "scheme": "none"
  },
  "terms": {
    "license": "CC-BY-4.0"
  }
}

C) Content/Experience Manifest

This manifest describes a spatial content or experience service. It declares a content identifier, version, anchor bindings, and optional dependencies on other manifests. This allows AR applications to discover and attach experiences to shared anchors while keeping the actual content assets (e.g., 3D models, media) external to DDS.

{
  "content_id": "xp:sculpture-walk:met-foyer",
  "version": "1.0.2",
  "provider": {
    "id": "svc:content:museum-inc",
    "org": "Museum Inc."
  },
  "title": "AR Sculpture Walk",
  "summary": "Guided AR overlays for five sculptures in the main foyer.",
  "tags": [
    "ar",
    "museum",
    "tour"
  ],
  "profiles_required": [
    "Core",
    "AR+Geo"
  ],
  "availability": {
    "from": "2025-09-01T09:00:00Z",
    "until": "2025-12-31T23:59:59Z",
    "local_tz": "America/New_York"
  },
  "coverage": {
    "$comment": "If multiple coverage elements are present, they must bound the same resource. geohash (if used) is always earth-fixed.",
    "geohash": [
      "dr5ru9",
      "dr5rua"
    ],
    "polygon_uri": "https://cdn.museum.example/foyer_poly.geojson",
    "elements": [
      {
        "type": "bbox",
        "frame": "earth-fixed",
        "bbox": [
          -73.9635,
          40.7793,
          -73.9631,
          40.7796
        ],
        "$comment": "Earth-fixed bbox uses degrees [west,south,east,north]. If crossing 180°, west may be > east."
      },
      {
        "type": "volume",
        "frame": "foyer-local",
        "aabb": {
          "min_xyz": [
            -8.0,
            -12.0,
            0.0
          ],
          "max_xyz": [
            8.0,
            12.0,
            5.0
          ]
        },
        "$comment": "Local AABB in meters in the declared frame."
      }
    ]
  },
  "transforms": [
    {
      "from": "foyer-local",
      "to": "earth-fixed",
      "stamp": "2025-09-01T09:00:00Z",
      "valid_for_s": 3600,
      "pose": {
        "t_m": [
          -73.9633,
          40.7794,
          25.5
        ],
        "q_wxyz": [
          0.9239,
          0.0,
          0.3827,
          0.0
        ]
      },
      "$comment": "Pose maps FROM 'from' TO 'to'. q_wxyz follows GeoPose: [w,x,y,z], unit-norm. Use freshest transform with age ≤ valid_for_s."
    }
  ],
  "entrypoints": {
    "anchors": [
      {
        "anchor_id": "anchor/met-foyer/north-plinth",
        "hint": "Start here"
      },
      {
        "anchor_id": "anchor/met-foyer/central",
        "hint": "Checkpoint 2"
      }
    ]
  },
  "runtime_topics": {
    "subscribe": [
      "geo.tf",
      "geo.anchor",
      "geom.tile.meta",
      "geom.tile.patch"
    ],
    "optional": [
      "semantics.det.3d.set"
    ]
  },
  "assets": [
    {
      "type": "image",
      "role": "poster",
      "uri": "https://cdn.museum.example/img/poster.jpg"
    },
    {
      "type": "audio",
      "role": "narration",
      "uri": "https://cdn.museum.example/audio/room_intro.mp3",
      "lang": "en"
    }
  ]
}

D) Anchors Manifest

This manifest enumerates durable localization anchors for a zone and links them to relocalization or scene-alignment assets. Each anchor entry supplies an anchor_id, a simplified GeoPose (latitude, longitude, altitude, quaternion), and whatever metadata or asset descriptors the publisher wants to expose (timestamps, quality hints, coverage tags, etc.). Top-level fields mirror the publisher's registry structure—no default frame assumptions or cache semantics are imposed by the specification.

{
  "schema": "https://example.org/spatialdds/anchor-manifest.schema.json#v1",
  "zone_id": "knossos:palace",
  "zone_title": "Knossos Palace Archaeological Site",
  "coverage": {
    "$comment": "If multiple coverage elements are present, they must bound the same resource. geohash (if used) is always earth-fixed.",
    "geohash": [
      "sv8wkf",
      "sv8wkg"
    ],
    "elements": [
      {
        "type": "volume",
        "frame": "gallery-local",
        "aabb": {
          "min_xyz": [
            -15.0,
            -20.0,
            -2.0
          ],
          "max_xyz": [
            15.0,
            20.0,
            6.0
          ]
        },
        "$comment": "Local AABB in meters in the declared frame."
      },
      {
        "type": "bbox",
        "frame": "earth-fixed",
        "bbox": [
          25.1608,
          35.2965,
          25.1665,
          35.3002
        ],
        "$comment": "Earth-fixed bbox uses degrees [west,south,east,north]. If crossing 180°, west may be > east."
      }
    ]
  },
  "transforms": [
    {
      "from": "gallery-local",
      "to": "earth-fixed",
      "stamp": "2025-02-18T08:00:00Z",
      "valid_for_s": 600,
      "pose": {
        "t_m": [
          25.1635,
          35.298,
          112.0
        ],
        "q_wxyz": [
          0.9659,
          0.0,
          0.2588,
          0.0
        ]
      },
      "$comment": "Pose maps FROM 'from' TO 'to'. q_wxyz follows GeoPose: [w,x,y,z], unit-norm. Use freshest transform with age ≤ valid_for_s."
    }
  ],
  "anchors": [
    {
      "anchor_id": "square:statue-east",
      "geopose": {
        "lat_deg": 35.29802,
        "lon_deg": 25.16305,
        "alt_m": 110.2,
        "qw": 1,
        "qx": 0,
        "qy": 0,
        "qz": 0
      },
      "assets": [
        {
          "kind": "features:ORB:v1",
          "uri": "https://registry.example/anchors/statue-east/orb_v1.bin",
          "count": 2048,
          "descriptor_bytes": 32,
          "patch_frame": "anchor-local",
          "hash": "sha256:placeholder...",
          "bytes": 65536
        },
        {
          "kind": "geom:pcd:lod1",
          "uri": "https://registry.example/anchors/statue-east/patch_lod1.las",
          "points": 12000,
          "hash": "sha256:placeholder...",
          "bytes": 480000
        }
      ],
      "stamp": "2025-09-07T15:45:00Z"
    },
    {
      "anchor_id": "central-court:north",
      "geopose": {
        "lat_deg": 35.29761,
        "lon_deg": 25.16391,
        "alt_m": 109.8,
        "qw": 0.707,
        "qx": 0,
        "qy": 0,
        "qz": 0.707
      },
      "assets": [
        {
          "kind": "features:SuperPoint:v1",
          "uri": "https://registry.example/anchors/central-court-n/superpoint_v1.npz",
          "count": 1500,
          "descriptor_bytes": 256,
          "hash": "sha256:placeholder...",
          "bytes": 220000
        },
        {
          "kind": "geom:mesh:lod0",
          "uri": "https://registry.example/anchors/central-court-n/patch_lod0.glb",
          "triangles": 8000,
          "hash": "sha256:placeholder...",
          "bytes": 350000
        }
      ],
      "stamp": "2025-09-08T11:12:13Z"
    }
  ],
  "stamp": "2025-09-12T22:55:00Z"
}