Live demo (no install): https://youngjun-choi-kr.github.io/cric/ · Film (2:31): https://youtu.be/0iWYRakiegE · Code: https://github.com/youngjun-choi-kr/cric
Inspiration
Nearly 19,000 tracked objects are in orbit. Large constellations have flight dynamics departments and automated collision avoidance. A university cubesat team or a small startup has none of that: its constraints live in chat threads, range notices and spreadsheets (often in more than one language), its orbit data is the public catalog, and the person deciding is usually a student or a single engineer. The hard part is rarely the orbit maths. It is judgement: will this rocket really get us there, which launch minute is safe, is this close approach real, can the other satellite move, and who must decide.
What it does
CRIC rehearses the whole mission with the team, and every decision comes with its evidence, the checks it passed, and a person's sign-off.
- The ride to orbit. Pick a published launcher, drop in a spec sheet (Nemotron 3.5 Super VL reads it and labels every number read, derived, assumed or missing), or type a small rocket's numbers. A 3-DOF ascent flies it to the orbit described in one sentence (Nemotron 3 Nano reads the sentence; code does the orbit maths). If it falls short, CRIC searches for fixes and test-flies every one before suggesting it; Nemotron 3 Super explains why. 500 dispersed flights with the forecast winds aloft show where spent stages land, checked against land.
- When and where. A week of weather for every site that can reach the orbit, the hours that give a camera satellite the right local time, and every liftoff minute screened against the catalog (distance and collision probability). The team's notes, in any language, become rules the code can check; a rule whose quote is not in the notes is dropped, and a dropped restriction holds the decision for a person. Three launch-team roles (Nemotron 3 Super) poll GO / NO-GO and Nemotron 3 Ultra, as mission director, picks a minute; code refuses any pick a check or a vote vetoed.
- Operate. The satellite joins the catalog. CRIC shows passes over home and screens 72 h ahead. A close approach goes through the same pipeline as our operations console: collision probability, verified burn options, cited dossiers for both objects (Tavily + Nemotron, every fact with a URL and a quote our code checks), three Nemotron 3 Super votes, a validator, and the operator policy in code, which must agree before anything spends propellant. Mission control lets the team command its own burn: CRIC re-screens the new orbit against every tracked object, counts propellant, checks the 5-year deorbit rule, and offers a safer time if the burn is risky. Every approval goes into a hash-chained log. Nothing is ever sent to a spacecraft.
How we built it
- NVIDIA Nemotron on Nebius Token Factory, each model where its size fits: Nano for fast parsing, Super for reading notes into quoted constraints, explanations and votes, Ultra for the launch call and the briefs a person reads, Super VL for spec sheets and shared screenshots. All calls use structured output (JSON schema).
- Physics in code, never in the model: SGP4 on CelesTrak data (15,912 active satellites + 2,894 public debris objects), collision probability by integrating the combined covariance (checked against NASA CARA test cases), a 3-DOF ascent with US Standard Atmosphere 1976 and differential-evolution guidance, MSIS thermosphere density for drag and lifetime, Natural Earth land for impact checks.
- Tavily Search + Extract for dossiers on the other satellite, with web text treated as data (injection filter in seven languages, tiered sources).
- Three.js globe and close-up launch stage driven by the simulation; a hosted replay so judges can try it with no server; ElevenLabs for the film's narration.
Results (all runs published in the repository)
| Approach (126 runs per arm, 4 scenario sets) | Right | Policy-violating burns | Unneeded escalations | Model $ / decision |
|---|---|---|---|---|
| Coded policy only | 81% | 8 (of 42) | 0% | 0 |
| Super, one call | 83% | 2 | 2% | 0.0025 |
| Super reads notes, code decides | 98% | 2 | 1% | 0.0005 |
| CRIC pipeline (votes and code must agree) | 89% | 0 | 4% | 0.0084 |
The simplest accurate arm is cheaper and more accurate; the pipeline is the only one with no policy-violating burn in our 138 test runs, at about 17x the model cost and a few more escalations to a person. A wrong burn spends propellant and can create a new close approach; an extra escalation costs a person a few minutes, so we chose the pipeline. An ablation showed the agreement with code, not the voting, is what blocks bad burns (one decision call: 0 violating burns too, 36/42 vs 39/42 scenarios). These are our scenarios, not a safety guarantee.
Other checks: screening agrees with CelesTrak SOCRATES on 99.7% of encounters; Pc matches NASA CARA test values; the ascent model is −17% to +4% of published launcher capacities; held-out launch notes in four languages 24/24; prompt injection changed 0/24 verdicts with our defences, 15/24 without.
Challenges we ran into
- Our first design let the model search burn parameters with tools: it found a valid burn but used 45% more delta-v than exhaustive search. Numeric search moved to the optimiser; the model chooses among options physics has already checked.
- A reading error becomes an unchecked action: the cheapest arm burned after a ground-contact cut-off in 2 of 27 held-out runs. That is why a second, independent route (policy in code) must agree.
- An outside review found real gaps late: a check that did not run counted as a pass, a burn could win without a majority on the same burn, the dispersion was not in the final launch call. We fixed each with a regression test.
- Nemotron 3.5 Super VL rated drag risk "moderate" on all 20 archived Sun images (storm eves and quiet days alike): no forecasting signal, so we moved it to reading the screenshots teams share.
Accomplishments that we're proud of
An end-to-end mission rehearsal where every number on screen comes from a computation or a cited source, every model output is checked by code, and the negatives are published next to the positives.
What we learned
Models earn their place reading free text (notes in any language, spec sheets, chats); physics and policy belong in code; and an honest baseline table is more persuasive than a single headline number.
What's next for CRIC
Trying it with a real small-satellite team, precise ephemerides (CDMs) instead of public TLEs, and running the dispersion and screening as Nebius Serverless Jobs.
Log in or sign up for Devpost to join the conversation.