SDK 1.0 execution plan

Status: Proposed execution baseline

Owner: honua-io/honua-sdk-js

Parent workstream: Universal geospatial application kernel

Last reviewed: 2026-07-13

Decision

Honua SDK JS will compete as the most trustworthy open geospatial application kernel, not as another renderer or a class-for-class ArcGIS clone. The 1.0 program therefore optimizes for semantic correctness, capability honesty, explainable execution, conformance, and a short first-use workflow before it adds more protocols, render effects, application shells, or agent APIs.

The product front door is one lifecycle-owned workflow:

const honua = createHonua();
const connection = await honua.connect(url);
const source = await connection.source();
const plan = await connection.explain(source.query({ where }));
const result = await connection.query(plan);
const mounted = await connection.mount(result, map);

await mounted.dispose();
await connection.dispose();
await honua.dispose();

The exact fluent syntax is owned by the child API issue. The invariant is that connect, inspect, explain, query, mount, cancellation, diagnostics, and cleanup form one coherent path. Focused subpaths remain available for advanced use.

Product boundary

Honua owns:

Honua does not own:

Competitive posture

This decision table records product-boundary evidence verified from official sources on 2026-07-13. It is not an evergreen feature-score claim: #499 owns versioned competitor evidence, expiry, and reproducible comparison methodology.

Alternative Verified official position Honua decision
ArcGIS Maps SDK for JavaScript 5.1 A vertically integrated 2D/3D renderer, component/UI, analysis, and layer SDK. Its layer inventory includes OGC Features, WFS, WMS, WMTS, and beta GeoParquet. Widgets were deprecated at 5.0, but Esri says existing widget applications continue on 5.x and component migration does not replace the core API. Release notes, migration guide, layer inventory Compete for vendor-neutral execution and the widget/AMD-dependent modernization decision. Integrate only at migration and compatibility boundaries; do not chase SceneView, its component catalog, or renderer parity.
MapLibre GL JS 5.x An extensible GPU renderer with 2D, globe, terrain, extrusions, custom 3D layers, custom protocols, and an established plugin ecosystem. Product, addProtocol, plugins Default renderer integration. Honua owns the coherent discovery/query/plan/fidelity/lifecycle layer, not MapLibre rendering or every adjacent control.
OpenLayers 10.9 A renderer and source/format toolkit with arbitrary projections and raster reprojection, WFS 2.0 transaction serialization, and OGC API tile sources. WFS, OGC map tiles, reprojection Do not duplicate its renderer or format library. Use a non-Web-Mercator OpenLayers plugin as the external certification proof for the renderer seam; first-party support remains adoption-gated.
deck.gl A large-data GPU visualization framework whose layers accept async iterables and direct binary attributes and whose MapLibre bridge has interleaved, overlaid, and reverse-controlled modes. Layer data, MapLibre integration Integrate through bounded GeoArrow/binary batches and explicit device/fallback diagnostics. Do not create another GPU layer framework.
CesiumJS An open high-precision WGS84 globe with 3D Tiles, terrain/imagery, models, and time-dynamic/4D visualization. CesiumJS Optional renderer for 3D Tiles, precision, and deep temporal workflows. Do not chase Cesium renderer parity; depth remains conditional on an adopter.
@esri/arcgis-rest-js A lightweight modular ArcGIS-only service client with authentication, feature query/edit, portal, geocoding, routing, elevation, and documented interoperability with multiple renderers. Introduction, API reference Direct competitor for ArcGIS-only headless access. Document coexistence and migration; differentiate on cross-protocol semantics, capability truth, and explainable planning rather than importing it.
DuckDB Spatial / GDAL DuckDB supplies Parquet filter/projection pushdown and spatial SQL; its WebAssembly client defaults to one thread and has a 4 GB address-space ceiling. GDAL is the broad raster/vector translation engine used by DuckDB's ST_Read. Parquet, Wasm limits, spatial functions, GDAL Treat DuckDB as one optional, capability-observed execution engine and GDAL as server/CLI preparation infrastructure. Do not attempt browser-GDAL breadth or silently exceed worker limits.

Target architecture

createHonua() lifecycle and policy owner
  |
  +-- connect(url) -> inspect -> SourceDescriptor
  |                    |
  |                    +-- claimed / observed / effective capabilities
  |
  +-- typed semantic query -> deterministic plan -> execute
  |                              |
  |                              +-- protocol pushdown
  |                              +-- bounded worker/columnar residuals
  |                              +-- cache, cost, fidelity, provenance
  |
  +-- Result | AsyncIterable<ResultBatch> | tiles
  |                              |
  |                              +-- MapLibre adapter (default)
  |                              +-- deck.gl adapter (large data)
  |                              +-- Cesium adapter (optional 3D)
  |
  +-- migration, CLI, MCP, React, and app packages consume the same contracts

