ORRERY

Published tables

Almanac

The Nautical Almanac is useful because it is complete and dated. A table with a hole in it is worse than no table, because you find the hole at sea. Every parameter this design has is here with its bound, and the ones without a value say unset rather than being left off the page.

Lexicon

Seven names, each of which has to earn it

If the astronomy does not describe what the contract does, the name is wrong.

TermWhat it isWhy the word
EphemerisERC-20 receiptAn ephemeris is not a picture of the sky. It is a table of positions computed from the elements, and for four centuries it is what ships were navigated by — the position you can carry when you cannot carry the body. A share price is the same object: a number worked out from the state of a position that never leaves the pool.
Orbitv4-Hook poolAn orbit is the one arrangement that maintains itself: no thrust, no attention, and it is still there next year. A concentrated range is the opposite by default — it falls out of the price and stops earning — so the hook exists to make the range behave the way the name claims.
TransitPrivate intent routerIn 1761 and 1769 the transit of Venus was timed from dozens of stations scattered across the planet. No single observation could determine the scale of the solar system, and no single observation gave it away. The answer existed only in the batch. That is the property this router is trying to buy.
SiderealTokenised equities deskA solar day is measured against the Sun; a sidereal day is measured against the stars, and they differ by four minutes that compound into a whole day a year. Equities keep a solar clock — six and a half hours, five days a week, closed for holidays. A chain keeps the other one. Every hard problem on this desk is that difference.
ParallaxYield decompositionA star's distance is unmeasurable from one place and trivial from two. One number for "yield" is the same failure: it hides which part is trading fees, which part is emissions that dilute, and which part is the loss a rebalanced range realises against just holding.
DetentEmergency stopA detent is a mechanical catch that stops a gear train turning. It does not disassemble the instrument and it does not lock the case. Redemptions stay open; nothing else moves.
AlmanacPublished parametersThe Nautical Almanac is useful because it is complete and dated — a table with a hole in it is worse than no table, because you find the hole at sea. Every parameter this protocol has is published with its bound, and the ones that are not yet set say `unset` rather than being left off the page.

Parameters

Seventeen values, and fifteen of them are not set

Every governance-adjustable value has a hard range enforced in the contract, so a compromised vote has a floor and a ceiling rather than a blank field. The two that do carry a value are not choices — one is the only implementation there is, and one is set by somebody else. Five rows are marked open problem: those are not awaiting a vote, they are awaiting a design.

Orbit (the pool)

ParameterGovernsValueBoundSet by
buffer_ratio Share of vault value held idle for redemption unset 1%–20% governance
range_width Half-width of the managed range, in ticks unset per pair governance
rebalance_band Price drift that triggers a range shift unset ≥ range_width ÷ 4 governance
rebalance_cooldown Minimum blocks between shifts unset ≥ 1 block governance

Ephemeris (the receipt)

ParameterGovernsValueBoundSet by
nav_source Price used to mark the position pool spot no alternative implemented fixed
nav_guard Deviation band or TWAP window on NAV unset not designed open problem
performance_fee Share of harvested trading fees unset 0%–20% governance
max_lock Longest commitment a holder may take unset set once at launch launch constant
max_boost Emission multiplier at max lock unset 1×–4× governance

Transit (the router)

ParameterGovernsValueBoundSet by
execution_fee Charged on a settled intent unset 0–30 bps governance
solver_spread The solver’s take on a fill not ours unbounded set by the solver
batch_interval How long an intent waits for its batch unset not designed open problem
min_solvers Solvers required for a batch to settle unset must exceed 1 open problem

Emissions

ParameterGovernsValueBoundSet by
epoch_length The period every rate below is quoted per unset not designed open problem
tail_rate r Perpetual emission, as a share of supply unset 1–100 bps per epoch governance
cap_multiple Emission cap as a multiple of prior-epoch fees unset ≥ 1× governance
genesis_window Exemption from the cap for a new Orbit unset not designed open problem

The most consequential empty cell

epoch_length. A tail emission bounded at 1–100 basis points per epoch spans roughly 0.5% to 67% annual inflation depending only on how long an epoch is. Until it is set, every rate quoted beside it is uninterpretable — which is why it is at the top of the emissions group rather than buried in it.

Fees

Four flows, and the largest one is not ours to set

Two of the four carry no rate yet and a third is not ours to set at all — the solver's spread on a fill is explicitly outside protocol control, which makes it the largest and least visible cost a trader pays here and the one nobody can quote in advance. It belongs in the fee table rather than in a footnote. Only the trading fee has a number, and the pool tier sets it.

FeeCharged onPaid byGoes toRateBound
Performance fee
Taken before the NAV credit, so it moves price rather than supply.
Harvested trading feesEphemeris holdersTreasury and locked holders unset 0%–20%
Trading fee
Stays with liquidity. It is the only flow that does not leave.
Swaps against the OrbitSwappersThe position pool tier set by the pool
Execution fee
The split between treasury and holders is also unset.
A settled intentThe traderTreasury and locked holders unset 0–30 bps
Solver spread
The largest cost a trader pays here, and the one the protocol neither sets, bounds, nor can disclose in advance.
The fillThe traderThe winning solver not protocol-set none

Open problems

Seven things this design does not solve

Each one follows from a rule written above rather than from a hypothetical. A design document that contains no such list either has no such problems or has not looked.

The emission cap deadlocks a new Orbit at zero

unsolved

Emissions to a pool are capped at its prior epoch’s fee revenue times a multiple. A pool that has just launched earned nothing last epoch, so its cap is zero, so it receives no emissions, so it attracts no liquidity, so it earns nothing. The cap is the right idea — inflation should follow activity — and as written it forbids the first epoch of every pool it protects. A genesis exemption fixes it and reopens the hole the cap was closing.

