Famulus Astronomica
astra/1 — a language for historical astronomical models and the geometrical reasoning about them
A historical astronomical model is a geometrical construction with a kinematic variable: a few lengths and angles, one or two circles, a point that moves, and an observer who measures directions. Texts about such models do four different things at once: they describe a geometry, give it numbers, show it in one position, and reason about it. astra/1 writes each of the four as plain text of its own kind.
| model | the pure geometry: symbols, construction, observables; no values | Model · values · state |
| parametrisation | values for a model’s parameters, each with its source; one model has many | Model · values · state |
| superposition | several models in one plane, their inputs identified | Superposition |
| derivation | geometrical reasoning: givens, auxiliary constructions, steps justified by named rules, a conclusion | Derivations |
| figure | a depiction: which values, which state, which labels | Outputs |
The first texts describe Ptolemy’s solar model in its eccentric and its epicyclic form, as Noel Swerdlow sets it out in The Renaissance of Astronomy (2026), chapter 1. The model is Ptolemy’s; the text whose use of the model is analysed is Swerdlow’s; the astra texts are by Gerd Graßhoff. Every astra text says all three (attributed, witness, author).
Sixty seconds
model solar-eccentric "Ptolemy's solar model, eccentric form"
attributed "Ptolemy"
witness fr:kepler-sec/Swerdlow2026/0049/p04 "the construction, p. 19"
author "Gerd Graßhoff"
frame geocentric
param R : length "radius of the eccentric" in (1, 1000)
param e : length "eccentricity, the distance OE" in (0, R / 2)
param lamA : angle "longitude of the apogee"
variable kappa_bar : angle "mean anomaly about E, counted from the apogee"
O = observer "earth"
E = O + polar(e, lamA) "centre of the eccentric"
ecc = circle(E, R) "the eccentric"
S = E + polar(R, lamA + kappa_bar) "sun"
body sun at S
observe lam = direction(O, S) "true longitude"
No number stands in it. The numbers are a second text, and there can be several:
parametrisation solar-eccentric.ptolemy of solar-eccentric "Ptolemy's values"
attributed "Ptolemy"
R = 60 source fr:kepler-sec/Swerdlow2026/0052/p05
e = 2;30 source fr:kepler-sec/Swerdlow2026/0052/p05
lamA = 65;30° source fr:kepler-sec/Swerdlow2026/0052/p05
A state is a value of the kinematic variable, kappa_bar = 41°. Model, values and state together give a configuration; a figure draws one, an animation runs through them.
Reasoning comes after the construction, as an operation of its own:
derivation solar-equivalence-equal-radii in solar-eccentric-epicyclic "…"
given h1: equal(Epi.R', Ecc.R)
given h2: equal(Epi.r, Ecc.e)
derive d2: parallel(line(Ecc.E, Ecc.S), line(O, Epi.C)) from d1 by Elements I.28
derive d6: parallel(line(O, Ecc.E), line(Epi.C, Ecc.S)) from d2, d5 by Elements I.33
…
conclude equivalent(Ecc, Epi, position) from d12
Each step is checked four ways: are its premises there, is it true, is it an instance of the rule it names, and does the conclusion rest on what is cited (Derivations).
What follows from the texts
- a check per kind of text (Checking);
- a specification sheet, a still figure (SVG, Typst) and a browser animation (Outputs, Runtime);
- a reference address for every text and each of its parts,
fr:astra/<text>/<object>(References); - a comparison of two models or two parametrisations (Comparison);
- a deep reading of a source’s pages: every assertion quoted, formalised, recomputed (Deep reading).
Where things are
| workspace | ~/ai-mac-studio/development/famulus-astronomica/ |
| CLI | uv run --no-sync famulus-astra check \| derive \| sheet \| svg \| animate \| typst \| diff \| render-check \| gallery \| fr \| reading \| docs |
| language | spec/astra-1.md (normative), spec/ops.yaml (op-set), spec/rules.yaml (rules of derivation), vectors spec/*-vectors.json |
| texts | examples/solar/*.astra |
| runtime | web/astra-runtime/astra-runtime.js (dependency-free ES module) |
| outputs | build/<id>/ — source, check, sheet, and for figures SVG, animation, bundle, Typst snippet |
| dossier | ~/ai-mac-studio/dossiers/famulus-astronomica.md |