Roadmap
DRAFT (no oracle yet; a plan without enforcement is draft material). The three standing decisions are recorded at the bottom.
Thesis
Section titled “Thesis”The Rust estate compounds because kits were extracted from real suites and
core is earned by exact consumer pins. The web estate inherits that loop:
each phase exists to produce one deployed suite that pins kits and forces
the next extraction.
Phase 0: consolidation
Section titled “Phase 0: consolidation”DONE (2026-11-01). All items closed; exit criterion met:
- CI green on GitHub (
web+wasmjobs). json-envelope#5carries the canonical fixture (merge pending).search-wasmartifact builds;@est/search-wasmregistered, version-locked.astro checkin the apps’ build verb; smoke oracle incontract.- Deployed: https://web-estate-directory.pages.dev (Cloudflare Pages).
@est/errcode,@est/envelope,@est/searchgraduated tocore: published suite, exact pins, audit-verified.
Phase 1: the fetch bridge
Section titled “Phase 1: the fetch bridge”DONE (2026-11-01), exit criterion met:
@est/fetchkitshipped and fixture-pinned: backoff mirrored fromretry-backoff(same defaults, cap, jitter bound), strict envelope decoding, wire codes in crateas_strform, loopback integration tests over real HTTP.apps/directory-api: Cloudflare Worker serving envelope responses, running@est/searchserver-side over@est/directory-data; CORS allowlisted to the site origin.- Live round trip: the deployed directory’s search island queries the
deployed API through
@est/fetchkit(live-first, local index fallback); the result count renders alive apichip when the wire answered. - Exit:
fetchkitpinned exactly by the deployed suite;coreclaim available at the next registry audit.
Cache semantics are deferred to @est/cachekit (SC-1: one concern).
Phase 2: state + platform services
Section titled “Phase 2: state + platform services”DONE (2026-11-04): flags, i18n, crdt, otel shipped; fetchkit/flags/i18n/money
graduated to core via the deployed ledger’s pins. Extraction wave 2 also
shipped: @est/islands, @est/deploy-targets, @est/math (fixture-driven
extractions from the starlight family; see the Extraction page). @est/ws
stays deferred until an app defines a WS message contract.
Remaining: a flagsd-compatible deployment consuming @est/flags at scale
(the flags-edge worker covers the ledger today). Span export shipped:
the ledger emits W3C-traceparent correlations and OTLP-JSON spans to the
directory-api POST /api/traces route (live, CORS-enabled).
STARTED (2026-11-01):
@est/flagsshipped and fixture-pinned: mirrors flagsd’s evaluate route ({name, enabled}), fail-closed policy (defaults[name] ?? falsewhen flagsd is unreachable), subject serialization (user,org). Transport inherits@est/fetchkit.fetchJsonWithMeta(flagsd predates envelopes; one retry implementation, no duplication).@est/fetchkitgrew the decode-agnostic raw-JSON path for pre-envelope services.@est/i18nshipped and fixture-pinned: mirrorsi18n-kit’s locale normalization (BCP 47 casing rules), catalog, plural suffixes (zero/one/other), translator fallback chain (exact locale -> primary language -> default when languages differ -> key), and{placeholder}interpolation (unmatched slot -> empty, unclosed brace stays literal). One catalog object serves every locale; apps embed it.
Pending, in order:
| Kit | Rust mirror | Fixtures |
|---|---|---|
@est/i18n | i18n-kit | shared message catalogs |
@est/ws | ws-kit / ws-barbican | identical message envelopes |
@est/crdt | crdts-kit (wasm) | ops and merge cases |
@est/otel | otelkit | attribute and naming tables |
Exit for the phase: a deployed suite consumes flags (the directory gains a feature-flagged surface pointed at a reachable flagsd instance) and one state kit has a consumer.
Phase 3: the money-grade suite
Section titled “Phase 3: the money-grade suite”STARTED (2026-11-02):
@est/moneyshipped and fixture-pinned: exact BigInt decimals, the largest-remainder allocate (mirroringamount.rsop-for-op, including euclidean floors and stable ratio-order ties), the four rounding policies, and fx conversion (exact mantissa multiplication; missing rates are errors). Golden vectors come from the money crate’s own tests;crates/money-wasmruns the same fixture against the publisheddecimal-moneycrate natively (cargo test 2/2).apps/ledgershipped and deployed: https://web-estate-ledger.pages.dev: allocation island with the sum-preservation invariant rendered in the UI, flags fail-closed demo with decision-source chips, en/de locale switcher, and a fetchkit status round trip against the deployed directory-api.ledgerpins money + flags + i18n + envelope + errcode + fetchkit exactly: six kits, one deployed suite: the multi-kit core graduation target.
Phase 4: platform hardening
Section titled “Phase 4: platform hardening”Shared web CI workflow (the rust-kit analog); SBOM and provenance for npm
artifacts; TS semver gate; OmniWeb-template; CSS tokens generated from
theme-kit; a11y-kit checklist on islands; starlight-kit consolidation
of the per-site repos.
Repo lifecycle
Section titled “Repo lifecycle”Monorepo until a kit gains an external consumer, an independent release
cadence, or CI contention; then extract. The registry schema models both
shapes (packages: today, repos: when split), so the audit does not
change.
Standing decisions (2026-11-01)
Section titled “Standing decisions (2026-11-01)”- Deploy target: Cloudflare Pages.
- npm posture: publish
@est/*publicly atcoregraduation, mirroring the crates.io discipline. - Phase 3 suite: ledger dashboard.