The horoscope that has to look up

Open the tool

Tropical Western engine · real ephemeris · deterministic rules · eleven languages

A magazine column can survive a retrograde, an eclipse, and a New Moon without changing a sentence. That is a content calendar, not astrology.

Most “daily horoscopes” pick twelve paragraphs in January and rotate the date on the headline. Mercury can station. The Moon can go void of course. A solar eclipse can sit on the same weekday as last year’s copy. The Aries blurb stays put. Nothing in that workflow asked where the planets actually were.

Quizzman Lab built the opposite product: a tropical engine that is forbidden to write until the sky has been queried and a rule bag has been scored. If you came here expecting a lifestyle column, the rest of this page will feel like a spec. That is intentional.

The column that never looks up

Quizzman Zodiac Sign is the opposite contract. Engine qm-zodiacsign V2.0 (dated 2026-07-29) lives at /zodiac-sign. It is tropical Western astrology only: equal 30° signs on the tropical ecliptic. Sidereal Jyotiṣa is a different Lab tool at /vedic. Machine-readable notes sit at /tool/about-zodiac.md.

The pipeline is not optional. Positions come first. A rule bag is scored second. Prose is assembled last, and only from evidence that survived scoring. If Mercury is not combust in that bag, the sentence cannot say it is. Invert the order and you are back to fortune cookies.

That is a narrower promise than “astrology.” It is also a stricter one than most horoscope sites will sign. We do not claim the model is physics. We do claim the sentences are tethered to a snapshot you can, in principle, recompute. The magazine column cannot make that claim, because it never looked up.

Tropical, not sidereal. Western 30° signs. Vedic work is not mixed in.
Two doors. A shared sky scored against a sign, or a birth chart with real geometry.
One sky source. astro.quizzman.com Support API 1.1+, with a local fallback when configured.
0–100 is not fate. Relative expert-system scores, not life-event probabilities.
Eleven composers. vi en zht zh jp kr fr es th pt de — no English dump when a locale is missing.

The claim, cut to size

This is an expert system on a chosen model: tropical houses, classical aspects, dignity, lunar phase, stations, eclipses. It is not Tử Vi and not Bát Tự. Those East Asian systems run on Can Chi stems and branches and True Solar Time — see the calendar engine, plus Tử Vi and Bát Tự if that is the tradition you want. Zodiac Sign does not borrow their clocks, their palaces, or their pillar math.

A reader who grew up with Vietnamese network horoscopes often arrives expecting one blended “tử vi” voice. Lab keeps the Western tropical engine in its own room. Mixing Can Chi day-masters with a tropical Sun sign is how you get a paragraph that sounds wise and points at nothing. If you need both traditions, open both tools. Do not ask this one to impersonate the other.

Career, love, health, and finance scores (study and family when those domains are on) compare days and signs inside the model. They do not estimate the chance that a job offer arrives on Tuesday. Readings describe symbolic tendencies. They are not forecasts, guarantees, or psychic sessions. The Lab’s anti-superstition line still holds: consult, do not surrender judgment. Terms: about-terms-en or about-terms.

  • Astronomy stays upstream of prose. Longitudes, speeds, retrograde flags, phase, eclipses, and ingresses come from the ephemeris layer. Copy cannot invent a sky fact that is not in the condition bag.
  • The position source is public. Primary HTTP to Astro Support. Local @quizzman/qm-astro only when remote fails and fallback is allowed.
  • Rules finish before language starts. Condition Engine and domain fusion run to completion; reading-v2 is not allowed to draft first and justify later.
  • Same inputs, same scores. A given when, birth, and sign reproduce the same evidence (locale seeds may change wording, not the sky).
  • The two doors stay unmixed. Sun-sign mode never pretends it computed a personal Ascendant from a probe chart.

Two doors, one shared sky

Call them both “a horoscope” and you will argue past each other. The product exposes two modes that share an ephemeris and refuse to share a rising sign. The shared sky is an honesty feature, not a shortcut: Aries and Libra on the same Tuesday are looking at the same planets, scored from opposite symbolic doors.

Sun-sign asks only for a date and a tropical sign. All twelve signs read the same Today's Sky: geocentric ecliptic longitudes for ☉☽☿♀♂♃♄, the retrograde list, Moon phase, major sky-to-sky aspects, stations, void of course, solar proximity, eclipses, and ingress. Scoring then projects that snapshot onto the asked sign with symbolic whole-sign houses. The scoring Ascendant is 0° of that sign — signIndex × 30°. There is no birth city, so there is no personal Asc. House 1 in that path means “the asked sign,” not “the degree that was rising in Đà Nẵng at 6:14.”