Layer invariants

  1. contract, expr, planner, and protocol descriptors remain DOM- and renderer-free.
  2. Canonical schema and geometry types do not import Esri types. Esri JSON and SQL remain supported dialects at adapter boundaries.
  3. A query never changes meaning because its source protocol changes. Dialect strings are named escape hatches, not the common where contract.
  4. Unsupported and degraded behavior is explicit. Unknown geometry, CRS, capability, or fidelity never receives a plausible invented default.
  5. Descriptors and plans serialize deterministically using JSON-safe values.
  6. First-party protocols use the same versioned module seam offered to third-party plugins.
  7. Heavy peers and workers remain lazy, optional, abortable, and disposable.

Canonical contracts to settle before 1.0

Schema, geometry, and CRS

Typed query and CQL2 interchange

Capability truth and planning

Errors and diagnostics

Every public error participates in one tagged SDK error contract containing:

Execution rules for agent-sized issues

Leaf issues must be executable without reconstructing product intent.

Execution waves

Wave 0 — restore truth

Work in this wave may run in parallel and is the only work eligible for roadmap:now until trunk and release gates are green.

  1. Restore the integration package-resolution lane and add installed-package regression coverage.
  2. Correct fail-open spatial behavior and ambiguous approximation naming.
  3. Reconcile stable, experimental, deprecated, and removed surfaces for the next published beta.
  4. Establish one generated capability/support manifest for package docs, protocol docs, examples, and the public site.
  5. Groom completed epics: attach evidence, create residual issues, and reopen any epic whose gating acceptance remains unmet.

Exit gate: trunk and release PR checks are green; npm and hosted docs describe the same supported package; no roadmap:now issue is larger than M.

Wave 1 — settle semantic foundations

  1. Vendor-neutral schema, geometry, CRS, locator, and serializable descriptor contracts.
  2. Typed predicate/query AST with CQL2 JSON interchange.
  3. Claimed/observed/effective capability negotiation.
  4. Deterministic explain plan with cost, fidelity, cache, and provenance.
  5. Unified SDK error and diagnostic envelope.
  6. Schema inspection and TypeScript type generation.

Exit gate: the same typed fixture query has equivalent meaning through GeoServices, OGC/CQL2, WFS/FES, and OData compilers, with explicit unsupported results where a dialect cannot preserve it.

Wave 2 — make the kernel and adapters dogfood the design

  1. Implement createHonua() lifecycle ownership and connect(url, options?).
  2. Add connection-level inspect, query, explain, mount, cancellation, and disposal.
  3. Define the first-party protocol module seam and migrate one adapter as the reference implementation.
  4. Migrate remaining adapters in protocol-family issues.
  5. Replace raw-fetch live smoke with real SDK connect/inspect/query journeys and official conformance-class evidence.

Exit gate: every first-party adapter uses the module seam or has a documented and dated exception; the golden workflow runs from a packed installation in Node and a browser.

Wave 3 — scale without losing semantics

  1. Arrow/GeoArrow-compatible result batches and bounded object conversion.
  2. Worker-safe filtering, projection, reprojection, aggregation, cancellation, backpressure, progress, and disposal.
  3. A zero-copy or bounded-copy deck.gl route.
  4. Direct STAC/COG, PMTiles, and GeoParquet execution without mandatory GeoJSON materialization.
  5. Realtime snapshot-plus-delta production hardening when the incident workflow is a committed design-partner path.

Exit gate: published point, line, and polygon benchmarks at 100k and one million features meet explicit transfer, memory, startup, and frame-rate budgets.

Wave 4 — adoption and conditional depth

  1. Complete the canonical sample portfolio below.
  2. Measure ArcGIS migration exact/assisted/manual outcomes over a representative application corpus.
  3. Complete external package/listing distribution after the published beta is coherent.
  4. Advance offline editing only after server cursor/conflict contracts exist.
  5. Advance Cesium beyond Beta only with a real 3D adopter and vertical/temporal correctness evidence.
  6. Keep MCP/NL execution experimental until it consumes the stable planner and passes end-to-end certification.

Live execution backlog

The GitHub hierarchy is the operational projection of this design:

