Immutable journeys, one contract, many runtimes
Echo's onboarding control plane publishes journey versions immutably, hashes their canonical JSON, and serves the same contract to TypeScript, Swift, and Rust runtimes.
Journey publication#
A journey draft is published from Onboarding Studio. The version is stored immutably with a SHA-256 of its canonical JSON and bound to its adaptive experiment; publish, activate, and rollback are the only transitions. A bad journey is recovered by activating a previous version rather than editing one.
parseJourneyDefinition rejects any definition that is not schema version 1 before it can be stored.
Bundle and events endpoints#
Clients fetch the published definition with a bearer ONBOARDING_BUNDLE_TOKEN and report runtime events back to the same surface. Only the ten enumerated onboarding event names are accepted, and bodies above the configured limit are refused.
GET /api/onboarding/bundle?product_id=…&journey_id=… # ETag, 60s private cache
POST /api/onboarding/events # attempt, answers, exposures, outcomesRuntimes#
- Rust: wisent-onboarding-client (crates/onboarding-client in echo-web), executing the journey contract against wisent-integrations.
- Swift: WisentOnboarding from the wisent-ai/echo package, compiled into Wisent's desktop and iOS products.
- TypeScript: the runtime in wisent-ai/onboarding-web.
- All three validate the same closed journey contract: guardrails, sticky assignment, canonical offline fallback, first-action and first-success semantics. Consumers keep their own renderer and action registry.