Natal is the geometry door. A birth date produces Ascendant, Midheaven, twelve houses (whole-sign or Placidus), natal planets, and natal aspects. If time or place is missing, the Lab defaults to noon in Ho Chi Minh City. The UI must label that as a default, not as a known rising sign. A noon chart can still be useful for Sun, Moon-within-a-sign, and slow planets. It cannot honestly name your Ascendant. Today’s transits overlay the natal structure as a separate chip layer; they are not folded into one blended number that pretends the birth wheel and the sky are the same object.

Keep the doors straight when you quote a result. “Leo today” is a sky-to-sign score. “Born 12 March 1991, 14:20, Hà Nội” is a chart. Publishing the first as if it were the second is the exact confusion V2.0 was written to stop.

Door What you type What you actually get
Sun-sign Date + tropical sign Shared Today's Sky, domain scores, NLG — symbolic houses only, no personal Asc
Natal Birth date (noon HCMC if time or place is missing, labelled as default) Asc / MC / houses / aspects + today’s transits as a separate UI layer + domain reading

The fake natal we retired

V2.0 exists because an older habit was dishonest.

Earlier builds treated a mid-season probe chart at latitude 0 as if it were a daily sun-sign natal. That smuggled dummy houses and a dummy Ascendant into a workflow that had never been given a birth. A mid-Leo “natal” at the equator is a convenient fiction: it looks like a wheel, so the UI can draw cusps. It is still a fiction. Version 2.0 deleted the probe. One real snapshot. Twelve projections. Natal remains the full-geometry mode, and it stays separate.

What shipped with that cleanup is not a slogan. It is a short list of product surfaces that now share the same sky contract. If a surface cannot name its sky source, it does not ship.

Today's Sky

One geocentric snapshot: ☉–♄, Rx, Moon phase, major aspects, stations, VOC, solar proximity, eclipses, ingress. The twelve-sign grid all read this same bag.

Sign-relative scoring

Symbolic whole-sign houses. Hits: planet-in-house, ruler dignity and Rx, Moon element, aspects to the ruler and to houses 1 · 7 · 10.

Natal chart UI

Asc / MC chips, SVG wheel, planet × house table, major aspects. Transit chips stay off the natal skeleton.

Day, week, month

The sky does not change because you asked for a week. The NLG assembler does. Synastry is a separate screen, not a third blend of the daily score.

Batch API

POST /v1/sunsign/batch — one sky, up to twelve signs. Consumer of Astro Support 1.1 fields: stations, eclipses, moonPhase, retrograde_period, declination.

Who actually computes the planets

The engine does not “feel” a longitude. It asks Astro for geocentric ecliptic positions, then scores. Julian Day is the time base (UT / TT). Ascendant and Midheaven are spherical-astronomy quantities: they need observer latitude and longitude. A sign name is not enough. A city name without coordinates is not enough either; the Lab geocodes or you send lat / lon yourself.

Support API 1.1 is the reason the rule bag can talk about stations and eclipses without scraping a second vendor. Older 1.0 snapshots could place planets and still leave VOC, retrograde windows, and declination as folklore. V2.0 refuses that gap: if the event is in the prose, it was in the payload.

Layer Source What it is for
Primary https://astro.quizzman.com Zodiac Support API 1.1+ Snapshot / events / range. Fields include stations, eclipses, moonPhase, retrograde_period, declination
Fallback @quizzman/qm-astro Only if remote fails and QM_ASTRO_FALLBACK_LOCAL allows it
Time / geometry Julian Day (UT / TT) Geocentric longitudes; Asc / MC require lat · lon

Engine config: QM_ASTRO_BASE_URL and QM_ASTRO_SERVICE_TOKEN. The consumer contract lives in docs/ASTRO_API_REQUIREMENTS.md inside qm-zodiacsign; Astro documents the same surface as ZODIAC_SUPPORT_API.md. Houses and Ascendant from a mid-season fake birth at latitude 0 are not on this path. That anti-pattern died with V2.0.

Score first, then write

Language is the last mile. If you remember one diagram, remember this one: sky, then rules, then fusion, then sentences. The composer is not a second astrologer. It is a constrained writer standing over a scored bag. Give it combust and it may say combust. Do not give it combust and it must stay silent — even if a prettier paragraph would mention Mercury in the Sun’s heart.

Today's Sky (astro.quizzman.com)
        │
        ▼