Native GitHub parent/sub-issue relationships, milestone assignment, and labels are authoritative for execution state. This document remains authoritative for the architecture, sequencing rules, and product boundary.

Canonical demo and sample portfolio

At the planning baseline, the previous catalog was valuable but too broad for a coherent learning path: 31 executables included 11 flagships, ten advanced apps, six recipes, and four references. Only five were recognized by the separate flagship-evidence index, and only 14 were marked keep; the rest were marked merge, rework, replace, or retire. That fragmentation drove the portfolio redesign below.

Catalog v2 now inventories 34 executable examples: 15 recipes, 17 labs, and two fixtures. It reserves the seven canonical journeys below, but deliberately qualifies zero as golden until the runner, fixture, live-evidence, and quality gates in #541 and #542 pass. The repository still maintains many sample-specific Vite and TypeScript configurations, mock servers, stylesheets, and more than one hundred demo scripts to consolidate.

The catalog will use four unambiguous tracks:

Public navigation will emphasize seven golden workflows:

Golden workflow Existing sources to consolidate Product proof
First map in five minutes maplibre-quickstart, standalone-quickstart, endpoint-to-map URL discovery, query, explain, MapLibre mount, diagnostics
Universal service explorer service-explorer, runtime-parity-showcase Protocol detection, capability truth, supported/degraded controls
Planning and permitting planning-permitting-workbench, edit-workflow-demo, sketch-editing, geocoding-quickstart Task-oriented query, forms, editing, attachments, spatial analysis
Realtime incident operations realtime-incident-dashboard Live snapshot/delta, reconnect, ordering, cache/render reconciliation
Imagery, catalog, and terrain imagery-cog-quickstart, stac-imagery-browser, terrain-rgb-elevation, storytelling-25d-map STAC discovery, COG/raster, terrain and explicit fidelity
Large-data spatial analytics spatial-analytics-workbench, overture-geoparquet, kepler-analytics Planner, GeoParquet/GeoArrow, aggregation, deck.gl-scale rendering
ArcGIS migration workbench migration-workbench, arcgis-source-app, migration fixtures Scan, transform, report, exact/assisted/manual outcome

Focused recipes remain for Node, React, OAuth, PMTiles, geocoding, sketching, process execution, and temporal playback. AI/MCP, offline, and Cesium samples are clearly labeled labs until the underlying capability graduates.

Sample quality contract

Every supported public sample must:

  1. demonstrate one primary user outcome and no more than three secondary capabilities;
  2. consume the public SDK workflow instead of reimplementing it with raw fetch;
  3. have a deterministic credential-free fixture lane;
  4. have a live lane when it makes a live-data claim, with provenance, freshness, latency, and an honest skip/degradation reason;
  5. display data mode, endpoint identity, support tier, and degradation status;
  6. cover the happy path and one unsupported/failure path in browser smoke;
  7. produce zero unexpected console errors and pass accessibility, CSP, responsive layout, attribution, and secret-scanning gates;
  8. compile every published snippet against the advertised package version;
  9. build against both repository source and the packed SDK artifact;
  10. keep the SDK call being taught in a small, inspectable src/workflow.ts;
  11. reuse SDK-owned sample infrastructure without making that infrastructure a public application framework;
  12. publish a machine-readable evidence record usable by the SDK docs and honua.io/samples.

Shared sample infrastructure

An internal examples/_kit layer may own only sample concerns:

It must not own GIS contracts, application state semantics, a public component library, or runtime behavior that belongs in the SDK.

A single runner replaces most sample-specific package scripts:

npm run sample -- list
npm run sample -- <sample-id> dev
npm run sample -- <sample-id> verify
npm run sample -- golden verify
npm run sample -- <sample-id> evidence

Fixture packs carry stable dataset identity, schema, CRS, extent, counts, checksums, license, attribution, provenance, a frozen clock, seeded identifiers, and a reviewable refresh procedure. A modular fixture server supplies named happy, empty, unsupported, pagination, retry, disconnect, stale-cursor, duplicate-event, conflict, schema-drift, and range-request scenarios. Fixture mode blocks non-local network access.

Backlog operating policy

Required closure evidence

Each implementation issue ends with a comment containing:

## Closure evidence

- Commit/PR:
- Acceptance criteria checked:
- Focused tests:
- Required full gates:
- Docs/examples updated:
- Capability or API manifest impact:
- Performance/bundle impact:
- Residual issues: None | <links>

An agent that cannot provide this evidence leaves the issue open and reports the blocking condition. Passing a narrower test slice is not evidence that an epic is complete.

Program success measures