The same cap pays for fake volume

unsolved

The cap’s base is fee revenue, and fee revenue is manufacturable by trading against yourself. Spending one unit of fees unlocks cap_multiple units of emission eligibility, so for any multiple above 1× it is directly profitable to wash-trade your own pool up to its cap. A guardrail against paying for activity that does not exist becomes a subsidy for inventing it.

A bounded emission rate is not a bounded supply

stated

A perpetual tail that emits r × supply each epoch gives supply × (1+r) per epoch — geometric growth with no maximum. The tail bounds the rate, not the total, and describing it as a supply cap is arithmetically false. Orrery publishes the rate and does not claim a cap.

A rate is meaningless without its period

unset

A tail bounded at 1–100 bps per epoch spans 0.5% to 67% annual inflation depending only on how long an epoch is. Epoch length is the single most consequential number in the emission design and it is unset, so every rate quoted beside it is currently uninterpretable. It is at the top of the Almanac for that reason.

A locked position can be sold with its boost intact

unsolved

Locking removes the right to redeem and not the right to transfer, and the boost is keyed to the term originally chosen rather than the term remaining. Both rules are deliberate and together they create a secondary market in remaining lock time, with no recalculation for the buyer and no mechanism describing how it should clear. It follows directly from two rules written down above and neither of them anticipates it.

The privacy argument rests on a solver set that does not exist

unsolved

Everything Transit claims depends on solvers competing. There is no registration, no bond, no slashing condition, no minimum count and no anti-collusion rule. With a single solver, "best price wins" is a tautology; with a colluding few it is worse than the public mempool, because the collusion cannot be observed.

Provenance · the hero

Where the planets came from, and how far off they are

The instrument on the front page is not an animation of circles. It solves Kepler's equation for eight bodies from JPL's published elements, at the instant printed beneath it.

The elements

Table 1 of Keplerian Elements for Approximate Positions of the Major Planets, E. M. Standish, Solar System Dynamics Group, JPL/Caltech. Fetched by tools/fetch-elements.mjs rather than typed: it is 96 numbers to eight decimal places, and one transposed digit in a rate term produces a planet a degree a year out of place on a canvas that still looks entirely correct.

The fetcher refuses to write the file unless every row satisfies Kepler's third law to within 2% — the mean-longitude rate must scale as a−3/2 — which is what catches a rate line read off the wrong planet.

Valid 1800–2050. ssd.jpl.nasa.gov/planets/approx_pos.html

The measurement

10.3′worst disagreement with JPL Horizons
Comparisons64
Median error0.39′
Worst casesaturn, 1850-06-15
Worst radius error0.128%
Kepler solver residual9.9e-13
ReferenceJPL Horizons (DE441)

tools/verify-ephemeris.mjs checks js/kepler.js — the module the canvas actually runs, not a second implementation — against the numerically-integrated ephemeris at 8 dates across the validity window. The Moon is about 31′ across, so the worst case is a third of a Moon and the typical case an eightieth.

The one distortion, and every orrery makes it

Neptune is 78 times further from the Sun than Mercury. On a canvas wide enough to show Neptune, Mercury's whole orbit is four pixels across — which is why a Grand Orrery in a case is not to scale either. Radii here are compressed by blending a power law with equal spacing. Angles are not touched. Each orbit is scaled uniformly about the Sun, which leaves an ellipse an ellipse with the Sun still at its focus, so eccentricity and the direction of perihelion survive intact — Mercury's orbit really is visibly off-centre. The figure above is about the angles, because the angles are the part that is real.

Provenance · the palette

Five stars, three colours

Every accent on this site is the colour of a real star: Planck's law at its published effective temperature, integrated against the CIE 1931 colour matching functions, converted to sRGB. node tools/palette.mjs reproduces every hex, and checks its own CIE chain against four published Planckian-locus chromaticities first — worst deviation 0.0011.

StarClassTeffColourRole
Rigel
the cold end of hot
B8 Ia 12,100 K #A0B7FB primary
Vega
the photometric zero point
A0 V 9,602 K #A7B7EA same as Rigel
Sun
IAU nominal
G2 V 5,772 K #C8B4AA neutral
Arcturus
brightest in the northern sky
K1.5 III 4,286 K #E4AF74 same as Antares
Antares
rival of Mars
M1.5 Iab 3,660 K #F3A94F same as Arcturus

Derived

The hue of every accent, and the ratios between their chromas. Those come out of the physics and are not adjustable.

Chosen

One global chroma gain, and every lightness. A blackbody spectrum fixes a chromaticity, not a luminance — Planck's law has no opinion about how bright a swatch should be on a web page. Each accent keeps its hue and is lifted to the smallest lightness clearing 4.5:1 against the lightest surface text sits on.

And the reason there are two accents rather than five

The Planckian locus is a curve with one parameter. Walking it from 30,000 K down to 1,600 K visits blue near 270° and amber near 50–69°, with an abrupt crossing at the white point where chroma passes through a minimum and the hue flips. Rigel and Vega come out 1.9° apart. Arcturus and Antares come out 0.1° apart. So five stars give three distinguishable swatches, not five — and the middle one, the Sun at 5,772 K, sits so close to the crossing that its chroma is 0.018 and it reads as a warm grey rather than as an accent. Two of the five do real work.

An earlier build of this page said the five collapsed to a pair rather than a trio. That is the punchier version and it is not the true one — it quietly counted the near-neutral swatch as not a colour — and the build's own count check refused it. A number that flatters the argument is the one worth checking.