Give the interpreter real Celtic Cross meanings and --format/--lang support

- guidance.c now prints last, after the full spread; both it and main.c's
  new Celtic Cross readout pull real Waite card meanings via tarot_data.c
  instead of just naming cards.
- interpreter-cli gains --format text|html|json and --lang en|de, matching
  deck-engine - required linking engine/src/tarot_data.c and i18n.c into
  the interpreter binary (a narrow, documented exception to its earlier
  "no engine .c files" policy) and writing German translations for
  narrative.c's/guidance.c's own text.
This commit is contained in:
ml
2026-07-11 19:39:30 +02:00
parent 41422adf98
commit 1662d550c7
23 changed files with 1894 additions and 296 deletions
+6 -9
View File
@@ -16,9 +16,8 @@ know before changing the engine. This document is the visual overview.
(MIT), pinned to a specific commit — see its `VENDORED.md`.
- **`engine/src/`** is the core engine. Everything except `main.c`,
`reading.c`'s `reading_print_text`/`reading_print_html` functions, and
`i18n.c`'s file-loading half is free of `stdio`/CLI assumptions,
specifically so it can be linked into the Pebble watchapp later without
rework.
`i18n.c`'s file-loading half is free of `stdio`/CLI assumptions, so it
links straight into a Pebble watchapp without rework.
- `rng.c` — deterministic string-seeded PRNG (FNV-1a + splitmix64).
- `tarot.c` / `tarot_data.c` — the Celtic Cross draw and its content.
- `astro.c` — natal chart + daily transits, built on the vendored
@@ -41,9 +40,6 @@ know before changing the engine. This document is the visual overview.
`engine/scripts/user.properties.local` (gitignored) once it's filled
in, and restored from there if `dist/` is ever wiped — see
`CLAUDE.md`'s "Build & run".
- **The Pebble watchapp does not exist yet.** When it's built, it will
call `reading_generate()` directly and walk the returned struct to lay
out its own screens — it has no reason to touch `reading_print_*`.
## Dataflow
@@ -64,9 +60,10 @@ computations and combines their results:
with position and upright/reversed orientation, fully determined by
the seed string alone.
These three results are combined into one `DailyReading` struct, which is
either rendered by `reading_print_text`/`reading_print_html` (used by the
CLI) or, in the future, walked directly by watchapp UI code. See
These three results are combined into one `DailyReading` struct — the
real API surface. `reading_print_text`/`reading_print_html` (used by the
CLI) are just one way of consuming it; any caller, including watch UI
code, can walk the struct's fields directly. See
[`input-output-format.md`](input-output-format.md) for the exact fields
and output formats.
-8
View File
@@ -55,12 +55,6 @@ digraph architecture {
{ rank=same; binary; distimg; disti18n; runsh; props; }
}
subgraph cluster_watch {
label="Pebble watchapp — not built yet";
style="dashed"; color=firebrick; fontsize=11; fontcolor=firebrick;
watch [label="watchapp C / UI\n(future)", fillcolor=white, color=firebrick, fontcolor=firebrick, style="rounded,dashed"];
}
pdf -> tarot_data [label="sourced from", style=dotted, color=gray40];
tarot -> rng;
@@ -78,6 +72,4 @@ digraph architecture {
images -> distimg [label="`make images`\ncopies", style=dotted, color=gray40];
langfiles -> disti18n [label="`make i18n`\ncopies", style=dotted, color=gray40];
runsh -> props [label="reads at\nrun time", style=dotted, color=gray40];
watch -> reading [label="will call\nreading_generate()\ndirectly", style=dashed, color=firebrick, fontcolor=firebrick];
}
-4
View File
@@ -33,11 +33,9 @@ digraph dataflow {
print_text [label="reading_print_text()", fillcolor="#cfe8fb"];
print_html [label="reading_print_html()", fillcolor="#cfe8fb"];
watch_fn [label="watchapp UI code\n(future — walks the struct\ndirectly, no print_* call)", fillcolor=white, color=firebrick, fontcolor=firebrick, style="rounded,dashed"];
out_text [label="stdout: plain-text report", shape=parallelogram, fillcolor="#c8f0c8"];
out_html [label="stdout: reading.html\n(<img src=\"img/...\"> per card)", shape=parallelogram, fillcolor="#c8f0c8"];
out_watch [label="watch screens\n(future)", shape=parallelogram, fillcolor=white, color=firebrick, fontcolor=firebrick, style="dashed"];
cli -> main;
runsh -> main;
@@ -59,9 +57,7 @@ digraph dataflow {
daily_reading -> print_text;
daily_reading -> print_html;
daily_reading -> watch_fn [style=dashed, color=firebrick];
print_text -> out_text;
print_html -> out_html;
watch_fn -> out_watch [style=dashed, color=firebrick];
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 292 KiB

After

Width:  |  Height:  |  Size: 238 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 270 KiB

After

Width:  |  Height:  |  Size: 236 KiB

+225 -36
View File
@@ -4,9 +4,10 @@ See [`architecture.md`](architecture.md) for how these fit together.
There are two ways to provide input (direct CLI flags, or `run-engine.sh`
+ `user.properties`) and three output formats (`text`, `html`, `json`); the
`DailyReading` struct is the programmatic form all three are rendered
from, and the one the future watchapp will consume directly. `json` is
also `interpreter-cli`'s input format — see "The interpreter" at the
bottom of this file.
from, and the one watch UI code consumes directly. `json` is also
`interpreter-cli`'s input format — see "The interpreter" at the bottom
of this file, which supports the same three output formats (and the
same `--lang`) for its own report, independently of `deck-engine`.
## Input
@@ -90,8 +91,8 @@ build, like `dist/img/`). Adding a language is just dropping another
### `DailyReading` (the real output — `reading.h`)
`reading_generate()` is the actual API; `text`/`html` below are just two
ways of rendering the struct it fills in. This is what the watchapp will
read directly once it exists.
ways of rendering the struct it fills in. This is what watch UI code
reads directly.
```c
typedef struct {
@@ -227,16 +228,39 @@ read.
`dist/interpreter-cli` is a separate binary — see `CLAUDE.md`'s
"Interpretation" section for the full architecture — that reads a
`--format json` document and scores how significant today's transits
are. It never links the engine; it only depends on the JSON shape
above.
are. It never links `astro.c`/`tarot.c`/`reading.c` (or the vendored
Astronomy Engine) — only `engine/src/tarot_data.c`/`i18n.c` are linked
in, for real card/position names and Waite meaning text (see
`CLAUDE.md`'s `INTERP_TAROT_TEXT_OBJS` note). Otherwise it depends only
on the JSON shape above.
Like `deck-engine`, its own output supports `--format text|html|json`
and `--lang <code>`/`--i18n-dir <path>`:
| Flag | Required | Format | Meaning |
|---|---|---|---|
| `[reading.json]` | no | file path or `-` | Input file; stdin (or `-`) if omitted. |
| `--format` | no | `text` \| `html` \| `json` | This binary's **own output** format, defaults to `text`. Entirely independent of the `--format json` that produced its *input* - see below. |
| `--lang` | no | language code, e.g. `en`, `de` | This binary's **own output** language, defaults to `en`. Same `<code>.lang`/`--i18n-dir` convention as `deck-engine` (see "Translations" above) - `main.c` calls `i18n_load()` itself, so `narrative.c`'s/`guidance.c`'s own text (in `engine/i18n/*.lang` under `narrative.*`/`guidance.*` keys) is translated too, not just the card/position/body/sign/aspect vocabulary it shares with `deck-engine`. |
| `--i18n-dir` | no | path | Same convention as `deck-engine`'s: defaults to an `i18n/` directory next to this binary. |
**This `--lang` is unrelated to whatever `--lang` `deck-engine` was run
with to produce the `--format json` input** - that JSON is always
language-independent (slugs only, see above), so it doesn't matter what
language `deck-engine` printed anything in, or whether it was even asked
to print anything at all (`--format json` never touches `--lang`
either). The two `--lang` flags, on the two sides of the pipe, are
independent settings.
```bash
dist/deck-engine ... --format json | dist/interpreter-cli
dist/deck-engine ... --format json | dist/interpreter-cli --format html --lang de
# or:
dist/deck-engine ... --format json > reading.json
dist/interpreter-cli reading.json
# or, for daily use (OS clock + user.properties, same inputs as run-engine.sh):
dist/run-interpreter.sh
dist/interpreter-cli --format json reading.json
# or, for daily use (OS clock + user.properties, same inputs as run-engine.sh,
# including user.properties' lang=):
dist/run-interpreter.sh # text output, language from user.properties
dist/run-interpreter.sh html de # override format/language for this run
```
- **Input**: a file path argument, or stdin if no argument (or `-`) is
@@ -244,30 +268,195 @@ dist/run-interpreter.sh
means "no notable transits today"; a missing key is treated as invalid
input) and drives scoring. `"natal"."bodies"`/`"transits"."bodies"` are
read too, for the sign/house context printed alongside each event below
(not for scoring) an entry naming an unrecognized body, or a missing
`house`, is silently skipped rather than failing the load (see
`parse_bodies()` in `reading_io.c`); `spread` is always ignored.
- **Output**: a plain-text report — the day's overall significance level
(`Quiet`/`Notable`/`Significant`/`Major`, plus its rank out of the 4
defined levels, e.g. `Notable (2/4)`), a "worth a deeper Celtic Cross
look" line on `Major` days only, and up to 5 of today's aspects ranked
by score, each naming the sign and natal house the transiting planet
currently occupies and the sign and house of the natal planet it's
aspecting, followed by a short narrative sentence about what that
transiting planet classically signifies *and which area of life its
current house governs* (see `CLAUDE.md`'s `narrative.c` bullet) —
omitted only if the source material has nothing to say for that
planet/aspect combination:
(not for scoring), and `"spread"."positions"` is read for the full
Celtic Cross readout and the guidance paragraph below — an entry naming
an unrecognized body/card/position, a missing `house`, or a missing
`"spread"` key entirely is silently skipped/zeroed rather than failing
the load (see `parse_bodies()`/`parse_spread()` in `reading_io.c`).
- **Input**: same for all three output formats above - only how the
parsed data gets rendered differs.
```
Day significance: Significant (3/4)
(a major transit today - worth a deeper Celtic Cross look)
### `--format text`
Top 3 significant transits:
1. Transiting Saturn in Aries (house 2) Square natal Sun in Taurus (house 3) (orb 0.5°, score 8.10)
In matters of money, possessions, and personal values (house 2). Brings depression, stagnation, hindrances and obstacles, and some deprivation of the usual benefits.
2. Transiting Pluto in Aquarius (house 12) Opposition natal Moon in Capricorn (house 11) (orb 0.2°, score 7.92)
In matters of solitude, the subconscious, and hidden matters (house 12). Brings deep, often hidden transformation - the surfacing or dismantling of something that has outgrown its old form.
3. Transiting Jupiter in Leo (house 5) Trine natal Venus in Aries (house 2) (orb 2.1°, score 3.40)
In matters of romance, creativity, and children (house 5). Brings increase and expansion - fullness of fortune and health, and a generally fortunate time.
```
A plain-text report, printed in a fixed order —
1. the day's overall significance level (`Quiet`/`Notable`/
`Significant`/`Major`, plus its rank out of the 4 defined levels,
e.g. `Notable (2/4)`), with a "worth a deeper Celtic Cross look"
line on `Major` days only;
2. up to 5 of today's aspects ranked by score, each naming the sign
and natal house the transiting planet currently occupies and the
sign and house of the natal planet it's aspecting, followed by a
short narrative sentence about what that transiting planet
classically signifies *and which area of life its current house
governs* (see `CLAUDE.md`'s `narrative.c` bullet) — omitted only if
the source material has nothing to say for that planet/aspect
combination;
3. the full 10-position Celtic Cross spread, in Waite's own drawing
order, each with its card (and orientation), the position's own
description, and that card's actual meaning;
4. finally, a guidance paragraph tying the day's top transit to the
spread's Attitude/Outcome cards, with its opening sentence tailored
to `day_level` (stronger wording on `Major`, softer on
`Quiet`/`Notable`, falling back to a transit-free reading of the
Attitude card alone on a day with no aspects at all) and, for the
Attitude/Outcome cards it names, their actual Waite meaning for the
orientation they landed in — see `CLAUDE.md`'s `guidance.c` bullet.
This is printed last, as the closing takeaway after the reader has
seen the full spread it references.
```
Day significance: Major (4/4)
(a major transit today - worth a deeper Celtic Cross look)
Top 5 significant transits:
1. Transiting Pluto in Aquarius (house 3) Conjunction natal Moon in Aquarius (house 3) (orb 2.9°, score 9.60)
In matters of communication, siblings, and everyday learning (house 3). Brings deep, often hidden transformation - the surfacing or dismantling of something that has outgrown its old form.
2. Transiting Neptune in Aries (house 5) Sextile natal Moon in Aquarius (house 3) (orb 2.5°, score 9.25)
In matters of romance, creativity, and children (house 5). Brings a state of chaos and confusion - an involved, uncertain condition of affairs, with plots, subtlety, or unseen influences at work.
3. Transiting Uranus in Gemini (house 7) Trine natal Moon in Aquarius (house 3) (orb 2.0°, score 8.96)
In matters of partnerships and close relationships (house 7). Brings separations, estrangements, sudden dislocations and violent upsets. Success through official or civic channels, and beneficial changes or appointments, are possible.
Celtic Cross:
1. The Present: The Emperor (Reversed)
This covers him: the general influence affecting the matter.
Benevolence, compassion, credit; also confusion to enemies, obstruction, immaturity.
2. The Challenge: The Devil
This crosses him: the nature of the obstacle in the matter.
Ravage, violence, vehemence, extraordinary efforts, force, fatality.
...
7. Himself: The Magician
His position or attitude in the circumstances.
Skill, diplomacy, address, subtlety; self-confidence, will.
...
10. The Outcome: Strength
What will come: the final result of the matter.
Power, energy, action, courage, magnanimity; complete success and honours.
With Pluto as today's dominant influence: Today concentrates whatever you already
bring to it - your current approach will be amplified, so make sure it's the one
you want.
Your Attitude card is The Magician: Skill, diplomacy, address, subtlety; self-confidence, will.
The spread's likely Outcome is Strength: Power, energy, action, courage, magnanimity; complete success and honours.
```
On a quieter day, only the opening of the guidance paragraph changes:
```
Day significance: Notable (2/4)
...
With a mild touch from Jupiter today: Your instincts are sound, but the day is
testing them - hold your position without forcing the issue.
Your Attitude card is The Sun: Material happiness, fortunate marriage, contentment.
The spread's likely Outcome is Justice: Equity, rightness, probity, executive; triumph of the deserving side in law.
```
The same report with `--lang de` (same input as the Major example
above):
```
Bedeutung des Tages: Einschneidend (4/4)
(ein einschneidender Transit heute - ein genauerer Blick auf das Keltische Kreuz lohnt sich)
Top 5 wichtige Transits:
1. Transit Pluto in Wassermann (Haus 3) Konjunktion natal Mond in Wassermann (Haus 3) (Orbis 2.9°, Punktzahl 9.60)
In Fragen von Kommunikation, Geschwistern und alltäglichem Lernen (Haus 3). Bringt tiefgreifenden, oft verborgenen Wandel - das Auftauchen oder die Auflösung von etwas, das seine alte Form überwachsen hat.
...
Keltisches Kreuz:
1. Die Gegenwart: Der Herrscher (Umgekehrt)
Dies bedeckt ihn: der allgemeine Einfluss, der die Angelegenheit betrifft.
Wohlwollen, Mitgefühl, Ansehen; auch Verwirrung der Feinde, Behinderung, Unreife.
...
Pluto ist heute der bestimmende Einfluss: Der heutige Tag verstärkt, was du bereits
mitbringst - deine derzeitige Herangehensweise wird verstärkt, also stelle sicher,
dass es die richtige ist.
Deine Haltungskarte ist Der Magier: Geschick, Diplomatie, Gewandtheit, Feinsinn; Selbstvertrauen, Wille.
Das wahrscheinliche Ergebnis des Blatts ist Kraft: Macht, Energie, Tatkraft, Mut, Großmut; voller Erfolg und Ehren.
```
### `--format html`
A single self-contained HTML page, same inline-CSS/no-JS approach as
`deck-engine`'s own `--format html`, and the same three sections as text
(significant transits as a table, the full Celtic Cross as an image
grid, guidance as a closing callout) - reusing the exact same
`img/<file>` card-art convention (`tarot_card_image_file()`), so it
expects to sit next to an `img/` directory just like `deck-engine`'s
HTML output:
```html
<div class="card">
<div class="position">The Present</div>
<img class="reversed" src="img/RWS_Tarot_04_Emperor.jpeg" alt="The Emperor">
<div class="name">The Emperor (Reversed)</div>
<div class="desc">This covers him: the general influence affecting the matter.</div>
<div class="meaning">Benevolence, compassion, credit; also confusion to enemies, obstruction, immaturity.</div>
</div>
```
The guidance section renders as one `<p>` per line of the same text
`--format text` prints last (intro sentence, Attitude line, Outcome
line), inside a `<div class="guidance">`.
### `--format json`
Unlike `deck-engine`'s own `--format json` - which is deliberately
**language-independent** (slugs only, no `--lang`-dependent prose, since
it's a machine interchange format between the two binaries) -
`interpreter-cli`'s `--format json` embeds the *same localized
narrative/guidance prose* `--format text` prints, in whatever `--lang`
was loaded, **alongside** stable, language-independent slug fields. This
is a deliberate difference: rendering that prose is this module's whole
job, so a JSON consumer that wants it doesn't have to reimplement
`narrative.c`/`guidance.c`'s logic itself - but a consumer that only
wants structured data (e.g. watch UI code with its own rendering) still
has the slugs to work with directly.
```json
{
"day_significance": {
"level": "major",
"rank": 4,
"count": 4,
"deserves_framing": true
},
"significant_transits": [
{
"transiting_planet": "pluto",
"transiting_sign": "aquarius",
"transiting_house": 3,
"natal_planet": "moon",
"natal_sign": "aquarius",
"natal_house": 3,
"aspect": "conjunction",
"orb": 2.8821,
"score": 9.5961,
"narrative": "In matters of communication, siblings, and everyday learning (house 3). Brings deep, often hidden transformation - the surfacing or dismantling of something that has outgrown its old form."
}
],
"celtic_cross": [
{
"position": "present",
"card": "emperor",
"reversed": true,
"card_name": "The Emperor",
"meaning": "Benevolence, compassion, credit; also confusion to enemies, obstruction, immaturity."
}
],
"guidance": "With Pluto as today's dominant influence: Today concentrates whatever you already bring to it - your current approach will be amplified, so make sure it's the one you want.\nYour Attitude card is The Magician: Skill, diplomacy, address, subtlety; self-confidence, will.\nThe spread's likely Outcome is Strength: Power, energy, action, courage, magnanimity; complete success and honours."
}
```
- `significant_transits` has `interp.top_item_count` entries (0-5, same
ranking as `--format text`); `celtic_cross` always has exactly 10, in
`CelticCrossPosition` enum order (same order as `deck-engine`'s own
`spread.positions`).
- `orb`/`score` are `%.4f`, matching `deck-engine`'s own JSON precision
for angles.
- `guidance` is always present and non-empty (unlike
`significant_transits`, which can be `[]` on a genuinely quiet day) -
see `guidance.c`'s no-aspects-at-all fallback in `CLAUDE.md`.
- With `--lang de`, every string value above except the slugs
(`"level"`, `"transiting_planet"`, `"aspect"`, `"card"`, `"position"`,
etc.) changes language; the slugs never do.
+132 -21
View File
@@ -18,6 +18,12 @@ exactly where the planets were, and which zodiac sign was rising, at the
moment you were born — your **natal chart**. Everything else the app
does is compared against that one fixed reference point.
You can also choose a **language** for your reading - English or German.
Every part of the reading described below, including the guidance
paragraph at the end, is available in either; switching languages
doesn't change any of the astrology or the tarot draw itself, only how
it's worded.
## What happens every day
Each day, the app does two independent things and then combines them:
@@ -95,21 +101,51 @@ That wording is condensed from a public-domain 1920 astrology book
(Sepharial's *Transits and Planetary Periods*), the same way the tarot
card meanings are condensed from Waite's 1911 book.
Every day — Quiet or Major — the app also reads out your full 10-card
Celtic Cross spread, position by position, each with that card's actual
meaning (drawn from the same Waite text as the rest of the reading), so
you get one complete, readable account of the spread rather than just
a list of card names.
After that spread, you get a short paragraph of actual guidance: how to
meet the day, given both the single biggest transit happening and your
own tarot spread. It looks at that transit's character (is it an easy
angle or a tense one?) together with your *Attitude* card — the
position Waite describes as "his position or attitude in the
circumstances", i.e. how you're currently approaching things — upright
or reversed, and gives a concrete stance to take today. It then names
your *Attitude* and *Outcome* cards again, this time spelling out what
each one actually means for the orientation it landed in — so instead
of just "your Outcome card is the Wheel of Fortune, reversed" you get
that card's real meaning alongside it. This is the one place the app
actually combines the astrology and the tarot into a single piece of
advice, rather than leaving you to read them side by side yourself, and
it's printed last, as the closing takeaway once you've seen the full
spread it's referring to.
The wording flexes with how big the day is: on a Major day it opens
with something like "With Pluto as today's dominant influence"; on a
quieter day with only a mild aspect in play it's softer, e.g. "With a
mild touch from Jupiter today" or, fainter still, "Mercury is only
faintly active today, but for what it's worth"; and on a genuinely
uneventful day with no aspects at all, there's no planet to name, so it
falls back to a plain read of your Attitude card's orientation alone
("There's no standout transit today - it's an astrologically quiet
day..."). The underlying stance advice itself doesn't change with
intensity — only how insistently it's introduced.
## What a day's reading actually gives you
Put together, one day's reading contains: your natal chart (for
reference), today's sky and how it's speaking to your chart, how
significant today is overall (with a plain-language note on each of the
main events driving that), and your 10-card Celtic Cross spread for the
day. Right now these sit side by side — the astrology tells you *how
eventful* today is and *where* to pay attention, and the tarot spread
gives you the actual guidance to sit with. They don't yet get woven
into a single narrative (e.g. a spread explained *in light of* today's
significant transit) — that combined storytelling is the next piece to
build, not something you get today.
*(This page, like that piece, is still a work in progress — expect it
to grow as the reading itself does.)*
main events driving that), your full 10-card Celtic Cross spread read
out card by card with each card's meaning, and — every day, not just
Major ones — a closing paragraph of guidance tying the day's biggest
transit to your Attitude and Outcome cards specifically. Attitude and
Outcome get that treatment in the closing guidance; the other eight
positions are read in light of your natal chart and today's sky, the
way the worked example below does by hand.
## A worked example
@@ -123,7 +159,7 @@ Sagittarius.
are forming aspects back to the natal chart above — see below for which
ones actually matter.
**How big is today.**
**How big is today, and the significant transits.**
```
Day significance: Major (4/4)
@@ -149,18 +185,93 @@ from the 5th house, and a disruptive-but-possibly-lucky Uranus trine
from the 7th. Communication, romance, and relationships are all
quietly under pressure at once.
**Tarot spread (excerpt).** Drawn independently, using today's date:
**The Celtic Cross, read out in full** (drawn independently, using
today's date):
- *The Present* — The Emperor, reversed: immaturity or a loss of
authority, rather than confident structure.
- *The Challenge* — The Devil: force, ravage, an obstacle that isn't
easily reasoned with.
- *The Near Future* — The World, reversed: stagnation, things staying
fixed in place rather than resolving.
```
Celtic Cross:
1. The Present: The Emperor (Reversed)
This covers him: the general influence affecting the matter.
Benevolence, compassion, credit; also confusion to enemies, obstruction, immaturity.
2. The Challenge: The Devil
This crosses him: the nature of the obstacle in the matter.
Ravage, violence, vehemence, extraordinary efforts, force, fatality.
3. The Crown: The Empress
This crowns him: the aim or ideal, the best that can be achieved.
Fruitfulness, action, initiative, length of days; also difficulty, doubt, ignorance.
4. The Foundation: Justice
This is beneath him: the basis of the matter, already actual.
Equity, rightness, probity, executive; triumph of the deserving side in law.
5. The Recent Past: Temperance
This is behind him: the influence that is just passing away.
Economy, moderation, frugality, management, accommodation.
6. The Near Future: The World (Reversed)
This is before him: the influence now coming into action.
Inertia, fixity, stagnation, permanence.
7. Himself: The Magician
His position or attitude in the circumstances.
Skill, diplomacy, address, subtlety; self-confidence, will.
8. His House: The Hermit (Reversed)
His environment and the tendencies at work therein.
Concealment, disguise, policy, fear, unreasoned caution.
9. Hopes and Fears: The Moon (Reversed)
His hopes or fears in the matter.
Instability, inconstancy, silence, lesser degrees of deception and error.
10. The Outcome: Strength
What will come: the final result of the matter.
Power, energy, action, courage, magnanimity; complete success and honours.
```
**The closing guidance**, tying the day's biggest transit (Pluto,
above) to the Attitude and Outcome cards from the spread just shown:
```
With Pluto as today's dominant influence: Today concentrates whatever you already
bring to it - your current approach will be amplified, so make sure it's the one
you want.
Your Attitude card is The Magician: Skill, diplomacy, address, subtlety; self-confidence, will.
The spread's likely Outcome is Strength: Power, energy, action, courage, magnanimity; complete success and honours.
```
Read side by side, the astrology and the tarot happen to rhyme here —
both point toward something that wants to shift (Pluto's "hidden
transformation," The Devil's "force") running into something that
feels stuck (a reversed World, an afflicted Moon) — but that's the
reader's own synthesis for now, not something the app does for you (see
above).
feels stuck (a reversed World, an afflicted Moon). The closing guidance
picks up part of that thread automatically — an upright Attitude card
(The Magician) paired with this neutral, concentrating Pluto transit
becomes "make sure your current approach is the one you want" — reading
every other position (Challenge, Near Future, and the rest) into that
same story the way this paragraph just did by hand is the reader's own
synthesis (see above).
**A quieter day, for contrast.** Someone else — born 10 October 1990 in
Sydney, checking their reading on 15 January 2026 — gets a much lower-key
version of the same guidance, because the biggest thing happening that
day is a loose, single Jupiter aspect rather than an exact Pluto hit:
```
Day significance: Notable (2/4)
...
With a mild touch from Jupiter today: Your instincts are sound, but the day is
testing them - hold your position without forcing the issue.
Your Attitude card is The Sun: Material happiness, fortunate marriage, contentment.
The spread's likely Outcome is Justice: Equity, rightness, probity, executive; triumph of the deserving side in law.
```
Same stance logic (a tense aspect, an upright Attitude card), but the
opening line matches how much the day actually asks of you.
**The same Major day, in German.** Switching languages doesn't change
anything about the reading itself - same cards, same transits, same
guidance logic - only the words:
```
Bedeutung des Tages: Einschneidend (4/4)
(ein einschneidender Transit heute - ein genauerer Blick auf das Keltische Kreuz lohnt sich)
Pluto ist heute der bestimmende Einfluss: Der heutige Tag verstärkt, was du bereits
mitbringst - deine derzeitige Herangehensweise wird verstärkt, also stelle sicher,
dass es die richtige ist.
Deine Haltungskarte ist Der Magier: Geschick, Diplomatie, Gewandtheit, Feinsinn; Selbstvertrauen, Wille.
Das wahrscheinliche Ergebnis des Blatts ist Kraft: Macht, Energie, Tatkraft, Mut, Großmut; voller Erfolg und Ehren.
```