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.
- package/bin/space-data-module.js +91 -0
- package/docs/_shell/consumer-assets.html +5 -0
- package/docs/browser-wasmedge-isomorphic.html +261 -0
- package/docs/byo-wasm-quickstart.html +226 -0
- package/docs/byo-wasm-quickstart.md +204 -0
- package/docs/conformance.html +156 -0
- package/docs/conformance.md +92 -0
- package/docs/emception-shared-memory-verdict.md +209 -0
- package/docs/events-abi.html +313 -0
- package/docs/events-abi.md +530 -0
- package/docs/families/analytics.html +178 -0
- package/docs/families/analytics.md +104 -0
- package/docs/families/attitude.html +157 -0
- package/docs/families/attitude.md +36 -0
- package/docs/families/behavior.html +157 -0
- package/docs/families/behavior.md +36 -0
- package/docs/families/breakup.html +157 -0
- package/docs/families/breakup.md +36 -0
- package/docs/families/conjunction.html +186 -0
- package/docs/families/conjunction.md +121 -0
- package/docs/families/data-source.html +318 -0
- package/docs/families/effects.html +157 -0
- package/docs/families/effects.md +36 -0
- package/docs/families/environment.html +170 -0
- package/docs/families/environment.md +73 -0
- package/docs/families/estimation.html +190 -0
- package/docs/families/estimation.md +128 -0
- package/docs/families/gnc.html +157 -0
- package/docs/families/gnc.md +36 -0
- package/docs/families/maneuver.html +209 -0
- package/docs/families/maneuver.md +206 -0
- package/docs/families/obstruction.html +191 -0
- package/docs/families/obstruction.md +96 -0
- package/docs/families/propagator.html +333 -0
- package/docs/families/propulsion.html +157 -0
- package/docs/families/propulsion.md +36 -0
- package/docs/families/reentry.html +157 -0
- package/docs/families/reentry.md +36 -0
- package/docs/families/rf.html +193 -0
- package/docs/families/rf.md +136 -0
- package/docs/families/scheduler.html +157 -0
- package/docs/families/scheduler.md +36 -0
- package/docs/families/sensor.html +157 -0
- package/docs/families/sensor.md +36 -0
- package/docs/families/signature.html +157 -0
- package/docs/families/signature.md +36 -0
- package/docs/flatsql-host-contract.html +176 -0
- package/docs/flatsql-streaming-standard.html +375 -0
- package/docs/gpu-module-abi.html +233 -0
- package/docs/harness-family-matrix.md +135 -0
- package/docs/index.html +216 -85
- package/docs/isomorphic-pthreads.html +228 -0
- package/docs/isomorphic-pthreads.md +84 -0
- package/docs/isomorphic-sdn-runtime-plan.html +274 -0
- package/docs/language-runtime-matrix.html +182 -0
- package/docs/llms.txt +86 -0
- package/docs/module-bundle-runtime-plan.html +146 -0
- package/docs/module-publication-standard.html +503 -0
- package/docs/node-red-default-node-parity.html +201 -0
- package/docs/propagator-abi.md +73 -21
- package/docs/protect-and-sign.html +181 -0
- package/docs/protect-and-sign.md +120 -0
- package/docs/protocol-installation.html +296 -0
- package/docs/publication-submission.html +158 -0
- package/docs/publication-submission.md +78 -0
- package/docs/secrets-capability.html +206 -0
- package/docs/styles.css +860 -167
- package/docs/testing-harness.html +408 -0
- package/docs/tri-runtime-parity-gate.html +182 -0
- package/docs/tri-runtime-parity.html +203 -0
- package/include/orbpro/orbpro_event_runner.h +951 -0
- package/include/orbpro/orbpro_events_abi.h +565 -0
- package/include/orbpro/orbpro_propagator_abi.h +17 -0
- package/package.json +15 -5
- package/schemas/orbpro/Events.fbs +501 -0
- package/schemas/orbpro/Propagator.fbs +72 -9
- package/schemas/orbpro/reference-frame-crosswalk.json +108 -0
- package/schemas/orbpro/reference-frame.lock.json +98 -0
- package/src/browser.js +13 -0
- package/src/conformance/abiDriver.js +225 -0
- package/src/conformance/index.js +151 -0
- package/src/conformance/propagatorSuite.js +526 -0
- package/src/conformance/selfTest.js +275 -0
- package/src/conformance/selfTestCorpus.js +68 -0
- package/src/conformance/twoBodyReference.js +132 -0
- package/src/generated/orbpro/events-abi.js +206 -0
- package/src/generated/orbpro/events-abi.ts +319 -0
- package/src/generated/orbpro/propagator/reference-frame.js +17 -0
- package/src/generated/orbpro/propagator/reference-frame.ts +91 -1
- package/src/generated/orbpro/propagator-abi.js +17 -0
- package/src/generated/orbpro/propagator-abi.ts +17 -0
- package/src/generated/spacedatastandards/plg/CCT.d.ts +94 -0
- package/src/generated/spacedatastandards/plg/CCT.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/CCT.js +208 -0
- package/src/generated/spacedatastandards/plg/CCT.ts +281 -0
- package/src/generated/spacedatastandards/plg/CCTCategory.d.ts +98 -0
- package/src/generated/spacedatastandards/plg/CCTCategory.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/CCTCategory.js +177 -0
- package/src/generated/spacedatastandards/plg/CCTCategory.ts +269 -0
- package/src/generated/spacedatastandards/plg/CCTCategoryRollup.d.ts +54 -0
- package/src/generated/spacedatastandards/plg/CCTCategoryRollup.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/CCTCategoryRollup.js +106 -0
- package/src/generated/spacedatastandards/plg/CCTCategoryRollup.ts +144 -0
- package/src/generated/spacedatastandards/plg/PLG.d.ts +46 -2
- package/src/generated/spacedatastandards/plg/PLG.d.ts.map +1 -1
- package/src/generated/spacedatastandards/plg/PLG.js +78 -5
- package/src/generated/spacedatastandards/plg/PLG.ts +90 -5
- package/src/generated/spacedatastandards/plg/capabilityClass.d.ts +181 -0
- package/src/generated/spacedatastandards/plg/capabilityClass.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/capabilityClass.js +183 -0
- package/src/generated/spacedatastandards/plg/capabilityClass.ts +208 -0
- package/src/generated/spacedatastandards/plg/main.d.ts +4 -0
- package/src/generated/spacedatastandards/plg/main.d.ts.map +1 -1
- package/src/generated/spacedatastandards/plg/main.js +4 -0
- package/src/generated/spacedatastandards/plg/main.ts +4 -0
- package/src/generated/spacedatastandards/plg/pluginCategory.d.ts +40 -2
- package/src/generated/spacedatastandards/plg/pluginCategory.d.ts.map +1 -1
- package/src/generated/spacedatastandards/plg/pluginCategory.js +40 -2
- package/src/generated/spacedatastandards/plg/pluginCategory.ts +40 -2
- package/src/host/browserModuleHarness.js +8 -0
- package/src/host/wasiThreadHost.js +189 -14
- package/src/index.d.ts +18 -1
- package/src/testing/isomorphicHarness.js +233 -0
- package/src/transport/index.js +16 -0
- package/src/transport/records.js +1015 -3
|
@@ -0,0 +1,226 @@
|
|
|
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="Bring your own WebAssembly. This is the vendor path: you compile your existing" />
|
|
7
|
+
<title>BYO-wasm quickstart — 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" aria-current="page"><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"><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>BYO-wasm quickstart</h1>
|
|
86
|
+
<p>Bring your own WebAssembly. This is the vendor path: you compile your existing C or C++ with your own build system, against the pinned toolchain and the family ABI header, and hand the SDK a finished <code>module.wasm</code>. You do not need access to any private repository, and you do not have to route your source through the SDK's own compiler.</p>
|
|
87
|
+
<p>If you would rather have the SDK drive the compiler for you, the <code>space-data-module compile</code> command exists and applies the same toolchain resolution described below. The BYO lane is the supported path for a vendor with an established build.</p>
|
|
88
|
+
<h2 id="1-the-toolchain-pin"><a class="anchor" href="#1-the-toolchain-pin" aria-hidden="true">#</a>1. The toolchain pin</h2>
|
|
89
|
+
<p>This is the only sanctioned toolchain for a guest module, and it is not negotiable:</p>
|
|
90
|
+
<blockquote><p>Compile guest modules with <code>clang --target=wasm32-wasip1-threads</code> (WASI SDK, pinned by the repository's CI workflows). This is the ONLY sanctioned toolchain for <code>module.wasm</code>. <code>emcc -pthread</code> is FORBIDDEN for module compilation: Emscripten's pthread model is browser-only and cannot thread under WasmEdge, which breaks tri-runtime isomorphism (see <a href="./isomorphic-pthreads.html">Isomorphic pthreads</a>). Modules must be EH-free. <code>flowcc</code> composes a runtime from prebuilt objects; it is not a WASI rebuild step.</p></blockquote>
|
|
91
|
+
<p>The template headers carry the same one-line doctrine: <code>Build: clang --target=wasm32-wasip1-threads (never emcc -pthread)</code>.</p>
|
|
92
|
+
<h3 id="toolchain-triples"><a class="anchor" href="#toolchain-triples" aria-hidden="true">#</a>Toolchain triples</h3>
|
|
93
|
+
<div class="table-wrap"><table><thead><tr><th>Purpose</th><th>Value</th></tr></thead><tbody><tr><td>Compile target</td><td><code>wasm32-wasip1-threads</code></td></tr><tr><td>Sysroot triple (threads libc / libc++)</td><td><code>wasm32-wasip1-threads</code></td></tr><tr><td>Resource-dir triple (compiler-rt builtins)</td><td><code>wasm32-unknown-wasip1-threads</code></td></tr><tr><td>Default drivers on <code>PATH</code></td><td><code>wasm32-wasi-clang</code>, <code>wasm32-wasi-clang++</code></td></tr></tbody></table></div>
|
|
94
|
+
<p>The SDK resolves the sysroot by looking for <code>lib/wasm32-wasip1-threads/libc.a</code> under, in order, <code>/opt/homebrew/share/wasi-sysroot</code>, <code>/usr/local/share/wasi-sysroot</code>, <code>/opt/wasi-sdk/share/wasi-sysroot</code>, and versioned Homebrew cellar paths. It resolves the resource directory by looking for <code>lib/wasm32-unknown-wasip1-threads/libclang_rt.builtins.a</code> under <code>/opt/homebrew/share/wasi-runtimes</code>, <code>/usr/local/share/wasi-runtimes</code>, and the versioned cellar equivalents.</p>
|
|
95
|
+
<p>If nothing is found the SDK tells you exactly this:</p>
|
|
96
|
+
<blockquote><p>Install a wasi-sdk / wasi-libc+wasi-runtimes toolchain with the wasm32-wasip1-threads target (e.g. <code>brew install wasi-libc wasi-runtimes</code> or a wasi-sdk release), or set the <code>SDN_WASI_*</code> env overrides.</p></blockquote>
|
|
97
|
+
<h3 id="environment-overrides"><a class="anchor" href="#environment-overrides" aria-hidden="true">#</a>Environment overrides</h3>
|
|
98
|
+
<p>Set these when your toolchain lives somewhere else — for example inside your own container image:</p>
|
|
99
|
+
<div class="table-wrap"><table><thead><tr><th>Variable</th><th>Overrides</th></tr></thead><tbody><tr><td><code>SDN_WASI_CLANG</code></td><td>C driver binary</td></tr><tr><td><code>SDN_WASI_CLANGXX</code></td><td>C++ driver binary</td></tr><tr><td><code>SDN_WASI_TARGET</code></td><td>Compile target triple</td></tr><tr><td><code>SDN_WASI_SYSROOT</code></td><td>Sysroot path</td></tr><tr><td><code>SDN_WASI_RESOURCE_DIR</code></td><td>compiler-rt resource directory</td></tr></tbody></table></div>
|
|
100
|
+
<h2 id="2-the-flag-set"><a class="anchor" href="#2-the-flag-set" aria-hidden="true">#</a>2. The flag set</h2>
|
|
101
|
+
<p>Object files are compiled with atomics, no exceptions, and threads:</p>
|
|
102
|
+
<div class="codeblock"><div class="codeblock-head">sh</div><pre><code>wasm32-wasi-clang++ \
|
|
103
|
+
--target=wasm32-wasip1-threads \
|
|
104
|
+
--sysroot="$WASI_SYSROOT" \
|
|
105
|
+
-resource-dir="$WASI_RESOURCE_DIR" \
|
|
106
|
+
-matomics -fno-exceptions -pthread \
|
|
107
|
+
-O2 -c src/my_module.cpp -o build/my_module.o</code></pre></div>
|
|
108
|
+
<p>The link step adds the shared-memory and imported-memory contract:</p>
|
|
109
|
+
<div class="codeblock"><div class="codeblock-head">sh</div><pre><code>wasm32-wasi-clang++ \
|
|
110
|
+
--target=wasm32-wasip1-threads \
|
|
111
|
+
--sysroot="$WASI_SYSROOT" \
|
|
112
|
+
-resource-dir="$WASI_RESOURCE_DIR" \
|
|
113
|
+
-pthread -matomics -mbulk-memory \
|
|
114
|
+
-Wl,--import-memory -Wl,--shared-memory -Wl,--max-memory=2147483648 \
|
|
115
|
+
-O2 build/*.o -o dist/isomorphic/module.wasm</code></pre></div>
|
|
116
|
+
<p><code>-pthread -matomics -mbulk-memory -Wl,--import-memory -Wl,--shared-memory -Wl,--max-memory=2147483648</code> is the enforced flag set. A module linked without it will not satisfy the parity gate.</p>
|
|
117
|
+
<h3 id="multi-translation-unit-builds"><a class="anchor" href="#multi-translation-unit-builds" aria-hidden="true">#</a>Multi-translation-unit builds</h3>
|
|
118
|
+
<p>Nothing about the contract is single-file. Compile every translation unit with the object-file flags above and link them in one step. A minimal <code>Makefile</code>:</p>
|
|
119
|
+
<div class="codeblock"><div class="codeblock-head">make</div><pre><code>WASI_SYSROOT ?= /opt/homebrew/share/wasi-sysroot
|
|
120
|
+
WASI_RESOURCE_DIR ?= /opt/homebrew/share/wasi-runtimes
|
|
121
|
+
CXX := wasm32-wasi-clang++
|
|
122
|
+
|
|
123
|
+
TARGET_FLAGS := --target=wasm32-wasip1-threads \
|
|
124
|
+
--sysroot=$(WASI_SYSROOT) \
|
|
125
|
+
-resource-dir=$(WASI_RESOURCE_DIR)
|
|
126
|
+
CXXFLAGS := $(TARGET_FLAGS) -matomics -fno-exceptions -pthread -O2 -Iinclude
|
|
127
|
+
LDFLAGS := $(TARGET_FLAGS) -pthread -matomics -mbulk-memory \
|
|
128
|
+
-Wl,--import-memory -Wl,--shared-memory \
|
|
129
|
+
-Wl,--max-memory=2147483648 -O2
|
|
130
|
+
|
|
131
|
+
SRCS := $(wildcard src/*.cpp)
|
|
132
|
+
OBJS := $(SRCS:src/%.cpp=build/%.o)
|
|
133
|
+
|
|
134
|
+
dist/isomorphic/module.wasm: $(OBJS)
|
|
135
|
+
@mkdir -p $(dir $@)
|
|
136
|
+
$(CXX) $(LDFLAGS) $(OBJS) -o $@
|
|
137
|
+
|
|
138
|
+
build/%.o: src/%.cpp
|
|
139
|
+
@mkdir -p build
|
|
140
|
+
$(CXX) $(CXXFLAGS) -c $< -o $@
|
|
141
|
+
|
|
142
|
+
clean:
|
|
143
|
+
rm -rf build dist</code></pre></div>
|
|
144
|
+
<p>Constraints that bite in practice:</p>
|
|
145
|
+
<ul>
|
|
146
|
+
<li><strong>EH-free.</strong> Compile with <code>-fno-exceptions</code>. Do not throw across the ABI boundary; return a named negative error code instead.</li>
|
|
147
|
+
<li><strong>No <code>emcc</code>.</strong> Not for one translation unit, not for a dependency, not "temporarily for the browser build". One artifact serves every runtime.</li>
|
|
148
|
+
<li><strong>No host-specific imports.</strong> The parity gate classifies your import set against the declared host contract and fails on a forbidden import class.</li>
|
|
149
|
+
</ul>
|
|
150
|
+
<h2 id="3-implement-the-family-abi"><a class="anchor" href="#3-implement-the-family-abi" aria-hidden="true">#</a>3. Implement the family ABI</h2>
|
|
151
|
+
<p>Pick your family from the <a href="./index.html">harness family matrix</a> and implement exactly the export set that family's page names. Include the family's generated ABI header from the SDK — do not hand-write the struct layouts, because the headers carry <code>_Static_assert</code> size and offset locks that are the whole point of the generated wire contract.</p>
|
|
152
|
+
<div class="codeblock"><div class="codeblock-head">cpp</div><pre><code>#include <orbpro/orbpro_propagator_abi.h></code></pre></div>
|
|
153
|
+
<p>The SDK ships the headers under <code>include/</code> and exports them through the package (<code>space-data-module-sdk/include/*</code>), so a vendor consuming the SDK from npm gets the same bytes the generator produced.</p>
|
|
154
|
+
<h2 id="4-declare-the-manifest"><a class="anchor" href="#4-declare-the-manifest" aria-hidden="true">#</a>4. Declare the manifest</h2>
|
|
155
|
+
<p>A module carries an embedded manifest declaring its plugin id, family, invoke surface, runtime targets, methods, ports, and the standards record types it consumes and emits. See the <a href="./module-publication-standard.html">module publication standard</a> for the record layout and <a href="./conformance.html">conformance</a> for what is checked.</p>
|
|
156
|
+
<blockquote><p><strong>Status: still being built.</strong> There is no tool today that stamps a manifest onto a binary produced by a foreign toolchain. Manifest normalization and codecs exist for modules authored inside the SDK's own build path, but a <code>manifest inject</code> verb for a BYO binary does not exist yet — it is Sprint 1 of the third-party integration program. Until it lands, a BYO vendor supplies the manifest JSON alongside the artifact and the manifest is attached for them.</p></blockquote>
|
|
157
|
+
<h2 id="5-prove-it-then-ship-it"><a class="anchor" href="#5-prove-it-then-ship-it" aria-hidden="true">#</a>5. Prove it, then ship it</h2>
|
|
158
|
+
<div class="codeblock"><div class="codeblock-head">sh</div><pre><code># ABI conformance for your family
|
|
159
|
+
space-data-module conformance propagator --artifact ./dist/isomorphic/module.wasm
|
|
160
|
+
|
|
161
|
+
# tri-runtime parity: browser + WasmEdge + Docker WasmEdge, byte-identical
|
|
162
|
+
space-data-module parity \
|
|
163
|
+
--wasm ./dist/isomorphic/module.wasm \
|
|
164
|
+
--fixture ./fixtures/parity/basic.json \
|
|
165
|
+
--lanes browser,wasmedge,docker-wasmedge</code></pre></div>
|
|
166
|
+
<p>Then continue with <a href="./conformance.html">Conformance kit</a>, <a href="./protect-and-sign.html">Protect and sign</a>, and <a href="./publication-submission.html">Publication and listing</a>.</p>
|
|
167
|
+
<h2 id="honest-gaps-in-this-lane"><a class="anchor" href="#honest-gaps-in-this-lane" aria-hidden="true">#</a>Honest gaps in this lane</h2>
|
|
168
|
+
<p>These are checked statements about the SDK today, not future tense for its own sake:</p>
|
|
169
|
+
<ul>
|
|
170
|
+
<li>The toolchain flags and triples above are real and enforced, but they are applied by the SDK's internal compiler resolver. The <code>Makefile</code> on this page is a documented recipe assembled from those enforced values; the repository does not yet ship a <code>Makefile</code>, <code>CMakeLists.txt</code> or <code>build.sh</code> template for a hand-rolled multi-TU build.</li>
|
|
171
|
+
<li><code>conformance --self-test</code> currently accepts only the <code>propagator</code> family. Any other family argument raises an unknown-family error.</li>
|
|
172
|
+
<li>Manifest injection for foreign-compiled binaries does not exist yet.</li>
|
|
173
|
+
<li>There is no self-serve listing submission command yet. See <a href="./publication-submission.html">Publication and listing</a>.</li>
|
|
174
|
+
</ul>
|
|
175
|
+
<p>An escorted pilot is possible today: a vendor delivers a BYO artifact and the gates are run and the module listed by hand. The program above is what makes that self-serve.</p>
|
|
176
|
+
|
|
177
|
+
<p class="doc-footer">
|
|
178
|
+
Source of truth for this page:
|
|
179
|
+
<code>docs/byo-wasm-quickstart.md</code>. Regenerate with
|
|
180
|
+
<code>npm run build:docs</code>.
|
|
181
|
+
</p>
|
|
182
|
+
</main>
|
|
183
|
+
<nav class="rail" aria-label="On this page"><h2>On this page</h2><ul><li><a class="depth-2" href="#1-the-toolchain-pin">1. The toolchain pin</a></li>
|
|
184
|
+
<li><a class="depth-3" href="#toolchain-triples">Toolchain triples</a></li>
|
|
185
|
+
<li><a class="depth-3" href="#environment-overrides">Environment overrides</a></li>
|
|
186
|
+
<li><a class="depth-2" href="#2-the-flag-set">2. The flag set</a></li>
|
|
187
|
+
<li><a class="depth-3" href="#multi-translation-unit-builds">Multi-translation-unit builds</a></li>
|
|
188
|
+
<li><a class="depth-2" href="#3-implement-the-family-abi">3. Implement the family ABI</a></li>
|
|
189
|
+
<li><a class="depth-2" href="#4-declare-the-manifest">4. Declare the manifest</a></li>
|
|
190
|
+
<li><a class="depth-2" href="#5-prove-it-then-ship-it">5. Prove it, then ship it</a></li>
|
|
191
|
+
<li><a class="depth-2" href="#honest-gaps-in-this-lane">Honest gaps in this lane</a></li></ul></nav>
|
|
192
|
+
</div>
|
|
193
|
+
<section id="stack" class="section" aria-labelledby="stack-title">
|
|
194
|
+
<div class="section-head">
|
|
195
|
+
<p class="eyebrow">SDN Stack</p>
|
|
196
|
+
<h2 id="stack-title">Connected sites</h2>
|
|
197
|
+
</div>
|
|
198
|
+
<div class="link-list">
|
|
199
|
+
<a href="https://spacedatastandards.org/">
|
|
200
|
+
<span>Standards</span>
|
|
201
|
+
<small>Canonical schemas, record contracts, and generated bindings.</small>
|
|
202
|
+
</a>
|
|
203
|
+
<a href="https://digitalarsenal.github.io/flatbuffers/">
|
|
204
|
+
<span>FlatBuffers</span>
|
|
205
|
+
<small>Binary encoding, schema tooling, and runtime documentation.</small>
|
|
206
|
+
</a>
|
|
207
|
+
<a href="https://digitalarsenal.github.io/flatsql/">
|
|
208
|
+
<span>FlatSQL</span>
|
|
209
|
+
<small>SQL-style queries over FlatBuffer-backed datasets and streams.</small>
|
|
210
|
+
</a>
|
|
211
|
+
<a href="https://spacedatanetwork.org/">
|
|
212
|
+
<span>SDN</span>
|
|
213
|
+
<small>Distributed publication, discovery, delivery, and marketplace infrastructure.</small>
|
|
214
|
+
</a>
|
|
215
|
+
<a href="https://digitalarsenal.github.io/space-data-module-sdk/" class="active">
|
|
216
|
+
<span>Module SDK</span>
|
|
217
|
+
<small>WASM module packaging, validation, and host compatibility tooling.</small>
|
|
218
|
+
</a>
|
|
219
|
+
</div>
|
|
220
|
+
</section>
|
|
221
|
+
<footer class="site-footer">
|
|
222
|
+
Space Data Module SDK — Apache-2.0. Every ABI page renders a Markdown
|
|
223
|
+
source in <code>docs/</code>; edit the Markdown, never the HTML.
|
|
224
|
+
</footer>
|
|
225
|
+
</body>
|
|
226
|
+
</html>
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
# BYO-wasm quickstart
|
|
2
|
+
|
|
3
|
+
Bring your own WebAssembly. This is the vendor path: you compile your existing
|
|
4
|
+
C or C++ with your own build system, against the pinned toolchain and the
|
|
5
|
+
family ABI header, and hand the SDK a finished `module.wasm`. You do not need
|
|
6
|
+
access to any private repository, and you do not have to route your source
|
|
7
|
+
through the SDK's own compiler.
|
|
8
|
+
|
|
9
|
+
If you would rather have the SDK drive the compiler for you, the
|
|
10
|
+
`space-data-module compile` command exists and applies the same toolchain
|
|
11
|
+
resolution described below. The BYO lane is the supported path for a vendor
|
|
12
|
+
with an established build.
|
|
13
|
+
|
|
14
|
+
## 1. The toolchain pin
|
|
15
|
+
|
|
16
|
+
This is the only sanctioned toolchain for a guest module, and it is not
|
|
17
|
+
negotiable:
|
|
18
|
+
|
|
19
|
+
> Compile guest modules with `clang --target=wasm32-wasip1-threads` (WASI SDK,
|
|
20
|
+
> pinned by the repository's CI workflows). This is the ONLY sanctioned
|
|
21
|
+
> toolchain for `module.wasm`. `emcc -pthread` is FORBIDDEN for module
|
|
22
|
+
> compilation: Emscripten's pthread model is browser-only and cannot thread
|
|
23
|
+
> under WasmEdge, which breaks tri-runtime isomorphism (see
|
|
24
|
+
> [Isomorphic pthreads](isomorphic-pthreads.html)). Modules must be EH-free.
|
|
25
|
+
> `flowcc` composes a runtime from prebuilt objects; it is not a WASI rebuild
|
|
26
|
+
> step.
|
|
27
|
+
|
|
28
|
+
The template headers carry the same one-line doctrine:
|
|
29
|
+
`Build: clang --target=wasm32-wasip1-threads (never emcc -pthread)`.
|
|
30
|
+
|
|
31
|
+
### Toolchain triples
|
|
32
|
+
|
|
33
|
+
| Purpose | Value |
|
|
34
|
+
| --- | --- |
|
|
35
|
+
| Compile target | `wasm32-wasip1-threads` |
|
|
36
|
+
| Sysroot triple (threads libc / libc++) | `wasm32-wasip1-threads` |
|
|
37
|
+
| Resource-dir triple (compiler-rt builtins) | `wasm32-unknown-wasip1-threads` |
|
|
38
|
+
| Default drivers on `PATH` | `wasm32-wasi-clang`, `wasm32-wasi-clang++` |
|
|
39
|
+
|
|
40
|
+
The SDK resolves the sysroot by looking for `lib/wasm32-wasip1-threads/libc.a`
|
|
41
|
+
under, in order, `/opt/homebrew/share/wasi-sysroot`,
|
|
42
|
+
`/usr/local/share/wasi-sysroot`, `/opt/wasi-sdk/share/wasi-sysroot`, and
|
|
43
|
+
versioned Homebrew cellar paths. It resolves the resource directory by looking
|
|
44
|
+
for `lib/wasm32-unknown-wasip1-threads/libclang_rt.builtins.a` under
|
|
45
|
+
`/opt/homebrew/share/wasi-runtimes`, `/usr/local/share/wasi-runtimes`, and the
|
|
46
|
+
versioned cellar equivalents.
|
|
47
|
+
|
|
48
|
+
If nothing is found the SDK tells you exactly this:
|
|
49
|
+
|
|
50
|
+
> Install a wasi-sdk / wasi-libc+wasi-runtimes toolchain with the
|
|
51
|
+
> wasm32-wasip1-threads target (e.g. `brew install wasi-libc wasi-runtimes` or a
|
|
52
|
+
> wasi-sdk release), or set the `SDN_WASI_*` env overrides.
|
|
53
|
+
|
|
54
|
+
### Environment overrides
|
|
55
|
+
|
|
56
|
+
Set these when your toolchain lives somewhere else — for example inside your own
|
|
57
|
+
container image:
|
|
58
|
+
|
|
59
|
+
| Variable | Overrides |
|
|
60
|
+
| --- | --- |
|
|
61
|
+
| `SDN_WASI_CLANG` | C driver binary |
|
|
62
|
+
| `SDN_WASI_CLANGXX` | C++ driver binary |
|
|
63
|
+
| `SDN_WASI_TARGET` | Compile target triple |
|
|
64
|
+
| `SDN_WASI_SYSROOT` | Sysroot path |
|
|
65
|
+
| `SDN_WASI_RESOURCE_DIR` | compiler-rt resource directory |
|
|
66
|
+
|
|
67
|
+
## 2. The flag set
|
|
68
|
+
|
|
69
|
+
Object files are compiled with atomics, no exceptions, and threads:
|
|
70
|
+
|
|
71
|
+
```sh
|
|
72
|
+
wasm32-wasi-clang++ \
|
|
73
|
+
--target=wasm32-wasip1-threads \
|
|
74
|
+
--sysroot="$WASI_SYSROOT" \
|
|
75
|
+
-resource-dir="$WASI_RESOURCE_DIR" \
|
|
76
|
+
-matomics -fno-exceptions -pthread \
|
|
77
|
+
-O2 -c src/my_module.cpp -o build/my_module.o
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
The link step adds the shared-memory and imported-memory contract:
|
|
81
|
+
|
|
82
|
+
```sh
|
|
83
|
+
wasm32-wasi-clang++ \
|
|
84
|
+
--target=wasm32-wasip1-threads \
|
|
85
|
+
--sysroot="$WASI_SYSROOT" \
|
|
86
|
+
-resource-dir="$WASI_RESOURCE_DIR" \
|
|
87
|
+
-pthread -matomics -mbulk-memory \
|
|
88
|
+
-Wl,--import-memory -Wl,--shared-memory -Wl,--max-memory=2147483648 \
|
|
89
|
+
-O2 build/*.o -o dist/isomorphic/module.wasm
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
`-pthread -matomics -mbulk-memory -Wl,--import-memory -Wl,--shared-memory
|
|
93
|
+
-Wl,--max-memory=2147483648` is the enforced flag set. A module linked without
|
|
94
|
+
it will not satisfy the parity gate.
|
|
95
|
+
|
|
96
|
+
### Multi-translation-unit builds
|
|
97
|
+
|
|
98
|
+
Nothing about the contract is single-file. Compile every translation unit with
|
|
99
|
+
the object-file flags above and link them in one step. A minimal `Makefile`:
|
|
100
|
+
|
|
101
|
+
```make
|
|
102
|
+
WASI_SYSROOT ?= /opt/homebrew/share/wasi-sysroot
|
|
103
|
+
WASI_RESOURCE_DIR ?= /opt/homebrew/share/wasi-runtimes
|
|
104
|
+
CXX := wasm32-wasi-clang++
|
|
105
|
+
|
|
106
|
+
TARGET_FLAGS := --target=wasm32-wasip1-threads \
|
|
107
|
+
--sysroot=$(WASI_SYSROOT) \
|
|
108
|
+
-resource-dir=$(WASI_RESOURCE_DIR)
|
|
109
|
+
CXXFLAGS := $(TARGET_FLAGS) -matomics -fno-exceptions -pthread -O2 -Iinclude
|
|
110
|
+
LDFLAGS := $(TARGET_FLAGS) -pthread -matomics -mbulk-memory \
|
|
111
|
+
-Wl,--import-memory -Wl,--shared-memory \
|
|
112
|
+
-Wl,--max-memory=2147483648 -O2
|
|
113
|
+
|
|
114
|
+
SRCS := $(wildcard src/*.cpp)
|
|
115
|
+
OBJS := $(SRCS:src/%.cpp=build/%.o)
|
|
116
|
+
|
|
117
|
+
dist/isomorphic/module.wasm: $(OBJS)
|
|
118
|
+
@mkdir -p $(dir $@)
|
|
119
|
+
$(CXX) $(LDFLAGS) $(OBJS) -o $@
|
|
120
|
+
|
|
121
|
+
build/%.o: src/%.cpp
|
|
122
|
+
@mkdir -p build
|
|
123
|
+
$(CXX) $(CXXFLAGS) -c $< -o $@
|
|
124
|
+
|
|
125
|
+
clean:
|
|
126
|
+
rm -rf build dist
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
Constraints that bite in practice:
|
|
130
|
+
|
|
131
|
+
- **EH-free.** Compile with `-fno-exceptions`. Do not throw across the ABI
|
|
132
|
+
boundary; return a named negative error code instead.
|
|
133
|
+
- **No `emcc`.** Not for one translation unit, not for a dependency, not
|
|
134
|
+
"temporarily for the browser build". One artifact serves every runtime.
|
|
135
|
+
- **No host-specific imports.** The parity gate classifies your import set
|
|
136
|
+
against the declared host contract and fails on a forbidden import class.
|
|
137
|
+
|
|
138
|
+
## 3. Implement the family ABI
|
|
139
|
+
|
|
140
|
+
Pick your family from the [harness family matrix](index.html) and implement
|
|
141
|
+
exactly the export set that family's page names. Include the family's generated
|
|
142
|
+
ABI header from the SDK — do not hand-write the struct layouts, because the
|
|
143
|
+
headers carry `_Static_assert` size and offset locks that are the whole point of
|
|
144
|
+
the generated wire contract.
|
|
145
|
+
|
|
146
|
+
```cpp
|
|
147
|
+
#include <orbpro/orbpro_propagator_abi.h>
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
The SDK ships the headers under `include/` and exports them through the package
|
|
151
|
+
(`space-data-module-sdk/include/*`), so a vendor consuming the SDK from npm gets
|
|
152
|
+
the same bytes the generator produced.
|
|
153
|
+
|
|
154
|
+
## 4. Declare the manifest
|
|
155
|
+
|
|
156
|
+
A module carries an embedded manifest declaring its plugin id, family, invoke
|
|
157
|
+
surface, runtime targets, methods, ports, and the standards record types it
|
|
158
|
+
consumes and emits. See the
|
|
159
|
+
[module publication standard](module-publication-standard.html) for the record
|
|
160
|
+
layout and [conformance](conformance.html) for what is checked.
|
|
161
|
+
|
|
162
|
+
> **Status: still being built.** There is no tool today that stamps a manifest
|
|
163
|
+
> onto a binary produced by a foreign toolchain. Manifest normalization and
|
|
164
|
+
> codecs exist for modules authored inside the SDK's own build path, but a
|
|
165
|
+
> `manifest inject` verb for a BYO binary does not exist yet — it is Sprint 1 of
|
|
166
|
+
> the third-party integration program. Until it lands, a BYO vendor supplies the
|
|
167
|
+
> manifest JSON alongside the artifact and the manifest is attached for them.
|
|
168
|
+
|
|
169
|
+
## 5. Prove it, then ship it
|
|
170
|
+
|
|
171
|
+
```sh
|
|
172
|
+
# ABI conformance for your family
|
|
173
|
+
space-data-module conformance propagator --artifact ./dist/isomorphic/module.wasm
|
|
174
|
+
|
|
175
|
+
# tri-runtime parity: browser + WasmEdge + Docker WasmEdge, byte-identical
|
|
176
|
+
space-data-module parity \
|
|
177
|
+
--wasm ./dist/isomorphic/module.wasm \
|
|
178
|
+
--fixture ./fixtures/parity/basic.json \
|
|
179
|
+
--lanes browser,wasmedge,docker-wasmedge
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
Then continue with [Conformance kit](conformance.html),
|
|
183
|
+
[Protect and sign](protect-and-sign.html), and
|
|
184
|
+
[Publication and listing](publication-submission.html).
|
|
185
|
+
|
|
186
|
+
## Honest gaps in this lane
|
|
187
|
+
|
|
188
|
+
These are checked statements about the SDK today, not future tense for its own
|
|
189
|
+
sake:
|
|
190
|
+
|
|
191
|
+
- The toolchain flags and triples above are real and enforced, but they are
|
|
192
|
+
applied by the SDK's internal compiler resolver. The `Makefile` on this page
|
|
193
|
+
is a documented recipe assembled from those enforced values; the repository
|
|
194
|
+
does not yet ship a `Makefile`, `CMakeLists.txt` or `build.sh` template for a
|
|
195
|
+
hand-rolled multi-TU build.
|
|
196
|
+
- `conformance --self-test` currently accepts only the `propagator` family. Any
|
|
197
|
+
other family argument raises an unknown-family error.
|
|
198
|
+
- Manifest injection for foreign-compiled binaries does not exist yet.
|
|
199
|
+
- There is no self-serve listing submission command yet. See
|
|
200
|
+
[Publication and listing](publication-submission.html).
|
|
201
|
+
|
|
202
|
+
An escorted pilot is possible today: a vendor delivers a BYO artifact and the
|
|
203
|
+
gates are run and the module listed by hand. The program above is what makes
|
|
204
|
+
that self-serve.
|
|
@@ -0,0 +1,156 @@
|
|
|
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="Status: v1 — W1.4 of graph/tasks/official-harness-shapes-program.md," />
|
|
7
|
+
<title>Conformance kit — 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" aria-current="page"><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"><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>Conformance kit</h1>
|
|
86
|
+
<p><strong>Status:</strong> v1 — W1.4 of <code>graph/tasks/official-harness-shapes-program.md</code>, implementing <code>graph/findings/official-harness-shapes.md</code> §5. Family kits: <code>propagator</code> (SHIP 1). Maneuver is Wave 2 (EXPERIMENTAL, fix-then-freeze); OD is deferred by ruling. <strong>A family with no kit can never be <code>CORE</code>.</strong></p>
|
|
87
|
+
<p>WASM artifacts ONLY (owner ruling 2026-08-10: "No JS propagator!!!! WASM ONLY"). The runner instantiates a compiled <code>dist/isomorphic/module.wasm</code> and drives the family's ABI directly; there is no path that certifies a JavaScript object, because JS registries are internal engine plumbing, never a public contract.</p>
|
|
88
|
+
<h2 id="commands"><a class="anchor" href="#commands" aria-hidden="true">#</a>Commands</h2>
|
|
89
|
+
<div class="codeblock"><pre><code>space-data-module conformance propagator --artifact ./dist/isomorphic/module.wasm
|
|
90
|
+
space-data-module conformance propagator --artifact ./dist/isomorphic/module.wasm \
|
|
91
|
+
--vectors ./vectors/vectors.json --json
|
|
92
|
+
space-data-module conformance propagator --self-test # must exit 0 BY failing</code></pre></div>
|
|
93
|
+
<ul>
|
|
94
|
+
<li><code>--artifact</code> — the compiled module. Its sha256 goes in the report; a conformance claim binds to CONTENT, not to a name.</li>
|
|
95
|
+
<li><code>--vectors</code> — the module's corpus (<code>vectors.json</code> + <code>PROVENANCE.md</code>, the format proven by the reference module's <code>vectors/</code> suite). Default: the runner walks up from the artifact to the package root and takes <code>vectors/vectors.json</code>. <strong>The corpus is the module's own</strong>: Tier B anchors are model-specific, so a two-body corpus is never forced onto an SGP4 module, and a missing corpus is a NAMED GAP, never a silent pass.</li>
|
|
96
|
+
<li><code>--leak-warmup / --leak-cycles / --leak-entities</code> — lifecycle-leak window overrides (defaults 20 / 200 / 256, the reference module's proven numbers).</li>
|
|
97
|
+
<li>Exit codes: <code>PASS</code> and <code>PASS-WITH-GAPS</code> exit 0 (gaps are listed in the report); <code>FAIL</code> exits 1 with the offending check and case named.</li>
|
|
98
|
+
</ul>
|
|
99
|
+
<p>Library surface: <code>space-data-module-sdk/conformance</code> exports <code>runConformance</code>, <code>runPropagatorSuite</code>, <code>runPropagatorSelfTest</code>, <code>computeVerdict</code>, the ABI driver and the error-code table.</p>
|
|
100
|
+
<h2 id="what-is-checked"><a class="anchor" href="#what-is-checked" aria-hidden="true">#</a>What is checked</h2>
|
|
101
|
+
<div class="table-wrap"><table><thead><tr><th>Tier</th><th>Check</th><th>Source of authority</th></tr></thead><tbody><tr><td>0</td><td>real instantiation + required export set</td><td><a href="./families/propagator.html">propagator-abi.md</a> §The export set</td></tr><tr><td>0</td><td>cross-runtime byte-identity</td><td><strong>GAP here by design</strong> — the parity gate (<code>space-data-module parity-gate</code>) is the Tier 0 authority; this runner never re-certifies half of it</td></tr><tr><td>B</td><td>corpus anchors reproduced within band</td><td>the module's <code>vectors.json</code> (tolerance policy `abs + rel *</td><td>expected</td><td>`); NaN is its own failure class</td></tr><tr><td>C</td><td>vis-viva closure, period closure</td><td>corpus-declared invariants (<code>conformance.mu</code> from the corpus; ECEF un-rotation when the module declares frame 3) — run only where the corpus declares them applicable to the model</td></tr><tr><td>C</td><td>determinism as BYTES, surviving destroy/re-ingest</td><td>ABI §Parity envelope</td></tr><tr><td>C</td><td>frame/flags/reserved declared, corpus-consistent</td><td>ABI §Frames — a frame declaration that contradicts the module's own corpus is the silently-wrong-numbers defect</td></tr><tr><td>C</td><td>batch and single agree exactly</td><td>ABI §Threading — the batch path is the same physics</td></tr><tr><td>C</td><td>typed refusals (NOT_INITIALIZED / BAD_ENTITY_INDEX / unphysical ingest)</td><td>ABI §Error codes — the degradation ladder needs distinguishable codes</td></tr><tr><td>C</td><td>create RETURNS its handle</td><td>ABI §Identity — "the entity I just created is count−1" is the race the harness exists to kill (finding §4.4)</td></tr><tr><td>4</td><td>lifecycle leak: zero page growth after warm-up</td><td>ABI §Lifetime</td></tr><tr><td>4</td><td>destroy idempotent, refuses typed, comes back cleanly</td><td>ABI §Lifetime</td></tr><tr><td>4</td><td>leak-metric negative control</td><td>a gate never observed to fail is indistinguishable from one that cannot fail</td></tr></tbody></table></div>
|
|
102
|
+
<h2 id="the-self-test"><a class="anchor" href="#the-self-test" aria-hidden="true">#</a>The self-test</h2>
|
|
103
|
+
<p><code>--self-test</code> runs the SAME suite against mock propagators, each carrying ONE planted defect drawn from a real defect class the finding documented live:</p>
|
|
104
|
+
<div class="table-wrap"><table><thead><tr><th>Planted defect</th><th>Real-world citation</th><th>Must be caught by</th></tr></thead><tbody><tr><td><code>units-km</code> (1000× error)</td><td>the <code>orbpro_propagator.h</code> km/meters contradiction (finding §4.1)</td><td><code>tierB/anchors</code></td></tr><tr><td><code>leaky-destroy</code></td><td><code>destroySource(){}</code> in both shipped propagators (§4.5)</td><td><code>tier4/lifecycle-leak</code></td></tr><tr><td><code>confident-nonsense</code> (accepts e ≥ 1)</td><td>the underground phasing orbit (§5)</td><td><code>tierC/typed-refusals</code></td></tr><tr><td><code>count-fallback</code> (returns success, not the handle)</td><td>three families deriving count−1 (§4.4)</td><td><code>tierC/create-returns-handle</code></td></tr><tr><td><code>frame-lies</code> (declares TEME, writes ECEF)</td><td>the Δv frame never pinned (§4.3)</td><td><code>tierC/frame-flags-reserved-declared</code></td></tr><tr><td><code>batch-divergence</code></td><td>batch path not the same physics</td><td><code>tierC/batch-single-agreement</code></td></tr><tr><td><code>nondeterministic</code></td><td>byte-determinism is the parity envelope's floor</td><td><code>tierC/determinism-byte-identity</code></td></tr><tr><td><code>missing-exports</code></td><td>destroy was optional once; it is not now</td><td><code>tier0/instantiation-and-exports</code></td></tr></tbody></table></div>
|
|
105
|
+
<p>The self-test exits 0 only when the conformant baseline mock is clean AND every planted defect is caught by the check that owns it. It needs no toolchain, no artifact and no network — <code>npm run conformance:self-test</code>.</p>
|
|
106
|
+
<h2 id="receipt-trust-wave-4-not-yet-wired"><a class="anchor" href="#receipt-trust-wave-4-not-yet-wired" aria-hidden="true">#</a>Receipt & trust (Wave 4, not yet wired)</h2>
|
|
107
|
+
<p>The conformance receipt travels as a bundle <code>ATTESTATION</code> entry (publisher-signed under bundle scope); the graduated listing requirement (receipt REQUIRED for <code>CORE</code>+<code>ANONYMOUS</code>, badge for <code>RECOMMENDED</code>) and the <code>SDN-CONFORMANCE-RECEIPT-V1</code> third-party attestor domain are W4.1/W4.2 of the program — see the finding §5 "Receipt & trust".</p>
|
|
108
|
+
<h2 id="reference-implementation"><a class="anchor" href="#reference-implementation" aria-hidden="true">#</a>Reference implementation</h2>
|
|
109
|
+
<p><code>space-data-network-modules propagator/keplerian-reference</code> is the exemplar the kit was generalized from: its <code>tests/</code> are the original expression of these checks, its <code>vectors/</code> suite is the corpus format, and <code>tests/sdk-conformance-runner.test.mjs</code> proves the runner reaches the same verdict on the same artifact — including the corrupted-corpus negative control.</p>
|
|
110
|
+
|
|
111
|
+
<p class="doc-footer">
|
|
112
|
+
Source of truth for this page:
|
|
113
|
+
<code>docs/conformance.md</code>. Regenerate with
|
|
114
|
+
<code>npm run build:docs</code>.
|
|
115
|
+
</p>
|
|
116
|
+
</main>
|
|
117
|
+
<nav class="rail" aria-label="On this page"><h2>On this page</h2><ul><li><a class="depth-2" href="#commands">Commands</a></li>
|
|
118
|
+
<li><a class="depth-2" href="#what-is-checked">What is checked</a></li>
|
|
119
|
+
<li><a class="depth-2" href="#the-self-test">The self-test</a></li>
|
|
120
|
+
<li><a class="depth-2" href="#receipt-trust-wave-4-not-yet-wired">Receipt & trust (Wave 4, not yet wired)</a></li>
|
|
121
|
+
<li><a class="depth-2" href="#reference-implementation">Reference implementation</a></li></ul></nav>
|
|
122
|
+
</div>
|
|
123
|
+
<section id="stack" class="section" aria-labelledby="stack-title">
|
|
124
|
+
<div class="section-head">
|
|
125
|
+
<p class="eyebrow">SDN Stack</p>
|
|
126
|
+
<h2 id="stack-title">Connected sites</h2>
|
|
127
|
+
</div>
|
|
128
|
+
<div class="link-list">
|
|
129
|
+
<a href="https://spacedatastandards.org/">
|
|
130
|
+
<span>Standards</span>
|
|
131
|
+
<small>Canonical schemas, record contracts, and generated bindings.</small>
|
|
132
|
+
</a>
|
|
133
|
+
<a href="https://digitalarsenal.github.io/flatbuffers/">
|
|
134
|
+
<span>FlatBuffers</span>
|
|
135
|
+
<small>Binary encoding, schema tooling, and runtime documentation.</small>
|
|
136
|
+
</a>
|
|
137
|
+
<a href="https://digitalarsenal.github.io/flatsql/">
|
|
138
|
+
<span>FlatSQL</span>
|
|
139
|
+
<small>SQL-style queries over FlatBuffer-backed datasets and streams.</small>
|
|
140
|
+
</a>
|
|
141
|
+
<a href="https://spacedatanetwork.org/">
|
|
142
|
+
<span>SDN</span>
|
|
143
|
+
<small>Distributed publication, discovery, delivery, and marketplace infrastructure.</small>
|
|
144
|
+
</a>
|
|
145
|
+
<a href="https://digitalarsenal.github.io/space-data-module-sdk/" class="active">
|
|
146
|
+
<span>Module SDK</span>
|
|
147
|
+
<small>WASM module packaging, validation, and host compatibility tooling.</small>
|
|
148
|
+
</a>
|
|
149
|
+
</div>
|
|
150
|
+
</section>
|
|
151
|
+
<footer class="site-footer">
|
|
152
|
+
Space Data Module SDK — Apache-2.0. Every ABI page renders a Markdown
|
|
153
|
+
source in <code>docs/</code>; edit the Markdown, never the HTML.
|
|
154
|
+
</footer>
|
|
155
|
+
</body>
|
|
156
|
+
</html>
|