qwen3-coder-30b-a3b-space (SSAO)

A fine-tune of Qwen3-Coder-30B-A3B (8-bit MLX) that writes valid RDF Turtle using the Space Situational Awareness Ontology (SSAO) for space objects, and that judges proposed catalogue-to-ontology alignments with instance evidence.

To our knowledge this is the first openly published language model targeting a space-domain ontology. Built by Tesseract Academy.

Why this exists

The base model already knows a great deal about orbits. What it cannot do is use a specific ontology's actual vocabulary: asked for SSAO Turtle, it invents plausible camelCase terms (ssao:SpaceObject, ssao:launchDate, ssao:OrbitalElements) that do not exist in SSAO, at a measured rate of 13.8 invented terms per output, and it declares no prefixes, so nothing it emits parses. Those outputs look right and are unusable.

This matters beyond tidiness. The companion study (full write-up, repository) measured that SSAO declares exactly one disjointness axiom, so 351 of its 353 classes can never participate in a provable contradiction: a reasoner will accept almost any wrong classification silently. A model that invents terms in a domain whose ontology cannot reject them is a quiet corruption engine. Hence a model trained to stay inside the real vocabulary, and an evaluation that counts hallucinated terms as the headline metric.

Results (held-out test set, n=99, greedy decoding)

Metric Base This model
Turtle parse rate 0.0% 98.6%
Term conformance (every ssao: term real) 0.0% 97.2%
Hallucinated terms per output 13.81 0.06
Namespace fidelity 33.3% 100%
Primary class accuracy 36.1% 100%
Orbit regime accuracy 0.0% 80.6%
Term lookup / alignment judgement / regime naming 0.0% 73.9%
Refusal rate on unanswerable questions 75% 100%

Validator and metrics: scripts/spaceval.py. Term conformance and the hallucination count are computed against the authoritative term set extracted from the ontology itself (554 terms), so they are membership facts rather than judgements.

What it does

Five task families, all learned from data derived from a real catalogue:

  1. Catalogue record to Turtle. Prose or field-list description of a space object, in; SSAO-typed Turtle with correct prefixes, out.
  2. Term lookup. "Which SSAO class denotes a spent launch stage?" -> ssao:Rocket_Body_Debris, with SSAO's own definition.
  3. Alignment judgement. A proposed correspondence between a catalogue vocabulary and SSAO, in; accept or refuse with the argument and the instance-level witness count, out. We are not aware of another public dataset or model covering this task.
  4. Orbit regime classification from orbital elements, with the threshold cited.
  5. Refusal on questions the catalogue cannot answer (fragmentation versus mission-related debris, manoeuvre intent, mass from a size class).

Usage

This repository ships the LoRA adapter (282 MB) rather than a 30 GB fused copy of the base model: it is the same weights, a much smaller download, and it keeps the base model's own updates available to you. Load the base with the adapter applied:

from mlx_lm import load, generate

model, tokenizer = load(
    "mlx-community/Qwen3-Coder-30B-A3B-Instruct-8bit",
    adapter_path="adapters",   # from this repo
)
messages = [
    {"role": "system", "content":
     "You are a space-domain knowledge engineer. You express facts about space "
     "objects as RDF Turtle using the Space Situational Awareness Ontology "
     "(SSAO), namespace <https://purl.org/space-ontology/> bound to prefix "
     "ssao:. You use only terms that exist in SSAO. When the catalogue cannot "
     "determine something, you say so instead of guessing."},
    {"role": "user", "content":
     'Express this catalogue record as SSAO Turtle.\n\nCatalogue entry 25544: '
     '"ISS (ZARYA)", a payload; registered to ISS; launched 1998-11-20; status '
     'operational; elements: period 92.8, inclination 51.6, apogee 420, perigee 412.'},
]
prompt = tokenizer.apply_chat_template(messages, add_generation_prompt=True, tokenize=False)
print(generate(model, tokenizer, prompt=prompt, max_tokens=400))

To bake the adapter into a standalone model (dequantise, merge and requantise per layer), one command:

