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.