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.
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
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.
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.
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).
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 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.
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.
The lens outputs are structured claims; compose layer turns them into one coherent reading.
[[concepts/libra-i]] style links.lenses: [...] frontmatter saved in the KB.relationship: self profile exists, do NOT re-collect birth data.astral-tenant-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>
readings/<date>-<slug>-<combo>.mdlog.mdOnce 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.
astrology-audit — sibling meta-skill. Renders the current astrology / HD / synthesis pipeline as a Telegram-native flowchart PNG + legend with MEDIA: links to each step's SKILL.md. Invoke when Alex asks to "audit", "show the pipeline", "show the flow", or before mutating the reading flow for an experiment.astral-tenant-kb references/modular-lens-architecture.md — full architecture journal: three-layer principle, lens contract, the Hermes-memory ↔ tenant-KB seam, the May 2026 disambiguation lesson (Alex MaTaHa vs Alex Durran collision), tenant onboarding bootstrap pattern, when-to-extend-vs-add-lens guide, and a worked example of a live compose run.birth-data-onboarding-gate — how new tenants get their self-profile seeded between onboarding and /chat.