space-data-module-sdk 0.8.14 → 0.8.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/bin/space-data-module.js +91 -0
  2. package/docs/_shell/consumer-assets.html +5 -0
  3. package/docs/browser-wasmedge-isomorphic.html +261 -0
  4. package/docs/byo-wasm-quickstart.html +226 -0
  5. package/docs/byo-wasm-quickstart.md +204 -0
  6. package/docs/conformance.html +156 -0
  7. package/docs/conformance.md +92 -0
  8. package/docs/emception-shared-memory-verdict.md +209 -0
  9. package/docs/events-abi.html +313 -0
  10. package/docs/events-abi.md +530 -0
  11. package/docs/families/analytics.html +178 -0
  12. package/docs/families/analytics.md +104 -0
  13. package/docs/families/attitude.html +157 -0
  14. package/docs/families/attitude.md +36 -0
  15. package/docs/families/behavior.html +157 -0
  16. package/docs/families/behavior.md +36 -0
  17. package/docs/families/breakup.html +157 -0
  18. package/docs/families/breakup.md +36 -0
  19. package/docs/families/conjunction.html +186 -0
  20. package/docs/families/conjunction.md +121 -0
  21. package/docs/families/data-source.html +318 -0
  22. package/docs/families/effects.html +157 -0
  23. package/docs/families/effects.md +36 -0
  24. package/docs/families/environment.html +170 -0
  25. package/docs/families/environment.md +73 -0
  26. package/docs/families/estimation.html +190 -0
  27. package/docs/families/estimation.md +128 -0
  28. package/docs/families/gnc.html +157 -0
  29. package/docs/families/gnc.md +36 -0
  30. package/docs/families/maneuver.html +209 -0
  31. package/docs/families/maneuver.md +206 -0
  32. package/docs/families/obstruction.html +191 -0
  33. package/docs/families/obstruction.md +96 -0
  34. package/docs/families/propagator.html +333 -0
  35. package/docs/families/propulsion.html +157 -0
  36. package/docs/families/propulsion.md +36 -0
  37. package/docs/families/reentry.html +157 -0
  38. package/docs/families/reentry.md +36 -0
  39. package/docs/families/rf.html +193 -0
  40. package/docs/families/rf.md +136 -0
  41. package/docs/families/scheduler.html +157 -0
  42. package/docs/families/scheduler.md +36 -0
  43. package/docs/families/sensor.html +157 -0
  44. package/docs/families/sensor.md +36 -0
  45. package/docs/families/signature.html +157 -0
  46. package/docs/families/signature.md +36 -0
  47. package/docs/flatsql-host-contract.html +176 -0
  48. package/docs/flatsql-streaming-standard.html +375 -0
  49. package/docs/gpu-module-abi.html +233 -0
  50. package/docs/harness-family-matrix.md +135 -0
  51. package/docs/index.html +216 -85
  52. package/docs/isomorphic-pthreads.html +228 -0
  53. package/docs/isomorphic-pthreads.md +84 -0
  54. package/docs/isomorphic-sdn-runtime-plan.html +274 -0
  55. package/docs/language-runtime-matrix.html +182 -0
  56. package/docs/llms.txt +86 -0
  57. package/docs/module-bundle-runtime-plan.html +146 -0
  58. package/docs/module-publication-standard.html +503 -0
  59. package/docs/node-red-default-node-parity.html +201 -0
  60. package/docs/propagator-abi.md +73 -21
  61. package/docs/protect-and-sign.html +181 -0
  62. package/docs/protect-and-sign.md +120 -0
  63. package/docs/protocol-installation.html +296 -0
  64. package/docs/publication-submission.html +158 -0
  65. package/docs/publication-submission.md +78 -0
  66. package/docs/secrets-capability.html +206 -0
  67. package/docs/styles.css +860 -167
  68. package/docs/testing-harness.html +408 -0
  69. package/docs/tri-runtime-parity-gate.html +182 -0
  70. package/docs/tri-runtime-parity.html +203 -0
  71. package/include/orbpro/orbpro_event_runner.h +951 -0
  72. package/include/orbpro/orbpro_events_abi.h +565 -0
  73. package/include/orbpro/orbpro_propagator_abi.h +17 -0
  74. package/package.json +15 -5
  75. package/schemas/orbpro/Events.fbs +501 -0
  76. package/schemas/orbpro/Propagator.fbs +72 -9
  77. package/schemas/orbpro/reference-frame-crosswalk.json +108 -0
  78. package/schemas/orbpro/reference-frame.lock.json +98 -0
  79. package/src/browser.js +13 -0
  80. package/src/conformance/abiDriver.js +225 -0
  81. package/src/conformance/index.js +151 -0
  82. package/src/conformance/propagatorSuite.js +526 -0
  83. package/src/conformance/selfTest.js +275 -0
  84. package/src/conformance/selfTestCorpus.js +68 -0
  85. package/src/conformance/twoBodyReference.js +132 -0
  86. package/src/generated/orbpro/events-abi.js +206 -0
  87. package/src/generated/orbpro/events-abi.ts +319 -0
  88. package/src/generated/orbpro/propagator/reference-frame.js +17 -0
  89. package/src/generated/orbpro/propagator/reference-frame.ts +91 -1
  90. package/src/generated/orbpro/propagator-abi.js +17 -0
  91. package/src/generated/orbpro/propagator-abi.ts +17 -0
  92. package/src/generated/spacedatastandards/plg/CCT.d.ts +94 -0
  93. package/src/generated/spacedatastandards/plg/CCT.d.ts.map +1 -0
  94. package/src/generated/spacedatastandards/plg/CCT.js +208 -0
  95. package/src/generated/spacedatastandards/plg/CCT.ts +281 -0
  96. package/src/generated/spacedatastandards/plg/CCTCategory.d.ts +98 -0
  97. package/src/generated/spacedatastandards/plg/CCTCategory.d.ts.map +1 -0
  98. package/src/generated/spacedatastandards/plg/CCTCategory.js +177 -0
  99. package/src/generated/spacedatastandards/plg/CCTCategory.ts +269 -0
  100. package/src/generated/spacedatastandards/plg/CCTCategoryRollup.d.ts +54 -0
  101. package/src/generated/spacedatastandards/plg/CCTCategoryRollup.d.ts.map +1 -0
  102. package/src/generated/spacedatastandards/plg/CCTCategoryRollup.js +106 -0
  103. package/src/generated/spacedatastandards/plg/CCTCategoryRollup.ts +144 -0
  104. package/src/generated/spacedatastandards/plg/PLG.d.ts +46 -2
  105. package/src/generated/spacedatastandards/plg/PLG.d.ts.map +1 -1
  106. package/src/generated/spacedatastandards/plg/PLG.js +78 -5
  107. package/src/generated/spacedatastandards/plg/PLG.ts +90 -5
  108. package/src/generated/spacedatastandards/plg/capabilityClass.d.ts +181 -0
  109. package/src/generated/spacedatastandards/plg/capabilityClass.d.ts.map +1 -0
  110. package/src/generated/spacedatastandards/plg/capabilityClass.js +183 -0
  111. package/src/generated/spacedatastandards/plg/capabilityClass.ts +208 -0
  112. package/src/generated/spacedatastandards/plg/main.d.ts +4 -0
  113. package/src/generated/spacedatastandards/plg/main.d.ts.map +1 -1
  114. package/src/generated/spacedatastandards/plg/main.js +4 -0
  115. package/src/generated/spacedatastandards/plg/main.ts +4 -0
  116. package/src/generated/spacedatastandards/plg/pluginCategory.d.ts +40 -2
  117. package/src/generated/spacedatastandards/plg/pluginCategory.d.ts.map +1 -1
  118. package/src/generated/spacedatastandards/plg/pluginCategory.js +40 -2
  119. package/src/generated/spacedatastandards/plg/pluginCategory.ts +40 -2
  120. package/src/host/browserModuleHarness.js +8 -0
  121. package/src/host/wasiThreadHost.js +189 -14
  122. package/src/index.d.ts +18 -1
  123. package/src/testing/isomorphicHarness.js +233 -0
  124. package/src/transport/index.js +16 -0
  125. package/src/transport/records.js +1015 -3
