astrology-reading-compose

/home/avalon/.hermes/skills/astrology/astrology-reading-compose/SKILL.md · raw

Astrology Reading Compose

Top-level reading orchestrator. Always the entry point for "give me a reading" / "interpret this chart" prompts. Never invoke a lens skill directly from the user-facing reply.

Pipeline

1. Resolve subject       ← Hermes-memory-first; see "Self vs other" below
2. Resolve birth → UTC   ← astrology-location-time-utc (only if new person)
3. Compute or load chart ← astral-chart-api  (cache via astral-tenant-kb.save_chart)
4. Pick lens combo       ← see "Lens selection" below
5. Run each lens         ← parallel; collect structured outputs
6. Weave reading         ← prose synthesis (see "Weaving rules")
7. Save reading          ← astral-tenant-kb.save_reading with lens-combo frontmatter
8. Reply                 ← reading + optional chart image

Self vs other — Hermes-memory-first resolution (HARD RULE)

Astrology readings are usually for the user themselves. Hermes built-in memory is loaded on every turn and is the fastest, cheapest place to recognize "this is the user's own chart." Use it FIRST.

Step 1 — Is this reading for the user (self)?

The reading is for the user when ANY of these are true: - The user uses first-person language: "my chart", "do me", "my Saturn return", "read my…" - The user gives their own name or a self-alias that matches their Hermes USER.md identity. - The user gives no name at all and the request is open-ended ("do a reading").

When self is detected: 1. Read Hermes memory (USER.md identity + birth data summary). Do NOT ask the user for birth data they already gave Hermes. 2. Recall the self profile from the tenant KB: look up the person whose frontmatter has relationship: self. If exactly one exists, use it. If memory's birth data and the KB self-profile disagree, surface the conflict to the user — never silently pick. 3. If no relationship: self profile exists yet, create one from Hermes memory's identity + birth data via save_person(slug, birth, relationship='self') before computing the chart. This is how a fresh tenant bootstraps its self-profile on first reading.

Step 2 — Is this reading for someone else?

The reading is for someone else when the user names a specific other person ("do Stephen's chart", "Kathleen, born…", "my brother", "this client").

When other is detected: 1. Apply the disambiguation policy from astral-tenant-kb (slug → exact name → alias → fuzzy → no match). 2. If multiple candidates exist, show all with birth-data summary and ask. NEVER silently pick. 3. If no match, ask for birth data, propose a slug, and save_person with appropriate relationship (client, family, friend, partner, public-figure).

Step 3 — Ambiguous "Alex" / "Stephen" / first-name only

If the user's first name matches the input AND other people in the KB also match (e.g. alex-mataha + alex-durran): - Do NOT assume self by default — even if you're inside the user's own Hermes. - Show all candidates including self, with birth-data summary, and ask. - This protects against the failure mode where the user is researching someone with their own first name.

Lens roster

Lens skill Ready Notes
astrology-lens-rulership-chains Default. Alex's traditional rulership method.
astrology-lens-decans-36-faces Coppock 36 Faces; pulls astro-sources wiki.
astrology-lens-nakshatras ❌ planned Sidereal 27 lunar mansions.
astrology-lens-pythagorean-geometry ❌ planned Tight harmonics / midpoints / minor aspects.
astrology-lens-elemental-shamanic ❌ planned Element balance, archetypal/animistic voice.
astrology-lens-hellenistic-time-lords ❌ future Zodiacal releasing, profections.

When adding a new lens: drop a skill named astrology-lens-<name>, follow the lens contract (structured claims[] + citations[], no prose), then list it here.

Lens selection

Default combo: [rulership-chains] — matches Alex's primary style.

User intent → combo: - "Coppock / decans / face / 36 Faces" → add decans-36-faces - "deep dive" / "everything" → run all ready lenses - "Pythagorean / harmonics / geometry" → add pythagorean-geometry (when ready) - "shamanic / elemental / archetypal" → add elemental-shamanic (when ready) - "Vedic / sidereal / nakshatra" → swap rulership-chains for nakshatras (when ready) - Explicit list ("rulership + decans") → exactly those.

A/B testing: if the user says "compare lenses" or "diff lens combos", run two separate compose passes with different combos and produce two readings labeled by combo for side-by-side comparison.

Weaving rules

The lens outputs are structured claims; compose layer turns them into one coherent reading.

  1. Lead with the strongest claim across all lenses, not the first lens's first claim. Strongest = main-engine loop, main-theme cluster, or main lens emphasis.
  2. Group by chart factor (Sun, then Moon, then Asc, then chart ruler, then notable bodies), and within each factor present claims from each lens in this order: rulership-chains → decans → other lenses. This stops lenses from talking past each other.
  3. Honor lens identity — when a claim comes from decans, name it ("In the 36 Faces system, your Sun falls in Libra I..."). Don't blend voices into mush.
  4. Cite the wiki when a lens cited it — inline [[concepts/libra-i]] style links.
  5. Cap length: aim for ~5–9 paragraphs unless user asked for long-form deep dive.
  6. No "folk" language (per Alex's North Star).
  7. End with one targeted question the user might want to explore next.

Hard rules

Reading file format (saved to KB)

---
person: alex
date: <iso>
chart_hash: <sha1>
lenses: [rulership-chains, decans-36-faces]
sources_cited:
  - astro-sources:concepts/libra-i
  - astro-sources:concepts/scorpio-i
prompt: "<user prompt>"
---

<reading prose>

Verification

Future: combo presets

Once 4+ lenses exist, define named combos in references/combo-presets.md (e.g. traditional-deep, vedic-traditional-mash, geometric-shamanic) so the user can ask for them by name.

See also