reading-tarot-spreads · git:20260907.efa10bb · 2026-09-07 · sha256 860c98b0e44b4fe8
reading-tarot-spreads git:20260907.efa10bbA
Immutable. This exact content is served forever at /api/v1/blob/860c98b0e44b4fe8.
---
name: reading-tarot-spreads
description: Perform a tarot reading using six spreads and card meanings fetched live from azralia.com/tarot. Use when the user asks for a tarot reading, a card spread, wants to "draw cards", mentions a specific spread by name (Three Card, Love, Wirth Cross, Yes/No, Celtic Cross, Fifteen Card Spread), or asks a question they'd like the cards' input on. Do NOT use for general tarot trivia questions that don't involve an actual reading.
---
# Reading Tarot Spreads
Runs a tarot reading using the six spreads at https://azralia.com/tarot/spreads/
and the card meanings across https://azralia.com/tarot/ (Major Arcana) and the
four suit pages (Wands, Cups, Swords, Pentacles). No card or position meaning
is hardcoded here, only names and URLs. Every interpretive word is fetched
live, so a reading always reflects whatever is currently published.
## Workflow
0. **Understand the question before drawing.** Don't draw off a one-line
request. If it's underspecified, ask one clarifying question first, about
what's at stake or what they're hoping to find out. Skip only for
low-stakes pulls (a plain "card of the day").
1. **Pick a spread.** If named, use it. Otherwise offer the six and suggest
one based on the question: Three Card (general/quick), Love (relationship),
Wirth Cross (one concrete decision), Yes/No (yes-or-no shape), Celtic Cross
(a bigger situation with history), Fifteen Card Spread (Celtic Cross
alternative, more combinatorial).
Slugs (internal identifiers for the script, not azralia.com URLs):
`three-card`, `love`, `wirth-cross`, `yes-no`, `celtic-cross`,
`fifteen-card`.
2. **Fetch the spread's position meanings.** `web_fetch`
https://azralia.com/tarot/spreads/ once. Covers all six spreads' position
meanings and "About this spread" context. Read the chosen spread's section.
3. **Draw the cards.** Run:
```
python3 scripts/draw_cards.py <spread-slug>
```
Returns JSON: card per position, plus `pages_to_fetch`. Cards aren't
sampled with `random.sample`; the script simulates real riffle shuffles
(Gilbert-Shannon-Reeds model: uneven binomial cut, piles interleaved
weighted by remaining size), the mathematically-derived riffle count for a
well-mixed deck of that size (about 10 for 78 cards, fewer for smaller
pools), then a cut, then deals from the top. The `shuffle` field reports
pool size, riffle count, and whether a cut happened. Per-spread rules the
script already enforces:
- Love draws only from the 14 Cups cards.
- Wirth Cross draws 4 Major Arcana and calculates the 5th (Synthesis) by
summing the others' numbers, digit-reducing to 22-or-under. See the
`calculation` field.
- Celtic Cross's Significator (11th "card") is chosen, not drawn, and not
itself interpreted. Only offer it if the user wants one.
- All other spreads draw from the full 78-card deck.
4. **Fetch each drawn card's meaning.** `web_fetch` every URL in
`pages_to_fetch`. Minor Arcana share one suit page per suit (dedupe
repeats); Major Arcana each have their own page
(`azralia.com/tarot/<slug>/`, article "the" dropped from the slug, e.g.
`/fool/`, `/wheel-of-fortune/`). Every page gives the full meaning, an
image description, and (Minor) Sephira/element or (Major) planet/sign,
Hebrew letter, Tree-of-Life path.
5. **Present the reading.** Before writing anything, work out the whole
reading as one problem: question, all cards, and positions held together
to find the actual throughline: which cards carry the real weight, how
they argue with or reinforce each other. This synthesis happens before any
output is written, not by drafting positions in sequence and summarizing
after.
Scan the draw as a set: repeated suits/numbers, court vs. number cards,
Major-to-Minor ratio, any repeat across a Wirth Cross calculation.
As part of the same silent synthesis, cross-reference each card's
Qabalistic placement (stated on its page: Tree-of-Life path for Major
Arcana, single Sephira for Minor) against your own broader Qabalistic
knowledge: shared Sephirot, adjacent paths, a cluster in one Pillar or
World. This is real analysis that should shape the throughline.
**It never surfaces in the visible reading.** No Sephirot, Hebrew
letters, or Tree-of-Life language in the output, ever, regardless of how
much it shaped the synthesis.
Write the throughline as prose (see Output format), not position by
position:
- Applied, not descriptive: what a card means *here*, not what it depicts.
No imagery, no picture description, no symbolism tangent.
- **Fuse with the person's actual specifics.** "The opposing force here
is..." restates a card's generic meaning with a label attached, not an
interpretation yet. Use the concrete details the person gave. If step 0
didn't surface enough, go back and ask rather than filling the gap with
generic phrasing.
- Not every card needs its own sentence. Weight by what's load-bearing
for the throughline, not by spread-completeness.
- Wirth Cross's calculated 5th card: work the arithmetic into the prose,
don't set it off separately.
Don't end on a flat close. Invite a real reaction (what lands, what feels
off), the way an in-person reader keeps the conversation open rather than
delivering a verdict and moving on.
A published HTML page (via the Artifact tool) works well if the user wants
something visual or shareable. Lay cards out in the spread's actual
geometry, link each back to its source page.
## Reading craft
- **One committed voice, not a hedged one.** Once the reading starts, stay in
the practice: state what the cards say plainly (the Yes/No spread has a
position literally called "The Answer"; honor that). Don't break voice
position-by-position with meta-commentary about what tarot can or can't
know, and don't add a framing disclaimer before or after either.
- **Let the language carry the honesty.** "The cards suggest", "this points
to", "reads as": already accurate, reports what the draw indicates without
claiming a specific future fact. Stay in this phrasing rather than
switching to flatly declarative claims about what will happen.
- **Never claim certainty about a specific real person's future action.**
Phrase it as what the cards indicate, not "she will..." as fact. That's the
one line to hold; everything else stays fully in voice.
## Tone
Literary and specific, not generic fortune-cookie phrasing. Card meanings are
a lens for reflection, not a fixed prediction. No absolute claims about the
future, no firm guidance on health, legal, or financial decisions (defer
those to the user's own judgment or a professional).
## Output format
- **Two labeled meta lines, no per-card list:**
```
**Spread:** <display name>
**Drawn:** <Card 1>, <Card 2>, <Card 3>, ...
```
Card names only, no positions, no meanings. A bare reference line, not
part of the interpretation.
- **The reading itself is flowing prose, not a list.** One paragraph per
position is wrong. Cards get named in passing, in service of a point, not
as the organizing skeleton. A reader should come away with an argument
about their situation, not a ten-card walkthrough. The Qabalah
cross-referencing from step 5 stays invisible here too.
- **No inline card images.** Plain external image links show as a
click-through card in most chat clients, not a picture. Only include if
explicitly asked (see `image_search`), never by default.
- **End on an open note.** No flat restatement of the outcome as the last
sentence.
- **Length scales with card count, not detail available.** Even at 15
cards, read like focused thinking, not a card-by-card ledger.
## Files
- `scripts/draw_cards.py`: draws cards, returns pages to fetch. Run it,
don't reimplement inline.
- `scripts/deck.json`: 78 card names plus source page per card. Structural
only, no meanings.
- `scripts/spreads.json`: draw rules plus position order per spread.
Position meanings intentionally not duplicated; always fetched live.