Zodiac Rule Engine
        ├── sun-sign → ×12 tropical signs (Asc* = 0° of asked sign)
        └── natal → birth geometry + transit deltas
        │
        ▼
Domain scores → fuseEvidence → NLG reading-v2

Sun-sign path. buildSkySnapshot(when) pulls ☉–♄, Rx, phase, mutual aspects, then events (station, VOC, solar proximity, eclipse, ingress). Each sign scores house hits, ruler state, Moon element, and aspects to the ruler and to houses 1 · 7 · 10. Those hits enter fuseEvidence: base 50, plus and minus caps, conflict damping when both sides are loud, confidenceCap ≈ 0.72. Then generateReading. Sun-sign confidence is intentionally capped below a full natal chart — the model knows it never saw a horizon.

Natal path. Birth → chart (Asc / MC on the sphere) → baseline rule pack → if when is present, a transit window through the Condition Engine → temporal deltas (Moon phase, VOC, eclipse, cazimi / combust, Rx / station, transit–natal aspects) → the UI keeps natal structure and “today’s transits” apart. Missing time or place still defaults to noon, Ho Chi Minh City, and that default stays labelled.

  • Aspects: conjunction, opposition, square, trine, sextile. Orbs are type-specific. Applying versus separating follows relative speed.
  • Fusion: start at 50; cap both directions; damp when two strong stories collide; weight by strength × orb tightness.
  • Temporal deltas: Moon phase, VOC, eclipse, cazimi / combust, Rx / station, and either transit–natal or sky–sign aspects, clamped inside domain bounds.
  • NLG reading-v2: evidence-bound. It may gloss a condition; it may not invent a sky fact. Day, week, and month change the assembler (lede / trend / strength / caution / advice), not the snapshot. A weekly piece that “sees” a station the daily piece did not see is a bug, not a richer vibe.

Synastry is intentionally not a third mode on this pipeline. Two charts, two axes, its own screen and its own POST /v1/synastry. Folding compatibility adjectives into a daily sun-sign blurb is how magazines flatten two people into one paragraph. Lab will not do that here.

What “accuracy” is allowed to mean

People hear “engine” and expect a weather forecast. We do not sell that. Astronomy can be checked against an ephemeris. Interpretation cannot be checked against Tuesday’s inbox. The honest split is below; if a marketing line collapses the four rows into “highly accurate astrology,” it is lying about this product.

Ephemeris and chart geometry. Positions and Asc / MC follow astronomical formulas plus Astro snapshots. Regression lives in qm-zodiacsign; Astro has parity tests. Run npm test in the engine for the current count.
Scores 0–100. Relative expert-system scores from transparent rules. Not P(a life event). A 78 is “this domain is louder than 50 today,” not “78 percent chance.”
Confidence. Soft weight of the evidence that survived fusion. Sun-sign mode is capped below natal on purpose: it never had a birth place.
Fortune language. Symbolic tendencies of the chosen model. Not prophecy, not a guarantee, not a psychic hit.

Internal suites cover conditions, Rx, VOC, cycles, and sun-sign sky contracts, plus the Astro 1.1 consumer. Exact numbers move with the repo. Reproducibility is the test we care about more than eloquence: same when, same sign, same score, same evidence keys.

What ships today

Status is not a roadmap slide. Every row below is Supported in V2.0.

