space-data-module-sdk 0.8.15 → 0.8.17

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 (130) hide show
  1. package/bin/space-data-module.js +24 -6
  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 +162 -0
  7. package/docs/conformance.md +20 -4
  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 +323 -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 +192 -0
  27. package/docs/families/estimation.md +158 -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 +347 -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 +97 -12
  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/provider-access-abi.md +25 -0
  65. package/docs/publication-submission.html +158 -0
  66. package/docs/publication-submission.md +78 -0
  67. package/docs/secrets-capability.html +206 -0
  68. package/docs/styles.css +860 -167
  69. package/docs/testing-harness.html +408 -0
  70. package/docs/tri-runtime-parity-gate.html +182 -0
  71. package/docs/tri-runtime-parity.html +203 -0
  72. package/include/orbpro/orbpro_estimation_abi.h +883 -0
  73. package/include/orbpro/orbpro_event_runner.h +951 -0
  74. package/include/orbpro/orbpro_events_abi.h +565 -0
  75. package/include/orbpro/orbpro_propagator_abi.h +75 -0
  76. package/package.json +13 -4
  77. package/schemas/orbpro/Estimation.fbs +244 -0
  78. package/schemas/orbpro/Events.fbs +501 -0
  79. package/schemas/orbpro/Propagator.fbs +136 -9
  80. package/schemas/orbpro/reference-frame-crosswalk.json +108 -0
  81. package/schemas/orbpro/reference-frame.lock.json +98 -0
  82. package/src/browser.js +13 -0
  83. package/src/conformance/estimationReference.js +81 -0
  84. package/src/conformance/estimationSuite.js +134 -0
  85. package/src/conformance/index.js +39 -2
  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 +38 -0
  91. package/src/generated/orbpro/propagator-abi.ts +67 -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/standards/sharedCatalog.js +7 -0
  124. package/src/transport/index.js +16 -0
  125. package/src/transport/records.js +1015 -3
  126. package/templates/estimation-module/README.md +24 -0
  127. package/templates/estimation-module/build.mjs +32 -0
  128. package/templates/estimation-module/package.json +12 -0
  129. package/templates/estimation-module/plugin-manifest.json +34 -0
  130. package/templates/estimation-module/src/reference_estimation.cpp +53 -0
