File size: 9,120 Bytes
87bb7d6 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 | # Architecture & Scale
AstroMesh Round 2 β Challenge #518, *Constraint Awareness: Completion Signal*
---
## 1. The shape of it
```
ββββββββββββββββββββββββββββββββββββββββββββ
β CONSTRAINT ENGINE β
β dev/constraints/engine.js β
β β
rulebook ββββββββββΊ β rulebook + context β completion signal β
context ββββββββββΊ β β
β COMPLETE Β· PARTIAL Β· BLOCKED Β· β
β UNRESOLVED β
β β
β Knows nothing about satellites. β
ββββββββββββββββ¬ββββββββββββββββββββββββββββ
β
ββββββββββββββββββββ¬ββββββββββββ΄ββββββββββββ¬βββββββββββββββββββββ
βΌ βΌ βΌ βΌ
βββββββββββββ βββββββββββββββ ββββββββββββββββ ββββββββββββββββ
β maneuver β β re-entry β β authored β β release β
β rulebook β β rulebook β β (English β β β gate β
β 19 rules β β 9 rules β β verified) β β 10 rules β
βββββββββββββ βββββββββββββββ ββββββββββββββββ ββββββββββββββββ
β β NOT SPACE β
β β the portability
βΌ βΌ proof
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β vote gate (409) Β· deterministic poll Β· propellant ledger β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
```
The engine is the product. The rulebooks are data. That separation is what makes the capability
theme-independent, and it is verified by a test that runs a **software release gate** through the
same code path.
---
## 2. Where the inputs come from
| Layer | Source | Live? | Feeds |
|---|---|---|---|
| Catalogue | Space-Track, ~31k objects, 3Γ/day | yes | FR-00, FR-03, FR-22 |
| Conjunctions | our own SGP4 screening | computed | FR-01, FR-10, FR-12 |
| CDMs | 19th SDS via Space-Track | yes | FR-11 |
| Operator ephemeris | SpaceX Starlink Space Safety | **operator-gated (403)** | FR-11 β reports UNEVALUATED without access |
| Space weather | NOAA SWPC, no API key | yes, 5 min | FR-19, FR-20, FR-21 |
| Solar X-ray | NOAA GOES XRS, two bands | yes, 2 min | FR-19 **predictive deadline** |
| Ground consequence | GeoNames + OpenFlights + Natural Earth | static, 4.4 MB | FR-17a, FR-17b, FR-23 |
| Maritime | *not loaded* | no | FR-24 β **UNEVALUATED, never "clear water"** |
| Models | trained offline, shipped as JSON | n/a | FR-07, FR-10, FR-13 |
**Every absent source degrades to UNEVALUATED.** Nothing defaults, nothing imputes, nothing
assumes a quiet Sun or an empty ocean.
---
## 3. Scale
### What it handles today
| Quantity | Measured |
|---|---|
| Catalogue screened | **31,572 objects** |
| Conjunction screening | apogee/perigee sieve β coarse β fine TCA refine |
| Ground raster | 259,200 cells, **100% characterised**, 4.4 MB |
| Monte Carlo footprint | 20,000 samples per deorbit, deterministic |
| Constraint evaluation | 28 rules Γ N events, **pure arithmetic, no I/O** |
| Refresh cadence | 8 h catalogue Β· 5 min space weather Β· 2 min X-ray |
| Consensus | 4 nodes, quorum 3, sub-second failover |
| Formal verification | **148,163 states exhaustively checked** |
### How each part scales
**The constraint engine is the easy part.** It is stateless and linear in
`rules Γ events` with no I/O β 28 rules over 38 events is roughly a thousand comparisons.
100,000 events would still be milliseconds. It is not, and will not become, the bottleneck.
**Conjunction screening is the real cost.** All-pairs over a catalogue is O(nΒ²) β for 31,572
objects that is half a billion pairs. The sieve is what makes it tractable:
```
apogee/perigee filter O(nΒ²) pair rejection on scalars, no propagation
β ~99% rejected
coarse screen 300 s steps over a 24 h window
β
fine TCA refinement only for candidates inside the gate
```
**Naming the ceiling.** At ~31k objects a full screening pass takes 1β2 minutes on one core. At
100k it becomes the bottleneck β which is precisely where a GNN pre-filter earns its place
(published work reports 100,000 objects in 920 ms at 90.3% recall). The architecture for that is
already the one we use elsewhere: **the model proposes, the physics disposes**, and anything
flagged-but-unverified sits at UNRESOLVED rather than being silently trusted.
**Consensus.** Quorum is `βn/2β+1`; nothing assumes four nodes. Forty operators works with the
same protocol and the same TLA+ model, re-checked with a larger `Nodes` constant.
**The demo path has no scaling risk at all.** `SNAPSHOT=1` serves 13.9 MB of frozen real data,
and FR-00 still audits its age.
---
## 4. Failure behaviour
This is the part worth reading twice, because it is the product.
| Failure | What happens |
|---|---|
| Space-Track stale | **FR-00 BLOCKS the whole system.** It audits our own evidence first |
| NOAA down | FR-19/FR-21 β UNEVALUATED β UNRESOLVED. Never "conditions are fine" |
| GOES X-ray down | FR-19 loses its predictive deadline, keeps its current-state check |
| Operator feed gated | FR-11 β UNEVALUATED. We never label screening-grade data operator-grade |
| Model artefact absent | The rule it feeds reports UNEVALUATED. No default, no imputation |
| Model artefact mismatched | **REFUSED at load.** Better no model than one fed the wrong columns |
| A rule evaluator throws | That rule becomes UNEVALUATED, never SATISFIED |
| Sources disagree | UNRESOLVED. We do not average two disagreeing measurements |
| Verifier unreachable | An authored rule is **refused**, not admitted unverified |
| Snapshot goes stale | FR-00 blocks, exactly as with live data |
There is no path in this system where absence becomes permission.
---
## 5. Verification
| What | How | Result |
|---|---|---|
| Engine semantics | `node dev/constraints/engine.test.js` | **65/65**, offline, <1 s |
| Vote determinism | same event Γ 200 polls | **1 distinct outcome** |
| Formal safety | `tlc -config ConstraintGate.cfg` | **148,163 states, 0 violations** |
| The old bug | `tlc -config ConstraintGateBug.cfg` | **2-state counterexample** |
| Propagator | vs ESA dSGP4, 800 propagations | **0.000 m** |
| Classifier | real catalogue rows | ISSβCREWED, STARLINKβAUTOMATED_COLA, DEBβNONMANEUVERABLE |
| Portability | release-gate rulebook | 4/4 states, **0 engine changes** |
---
## 6. Honest limitations
Stated here rather than waiting to be asked.
- **Population is settlement-based** (GeoNames β₯15,000), not gridded. Rural exposure is
undercounted, so our casualty numbers are **optimistic**. GHSL at 100 m is the upgrade.
- **Maritime exposure is not modelled.** FR-24 reports UNEVALUATED.
- **Debris casualty area is taken from published survivability data**, not modelled. Fragment
ablation is a research programme.
- **The classifier's MANEUVERABLE precision is 0.52.** Weak supervision from names; the objects
it exists for are the ones we cannot score.
- **The maneuver detector separates active from inert by only 3.2% vs 2.0%.** A robust z-score
adapts to each object, so a constellation that manoeuvres constantly gets a wide baseline and
its own burns stop looking anomalous. Most useful on objects that manoeuvre rarely.
- **The flare forecast projects the peak of a flare already beginning.** It does not predict
onset from a quiet Sun.
- **Propellant state is operator-declared** and simulated here; no public feed exists. Flagged
`simulated: true` in every payload. Consumption is real; the starting balance is declared.
- **APPROVED is a coordination decision**, not a command to hardware.
|