Feature Status
Ephemeris / sky snapshot Supported
Rule engine (conditions + domain fusion) Supported
NLG reading-v2 Supported
Natal chart (Asc, MC, houses, aspects) Supported
Transits Supported
Synastry Supported
Daily sun-sign (Today's Sky × sign) Supported
Week / month cycles Supported
Batch API (up to 12 signs) Supported

Inside the fence, outside the fence

Yes. Tropical Western zodiac. Natal charts. Sun-sign readings from one shared sky. Day / week / month cycles. Transit overlays on natal. Synastry on its own screen. Evidence-bound NLG in eleven languages. Public Lab gateway APIs.

No. Sidereal or Vedic astrology. Fortune prediction or guarantees of future events. Psychic or mediumship readings. Numerology as a core engine. A personal Ascendant claimed without birth place and time.

If you want Jyotiṣa, open /vedic. If you want a rising sign, bring a birth town and a clock. The sun-sign door will not invent either. If you want a lucky number or a spirit-guide tone, this is the wrong Lab tool — Tarot and the East Asian engines have their own pages and their own refusals.

The fence is there so an API consumer cannot launder a sun-sign batch into “twelve personal charts.” Batch means twelve projections of one sky. It does not mean twelve births.

Eleven locales, no English safety net

Codes: vi · en · zht · zh · jp · kr · fr · es · th · pt · de. Each locale has its own NLG composer (love / career / domain segments), twelve-sign labels, and SQL seeds v2. Missing a seed means add a seed. The pipeline no longer falls back to English because a composer is absent. A Korean reading that silently became English was a product bug we retired; a missing locale now fails closed or stays unpublished.

This page is written as English. It is not a filled Vietnamese template with nouns swapped, and it does not follow the Vietnamese heading order. Shared chrome only: hreflang, language bar, header mount, JSON-LD shape. The language bar above is the index of the other ten handmade white pages. The tool UI language picker lives on /zodiac-sign.

Coverage of idiom can still grow. The contract that cannot grow later is the no-fallback rule. If a composer is thin, we write more Vietnamese-quality copy in that language. We do not hide the thinness behind English.

Public endpoints on the Lab gateway

Base URL: https://lab.quizzman.com/api/tool-module/zodiac. The engine process listens on :4060 in its repo; Lab reverse-proxies the paths below.

Method Path Job
GET /health Engine + Astro configuration
POST /v1/sky Today's Sky snapshot
POST /v1/sunsign One sign × that sky
POST /v1/sunsign/batch Up to 12 signs
POST /v1/interpret Natal (or legacy sunSignDate)
POST /v1/chart Natal chart only
POST /v1/synastry Compatibility, own screen / own call

A natal body typically sends ISO date, lat / lon, tzOffsetHours, and houseSystem as whole-sign or Placidus. Batch sun-sign is the cheap way to paint a twelve-cell grid without asking Astro twelve times. /v1/sky is the raw snapshot if you want chips without NLG. /v1/chart is geometry without a reading. /v1/interpret is the natal (or legacy sunSignDate) path that still goes through fusion.

Treat the 0–100 fields in those payloads the same way this page does: relative ranks, not probabilities. If you render them as “chance of success,” you are misquoting the engine. Point your users at about-terms-en.

Questions we keep answering

Is this Vedic or sidereal astrology?

No. Tropical Western only: equal 30° signs measured from the vernal equinox, not from a sidereal fiducial. If you want Jyotiṣa ayanāṃśa, nakṣatra, and whole-sign Vedic practice, that is a different engine at /vedic. This page will not pretend the two zodiacs are “close enough.”

Why doesn’t sun-sign mode give me a rising sign?

A real Ascendant needs birth place and time. Without those, spherical astronomy has nothing to rise. Sun-sign scoring uses symbolic whole-sign houses from 0° of the asked sign — signIndex × 30° — so the rule engine can talk about houses 1 · 7 · 10 without inventing a hometown. It does not claim a personal Asc. If the UI ever labelled that scoring cusp as “your rising sign,” that would be a bug.

Where do the planet positions come from?

Primarily the Zodiac Support API on astro.quizzman.com, version 1.1 and above, including stations, eclipses, moonPhase, retrograde_period, and declination. The engine is configured with QM_ASTRO_BASE_URL and QM_ASTRO_SERVICE_TOKEN. Local @quizzman/qm-astro is the fallback only when remote fails and QM_ASTRO_FALLBACK_LOCAL allows it. Time is Julian Day in UT / TT.

Can I treat a 78 as “78% chance my week goes well”?

No. Scores 0–100 are relative expert-system numbers. They rank domains and days inside the model after fuseEvidence (base 50, plus/minus caps, conflict damping, confidenceCap ≈ 0.72). They are not life-event probabilities. Sun-sign confidence is capped below natal because the rising sign was never observed. See about-terms-en or about-terms.

Are the eleven languages real composers or translated English?

Real composers, twelve-sign labels, and SQL seeds v2 for vi en zht zh jp kr fr es th pt de. There is no English fallback for a missing composer. This page itself was written in English, not poured from the Vietnamese mould. The other ten white pages on the bar above are the same kind of handmade essay, not a token-swap of this file.

How is this different from Tử Vi or Bát Tự?

Tử Vi and Bát Tự are East Asian systems on Can Chi stems and branches and True Solar Time. Their “clock” is the calendar engine’s solar terms and hour pillars, not a tropical ecliptic longitude. This engine is Western tropical astrology: geocentric ☉–♄, classical aspects, symbolic or Placidus houses. Different clock, different houses, different claim. Use about-calendar-en if you need that contrast spelled out in dates.

Elsewhere on the Lab

The tool and this essay are two faces of the same contract. If a sentence on the live page cannot be traced to Today's Sky or to a labelled natal default, file it as a defect, not as “tone.”

sw·362684