@@ -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,162 @@
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-shipped">shipped</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. Shipped family kits: <code>propagator</code> and <code>estimation</code>. Maneuver is Wave 2 (EXPERIMENTAL, fix-then-freeze). <strong>A family with no kit can never be <code>CORE</code>.</strong></p>
87
+ <p>WASM artifacts ONLY (owner ruling 2026-08-10: &quot;No JS propagator!!!! WASM ONLY&quot;). 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
93
+ space-data-module conformance estimation --artifact ./dist/isomorphic/module.wasm \
94
+ --evidence ./conformance/estimation-receipt.json
95
+ space-data-module conformance estimation --self-test # planted failures</code></pre></div>
96
+ <ul>
97
+ <li><code>--artifact</code> — the compiled module. Its sha256 goes in the report; a conformance claim binds to CONTENT, not to a name.</li>
98
+ <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>
99
+ <li><code>--leak-warmup / --leak-cycles / --leak-entities</code> — lifecycle-leak window overrides (defaults 20 / 200 / 256, the reference module's proven numbers).</li>
100
+ <li><code>--evidence</code> — an estimation receipt binding the artifact hash to browser/WasmEdge/thread-width byte digests and the named Orekit, Vallado, media, Monte-Carlo and invariant outcomes. The evaluator contains no JS estimator; it adjudicates results produced by the compiled artifact.</li>
101
+ <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>
102
+ </ul>
103
+ <p>Library surface: <code>space-data-module-sdk/conformance</code> exports <code>runConformance</code>, <code>runPropagatorSuite</code>, <code>runPropagatorSelfTest</code>, <code>runEstimationSuite</code>, <code>runEstimationSelfTest</code>, <code>computeVerdict</code>, the ABI driver and the error-code table.</p>
104
+ <h2 id="what-is-checked"><a class="anchor" href="#what-is-checked" aria-hidden="true">#</a>What is checked</h2>
105
+ <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 — &quot;the entity I just created is count−1&quot; 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>
106
+ <h2 id="the-self-test"><a class="anchor" href="#the-self-test" aria-hidden="true">#</a>The self-test</h2>
107
+ <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>
108
+ <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>
109
+ <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>
110
+ <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 &amp; trust (Wave 4, not yet wired)</h2>
111
+ <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 &quot;Receipt &amp; trust&quot;.</p>
112
+ <p>The estimation self-test plants runtime-byte divergence, the historical EKF/UKF covariance alias, and a placeholder <code>$OCM</code>. All three must be caught.</p>
113
+ <h2 id="reference-implementation"><a class="anchor" href="#reference-implementation" aria-hidden="true">#</a>Reference implementation</h2>
114
+ <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>
115
+ <p><code>templates/estimation-module</code> is the force-model-blind estimation reference. Its compiled direct export performs a covariance-form position update against a caller-supplied propagator sample; it contains no propagator and no JS physics.</p>
116
+
117
+ <p class="doc-footer">
118
+ Source of truth for this page:
119
+ <code>docs/conformance.md</code>. Regenerate with
120
+ <code>npm run build:docs</code>.
121
+ </p>
122
+ </main>
123
+ <nav class="rail" aria-label="On this page"><h2>On this page</h2><ul><li><a class="depth-2" href="#commands">Commands</a></li>
124
+ <li><a class="depth-2" href="#what-is-checked">What is checked</a></li>
125
+ <li><a class="depth-2" href="#the-self-test">The self-test</a></li>
126
+ <li><a class="depth-2" href="#receipt-trust-wave-4-not-yet-wired">Receipt &amp; trust (Wave 4, not yet wired)</a></li>
127
+ <li><a class="depth-2" href="#reference-implementation">Reference implementation</a></li></ul></nav>
128
+ </div>
129
+ <section id="stack" class="section" aria-labelledby="stack-title">
130
+ <div class="section-head">
131
+ <p class="eyebrow">SDN Stack</p>
132
+ <h2 id="stack-title">Connected sites</h2>
133
+ </div>
134
+ <div class="link-list">
135
+ <a href="https://spacedatastandards.org/">
136
+ <span>Standards</span>
137
+ <small>Canonical schemas, record contracts, and generated bindings.</small>
138
+ </a>
139
+ <a href="https://digitalarsenal.github.io/flatbuffers/">
140
+ <span>FlatBuffers</span>
141
+ <small>Binary encoding, schema tooling, and runtime documentation.</small>
142
+ </a>
143
+ <a href="https://digitalarsenal.github.io/flatsql/">
144
+ <span>FlatSQL</span>
145
+ <small>SQL-style queries over FlatBuffer-backed datasets and streams.</small>
146
+ </a>
147
+ <a href="https://spacedatanetwork.org/">
148
+ <span>SDN</span>
149
+ <small>Distributed publication, discovery, delivery, and marketplace infrastructure.</small>
150
+ </a>
151
+ <a href="https://digitalarsenal.github.io/space-data-module-sdk/" class="active">
152
+ <span>Module SDK</span>
153
+ <small>WASM module packaging, validation, and host compatibility tooling.</small>
154
+ </a>
155
+ </div>
156
+ </section>
157
+ <footer class="site-footer">
158
+ Space Data Module SDK — Apache-2.0. Every ABI page renders a Markdown
159
+ source in <code>docs/</code>; edit the Markdown, never the HTML.
160
+ </footer>
161
+ </body>
162
+ </html>
@@ -1,9 +1,9 @@
1
1
  # Conformance runner
2
2
 
3
3
  **Status:** v1 — W1.4 of `graph/tasks/official-harness-shapes-program.md`,
4
- implementing `graph/findings/official-harness-shapes.md` §5. Family kits:
5
- `propagator` (SHIP 1). Maneuver is Wave 2 (EXPERIMENTAL, fix-then-freeze); OD
6
- is deferred by ruling. **A family with no kit can never be `CORE`.**
4
+ implementing `graph/findings/official-harness-shapes.md` §5. Shipped family
5
+ kits: `propagator` and `estimation`. Maneuver is Wave 2 (EXPERIMENTAL,
6
+ fix-then-freeze). **A family with no kit can never be `CORE`.**
7
7
 
8
8
  WASM artifacts ONLY (owner ruling 2026-08-10: "No JS propagator!!!! WASM
9
9
  ONLY"). The runner instantiates a compiled `dist/isomorphic/module.wasm` and
@@ -18,6 +18,9 @@ space-data-module conformance propagator --artifact ./dist/isomorphic/module.was
18
18
  space-data-module conformance propagator --artifact ./dist/isomorphic/module.wasm \
19
19
  --vectors ./vectors/vectors.json --json
20
20
  space-data-module conformance propagator --self-test # must exit 0 BY failing
21
+ space-data-module conformance estimation --artifact ./dist/isomorphic/module.wasm \
22
+ --evidence ./conformance/estimation-receipt.json
23
+ space-data-module conformance estimation --self-test # planted failures
21
24
  ```
22
25
 
23
26
  - `--artifact` — the compiled module. Its sha256 goes in the report; a
@@ -30,12 +33,17 @@ space-data-module conformance propagator --self-test # must exit 0 BY failing
30
33
  module, and a missing corpus is a NAMED GAP, never a silent pass.
31
34
  - `--leak-warmup / --leak-cycles / --leak-entities` — lifecycle-leak window
32
35
  overrides (defaults 20 / 200 / 256, the reference module's proven numbers).
36
+ - `--evidence` — an estimation receipt binding the artifact hash to
37
+ browser/WasmEdge/thread-width byte digests and the named Orekit, Vallado,
38
+ media, Monte-Carlo and invariant outcomes. The evaluator contains no JS
39
+ estimator; it adjudicates results produced by the compiled artifact.
33
40
  - Exit codes: `PASS` and `PASS-WITH-GAPS` exit 0 (gaps are listed in the
34
41
  report); `FAIL` exits 1 with the offending check and case named.
35
42
 
36
43
  Library surface: `space-data-module-sdk/conformance` exports
37
44
  `runConformance`, `runPropagatorSuite`, `runPropagatorSelfTest`,
38
- `computeVerdict`, the ABI driver and the error-code table.
45
+ `runEstimationSuite`, `runEstimationSelfTest`, `computeVerdict`, the ABI driver
46
+ and the error-code table.
39
47
 
40
48
  ## What is checked
41
49
 
@@ -82,6 +90,9 @@ The conformance receipt travels as a bundle `ATTESTATION` entry
82
90
  `SDN-CONFORMANCE-RECEIPT-V1` third-party attestor domain are W4.1/W4.2 of the
83
91
  program — see the finding §5 "Receipt & trust".
84
92
 
93
+ The estimation self-test plants runtime-byte divergence, the historical
94
+ EKF/UKF covariance alias, and a placeholder `$OCM`. All three must be caught.
95
+
85
96
  ## Reference implementation
86
97
 
87
98
  `space-data-network-modules propagator/keplerian-reference` is the exemplar
@@ -90,3 +101,8 @@ these checks, its `vectors/` suite is the corpus format, and
90
101
  `tests/sdk-conformance-runner.test.mjs` proves the runner reaches the same
91
102
  verdict on the same artifact — including the corrupted-corpus negative
92
103
  control.
104
+
105
+ `templates/estimation-module` is the force-model-blind estimation reference.
106
+ Its compiled direct export performs a covariance-form position update against
107
+ a caller-supplied propagator sample; it contains no propagator and no JS
108
+ physics.