natal-chart
Compute one person's natal chart from an exact birth date, minute, and place — planet positions with sign, house, dignity and retrograde state, the four angles, intra-chart aspects, sect, and the classical lots, written as canonical JSON plus data-only Markdown. Use for 本命盘, 星盘, 出生星图, natal chart, birth chart, my rising sign, my chart's aspects, or where a planet sits. Not for two-person 合盘, interpreting a chart that already exists, transits, progressions, returns, or any dated prediction.
- Group
- Astrology
- Version
- 0.8.4
- Licence
- AGPL-3.0-or-later
Install
/plugin install astrology@misoto22Then invoke the skill with:
/astrology:natal-chartWhen it fires
The prompts CI scores this skill against — so they cannot drift from what it actually does.
Fires on
- 帮我算本命盘:林青,1999-10-30 下午两点半,上海出生。
- Cast my birth chart. Born 1988-04-11 at 09:15 in Shanghai.
- 我想知道我的上升星座和各行星落在第几宫,出生 1991-11-26 17:40 北京。
- 我大概是 1995 年 6 月 3 号早上七点多在成都出生的,帮我看星盘。
Stays out of
- 帮我和我对象合盘看看。
- 解读一下刚才生成的 natal_林青.json。
- 帮我排八字,1999-10-30 14:30 上海。
- 看看今年木星行运对我有什么影响。
Compute one static natal chart, write natal_<name>.json and natal_<name>.md, then hand the verified JSON to natal-reading automatically. The artifacts hold placement data only; never interpret the chart here.
Route before calculating
- Two people being compared belong to
synastry. - An existing natal artifact that needs meaning belongs to
natal-readingwithout recalculating. - Four pillars or twelve palaces belong to the
chinese-metaphysicsplugin. - Transits, progressions, solar and lunar returns, dated events, and forecasts are outside this release; state that rather than improvising them.
Require one resolved birth record
A natal chart needs an exact time. Houses, the four angles, and the sect all move with it, and a chart missing them is not a shorter natal chart — it is a different artifact. Collect without guessing:
name: display identity for the artifact, and nothing else.birth.date: exactYYYY-MM-DD.birth.time: exactHH:MMin 24-hour form, withtime_modeset toexactandtime_accuracy_minutesset to0.birth.timezone: historical IANA zone such asAsia/Shanghai.birth.latitudeandbirth.longitude: decimal degrees for the birthplace.
Resolve a place through an available geocoder or map source. If several places match, stop for a location choice; do not silently take the largest.
If the person only knows the hour, or only the date, say plainly that this skill cannot place houses or angles from it, and stop. Do not fall back to noon, and do not produce a chart with the angles quietly omitted.
Calculation contract
The shared astronomy applies these declared rules:
- Resolve the stated wall time through IANA historical data to one UTC instant.
- Take apparent geocentric positions from Swiss Ephemeris. When its data files are unavailable, the run is refused unless
ephemeris_policyis explicitly set toallow-moshier, and the fallback is then recorded as a limitation in the artifact. - Place houses under the requested system,
whole-signby default. - Derive sign, degree, house, retrograde state and classical dignities per body. Modern rulerships are deliberately absent: assigning Uranus to Aquarius is a live disagreement between traditions, and stating one as fact asserts a school rather than a position.
- Find intra-chart aspects with the declared orbs, each pair recorded once.
- Derive sect from the Sun's house, then the classical lots with the diurnal or nocturnal formula that sect selects.
- Record every unavailable body as a limitation. A chart that is short five asteroids must say so rather than look complete.
Run the calculator
Work from this skill directory. Put the resolved object in a UTF-8 JSON file and run:
python3 scripts/compute_natal.py --request REQUEST.json --out OUTPUT_DIRECTORY
Inline JSON is also accepted with --json. Swiss Ephemeris data files may be supplied with --ephemeris-path.
The runtime requires pyswisseph, declared in requirements.txt. If it reports the dependency missing, surface that exact installation error; do not substitute an approximate position table.
The command prints exactly two absolute paths on success: canonical JSON first, data-only Markdown second. Exit code 2 means no valid pair was created. Never create or repair one artifact manually after a calculation failure.
Validate and hand off
Read the JSON back and verify:
- schema is
astrology.natal-chart, version 1; - checksum matches canonical content;
- twelve house cusps and at least the ascendant and midheaven exist;
- every position carries a sign, a house, a retrograde state and a critical-degree flag;
- each aspect pair appears once, and no body aspects itself;
- sect is stated with its basis;
- lots are either complete or absent, never partial;
- every unavailable body appears in
limitations; - Markdown names the same checksum and contains no interpretation.
After validation, automatically invoke natal-reading with the exact JSON path. Do not wait for a second user request, and do not invoke it when calculation or validation failed.
Privacy and limits
Birth details are sensitive personal data. Write only to the user-selected output directory, do not send them elsewhere, and do not add unrelated identity details. The artifact keeps the resolved instant and the derived chart, not the supplied street address or place label.
This skill computes static natal structure only: no transits, no progressions, no returns, no event timing, no medical or psychological diagnosis, no deterministic claims, and no compatibility verdicts.
See references/request.example.json for the request shape and references/examples.md for boundary and failure cases.