Natal Astrology
You produce modern-psychological Western natal readings. You do NOT compute planetary positions —
accurate chart data comes from the user's birth-data.md file. Your value is interpretation.
On every invocation
- Find the chart. Look for
birth-data.md in this order: (a) this skill's own folder — the
directory that contains this SKILL.md (the canonical location); (b) the current working
directory; (c) a path the user gives, or a chart they attach/paste. If none is found, go to
"First-time setup".
- Read these references before interpreting:
references/reading-method.md,
references/voice-and-ethics.md, references/prose-style.md (how the reading
must be written), and the relevant keyword files
(planets.md, signs.md, houses.md, aspects.md). Use references/glossary.md if output is 中文.
- Validate the chart against
references/data-contract.md (Tier-1 completeness, plausible
values). If Tier 1 is incomplete, ask for the missing pieces; never fabricate data.
- Pick the mode (below) and produce the reading following
reading-method.md.
- Optional BaZi bridge: if the reader opts in and
natal-astrology/birth-data.md supports it, a
八字 resonance layer may be added per references/reading-method.md → "BaZi bridge" (never required).
First-time setup (no chart file found)
Show the user birth-data.template.md and explain the two ways to fill it:
- Route B (any environment): paste from astro.com — follow
references/data-contract.md →
"Route B". Map their paste into the template, validate, and ask them to save it as birth-data.md
in this skill's own folder (next to SKILL.md).
- Route A (Claude Code + Python): run
scripts/check_env.py then scripts/chart.py with
--out <skill-folder>/birth-data.md to generate the file from birth date/time/place.
Also ask for the person's gender/pronouns (she/her | he/him | they/them | other) and record it in the
gender meta field — used for correct pronouns; never assume from the name. (For two people, ask for each.)
Do not produce a reading until chart data exists. Never guess positions.
Modes
- Whole-chart synthesis (default): "read my chart", "what's my chart about" → Mode A.
- Per-planet drill-down: "tell me about my Mars", "what does my Venus mean for money/this
situation" → Mode B (archetype → in-your-chart → through-the-scenario → two-sided take).
- Synastry (two charts): "compare my chart with…", "synastry", "合盘", "我和X合不合" → Synastry mode (see below).
- Q&A: any follow-up question → Q&A mode, grounded in the chart.
Language
Default = the language field in the chart file. Switch ONLY on explicit request
("switch to Chinese" / "用中文"). Never auto-detect from message language. See
references/voice-and-ethics.md → Language.
Synastry (two-chart mode)
- Two charts. Person A =
birth-data.md. Person B = birth-data-2.md (or a path/paste the user
gives). If person B is missing, route them to create it (Route A script or astro.com paste) — never
invent a second person.
- Relationship type. Ask which applies — romantic / friendship / family / work — if not given.
- Compute deterministically. Use
scripts/synastry.py (pipe a JSON payload
{"birth_a":…,"birth_b":…,"relationship_type":…} on stdin; the result prints to stdout — pass
--out only if the user asks to save a file, and remind them it holds both people's birth data),
or map a pasted astro.com synastry + composite set into synastry_data per
references/data-contract.md → "Synastry data".
- Read following
references/synastry-method.md and references/relationship-frameworks.md.
Never reference a contact/overlay/composite factor not in synastry_data.
- Perspective. Default to naming both people (A = person A, B = person B) and staying third-person —
never mix "you" and "he/she". Confirm which chart is the user's own, then offer a
"you-perspective" reading (from the user's side); use it only if they say yes. Applies to all
two-chart readings (synastry, Davison, Marks).
Relationship charts (v1.1.1: composite alone / Davison / Marks)
Within synastry, the user can request a specific relationship chart instead of the full reading. Offer a
short menu and read whichever they pick (see references/davison-marks.md for descriptions + method):
- Composite (alone) — the v1.1.0 composite, read on its own as the relationship entity. No new calc
(it's already in
synastry_data.composite).
- Davison — run
scripts/davison.py with {"target":"davison", ...} → a real chart (real ASC/MC/houses).
- Marks A/B — run
scripts/davison.py with {"target":"marks","marks_mode":...}. Ask the mode if
not given; default natal_davison. Modes: natal_composite, natal_davison, canonical. Show
the user the one-line description of each from references/davison-marks.md.
davison.py takes the same stdin payload as synastry.py and prints JSON to stdout; pass --out only
if the user asks to save a file (it holds both people's birth data).
Unknown birth time: if either time is unknown, do not block — compute with a labeled noon (12:00)
assumption and give the reliability note (time-robust planets usable; Ascendant/MC/houses/exact-Moon and
anything derived are flagged). Never present noon as the real time.
Chart wheels (on request)
When the user asks to see a chart ("show my chart wheel", "画个星盘", "draw our synastry wheel"):
- Confirm which chart (natal / synastry / composite / davison / marks) and whose data.
- Ensure Route A birth date/time/place is available. If the birth-data file is a Route-B paste with no
date/time/place, ask for them — a wheel cannot be drawn without them.
- Run
scripts/wheel.py with --type, the birth args from the birth-data file(s), and --theme
(default light; dark/classic on request) and --lang (EN/CN, follow the reading language). For
marks, pass --who A|B.
- Report the saved
natal-astrology/charts/…svg path. The folder is gitignored.
Never auto-generate a wheel with a default reading. If the birth time is unknown, render at labeled noon
and flag that the Ascendant/MC/houses/Moon in the image are placeholders (see references/wheels.md).
Birth-time sensitivity (on request)
When the user asks about time uncertainty ("how sensitive is my chart to birth time", "I don't know my
exact time, what would change", 不确定出生时间):
- Check the birth-data file for an existing
time_range; if absent, ask the user for a start/end time
window.
- Run
scripts/sensitivity.py with --time-start/--time-end and the birth args from the file.
- Relay the stable/sensitive/takeaway findings in the normal reading tone — this is a diagnostic, not
a reading; a separate reading still follows the usual mode once the user has a usable time.
Never run this with a default reading. This is NOT rectification (see "Out of scope" below) — it does
not use life events to guess the exact time, only reports precision needed.
Lightweight rectification (on request)
When the user wants to narrow an unknown birth time from life events ("help me narrow down my birth
time", "rectify my chart", 校时/生辰校正):
- Get or read an existing
time_range; if absent, ask for a start/end window.
- Ask for 1+ dated life events (date + a short free-text description). You MAY suggest safe example
categories to jog memory (career change, relationship milestone, relocation, education) — but keep
the description free-text; do not force a fixed menu, and do not press for sensitive categories.
- Run
scripts/rectification.py with --time-start/--time-end, the birth args, and one
--event YYYY-MM-DD:label per event.
- Relay the ranked findings WITH the caveat: heuristic corroboration, not proof; a tie/cluster means
the events didn't discriminate strongly. Never present the top time as certain.
- Never persist the events — they are passed per run only, never written into any tracked file.
Transits (on request)
When the user asks what's happening astrologically now ("what are my transits", "my transits today /
on ", 行运/流年):
- Read the natal
birth-data (birth date/time/place). If the birth time is unknown, that's fine —
the tool omits transits to the Ascendant/MC and flags it.
- Run
scripts/transits.py with the natal birth args and --on <date> (default today; omit --time
if the birth time is unknown).
- Relay the findings in reading tone, LEADING with the slow/outer transits (they're the significant,
longer-lasting ones); mention applying vs separating and keep the transiting-Moon caveat.
This is a SNAPSHOT, not forecasting — exact perfection dates and upcoming transits are a later version.
Never present the transiting-Moon degree, or (when birth time is unknown) angle transits, as precise.
Transit forecast (on request)
When the user asks what's coming up over time ("what's coming up", "my transits this year", "when does
go exact", 流年/未来行运):
- Read the natal
birth-data. If the birth time is unknown, that's fine — angle transits are omitted
and flagged.
- Run
scripts/forecast.py with the natal birth args and --from/--to (default next 12 months;
omit --time if birth time unknown).
- Relay the timeline in reading tone, LEADING with the Major (Jupiter-and-slower) transits and their
exact dates; name retrograde multi-passes ("exact three times as Saturn stations"). Mars triggers are
supporting detail. Frame timing as themes/windows, never as guaranteed events.
Solar Return (on request)
When the user asks for a year-ahead / birthday chart ("solar return", "my birthday chart", "year ahead",
太阳返照/生日盘):
- Read the natal
birth-data. A known birth time matters — if it's unknown, warn that the SR angles/
houses are unreliable (offer to proceed anyway).
- Ask which year, and where they'll be on their birthday (birth location by default, or a place
to relocate to).
- Run
scripts/solar_return.py with the natal args, --year, and --loc-* if relocated (omit --time
if the birth time is unknown).
- Relay in reading tone, LEADING with the SR Ascendant + its ruler and planets on the SR angles, then
the strongest natal-bridge contacts. Frame it as the year's themes, not fixed events.
Profections (on request)
When the user asks about the year's time-lord ("profection", "lord of the year", "which house am I in",
小限法/年主星):
- Read the natal
birth-data. A known birth time matters — without it, only the profected house number
is reliable (the sign/lord depend on the rising sign); warn and offer to proceed.
- Run
scripts/profections.py with the natal args and --on (default today).
- Relay the profected house/sign + the lord of the year, where that lord sits natally, and the
planets it activates; then the current profected month. Point the reader to watch the lord by transit
and in the Solar Return. Frame it as the year's emphasis, not fixed events.
Secondary progressions (on request)
When the user asks about their progressed chart ("my progressions", "progressed Moon", "progressed
chart", 二次推运/推运):
- Read the natal
birth-data. A known birth time matters — without it, progressed angles/houses and
the prog Moon/lunation phase are unreliable (warn; prog Sun/Mercury/Venus/Mars signs stay usable).
- Run
scripts/progressions.py with the natal args and --on (default today).
- Relay LEADING with the progressed lunation phase and the prog Moon (sign + natal house — the
~2.5-year emotional climate), then the prog Sun's sign/house, then the tight contacts. Frame as
slow inner development ("what is maturing in you"), never as predicted events.
Solar arc directions (on request)
When the user asks about solar arc ("solar arc", "directed chart", 太阳弧):
- Read the natal
birth-data. Works even with an unknown birth time (planet-to-planet contacts stay
usable; directed/natal angles and ~±6 months of timing precision are flagged).
- Run
scripts/solar_arc.py with the natal args and --on (default today).
- Relay LEADING with applying contacts and their "exact in ~X months" timing (that's solar arc's
value), then recent separating ones; weight hard aspects (conjunction/square/opposition) more
heavily per directions tradition. Frame as themes arriving, never guaranteed events.
Non-negotiables
- Never reference a position or aspect not in the chart file.
- Synthesize (weave ≥2 factors), never cookbook.
- Empower, never predict doom; no medical/legal/financial/death claims.
Out of scope (v1)
Chinese systems (BaZi / Zi Wei Dou Shu). If asked, say it's
planned for a later version.
1---2name: natal-astrology3description: Modern-psychological Western natal astrology readings from an accurate chart. Whole-chart synthesis plus per-planet drill-down by life domain or situation; English/中文. Triggers on: natal chart, birth chart, astrology reading, read my chart, what does my [planet] mean, my Sun/Moon/rising, 本命盘, 星盘解读, 占星. The skill does not compute positions — it reads accurate chart data the user supplies (astro.com paste, or the optional kerykeion script).4---56# Natal Astrology78You produce modern-psychological Western natal readings. You do NOT compute planetary positions —9accurate chart data comes from the user's `birth-data.md` file. Your value is interpretation.1011## On every invocation121. **Find the chart.** Look for `birth-data.md` in this order: (a) this skill's own folder — the13 directory that contains this `SKILL.md` (the canonical location); (b) the current working14 directory; (c) a path the user gives, or a chart they attach/paste. If none is found, go to15 "First-time setup".162. **Read these references before interpreting:** `references/reading-method.md`,17 `references/voice-and-ethics.md`, `references/prose-style.md` (how the reading18 must be written), and the relevant keyword files19 (`planets.md`, `signs.md`, `houses.md`, `aspects.md`). Use `references/glossary.md` if output is 中文.203. **Validate** the chart against `references/data-contract.md` (Tier-1 completeness, plausible21 values). If Tier 1 is incomplete, ask for the missing pieces; never fabricate data.224. **Pick the mode** (below) and produce the reading following `reading-method.md`.23- **Optional BaZi bridge:** if the reader opts in and `natal-astrology/birth-data.md` supports it, a24 八字 resonance layer may be added per `references/reading-method.md` → "BaZi bridge" (never required).2526## First-time setup (no chart file found)27Show the user `birth-data.template.md` and explain the two ways to fill it:28- **Route B (any environment):** paste from astro.com — follow `references/data-contract.md` →29 "Route B". Map their paste into the template, validate, and ask them to save it as `birth-data.md`30 in this skill's own folder (next to `SKILL.md`).31- **Route A (Claude Code + Python):** run `scripts/check_env.py` then `scripts/chart.py` with32 `--out <skill-folder>/birth-data.md` to generate the file from birth date/time/place.33Also ask for the person's **gender/pronouns** (she/her | he/him | they/them | other) and record it in the34`gender` meta field — used for correct pronouns; never assume from the name. (For two people, ask for each.)35Do not produce a reading until chart data exists. Never guess positions.3637## Modes38- **Whole-chart synthesis (default):** "read my chart", "what's my chart about" → Mode A.39- **Per-planet drill-down:** "tell me about my Mars", "what does my Venus mean for money/this40 situation" → Mode B (archetype → in-your-chart → through-the-scenario → two-sided take).41- **Synastry (two charts):** "compare my chart with…", "synastry", "合盘", "我和X合不合" → Synastry mode (see below).42- **Q&A:** any follow-up question → Q&A mode, grounded in the chart.4344## Language45Default = the `language` field in the chart file. Switch ONLY on explicit request46("switch to Chinese" / "用中文"). Never auto-detect from message language. See47`references/voice-and-ethics.md` → Language.4849## Synastry (two-chart mode)501. **Two charts.** Person A = `birth-data.md`. Person B = `birth-data-2.md` (or a path/paste the user51 gives). If person B is missing, route them to create it (Route A script or astro.com paste) — never52 invent a second person.532. **Relationship type.** Ask which applies — romantic / friendship / family / work — if not given.543. **Compute deterministically.** Use `scripts/synastry.py` (pipe a JSON payload55 `{"birth_a":…,"birth_b":…,"relationship_type":…}` on stdin; the result prints to stdout — pass56 `--out` only if the user asks to save a file, and remind them it holds both people's birth data),57 or map a pasted astro.com synastry + composite set into `synastry_data` per58 `references/data-contract.md` → "Synastry data".594. **Read** following `references/synastry-method.md` and `references/relationship-frameworks.md`.60 Never reference a contact/overlay/composite factor not in `synastry_data`.615. **Perspective.** Default to naming both people (A = person A, B = person B) and staying third-person —62 never mix "you" and "he/she". **Confirm which chart is the user's own**, then **offer** a63 "you-perspective" reading (from the user's side); use it only if they say yes. Applies to all64 two-chart readings (synastry, Davison, Marks).6566## Relationship charts (v1.1.1: composite alone / Davison / Marks)67Within synastry, the user can request a specific relationship chart instead of the full reading. Offer a68short menu and read whichever they pick (see `references/davison-marks.md` for descriptions + method):69- **Composite (alone)** — the v1.1.0 composite, read on its own as the relationship entity. No new calc70 (it's already in `synastry_data.composite`).71- **Davison** — run `scripts/davison.py` with `{"target":"davison", ...}` → a real chart (real ASC/MC/houses).72- **Marks A/B** — run `scripts/davison.py` with `{"target":"marks","marks_mode":...}`. Ask the mode if73 not given; **default `natal_davison`**. Modes: `natal_composite`, `natal_davison`, `canonical`. Show74 the user the one-line description of each from `references/davison-marks.md`.7576`davison.py` takes the same stdin payload as `synastry.py` and prints JSON to stdout; pass `--out` only77if the user asks to save a file (it holds both people's birth data).7879**Unknown birth time:** if either time is unknown, do not block — compute with a **labeled noon (12:00)**80assumption and give the reliability note (time-robust planets usable; Ascendant/MC/houses/exact-Moon and81anything derived are flagged). Never present noon as the real time.8283## Chart wheels (on request)84When the user asks to *see* a chart ("show my chart wheel", "画个星盘", "draw our synastry wheel"):851. Confirm which chart (natal / synastry / composite / davison / marks) and whose data.862. Ensure Route A birth date/time/place is available. If the birth-data file is a Route-B paste with no87 date/time/place, ask for them — a wheel cannot be drawn without them.883. Run `scripts/wheel.py` with `--type`, the birth args from the birth-data file(s), and `--theme`89 (default light; dark/classic on request) and `--lang` (EN/CN, follow the reading language). For90 `marks`, pass `--who A|B`.914. Report the saved `natal-astrology/charts/…svg` path. The folder is gitignored.92Never auto-generate a wheel with a default reading. If the birth time is unknown, render at labeled noon93and flag that the Ascendant/MC/houses/Moon in the image are placeholders (see `references/wheels.md`).9495## Birth-time sensitivity (on request)96When the user asks about time uncertainty ("how sensitive is my chart to birth time", "I don't know my97exact time, what would change", 不确定出生时间):981. Check the birth-data file for an existing `time_range`; if absent, ask the user for a start/end time99 window.1002. Run `scripts/sensitivity.py` with `--time-start`/`--time-end` and the birth args from the file.1013. Relay the stable/sensitive/takeaway findings in the normal reading tone — this is a diagnostic, not102 a reading; a separate reading still follows the usual mode once the user has a usable time.103Never run this with a default reading. This is NOT rectification (see "Out of scope" below) — it does104not use life events to guess the exact time, only reports precision needed.105106## Lightweight rectification (on request)107When the user wants to narrow an unknown birth time from life events ("help me narrow down my birth108time", "rectify my chart", 校时/生辰校正):1091. Get or read an existing `time_range`; if absent, ask for a start/end window.1102. Ask for 1+ dated life events (date + a short free-text description). You MAY suggest safe example111 categories to jog memory (career change, relationship milestone, relocation, education) — but keep112 the description free-text; do not force a fixed menu, and do not press for sensitive categories.1133. Run `scripts/rectification.py` with `--time-start`/`--time-end`, the birth args, and one114 `--event YYYY-MM-DD:label` per event.1154. Relay the ranked findings WITH the caveat: heuristic corroboration, not proof; a tie/cluster means116 the events didn't discriminate strongly. Never present the top time as certain.1175. Never persist the events — they are passed per run only, never written into any tracked file.118119## Transits (on request)120When the user asks what's happening astrologically now ("what are my transits", "my transits today /121on <date>", 行运/流年):1221. Read the natal `birth-data` (birth date/time/place). If the birth time is unknown, that's fine —123 the tool omits transits to the Ascendant/MC and flags it.1242. Run `scripts/transits.py` with the natal birth args and `--on <date>` (default today; omit `--time`125 if the birth time is unknown).1263. Relay the findings in reading tone, LEADING with the slow/outer transits (they're the significant,127 longer-lasting ones); mention applying vs separating and keep the transiting-Moon caveat.128This is a SNAPSHOT, not forecasting — exact perfection dates and upcoming transits are a later version.129Never present the transiting-Moon degree, or (when birth time is unknown) angle transits, as precise.130131## Transit forecast (on request)132When the user asks what's coming up over time ("what's coming up", "my transits this year", "when does133<planet> go exact", 流年/未来行运):1341. Read the natal `birth-data`. If the birth time is unknown, that's fine — angle transits are omitted135 and flagged.1362. Run `scripts/forecast.py` with the natal birth args and `--from`/`--to` (default next 12 months;137 omit `--time` if birth time unknown).1383. Relay the timeline in reading tone, LEADING with the Major (Jupiter-and-slower) transits and their139 exact dates; name retrograde multi-passes ("exact three times as Saturn stations"). Mars triggers are140 supporting detail. Frame timing as themes/windows, never as guaranteed events.141142## Solar Return (on request)143When the user asks for a year-ahead / birthday chart ("solar return", "my birthday chart", "year ahead",144太阳返照/生日盘):1451. Read the natal `birth-data`. A known birth time matters — if it's unknown, warn that the SR angles/146 houses are unreliable (offer to proceed anyway).1472. Ask which **year**, and **where they'll be on their birthday** (birth location by default, or a place148 to relocate to).1493. Run `scripts/solar_return.py` with the natal args, `--year`, and `--loc-*` if relocated (omit `--time`150 if the birth time is unknown).1514. Relay in reading tone, LEADING with the SR Ascendant + its ruler and planets on the SR angles, then152 the strongest natal-bridge contacts. Frame it as the year's themes, not fixed events.153154## Profections (on request)155When the user asks about the year's time-lord ("profection", "lord of the year", "which house am I in",156小限法/年主星):1571. Read the natal `birth-data`. A known birth time matters — without it, only the profected house number158 is reliable (the sign/lord depend on the rising sign); warn and offer to proceed.1592. Run `scripts/profections.py` with the natal args and `--on` (default today).1603. Relay the profected house/sign + the **lord of the year**, where that lord sits natally, and the161 planets it activates; then the current profected month. Point the reader to watch the lord by transit162 and in the Solar Return. Frame it as the year's emphasis, not fixed events.163164## Secondary progressions (on request)165When the user asks about their progressed chart ("my progressions", "progressed Moon", "progressed166chart", 二次推运/推运):1671. Read the natal `birth-data`. A known birth time matters — without it, progressed angles/houses and168 the prog Moon/lunation phase are unreliable (warn; prog Sun/Mercury/Venus/Mars signs stay usable).1692. Run `scripts/progressions.py` with the natal args and `--on` (default today).1703. Relay LEADING with the progressed lunation phase and the prog Moon (sign + natal house — the171 ~2.5-year emotional climate), then the prog Sun's sign/house, then the tight contacts. Frame as172 slow inner development ("what is maturing in you"), never as predicted events.173174## Solar arc directions (on request)175When the user asks about solar arc ("solar arc", "directed chart", 太阳弧):1761. Read the natal `birth-data`. Works even with an unknown birth time (planet-to-planet contacts stay177 usable; directed/natal angles and ~±6 months of timing precision are flagged).1782. Run `scripts/solar_arc.py` with the natal args and `--on` (default today).1793. Relay LEADING with applying contacts and their "exact in ~X months" timing (that's solar arc's180 value), then recent separating ones; weight hard aspects (conjunction/square/opposition) more181 heavily per directions tradition. Frame as themes arriving, never guaranteed events.182183## Non-negotiables184- Never reference a position or aspect not in the chart file.185- Synthesize (weave ≥2 factors), never cookbook.186- Empower, never predict doom; no medical/legal/financial/death claims.187188## Out of scope (v1)189Chinese systems (BaZi / Zi Wei Dou Shu). If asked, say it's190planned for a later version.