python -m mlx_lm fuse \
  --model mlx-community/Qwen3-Coder-30B-A3B-Instruct-8bit \
  --adapter-path adapters --save-path fused_model

Training

QLoRA over the 8-bit MLX base with mlx_lm.lora: 700 iterations, batch size 2, sequence length 1400, learning rate 1e-4, 8 layers, on an M3 Max. Validation loss 2.496 to 0.141. Roughly 15 minutes of training; the data took considerably longer than the fit.

Data

fabsssss/ssao-space-instruct: 1,245 examples (1,072 train / 74 validation / 99 test), built correct-by-construction rather than authored. Every Turtle target is generated from a real CelesTrak SATCAT record (snapshot 2026-07-29, hash-pinned) by applying a published, argued SATCAT-to-SSAO alignment, so the ontology terms are correct by derivation. A fail-closed vocabulary gate refuses to write the dataset if any ssao: term in any target is absent from the ontology.

That gate exists because it caught us: the first version of the builder invented hasOrbit and hasInclination, which SSAO does not define (it uses has_Orbit, has_Orbital_Inclination). Without the gate we would have trained the model to hallucinate fluently, which is precisely the failure the project studies.

Limitations, stated plainly

  • The domain's canonical error survives at a low rate. Of 14 regime errors, 3 are geostationary orbits labelled geosynchronous. Note the direction: every geostationary orbit is geosynchronous, so the model loses precision rather than asserting a falsehood. Two errors (highly elliptical labelled medium Earth orbit) are genuine mistakes.
  • Residual hallucinations are near-misses, not inventions from nothing: Has_COSPAR_number (capitalisation), has_Country_of_Orbital_Inclination (two real property names spliced), has_Resident_Space_Object (a class used as a property), Extended_Mission (plausible, absent). One occurrence each across 72 outputs. Downstream systems should still run a closed-world vocabulary check; this model reduces the error rate by roughly 250x, it does not eliminate it.
  • It will volunteer fields you did not give it. In a smoke test on the ISS with no COSPAR number in the prompt, the model emitted ssao:has_COSPAR_number "1998-067A", which is correct, recalled from pretraining. For a famous object that is helpful; for an obscure one the same behaviour can fabricate a designator that the vocabulary gate cannot catch, because the term is real and only the value is invented. Validate literal values against your own catalogue, not just the ontology terms.
  • Property coverage is narrow. Training used the handful of SSAO properties the catalogue can populate honestly (COSPAR number, country of origin, launch date, orbit, inclination, period, perigee, apogee). SSAO defines 150 properties; most are untrained.
  • One catalogue, one ontology. No claim transfers to DISCOS, to other space ontologies, or to text-heavy sources such as launch announcements.
  • The alignment-judgement task is trained on our own argued crosswalk. It reproduces that curation, including its confidences. It is a reviewable position, not ground truth.
  • Space operations are safety-relevant. Nothing here is validated for operational use; treat output as a draft for human and machine checking.

Attribution

  • SATCAT data courtesy of CelesTrak (T.S. Kelso).
  • The Space Situational Awareness Ontology is by Robert J. Rovetto; the copy used is the one vendored by the NASA mission-viz project. Rovetto's satellite-database work proposed SSAO as a reference ontology for catalogue sources; this model is one execution of that idea.
  • Base model: Qwen3-Coder-30B-A3B (Apache 2.0), 8-bit MLX conversion by mlx-community.

Citation

@misc{rovai2026ssaollm,
  author = {Rovai, Fabio},
  title  = {qwen3-coder-30b-a3b-space: a language model for the Space
            Situational Awareness Ontology},
  year   = {2026},
  publisher = {Hugging Face},
  howpublished = {\url{https://huggingface.co/fabsssss/qwen3-coder-30b-a3b-space}}
}
Downloads last month

-

Downloads are not tracked for this model. How to track
MLX
Hardware compatibility
Log In to add your hardware

Quantized

Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for fabsssss/qwen3-coder-30b-a3b-space

Dataset used to train fabsssss/qwen3-coder-30b-a3b-space