Innaverse Oracle

How the math works

Most AI astrology apps hallucinate placements. We don't. Every line of every reading is grounded in a real computation that you can verify against any professional ephemeris. This page explains what we compute and where the numbers come from.

The ephemeris

Planet positions come from astronomy-engine, the MIT-licensed pure-JavaScript port by Don Cross. Accuracy ±1 arcminute, validated against JPL Horizons. We don't use Swiss Ephemeris because its AGPL license would contaminate this codebase — a choice about licensing, not accuracy. For consumer-grade astrology, ±1 arcminute is well beyond what matters in interpretation.

Verify: pick any datetime. Compare our Sun, Moon, and inner planet longitudes against TimePassages, astro.com, or JPL Horizons. You should see agreement to within a few arcminutes. If we're off by more than that, email us — it's a bug worth fixing.

Houses

Default is Placidus via circular-natal-horoscope-js (MIT). Users can toggle Whole Sign or Koch on the birth-profile page. For solar charts (birth time unknown), we ship an honest whole-sign fallback starting from the Sun's sign — we don't fake an ascendant when we don't have one.

Aspects

Natal aspects use traditional orbs (conjunction/opposition 8°, trine/square 7°, sextile 5°, quincunx 3°, minors 2°). Transit aspects use tighter orbs (1-3°) because transiting-planet-to-natal-planet significance falls off much faster with distance. Applying/separating is a simple speed-comparison heuristic, not a rigorous future-aspect search — good enough for narrative grounding.

Events — moon phases, retrogrades, ingresses, eclipses

All detected by walking the ephemeris forward in time and looking for sign changes (ingresses), speed-sign changes (stations for retrograde start/end), and eclipses (via astronomy-engine's built-in searchers). Station and ingress times refined to ~15-second resolution via binary narrowing inside each 24h detection window.

The grounding contract

Every LLM call carries a system-prompt rule we call the Grounding Contract: never invent a placement that isn't in the chart JSON provided. If a reading cites "your Moon at 14° Cancer in the 3rd house," that number is in the data passed to the model. If the model tries to cite something we didn't compute, the prompt tells it to refuse.

We also tell the model to stay silent on axes that don't line up. If your Personal Year 5 has nothing to do with today's Saturn square, the reading won't force a connection just to sound wise. That's the anti-Barnum rule — generic-feeling readings are the most common failure mode of AI divination, and we reject them at the prompt level.

Cards, runes, I-Ching, geomancy — determinism

Every draw is seeded with a hash of (your user id + question + today's date). Two draws with the same question on the same day return the same cards. Rerolling is not a feature — you're asking the oracle, not shopping for an answer. The question becomes part of the asking.

What we refuse to fake

  • Birth-time-unknown rising signs
  • Reversed meanings for runes that historically cannot reverse (Hagalaz, Isa, Jera, Eihwaz, Gebo, Sowilo, Ingwaz, Dagaz)
  • Compatibility percentages as verdict — we show you the actual cross-aspects and their orbs
  • Deep Human Design content that Jovian Archive owns (we compute type, authority, profile; we don't paraphrase proprietary per-gate text)
  • Ifá readings without the disclaimer that this is educational, not a substitute for a Babalawo
  • "You will meet your soulmate" — forbidden by both Apple and Google policies, and against the spirit of honest divination anyway

The RAG layer

Readings can optionally pull grounding passages from our ancestral knowledge base — public-domain classical texts (Ptolemy, Lilly, Budge, Massey, Ellis, Rattray, Waite, Legge, Bellows) embedded into Qdrant. We don't ingest copyrighted modern astrology books; we don't scrape horoscope.com; we don't use the Rodden chart database. The traditions page lists every source we draw from.

Where the AI enters

A frontier large language model writes the prose. It sees the chart JSON, the computed transits, the ancestral overlay, the numerology, the drawn cards — whichever of those are relevant to the reading. It does not compute any of them; it narrates what we computed. If the AI layer is offline, you'd still see the data. The voice is the layer on top.

Open question

Find an error, tell us. We publish corrections. We take trust as the asset it is.
Contact: oracle@innaverse.ca