diff --git a/package-lock.json b/package-lock.json index 66bcd50..edb5786 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "0.1.0", "dependencies": { "astro": "7.4.0", - "traverse-embedder-web": "^0.16.1" + "traverse-embedder-web": "^0.16.2" }, "devDependencies": { "@playwright/test": "^1.64.1" @@ -3289,9 +3289,9 @@ "license": "MIT" }, "node_modules/traverse-embedder-web": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/traverse-embedder-web/-/traverse-embedder-web-0.16.1.tgz", - "integrity": "sha512-tZnGmE1bqiVHd2bbSBQjSZYXhFTbBjc84akvNZXLMeDXtau569vc04U5Pc3PqXsicV1++5wGO1cYbimL4WYngQ==", + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/traverse-embedder-web/-/traverse-embedder-web-0.16.2.tgz", + "integrity": "sha512-dngx42aZ5XvOxeB3It1a6qq9KXxl6N0CrnM90GconDlkhNbD5yZ8TMGDAq0PWuuJPf9/YGlQD6W56ECW2UwByA==", "license": "Apache-2.0" }, "node_modules/trim-lines": { diff --git a/package.json b/package.json index 95a4e4f..62d66a1 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ }, "dependencies": { "astro": "7.4.0", - "traverse-embedder-web": "^0.16.1" + "traverse-embedder-web": "^0.16.2" }, "devDependencies": { "@playwright/test": "^1.64.1" diff --git a/public/llms.txt b/public/llms.txt index 36bf5c6..8841937 100644 --- a/public/llms.txt +++ b/public/llms.txt @@ -2,7 +2,7 @@ > Traverse is a governed capability runtime for portable business logic. Value loop: **discover → execute → trace**. Usual authoring is skill-first plain English via `traverse-capability-author` (contract → WASM → human-reviewed PR); manual authoring still uses Rust→WASM. You do **not** need to write Rust for the usual path. One shared `runtime.wasm`; browser, native desktop, CLI, and MCP are clients/embedders, not different Traverse runtimes. Shipped consumers today: JS/TS (`traverse-embedder-web`), Rust (`traverse-embedder`), agents via `traverse-mcp`; Python shells out to `traverse-cli capability-package execute` (**no Python SDK**). Latest release: **v0.16.0** (Nov 2, 2026, breaking): same input, same output on every host. Placement prepared at registration (#1706), RFC 8785 canonical guest input (#1722), host-enforced contract input schemas (#1658), Registry rights fail closed (#1727–#1729), `traverse-mcp` Mode A prebuilt binaries without Rust (#1653), wasmtime 48.0.7 security fix + Rust 1.95 (#1744); upgrade: https://traverse-framework.com/questions/how-do-i-upgrade-to-traverse-v0-16-0.html. v0.15.0 headline: governed model execution on every host. Signed exact-ref on native Rust, the browser, Swift, Kotlin/Android, and .NET; every host enforces model rights (`model_usage` is required); Core ML is an opt-in Apple placement (macOS cargo-test evidence plus the Decision 113 iPhone spike; governed-path iPhone evidence for traverse#1630 shipped in v0.16.0: BirdNET p95 141 ms per 3 s clip on one iPhone 14 Pro Max, schema 2.3.0 `score_transform`). Swift (xcframework `swift-host-v0.16.0`; the v0.16.0 tag's `Package.swift` still pins `swift-host-v0.15.0-1`, main pins `swift-host-v0.16.0` via traverse#1769), Kotlin (Maven Central `com.traverse-framework:traverse-embedder` 0.16.0), and .NET (nuget.org `TraverseEmbedder` 0.16.0) are published, pre-1.0, and not Certified; edge is planned; cloud placement is an explicit non-goal for v0.1. See /platforms.html and /what-is-real-today.html. Apache 2.0, pre-1.0 (v0.16.0). The agent proposes; the runtime decides. - Start here (narrative): https://traverse-framework.com/blog/what-is-real-today-start-here.html -- How do I upgrade to Traverse v0.16.0 (and v0.16.1)?: https://traverse-framework.com/questions/how-do-i-upgrade-to-traverse-v0-16-0.html +- How do I upgrade to Traverse v0.16.0 (and v0.16.2)?: https://traverse-framework.com/questions/how-do-i-upgrade-to-traverse-v0-16-0.html - How do I start with Traverse as an agent?: https://traverse-framework.com/questions/how-do-i-start-with-traverse-as-an-agent.html - What does Traverse not claim yet?: https://traverse-framework.com/questions/what-does-traverse-not-claim-yet.html @@ -10,7 +10,7 @@ Traverse is not a web framework, an agent-orchestration framework, or a general microservices platform. It governs one thing well: a single piece of business logic that must behave identically and auditably on every host where it actually ships. Specs and registry catalog size are governance hygiene, not the pitch. -Current packages (Traverse v0.16.1, Nov 3, 2026, additive patch on v0.16.0): npm `traverse-embedder-web@0.16.1`; Maven Central `com.traverse-framework:traverse-embedder` 0.16.1; nuget.org `TraverseEmbedder` 0.16.1; Swift xcframework `swift-host-v0.16.1`; `traverse-mcp` prebuilt binaries on GitHub release `traverse-mcp-v0.16.1` (Linux x64/arm64, macOS arm64, Windows x64; `SHA256SUMS` + provenance); ONNX runner `onnx-runner-v0.16.1`. crates.io: all six crates (`traverse-runtime`, `traverse-embedder`, `traverse-contracts`, `traverse-mcp`, `traverse-cli-rs`, `traverse-expedition-wasm`) at 0.16.1, published Nov 3; Rust ≥ 1.95. `runtime.wasm` is not in npm or any release since `runtime-wasm-v0.11.0`; take it from the release tag and check its digest (v0.16.1 sha256 `7a322a17e3fd58f8bd26e915dd81bad68732500dc981499bd280a6d2e6507d52`; traverse#1784). The CLI crate is `traverse-cli-rs` (binary `traverse-cli`). v0.16.0 moves `traverse-registry` to `0.29.0`. Since v0.16.0 the runtime rejects revoked Registry versions and conditional model rights need an explicit host opt-in (#1728; traverse#1598 closed). Host-side exact-ref `model_usage` enforcement shipped in v0.15.0. +Current packages (Traverse v0.16.2, Nov 4, 2026, additive patch on v0.16.0): npm `traverse-embedder-web@0.16.2`; Maven Central `com.traverse-framework:traverse-embedder` 0.16.2; nuget.org `TraverseEmbedder` 0.16.2; Swift xcframework `swift-host-v0.16.2`; `traverse-mcp` prebuilt binaries on GitHub release `traverse-mcp-v0.16.2` (Linux x64/arm64, macOS arm64, Windows x64; `SHA256SUMS` + provenance); ONNX runner `onnx-runner-v0.16.2` (same sha256 `ac5591fa…` as v0.16.0 and v0.16.1). crates.io: all six crates (`traverse-runtime`, `traverse-embedder`, `traverse-contracts`, `traverse-mcp`, `traverse-cli-rs`, `traverse-expedition-wasm`) at 0.16.2, published Nov 4; Rust ≥ 1.95. v0.16.2 adds host-connector invokes in CLI workspace application manifests (#1772, Spec 1773) and consumes `traverse-registry` 0.31.0. `runtime.wasm` ships on artifact-only GitHub releases again: `runtime-wasm-v0.16.2` (sha256 `b313b5c5c11291d9e9669125a0a9a77aa42a911b15d431a73e86b17c874e298c`) and `runtime-wasm-v0.16.1` (`7a322a17…`), each with `runtime.wasm`, `runtime.wasm.sha256` and `runtime-release.json` (traverse#1784 closed by #1797; npm still doesn't ship it). Known issue on 0.16.2 and earlier: Swift, Kotlin and .NET `RuntimeTraverseEmbedder` hand guests the whole `{target_id, input}` envelope instead of just `input`; fixed on main by #1800 (breaking for a guest that reads the envelope), not released. The CLI crate is `traverse-cli-rs` (binary `traverse-cli`). v0.16.0 moves `traverse-registry` to `0.29.0`. Since v0.16.0 the runtime rejects revoked Registry versions and conditional model rights need an explicit host opt-in (#1728; traverse#1598 closed). Host-side exact-ref `model_usage` enforcement shipped in v0.15.0. ## Required reading (agents) @@ -25,7 +25,7 @@ Current packages (Traverse v0.16.1, Nov 3, 2026, additive patch on v0.16.0): npm - [What is one shared runtime.wasm?](https://traverse-framework.com/questions/what-is-one-shared-runtime-wasm.html): embedders are clients; honest consumer list. - [Does the Rust embedder use the same runtime.wasm?](https://traverse-framework.com/questions/does-the-rust-embedder-use-the-same-runtime-wasm.html): discover → execute → trace on one shared runtime contract/ABI; web `traverse-embedder-web@0.15.0` loads the bundle's digest-checked `runtime/runtime.wasm`; Rust `traverse-embedder@0.15.0` links `traverse-runtime` natively and ships no separate runtime-WASM artifact; capability WASM still targets that host ABI; hosts are clients (UI + I/O); JS/TS + Rust + MCP published; Python via CLI only (no Python SDK); Swift/Kotlin/.NET published pre-1.0, not Certified under Spec 529; published 0.15.0 Maven/NuGet include ExactModelHost. Narrative: [One shared runtime. Not one shared .wasm file on every host.](https://traverse-framework.com/blog/one-shared-runtime-two-loading-paths.html) (that post is a v0.14.0 snapshot). - [The agent freestyled a $2.4M wire. The runtime said no.](https://traverse-framework.com/blog/agent-freestyle-blocked.html): project direction in one scene. Agent proposes, runtime decides (deny + trace). -- [One model capability, three published hosts, same answer](https://traverse-framework.com/blog/model-execute-on-published-packages.html): Nov 5 write-up of the v0.16.1 published-package proof. Published catalog `model/model.execute@1.0.0` guest (`5ccfa372…`), unchanged, over signed `traverse.digits-onnx@1.0.0` (test-only key, #1567) on native (crates.io `traverse-runtime` 0.16.1, wasmtime), Node 24.16.0 and Chromium 152 (npm `traverse-embedder-web@0.16.1`, `activateMediatedConnector` + `exactModelMediatedConnector`, `submitAsync`) → identical success output with `model_evidence`, identical 56-byte frame, identical `connector_unavailable`, `usage_undeclared`, `key_untrusted`, `pin_mismatch`, `digest_mismatch`, `package_revoked`; native adds `placement_evidence` (Spec 1719 FR-014). Evidence traverse#1782 (`docs/evidence/model-execute-published-2026-11-03`); clean GitHub-hosted runner rerun from published packages only, weekly Mondays, pinned to v0.16.1 (#1783, closed #1776). Gaps: `runtime.wasm` (`7a322a17…`) and the model package come from the v0.16.1 tag, not a package (#1784); native `activate_exact_model_runtime` frame readback (#1785); no Swift/Android/.NET activation API; live-Registry rights #1786; no Spec 529 certification. On main, unreleased (Nov 4): host-connector invokes in application manifests and CLI activation (#1772 via #1788, on `traverse-registry` 0.31.0); v0.16.2 release PR #1793 open. +- [One model capability, three published hosts, same answer](https://traverse-framework.com/blog/model-execute-on-published-packages.html): Nov 5 write-up of the v0.16.1 published-package proof. Published catalog `model/model.execute@1.0.0` guest (`5ccfa372…`), unchanged, over signed `traverse.digits-onnx@1.0.0` (test-only key, #1567) on native (crates.io `traverse-runtime` 0.16.1, wasmtime), Node 24.16.0 and Chromium 152 (npm `traverse-embedder-web@0.16.1`, `activateMediatedConnector` + `exactModelMediatedConnector`, `submitAsync`) → identical success output with `model_evidence`, identical 56-byte frame, identical `connector_unavailable`, `usage_undeclared`, `key_untrusted`, `pin_mismatch`, `digest_mismatch`, `package_revoked`; native adds `placement_evidence` (Spec 1719 FR-014). Evidence traverse#1782 (`docs/evidence/model-execute-published-2026-11-03`); clean GitHub-hosted runner rerun from published packages only, weekly Mondays, pinned to v0.16.1 (#1783, closed #1776). Gaps: `runtime.wasm` (`7a322a17…`) and the model package come from the v0.16.1 tag, not a package (#1784); native `activate_exact_model_runtime` frame readback (#1785); no Swift/Android/.NET activation API; live-Registry rights #1786; no Spec 529 certification. Update Nov 5: host-connector invokes in CLI workspace application manifests (#1772 via #1788, `traverse-registry` 0.31.0) shipped in v0.16.2 (Nov 4), and `runtime.wasm` is now also on the `runtime-wasm-v0.16.1` release (#1784 closed by #1797). - [Traverse v0.16.0: same input, same output, on every host](https://traverse-framework.com/blog/traverse-0-16-0-same-input-same-output.html): Nov 3 release story for v0.16.0 (Nov 2, tag `f104b83`). Every host feeds guests RFC 8785 canonical JSON input (#1722, Decision 118). Rerun Nov 3 on released bits only: catalog `core.authorize@1.2.0` (`0c318fff…`) on Node (npm `traverse-embedder-web@0.16.0` + `runtime.wasm` `5ab8057f…`) and the `traverse-mcp-v0.16.0` Linux x64 binary (Mode A, `gh attestation verify` OK) → full output byte-identical, `policy_hash` `fnv1a64:51a64653…` on both; browser, other binaries, Swift/Kotlin/.NET not rerun. Mode A without Rust: `curl … | tar -xz` → `traverse-mcp sync` (index-v412, 232 records) → `prepare-cache`; five freestyle moves still refused; line-delimited command protocol, not JSON-RPC `tools/list`. Four breaking changes (#1706 placement at registration, #1722 canonical input, #1658 host input-schema enforcement, #1728 Registry rights fail closed). wasmtime 48.0.7 (GHSA-mghf-wjfp-p5xm), Rust ≥ 1.95. crates.io, npm, Maven, NuGet at 0.16.0; Swift `swift-host-v0.16.0` (tag `Package.swift` still pins the 0.15.0 xcframework, fixed on main #1769). Not claimed: live Registry coverage, production compliance, Spec 529 certification, guest `connector_invoke` on Swift/Android/.NET/web (#1719). - [One audit fingerprint, every host](https://traverse-framework.com/blog/hash-converges.html): Oct 30 weekly demo. Demo proof of the traverse#1722 fix. Same catalog `core.authorize@1.2.0` WASM (`0c318fff…`) on four columns: Browser with the v0.15.0-era `runtime.wasm` (`a254c161…`) → `policy_hash` `fnv1a64:2a126b86…`; Browser, Node (npm `traverse-embedder-web@0.15.0` JS + main `runtime.wasm` `ec49cb76…`) and the agent (`traverse-mcp` built from traverse `main` 70f3ee7, Mode A stdio) → `fnv1a64:51a64653…` on all three, full output byte-identical from unsorted caller input (RFC 8785 canonical guest input, #1739 / Decision 118). traverse#1720 closed by #1725 (binary runs from an empty directory, no staged fixtures). `traverse-mcp sync` (#1758) synced live `index-v412` (232 records). Five freestyle moves → `not_found`, `registry_cache_entry_missing`, `invalid_request`, `not_found`, `registry_artifact_digest_mismatch`. Honest gaps (as of Oct 30): unreleased `main`, not a tag. The fix has since shipped in v0.16.0 (Nov 2), and on Nov 3 the Node + agent columns were rerun on released bits (npm `traverse-embedder-web@0.16.0` + `runtime.wasm` `5ab8057f…`, `traverse-mcp-v0.16.0` Linux x64 binary) → still `51a64653…`, byte-identical ([v0.16.0 post](https://traverse-framework.com/blog/traverse-0-16-0-same-input-same-output.html)); browser not rerun on released bits; #1721 (prebuilt binary) since shipped in v0.16.0; building needs Rust 1.95.0; Mode A digest-only, no signature; #1719 waits on PR #1755; no Swift/.NET/Android runs. - [Same WASM, two hashes. The bug wasn't in the WASM.](https://traverse-framework.com/blog/same-wasm-two-hashes.html): Oct 30. Why catalog `core.authorize@1.2.0` gave a different `policy_hash` on `traverse-mcp` (sorted-key re-serialization) than on the embedders (caller bytes) in the Oct 23 demo (traverse#1722), and the rule now on `main`: Decision 118 / Spec `1722-canonical-guest-input-bytes`. Every host feeds guests RFC 8785 (JCS) canonical JSON input, refuses unrepresentable input with `input_not_canonicalizable`, never rewrites outputs; conformance fixture on native, `runtime.wasm`, Node (traverse#1739). Ships in v0.16.0, not released as of Oct 30. Rerun on `main` (not a release): [One audit fingerprint, every host](https://traverse-framework.com/blog/hash-converges.html). @@ -73,8 +73,8 @@ Current packages (Traverse v0.16.1, Nov 3, 2026, additive patch on v0.16.0): npm - [Platforms](https://traverse-framework.com/platforms.html): honest, evidence-linked status per target. Native and browser are shipped; Swift/iOS (wasmi xcframework `swift-host-v0.16.0`), Kotlin/Android (Maven Central `com.traverse-framework:traverse-embedder` 0.16.0), and .NET/Windows (nuget.org `TraverseEmbedder` 0.16.0) embedders are published but pre-1.0 and marked In progress; all three include ExactModelHost; no host is Certified under Spec 529 yet; Core ML is an Apple opt-in; edge is planned; cloud placement is an explicit non-goal for v0.1. Do not assume a target works without checking this page first. - [React integration guide](https://traverse-framework.com/docs/guides/react-integration.html): using the published Web embedder SDK (`traverse-embedder-web`) from a React app. - [What happens when a capability runs out of fuel or memory?](https://traverse-framework.com/questions/what-happens-when-a-capability-runs-out-of-fuel-or-memory.html): the call fails, it doesn't run unbounded; limits are host-owned and per call (Swift status -4 `bridge_timeout` / `bridge_resource_limit`, -5 `bridge_trap`; .NET defaults 32 MiB, 10M fuel, 30 s; Kotlin 32 MiB artifact cap + per-call budget); behavior differs by engine, test each host. -- [Can I run Traverse capabilities in Node.js?](https://traverse-framework.com/questions/can-i-run-traverse-capabilities-in-nodejs.html): yes, via the same npm `traverse-embedder-web@0.15.0` with `NodeFsBundleLoader`; loads the bundle's own digest-checked `runtime/runtime.wasm` (one shared runtime, Node is a host, not a separate runtime); linear `direct` pipelines only; `platform: "web"`, placement reports `browser`; no separate Node row on Platforms, nothing Certified; Python stays CLI-only (no Python SDK). The documented Node 20 run was against 0.14.0. -- [How do I unit-test app code that calls Traverse without running WASM?](https://traverse-framework.com/questions/how-do-i-unit-test-app-code-that-calls-traverse.html): `EmbedderTestDouble` in `traverse-embedder-web` and Rust `traverse-embedder` 0.15.0 (scripted output/error per target, same event envelope, deterministic ids, `target_not_found` / `runtime_stopped`, trace list/get); Swift/Kotlin/.NET ship smaller `InMemoryTraverseEmbedder`; doubles test host code, not the capability; `releaseEvidence().package.version` reported 0.9.0 in 0.14.0 and reports 0.15.0 in the published 0.15.0 package (#1654 closed). +- [Can I run Traverse capabilities in Node.js?](https://traverse-framework.com/questions/can-i-run-traverse-capabilities-in-nodejs.html): yes, via the same npm `traverse-embedder-web` (0.16.2 today, since 0.15.0) with `NodeFsBundleLoader`; loads the bundle's own digest-checked `runtime/runtime.wasm` (one shared runtime, Node is a host, not a separate runtime); linear `direct` pipelines only; `platform: "web"`, placement reports `browser`; no separate Node row on Platforms, nothing Certified; Python stays CLI-only (no Python SDK). The documented Node 20 run was against 0.14.0. +- [How do I unit-test app code that calls Traverse without running WASM?](https://traverse-framework.com/questions/how-do-i-unit-test-app-code-that-calls-traverse.html): `EmbedderTestDouble` in `traverse-embedder-web` and Rust `traverse-embedder` (0.16.2 today, since 0.15.0; scripted output/error per target, same event envelope, deterministic ids, `target_not_found` / `runtime_stopped`, trace list/get); Swift/Kotlin/.NET ship smaller `InMemoryTraverseEmbedder`; doubles test host code, not the capability; `releaseEvidence().package.version` reported 0.9.0 in 0.14.0 and reports 0.15.0 in the published 0.15.0 package and 0.16.2 in 0.16.2 (#1654 closed). - [How do I read Traverse execution traces from inside my app?](https://traverse-framework.com/questions/how-do-i-read-traverse-traces-from-inside-my-app.html): Embedded Trace API (`embedded-trace-api/1.0.0`, Spec 517), `traceList` / `traceGet` on web + Rust embedders 0.15.0; safe projection (target, outcome, phases, placement, failure code), never inputs/outputs/caller identity/private hashes; process-local, last 100, cleared on shutdown; no HTTP sidecar; `completedAt` is logical time; not on Swift/Kotlin/.NET yet. - [Architecture](https://traverse-framework.com/docs/architecture.html): how the runtime, registry, and WASM sandbox fit together. @@ -86,22 +86,23 @@ Current packages (Traverse v0.16.1, Nov 3, 2026, additive patch on v0.16.0): npm - [FAQ](https://traverse-framework.com/faq.html) and [Questions](https://traverse-framework.com/questions.html): 70+ specific Q&A pages, mostly long-tail but accurate. - [What is exact-ref model execution?](https://traverse-framework.com/questions/what-is-exact-ref-model-execution.html): discover → execute → trace; one shared `runtime.wasm`; signed schema `2.0.0` and later + `model.sig.json`; host-owned trust; **breaking** `model_usage` (`commercial` | `non_commercial`, else `usage_undeclared`); third-party ONNX via `traverse-cli model`; guest ABI v3 snapshot reuse; Core ML opt-in on Apple (macOS cargo test + Decision 113 spike; governed-path iPhone evidence for traverse#1630 shipped in v0.16.0); `digits-mlp-1.0.0` (test-only key; custody #1567 still open); published exact-ref execute is native + web 0.15.0 + Swift ExactModelHost (`swift-host-v0.15.0`) + Kotlin and .NET ExactModelHost in Maven/NuGet 0.15.0 (#1651 closed; first landed in v0.12.0); v0.16.0 republishes the same hosts at 0.16.0 and moves the execution policy to registration (#1706). No host is Certified. [Release](https://github.com/traverse-framework/traverse/releases/tag/v0.16.0) · historical embedder notes: [v0.14.0: what changed for embedders](https://traverse-framework.com/blog/traverse-0-14-0-what-changed-for-embedders.html). - [How do hosts trust signed models?](https://traverse-framework.com/questions/how-do-hosts-trust-signed-models.html): discover → execute → trace; one shared `runtime.wasm`; host-owned trust roots gate `register_package`; pin by digest + `model.sig.json`; `model_usage` required in v0.15.0; test-only digits-mlp key (custody #1567 still open); published exact-ref execute is native + web + Swift `swift-host-v0.15.0` + Kotlin and .NET 0.15.0; third-party ONNX can be packaged and signed with `traverse-cli model`. -- [Which hosts run signed exact-ref models?](https://traverse-framework.com/questions/which-hosts-run-signed-exact-ref-models.html) · [Is production model signing ready?](https://traverse-framework.com/questions/is-production-model-signing-ready.html) · [Can Kotlin or .NET run exact-ref yet?](https://traverse-framework.com/questions/can-kotlin-or-dotnet-embedders-run-exact-ref-yet.html): discover → execute → trace; one shared `runtime.wasm`; published exact-ref is native + web 0.15.0 + Swift `swift-host-v0.15.0` + Kotlin and .NET 0.15.0 (#1651 closed); production signing custody is not finished (#1567 still open; v0.15.0 shipped key-generation tooling). -- [What is ExactModelHost?](https://traverse-framework.com/questions/what-is-exact-model-host.html): host-side connector for governed exact-ref model packages (Spec 138). Register a signed package under host-owned trust roots, then execute under discover → execute → trace. Not a second runtime. Published in 0.15.0: native connector, web `ExactModelBrowserHost`, Swift `ExactModelHost` on `swift-host-v0.15.0`, Kotlin and .NET `ExactModelHost` in Maven/NuGet 0.15.0 (#1651 closed). Test-only digits-mlp key; custody #1567 still open. Not catalog `model.execute`. Not Hugging Face. +- [Which hosts run signed exact-ref models?](https://traverse-framework.com/questions/which-hosts-run-signed-exact-ref-models.html) · [Is production model signing ready?](https://traverse-framework.com/questions/is-production-model-signing-ready.html) · [Can Kotlin or .NET run exact-ref yet?](https://traverse-framework.com/questions/can-kotlin-or-dotnet-embedders-run-exact-ref-yet.html): discover → execute → trace; one shared `runtime.wasm`; published exact-ref on every host since 0.15.0; as of v0.16.2: native + web 0.16.2 + Swift `swift-host-v0.16.2` + Kotlin and .NET 0.16.2 (#1651 closed); production signing custody is not finished (#1567 still open; v0.15.0 shipped key-generation tooling). +- [What is ExactModelHost?](https://traverse-framework.com/questions/what-is-exact-model-host.html): host-side connector for governed exact-ref model packages (Spec 138). Register a signed package under host-owned trust roots, then execute under discover → execute → trace. Not a second runtime. Published since 0.15.0, current 0.16.2: native connector, web `ExactModelBrowserHost`, Swift `ExactModelHost` on `swift-host-v0.16.2`, Kotlin and .NET `ExactModelHost` in Maven/NuGet 0.16.2 (#1651 closed). Test-only digits-mlp key; custody #1567 still open. Not catalog `model.execute`. Not Hugging Face. - [Signed models on every host. The rights travel with them.](https://traverse-framework.com/blog/signed-models-on-every-host.html): Oct 15 v0.15.0 narrative. Discover → execute → trace; signed exact-ref on native Rust, web, Swift `swift-host-v0.15.0`, Kotlin and .NET 0.15.0 via small audited native boundaries sharing `traverse-model-host-frame`, byte-identical conformance vectors, one 21-case rights suite; **breaking** `model_usage`; `traverse-cli model` + `package-onnx` (install `traverse-cli-rs`, runner from `onnx-runner-v0.15.0`); ABI v3 prepare-once; Core ML opt-in on Apple (iPhone governed evidence traverse#1630 landed on main after the release, unreleased). Caveats: web `modelUsage` not validated in 0.15.0 (traverse#1685; fix #1698 on main, unreleased), CLI verify usage (traverse#1686, main only), test-only key (custody #1567), registry capability revocation #1598 not shipped. No host Certified. - [What is model_usage?](https://traverse-framework.com/questions/what-is-model-usage-in-traverse.html): since v0.15.0 apps with `exact_model_dependencies` must declare `model_usage: commercial | non_commercial` or fail closed with `usage_undeclared`; `commercial` rejects `prohibited` packages (`rights_policy_denied`); results carry `model_evidence`; Rust `ExactModelHostConnector::model_usage`, web `modelUsage`, Swift `modelUsage:` (no default), Kotlin/.NET `modelUsage`. 0.15.0 gaps fixed in v0.16.0: web 0.15.0 accepted any string (traverse#1685; `traverse-embedder-web@0.16.0` rejects with `usage_invalid`); `traverse-cli-rs` 0.15.0 `model verify` had no usage flag (traverse#1686; v0.16.0 adds `--model-usage` / `--require-model-usage`). -- [How do I package my own ONNX model?](https://traverse-framework.com/questions/how-do-i-package-an-onnx-model-for-traverse.html): `cargo install traverse-cli-rs --version =0.16.0 --locked` (Rust ≥ 1.95; crates.io `traverse-cli` is unrelated) with `runner.wasm` from GitHub release `onnx-runner-v0.16.0` (sha256 `ac5591fac5f37435667169e969f9117cc6f81dc66b73cd74d1aef9000f5d3a0a`, `tract-onnx` 0.23.9); the 0.15.0 CLI pairs with `onnx-runner-v0.15.0` (`f3902703…`); `model package-onnx` → sign → verify → conformance → pin; v0.16.0 adds named multi-input/multi-output packaging for HF-style text encoders (traverse#1661; reference package `hf-text-encoder-toy-1.0.0`), 0.15.0 is one input + one output tensor; post-processing belongs in capabilities, hosts stay UI + I/O. This is the host connector path, not Hugging Face. +- [How do I package my own ONNX model?](https://traverse-framework.com/questions/how-do-i-package-an-onnx-model-for-traverse.html): `cargo install traverse-cli-rs --version =0.16.2 --locked` (Rust ≥ 1.95; crates.io `traverse-cli` is unrelated) with `runner.wasm` from GitHub release `onnx-runner-v0.16.2` (sha256 `ac5591fac5f37435667169e969f9117cc6f81dc66b73cd74d1aef9000f5d3a0a`, `tract-onnx` 0.23.9; the v0.16.0 and v0.16.1 runner releases carry the same bytes); the 0.15.0 CLI pairs with `onnx-runner-v0.15.0` (`f3902703…`); `model package-onnx` → sign → verify → conformance → pin; v0.16.0 adds named multi-input/multi-output packaging for HF-style text encoders (traverse#1661; reference package `hf-text-encoder-toy-1.0.0`), 0.15.0 is one input + one output tensor; post-processing belongs in capabilities, hosts stay UI + I/O. This is the host connector path, not Hugging Face. - [What happens when a host marks a model package revoked?](https://traverse-framework.com/questions/what-happens-when-a-host-marks-a-model-package-revoked.html): v0.15.0 hosts own a package-status map for signed model packages, `revoked` blocks (`package_revoked`), `deprecated` runs and is flagged; `model_evidence` on every result. Separate from registry capability revocation, which the runtime refuses since v0.16.0 (#1728). - [Can Traverse run models on a GPU or the Apple Neural Engine?](https://traverse-framework.com/questions/can-traverse-run-models-on-a-gpu-or-neural-engine.html): Core ML is an opt-in Apple placement in v0.15.0. Default stays `wasm-cpu`. Ordered placements, on-device self-check, fail-closed `placement_unavailable`, placement evidence (Decision 112). v0.15.0 evidence was macOS cargo test plus the Decision 113 iPhone spike. Governed-path iPhone evidence shipped in v0.16.0 (traverse#1630): BirdNET on one iPhone 14 Pro Max, p95 141 ms per 3 s clip under `[coreml, wasm-cpu]`; needs schema 2.3.0 `score_transform` (new in v0.16.0); `cpu_and_neural_engine` failed self-check and fell back to `wasm-cpu`; a Nov 3 rerun on main (#1778, docs only) shows `cpu_only` fails identically (5.067×10⁻³ vs 5×10⁻³ on 1 of 21 clips), so it is not Neural-Engine-specific. No web, Android, or desktop GPU adapter. No host is Certified. - [How fast does a model run on iPhone with Traverse?](https://traverse-framework.com/questions/how-fast-does-a-model-run-on-iphone-with-traverse.html): one measured case, shipped in v0.16.0 (traverse#1630, PR #1709): iPhone 14 Pro Max, iOS 26.6, Release build, Swift `ExactModelHost`, BirdNET v2.4 int8, policy `[coreml, wasm-cpu]`. Core ML `all` p95 141.3 ms per 3 s clip vs `wasm-cpu` p95 10.0 s; top-5 21/21 vs wasm-cpu; timing is the whole governed call. Not reproducible on v0.15.0 (needs schema 2.3.0 `score_transform`, new in v0.16.0). One device, one model, test-only key, non-commercial weights. Code for #1706 (placement prep at registration, Decision 120, #1764) and #1708 (self-check worst case, #1766) shipped in v0.16.0. Nov 3 rerun on main (#1778 docs, #1779 host tests; harness built from main `9a3cd84`): `cpu_only` registers 4.47 s, first call 4.29 s, no timeout, but runs on `wasm-cpu` (Core ML variant fails self-check); `all` p95 149.0 ms; different clips, not a before/after. #1706 and #1708 closed; #1707 open. No host is Certified. - [What is the model.execute catalog capability?](https://traverse-framework.com/questions/what-is-the-model-execute-catalog-capability.html): `model.execute@1.0.0` in the registry catalog (registry#639, index-v407, Oct 15 2026). A shim over host connector `traverse.model-runtime`: exact pin + `input_ref` + `model_usage` + non-empty `trust_root` in; `model_evidence` or unchanged fail-closed Spec 138 reason out. Does not fetch models, hold keys, or choose a model. Pins connector 2.3.0 (shipped in Traverse v0.16.0; v0.15.0 hosts carry 2.2.0). Registry spec 027 is draft. Since Traverse v0.16.1 (Nov 3) it runs on published native, Node and browser packages: traverse#1770 shipped web `activateMediatedConnector` + `submitAsync`, and a published-package run (traverse#1782, clean-runner CI #1783) gave identical output and six identical fail-closed reasons on native, Node and Chromium; Swift/Android/.NET activation not shipped; the Oct 16 weekly demo runs it on v0.15.0 via a native bridge and labelled Browser/Node glue. -- [Does catalog model.execute run on published Traverse packages?](https://traverse-framework.com/questions/does-catalog-model-execute-run-on-published-traverse-packages.html): yes on native, Node and browser since v0.16.1 (Nov 3, 2026). Published `model.execute@1.0.0` guest, unchanged, over signed `traverse.digits-onnx@1.0.0` (test-only key): crates.io `traverse-runtime` 0.16.1 (wasmtime), npm `traverse-embedder-web@0.16.1` in Node 24 and Chromium. `all_identical: true`: success output, 56-byte frame, and `connector_unavailable`/`usage_undeclared`/`key_untrusted`/`pin_mismatch`/`digest_mismatch`/`package_revoked` (native adds `placement_evidence`). Evidence traverse#1782; clean GitHub-hosted runner CI #1783 (pinned to v0.16.1). Limits: `runtime.wasm` from the tag (#1784), native frame read-back needs a workaround (#1785), no Swift/Android/.NET activation, registry spec 027 draft, no host Certified. -- [Where does BundleEmbedder get runtime.wasm?](https://traverse-framework.com/questions/where-does-bundleembedder-get-runtime-wasm.html): from the app bundle (`runtime/runtime.wasm` + `.sha256`, digest-checked, fail closed if missing). npm does not ship it; last `runtime-wasm-v*` release is v0.11.0; today take it from the release tag and check against `runtime/runtime-release.json` (v0.16.1 sha256 `7a322a17…`). Decision open in traverse#1784. +- [Does catalog model.execute run on published Traverse packages?](https://traverse-framework.com/questions/does-catalog-model-execute-run-on-published-traverse-packages.html): yes on native, Node and browser since v0.16.1 (Nov 3, 2026). Published `model.execute@1.0.0` guest, unchanged, over signed `traverse.digits-onnx@1.0.0` (test-only key): crates.io `traverse-runtime` 0.16.1 (wasmtime), npm `traverse-embedder-web@0.16.1` in Node 24 and Chromium. `all_identical: true`: success output, 56-byte frame, and `connector_unavailable`/`usage_undeclared`/`key_untrusted`/`pin_mismatch`/`digest_mismatch`/`package_revoked` (native adds `placement_evidence`). Evidence traverse#1782; clean GitHub-hosted runner CI #1783 (pinned to v0.16.1). Limits: `runtime.wasm` came from the tag at run time (now also on `runtime-wasm-v0.16.1`; #1784 closed), native frame read-back needs a workaround (#1785), no Swift/Android/.NET activation, registry spec 027 draft, no host Certified. +- [Where does BundleEmbedder get runtime.wasm?](https://traverse-framework.com/questions/where-does-bundleembedder-get-runtime-wasm.html): from the app bundle (`runtime/runtime.wasm` + `.sha256`, digest-checked, fail closed if missing). npm does not ship it. Since Nov 4, 2026 it is on artifact-only GitHub releases `runtime-wasm-v0.16.2` (sha256 `b313b5c5…`) and `runtime-wasm-v0.16.1` (`7a322a17…`), with `runtime.wasm.sha256` and `runtime-release.json`; take the one matching your `traverse-embedder-web` version and check the digest. traverse#1784 closed by #1797; on main, every future `vX.Y.Z` tag publishes `runtime-wasm-vX.Y.Z` before the product release. +- [Can a Traverse application manifest invoke a host connector?](https://traverse-framework.com/questions/can-a-traverse-application-manifest-invoke-a-host-connector.html): yes since v0.16.2 (Nov 4, 2026). A state invokes exactly one of `{"capability_id", "input_from"}` or `{"host_connector": "audio.permission.request"}`; `traverse-cli app validate`, activation and registration accept both (Spec 1773, #1772). Neither, both, empty or unknown fields fail closed; host-connector states must route `host_connector_succeeded`/`failed`/`timeout`/`cancelled`; the command must be declared and resolve through Specs 104/137. Limit: `traverse-cli app activate` registers only its built-in reference connector catalog, and `traverse.audio-input` isn't in it yet (#1791). - [Why does BundleEmbedder fail with "cannot find definition for import (traverse_host, connector_invoke)"?](https://traverse-framework.com/questions/why-does-bundleembedder-fail-with-cannot-find-definition-for-import-connector-invoke.html): published browser/Node `runtime.wasm` (traverse-embedder-web 0.15.0) doesn't link the Spec 104 `connector_invoke` import; only native wasmtime does, with a host-written `MediatedConnector` bridge. Partly fixed in v0.16.0 (Nov 2): traverse#1755 links `connector_invoke` in `runtime.wasm` with native-parity fail-closed mediation (without host activation, invokes get `unbound`/`undeclared` with evidence) and ships native `ExactModelMediatedConnector` / `activate_exact_model_runtime` (no hand-written bridge); in published packages web/Swift/Android/.NET still have no activation API. Shipped in v0.16.1 (Nov 3, traverse-embedder-web@0.16.1): traverse#1770 adds web `BundleEmbedder.activateMediatedConnector` + `exactModelMediatedConnector`, guest suspend/resume at `connector_invoke`, `submitAsync` (sync `submit` -> `async_submit_required`), and a host-private filter fix for rights-record URLs in `model_evidence`; run on published packages in Node and Chromium (traverse#1782). traverse#1719 closed; Swift/Android/.NET activation still open. - [Why does model.execute return unauthorized_output?](https://traverse-framework.com/questions/why-does-model-execute-return-unauthorized-output.html): the Spec 104 host-private filter rejects strings starting with `/` or containing `://`; the full `ModelRightsRecord` carries `source_url`, so don't forward it. `model.execute@1.1.0` (registry#641 closed via #645, 2026-10-29; same WASM digest as 1.0.0) defines the normative flat `model_evidence` (`license_id`, `commercial_use`, `status`, `effective_usage`, optional URL-free `derivation`); full nested record is non-conformant. Shipped host binding still open (traverse#1719). - [Does the same Traverse WASM give byte-identical output on every host?](https://traverse-framework.com/questions/does-the-same-wasm-give-byte-identical-output-on-every-host.html): same WASM + same input bytes → same output bytes, but on v0.15.0 hosts don't always pass the same bytes: `traverse-mcp` re-serializes request JSON with sorted keys, embedders pass caller bytes through, so catalog `core.authorize@1.2.0` gives the same decision/reason/obligations/trace but a different `policy_hash` (`2a126b86…` vs `51a64653…`). Sorted-key input → byte-identical on all three. Fixed in v0.16.0 (Nov 2, breaking): Decision 118 + Spec `1722-canonical-guest-input-bytes`. Every host feeds guests RFC 8785 (JCS) canonical JSON input; unrepresentable input → `input_not_canonicalizable`; outputs never rewritten; conformance fixture `fixtures/cross-host/canonical-input-v1` on native, `runtime.wasm`, Node (traverse#1739, merged Oct 28). v0.15.0 keeps the old behavior. Write-up: [Same WASM, two hashes](https://traverse-framework.com/blog/same-wasm-two-hashes.html). Demo rerun on `main` before the tag (Browser + Node + traverse-mcp all `51a64653…`): [One audit fingerprint, every host](https://traverse-framework.com/blog/hash-converges.html). Rerun Nov 3 on released bits, Node (npm 0.16.0) + `traverse-mcp-v0.16.0` binary → both `51a64653…`, full output byte-identical; browser not rerun: [Traverse v0.16.0: same input, same output](https://traverse-framework.com/blog/traverse-0-16-0-same-input-same-output.html). - [What is digits-mlp?](https://traverse-framework.com/questions/what-is-digits-mlp.html): first trained exact-ref package in v0.14.0 (UCI digits MLP, 96.10% held-out, bit-identical); test-only signing; not a general LLM. -- [Does the website use the latest traverse-embedder-web?](https://traverse-framework.com/questions/does-the-website-use-the-latest-traverse-embedder.html): site pins `^0.15.0` (matching npm) and `/discover` admits its signed demo fixture through `registerPackage` with `modelUsage: non_commercial`; the site can lag future releases, so product apps pin published packages, not the website demo. +- [Does the website use the latest traverse-embedder-web?](https://traverse-framework.com/questions/does-the-website-use-the-latest-traverse-embedder.html): site pins `^0.16.2` (matching npm, Nov 5) and `/discover` admits its signed demo fixture through `registerPackage` with an execution policy and `modelUsage: non_commercial`; the `/discover` execute panel still ships its own `runtime.wasm` pinned to the v0.13.0 digest; the site can lag future releases, so product apps pin published packages, not the website demo. - [How does Traverse complement Hugging Face?](https://traverse-framework.com/questions/how-does-traverse-complement-hugging-face.html): Hub = provenance; Traverse = pinned signed client-first capability; not Transformers.js/Hub replacement; no defer promise until a second executor exists. ## Optional diff --git a/src/pages/agents.astro b/src/pages/agents.astro index 968d27a..5f76f2a 100644 --- a/src/pages/agents.astro +++ b/src/pages/agents.astro @@ -144,7 +144,7 @@ const _body = `
- The Oct 9 exact-ref demo is not this server. That write-up is an in-process MCP-shaped JSON-RPC façade over ExactModelBrowserHost under Node. Mode A traverse-mcp is the stdio server on this page. They are not the same. Checksum-pinned Mode A binaries shipped with v0.16.0; the current set is traverse-mcp-v0.16.1 (Linux x64, Linux arm64, macOS arm64, Windows x64, with SHA256SUMS and provenance): download, traverse-mcp sync, traverse-mcp prepare-cache: no Rust toolchain. + The Oct 9 exact-ref demo is not this server. That write-up is an in-process MCP-shaped JSON-RPC façade over ExactModelBrowserHost under Node. Mode A traverse-mcp is the stdio server on this page. They are not the same. Checksum-pinned Mode A binaries shipped with v0.16.0; the current set is traverse-mcp-v0.16.2 (Linux x64, Linux arm64, macOS arm64, Windows x64, with SHA256SUMS and provenance): download, traverse-mcp sync, traverse-mcp prepare-cache: no Rust toolchain.
diff --git a/src/pages/blog/index.astro b/src/pages/blog/index.astro index 8a262b6..ded3794 100644 --- a/src/pages/blog/index.astro +++ b/src/pages/blog/index.astro @@ -2,7 +2,7 @@ import SubpageLayout from '@layouts/SubpageLayout.astro'; const posts = [ - { href: '/blog/model-execute-on-published-packages.html', title: 'One model capability, three published hosts, same answer', desc: 'Featured · Nov 5 · Published catalog model.execute@1.0.0, unchanged, runs a signed ONNX digits package (test-only key) on native (crates.io traverse-runtime 0.16.1), Node 24 and Chromium (npm traverse-embedder-web@0.16.1): identical output, identical 56-byte frame, six identical fail-closed cases (#1782), rerun weekly on a clean CI runner (#1783). Gaps: runtime.wasm comes from the tag (#1784), native frame readback (#1785), no Swift/Android/.NET activation API. Host-connector manifest invokes (#1772) on main, unreleased.' }, + { href: '/blog/model-execute-on-published-packages.html', title: 'One model capability, three published hosts, same answer', desc: 'Featured · Nov 5 · Published catalog model.execute@1.0.0, unchanged, runs a signed ONNX digits package (test-only key) on native (crates.io traverse-runtime 0.16.1), Node 24 and Chromium (npm traverse-embedder-web@0.16.1): identical output, identical 56-byte frame, six identical fail-closed cases (#1782), rerun weekly on a clean CI runner (#1783). Gaps: native frame readback (#1785), no Swift/Android/.NET activation API. Since then, host-connector manifest invokes (#1772) shipped in v0.16.2 and runtime.wasm got its own release (#1784 closed).' }, { href: '/blog/traverse-0-16-0-same-input-same-output.html', title: 'Traverse v0.16.0: same input, same output, on every host', desc: 'Featured · Nov 3 · The v0.16.0 release story. Every host feeds guests RFC 8785 canonical JSON (#1722): rerun on released bits, Node (npm 0.16.0) and the traverse-mcp-v0.16.0 binary give byte-identical core.authorize output, policy_hash 51a64653… on both. Mode A without Rust: prebuilt traverse-mcp for four targets, sync → prepare-cache → stdio. Four breaking changes, the wasmtime 48.0.7 sandbox-escape fix, crates.io at 0.16.0, and what the release does not claim.' }, { href: '/blog/hash-converges.html', title: 'One audit fingerprint, every host', desc: 'Featured · Oct 30 · Weekly demo: same core.authorize@1.2.0 WASM, before and after. Browser on the v0.15.0-era runtime.wasm gives policy_hash 2a126b86…; Browser, Node and traverse-mcp built from traverse main 70f3ee7 all give 51a64653…, byte-identical from unsorted input (RFC 8785, #1739). traverse-mcp sync against live index-v412; no staged fixtures (#1720 closed); five freestyle moves still get typed refusals. Unreleased main, not v0.16.0; no prebuilt binary (#1721).' }, { href: '/blog/same-wasm-two-hashes.html', title: 'Same WASM, two hashes. The bug wasn\'t in the WASM.', desc: 'Featured · Oct 30 · Why catalog core.authorize@1.2.0 gave a different policy_hash on traverse-mcp than on the embedders (traverse#1722), and the rule now on main: every host feeds guests RFC 8785 canonical JSON input or refuses with input_not_canonicalizable (Decision 118, #1739). Cross-host conformance fixture on native, runtime.wasm and Node. Ships in v0.16.0, not released yet.' }, diff --git a/src/pages/blog/model-execute-on-published-packages.astro b/src/pages/blog/model-execute-on-published-packages.astro index 1a19959..1ae7ab2 100644 --- a/src/pages/blog/model-execute-on-published-packages.astro +++ b/src/pages/blog/model-execute-on-published-packages.astro @@ -76,16 +76,18 @@ const _body = `

What isn't true yet

-

On main, not released

+

Shipped in v0.16.2

-

Application manifests and CLI activation can now declare host-connector invokes. That is #1772, merged November 4 via #1788, on top of the published traverse-registry 0.31.0 invoke union. It isn't in any release yet. A v0.16.2 release PR (#1793) is open as of this writing.

+

Application manifests and CLI activation can now declare host-connector invokes. That is #1772, merged November 4 via #1788, on top of the published traverse-registry 0.31.0 invoke union. When this post went up it was on main and not in a release.

+ +

Update, November 5, 2026: it shipped in Traverse v0.16.2 (November 4, via #1793). All six crates, npm, Maven Central and nuget.org are at 0.16.2 (what a host-connector invoke looks like).

Reproduce it

@@ -104,8 +106,8 @@ node src/compare.mjs # fails if the run differs from proof/comparison.json<
  • Claim: published catalog model/model.execute@1.0.0 (5ccfa372…) over signed traverse.digits-onnx@1.0.0 (test-only key) gives identical success output, an identical 56-byte frame and six identical fail-closed cases on native (crates.io traverse-runtime 0.16.1), Node 24.16.0 and Chromium 152 (npm traverse-embedder-web@0.16.1). Native adds placement_evidence (Spec 1719 FR-014).
  • Evidence: traverse#1782 (docs/evidence/model-execute-published-2026-11-03, all_identical: true); clean-runner CI traverse#1783 (published-model-execute-demo.yml, weekly Mondays, pinned to v0.16.1); #1776 closed.
  • Web API (v0.16.1): BundleEmbedder.activateMediatedConnector + exactModelMediatedConnector, submitAsync; sync submit → async_submit_required.
  • -
  • Gaps: runtime.wasm (7a322a17…) and the model package come from the v0.16.1 tag (#1784); native frame readback (#1785); no Swift/Android/.NET activation API; live-Registry rights #1786; no Spec 529 certification.
  • -
  • Unreleased on main (Nov 4): host-connector invokes in application manifests and CLI activation (#1772 via #1788, registry 0.31.0); v0.16.2 release PR #1793 open.
  • +
  • Gaps: the model package comes from the v0.16.1 tag; runtime.wasm (7a322a17…) came from the tag at run time and is now also on the runtime-wasm-v0.16.1 release (#1784 closed by #1797); native frame readback (#1785); no Swift/Android/.NET activation API; live-Registry rights #1786; no Spec 529 certification.
  • +
  • Shipped in v0.16.2 (Nov 4): host-connector invokes in CLI workspace application manifests (#1772 via #1788, registry 0.31.0).
  • Lead claim: one shared runtime; hosts are clients that answer connector calls. Discover → execute → trace.
  • @@ -120,7 +122,7 @@ node src/compare.mjs # fails if the run differs from proof/comparison.json<
  • What matched
  • Why three hosts agree
  • What isn't true yet
  • -
  • On main, not released
  • +
  • Shipped in v0.16.2
  • Reproduce it
  • Facts for agents
  • diff --git a/src/pages/changelog.astro b/src/pages/changelog.astro index 0364172..229cfff 100644 --- a/src/pages/changelog.astro +++ b/src/pages/changelog.astro @@ -2,12 +2,13 @@ import SubpageLayout from '@layouts/SubpageLayout.astro'; --- - +

    Release history

    What shipped in Traverse. Each release is backed by versioned, reviewable work.

    -

    View all releases on GitHub →

    -

    Catalog model.execute on Browser and Node

    v0.16.1 is an additive patch lockstep crate + npm release. No breaking host ABI change. Upgrade from v0.16.0 by bumping pins (notes).

    • Catalog model.execute@1.0.0 on Browser and Node (#1719, #1770, Decision 122, Spec 1719). A guest suspends at connector_invoke; the host answers asynchronously and the guest resumes through the same Spec 104 checks.
    • Web APIs: BundleEmbedder.activateMediatedConnector and exactModelMediatedConnector. Use submitAsync; sync submit fails with async_submit_required.
    • Fix on every host (Spec 104 1.1.0 FR-008): the output filter no longer refuses a signed model_evidence for holding public URLs.
    • Shared cross-host vector fixtures/cross-host/model-execute-v1; ExactModelExecution gains output_schema_ref.
    • After the release, the published guest ran unchanged on native, Node and Chromium from the v0.16.1 packages with identical results (details).
    • Swift, Android and .NET activation APIs are not shipped yet.

    Pins: npm, Maven Central, nuget.org and all six crates at 0.16.1; swift-host-v0.16.1, traverse-mcp-v0.16.1, onnx-runner-v0.16.1. runtime.wasm sha256 7a322a17…, from the tag (why).

    Product Release: Traverse v0.16.1 · Release notes.

    +

    View all releases on GitHub

    +

    Host-connector invokes in application manifests

    v0.16.2 is an additive patch lockstep crate + npm release. No host ABI, guest ABI or bridge ABI change. Upgrade from v0.16.1 by bumping pins (notes).

    • Host-connector invokes in the CLI (#1772, #1788, Spec 1773). A traverse-cli workspace application state may invoke exactly one of a capability or a host connector. The CLI materializes and registers a host connector as a host connector, never as a capability reference (how it looks).
    • Still fail closed: empty, ambiguous and malformed invoke declarations are rejected before activation.
    • Consumes traverse-registry 0.31.0, which carries the typed exact-one ApplicationStateInvoke union.
    • Existing capability-target manifests behave as before.

    Pins: npm, Maven Central, nuget.org and all six crates at 0.16.2; swift-host-v0.16.2, traverse-mcp-v0.16.2, onnx-runner-v0.16.2 (same runner bytes as v0.16.0). runtime.wasm sha256 b313b5c5… on runtime-wasm-v0.16.2.

    Product Release: Traverse v0.16.2 · Release notes.

    +

    Catalog model.execute on Browser and Node

    v0.16.1 is an additive patch lockstep crate + npm release. No breaking host ABI change. Upgrade from v0.16.0 by bumping pins (notes).

    • Catalog model.execute@1.0.0 on Browser and Node (#1719, #1770, Decision 122, Spec 1719). A guest suspends at connector_invoke; the host answers asynchronously and the guest resumes through the same Spec 104 checks.
    • Web APIs: BundleEmbedder.activateMediatedConnector and exactModelMediatedConnector. Use submitAsync; sync submit fails with async_submit_required.
    • Fix on every host (Spec 104 1.1.0 FR-008): the output filter no longer refuses a signed model_evidence for holding public URLs.
    • Shared cross-host vector fixtures/cross-host/model-execute-v1; ExactModelExecution gains output_schema_ref.
    • After the release, the published guest ran unchanged on native, Node and Chromium from the v0.16.1 packages with identical results (details).
    • Swift, Android and .NET activation APIs are not shipped yet.

    Pins: npm, Maven Central, nuget.org and all six crates at 0.16.1; swift-host-v0.16.1, traverse-mcp-v0.16.1, onnx-runner-v0.16.1. runtime.wasm sha256 7a322a17…, from the tag at release time; since November 4 it is also on runtime-wasm-v0.16.1 (details).

    Product Release: Traverse v0.16.1 · Release notes.

    Same input, same output on every host

    v0.16.0 is a minor lockstep crate + npm release with breaking changes (this repo's 0.x convention uses a minor bump). Discover → execute → trace, on one shared runtime.wasm. No host is Certified under Spec 529. Upgrade notes: How do I upgrade to Traverse v0.16.0?

    • Breaking: placement at registration (#1706, Decision 120, Spec 138 0.16.0). Every host's registration call takes the execution policy, so no call pays the one-time preparation.
    • Breaking: canonical guest input (#1722, Decision 118). Guests receive RFC 8785 canonical JSON on every host, so the same WASM given the same logical input produces the same output.
    • Breaking: contract inputs enforced by the host (#1658). Unknown fields fail before the artifact runs.
    • Breaking: Registry rights fail closed (#1727, #1728, #1729). Revoked Registry versions are rejected, conditional model rights need an explicit host opt-in, and Registry contract signatures are verified over their exact source bytes.
    • traverse-mcp Mode A without Rust (#1653, Decision 121). Checksum-pinned binaries for four targets on traverse-mcp-v0.16.0, a sync command, and a three-command quickstart.
    • Security: wasmtime 48.0.7 with Rust 1.95 (#1744), and the ONNX runner guest on tract-onnx 0.23.9 (#1735, onnx-runner-v0.16.0).
    • Also: multi-input, multi-output ONNX packaging (#1661), model verify --model-usage (#1686), web modelUsage validation (#1685), manifest schema 2.3.0 score_transform, governed-path iPhone evidence (#1630), and the Swift xcframework on swift-host-v0.16.0.

    Pins: npm, Maven Central, and nuget.org at 0.16.0. The six 0.16.0 crates reached crates.io on the afternoon of November 2; installing or building them needs Rust 1.95. This release moves traverse-registry to 0.29.0. It does not establish live Registry coverage or production compliance.

    Product Release: Traverse v0.16.0 · Release notes · Upgrade guide.

    Governed model execution on every host

    v0.15.0 is a minor lockstep crate + npm release with breaking Spec 138 exact-ref changes (this repo's 0.x convention uses a minor bump). Signed exact-ref packages now run on the Swift, Kotlin/Android, and .NET embedders, in addition to native Rust and the browser. Every host enforces model rights. Discover → execute → trace, on one shared runtime.wasm. No host is Certified under Spec 529.

    • ExactModelHost is published: Swift on the swift-host-v0.15.0 xcframework (Package.swift later pinned the swift-host-v0.15.0-1 rebuild, #1695; the v0.15.0 tag itself still pointed at swift-host-v0.14.0-4). Kotlin com.traverse-framework:traverse-embedder 0.15.0 on Maven Central and .NET TraverseEmbedder 0.15.0 on nuget.org include ExactModelHost (#1651, closed).
    • Breaking model_usage: an app with exact_model_dependencies must declare model_usage as commercial or non_commercial. Without it, calls fail closed with usage_undeclared.
    • Third-party ONNX: traverse-cli model can digest, sign, verify, pin, and package an ONNX model onto an audited guest.
    • Repeat inference: guest ABI v3 snapshot reuse makes a later call restore a prepared snapshot. The release describes that as faster repeat inference.
    • Core ML is opt-in on Apple hosts: a package's signed Core ML variant runs under the same policy, tolerance, and evidence rules. The default placement stays wasm-cpu. Evidence so far is macOS cargo test plus the Decision 113 iPhone spike. Governed-path iPhone evidence was still open at release (traverse#1630; it shipped in v0.16.0). There is no web, Android, or desktop GPU adapter.

    Pins: crates.io, npm, Maven Central, and nuget.org at 0.15.0. This release pins traverse-registry at =0.28.0 (registry#636). digits-mlp-1.0.0 remains a test-only key; production custody, rotation, and revocation are still #1567. The web embedder reports its real package version (#1654).

    Product Release: Traverse v0.15.0 · Release notes · Upgrade guide.

    Signed exact-ref models + digits-mlp

    v0.14.0 is a minor lockstep crate + npm release with breaking Spec 138 exact-ref surface changes (0.x minor convention). Model manifests move to schema 2.0.0 with detached Ed25519 model.sig.json; host-owned trust roots; first trained digits-mlp-1.0.0 (test-only key; production signing tracked separately). Discover → execute → trace, on one shared runtime.wasm. Published exact-ref execute is native Rust and the web embedder in this cut, plus Swift ExactModelHost on xcframework swift-host-v0.14.0-4 (Package.swift pin; first on swift-host-v0.14.0-1, #1579 closed 2026-09-30). Kotlin ExactModelHost is on main (#1580) and is not in Maven Central 0.14.0. .NET ExactModelHost is on main (#1602) and is not in nuget.org TraverseEmbedder 0.14.0. Next package cuts: #1651. Pin the Traverse crates and npm at 0.14.0. That release pins traverse-registry at =0.25.0; crates.io has since published traverse-registry 0.27.0. Product Release: Traverse v0.14.0.

    diff --git a/src/pages/docs/guides/mcp-setup.astro b/src/pages/docs/guides/mcp-setup.astro index e1143f6..1865c70 100644 --- a/src/pages/docs/guides/mcp-setup.astro +++ b/src/pages/docs/guides/mcp-setup.astro @@ -1,7 +1,7 @@ --- import SubpageLayout from '@layouts/SubpageLayout.astro'; -const _body = "
    \n \n\n
    \n
    \n
    Guide
    \n

    MCP Server Setup

    \n

    Set up the traverse-mcp stdio server so your own tooling can discover and call your governed capabilities. Read the callout below first: the current binary speaks a Traverse-specific, line-delimited JSON command protocol (spec 022-mcp-wasm-server labeling notwithstanding), not the standard MCP JSON-RPC tools/list / tools/call methods, so it does not plug into Claude Desktop or other generic MCP clients as-is today.

    \n
    \n Protocol note. crates/traverse-mcp/src/stdio_server.rs parses one JSON object per line with a command field: describe_server, list_content_groups, describe_content_group, list_entrypoints, search_capabilities, describe_entrypoint, validate_entrypoint, execute_entrypoint, render_execution_report, and shutdown: rather than JSON-RPC 2.0 envelopes with a method of tools/list or tools/call. The tools/list / tools/call examples further down this guide describe the target shape of a generic MCP client integration, not the wire format this binary accepts today.\n
    \n
    \n v0.16.1\n ~15 minutes\n No Rust for Mode A\n Rust 1.95+ from source\n
    \n
    \n Fastest path (v0.16.1): Mode A, no Rust toolchain. Since Traverse v0.16.0 (November 2, 2026), each release ships a traverse-mcp-v* binary set; the current one, traverse-mcp-v0.16.1, ships checksum-pinned binaries (with SHA256SUMS and build provenance) for x86_64-unknown-linux-gnu, aarch64-unknown-linux-gnu, aarch64-apple-darwin and x86_64-pc-windows-msvc (.zip). Three commands give your agent a digest-verified cache of public registry capabilities:\n
    curl -L https://github.com/traverse-framework/traverse/releases/download/traverse-mcp-v0.16.0/traverse-mcp-aarch64-apple-darwin.tar.gz | tar -xz\n./traverse-mcp sync --out synced-state.json\n./traverse-mcp prepare-cache --synced-state synced-state.json --cache traverse-cache --ref core/core.authorize@^1
    \n Then launch it as traverse-mcp stdio --cache /absolute/path/to/traverse-cache. Add one --ref per capability. Checksum and provenance verification and troubleshooting: core docs/mcp-mode-a-release-evidence.md. The steps below are the contributor path, building from a checkout against the expedition bundle.\n
    \n
    \n\n \n
    \n
    \n
    01
    \n Prerequisites\n
    \n

    Before you start

    \n

    You need three things before starting the MCP server.

    \n
      \n
    • Rust installed (rustc --version should print 1.95 or later; v0.16.0 moved the minimum to 1.95)
    • \n
    • The Traverse repo cloned locally (contributor mode loads the expedition bundle; in v0.16.0 pass it with --bundle <manifest-path>. The crates.io traverse-mcp 0.15.0 binary can't start outside a checkout: catalog_load_failed, traverse#1720, fixed in v0.16.0)
    • \n
    • A bundle built and ready: run the quickstart first if you have not
    • \n
    \n
    \n New here? Complete the Quickstart first. It walks you through building the expedition bundle that this guide uses.\n
    \n
    \n\n \n
    \n
    \n
    02
    \n Start the server\n
    \n

    Start the MCP server

    \n

    \n The MCP server reads from stdin and writes to stdout. It does not bind a port. Run it with cargo run during development. Since v0.16.0, contributor mode needs an explicit --bundle; without --cache or --bundle, startup fails with contributor_bundle_required.\n

    \n
    \n
    start traverse-mcp
    \n
    \n
    $ cargo run -p traverse-mcp -- stdio --bundle examples/expedition/registry-bundle/manifest.json
    \n
    Traverse MCP server ready (stdio)
    \n
    Waiting for JSON-RPC input...
    \n
    \n
    \n

    \n The server stays running and processes one JSON-RPC message per line. In production you hand the binary path to your MCP client and let the client manage the process.\n

    \n
    \n\n \n
    \n
    \n
    03
    \n Client config\n
    \n

    Configure your MCP client

    \n

    \n Most MCP clients take a JSON config that maps a server name to a command. Point yours at the compiled traverse-mcp binary.\n

    \n
    \n
    mcp-config.json
    \n
    \n{\n \"mcpServers\": {\n \"traverse\": {\n \"command\": \"/path/to/traverse/target/debug/traverse-mcp\",\n \"args\": [\"stdio\", \"--bundle\", \"/path/to/traverse/examples/expedition/registry-bundle/manifest.json\"],\n \"env\": {}\n }\n }\n}\n
    \n
    \n

    \n Replace /path/to/traverse with the absolute path to your local repo. The binary is at target/debug/traverse-mcp after a dev build, or target/release/traverse-mcp after a release build.\n

    \n

    Cursor

    \n

    \n Cursor reads project MCP config from .cursor/mcp.json (or the user MCP settings UI). Use the same absolute binary path and pass stdio.\n

    \n
    \n
    .cursor/mcp.json
    \n
    \n{\n \"mcpServers\": {\n \"traverse\": {\n \"command\": \"/absolute/path/to/traverse/target/debug/traverse-mcp\",\n \"args\": [\"stdio\", \"--bundle\", \"/path/to/traverse/examples/expedition/registry-bundle/manifest.json\"]\n }\n }\n}\n
    \n
    \n

    \n Same protocol caveat as Claude Desktop: today\\'s traverse-mcp stdio speaks Traverse\\'s line-delimited command protocol, not generic MCP tools/list / tools/call. Treat these snippets as the correct process launcher; wire-protocol translation is still required for stock Cursor tool listing. See core docs/mcp-stdio-server.md for the live command surface.\n

    \n
    \n\n \n
    \n
    \n
    04
    \n Test\n
    \n

    Target shape: tools/list

    \n

    \n The JSON-RPC tools/list / tools/call examples below are the target shape for a generic MCP client integration. They are not what the current binary accepts on stdin: see the protocol note at the top of this page and core docs/mcp-stdio-server.md for the live line-delimited commands.\n

    \n
    \n
    tools/list request
    \n
    \n
    $ echo '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/list\",\"params\":{}}' \\
    \n
    | cargo run -p traverse-mcp -- stdio --bundle examples/expedition/registry-bundle/manifest.json
    \n
    \n
    \n
    \n
    response
    \n
    \n{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"tools\": [\n {\n \"name\": \"plan-expedition\",\n \"description\": \"Plan an alpine expedition for a team. Returns itinerary and equipment list.\",\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"goal\": { \"type\": \"string\" },\n \"team_size\": { \"type\": \"integer\" },\n \"duration_days\": { \"type\": \"integer\" }\n },\n \"required\": [\"goal\", \"team_size\", \"duration_days\"]\n }\n }\n ]\n }\n}\n
    \n
    \n
    \n\n \n
    \n
    \n
    05
    \n Execute\n
    \n

    Execute a capability via MCP

    \n

    \n Use tools/call to invoke a capability. Pass the tool name and a JSON arguments object matching the input schema.\n

    \n
    \n
    tools/call request
    \n
    \n{\n \"jsonrpc\": \"2.0\",\n \"id\": 2,\n \"method\": \"tools/call\",\n \"params\": {\n \"name\": \"plan-expedition\",\n \"arguments\": {\n \"goal\": \"Plan a two-day alpine expedition for a four-person team.\",\n \"team_size\": 4,\n \"duration_days\": 2\n }\n }\n}\n
    \n
    \n
    \n
    response
    \n
    \n{\n \"jsonrpc\": \"2.0\",\n \"id\": 2,\n \"result\": {\n \"content\": [\n {\n \"type\": \"text\",\n \"text\": \"Day 1: Ascent to base camp...\"\n }\n ],\n \"_traverse\": {\n \"trace_id\": \"trc_7f3a1b\",\n \"status\": \"completed\",\n \"duration_ms\": 143,\n \"capability\": \"plan-expedition@1.0.0\",\n \"events_emitted\": [\"expedition.planned\"]\n }\n }\n}\n
    \n
    \n
    \n\n \n
    \n
    \n
    06
    \n Response fields\n
    \n

    Understanding the response

    \n

    \n When a generic MCP façade is in front of Traverse, responses typically include a standard content block for the client. The _traverse metadata object below is an illustrative target shape for that façade, not a guarantee of every field on today\'s line-delimited stdio server. Prefer the core MCP docs for the live envelope.\n

    \n
    \n
    \n
    content
    \n
    Array of MCP content blocks. Usually a single text block with the capability output. Passed directly to the AI agent.
    \n
    \n
    \n
    _traverse.trace_id
    \n
    Unique ID for this execution. Use it to look up the full trace record for debugging.
    \n
    \n
    \n
    _traverse.status
    \n
    completed or error. If error, an error field is also present with the reason and failing state.
    \n
    \n
    \n
    _traverse.duration_ms
    \n
    Total wall time for the execution in milliseconds.
    \n
    \n
    \n
    _traverse.capability
    \n
    The ID and version of the capability that was selected and executed.
    \n
    \n
    \n
    _traverse.events_emitted
    \n
    List of event IDs published during execution. Empty array if no events were emitted.
    \n
    \n
    \n
    \n\n \n
    \n
    \n
    07
    \n Claude Desktop\n
    \n

    Connect to Claude Desktop or other MCP clients

    \n

    \n Claude Desktop uses a claude_desktop_config.json file. The pattern is the same as the generic config above. Add a traverse entry under mcpServers.\n

    \n
    \n
    ~/Library/Application Support/Claude/claude_desktop_config.json
    \n
    \n{\n \"mcpServers\": {\n \"traverse\": {\n \"command\": \"/absolute/path/to/traverse/target/debug/traverse-mcp\",\n \"args\": [\"stdio\", \"--bundle\", \"/path/to/traverse/examples/expedition/registry-bundle/manifest.json\"]\n }\n }\n}\n
    \n
    \n

    \n As noted above, this wiring only works once the server speaks the client's expected MCP wire protocol. Today's traverse-mcp stdio binary uses its own line-delimited command protocol, so it will not yet surface Traverse capabilities in Claude Desktop's tools list without a translation layer in front of it.\n

    \n
    \n Path must be absolute. Relative paths do not work in Claude Desktop config. Use the full path from your filesystem root.\n
    \n
    \n\n \n \n
    \n
    \n\n"; +const _body = "
    \n \n\n
    \n
    \n
    Guide
    \n

    MCP Server Setup

    \n

    Set up the traverse-mcp stdio server so your own tooling can discover and call your governed capabilities. Read the callout below first: the current binary speaks a Traverse-specific, line-delimited JSON command protocol (spec 022-mcp-wasm-server labeling notwithstanding), not the standard MCP JSON-RPC tools/list / tools/call methods, so it does not plug into Claude Desktop or other generic MCP clients as-is today.

    \n
    \n Protocol note. crates/traverse-mcp/src/stdio_server.rs parses one JSON object per line with a command field: describe_server, list_content_groups, describe_content_group, list_entrypoints, search_capabilities, describe_entrypoint, validate_entrypoint, execute_entrypoint, render_execution_report, and shutdown: rather than JSON-RPC 2.0 envelopes with a method of tools/list or tools/call. The tools/list / tools/call examples further down this guide describe the target shape of a generic MCP client integration, not the wire format this binary accepts today.\n
    \n
    \n v0.16.2\n ~15 minutes\n No Rust for Mode A\n Rust 1.95+ from source\n
    \n
    \n Fastest path (v0.16.2): Mode A, no Rust toolchain. Since Traverse v0.16.0 (November 2, 2026), each release ships a traverse-mcp-v* binary set; the current one, traverse-mcp-v0.16.2, ships checksum-pinned binaries (with SHA256SUMS and build provenance) for x86_64-unknown-linux-gnu, aarch64-unknown-linux-gnu, aarch64-apple-darwin and x86_64-pc-windows-msvc (.zip). Three commands give your agent a digest-verified cache of public registry capabilities:\n
    curl -L https://github.com/traverse-framework/traverse/releases/download/traverse-mcp-v0.16.0/traverse-mcp-aarch64-apple-darwin.tar.gz | tar -xz\n./traverse-mcp sync --out synced-state.json\n./traverse-mcp prepare-cache --synced-state synced-state.json --cache traverse-cache --ref core/core.authorize@^1
    \n Then launch it as traverse-mcp stdio --cache /absolute/path/to/traverse-cache. Add one --ref per capability. Checksum and provenance verification and troubleshooting: core docs/mcp-mode-a-release-evidence.md. The steps below are the contributor path, building from a checkout against the expedition bundle.\n
    \n
    \n\n \n
    \n
    \n
    01
    \n Prerequisites\n
    \n

    Before you start

    \n

    You need three things before starting the MCP server.

    \n
      \n
    • Rust installed (rustc --version should print 1.95 or later; v0.16.0 moved the minimum to 1.95)
    • \n
    • The Traverse repo cloned locally (contributor mode loads the expedition bundle; in v0.16.0 pass it with --bundle <manifest-path>. The crates.io traverse-mcp 0.15.0 binary can't start outside a checkout: catalog_load_failed, traverse#1720, fixed in v0.16.0)
    • \n
    • A bundle built and ready: run the quickstart first if you have not
    • \n
    \n
    \n New here? Complete the Quickstart first. It walks you through building the expedition bundle that this guide uses.\n
    \n
    \n\n \n
    \n
    \n
    02
    \n Start the server\n
    \n

    Start the MCP server

    \n

    \n The MCP server reads from stdin and writes to stdout. It does not bind a port. Run it with cargo run during development. Since v0.16.0, contributor mode needs an explicit --bundle; without --cache or --bundle, startup fails with contributor_bundle_required.\n

    \n
    \n
    start traverse-mcp
    \n
    \n
    $ cargo run -p traverse-mcp -- stdio --bundle examples/expedition/registry-bundle/manifest.json
    \n
    Traverse MCP server ready (stdio)
    \n
    Waiting for JSON-RPC input...
    \n
    \n
    \n

    \n The server stays running and processes one JSON-RPC message per line. In production you hand the binary path to your MCP client and let the client manage the process.\n

    \n
    \n\n \n
    \n
    \n
    03
    \n Client config\n
    \n

    Configure your MCP client

    \n

    \n Most MCP clients take a JSON config that maps a server name to a command. Point yours at the compiled traverse-mcp binary.\n

    \n
    \n
    mcp-config.json
    \n
    \n{\n \"mcpServers\": {\n \"traverse\": {\n \"command\": \"/path/to/traverse/target/debug/traverse-mcp\",\n \"args\": [\"stdio\", \"--bundle\", \"/path/to/traverse/examples/expedition/registry-bundle/manifest.json\"],\n \"env\": {}\n }\n }\n}\n
    \n
    \n

    \n Replace /path/to/traverse with the absolute path to your local repo. The binary is at target/debug/traverse-mcp after a dev build, or target/release/traverse-mcp after a release build.\n

    \n

    Cursor

    \n

    \n Cursor reads project MCP config from .cursor/mcp.json (or the user MCP settings UI). Use the same absolute binary path and pass stdio.\n

    \n
    \n
    .cursor/mcp.json
    \n
    \n{\n \"mcpServers\": {\n \"traverse\": {\n \"command\": \"/absolute/path/to/traverse/target/debug/traverse-mcp\",\n \"args\": [\"stdio\", \"--bundle\", \"/path/to/traverse/examples/expedition/registry-bundle/manifest.json\"]\n }\n }\n}\n
    \n
    \n

    \n Same protocol caveat as Claude Desktop: today\\'s traverse-mcp stdio speaks Traverse\\'s line-delimited command protocol, not generic MCP tools/list / tools/call. Treat these snippets as the correct process launcher; wire-protocol translation is still required for stock Cursor tool listing. See core docs/mcp-stdio-server.md for the live command surface.\n

    \n
    \n\n \n
    \n
    \n
    04
    \n Test\n
    \n

    Target shape: tools/list

    \n

    \n The JSON-RPC tools/list / tools/call examples below are the target shape for a generic MCP client integration. They are not what the current binary accepts on stdin: see the protocol note at the top of this page and core docs/mcp-stdio-server.md for the live line-delimited commands.\n

    \n
    \n
    tools/list request
    \n
    \n
    $ echo '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/list\",\"params\":{}}' \\
    \n
    | cargo run -p traverse-mcp -- stdio --bundle examples/expedition/registry-bundle/manifest.json
    \n
    \n
    \n
    \n
    response
    \n
    \n{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"result\": {\n \"tools\": [\n {\n \"name\": \"plan-expedition\",\n \"description\": \"Plan an alpine expedition for a team. Returns itinerary and equipment list.\",\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"goal\": { \"type\": \"string\" },\n \"team_size\": { \"type\": \"integer\" },\n \"duration_days\": { \"type\": \"integer\" }\n },\n \"required\": [\"goal\", \"team_size\", \"duration_days\"]\n }\n }\n ]\n }\n}\n
    \n
    \n
    \n\n \n
    \n
    \n
    05
    \n Execute\n
    \n

    Execute a capability via MCP

    \n

    \n Use tools/call to invoke a capability. Pass the tool name and a JSON arguments object matching the input schema.\n

    \n
    \n
    tools/call request
    \n
    \n{\n \"jsonrpc\": \"2.0\",\n \"id\": 2,\n \"method\": \"tools/call\",\n \"params\": {\n \"name\": \"plan-expedition\",\n \"arguments\": {\n \"goal\": \"Plan a two-day alpine expedition for a four-person team.\",\n \"team_size\": 4,\n \"duration_days\": 2\n }\n }\n}\n
    \n
    \n
    \n
    response
    \n
    \n{\n \"jsonrpc\": \"2.0\",\n \"id\": 2,\n \"result\": {\n \"content\": [\n {\n \"type\": \"text\",\n \"text\": \"Day 1: Ascent to base camp...\"\n }\n ],\n \"_traverse\": {\n \"trace_id\": \"trc_7f3a1b\",\n \"status\": \"completed\",\n \"duration_ms\": 143,\n \"capability\": \"plan-expedition@1.0.0\",\n \"events_emitted\": [\"expedition.planned\"]\n }\n }\n}\n
    \n
    \n
    \n\n \n
    \n
    \n
    06
    \n Response fields\n
    \n

    Understanding the response

    \n

    \n When a generic MCP façade is in front of Traverse, responses typically include a standard content block for the client. The _traverse metadata object below is an illustrative target shape for that façade, not a guarantee of every field on today\'s line-delimited stdio server. Prefer the core MCP docs for the live envelope.\n

    \n
    \n
    \n
    content
    \n
    Array of MCP content blocks. Usually a single text block with the capability output. Passed directly to the AI agent.
    \n
    \n
    \n
    _traverse.trace_id
    \n
    Unique ID for this execution. Use it to look up the full trace record for debugging.
    \n
    \n
    \n
    _traverse.status
    \n
    completed or error. If error, an error field is also present with the reason and failing state.
    \n
    \n
    \n
    _traverse.duration_ms
    \n
    Total wall time for the execution in milliseconds.
    \n
    \n
    \n
    _traverse.capability
    \n
    The ID and version of the capability that was selected and executed.
    \n
    \n
    \n
    _traverse.events_emitted
    \n
    List of event IDs published during execution. Empty array if no events were emitted.
    \n
    \n
    \n
    \n\n \n
    \n
    \n
    07
    \n Claude Desktop\n
    \n

    Connect to Claude Desktop or other MCP clients

    \n

    \n Claude Desktop uses a claude_desktop_config.json file. The pattern is the same as the generic config above. Add a traverse entry under mcpServers.\n

    \n
    \n
    ~/Library/Application Support/Claude/claude_desktop_config.json
    \n
    \n{\n \"mcpServers\": {\n \"traverse\": {\n \"command\": \"/absolute/path/to/traverse/target/debug/traverse-mcp\",\n \"args\": [\"stdio\", \"--bundle\", \"/path/to/traverse/examples/expedition/registry-bundle/manifest.json\"]\n }\n }\n}\n
    \n
    \n

    \n As noted above, this wiring only works once the server speaks the client's expected MCP wire protocol. Today's traverse-mcp stdio binary uses its own line-delimited command protocol, so it will not yet surface Traverse capabilities in Claude Desktop's tools list without a translation layer in front of it.\n

    \n
    \n Path must be absolute. Relative paths do not work in Claude Desktop config. Use the full path from your filesystem root.\n
    \n
    \n\n \n \n
    \n
    \n\n"; --- +

    Quickstart

    -

    Build the current runtime and inspect a governed bundle. This path works with Traverse v0.16.1 and Rust 1.95 or later.

    +

    Build the current runtime and inspect a governed bundle. This path works with Traverse v0.16.2 and Rust 1.95 or later.

    git clone https://github.com/traverse-framework/traverse.git
     cd traverse
     cargo build
    diff --git a/src/pages/index.astro b/src/pages/index.astro
    index b6c7e04..185e9d0 100644
    --- a/src/pages/index.astro
    +++ b/src/pages/index.astro
    @@ -1,8 +1,8 @@
     ---
     import BaseLayout from '@layouts/BaseLayout.astro';
     
    -const _body = "\n
    \n
    \n
    \n
    \n \n v0.16.1 · Apache 2.0 · Open source\n
    \n

    \n Governed capability runtime.\n

    \n

    Discover, execute, trace.

    \n

    \n Write business logic once as WASM and run it on every host. Agents propose, the runtime decides.\n

    \n \n
    \n
    \n\n\n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n pricing.toml\n
    \n
    \n
    [capability]\nname    = \"calculate-price\"\nversion = \"1.2.0\"\nwasm    = \"pricing.wasm\"\n\n[governing_spec]\ntitle   = \"Pricing Policy v3\"\nsource  = \"docs/pricing-policy.md\"\n\n[input]\ntype = \"object\"\nproperties.sku      = \"string\"\nproperties.quantity = \"integer\"\nproperties.region   = \"string\"\nrequired = [\"sku\", \"quantity\"]\n\n[output]\ntype = \"object\"\nproperties.total    = \"number\"\nproperties.currency = \"string\"\nrequired = [\"total\", \"currency\"]
    \n
    \n
    \n
    \n
    \n
    \n
    \n terminal\n
    \n
    \n
    $traverse run pricing --input '{\"sku\":\"PRO\",\"quantity\":5}'
    \n
    ✓ Contract validated
    \n
    ✓ WASM executed (2.1ms)
    \n
    → {\"total\": 249.95, \"currency\": \"USD\"}
    \n
    \n
    \n
    \n
    \n\n \n
    \n
    How Traverse works
    \n

    \n Write a contract.
    Ship a capability.\n

    \n

    \n Three steps from idea to portable, contract-governed business logic on the hosts that have shipped.\n

    \n
    \n
    \n
    01
    \n
    \n

    Define the contract

    \n

    Write a TOML file with your capability name, the WASM binary path, and JSON Schema definitions for inputs and outputs. Link it to the governing spec document your team actually works from.

    \n
    \n
    \n
    \n
    02
    \n
    \n

    Author the capability

    \n

    Skill-first, so you don’t have to write Rust. Usual path: describe it in plain English and the Claude skill traverse-capability-author drafts the contract, builds the WASM, and opens a human-reviewed PR. The manual path is still Rust compiled to wasm32-wasip1. Same artifact on every embedder.

    \n
    \n
    \n
    \n
    03
    \n
    \n

    Register and run

    \n

    Add the capability to the registry with traverse add. Call it from the CLI, from an AI agent via MCP, or from your app directly. Every call is validated and traced.

    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n\n\n
    \n
    \n
    \n
    Features
    \n

    Everything business logic needs

    \n

    From contract validation to AI agent discovery, Traverse handles the entire lifecycle.

    \n
    \n
    \n
    \n
    \n \n
    \n

    Contract-first validation

    \n

    Every capability call validates inputs against a JSON Schema precondition before execution. Postconditions validate the output. Bad data never reaches your logic.

    \n
    \n
    \n
    \n \n
    \n

    WASM sandbox isolation

    \n

    Each capability runs in its own Wasmtime WASM instance with linear memory isolation. A capability cannot access host resources it was not explicitly granted.

    \n
    \n
    \n
    \n \n
    \n

    AI agent integration

    \n

    Expose your entire capability registry to AI agents via the MCP stdio server. Claude, GPT-4, and any MCP-compatible agent can discover and call capabilities safely.

    \n
    \n
    \n
    \n \n
    \n

    Honest host surface

    \n

    Shipped today: native (Linux/macOS/Windows) and browser via traverse-embedder-web. Swift, Kotlin, and .NET packages are published, pre-1.0, and not Certified. Edge is planned; cloud placement is an explicit non-goal for v0.1. See Platforms.

    \n
    \n
    \n
    \n \n
    \n

    Trace artifacts

    \n

    Every execution produces a trace artifact: the input, the output, the contract version, and a timestamp. Audit any past run without re-executing anything.

    \n
    \n
    \n
    \n \n
    \n

    Policy paper trail

    \n

    Every contract can link to the policy document it implements. Specs are honesty hygiene for the codebase, not the product pitch, and not a count to advertise.

    \n
    \n
    \n
    \n
    \n\n\n
    \n
    \n

    Watch a workflow get composed, live.

    \n

    Your browser fetches the real capability registry, and a client-side heuristic (not a hosted AI model) chains matching capabilities into a workflow. No fixtures, no precomputed data.

    \n Watch the live demo\n
    \n
    \n\n\n
    \n
    \n
    \n
    Runtime shape
    \n

    One runtime.wasm. Clients on shipped hosts.

    \n

    Browser, native desktop, CLI, and MCP are shipped clients of one shared runtime.wasm. Swift, Kotlin, and .NET packages are published, pre-1.0, and not Certified. No edge yet; cloud is a non-goal. The agent proposes; the runtime decides. What ships today

    \n
    \n
    \n
    \n
    1
    \n
    Shared runtime.wasm orchestrator. Embedders are clients. Shipped targets are on Platforms.
    \n
    \n
    \n
    0
    \n
    Logic rewrites between shipped hosts. Same contract, same binary, same behavior. (Not a claim about mobile packages, edge, or cloud.)
    \n
    \n
    \n
    2ms
    \n
    Typical contract execution time on the local target. WASM startup is fast. Contract validation adds negligible overhead.
    \n
    \n
    \n
    \n
    \n\n\n
    \n
    \n
    \n
    Use cases
    \n

    Built for real business logic

    \n

    Non-UI business logic lives in capabilities (WASM + contract): pricing, eligibility, codecs, scorers, gates. Hosts and clients do UI and I/O only. “Apps not ready” is help-wanted sequencing, not a reason to leave domain rules in the host. Where does business logic live?

    \n
    \n
    \n
    \n
    \n \n
    \n

    Pricing and discount logic

    \n

    Encode complex pricing rules as a contract with a link to your pricing policy document. The same capability runs via the published Web embedder, native/CLI hosts, and MCP agents with identical results: where those surfaces are shipped.

    \n Learn more\n
    \n
    \n
    \n \n
    \n

    Eligibility and access rules

    \n

    Run eligibility logic as a sandboxed WASM capability so an AI agent can check a user's eligibility for a product, service, or feature without risk of hallucinating the answer.

    \n Learn more\n
    \n
    \n
    \n \n
    \n

    Compliance and audit logic

    \n

    Capture regulatory and compliance rules in versioned contracts with governing spec links. Every execution is traced. Auditors can replay any historical decision from the trace artifact.

    \n Learn more\n
    \n
    \n
    \n \n
    \n

    AI agent guardrails

    \n

    Give your AI agents a set of contract-governed capabilities to call. The agent cannot exceed the contract's boundaries. Postcondition checks block invalid outputs before they propagate.

    \n Learn more\n
    \n
    \n
    \n
    \n\n\n
    \n
    \n
    \n

    Start building with Traverse

    \n

    Install the CLI, write your first contract, and run it in under five minutes.

    \n \n
    \n
    \n\n"; -const _jsonLd = "{\"@context\":\"https://schema.org\",\"@type\":\"SoftwareApplication\",\"name\":\"Traverse\",\"description\":\"A governed capability runtime: discover → execute → trace. Skill-first authoring via traverse-capability-author; one shared runtime.wasm; shipped clients are browser, native desktop, CLI, and MCP. The agent proposes; the runtime decides.\",\"url\":\"https://traverse-framework.com\",\"author\":{\"@type\":\"Person\",\"name\":\"Enrico Piovesan\"},\"license\":\"https://www.apache.org/licenses/LICENSE-2.0\",\"applicationCategory\":\"DeveloperApplication\",\"softwareVersion\":\"0.16.1\",\"codeRepository\":\"https://github.com/traverse-framework/traverse\"}"; +const _body = "\n
    \n
    \n
    \n
    \n \n v0.16.2 · Apache 2.0 · Open source\n
    \n

    \n Governed capability runtime.\n

    \n

    Discover, execute, trace.

    \n

    \n Write business logic once as WASM and run it on every host. Agents propose, the runtime decides.\n

    \n \n
    \n
    \n\n\n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n pricing.toml\n
    \n
    \n
    [capability]\nname    = \"calculate-price\"\nversion = \"1.2.0\"\nwasm    = \"pricing.wasm\"\n\n[governing_spec]\ntitle   = \"Pricing Policy v3\"\nsource  = \"docs/pricing-policy.md\"\n\n[input]\ntype = \"object\"\nproperties.sku      = \"string\"\nproperties.quantity = \"integer\"\nproperties.region   = \"string\"\nrequired = [\"sku\", \"quantity\"]\n\n[output]\ntype = \"object\"\nproperties.total    = \"number\"\nproperties.currency = \"string\"\nrequired = [\"total\", \"currency\"]
    \n
    \n
    \n
    \n
    \n
    \n
    \n terminal\n
    \n
    \n
    $traverse run pricing --input '{\"sku\":\"PRO\",\"quantity\":5}'
    \n
    ✓ Contract validated
    \n
    ✓ WASM executed (2.1ms)
    \n
    → {\"total\": 249.95, \"currency\": \"USD\"}
    \n
    \n
    \n
    \n
    \n\n \n
    \n
    How Traverse works
    \n

    \n Write a contract.
    Ship a capability.\n

    \n

    \n Three steps from idea to portable, contract-governed business logic on the hosts that have shipped.\n

    \n
    \n
    \n
    01
    \n
    \n

    Define the contract

    \n

    Write a TOML file with your capability name, the WASM binary path, and JSON Schema definitions for inputs and outputs. Link it to the governing spec document your team actually works from.

    \n
    \n
    \n
    \n
    02
    \n
    \n

    Author the capability

    \n

    Skill-first, so you don’t have to write Rust. Usual path: describe it in plain English and the Claude skill traverse-capability-author drafts the contract, builds the WASM, and opens a human-reviewed PR. The manual path is still Rust compiled to wasm32-wasip1. Same artifact on every embedder.

    \n
    \n
    \n
    \n
    03
    \n
    \n

    Register and run

    \n

    Add the capability to the registry with traverse add. Call it from the CLI, from an AI agent via MCP, or from your app directly. Every call is validated and traced.

    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n\n\n
    \n
    \n
    \n
    Features
    \n

    Everything business logic needs

    \n

    From contract validation to AI agent discovery, Traverse handles the entire lifecycle.

    \n
    \n
    \n
    \n
    \n \n
    \n

    Contract-first validation

    \n

    Every capability call validates inputs against a JSON Schema precondition before execution. Postconditions validate the output. Bad data never reaches your logic.

    \n
    \n
    \n
    \n \n
    \n

    WASM sandbox isolation

    \n

    Each capability runs in its own Wasmtime WASM instance with linear memory isolation. A capability cannot access host resources it was not explicitly granted.

    \n
    \n
    \n
    \n \n
    \n

    AI agent integration

    \n

    Expose your entire capability registry to AI agents via the MCP stdio server. Claude, GPT-4, and any MCP-compatible agent can discover and call capabilities safely.

    \n
    \n
    \n
    \n \n
    \n

    Honest host surface

    \n

    Shipped today: native (Linux/macOS/Windows) and browser via traverse-embedder-web. Swift, Kotlin, and .NET packages are published, pre-1.0, and not Certified. Edge is planned; cloud placement is an explicit non-goal for v0.1. See Platforms.

    \n
    \n
    \n
    \n \n
    \n

    Trace artifacts

    \n

    Every execution produces a trace artifact: the input, the output, the contract version, and a timestamp. Audit any past run without re-executing anything.

    \n
    \n
    \n
    \n \n
    \n

    Policy paper trail

    \n

    Every contract can link to the policy document it implements. Specs are honesty hygiene for the codebase, not the product pitch, and not a count to advertise.

    \n
    \n
    \n
    \n
    \n\n\n
    \n
    \n

    Watch a workflow get composed, live.

    \n

    Your browser fetches the real capability registry, and a client-side heuristic (not a hosted AI model) chains matching capabilities into a workflow. No fixtures, no precomputed data.

    \n Watch the live demo\n
    \n
    \n\n\n
    \n
    \n
    \n
    Runtime shape
    \n

    One runtime.wasm. Clients on shipped hosts.

    \n

    Browser, native desktop, CLI, and MCP are shipped clients of one shared runtime.wasm. Swift, Kotlin, and .NET packages are published, pre-1.0, and not Certified. No edge yet; cloud is a non-goal. The agent proposes; the runtime decides. What ships today

    \n
    \n
    \n
    \n
    1
    \n
    Shared runtime.wasm orchestrator. Embedders are clients. Shipped targets are on Platforms.
    \n
    \n
    \n
    0
    \n
    Logic rewrites between shipped hosts. Same contract, same binary, same behavior. (Not a claim about mobile packages, edge, or cloud.)
    \n
    \n
    \n
    2ms
    \n
    Typical contract execution time on the local target. WASM startup is fast. Contract validation adds negligible overhead.
    \n
    \n
    \n
    \n
    \n\n\n
    \n
    \n
    \n
    Use cases
    \n

    Built for real business logic

    \n

    Non-UI business logic lives in capabilities (WASM + contract): pricing, eligibility, codecs, scorers, gates. Hosts and clients do UI and I/O only. “Apps not ready” is help-wanted sequencing, not a reason to leave domain rules in the host. Where does business logic live?

    \n
    \n
    \n
    \n
    \n \n
    \n

    Pricing and discount logic

    \n

    Encode complex pricing rules as a contract with a link to your pricing policy document. The same capability runs via the published Web embedder, native/CLI hosts, and MCP agents with identical results: where those surfaces are shipped.

    \n Learn more\n
    \n
    \n
    \n \n
    \n

    Eligibility and access rules

    \n

    Run eligibility logic as a sandboxed WASM capability so an AI agent can check a user's eligibility for a product, service, or feature without risk of hallucinating the answer.

    \n Learn more\n
    \n
    \n
    \n \n
    \n

    Compliance and audit logic

    \n

    Capture regulatory and compliance rules in versioned contracts with governing spec links. Every execution is traced. Auditors can replay any historical decision from the trace artifact.

    \n Learn more\n
    \n
    \n
    \n \n
    \n

    AI agent guardrails

    \n

    Give your AI agents a set of contract-governed capabilities to call. The agent cannot exceed the contract's boundaries. Postcondition checks block invalid outputs before they propagate.

    \n Learn more\n
    \n
    \n
    \n
    \n\n\n
    \n
    \n
    \n

    Start building with Traverse

    \n

    Install the CLI, write your first contract, and run it in under five minutes.

    \n \n
    \n
    \n\n"; +const _jsonLd = "{\"@context\":\"https://schema.org\",\"@type\":\"SoftwareApplication\",\"name\":\"Traverse\",\"description\":\"A governed capability runtime: discover → execute → trace. Skill-first authoring via traverse-capability-author; one shared runtime.wasm; shipped clients are browser, native desktop, CLI, and MCP. The agent proposes; the runtime decides.\",\"url\":\"https://traverse-framework.com\",\"author\":{\"@type\":\"Person\",\"name\":\"Enrico Piovesan\"},\"license\":\"https://www.apache.org/licenses/LICENSE-2.0\",\"applicationCategory\":\"DeveloperApplication\",\"softwareVersion\":\"0.16.2\",\"codeRepository\":\"https://github.com/traverse-framework/traverse\"}"; ---

    Swift / iOS

    In progress
    -

    The engine blocker recorded here as of July 19, 2026 is resolved. The wasmi feasibility spike below was adopted the next day: ADR-0014 selected the wasmi Apple runtime profile, ADR-0015 governed a production Swift wasmi C ABI, and Spec 074 (Approved) now defines the resource-control certification conditions. packages/swift/TraverseEmbedder ships a production WasmiHostBridgeClient backed by TraverseSwiftHost, a released XCFramework wrapping the wasmi interpreter behind a narrow C ABI, that enforces host-owned artifact-size, memory, fuel-per-invocation, and I/O limits on every call. The earlier WasmKit path, which never exposed those controls, has been removed from the package entirely (Decision 96, #1469); WasmKit is not supported. The xcframework ships as versioned swift-host-v* GitHub release assets. The current asset is swift-host-v0.16.1, released with Traverse v0.16.1 on November 3, 2026. The v0.16.1 tag's Package.swift pins swift-host-v0.16.0 (#1769); main moved the pin to swift-host-v0.16.1 after the tag (#1780). The v0.16.0 tag's Package.swift pinned the older rebuild swift-host-v0.15.0-1. The v0.15.0 asset was swift-host-v0.15.0. That published xcframework includes ExactModelHost for signed exact-ref execute (GitHub Release + SPM binary target). Apple hosts can opt in to a package's signed Core ML variant under the same policy, tolerance, and evidence rules; the default placement stays wasm-cpu. Evidence so far is macOS cargo test plus the Decision 113 iPhone spike. Governed-path iPhone evidence shipped in v0.16.0 (traverse#1630): BirdNET on one iPhone 14 Pro Max at p95 141 ms per 3 s clip under [coreml, wasm-cpu], relying on schema 2.3.0 (new in v0.16.0) score_transform (details).

    +

    The engine blocker recorded here as of July 19, 2026 is resolved. The wasmi feasibility spike below was adopted the next day: ADR-0014 selected the wasmi Apple runtime profile, ADR-0015 governed a production Swift wasmi C ABI, and Spec 074 (Approved) now defines the resource-control certification conditions. packages/swift/TraverseEmbedder ships a production WasmiHostBridgeClient backed by TraverseSwiftHost, a released XCFramework wrapping the wasmi interpreter behind a narrow C ABI, that enforces host-owned artifact-size, memory, fuel-per-invocation, and I/O limits on every call. The earlier WasmKit path, which never exposed those controls, has been removed from the package entirely (Decision 96, #1469); WasmKit is not supported. The xcframework ships as versioned swift-host-v* GitHub release assets. The current asset is swift-host-v0.16.2, released with Traverse v0.16.2 on November 4, 2026. The v0.16.2 tag's Package.swift pins swift-host-v0.16.1; main moved the pin to swift-host-v0.16.2 after the tag (#1798). The v0.16.1 tag's Package.swift pinned swift-host-v0.16.0 (#1769). The v0.16.0 tag's Package.swift pinned the older rebuild swift-host-v0.15.0-1. The v0.15.0 asset was swift-host-v0.15.0. That published xcframework includes ExactModelHost for signed exact-ref execute (GitHub Release + SPM binary target). Apple hosts can opt in to a package's signed Core ML variant under the same policy, tolerance, and evidence rules; the default placement stays wasm-cpu. Evidence so far is macOS cargo test plus the Decision 113 iPhone spike. Governed-path iPhone evidence shipped in v0.16.0 (traverse#1630): BirdNET on one iPhone 14 Pro Max at p95 141 ms per 3 s clip under [coreml, wasm-cpu], relying on schema 2.3.0 (new in v0.16.0) score_transform (details).

    The iOS and macOS clients in reference-apps run embedded: in-process TraverseEmbedder loading a digest-pinned runtime.wasm, with no traverse-cli serve sidecar. What's still open: Spec 529 (approved September 13, 2026) defines one host-neutral Certified/Preview classification across Web, Linux/Rust, Apple, Android, and Windows/.NET, but the five-platform conformance runner it calls for is later work, so no host is Certified today. Treat this as real, resource-bounded, pre-1.0 execution, not a certified release.

    -

    Native Swift, Kotlin, and .NET embedders are published and pre-1.0: Swift ships a wasmi xcframework on swift-host-v0.16.1 (the v0.16.1 tag's Package.swift pins swift-host-v0.16.0; main moved to swift-host-v0.16.1 after the tag in #1780), Kotlin is com.traverse-framework:traverse-embedder 0.16.1 on Maven Central, and .NET is TraverseEmbedder 0.16.1 on nuget.org. They are marked In progress. No host is Certified under Spec 529. Signed exact-ref models run on those hosts as well as native Rust and the browser. Check Platforms before assuming a target is shipped.

    +

    Native Swift, Kotlin, and .NET embedders are published and pre-1.0: Swift ships a wasmi xcframework on swift-host-v0.16.2 (the v0.16.2 tag's Package.swift pins swift-host-v0.16.1; main moved to swift-host-v0.16.2 after the tag in #1798), Kotlin is com.traverse-framework:traverse-embedder 0.16.2 on Maven Central, and .NET is TraverseEmbedder 0.16.2 on nuget.org. They are marked In progress. No host is Certified under Spec 529. Signed exact-ref models run on those hosts as well as native Rust and the browser. Known issue in 0.16.2 and earlier: their RuntimeTraverseEmbedder hands a capability the whole {"{target_id, input}"} submit envelope instead of just input. The fix is on main, not released (#1800). Check Platforms before assuming a target is shipped.

    @@ -129,8 +129,8 @@ const _body = `

    Pre-1.0. No invented customers.

    -

    Traverse v0.16.0 (November 2, 2026, breaking; see how to upgrade) keeps that host set and moves the execution policy to registration, canonicalizes guest input (RFC 8785), enforces host contract input schemas, and makes Registry rights fail closed. Traverse v0.16.1 (November 3, 2026, additive patch) lets the catalog model.execute@1.0.0 capability run on the published Browser and Node packages; a run on published v0.16.1 packages gave identical results on native, Node and Chromium (details). Swift, Android and .NET can't activate that connector yet. Traverse v0.15.0 first ran signed exact-ref model packages on native Rust, the browser, Swift, Kotlin/Android, and .NET. Every one of those hosts enforces model rights: an app with exact_model_dependencies must declare model_usage or the call fails closed. Third-party ONNX models can be packaged, signed, and verified with traverse-cli model. Apple hosts can opt in to a signed Core ML variant; the default placement is still wasm-cpu. Evidence so far is macOS cargo test plus the Decision 113 iPhone spike. Governed-path iPhone evidence shipped in v0.16.0 (traverse#1630): BirdNET on one iPhone 14 Pro Max ran at p95 141 ms per 3 s clip under the policy [coreml, wasm-cpu] (details). It relies on manifest schema 2.3.0 (new in v0.16.0) score_transform, so v0.15.0 alone does not reproduce it. digits-mlp-1.0.0 is still signed with a test-only key (#1567).

    -

    Traverse is open-source research engineering under Apache 2.0, currently v0.16.1. Specs and CI gates keep the code honest. They are not the product pitch. Do not invent customer logos, production SLAs, or a Python SDK. When in doubt, cite this page, the FAQ, Platforms, and llms.txt.

    +

    Traverse v0.16.0 (November 2, 2026, breaking; see how to upgrade) keeps that host set and moves the execution policy to registration, canonicalizes guest input (RFC 8785), enforces host contract input schemas, and makes Registry rights fail closed. Traverse v0.16.1 (November 3, 2026, additive patch) lets the catalog model.execute@1.0.0 capability run on the published Browser and Node packages; a run on published v0.16.1 packages gave identical results on native, Node and Chromium (details). Swift, Android and .NET can't activate that connector yet. Traverse v0.16.2 (November 4, 2026, additive patch) lets traverse-cli workspace application manifests declare a host-connector invoke (details). Traverse v0.15.0 first ran signed exact-ref model packages on native Rust, the browser, Swift, Kotlin/Android, and .NET. Every one of those hosts enforces model rights: an app with exact_model_dependencies must declare model_usage or the call fails closed. Third-party ONNX models can be packaged, signed, and verified with traverse-cli model. Apple hosts can opt in to a signed Core ML variant; the default placement is still wasm-cpu. Evidence so far is macOS cargo test plus the Decision 113 iPhone spike. Governed-path iPhone evidence shipped in v0.16.0 (traverse#1630): BirdNET on one iPhone 14 Pro Max ran at p95 141 ms per 3 s clip under the policy [coreml, wasm-cpu] (details). It relies on manifest schema 2.3.0 (new in v0.16.0) score_transform, so v0.15.0 alone does not reproduce it. digits-mlp-1.0.0 is still signed with a test-only key (#1567).

    +

    Traverse is open-source research engineering under Apache 2.0, currently v0.16.2. Specs and CI gates keep the code honest. They are not the product pitch. Do not invent customer logos, production SLAs, or a Python SDK. When in doubt, cite this page, the FAQ, Platforms, and llms.txt.