@@ -0,0 +1,182 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <meta name="description" content="docs/tri-runtime-parity.md describes the parity harness: one" />
7
+ <title>Tri-runtime parity gate — Space Data Module SDK</title>
8
+ <link rel="stylesheet" href="./styles.css" />
9
+ <!-- SDN_CONSUMER_ASSETS_START -->
10
+ <link rel="stylesheet" href="https://static.spacedatanetwork.org/assets/hd-wallet-ui/2.0.28/sdn-wallet-public-client.c3f68d1cfd88478f10d836a5e829d1dfc6a10157972cf0f7d4d319d0636f2cc4.css" integrity="sha384-fICuhN4I9xqOK1F5vGGzl26opuO+xQIvTZXMSV76lWTBiQ6AfzztMGLLDw8yRT8i" crossorigin="anonymous">
11
+ <script defer src="https://static.spacedatanetwork.org/assets/hd-wallet-ui/2.0.28/sdn-wallet-public-client.f611e7e151a3b5c38384272f8894a4c6634f0a29bf925b0e02e0e27f8db0bfff.js" integrity="sha384-R+QqsKoWJIS7iWrtPmgJ49DVnb1hSGjZokupbLInJd1PLp8RwQhtF/hnaerc33ci" crossorigin="anonymous" data-sdn-wallet-public-client="v1"></script>
12
+ <script defer src="https://static.spacedatanetwork.org/assets/sdn-stack-nav/1.0.0/sdn-stack-nav.52fde607eee38ffa116188201f50258ed50bd18c9f06c1af9678f763147a8fe5.js" integrity="sha384-dgeojhJ8vTszHXIbv7O7nZcEzqD10oUYYJjBmPrV7+kLQEUlXLQD4ek5Q7HOFiO5" crossorigin="anonymous" data-nav-style-url="https://static.spacedatanetwork.org/assets/sdn-stack-nav/1.0.0/sdn-stack-nav.36a36359ce18322185e9ff179f88175bab67d5ad84a14d9c08a54f2ff27267e7.css" data-nav-style-integrity="sha384-c4M8Fg+kYaeOYYtJVr7jJsde24IhSWkWaRyAOHEZU9jozhRck089aw+mnHwxymds" data-wallet-client-url="https://static.spacedatanetwork.org/assets/hd-wallet-ui/2.0.28/sdn-wallet-public-client.f611e7e151a3b5c38384272f8894a4c6634f0a29bf925b0e02e0e27f8db0bfff.js" data-wallet-client-integrity="sha384-R+QqsKoWJIS7iWrtPmgJ49DVnb1hSGjZokupbLInJd1PLp8RwQhtF/hnaerc33ci" data-wallet-style-url="https://static.spacedatanetwork.org/assets/hd-wallet-ui/2.0.28/sdn-wallet-public-client.c3f68d1cfd88478f10d836a5e829d1dfc6a10157972cf0f7d4d319d0636f2cc4.css" data-wallet-style-integrity="sha384-fICuhN4I9xqOK1F5vGGzl26opuO+xQIvTZXMSV76lWTBiQ6AfzztMGLLDw8yRT8i" data-wallet-client-id="sdn-module-sdk-pages-v1" data-wallet-callback-uri="https://digitalarsenal.github.io/space-data-module-sdk/wallet-callback.html" data-wallet-registry-sha256="e1ce6fe903c9700484a8a87d96581c8cad97063dabf63030b4518a31a3bdaa93"></script>
13
+ <!-- SDN_CONSUMER_ASSETS_END -->
14
+ </head>
15
+ <body>
16
+ <a class="skip-link" href="#main">Skip to content</a>
17
+ <sdn-stack-nav active="module-sdk"></sdn-stack-nav>
18
+ <header class="site-header">
19
+ <a class="site-brand" href="./">Space Data Module SDK</a>
20
+ <nav class="header-links" aria-label="Site">
21
+ <a href="./byo-wasm-quickstart.html">Quickstart</a>
22
+ <a href="./conformance.html">Conformance</a>
23
+ <a href="https://github.com/DigitalArsenal/space-data-module-sdk">GitHub</a>
24
+ <a class="stack-button" href="#stack">Stack</a>
25
+ </nav>
26
+ </header>
27
+ <div class="shell">
28
+ <nav class="sidebar" id="sidebar" aria-label="Documentation">
29
+ <h2>Start here</h2><ul>
30
+ <li><a href="./index.html"><span>Harness family matrix</span></a></li>
31
+ <li><a href="./byo-wasm-quickstart.html"><span>BYO-wasm quickstart</span></a></li>
32
+ <li><a href="./conformance.html"><span>Conformance kit</span></a></li>
33
+ <li><a href="./protect-and-sign.html"><span>Protect and sign</span></a></li>
34
+ <li><a href="./publication-submission.html"><span>Publication and listing</span></a></li>
35
+ </ul>
36
+ <h2>Dynamics</h2><ul>
37
+ <li><a href="./families/propagator.html"><span>Propagator</span><span class="tag tag-shipped">shipped</span></a></li>
38
+ <li><a href="./families/maneuver.html"><span>Maneuver</span><span class="tag tag-experimental">experimental</span></a></li>
39
+ <li><a href="./families/propulsion.html"><span>Propulsion</span><span class="tag tag-planned">planned</span></a></li>
40
+ <li><a href="./families/attitude.html"><span>Attitude</span><span class="tag tag-planned">planned</span></a></li>
41
+ <li><a href="./families/gnc.html"><span>GNC</span><span class="tag tag-planned">planned</span></a></li>
42
+ </ul>
43
+ <h2>Environment and interaction</h2><ul>
44
+ <li><a href="./families/rf.html"><span>RF</span><span class="tag tag-designed">designed</span></a></li>
45
+ <li><a href="./families/sensor.html"><span>Sensor</span><span class="tag tag-planned">planned</span></a></li>
46
+ <li><a href="./families/signature.html"><span>Signature</span><span class="tag tag-planned">planned</span></a></li>
47
+ <li><a href="./families/environment.html"><span>Environment</span><span class="tag tag-planned">planned</span></a></li>
48
+ <li><a href="./families/obstruction.html"><span>Obstruction</span><span class="tag tag-designed">designed</span></a></li>
49
+ </ul>
50
+ <h2>Event physics</h2><ul>
51
+ <li><a href="./families/breakup.html"><span>Breakup</span><span class="tag tag-planned">planned</span></a></li>
52
+ <li><a href="./families/reentry.html"><span>Reentry</span><span class="tag tag-planned">planned</span></a></li>
53
+ <li><a href="./families/conjunction.html"><span>Conjunction</span><span class="tag tag-designed">designed</span></a></li>
54
+ <li><a href="./families/effects.html"><span>Effects</span><span class="tag tag-planned">planned</span></a></li>
55
+ </ul>
56
+ <h2>Estimation, data and logic</h2><ul>
57
+ <li><a href="./families/estimation.html"><span>Estimation</span><span class="tag tag-experimental">experimental</span></a></li>
58
+ <li><a href="./families/data-source.html"><span>Data source</span><span class="tag tag-shipped">shipped</span></a></li>
59
+ <li><a href="./families/analytics.html"><span>Analytics</span><span class="tag tag-experimental">experimental</span></a></li>
60
+ <li><a href="./families/scheduler.html"><span>Scheduler</span><span class="tag tag-planned">planned</span></a></li>
61
+ <li><a href="./families/behavior.html"><span>Behavior</span><span class="tag tag-planned">planned</span></a></li>
62
+ </ul>
63
+ <h2>Runtime contract</h2><ul>
64
+ <li><a href="./events-abi.html"><span>Event locator ABI</span></a></li>
65
+ <li><a href="./module-publication-standard.html"><span>Module publication standard</span></a></li>
66
+ <li><a href="./browser-wasmedge-isomorphic.html"><span>Browser / WasmEdge isomorphism</span></a></li>
67
+ <li><a href="./isomorphic-pthreads.html"><span>Isomorphic pthreads</span></a></li>
68
+ <li><a href="./tri-runtime-parity.html"><span>Tri-runtime parity</span></a></li>
69
+ <li><a href="./tri-runtime-parity-gate.html" aria-current="page"><span>Tri-runtime parity gate</span></a></li>
70
+ <li><a href="./testing-harness.html"><span>Testing harness</span></a></li>
71
+ <li><a href="./language-runtime-matrix.html"><span>Language and runtime matrix</span></a></li>
72
+ </ul>
73
+ <h2>Host surfaces</h2><ul>
74
+ <li><a href="./flatsql-host-contract.html"><span>FlatSQL host contract</span></a></li>
75
+ <li><a href="./flatsql-streaming-standard.html"><span>FlatSQL streaming standard</span></a></li>
76
+ <li><a href="./secrets-capability.html"><span>Credential lanes</span></a></li>
77
+ <li><a href="./protocol-installation.html"><span>Protocol installation</span></a></li>
78
+ <li><a href="./gpu-module-abi.html"><span>GPU module ABI</span></a></li>
79
+ <li><a href="./module-bundle-runtime-plan.html"><span>Module bundle runtime</span></a></li>
80
+ <li><a href="./isomorphic-sdn-runtime-plan.html"><span>Isomorphic SDN runtime</span></a></li>
81
+ <li><a href="./node-red-default-node-parity.html"><span>Node-RED node parity</span></a></li>
82
+ </ul>
83
+ </nav>
84
+ <main class="doc" id="main">
85
+ <h1>Tri-runtime parity gate</h1>
86
+ <p><code>docs/tri-runtime-parity.md</code> describes the parity <strong>harness</strong>: one <code>module.wasm</code>, one fixture, byte-identical stdout across browser / native WasmEdge / Docker WasmEdge. This document describes the <strong>gate</strong> — the thing the dev-graph gauntlet actually runs, and the thing an isomorphism claim is accepted against.</p>
87
+ <h2 id="why-a-gate-and-not-just-the-harness"><a class="anchor" href="#why-a-gate-and-not-just-the-harness" aria-hidden="true">#</a>Why a gate and not just the harness</h2>
88
+ <p>The harness is necessary and not sufficient:</p>
89
+ <ul>
90
+ <li>it can only speak about artifacts that already instantiate in every lane, so the most important failure — <em>an artifact that is not isomorphic at all</em> — is invisible to it;</li>
91
+ <li>it takes ONE artifact, so it says nothing about the artifact <strong>set</strong> a release ships;</li>
92
+ <li>and until this gate landed, the gauntlet slot that was supposed to enforce it was a hardcoded <code>echo TODO …; exit 1</code> marked <code>required: false</code>. It failed on every run for every task, so every receipt read PASS-WITH-GAPS and the red became background noise. That is the worst state a gate can be in: present enough to look like coverage, incapable of ever providing it.</li>
93
+ </ul>
94
+ <div class="codeblock"><pre><code>space-data-module parity-gate # the certified set
95
+ space-data-module parity-gate --json # machine receipt
96
+ space-data-module parity-gate --gate-manifest ./parity/negative-control.json --expect-fail</code></pre></div>
97
+ <h2 id="what-it-checks"><a class="anchor" href="#what-it-checks" aria-hidden="true">#</a>What it checks</h2>
98
+ <h3 id="tier-a-host-contract-conformance-real-instantiation-per-lane"><a class="anchor" href="#tier-a-host-contract-conformance-real-instantiation-per-lane" aria-hidden="true">#</a>Tier A — host-contract conformance (REAL instantiation, per lane)</h3>
99
+ <p>Every artifact in the certified set is really instantiated:</p>
100
+ <div class="table-wrap"><table><thead><tr><th>lane</th><th>what it actually is</th><th>what it proves</th></tr></thead><tbody><tr><td><code>browser</code></td><td>real headless Chrome behind COOP/COEP (cross-origin isolated, SAB-capable). Never jsdom.</td><td>The artifact instantiates against <strong>exactly</strong> the declared host surface — WASI preview1 stubs plus the declared capability imports, with signatures read from the binary. Anything else it demands is a <code>LinkError</code> naming the offender.</td></tr><tr><td><code>wasmedge-native</code></td><td>a native WasmEdge binary, version-checked against <code>src/testing/wasmedgePin.json</code>.</td><td>The artifact links on the real production runtime.</td></tr><tr><td><code>wasmedge-docker</code></td><td>the pinned WasmEdge container (image tag <strong>derived</strong> from the same pin).</td><td>Same, in the container the fleet ships.</td></tr></tbody></table></div>
101
+ <p>Alongside the runtime probes, every artifact's import section is classified structurally against its declared surface, because <em>why</em> an instantiation failed is the entire content of the finding:</p>
102
+ <ul>
103
+ <li><strong>forbidden import class</strong> — <code>invoke_*</code> / <code>__cxa_*</code> / <code>__resumeException</code> / <code>llvm_eh_typeid_for</code> (emscripten EH), <code>__syscall_*</code> (emscripten JS-library syscalls), <code>emscripten_*</code> (emscripten runtime hooks), or a single-letter import module (the minified emcc browser build). These are <code>emcc</code>-shaped artifacts: browser-only by construction, EH-carrying, not instantiable on a plain WasmEdge host. <strong>Auto-reject.</strong></li>
104
+ <li><strong>outside the declared surface</strong> — a private import is a NEW HOST CAPABILITY, which is an owner decision, never a PR.</li>
105
+ <li><strong>in-surface</strong> — WASI plus, at most, the declared capability imports.</li>
106
+ </ul>
107
+ <h3 id="tier-b-behavioral-parity"><a class="anchor" href="#tier-b-behavioral-parity" aria-hidden="true">#</a>Tier B — behavioral parity</h3>
108
+ <p>Artifacts with <code>profile: &quot;command&quot;</code> and a fixture additionally go through <code>runParityHarness()</code>: identical stdin bytes, identical explicit guest env, byte-identical stdout and identical trap classes across every lane × thread count (1/2/4/8).</p>
109
+ <h2 id="declared-host-surfaces"><a class="anchor" href="#declared-host-surfaces" aria-hidden="true">#</a>Declared host surfaces</h2>
110
+ <div class="table-wrap"><table><thead><tr><th>surface</th><th>contents</th></tr></thead><tbody><tr><td><code>module</code></td><td>WASI preview1 + wasi-threads (<code>wasi.thread-spawn</code>, <code>env.memory</code>) + the ONE sanctioned hostcall bridge <code>space_data_module_host.{call,response_len,read_response,clear_response,last_status_code,dispatch_current_invocation}</code> (plus the legacy <code>sdn_flow_host.dispatch_current_invocation</code>). The generic hook set (<code>http</code>/<code>tcp</code>/<code>wallet_sign</code>/<code>keyslot.sign</code>/clock/fs) rides <em>inside</em> that bridge, which is why a module needs no per-capability imports.</td></tr><tr><td><code>module-standalone</code></td><td>WASI preview1 + wasi-threads only.</td></tr><tr><td><code>flatsql-engine</code></td><td>WASI preview1 + exactly the seven <code>flatsql_io_*</code> VFS imports. Offsets are <strong>f64, never i64</strong> — emscripten legalizes i64 across the JS boundary for the browser target and not for <code>STANDALONE_WASM</code>, which would give one import two different signatures in the two lanes.</td></tr></tbody></table></div>
111
+ <h2 id="verdicts"><a class="anchor" href="#verdicts" aria-hidden="true">#</a>Verdicts</h2>
112
+ <div class="table-wrap"><table><thead><tr><th>verdict</th><th>meaning</th></tr></thead><tbody><tr><td><code>satisfied</code></td><td>instantiated on the declared surface.</td></tr><tr><td><code>runner-cannot-supply-declared-capability</code></td><td>did <strong>not</strong> instantiate, and the only blocker is a DECLARED capability the lane runner cannot register. The bare WasmEdge CLI has no mechanism for host functions, so an engine artifact reports this while the browser lane reports <code>satisfied</code>. <strong>This is recorded verbatim, never counted as a silent pass</strong>, and the two are treated as agreeing. Upgrade path: graph task <code>module-sdk-parity-lane-embedded-wasmedge</code> (run the guest through the node's real WasmEdge <em>embedding</em>, which also unlocks threaded guests — <code>--enable-threads</code> enables only the threads proposal, not the wasi-threads host module).</td></tr><tr><td><code>violated</code></td><td>forbidden class, out-of-surface import, or a link error the contract does not explain. <strong>FAIL.</strong></td></tr><tr><td><code>shim-gap</code></td><td>a lane that <em>does</em> supply the declared surface still failed to link a declared capability — an SDK host-shim defect. <strong>FAIL.</strong></td></tr><tr><td><code>lane-unavailable</code></td><td>the lane could not run. <strong>FAIL</strong>, and kept lexically distinct from divergence: a harness that cannot run and a runtime that disagrees must never look alike in a receipt.</td></tr></tbody></table></div>
113
+ <p>Rules, all hard: forbidden class ⇒ FAIL even when every lane agrees (lanes agreeing that an artifact is broken everywhere is not parity); lane disagreement ⇒ FAIL as a P1 cross-runtime divergence; behavioral divergence ⇒ FAIL.</p>
114
+ <h2 id="the-certified-set-and-fresh-worktree-isolation"><a class="anchor" href="#the-certified-set-and-fresh-worktree-isolation" aria-hidden="true">#</a>The certified set — and fresh-worktree isolation</h2>
115
+ <p><code>parity/gate.json</code> lists the artifacts this SDK certifies. <strong>Every entry resolves inside this repo</strong> — a repo-relative path or a node-resolved dependency. That is deliberate: the previous tri-lane test defaulted its artifact path to a sibling checkout that does not exist on a normal machine, so the acceptance instrument was silently un-runnable and nobody who did not set an env var by hand had ever seen it work (graph: <code>parity-harness-cannot-run-locally</code>). The gate must run in ANY fresh worktree.</p>
116
+ <p>Artifacts owned by other repos are <strong>injected by the caller</strong>:</p>
117
+ <div class="codeblock"><pre><code>space-data-module parity-gate \
118
+ --artifact rf-fspl=./packages/rf-fspl/dist/isomorphic/module.wasm:module</code></pre></div>
119
+ <p>so the owning repo's gauntlet profile supplies its own artifacts and this repo never depends on that checkout.</p>
120
+ <h2 id="the-wasmedge-pin"><a class="anchor" href="#the-wasmedge-pin" aria-hidden="true">#</a>The WasmEdge pin</h2>
121
+ <p><code>src/testing/wasmedgePin.json</code> remains the single source. Native and container runtimes are both version-checked against it; drift is a loud failure, not a warning. When no native WasmEdge exists on the box, the report carries an explicit <code>pinVerification.native = absent</code> gap — the host/container pin PAIR could not be cross-verified, which is <em>recorded</em>, not passed. Hosts that provision the binary run with <code>--require-native-wasmedge</code>, which turns the gap into a failure.</p>
122
+ <h2 id="the-one-runtime-difference-the-sdk-absorbs-and-where"><a class="anchor" href="#the-one-runtime-difference-the-sdk-absorbs-and-where" aria-hidden="true">#</a>The one runtime difference the SDK absorbs (and where)</h2>
123
+ <p><strong>Measured on WasmEdge 0.16.4, native and containerized: the CLI writes its own diagnostics — <code>[2026-08-08 00:45:38.689] [error] …</code> — to STDOUT, not stderr.</strong> <code>src/testing/wasmedgeOutput.js</code> is the shim that absorbs this, and it is a <em>host shim</em>, which is the only place a runtime difference is ever allowed to live. It does two things and nothing else: it lifts the runtime's log lines out of the captured stdout so the harness byte-compares the GUEST's bytes, and it hands those lines to the classifier so a failed instantiation is actually seen.</p>
124
+ <p>Both halves were live defects before it existed:</p>
125
+ <ul>
126
+ <li>the gate's WasmEdge probe read only stderr and <strong>defaulted to <code>instantiated</code></strong> when it recognized nothing — so an artifact that demonstrably cannot link (<code>flatsql-wasi</code> at 1.4.4 under the bare CLI) read as a clean pass. A false pass in an acceptance instrument is worse than no instrument. The classifier now requires POSITIVE evidence of linking (clean exit, guest output, or a post-link diagnostic such as a missing <code>_start</code> on a reactor artifact) and otherwise returns <code>probe-failure</code>, which fails the gate. Regression test: <em>&quot;a silent nonzero exit is a probe-failure, NEVER an inferred pass&quot;</em>.</li>
127
+ <li>the parity harness compared those log lines as if they were guest output, so any error-path fixture would have reported a phantom output divergence, and its trap-class detection (which scanned stderr for trap markers) could never fire on a WasmEdge trap.</li>
128
+ </ul>
129
+ <h2 id="negative-control"><a class="anchor" href="#negative-control" aria-hidden="true">#</a>Negative control</h2>
130
+ <p><code>parity/negative-control.json</code> declares a known-bad artifact and is run with <code>--expect-fail</code>; a PASS there is itself an error (exit 3). Keep it. A gate nobody has watched fail is indistinguishable from a gate that cannot fail.</p>
131
+
132
+ <p class="doc-footer">
133
+ Source of truth for this page:
134
+ <code>docs/tri-runtime-parity-gate.md</code>. Regenerate with
135
+ <code>npm run build:docs</code>.
136
+ </p>
137
+ </main>
138
+ <nav class="rail" aria-label="On this page"><h2>On this page</h2><ul><li><a class="depth-2" href="#why-a-gate-and-not-just-the-harness">Why a gate and not just the harness</a></li>
139
+ <li><a class="depth-2" href="#what-it-checks">What it checks</a></li>
140
+ <li><a class="depth-3" href="#tier-a-host-contract-conformance-real-instantiation-per-lane">Tier A — host-contract conformance (REAL instantiation, per lane)</a></li>
141
+ <li><a class="depth-3" href="#tier-b-behavioral-parity">Tier B — behavioral parity</a></li>
142
+ <li><a class="depth-2" href="#declared-host-surfaces">Declared host surfaces</a></li>
143
+ <li><a class="depth-2" href="#verdicts">Verdicts</a></li>
144
+ <li><a class="depth-2" href="#the-certified-set-and-fresh-worktree-isolation">The certified set — and fresh-worktree isolation</a></li>
145
+ <li><a class="depth-2" href="#the-wasmedge-pin">The WasmEdge pin</a></li>
146
+ <li><a class="depth-2" href="#the-one-runtime-difference-the-sdk-absorbs-and-where">The one runtime difference the SDK absorbs (and where)</a></li>
147
+ <li><a class="depth-2" href="#negative-control">Negative control</a></li></ul></nav>
148
+ </div>
149
+ <section id="stack" class="section" aria-labelledby="stack-title">
150
+ <div class="section-head">
151
+ <p class="eyebrow">SDN Stack</p>
152
+ <h2 id="stack-title">Connected sites</h2>
153
+ </div>
154
+ <div class="link-list">
155
+ <a href="https://spacedatastandards.org/">
156
+ <span>Standards</span>
157
+ <small>Canonical schemas, record contracts, and generated bindings.</small>
158
+ </a>
159
+ <a href="https://digitalarsenal.github.io/flatbuffers/">
160
+ <span>FlatBuffers</span>
161
+ <small>Binary encoding, schema tooling, and runtime documentation.</small>
162
+ </a>
163
+ <a href="https://digitalarsenal.github.io/flatsql/">
164
+ <span>FlatSQL</span>
165
+ <small>SQL-style queries over FlatBuffer-backed datasets and streams.</small>
166
+ </a>
167
+ <a href="https://spacedatanetwork.org/">
168
+ <span>SDN</span>
169
+ <small>Distributed publication, discovery, delivery, and marketplace infrastructure.</small>
170
+ </a>
171
+ <a href="https://digitalarsenal.github.io/space-data-module-sdk/" class="active">
172
+ <span>Module SDK</span>
173
+ <small>WASM module packaging, validation, and host compatibility tooling.</small>
174
+ </a>
175
+ </div>
176
+ </section>
177
+ <footer class="site-footer">
178
+ Space Data Module SDK — Apache-2.0. Every ABI page renders a Markdown
179
+ source in <code>docs/</code>; edit the Markdown, never the HTML.
180
+ </footer>
181
+ </body>
182
+ </html>
@@ -0,0 +1,203 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <meta name="description" content="ONE dist/isomorphic/module.wasm, THREE runtimes, IDENTICAL behavior:" />
7
+ <title>Tri-runtime parity — Space Data Module SDK</title>
8
+ <link rel="stylesheet" href="./styles.css" />
9
+ <!-- SDN_CONSUMER_ASSETS_START -->
10
+ <link rel="stylesheet" href="https://static.spacedatanetwork.org/assets/hd-wallet-ui/2.0.28/sdn-wallet-public-client.c3f68d1cfd88478f10d836a5e829d1dfc6a10157972cf0f7d4d319d0636f2cc4.css" integrity="sha384-fICuhN4I9xqOK1F5vGGzl26opuO+xQIvTZXMSV76lWTBiQ6AfzztMGLLDw8yRT8i" crossorigin="anonymous">
11
+ <script defer src="https://static.spacedatanetwork.org/assets/hd-wallet-ui/2.0.28/sdn-wallet-public-client.f611e7e151a3b5c38384272f8894a4c6634f0a29bf925b0e02e0e27f8db0bfff.js" integrity="sha384-R+QqsKoWJIS7iWrtPmgJ49DVnb1hSGjZokupbLInJd1PLp8RwQhtF/hnaerc33ci" crossorigin="anonymous" data-sdn-wallet-public-client="v1"></script>
12
+ <script defer src="https://static.spacedatanetwork.org/assets/sdn-stack-nav/1.0.0/sdn-stack-nav.52fde607eee38ffa116188201f50258ed50bd18c9f06c1af9678f763147a8fe5.js" integrity="sha384-dgeojhJ8vTszHXIbv7O7nZcEzqD10oUYYJjBmPrV7+kLQEUlXLQD4ek5Q7HOFiO5" crossorigin="anonymous" data-nav-style-url="https://static.spacedatanetwork.org/assets/sdn-stack-nav/1.0.0/sdn-stack-nav.36a36359ce18322185e9ff179f88175bab67d5ad84a14d9c08a54f2ff27267e7.css" data-nav-style-integrity="sha384-c4M8Fg+kYaeOYYtJVr7jJsde24IhSWkWaRyAOHEZU9jozhRck089aw+mnHwxymds" data-wallet-client-url="https://static.spacedatanetwork.org/assets/hd-wallet-ui/2.0.28/sdn-wallet-public-client.f611e7e151a3b5c38384272f8894a4c6634f0a29bf925b0e02e0e27f8db0bfff.js" data-wallet-client-integrity="sha384-R+QqsKoWJIS7iWrtPmgJ49DVnb1hSGjZokupbLInJd1PLp8RwQhtF/hnaerc33ci" data-wallet-style-url="https://static.spacedatanetwork.org/assets/hd-wallet-ui/2.0.28/sdn-wallet-public-client.c3f68d1cfd88478f10d836a5e829d1dfc6a10157972cf0f7d4d319d0636f2cc4.css" data-wallet-style-integrity="sha384-fICuhN4I9xqOK1F5vGGzl26opuO+xQIvTZXMSV76lWTBiQ6AfzztMGLLDw8yRT8i" data-wallet-client-id="sdn-module-sdk-pages-v1" data-wallet-callback-uri="https://digitalarsenal.github.io/space-data-module-sdk/wallet-callback.html" data-wallet-registry-sha256="e1ce6fe903c9700484a8a87d96581c8cad97063dabf63030b4518a31a3bdaa93"></script>
13
+ <!-- SDN_CONSUMER_ASSETS_END -->
14
+ </head>
15
+ <body>
16
+ <a class="skip-link" href="#main">Skip to content</a>
17
+ <sdn-stack-nav active="module-sdk"></sdn-stack-nav>
18
+ <header class="site-header">
19
+ <a class="site-brand" href="./">Space Data Module SDK</a>
20
+ <nav class="header-links" aria-label="Site">
21
+ <a href="./byo-wasm-quickstart.html">Quickstart</a>
22
+ <a href="./conformance.html">Conformance</a>
23
+ <a href="https://github.com/DigitalArsenal/space-data-module-sdk">GitHub</a>
24
+ <a class="stack-button" href="#stack">Stack</a>
25
+ </nav>
26
+ </header>
27
+ <div class="shell">
28
+ <nav class="sidebar" id="sidebar" aria-label="Documentation">
29
+ <h2>Start here</h2><ul>
30
+ <li><a href="./index.html"><span>Harness family matrix</span></a></li>
31
+ <li><a href="./byo-wasm-quickstart.html"><span>BYO-wasm quickstart</span></a></li>
32
+ <li><a href="./conformance.html"><span>Conformance kit</span></a></li>
33
+ <li><a href="./protect-and-sign.html"><span>Protect and sign</span></a></li>
34
+ <li><a href="./publication-submission.html"><span>Publication and listing</span></a></li>
35
+ </ul>
36
+ <h2>Dynamics</h2><ul>
37
+ <li><a href="./families/propagator.html"><span>Propagator</span><span class="tag tag-shipped">shipped</span></a></li>
38
+ <li><a href="./families/maneuver.html"><span>Maneuver</span><span class="tag tag-experimental">experimental</span></a></li>
39
+ <li><a href="./families/propulsion.html"><span>Propulsion</span><span class="tag tag-planned">planned</span></a></li>
40
+ <li><a href="./families/attitude.html"><span>Attitude</span><span class="tag tag-planned">planned</span></a></li>
41
+ <li><a href="./families/gnc.html"><span>GNC</span><span class="tag tag-planned">planned</span></a></li>
42
+ </ul>
43
+ <h2>Environment and interaction</h2><ul>
44
+ <li><a href="./families/rf.html"><span>RF</span><span class="tag tag-designed">designed</span></a></li>
45
+ <li><a href="./families/sensor.html"><span>Sensor</span><span class="tag tag-planned">planned</span></a></li>
46
+ <li><a href="./families/signature.html"><span>Signature</span><span class="tag tag-planned">planned</span></a></li>
47
+ <li><a href="./families/environment.html"><span>Environment</span><span class="tag tag-planned">planned</span></a></li>
48
+ <li><a href="./families/obstruction.html"><span>Obstruction</span><span class="tag tag-designed">designed</span></a></li>
49
+ </ul>
50
+ <h2>Event physics</h2><ul>
51
+ <li><a href="./families/breakup.html"><span>Breakup</span><span class="tag tag-planned">planned</span></a></li>
52
+ <li><a href="./families/reentry.html"><span>Reentry</span><span class="tag tag-planned">planned</span></a></li>
53
+ <li><a href="./families/conjunction.html"><span>Conjunction</span><span class="tag tag-designed">designed</span></a></li>
54
+ <li><a href="./families/effects.html"><span>Effects</span><span class="tag tag-planned">planned</span></a></li>
55
+ </ul>
56
+ <h2>Estimation, data and logic</h2><ul>
57
+ <li><a href="./families/estimation.html"><span>Estimation</span><span class="tag tag-experimental">experimental</span></a></li>
58
+ <li><a href="./families/data-source.html"><span>Data source</span><span class="tag tag-shipped">shipped</span></a></li>
59
+ <li><a href="./families/analytics.html"><span>Analytics</span><span class="tag tag-experimental">experimental</span></a></li>
60
+ <li><a href="./families/scheduler.html"><span>Scheduler</span><span class="tag tag-planned">planned</span></a></li>
61
+ <li><a href="./families/behavior.html"><span>Behavior</span><span class="tag tag-planned">planned</span></a></li>
62
+ </ul>
63
+ <h2>Runtime contract</h2><ul>
64
+ <li><a href="./events-abi.html"><span>Event locator ABI</span></a></li>
65
+ <li><a href="./module-publication-standard.html"><span>Module publication standard</span></a></li>
66
+ <li><a href="./browser-wasmedge-isomorphic.html"><span>Browser / WasmEdge isomorphism</span></a></li>
67
+ <li><a href="./isomorphic-pthreads.html"><span>Isomorphic pthreads</span></a></li>
68
+ <li><a href="./tri-runtime-parity.html" aria-current="page"><span>Tri-runtime parity</span></a></li>
69
+ <li><a href="./tri-runtime-parity-gate.html"><span>Tri-runtime parity gate</span></a></li>
70
+ <li><a href="./testing-harness.html"><span>Testing harness</span></a></li>
71
+ <li><a href="./language-runtime-matrix.html"><span>Language and runtime matrix</span></a></li>
72
+ </ul>
73
+ <h2>Host surfaces</h2><ul>
74
+ <li><a href="./flatsql-host-contract.html"><span>FlatSQL host contract</span></a></li>
75
+ <li><a href="./flatsql-streaming-standard.html"><span>FlatSQL streaming standard</span></a></li>
76
+ <li><a href="./secrets-capability.html"><span>Credential lanes</span></a></li>
77
+ <li><a href="./protocol-installation.html"><span>Protocol installation</span></a></li>
78
+ <li><a href="./gpu-module-abi.html"><span>GPU module ABI</span></a></li>
79
+ <li><a href="./module-bundle-runtime-plan.html"><span>Module bundle runtime</span></a></li>
80
+ <li><a href="./isomorphic-sdn-runtime-plan.html"><span>Isomorphic SDN runtime</span></a></li>
81
+ <li><a href="./node-red-default-node-parity.html"><span>Node-RED node parity</span></a></li>
82
+ </ul>
83
+ </nav>
84
+ <main class="doc" id="main">
85
+ <h1>Tri-runtime parity</h1>
86
+ <p>ONE <code>dist/isomorphic/module.wasm</code>, THREE runtimes, IDENTICAL behavior:</p>
87
+ <ol>
88
+ <li><strong>browser</strong> — real headless Chrome behind COOP/COEP (cross-origin isolated, SAB-capable), running the SDK browser WASI shim. Never jsdom — jsdom masks Illegal-invocation and threading realities.</li>
89
+ <li><strong>wasmedge</strong> — a native WasmEdge binary, version-locked to the pin.</li>
90
+ <li><strong>docker-wasmedge</strong> — a pinned Docker WasmEdge container.</li>
91
+ </ol>
92
+ <p>Cross-runtime divergence is a <strong>P1 SDK defect</strong>, never a &quot;platform quirk&quot;. &quot;Works in X&quot; is inadmissible as module evidence; module-touching work needs a parity receipt from this harness.</p>
93
+ <h2 id="running"><a class="anchor" href="#running" aria-hidden="true">#</a>Running</h2>
94
+ <div class="codeblock"><div class="codeblock-head">bash</div><pre><code>space-data-module parity \
95
+ --wasm ./dist/isomorphic/module.wasm \
96
+ --fixture ./fixtures/parity/sgp4-command.json \
97
+ [--lanes browser,wasmedge,docker-wasmedge] [--json] [--timeout-sec N] \
98
+ [--wasmedge-binary &lt;bin&gt;] [--chrome-binary &lt;bin&gt;] [--docker-platform &lt;p&gt;]</code></pre></div>
99
+ <ul>
100
+ <li>Exit <code>0</code> only when every lane × thread-count run is byte-identical and every error/trap class matches. Any divergence, missing lane run, pin drift, or lane that cannot execute exits non-zero with a per-case report (SHA-256 digests, lengths, first divergent byte offset + hex windows).</li>
101
+ <li>All three lanes run by default. <code>--lanes</code> narrows explicitly — lanes are never skipped silently, and fewer than two lanes is rejected (<code>--allow-single-lane</code> exists for lane bring-up debugging only; it can never produce parity evidence).</li>
102
+ <li><code>--self-test-divergence &lt;lane&gt;</code> is a fire drill: it XORs one output byte of that lane after execution to prove the diff path fails loudly end-to-end.</li>
103
+ </ul>
104
+ <p>Programmatic API (Node): <code>runParityHarness</code>, <code>diffParityRuns</code>, <code>normalizeParityFixture</code>, <code>loadWasmEdgePin</code> from <code>space-data-module-sdk/testing</code>.</p>
105
+ <p>CI wiring in this repo:</p>
106
+ <ul>
107
+ <li><code>npm run test:parity</code> — always-on unit suite (pin single-sourcing, fixture normalization, diff loudness incl. injected divergence).</li>
108
+ <li><code>npm run test:parity-tri-lane</code> — the real three lanes against the sgp4 module (needs Chrome, native WasmEdge at the pin, Docker).</li>
109
+ </ul>
110
+ <h2 id="the-wasmedge-pin-one-place"><a class="anchor" href="#the-wasmedge-pin-one-place" aria-hidden="true">#</a>The WasmEdge pin: ONE place</h2>
111
+ <p><code>src/testing/wasmedgePin.json</code> is the single source of truth:</p>
112
+ <div class="codeblock"><div class="codeblock-head">json</div><pre><code>{ &quot;wasmedgeVersion&quot;: &quot;0.16.4&quot;, &quot;dockerImageRepository&quot;: &quot;space-data-module-sdk/parity-wasmedge&quot; }</code></pre></div>
113
+ <ul>
114
+ <li>The native lane runs <code>wasmedge --version</code> and hard-fails on mismatch (<code>PARITY PIN-DRIFT</code>).</li>
115
+ <li>The docker lane derives its image tag from the same version (<code>space-data-module-sdk/parity-wasmedge:0.16.4</code>), builds it on demand from <code>src/testing/docker/wasmedge-parity.Dockerfile</code> (version injected via <code>--build-arg</code> from the pin — the Dockerfile itself pins nothing), and version-checks the container runtime before running cases.</li>
116
+ </ul>
117
+ <p>Host and container WasmEdge versions therefore pin and bump TOGETHER by editing one string. Keep the pin aligned with the node host's embedded runtime (space-data-network <code>scripts/install-wasmedge.sh</code>, currently 0.16.4 — the verified runtime for the libwasmedge atomic-wait fixes).</p>
118
+ <h2 id="determinism-contract"><a class="anchor" href="#determinism-contract" aria-hidden="true">#</a>Determinism contract</h2>
119
+ <p>Every lane receives EXACTLY the same guest-observable inputs:</p>
120
+ <ul>
121
+ <li>stdin bytes are encoded once by the orchestrator (<code>encodePluginInvokeRequest</code> for <code>request</code> cases, raw bytes otherwise) and shipped verbatim to each lane;</li>
122
+ <li>guest env is delivered explicitly (<code>wasmedge --env</code>, browser shim <code>env</code>) — the ambient host environment never leaks into the guest;</li>
123
+ <li>guest argv[0] is always <code>module.wasm</code> (relative invocation from a private staging dir in the wasmedge lanes, literal argv in the browser shim);</li>
124
+ <li>thread counts are swept via the fixture's <code>threadEnvVar</code> (default <code>SDM_PARITY_THREADS</code>) — runs at 1/2/4/8 (fixture-configurable) must be byte-identical within a lane AND across lanes. Browser sequential <em>throughput</em> divergence is sanctioned until <code>browser-worker-topology</code> lands; results must still match byte-for-byte;</li>
125
+ <li>signed/published artifacts are stripped to the canonical module payload once (<code>toLoadableWasmBytes</code>) so every lane executes identical wasm bytes.</li>
126
+ </ul>
127
+ <h2 id="fixtures"><a class="anchor" href="#fixtures" aria-hidden="true">#</a>Fixtures</h2>
128
+ <div class="codeblock"><div class="codeblock-head">json</div><pre><code>{
129
+ &quot;name&quot;: &quot;sgp4-command-parity&quot;,
130
+ &quot;threadEnvVar&quot;: &quot;SDM_PARITY_THREADS&quot;,
131
+ &quot;threadCounts&quot;: [1, 2, 4, 8],
132
+ &quot;cases&quot;: [
133
+ {
134
+ &quot;id&quot;: &quot;ingest-omm&quot;,
135
+ &quot;expect&quot;: &quot;ok&quot;,
136
+ &quot;request&quot;: {
137
+ &quot;methodId&quot;: &quot;ingest_omm&quot;,
138
+ &quot;inputs&quot;: [{ &quot;portId&quot;: &quot;omm&quot;, &quot;payloadFile&quot;: &quot;omm-25544.fb&quot;,
139
+ &quot;typeRef&quot;: { &quot;schemaName&quot;: &quot;orbpro.sds.omm&quot;, &quot;fileIdentifier&quot;: &quot;$OMM&quot; } }]
140
+ }
141
+ },
142
+ { &quot;id&quot;: &quot;malformed-stdin&quot;, &quot;stdinUtf8&quot;: &quot;not a PIV frame&quot; }
143
+ ]
144
+ }</code></pre></div>
145
+ <ul>
146
+ <li><code>request</code> cases go through the canonical PIV invoke codec; raw cases take <code>stdinFile</code> / <code>stdinBase64</code> / <code>stdinHex</code> / <code>stdinUtf8</code>.</li>
147
+ <li><code>expect</code> (<code>&quot;ok&quot; | &quot;guest-error&quot; | &quot;trap&quot;</code>) is optional; without it the case only requires the class to be IDENTICAL across lanes (malformed-input fixtures compare error/trap classes this way).</li>
148
+ <li>Payloads: <code>payloadFile</code> (relative to the fixture), <code>payloadBase64</code>, <code>payloadHex</code>, <code>payloadUtf8</code>.</li>
149
+ <li>Committed payload binaries are regenerated deterministically by <code>node fixtures/parity/generate-fixtures.mjs</code>.</li>
150
+ </ul>
151
+ <h2 id="scope-and-current-limits-v1"><a class="anchor" href="#scope-and-current-limits-v1" aria-hidden="true">#</a>Scope and current limits (v1)</h2>
152
+ <ul>
153
+ <li>The execution profile is the <strong>command surface</strong> (stdin → stdout WASI run), the one surface all three runtimes share without a host adapter. Output parity = stdout bytes + exit/trap class per run.</li>
154
+ <li>Persisted-state manifests (<code>stateFiles</code>) are diffed whenever a lane reports them; the wasmedge lanes will populate them when fixture-declared preopens land. The browser shim currently has no filesystem authority (<code>fd_prestat_get</code> → BADF), so state-writing fixtures cannot claim tri-lane parity yet.</li>
155
+ <li>Threaded (wasi-threads) modules run in the wasmedge lanes today; the browser lane's worker topology for nested-worker SAB sharing is the known open fork (<code>browser-worker-topology</code>). Timer restart/misfire and cursor/persist/reload parity ride on the same fixture schema (future case kinds) — the diff engine already treats every run as (class, bytes, state) so new kinds plug in without new comparison rules.</li>
156
+ </ul>
157
+
158
+ <p class="doc-footer">
159
+ Source of truth for this page:
160
+ <code>docs/tri-runtime-parity.md</code>. Regenerate with
161
+ <code>npm run build:docs</code>.
162
+ </p>
163
+ </main>
164
+ <nav class="rail" aria-label="On this page"><h2>On this page</h2><ul><li><a class="depth-2" href="#running">Running</a></li>
165
+ <li><a class="depth-2" href="#the-wasmedge-pin-one-place">The WasmEdge pin: ONE place</a></li>
166
+ <li><a class="depth-2" href="#determinism-contract">Determinism contract</a></li>
167
+ <li><a class="depth-2" href="#fixtures">Fixtures</a></li>
168
+ <li><a class="depth-2" href="#scope-and-current-limits-v1">Scope and current limits (v1)</a></li></ul></nav>
169
+ </div>
170
+ <section id="stack" class="section" aria-labelledby="stack-title">
171
+ <div class="section-head">
172
+ <p class="eyebrow">SDN Stack</p>
173
+ <h2 id="stack-title">Connected sites</h2>
174
+ </div>
175
+ <div class="link-list">
176
+ <a href="https://spacedatastandards.org/">
177
+ <span>Standards</span>
178
+ <small>Canonical schemas, record contracts, and generated bindings.</small>
179
+ </a>
180
+ <a href="https://digitalarsenal.github.io/flatbuffers/">
181
+ <span>FlatBuffers</span>
182
+ <small>Binary encoding, schema tooling, and runtime documentation.</small>
183
+ </a>
184
+ <a href="https://digitalarsenal.github.io/flatsql/">
185
+ <span>FlatSQL</span>
186
+ <small>SQL-style queries over FlatBuffer-backed datasets and streams.</small>
187
+ </a>
188
+ <a href="https://spacedatanetwork.org/">
189
+ <span>SDN</span>
190
+ <small>Distributed publication, discovery, delivery, and marketplace infrastructure.</small>
191
+ </a>
192
+ <a href="https://digitalarsenal.github.io/space-data-module-sdk/" class="active">
193
+ <span>Module SDK</span>
194
+ <small>WASM module packaging, validation, and host compatibility tooling.</small>
195
+ </a>
196
+ </div>
197
+ </section>
198
+ <footer class="site-footer">
199
+ Space Data Module SDK — Apache-2.0. Every ABI page renders a Markdown
200
+ source in <code>docs/</code>; edit the Markdown, never the HTML.
201
+ </footer>
202
+ </body>
203
+ </html>