Demo Capability Matrix
Status vocabulary:
demoed: exercised by a sample app or browser smoke lane.tested-only: covered by fixtures or unit/integration tests, but not yet surfaced in a user-facing sample.blocked: coverage depends on follow-up work outside this PR-sized slice.not-in-scope: intentionally excluded from the current demo harness, usually because it is platform/tooling behavior rather than app UX.
This matrix tracks demo coverage for issue #70. The implementation-level
protocol defaults stay in docs/protocol-capability-matrix.md; this document
answers where a reviewer can see or smoke each capability.
Seeded Honua Cloud demo service promotion for issue #128 is tracked in
docs/honua-cloud-demo-services.md and the
shared manifest at
examples/cloud-demo-services.json.
Matrix
| Capability | Sample app(s) | Fixture/test(s) | Smoke command(s) | Status | Gaps / notes |
|---|---|---|---|---|---|
| Service discovery | examples/maplibre-quickstart, examples/realtime-incident-dashboard, examples/node-backend-quickstart, examples/service-explorer |
test/server-compatibility.test.ts, test/node-backend-quickstart.test.ts, test/service-explorer-workspace.test.ts, test/integration-harness.test.ts, test/integration/surfaces/*.integration.ts |
npm run demo:node-backend:smoke; npm run test:playwright:service-explorer; npm run test:integration |
demoed | Service explorer now foregrounds a standards source picker across every SDK protocol identifier — Honua gRPC, FeatureServer, MapServer, ImageServer, Geometry Service, GP Service, OGC API Features/Tiles/Maps/Records, STAC, WFS, WMS, WMTS, OData, and MapLibre vector/raster/GeoJSON — grouped by protocol family with fixture fallback, while browser demos continue to consume configured endpoints. |
| Metadata | examples/maplibre-quickstart, examples/realtime-incident-dashboard, examples/kepler-analytics, examples/service-explorer |
test/quickstart-data.test.ts, test/kepler-analytics-refresh-fixture.test.ts, test/service-explorer-workspace.test.ts, test/integration/surfaces/feature-server.integration.ts |
npm test -- test/quickstart-data.test.ts test/kepler-analytics-refresh-fixture.test.ts test/service-explorer-workspace.test.ts |
demoed | Metadata is demoed through fixture manifests, standards source capability/cache badges, and integration probes. |
| FeatureServer | examples/maplibre-quickstart, examples/realtime-incident-dashboard, examples/node-backend-quickstart |
test/feature-layer-compat.test.ts, test/query-compat.test.ts, test/node-backend-quickstart.test.ts, test/integration/surfaces/feature-server.integration.ts |
npm run demo:quickstart:build; npm run demo:node-backend:smoke; npm run test:integration; npm run test:cloud-demo:config |
demoed | Feature query, counts, object ids, edits-adjacent fixtures, and metadata are represented. Issue #128 adds a seeded cloud manifest for read-only FeatureServer samples and a guarded writable service contract. |
| MapServer | examples/service-explorer, test/fixtures/esri-map-image-layer-app, test/fixtures/esri-dynamic-map-app |
test/map-image-layer-compat.test.ts, test/service-explorer-workspace.test.ts, test/playwright/service-explorer.spec.mjs, test/integration/surfaces/map-server.integration.ts |
npm run test:playwright:service-explorer; npm test -- test/map-image-layer-compat.test.ts test/service-explorer-workspace.test.ts |
demoed | Service explorer exposes MapServer as a render/export/find-style lane with table/query controls disabled and cache semantics documented. |
| ImageServer | examples/imagery-cog-quickstart, examples/terrain-rgb-elevation, test/fixtures/esri-map-image-layer-app |
test/imagery-cog-quickstart.test.ts, test/terrain-rgb-elevation.test.ts, test/playwright/imagery-cog-quickstart.spec.mjs, test/playwright/terrain-rgb-elevation.spec.mjs, test/integration/surfaces/image-server.integration.ts, test/contract/geoservices-conformance.test.ts |
npm run demo:imagery-cog:build; npm run demo:terrain-elevation:build; npm run test:playwright:terrain-elevation |
demoed | COG-backed ImageServer tile and exportImage paths are visible in the imagery quickstart; Terrain-RGB tiles plus elevation value/profile proof are visible in the terrain sample. Live seeded coverage can be promoted through #70. |
| Geometry Service | examples/storytelling-25d-map, examples/geoprocessing-job-runner, test/fixtures/esri-geometry-primitives-app |
test/geometry-primitives-compat.test.ts, test/geometry-symbol-compat.test.ts, test/geoprocessing-job-runner.test.ts, test/integration/surfaces/gp-server.integration.ts |
npm run demo:25d:build; npm run demo:gp-runner:build; npm test -- test/geometry-primitives-compat.test.ts test/geoprocessing-job-runner.test.ts |
demoed | The job runner builds geometry buffer/intersect steps into a geospatial-grpc execution plan and materializes linked result layers; live GeometryServer seed coverage remains #128/#66 follow-up. |
| GP/OGC Processes | examples/geoprocessing-job-runner |
test/process-runner.test.ts, test/geoprocessing-job-runner.test.ts, test/contract/ogc-processes.test.ts, test/contract/geoprocessing-job-run.test.ts, test/integration/surfaces/ogc-processes.integration.ts, test/integration/surfaces/gp-server.integration.ts |
npm run demo:gp-runner:build; npm run test:playwright:gp-runner; npm test -- test/process-runner.test.ts test/geoprocessing-job-runner.test.ts test/contract/ogc-processes.test.ts test/contract/geoprocessing-job-run.test.ts |
demoed | HonuaProcessRunner now normalizes OGC API Processes, GeoServices REST GPServer, and honua-io/geospatial-grpc ProcessService clients onto IJobRun; the sample covers progress, cancellation, unsupported capability, materialized output, and linked workspace sync. |
| OGC Features | examples/maplibre-quickstart, examples/node-backend-quickstart |
test/contract/ogc-conformance.test.ts, test/contract/exploration.test.ts, test/node-backend-quickstart.test.ts, test/integration/surfaces/ogc-features.integration.ts |
npm run demo:quickstart:build; npm run demo:node-backend:smoke; npm run test:integration |
demoed | Quickstart uses canonical feature exploration; the Node backend sample also exposes an OGC API Features items route. |
| OGC Tiles | examples/maplibre-quickstart, examples/storytelling-25d-map |
test/contract/ogc-tiles.test.ts, test/integration/surfaces/ogc-tiles.integration.ts, test/tile-layer-compat.test.ts |
npm run demo:quickstart:build; npm run demo:25d:build |
demoed | Tile rendering is visible through MapLibre/Cesium lanes; styled OGC tile variants remain weak and should be tracked under #60. |
| OGC Maps | examples/maplibre-quickstart, examples/service-explorer |
test/contract/ogc-maps.test.ts, test/service-explorer-workspace.test.ts, test/integration/surfaces/ogc-maps.integration.ts |
npm run test:playwright:service-explorer; npm test -- test/contract/ogc-maps.test.ts; npm run test:integration |
demoed | Service explorer toggles OGC Maps as a distinct render-only source with disabled table/query affordances. |
| WFS | examples/service-explorer |
test/contract/wfs.test.ts, test/service-explorer-workspace.test.ts, test/playwright/service-explorer.spec.mjs |
npm run test:playwright:service-explorer; npm test -- test/contract/wfs.test.ts test/service-explorer-workspace.test.ts |
demoed | Service explorer projects WFS GetFeature-style records into the same linked map/table/chart/filter/detail context as FeatureServer. |
| WMS | examples/imagery-cog-quickstart, test/fixtures/esri-map-image-layer-app |
test/imagery-cog-quickstart.test.ts, test/playwright/imagery-cog-quickstart.spec.mjs, test/contract/wms.test.ts, test/wms-capabilities.test.ts, test/integration/surfaces/wms.integration.ts |
npm run demo:imagery-cog:build; npm run test:playwright:imagery-cog |
demoed | WMS GetMap is rendered through the runtime raster source helper; broader standards source picking remains in #62 and #70. |
| WMTS | examples/service-explorer, test/fixtures/esri-tile-layer-app |
test/contract/wmts.test.ts, test/service-explorer-workspace.test.ts, test/playwright/service-explorer.spec.mjs, test/integration/surfaces/wmts.integration.ts, test/tile-layer-compat.test.ts |
npm run test:playwright:service-explorer; npm test -- test/contract/wmts.test.ts test/tile-layer-compat.test.ts; npm run test:integration |
demoed | Service explorer exposes WMTS as a render-only standards source and validates disabled feature-table/query behavior. |
| STAC | examples/kepler-analytics |
test/contract/stac.test.ts, test/kepler-analytics-refresh-fixture.test.ts, test/playwright/kepler-analytics-fixture.spec.mjs |
npm run demo:kepler:build; npm run demo:kepler:smoke |
demoed | Kepler fixtures represent materialized STAC-like analytics outputs; live STAC source discovery remains a #63 follow-up. |
| OData | examples/service-explorer |
test/contract/odata-conformance.test.ts, test/composition.test.ts, test/service-explorer-workspace.test.ts |
npm run test:playwright:service-explorer; npm test -- test/contract/odata-conformance.test.ts test/composition.test.ts test/service-explorer-workspace.test.ts |
demoed | Service explorer includes an OData entity-set lane with metadata/cache semantics and linked table exploration. |
| MCP | None | mcp/package.json, test/split-packages.test.ts |
npm run verify:split-packages |
blocked | MCP packaging exists, but there is no demo harness command in the root scripts. A sample MCP workflow is a follow-up for #65 and #70. |
| Migration | test/fixtures/esri-demo-feature-table-relates-app, test/fixtures/esri-real-sample-incident-command-app |
test/migration-cli-demo.test.ts, test/migration-runtime-matrix.test.ts, test/migration-real-sample-runtime.test.ts, test/playwright/migration-browser-smoke.spec.mjs |
npm run demo:migration:featuretable; npm run test:playwright:migration |
demoed | FeatureTable and real-sample migration lanes are demoable; broader real-sample inventory remains under #73 and #74. |
| Auth/interceptors | examples/node-backend-quickstart, test/fixtures/esri-request-app, test/fixtures/esri-oauth-app |
test/node-backend-quickstart.test.ts, test/request-interceptors.test.ts, test/oauth-identity-compat.test.ts, test/esri-request-compat.test.ts, test/esri-config-compat.test.ts |
npm run demo:node-backend:smoke; npm test -- test/request-interceptors.test.ts test/oauth-identity-compat.test.ts |
demoed | Node backend quickstart keeps API key and service-account credentials in the server process and logs SDK request interceptor spans without exposing secrets. |
| Retries/timeouts | examples/node-backend-quickstart |
test/node-backend-quickstart.test.ts, test/retry-jitter.test.ts, test/abort-signal.test.ts, test/response-timing.test.ts, test/integration-diagnostics.test.ts |
npm run demo:node-backend:smoke; npm test -- test/retry-jitter.test.ts test/abort-signal.test.ts test/response-timing.test.ts |
demoed | Node backend quickstart configures SDK timeout and retry options, and its fixture test forces a transient upstream 503 through the retry lane. |
| Attachments | examples/edit-workflow-demo, test/fixtures/esri-demo-feature-table-relates-app |
test/edit-workflow-demo.test.ts, test/playwright/edit-workflow-demo.spec.mjs, test/feature-table-compat.test.ts, test/feature-form-compat.test.ts, test/migration-feature-table-demo-runtime.test.ts |
npm run demo:edit-workflow:build; npm run test:playwright:edit-workflow; npm run demo:migration:featuretable |
demoed | The edit workflow sample stages attachment add/delete mutations in the same edit session and surfaces partial attachment failures; live upload/download coverage still depends on seeded writable Honua Cloud services in #55 and #73. |
| Related records | test/fixtures/esri-demo-feature-table-relates-app, test/fixtures/esri-related-features-app, test/fixtures/esri-feature-table-relates-app |
test/feature-table-compat.test.ts, test/table-list-compat.test.ts, test/migration-feature-table-demo-runtime.test.ts |
npm run demo:migration:featuretable; npm test -- test/table-list-compat.test.ts |
demoed | Related-record navigation is the primary FeatureTable migration demo path; issue #74 should broaden real-sample scenarios. |
| Edits | examples/edit-workflow-demo, test/fixtures/esri-real-sample-editing-app, test/fixtures/esri-feature-form-app |
test/edit-workflow-demo.test.ts, test/contract/edit-session.test.ts, test/playwright/edit-workflow-demo.spec.mjs, test/editor-compat.test.ts, test/feature-form-compat.test.ts, test/contract/wfs.test.ts |
npm run demo:edit-workflow:build; npm run test:playwright:edit-workflow; npm test -- test/edit-workflow-demo.test.ts test/contract/edit-session.test.ts; npm run test:cloud-demo:config |
demoed | The edit workflow sample demonstrates metadata-backed forms, create/update/delete, sketch dirty state and undo/redo, annotation persistence hooks, optimistic UI apply/commit/rollback hooks, normalized conflict errors, version hints, unsupported capability states, and attachment lifecycle staging. Issue #128 defines the guarded writable cloud service env, write-token, and reset-token contract while live write wiring remains #73 follow-up. |
| Style/runtime | examples/maplibre-quickstart, examples/storytelling-25d-map, examples/kepler-analytics |
test/style.test.ts, test/runtime/runtime.test.ts, test/storytelling-25d-map.test.ts, test/kepler-analytics-refresh-fixture.test.ts |
npm run demo:quickstart:build; npm run demo:25d:build; npm run demo:kepler:build |
demoed | Runtime styles, layer projections, and app-specific theming are covered across all three first-party demos. |
| Generated app preview runtime | None | test/generated-app-runtime.test.ts, test/fixtures/generated-app/operations-dashboard-app-package.v1.json, test/fixtures/generated-app/operations-dashboard-map-package.v1.json, test/fixtures/generated-app/operations-dashboard-features.v1.json |
npm test -- test/generated-app-runtime.test.ts |
tested-only | @honua/sdk-js/generated-app covers the versioned manifest/profile, BuildSpec / AppPackage / MapPackage projections, map/table/count/chart/filter render models, linked interactions, manifest-level map layerId fallback, partial-load map disposal, and structured preview diagnostics. Lifecycle telemetry events are documented in docs/generated-app-runtime.md; promotion to demoed needs a Portal or browser host harness. |
| Studio package contracts | None | test/studio/studio-contracts.test.ts |
npm test -- test/studio/studio-contracts.test.ts; npm run verify:split-packages |
tested-only | @honua/sdk-js/studio projects the query/analysis/map/dashboard/report/form/app/workflow/GP/ETL package families and unifies them behind the { valid, diagnostics, pkg? } StudioPackageValidationResponse<T> envelope (fromMapPackageValidation bridges the existing ValidateMapPackageResult unchanged), a capability manifest, and publish/share/embed contracts. The barrel is MCP/QGIS-safe — a source scan asserts it never imports MapLibre/DOM or Console-coupled modules. Map/dashboard/app reuse the established SDK-native shapes; the other families are experimental stubs pending server contracts. See docs/studio-package-contracts.md; promotion to demoed needs a Console/MCP host harness. |
| Webmap conversion | test/fixtures/esri-webmap-app |
test/webmap-parse.test.ts, test/webmap-convert-renderer.test.ts, test/webmap-convert-symbol.test.ts, test/webmap-convert-extent.test.ts, test/web-map-compat.test.ts |
npm test -- test/webmap-parse.test.ts test/web-map-compat.test.ts |
tested-only | Conversion coverage is fixture-heavy; a before/after browser sample remains a #74 follow-up. |
| Geocoding | examples/geocoding-quickstart, test/fixtures/esri-route-task-app |
test/geocoding.test.ts, test/geocoding-quickstart.test.ts, test/search-compat.test.ts, test/route-task-compat.test.ts, test/playwright/geocoding-quickstart.spec.mjs |
npm run demo:geocoding:build; npm run test:playwright:geocoding; npm test -- test/geocoding.test.ts test/geocoding-quickstart.test.ts test/search-compat.test.ts |
demoed | The geocoding quickstart demonstrates forward geocoding, reverse lookup from a clicked map point, and typeahead through first-class HonuaGeocodingClient methods with a same-origin fixture lane. |
| Telemetry/diagnostics | examples/maplibre-quickstart, examples/storytelling-25d-map, examples/realtime-incident-dashboard, examples/node-backend-quickstart |
test/node-backend-quickstart.test.ts, test/integration-diagnostics.test.ts, test/integration-reporter.test.ts, test/response-timing.test.ts |
npm run demo:node-backend:smoke; npm test -- test/integration-diagnostics.test.ts test/integration-reporter.test.ts |
demoed | Demo apps emit local telemetry modules, the Node backend emits structured JSON request logs, and integration diagnostics persist failures for CI triage. |
| Metadata caching | examples/maplibre-quickstart, examples/kepler-analytics, examples/imagery-cog-quickstart, examples/edit-workflow-demo, examples/service-explorer |
test/quickstart-config.test.ts, test/kepler-analytics-refresh-fixture.test.ts, test/imagery-cog-quickstart.test.ts, test/edit-workflow-demo.test.ts, test/service-explorer-workspace.test.ts, test/contract/odata-conformance.test.ts, test/cloud-demo-services.test.ts |
npm run demo:edit-workflow:build; npm run test:playwright:service-explorer; npm test -- test/quickstart-config.test.ts test/kepler-analytics-refresh-fixture.test.ts test/imagery-cog-quickstart.test.ts test/edit-workflow-demo.test.ts test/service-explorer-workspace.test.ts; npm run test:cloud-demo:config |
demoed | Cache note: metadata should be cached per source/config version for app startup, source picking, form/domain rendering, WFS/WMTS/OGC/OData metadata negotiation, and MapServer style/legend discovery. Issue #128's cloud demo manifest preserves that metadata boundary while realtime state, edit submissions, writable resets, and ad hoc spatial requests stay uncached. Weak cross-protocol cache invalidation remains under #63, #64, and #70. |
| Realtime/live data | examples/realtime-incident-dashboard |
test/realtime.test.ts, test/realtime-incident-dashboard.test.ts, test/playwright/realtime-incident-dashboard.spec.mjs, test/cloud-demo-services.test.ts |
npm run demo:incident:build; npm run test:playwright:incident; npm run test:cloud-demo:config |
demoed | Realtime note: the incident operations dashboard is live-data by default and must not be treated as a static dashboard. Issue #128 records the seeded SSE stream URL env and states that the realtime stream is the feature-state authority. Follow #70 for harness-level status badges. |
| Unified operational workspace | examples/unified-ops-workspace |
test/unified-ops-workspace.test.ts, test/playwright/unified-ops-workspace.spec.mjs |
npm run demo:unified-ops:build; npm run test:playwright:unified-ops |
demoed | Composition note: incident command and analysis review share one app workspace, linked-view context, realtime record store, reviewable AI/MCP drafts, and saved snapshot diagnostics with fixture-backed data. |
| Materialized outputs | examples/kepler-analytics, test/fixtures/honua-25d-demo |
test/kepler-analytics-refresh-fixture.test.ts, test/storytelling-25d-data.test.ts, test/quickstart-data.test.ts |
npm run demo:kepler:refresh-fixture; npm run demo:kepler:build |
demoed | Materialized note: analytics and 2.5D fixtures are generated snapshots used for deterministic demos; provenance refresh belongs with #63 and #74. |
| Indexed spatial aggregation | examples/spatial-analytics-workbench |
test/spatial-aggregation-contract.test.ts, test/spatial-analytics-workbench.test.ts, test/fixtures/spatial-aggregation/indexed-summary.v1.json, test/playwright/spatial-analytics-workbench.spec.mjs |
npm run demo:spatial-analytics:build; npm run test:playwright:spatial-analytics; npm test -- test/spatial-aggregation-contract.test.ts test/spatial-analytics-workbench.test.ts |
demoed | Contract and browser coverage include category, histogram, count, sum, avg, grouped summaries, viewport/spatial filters, zoom/index resolution, opaque H3/Quadbin-style index metadata, widget metadata, heat/grid cells, and progressive loading. Live Honua Cloud execution remains a #66 server/platform follow-up. |
| Warehouse analytics sources | examples/spatial-analytics-workbench |
test/contract/analytics-sources.test.ts, test/contract/query-tiles.test.ts, test/runtime/query-tiles.test.ts, test/fixtures/spatial-aggregation/indexed-summary.v1.json |
npm test -- test/contract/analytics-sources.test.ts test/contract/query-tiles.test.ts test/runtime/query-tiles.test.ts test/spatial-aggregation-contract.test.ts |
tested-only | Provider-neutral table/query/tileset and H3/Quadbin descriptors are covered with cache keys, pushdown/degraded reasons, widget cache identity, query-tile integration, and spatial aggregation metadata. Production warehouse execution remains a server/platform follow-up under #66. |
| Uncached ad hoc spatial requests | examples/maplibre-quickstart, examples/storytelling-25d-map |
test/spatial-filter.test.ts, test/query-builder.test.ts, test/query-builder-variants.test.ts, test/batch-query.test.ts |
npm test -- test/spatial-filter.test.ts test/query-builder.test.ts test/query-builder-variants.test.ts |
tested-only | Ad-hoc note: bbox, intersects, and user-driven spatial filters must execute uncached because they depend on viewport and interaction state. Browser smoke expansion is tracked in #70. |
Follow-up Index
- #55: seeded live FeatureServer and writable service coverage.
- #56: browser sample controls for service choice, auth, search, and MapServer/WMS/WMTS surfacing.
- #57: ImageServer imagery seed and demo affordances.
- #58: Geometry Service and GPServer live fixtures.
- #59: OGC Processes job-run sample.
- #60: OGC render surface polish for Tiles and Maps.
- #62: WFS/WMS/WMTS standards source picker.
- #63: STAC and materialized analytics provenance.
- #64: OData metadata and cache demo.
- #65: MCP sample harness command.
- #68: edit workflow, form, conflict, and attachment lifecycle coverage.
- #70: coordinating demo capability matrix and sample harness.
- #73: real editing, attachments, and writable fixture coverage.
- #74: migrated real-sample breadth, webmap conversion sample, and related-record scenarios.
- #128: seeded Honua Cloud demo services, realtime stream authority, guarded writable reset safeguards, and cloud smoke env.