story-to-pack: add the corpora and the catalogue v2/v3

Fourteen corpora split and classified: aesop, bierce, chekhov, holmes,
keefe, lawson, lorimer, maupassant, nobody, plaintales, poe, torchy,
wallingford and winesburg, each with its splitter and the hand-written
groups and pages; catalogue v2 and v3; and the shared splitters
gutenberg_chunks.py, se_split.py and se_build.py.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019rwKTmug58sEsJ72AuWsEi
This commit is contained in:
JesseMarkowitz
2026-10-07 06:05:51 -04:00
co-authored by Claude Opus 5.5
parent e5617b86ba
commit 3a4758172d
566 changed files with 303901 additions and 0 deletions
+220
View File
@@ -0,0 +1,220 @@
# Aesop reference set: *Three Hundred Aesop's Fables* (tr. George Fyler Townsend, 1867)
A hand-made comparison baseline for the story-to-pack pipeline, a sibling of the Jacobs set in
`../jacobs/` and the Lawson set in `../lawson/`. Claude read all 313 fables and wrote every summary,
predicament, group, option and measurement row. **No inference of any kind was used.** Do not treat
it as ground truth: it is one careful reading.
Aesop has two jobs here. It is a normal reference set. It is also a test of a different claim: a story
supplies predicaments well but rarely says what a move leads to, while a fable puts situation, move
and outcome in one paragraph. The second job is measured in
[Fables as an option source](#fables-as-an-option-source).
| File | What it is |
| --- | --- |
| `corpus/three-hundred-aesops-fables.txt` | Project Gutenberg eBook #21 (public domain) |
| `split_gutenberg.py` | → `stories.json` and `chunks.json`: **313 fables, one story and one scene per fable** (see below) |
| `claude/batches/sNNN.json` | `{chunk, story, summary, predicament, moral}`, one file per run of fables, named by the first fable in it so that the `s*.json` glob sorts in fable order |
| `claude/groups_src.py` | the groups, their options, and the protagonist's standing in every fable |
| `claude/options_src.py` | the options measurement, with the definitions of its `new:` entries and the rules for `stated` |
| `claude/build.py` | checks everything, then writes `claude/records.json`, `claude/groups.json` and `claude/options_by_entry.json` |
| `claude/page.py` | → `claude/REFERENCE.html`, the readable page, with the measurement at the end |
Rebuild: `python3 split_gutenberg.py` from this directory, then
`cd claude && python3 build.py && python3 page.py`.
**One scene per fable** departs from the usual 80-word scene rule on purpose. The median fable is 97
words, and many are under 80, so the rule would discard them, and a fable split in two would lose its
turn. A group's fable count is therefore also its story count.
## What is in it
- **313 predicaments**: one sentence each (median 21 words, min 15, max 24), transplanted to a
workplace. They contain no animal, plant or god names and no story-only objects. Human role words
stay (someone powerful, a partner, a newcomer, the boss). `build.py` enforces this with a list of
every creature, plant, god and prop in the book, not with `topic_words`. The list caught nine
predicaments that used an animal word as a verb or an idiom ("crow about it", "swallow it whole",
"the lion's share"), and all nine were reworded.
- **115 stated morals**, recorded verbatim. A moral here is the fable's unquoted, generalising
sentence ("Look before you leap."). Where the lesson is only spoken by a character inside quotation
marks, as in *The Lion and the Mouse*, `moral` is `null`. `build.py` checks every moral is in the
text.
- **16 groups of 13 or more fables**, the recurrence rule scaled to this corpus (at least
max(3, 4% of 313) = 13). They range from 13 to 18 fables. **4 small groups of 5 to 12** are marked
`small` and reported separately: G17 letting a known predator inside (6), G18 the lion's share (6),
G19 a bad record when you need trust (5), G20 a warning before the trouble (6). Each fable sits in at
most one group: **253 are assigned and 60 fit nothing that recurs**.
- **Options**: 3 to 5 per group, 94 in all. 87 come from what someone in a member fable did or
refused to do (`scene:N`), 7 fill gaps, and none are archetypes. No option cites a fable outside
its own group, unlike Jacobs (8) and Lawson (14). A fable is a whole turn, so the move and the fable
are always the same scene.
- **Moves**: spine paths with a direction only (`+`, `-`, `risk`, `set`). There are no magnitudes.
**Skills** proposed for this corpus: `wit`, for seeing through a trick and turning it, and
`prudence`, for looking before you leap, knowing your limits and keeping what you have. Between them
they are most of Aesop's morals.
- **Stage** comes from protagonist standing, judged **per fable** in `STANDING` in `groups_src.py`:
157 fables rank low, 119 middle and 37 high. **No group comes out stage `high`** (11 low, 9 middle).
Aesop's "you" is usually the lamb, not the wolf, and the high-standing fables (a father, a master, a
captor) scatter across groups rather than recurring together.
The groups:
| | Group | Fables | Nearest catalogue entry |
| --- | --- | --- | --- |
| G01 | A friendly approach from someone who would gain by your fall | 16 | new (near `sure_thing`) |
| G02 | At the mercy of someone who has already decided | 14 | `at_their_mercy` |
| G03 | Trading one hardship for another | 14 | new |
| G04 | Envying another's gift | 17 | new (near `overlooked`) |
| G05 | Passing for more than you are | 14 | `pretence` |
| G06 | Riding high | 13 | new |
| G07 | Sneered at by someone showier | 13 | new (near `power_over_you`) |
| G08 | Help asked in need | 14 | `plea_for_help` |
| G09 | Wanting more than you hold | 13 | new |
| G10 | Your side divided | 15 | new |
| G11 | A partner you may not be able to count on | 18 | new (near `used`) |
| G12 | Rushing in without looking | 13 | new |
| G13 | Pointing at others' faults | 14 | new (near `own_words_back`) |
| G14 | Liberties between the weak and the strong | 15 | new (near `revenge`) |
| G15 | A hard lot | 14 | new (near `dead_end`) |
| G16 | Worked hard, badly repaid | 13 | new (near `overlooked`) |
Only three large groups match an existing entry. The rest are situations about **self-regard and
prudence** (envy, pride, greed, heedlessness, pointing at faults), which no story corpus isolated.
The story corpora found them only as the texture of longer plots.
## How this corpus differs
**Recurrence is the corpus's nature, not something to be found.** Every earlier corpus needed a
search for the handful of situations its stories kept returning to. Aesop is built from a small
stock of situations told over and over with different animals: the predator's invitation alone
appears sixteen times. The problem flips. Nearly every fable recurs, and the work is deciding which
of several overlapping situations a fable belongs to. *The Fox and the Goat* is a trap, a heedless
leap, and a partner who uses you. It sits in G01.
**The predicaments are the cleanest yet.** There are no names to strip, and the whole cast is
already a set of roles: the strong, the weak, the flatterer, the partner, the master. Transplanting
to a workplace needs only the animal removed. The cost is abstraction: a pack built on these
predicaments alone would have no setting at all.
**Two groups hold both sides of one situation.** G13 holds the critic who shares the fault and the
one criticised. G14 holds the weak who strike at the fallen and the strong being needled. In Jacobs
and Lawson the actor was always on one side. Here the fable often follows both parties to their fate,
and splitting them would leave neither side at 13. The measurement does the same for `sneered_at`:
G07's predicaments are all from the side of the one sneered at, but four of its fables (the heifer, the
horse, the olive, the hare) also supply the sneerer's move as an option.
**Power runs through nearly everything.** Five of the sixteen groups turn on an imbalance of power
(G01, G02, G03, G14, G16), and two of the small ones as well. Of the options measured below, 110 of
242 are about the actor's standing going down. It is the most power-heavy corpus so far, and the
least domestic: there is almost no home, love, grief or dread.
## Fables as an option source
`claude/options_by_entry.json` maps a catalogue entry (a v2 id, or `new:<id>` defined under
`_new_entries`) to the options the fables supply for it. Each option is
`{text, moves, source: "chunk:N", evidence, stated}`. `evidence` is the verbatim moral, or an
excerpt of at most 30 words, and `build.py` checks both. **`stated` is `true` only if the fable's own
outcome or moral shows the direction of every path in `moves`.** The rules, applied the same way to
every row, are in the docstring of `options_src.py`. The main points:
- An outcome is read as a direction by a fixed table. Killed, caught, beaten, driven out or publicly
rebuked counts as `standing -`. Goods, food or pay lost counts as `money -`. A counterpart who
repays, deserts or stops trusting you counts as `relationships`. Reading "eaten" as `standing -` is
a convention. The fable does not say it.
- A moral that only calls a move wise or foolish ("Look before you leap.") states no direction. One
that names the effect ("Slow but steady wins the race.") does.
- An outcome the move did not cause is not counted, however pointed. The sparrow is taken by a hawk
while mocking the hare, but mocking did not bring the hawk.
- `risk` is stated only when one fable shows the same move ending both ways. That happens once, in
*The Birdcatcher, the Partridge, and the Cock*: one bird's plea spares it, and the other's does not.
- **Measurement moves use only `money`, `standing` and `relationships.<role>`.** A skill label or a
flag is a decision about the option, not an outcome any text can show. Leaving them out means every
row could in principle be stated. The group options in `groups_src.py` keep them.
**Results:**
| | |
| --- | --- |
| Catalogue v2 entries with at least one sourced option | **32 of 82** (26 with at least one stated option) |
| `new:` entries | **19**, all with at least one stated option |
| Options | **242**, from 229 fables (84 for v2 entries, 158 for new ones) |
| `stated: true` | **165 (68%)**: 62 of 84 for v2 entries (74%), 103 of 158 for new ones (65%) |
| Entries with three or more stated options | 21 |
| Entries with a stated `+` option and a stated `-` option | 15 |
The v2 entries the fables speak to are mostly about power, deception and help. `at_their_mercy`
gets 14 options (12 stated), `plea_for_help` 11 (9), `pretence` 8 (6) and `warning` 5 (2). Another 28
entries get one to four options each. The 50 entries with nothing are almost all of the catalogue's
home, love, loss, fear and duty. Examples are `home_unseen`, `grief`, `losing_them`, `dread`,
`duty_against_love`, `past_comes_back` and `promised_elsewhere`. Aesop has no inner life and almost
no family.
The 19 new entries are `friendly_predator`, `better_the_devil`, `ape_your_betters`, `riding_high`,
`sneered_at`, `grasping`, `divided`, `doubtful_ally`, `heedless`, `pot_and_kettle`,
`needling_the_strong`, `hard_lot`, `used_up`, `predator_inside`, `lions_share`, `bad_record`,
`asking_above`, `please_everyone` and `make_them_move`. Each definition says which v2 entry it sits
nearest to and how the decision differs.
**Against the story packs.** Every option in a story pack has an inferred direction: the author
judged where the move leads, because the story does not say.
| Pack | Options | `scene:N` | `archetype` | `filled` | Directions stated by the text |
| --- | --- | --- | --- | --- | --- |
| Lawson (`../lawson/claude/groups.json`) | 142 | 118 | 12 | 12 | 0 (all inferred) |
| Bierce (`../bierce/claude/groups.json`) | 128 | 96 | 15 | 17 | 0 (all inferred) |
| Aesop groups (`claude/groups.json`) | 94 | 87 | 0 | 7 | not separately judged |
| Aesop measurement (`claude/options_by_entry.json`) | 242 | 242 (all from a fable) | 0 | 0 | 165 (68%) |
Even a `scene:N` option in a story pack is sourced only for its *move*: the scene shows someone doing
it, and its effect is the author's call. In the measurement, two thirds of the options are sourced for
the effect as well.
The 68% needs three qualifications before anyone relies on it.
1. **The stated options are thin.** 226 of the 242 options carry a single path, and 15 of the 16
two-path options are stated. A fable follows one actor to one fate, and that fate is nearly always
their standing. Story-pack options carry more: Lawson's average 1.67 spine paths each, Bierce's
1.18 and Aesop's own group options 1.40, before skills and flags. What a fable usually leaves
unsaid is the second path, how the move changes a relationship.
2. **They are almost all downside.** Of the 165 stated options, **136 move only in the `-`
direction**. By path, 90 stated `standing -` against 12 stated `standing +`. A fable states the
price of the tempting mistake: the goat in the well, the crow who sang, the dog who dropped his
meat. The wise move's reward is usually just that the harm does not happen, and that gives no
direction. The fox who stays outside the sick lion's cave is right, and nothing moves for him. That
is why the options marked `false` are so often the prudent ones. Only 15 entries get a stated
option in each direction.
3. **The coverage is narrow.** 32 of 82 entries, with most of the weight on a handful. The fables
tell you a great deal about predators, pretenders and the greedy, and nothing about a spouse, a
dead friend or a night watch.
**Verdict.** Fables are a real source of effect directions, and a far better one than stories, but
only for one kind of option. For a tempting mistake in a situation of power, greed, pride or trust,
the fable states where it leads, with evidence, seven times in ten (136 of the 190 options that only
move down). For any other option it is about half (29 of 52). That is enough to anchor
the `-` direction of an event's tempting option, and to check an author's inferred direction against
a text. Fables do not supply the prudent option's payoff, the relationship side of a move, or skills,
and they say almost nothing about the catalogue's domestic and inward half. The same applies to them as
a source of predicaments. Use them to calibrate the downside of options in power and trust events,
not to build whole events.
## Known defects
- **Drop capitals.** The transcription lost each fable's printed drop capital, so many fables open
with the first word's initial missing: "WOLF, meeting with a Lamb" (fable 1), "TEE KITES" (180).
`chunks.json` is left as split. Morals and evidence are quoted from later in the text, so none is
affected.
- **Other transcription slips**, left as split: "an a woman" (194), "use I gave credence" (280),
"all bag in front" (260).
- **Fable 89, *The Æthiop***, rests on a racist premise, that a black servant's colour is dirt to be
scrubbed off. Its predicament keeps only the transplantable turn: trying to scrub away someone's
nature, and hurting them. It is unassigned.
- **Etiologies are not situations.** *The Goods and the Ills* (250), *The Lark Burying Her Father*
(263), *The Man, the Horse, the Ox, and the Dog* (203) and *The Two Bags* (260) explain how
something came to be. Their predicaments are strained, and three of the four are unassigned.
- **G11 is the loosest large group** (18 fables). It holds every doubtful partner, from the companion
who flees a bear to the boastful suitor, joined only by the question "can I count on them?".
- **Standing is judged per fable** from the predicament's "you", not from the animal. So the lion in
*The Lion and the Mouse* ranks high because the predicament puts the player in the lion's place.
The Lorimer advice-book pilot running alongside this one was not read. The two results are
independent.
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,47 @@
[
{"chunk": 0, "story": 0, "summary": "A lion spares a mouse who begs for its life, and later the mouse gnaws through the hunters' ropes that bind the lion.", "predicament": "Someone far beneath you whom you could crush begs to be let off and swears they will repay you one day.", "moral": null},
{"chunk": 1, "story": 1, "summary": "A wolf invents one charge after another against a lamb, and when each is refuted eats him anyway.", "predicament": "Someone powerful who has already decided to ruin you keeps inventing charges, and each answer you give changes nothing.", "moral": "The tyrant will always find a pretext for his tyranny."},
{"chunk": 2, "story": 2, "summary": "An ass envies the grasshoppers' song, tries to live on dew as they claim to, and starves.", "predicament": "You admire a colleague's talent so much that you copy their habits, though what feeds them will not feed you.", "moral": null},
{"chunk": 3, "story": 3, "summary": "A crane pulls a bone from a wolf's throat and, asking for her fee, is told that keeping her head is payment enough.", "predicament": "You did risky work for someone ruthless on a promise of payment, and now they say escaping unharmed is your fee.", "moral": "In serving the wicked, expect no reward, and be thankful if you escape injury for your pains."},
{"chunk": 4, "story": 4, "summary": "A father shows his quarrelling sons that a bundle of sticks cannot be broken though each stick alone snaps easily.", "predicament": "The people under you quarrel constantly among themselves, and you must make them see that divided they are easy prey.", "moral": null},
{"chunk": 5, "story": 5, "summary": "A bat caught by two weasels claims to be a mouse to one and a bird to the other, and escapes both.", "predicament": "Two hostile powers each catch you in turn, and you could save yourself by claiming to be whatever each one tolerates.", "moral": "It is wise to turn circumstances to good account."},
{"chunk": 6, "story": 6, "summary": "A cock scratching for food finds a jewel and says one grain of barley would be worth more to him.", "predicament": "Something others would prize highly has fallen into your hands, but it is of no use to you in your present need.", "moral": null},
{"chunk": 7, "story": 7, "summary": "A swallow and a crow argue over plumage, and the crow says his feathers at least last through the winter.", "predicament": "A showy colleague belittles you, and you must decide whether to argue looks or point to what lasts when times turn hard.", "moral": "Fair weather friends are not worth much."},
{"chunk": 8, "story": 8, "summary": "A just lion king proclaims peace between strong and weak beasts, and the hare, praising it, runs for his life.", "predicament": "A new leader declares that the weak will now stand safely beside the strong, and you are one of the weak.", "moral": null},
{"chunk": 9, "story": 9, "summary": "A traveller scolds his dog for dawdling, and the dog replies that he is ready and waiting on his master.", "predicament": "Someone above you blames you for the delay, when in fact you have long been ready and are waiting on them.", "moral": "The loiterer often blames delay on his more active friend."},
{"chunk": 10, "story": 10, "summary": "A starving grasshopper who sang all summer begs food of the ants, who mock him for not saving.", "predicament": "Someone who idled while you worked and saved now comes to you hungry, asking you to share what you stored.", "moral": null},
{"chunk": 11, "story": 11, "summary": "A hare mocks a tortoise's pace, sleeps during their race, and loses to her steady plodding.", "predicament": "Someone gifted mocks your slowness and accepts your challenge, sure they can win without really trying.", "moral": "Slow but steady wins the race."},
{"chunk": 12, "story": 12, "summary": "A charcoal-burner invites a fuller to share his house to save costs, and the fuller refuses because he would blacken all his work.", "predicament": "A friend proposes sharing premises to save money, but the way they work would undo everything you do.", "moral": "Like will draw like."},
{"chunk": 13, "story": 13, "summary": "A boy catching locusts reaches for a scorpion, which warns him he would have lost everything had he touched it.", "predicament": "You have been collecting easy wins, and the next thing you are about to grab looks like the others but is dangerous.", "moral": null},
{"chunk": 14, "story": 14, "summary": "A fisherman pipes to the fish in vain, then casts his net and scolds them for dancing only now.", "predicament": "You have waited in vain for people to come round of their own accord, and could stop coaxing and use the tool you have.", "moral": null},
{"chunk": 15, "story": 15, "summary": "A dog carrying meat snaps at his reflection's larger piece and loses his own.", "predicament": "You already hold something good, and a bigger prize that may not be real tempts you to let go of it.", "moral": null},
{"chunk": 16, "story": 16, "summary": "A carter whose wagon is stuck calls on Hercules, who tells him to put his shoulder to the wheel first.", "predicament": "Your work is stuck, and you are waiting for someone powerful to rescue you instead of putting your own effort into it.", "moral": "Self-help is the best help."},
{"chunk": 17, "story": 17, "summary": "A blind young mole insists he can see, and his mother's test shows he cannot even smell.", "predicament": "A young person insists they have a skill they plainly lack, and you must decide how to show them without crushing them.", "moral": null},
{"chunk": 18, "story": 18, "summary": "A herdsman vows an offering to find his calf's thief, then finds a lion eating it and vows more to escape.", "predicament": "You swore to track down whoever took from you, and have just found out the culprit is far more dangerous than you.", "moral": null},
{"chunk": 19, "story": 19, "summary": "A fawn asks why his mother, bigger and armed, flees from hounds, and she admits she simply cannot help it.", "predicament": "You have every advantage over the one who frightens you, and still you cannot bring yourself to stand your ground.", "moral": "No arguments will give courage to the coward."},
{"chunk": 20, "story": 20, "summary": "A fox betrays his partner the ass to a lion in return for his own safety, and the lion takes them both.", "predicament": "Danger threatens you and a partner, and someone powerful offers to spare you if you hand your partner over.", "moral": null},
{"chunk": 21, "story": 21, "summary": "Flies gorge on spilt honey, stick fast in it and die lamenting their greed.", "predicament": "An easy pleasure is spread out in front of you, and the longer you indulge the harder it will be to get free.", "moral": "Pleasure bought with pains, hurts."},
{"chunk": 22, "story": 22, "summary": "The beasts ask the lioness how many young she bears, and she says only one, but that one a lion.", "predicament": "Others boast of how much they produce and demand to know your numbers, when you produce little but of real quality.", "moral": "The value is in the worth, not in the number."},
{"chunk": 23, "story": 23, "summary": "A farmer warms a frozen snake in his bosom, and it revives and bites him fatally.", "predicament": "Someone known for treachery is down and helpless, and you could take them in and nurse them back to strength.", "moral": "The greatest kindness will not bind the ungrateful."},
{"chunk": 24, "story": 24, "summary": "A man points to a statue of a man strangling a lion, and the lion says a lion would have carved it the other way.", "predicament": "In a dispute over who is stronger, your rival points to evidence that was produced entirely by their own side.", "moral": "One story is good, till another is told."},
{"chunk": 25, "story": 25, "summary": "A bramble tells a pomegranate and an apple tree to stop disputing which is more beautiful in its presence.", "predicament": "Two respected colleagues argue over who is the best, and someone who counts for nothing loudly sets themselves up as judge.", "moral": null},
{"chunk": 26, "story": 26, "summary": "A stork caught in a net with thieving cranes pleads his good character, but the farmer kills him with them.", "predicament": "You are caught alongside people who were doing wrong, and your good character counts for nothing because of the company you kept.", "moral": "Birds of a feather flock together."},
{"chunk": 27, "story": 27, "summary": "A mountain groans as if in labour, crowds gather in dread, and out comes a mouse.", "predicament": "Someone has made a huge commotion about what they are about to produce, and everyone is gathered waiting for the result.", "moral": "Don’t make much ado about nothing."},
{"chunk": 28, "story": 28, "summary": "A bear boasts he loves men so much he never touches their dead, and a fox wishes he spared the living instead.", "predicament": "Someone boasts of their kindness in a way that costs them nothing, while they keep harming those who are still around.", "moral": null},
{"chunk": 29, "story": 29, "summary": "A tortoise begs an eagle to teach her to fly, promising riches, and is dropped and dashed to pieces.", "predicament": "You long for a role quite beyond your nature, and someone offers to lift you into it if you pay well.", "moral": "If men had all they wished, they would be often ruined."},
{"chunk": 30, "story": 30, "summary": "A fox trapped in a well praises the water to a goat, climbs out on the goat's back, and leaves him there.", "predicament": "Someone already in trouble urges you to join them in a venture, praising it highly, and you have not checked the way out.", "moral": "Look before you leap."},
{"chunk": 31, "story": 31, "summary": "A raven envies a swan's whiteness, moves to the lakes to wash, and starves without changing colour.", "predicament": "You envy a colleague's standing and give up the work that feeds you to copy their habits, hoping to become like them.", "moral": "Change of habit cannot alter Nature."},
{"chunk": 32, "story": 32, "summary": "A thirsty pigeon flies at a painted goblet on a signboard and breaks her wings.", "predicament": "You badly need something, and what looks like it has just appeared, so you rush at it without checking that it is real.", "moral": "Zeal should not outrun discretion."},
{"chunk": 33, "story": 33, "summary": "A dog lying in a manger snaps at the oxen to stop them eating hay he cannot eat himself.", "predicament": "Something you cannot use yourself sits under your control, and the people who need it are waiting for you to let them have it.", "moral": null},
{"chunk": 34, "story": 34, "summary": "Oxen hauling a wagon rebuke the creaking axles for complaining when it is the oxen doing the work.", "predicament": "You carry the heaviest share of the work in silence, while someone who does far less complains loudly about the strain.", "moral": "Those who suffer most cry out the least."},
{"chunk": 35, "story": 35, "summary": "Cranes learn a farmer's sling is only for show and ignore it, until he loads it with stones and kills many.", "predicament": "Someone in charge has threatened you many times without following through, and you have started to ignore the threats.", "moral": "If words suffice not, blows must follow."},
{"chunk": 36, "story": 36, "summary": "An old lion feigns sickness and eats his visitors, until the fox notices tracks going in and none coming out.", "predicament": "A powerful person asks you to come in close to talk, and you notice that others who went in never came back.", "moral": "He is wise who is warned by the misfortunes of others."},
{"chunk": 37, "story": 37, "summary": "One traveller climbs a tree and leaves his friend to face a bear, and the friend later says the bear warned him against such companions.", "predicament": "When trouble struck, your companion saved themselves and left you to face it alone, and now they joke about it.", "moral": "Misfortune tests the sincerity of friends."},
{"chunk": 38, "story": 38, "summary": "A fox who lost his tail urges all the other foxes to cut theirs off, and one sees through him.", "predicament": "Someone who has suffered a loss urges everyone to give up the same thing, claiming it is an improvement for all.", "moral": null},
{"chunk": 39, "story": 39, "summary": "A cat accuses a cock of crowing at night to justify eating him, and eats him despite his defence.", "predicament": "Someone with power over you has already decided to be rid of you and is only looking for a respectable excuse.", "moral": null},
{"chunk": 40, "story": 40, "summary": "A wolf disguised in a sheep's skin is shut in the fold and killed by the shepherd who takes him for mutton.", "predicament": "You have disguised yourself as one of the harmless crowd to get what you want, and now you are treated exactly like them.", "moral": "Harm seek, harm find."},
{"chunk": 41, "story": 41, "summary": "A goatherd breaks a stray goat's horn with a stone and begs it not to tell his master, and the goat says the horn will speak.", "predicament": "You have damaged something in your care and ask a witness to keep quiet, but the damage itself will be plain to see.", "moral": "Do not attempt to hide things which cannot be hid."},
{"chunk": 42, "story": 42, "summary": "A returned traveller boasts of a great leap made abroad, and a bystander tells him to leap it here.", "predicament": "You have been boasting of a feat done far away with witnesses, and someone asks you to do it again right here.", "moral": null},
{"chunk": 43, "story": 43, "summary": "A woodcutter agrees to let a lion court his daughter if he gives up his teeth and claws, then drives him off.", "predicament": "Someone you fear demands something you cannot refuse outright, so you set a condition that will leave them harmless.", "moral": null},
{"chunk": 44, "story": 44, "summary": "A miser's buried gold is stolen, and a neighbour tells him a stone in the hole would serve him just as well.", "predicament": "Wealth you hoarded and never used has been taken from you, and someone points out you were no poorer before.", "moral": null}
]
@@ -0,0 +1,49 @@
[
{"chunk": 45, "story": 45, "summary": "A pig squeals when the shepherd seizes him, and tells the complaining sheep and goat that they are handled for wool and milk but he for his life.", "predicament": "Colleagues who are only ever asked for small things scold you for resisting, when what is demanded of you is everything.", "moral": null},
{"chunk": 46, "story": 46, "summary": "A boy grasps so many filberts that he cannot pull his hand out of the pitcher, and is told to take half.", "predicament": "You have grabbed so much at once that you cannot get any of it out, and letting go of half feels like losing.", "moral": "Do not attempt too much at once."},
{"chunk": 47, "story": 47, "summary": "Frogs ask Jupiter for a king, scorn the log and the eel he sends, and are given a heron who eats them.", "predicament": "Your group keeps complaining that its mild leader is too weak and demanding a stronger one from above.", "moral": null},
{"chunk": 48, "story": 48, "summary": "A father who maimed the snake that killed his son offers it peace, and the snake says neither can ever forget.", "predicament": "You and someone you hurt, and who hurt you far worse, both have reason to hate, and you now offer to make peace.", "moral": "No one truly forgets injuries in the presence of him who caused the injury."},
{"chunk": 49, "story": 49, "summary": "A lion woken by a mouse searches his den in fury, and tells a mocking fox it is the mouse's cheek, not the mouse, he resents.", "predicament": "Someone far beneath you has taken a small liberty, and a bystander mocks you for making so much of it.", "moral": "Little liberties are great offenses."},
{"chunk": 50, "story": 50, "summary": "A groom curries his horse all day but sells its oats, and the horse asks to be groomed less and fed more.", "predicament": "Someone responsible for you makes a great show of looking after you while quietly skimming off what you actually need.", "moral": null},
{"chunk": 51, "story": 51, "summary": "A mule refuses to take a little of the struggling ass's load, the ass dies, and the mule must carry all of it and the ass's hide.", "predicament": "A partner struggling under their share asks you to take a little of it, and you could say it is not your job.", "moral": null},
{"chunk": 52, "story": 52, "summary": "An ass envious of the petted lapdog bursts into the house to fawn on his master and is beaten back to the stable.", "predicament": "You work hard while a charming favourite is pampered for doing little, and you are tempted to try the favourite's tricks.", "moral": null},
{"chunk": 53, "story": 53, "summary": "Oxen plot to kill the butchers, but an old ox warns that clumsier ones would replace them.", "predicament": "Your group is set on getting rid of the people who harm it, and you suspect whoever replaces them will be worse.", "moral": "Do not be in a hurry to change one evil for another."},
{"chunk": 54, "story": 54, "summary": "A shepherd boy raises false alarms of a wolf for fun, and when the wolf truly comes nobody answers his cry.", "predicament": "You have raised false alarms before to amuse yourself, and now there is a real crisis and you need everyone to believe you.", "moral": "There is no believing a liar, even when he speaks the truth."},
{"chunk": 55, "story": 55, "summary": "Boys pelting frogs for fun are told by one frog that their sport is death to the frogs.", "predicament": "People above you are amusing themselves at your expense, and what is a game to them is ruin to you.", "moral": null},
{"chunk": 56, "story": 56, "summary": "An ass who lightened his salt load by falling in a stream tries the trick with sponges and doubles his burden.", "predicament": "A shortcut that once lightened your load has been noticed, and you are tempted to try it again.", "moral": null},
{"chunk": 57, "story": 57, "summary": "A biting dog made to wear a warning bell struts proudly with it until an old hound tells him it is a mark of disgrace.", "predicament": "You have been singled out with a mark you take for an honour, and an old hand tells you it is a public warning.", "moral": "Notoriety is often mistaken for fame."},
{"chunk": 58, "story": 58, "summary": "A goatherd feeds stray wild goats better than his own to win them, and they leave, reasoning he would do the same to them.", "predicament": "Someone courting you treats you better than the people who have served them for years, and you wonder what that means for you.", "moral": "Old friends cannot with impunity be sacrificed for new ones."},
{"chunk": 59, "story": 59, "summary": "A greying man courts a young and an old woman, who between them pluck out all his hair.", "predicament": "You are courting two parties who want opposite things from you, and each is quietly remaking you to suit themselves.", "moral": "Those who seek to please everybody please nobody."},
{"chunk": 60, "story": 60, "summary": "A sick stag's many visitors each eat some of his food, so he dies of want rather than illness.", "predicament": "While you are laid low, a stream of well-wishers visits, and each helps themselves to a little of what you need.", "moral": "Evil companions bring more hurt than profit."},
{"chunk": 61, "story": 61, "summary": "A boy stung after touching a nettle gently is told by his mother to grasp it boldly next time.", "predicament": "You approached a prickly problem timidly and got hurt, and someone tells you only a bold, firm grip will work.", "moral": "Whatever you do, do with all your might."},
{"chunk": 62, "story": 62, "summary": "An astronomer gazing at the stars falls into a well, and a neighbour asks why he cannot see what is on earth.", "predicament": "You have been so absorbed in lofty plans that you have fallen into trouble right in front of you, and must call for help.", "moral": null},
{"chunk": 63, "story": 63, "summary": "Wolves persuade the sheep to send away their guard dogs for peace, and then devour the unguarded flock.", "predicament": "Your enemies offer peace if only you dismiss the people who protect you, claiming those protectors are the cause of all trouble.", "moral": null},
{"chunk": 64, "story": 64, "summary": "A cat disguised as a doctor offers to treat ailing birds, who say they will stay well if he goes away.", "predicament": "Someone known to prey on people like you arrives dressed as a helper, offering to fix your troubles if you let them in.", "moral": null},
{"chunk": 65, "story": 65, "summary": "A jackdaw decks himself in others' fallen feathers to be chosen king, and the birds pluck them back.", "predicament": "You are presenting yourself for a top post decked out in achievements borrowed from colleagues, who are about to see it.", "moral": null},
{"chunk": 66, "story": 66, "summary": "A kid on a rooftop taunts a passing wolf, who says it is the roof that mocks him.", "predicament": "You are safely out of reach of someone powerful for the moment, and it is tempting to taunt them while you can.", "moral": "Time and place often give the advantage to the weak over the strong."},
{"chunk": 67, "story": 67, "summary": "A doctor robs a blind old woman while treating her, and when he sues for his fee she says she still cannot see her goods.", "predicament": "Someone you hired has been quietly robbing you while doing the job, and now demands full payment under your agreement.", "moral": null},
{"chunk": 68, "story": 68, "summary": "A mother frog puffs herself up to match the ox that killed her son, and is told she would burst first.", "predicament": "Someone far bigger has crushed one of yours, and you are tempted to puff yourself up to look their equal.", "moral": null},
{"chunk": 69, "story": 69, "summary": "A dying farmer tells his sons treasure lies in the vineyard, and their digging brings a great harvest.", "predicament": "You want those who will take over from you to work as hard as you did, and plain advice will not move them.", "moral": null},
{"chunk": 70, "story": 70, "summary": "A heifer mocks a working ox for his labour and is then led off to be sacrificed while the ox is freed.", "predicament": "An idle favourite mocks you for how hard you work, not seeing why they have been kept free of work.", "moral": null},
{"chunk": 71, "story": 71, "summary": "A victorious cock crows on a wall and is carried off by an eagle, leaving the beaten cock to rule.", "predicament": "You have just beaten your rival, and it is tempting to boast about it from the most exposed place you can find.", "moral": "Pride goes before destruction."},
{"chunk": 72, "story": 72, "summary": "An old warhorse sent to work a mill laments his former glory, and the miller tells him fortune rises and falls.", "predicament": "Age has moved you from a proud post to drudgery, and you keep bemoaning what you had to whoever will listen.", "moral": null},
{"chunk": 73, "story": 73, "summary": "A jealous fox leads the newly elected monkey king into a trap, then mocks him as unfit to rule.", "predicament": "You have just been raised to a high post, and a jealous colleague brings you a tempting windfall they say they kept for you.", "moral": null},
{"chunk": 74, "story": 74, "summary": "A soldier pampers his horse in war, drudges it in peace, and finds it cannot carry him when war returns.", "predicament": "Someone valued you highly in a crisis, worked you into the ground when it passed, and now needs you at your best again.", "moral": null},
{"chunk": 75, "story": 75, "summary": "The limbs rebel against the idle-seeming belly and stop feeding it, and the whole body weakens.", "predicament": "You and your fellow workers resent a part of the organisation that seems to do nothing, and are tempted to stop supplying it.", "moral": null},
{"chunk": 76, "story": 76, "summary": "Maids kill the cock that wakes their mistress early, and she wakes them even earlier.", "predicament": "Your boss works you too early and too long, and you could get rid of the thing that sets the pace.", "moral": null},
{"chunk": 77, "story": 77, "summary": "A vine cropped by a goat says she will provide the wine poured over him at his sacrifice.", "predicament": "Someone is stripping you bare without cause, and you know that in time you will have a hand in their downfall.", "moral": null},
{"chunk": 78, "story": 78, "summary": "A monkey presents her ugly baby for the beauty prize and, laughed at, says he is the most beautiful to her.", "predicament": "You have put forward work of your own that everyone laughs at, and you are sure it is the best there is.", "moral": null},
{"chunk": 79, "story": 79, "summary": "Pigeons invite a hawk to protect them from a kite, and he kills more of them in a day than the kite did in a year.", "predicament": "Threatened by one predator, your group is ready to invite a powerful protector inside who may prove far worse.", "moral": "Avoid a remedy that is worse than the disease."},
{"chunk": 80, "story": 80, "summary": "A sprat offers to reconcile warring dolphins and whales, who say they would rather be destroyed than accept him.", "predicament": "Two powerful factions are at war, and you, a nobody, offer to step in and settle their quarrel.", "moral": null},
{"chunk": 81, "story": 81, "summary": "A swallow nests in the wall of a court of justice, and her young are eaten by a serpent there.", "predicament": "You trusted the one place meant to protect everyone's rights, and it is exactly there that you have been wronged.", "moral": null},
{"chunk": 82, "story": 82, "summary": "An earthen pot floating downstream begs a brass pot to keep away, since any touch would break her.", "predicament": "Someone much stronger than you wants to travel alongside you, and even friendly contact could break you.", "moral": "Equals make the best friends."},
{"chunk": 83, "story": 83, "summary": "A shepherd raises a wolf cub to steal lambs from neighbours, and it warns him to watch his own flock.", "predicament": "You have trained someone to take advantage of others for you, and they have just hinted they could do the same to you.", "moral": null},
{"chunk": 84, "story": 84, "summary": "A crab tells her son to walk straight, and he asks her to show him how.", "predicament": "You are correcting a junior for a fault you plainly share, and they ask you to demonstrate the right way.", "moral": "Example is more powerful than precept."},
{"chunk": 85, "story": 85, "summary": "A father's two daughters, married to a gardener and a tile-maker, wish for rain and for sun, and he cannot back both.", "predicament": "Two people you care for equally need opposite outcomes, and whichever you support you will be working against the other.", "moral": null},
{"chunk": 86, "story": 86, "summary": "A mother praises her son's first small thefts, and on his way to execution he bites her ear for not stopping him.", "predicament": "Someone in your charge has brought you a small ill-gotten gain, and you could praise it or stop it now.", "moral": null},
{"chunk": 87, "story": 87, "summary": "A weary old woodcutter calls for Death, and when Death comes asks only for help lifting his load.", "predicament": "Worn out, you have loudly wished to be done with it all, and now the chance to quit is actually offered.", "moral": null},
{"chunk": 88, "story": 88, "summary": "A fir scorns a useless bramble, which reminds it of the axes waiting to fell the useful.", "predicament": "Someone important sneers that you are of no use, and you know their usefulness is exactly what marks them to be cut down.", "moral": "Better poverty without care, than riches with."},
{"chunk": 89, "story": 89, "summary": "A buyer of a black servant, thinking his colour is dirt, scrubs him incessantly and only gives him a cold.", "predicament": "You have taken someone on convinced that their nature is a fault you can scrub away, and your efforts are only hurting them.", "moral": "What’s bred in the bone will stick to the flesh."},
{"chunk": 90, "story": 90, "summary": "A frog ties a mouse's foot to his own and drowns him, and a hawk carries off both.", "predicament": "A new acquaintance proposes binding your fortunes tightly together, and you would be on their ground, not yours.", "moral": "Harm hatch, harm catch."},
{"chunk": 91, "story": 91, "summary": "A fisherman's net holds the large fish, but the small ones slip back through the meshes.", "predicament": "A sweep that catches the big players lets the small ones slip away, and you are either doing the sweeping or being swept.", "moral": null}
]
@@ -0,0 +1,48 @@
[
{"chunk": 92, "story": 92, "summary": "A wounded wolf asks a passing sheep to fetch him water, and the sheep sees he would make her the meat as well.", "predicament": "Someone known to prey on people like you is laid up and asks you for a small favour that would bring you within reach.", "moral": "Hypocritical speeches are easily seen through."},
{"chunk": 93, "story": 93, "summary": "An old woman sniffs an empty wine jar and praises how fine the wine must have been.", "predicament": "Only the faint trace of someone's good work is left behind, and you find yourself still admiring what it must have been.", "moral": "The memory of a good deed lives."},
{"chunk": 94, "story": 94, "summary": "A man bitten by a dog is advised to feed the dog bread dipped in his blood, and says that would invite every dog to bite him.", "predicament": "Someone who hurt you could be soothed with a reward, and you are advised that appeasing them is the cure.", "moral": "Benefits bestowed upon the evil-disposed increase their means of injuring you."},
{"chunk": 95, "story": 95, "summary": "A huntsman and a fisherman swap their catches daily until a neighbour warns that habit will spoil the pleasure.", "predicament": "An exchange with a partner has pleased you both so much that you repeat it daily, and someone warns it will soon go stale.", "moral": "Abstain and enjoy."},
{"chunk": 96, "story": 96, "summary": "A fox flatters a crow's beauty and doubts her voice, so she caws and drops her meat to him.", "predicament": "Someone who wants what you hold praises you lavishly, then hints at one doubt you would have to prove wrong by speaking up.", "moral": null},
{"chunk": 97, "story": 97, "summary": "A poor widow shears her sheep herself to save the fee and cuts his flesh with the wool.", "predicament": "To save an expert's fee you are doing a skilled job yourself, and you are hurting the thing you meant to profit from.", "moral": "The least outlay is not always the greatest gain."},
{"chunk": 98, "story": 98, "summary": "An ass dances on the roof and is beaten, protesting that everyone laughed when the monkey did it.", "predicament": "You copied a favourite's antics that everyone applauded, and are being punished for exactly what they were praised for.", "moral": null},
{"chunk": 99, "story": 99, "summary": "A hunted stag hides in an ox-stall, escapes the servants' notice, and is found by the sharp-eyed master.", "predicament": "You are hiding from trouble in a place you should not be, the careless have passed you by, and the sharp-eyed boss is coming.", "moral": null},
{"chunk": 100, "story": 100, "summary": "A hound complains that the housedog feasts on his catch, and the housedog tells him to blame the master who taught him so.", "predicament": "You do the hard work while a colleague enjoys its rewards, and they say the fault lies with the boss who arranged it.", "moral": "Children are not to be blamed for the faults of their parents."},
{"chunk": 101, "story": 101, "summary": "A lion and a wild ass hunt together, and the lion takes all three shares by rank, partnership and threat.", "predicament": "You went into a venture with a far more powerful partner, and now they are dividing the proceeds entirely their own way.", "moral": "Might makes right."},
{"chunk": 102, "story": 102, "summary": "A lion allies with a dolphin, and when the dolphin cannot come ashore to help him fight, calls him a traitor.", "predicament": "An impressive ally from another field swore friendship with you, and now you need help they have no means to give.", "moral": null},
{"chunk": 103, "story": 103, "summary": "An eagle is mortally shot with an arrow fledged with his own feathers.", "predicament": "You are being brought down by a rival who is using the very tools, ideas or people you supplied them.", "moral": null},
{"chunk": 104, "story": 104, "summary": "A dying kite asks his mother to pray for him, and she asks which god he has not robbed.", "predicament": "In your hour of need you look for someone to speak up for you, and realise you have cheated everyone who could.", "moral": "We must make friends in prosperity if we would have their help in adversity."},
{"chunk": 105, "story": 105, "summary": "A lion and a boar fighting over a well see vultures waiting and make peace.", "predicament": "You and a rival are fighting over something small, and you notice others waiting to pick over whoever loses.", "moral": null},
{"chunk": 106, "story": 106, "summary": "The mice agree to bell the cat, but none will volunteer to do it.", "predicament": "Everyone agrees a clever plan to deal with the danger, and the only question left is who will risk carrying it out.", "moral": null},
{"chunk": 107, "story": 107, "summary": "A one-eyed doe watches the land and is shot from the sea she thought safe.", "predicament": "You have guarded carefully against the threat you expect, and turned your back entirely on the side you assume is safe.", "moral": null},
{"chunk": 108, "story": 108, "summary": "Mice appoint generals who wear conspicuous plumes, and in the rout the generals cannot fit into their holes and are eaten.", "predicament": "You have been promoted and given marks of rank, and when things go wrong those marks may be exactly what trap you.", "moral": "The more honour the more danger."},
{"chunk": 109, "story": 109, "summary": "A shepherd sells his flock to trade dates by sea, loses all in a storm, and later sneers that the calm sea wants more dates.", "predicament": "A calm opening tempts you to sell what you have and stake it all on a trade you do not know.", "moral": null},
{"chunk": 110, "story": 110, "summary": "An ass sees a lion flee at a cock's crow, chases the lion himself, and is torn apart.", "predicament": "You saw someone powerful back down before another person, and are tempted to think they will back down before you too.", "moral": "False confidence often leads into danger."},
{"chunk": 111, "story": 111, "summary": "The rivers complain the sea makes them salty, and the sea tells them to stop flowing into it.", "predicament": "People who keep choosing to join you complain that you change them, and are trying to lay the blame on you.", "moral": null},
{"chunk": 112, "story": 112, "summary": "A boar whets his tusks with no enemy in sight, saying there is no time to sharpen them once attacked.", "predicament": "Things are quiet with no threat in sight, and someone asks why you are spending effort preparing for trouble.", "moral": "To be well prepared for war is the best guarantee of peace."},
{"chunk": 113, "story": 113, "summary": "A milkmaid counts the future profits of her milk, tosses her head at imagined suitors, and spills the pail.", "predicament": "You are carrying your only real asset while already spending, in your head, everything you hope it will turn into.", "moral": null},
{"chunk": 114, "story": 114, "summary": "A bee asks Jupiter for a deadly sting, and gets one that kills her if she uses it.", "predicament": "A powerful patron has promised you any favour, and you are tempted to ask for the power to punish anyone touching what is yours.", "moral": "Evil wishes, like chickens, come home to roost."},
{"chunk": 115, "story": 115, "summary": "A lean wolf admires a well-fed dog until he sees the heavy collar and log, and wants none of it.", "predicament": "A well-fed insider shows you how comfortably their employer keeps them, and you notice the chain they wear for it.", "moral": null},
{"chunk": 116, "story": 116, "summary": "A besieged city asks how to defend itself, and the bricklayer, carpenter and currier each propose their own trade.", "predicament": "In a crisis everyone is asked for the best solution, and each expert recommends exactly what they happen to sell.", "moral": "Every man for himself."},
{"chunk": 117, "story": 117, "summary": "An ass carrying a sacred image thinks the crowd bows to him and balks, until the driver's whip corrects him.", "predicament": "People bow as you pass, and you are tempted to believe it is for you rather than for what you happen to carry.", "moral": "They are not wise who give to themselves the credit due to others."},
{"chunk": 118, "story": 118, "summary": "A storm-bound man kills his sheep, goats and then his oxen, and his dogs flee reasoning they are next.", "predicament": "In hard times your employer has sacrificed even the people who earn for them, and you wonder how long before it is you.", "moral": "He is not to be trusted as a friend who mistreats his own family."},
{"chunk": 119, "story": 119, "summary": "An old hound loses his grip on a boar and, abused by his master, asks to be praised for what he was.", "predicament": "Age has cost you the ability you were known for, and your boss is berating you for failing at it.", "moral": null},
{"chunk": 120, "story": 120, "summary": "A traveller says 'I' found the axe but 'we' are undone when the owner comes, and his companion holds him to 'I'.", "predicament": "A companion kept a find to themselves, and now that it has brought trouble they want you to share the blame.", "moral": "He who shares the danger ought to share the prize."},
{"chunk": 121, "story": 121, "summary": "A dying old lion is struck by the boar and the bull, and then kicked by the ass.", "predicament": "Once powerful, you are now weak, and even the least of those you once ruled are lining up to strike at you.", "moral": null},
{"chunk": 122, "story": 122, "summary": "A wolf sees shepherds eating mutton and remarks on the outcry there would be if he did the same.", "predicament": "The people who condemn you for something are openly doing the very same thing themselves.", "moral": null},
{"chunk": 123, "story": 123, "summary": "Travellers wait for what they think is a ship, and it turns out to be a bundle of sticks.", "predicament": "You have waited a long while for something that looked grand from far away, and it is shrinking as it comes closer.", "moral": "Our mere anticipations of life outrun its realities."},
{"chunk": 124, "story": 124, "summary": "A traveller and the ass's owner fight over who hired the ass's shadow, and the ass runs off.", "predicament": "You and a client are locked in a bitter dispute over a technicality while the thing you both needed slips away.", "moral": "In quarreling about the shadow we often lose the substance."},
{"chunk": 125, "story": 125, "summary": "An overworked ass keeps asking for a new master and each is worse, ending with a tanner.", "predicament": "You are unhappy with your boss and could ask for a transfer, though you have asked before and each move was worse.", "moral": null},
{"chunk": 126, "story": 126, "summary": "Mercury in disguise asks a sculptor the price of his own statue, expecting it to be highest, and is offered it free.", "predicament": "You go incognito to find out how highly people rate you, expecting to hear you are the most valued of all.", "moral": null},
{"chunk": 127, "story": 127, "summary": "A woodcutter hides a fox but points to it while denying it, and the fox leaves without thanks.", "predicament": "Someone claims you owe them for protecting you, when their words protected you and their gestures quietly gave you away.", "moral": null},
{"chunk": 128, "story": 128, "summary": "An uprooted oak asks the reeds how they survive the wind, and they say they bend rather than fight.", "predicament": "A force far stronger than you is sweeping through, and you could stand rigid against it or bend until it passes.", "moral": "Stoop to conquer."},
{"chunk": 129, "story": 129, "summary": "A farmer shuts a lion in his farmyard, loses his flocks, and has to let it go.", "predicament": "You have a chance to trap someone far more dangerous than you, but you would be locked in with them.", "moral": null},
{"chunk": 130, "story": 130, "summary": "A lion takes a stolen lamb from a wolf, who protests the injustice, and the lion jeers at his claim.", "predicament": "Someone stronger has taken from you something you had taken dishonestly yourself, and you want to protest.", "moral": null},
{"chunk": 131, "story": 131, "summary": "A birdcatcher spares his decoy partridge and his cock after each pleads usefulness, but still must feed his guest.", "predicament": "Your boss needs to cut someone and you plead how useful you are, but the need is pressing and must be met somehow.", "moral": "Necessity knows no law."},
{"chunk": 132, "story": 132, "summary": "A dove saves a drowning ant with a leaf, and the ant later stings a birdcatcher to save the dove.", "predicament": "Someone you once helped for nothing sees a threat to you coming that you cannot see, and has a chance to repay you.", "moral": null},
{"chunk": 133, "story": 133, "summary": "Despairing hares rush to drown themselves, see frogs flee from them, and take heart.", "predicament": "You feel so weak and harried that you are ready to give up entirely, and then notice others who fear even you.", "moral": null},
{"chunk": 134, "story": 134, "summary": "A monkey copies the fishermen's netting, gets tangled and drowns.", "predicament": "You have watched experts do a job and are about to try it yourself with their tools, having never learned how.", "moral": null},
{"chunk": 135, "story": 135, "summary": "A swan seized by mistake for the goose sings and is known and spared.", "predicament": "In the dark you have been mistaken for someone marked to be cut, and only showing your one real talent will set it right.", "moral": null},
{"chunk": 136, "story": 136, "summary": "A doe escaping hunters takes refuge in a lion's cave and is killed there.", "predicament": "Fleeing one danger, you are about to take shelter with someone who may be far more dangerous than what chases you.", "moral": "In avoiding one evil, care must be taken not to fall into another."},
{"chunk": 137, "story": 137, "summary": "A fisherman refuses to release a small fish that promises to be worth more when grown.", "predicament": "Someone you have caught asks you to let them go now, promising you a much bigger return later.", "moral": null}
]
@@ -0,0 +1,49 @@
[
{"chunk": 138, "story": 138, "summary": "A timid hunter asks a woodman for the lion's tracks and, offered the lion itself, says he only wanted the tracks.", "predicament": "You have talked boldly about tackling a formidable opponent, and someone offers to take you to face them right now.", "moral": "The hero is brave in deeds as well as words."},
{"chunk": 139, "story": 139, "summary": "A fox gorges on food left in a hollow tree and is too swollen to get out.", "predicament": "You helped yourself so freely to what was lying unguarded that you can no longer get out of the position it put you in.", "moral": null},
{"chunk": 140, "story": 140, "summary": "Two frogs seeking a new home find a deep well, and one asks how they would get out if it dried up.", "predicament": "You and a partner must move, and an attractive opening has appeared that would be very hard to leave if it failed.", "moral": "Do nothing without a regard to the consequences."},
{"chunk": 141, "story": 141, "summary": "A flaring lamp boasts it outshines the sun and is blown out by a gust.", "predicament": "You are shining brightly just now and are tempted to claim you outshine the people who truly lead.", "moral": null},
{"chunk": 142, "story": 142, "summary": "A camel-driver asks his camel whether it would rather go uphill or down, and the camel asks whether the level road is closed.", "predicament": "Your boss offers you a choice between two hard assignments, as if the easy option you both know exists were not there.", "moral": null},
{"chunk": 143, "story": 143, "summary": "A miller and his son change how they travel with their ass at every passer-by's criticism until they lose the ass in the river.", "predicament": "Every passer-by criticises how you are doing the job, and each time you change it to please them, a new critic appears.", "moral": null},
{"chunk": 144, "story": 144, "summary": "A cat pretends to be dead on a peg to lure the mice, and one says it will not come near her even if she turns into a sack.", "predicament": "Someone who has already done you harm now appears harmless, even lifeless, and is plainly waiting for you to come out.", "moral": null},
{"chunk": 145, "story": 145, "summary": "A mouse bites a bull, hides in its hole, and bites him again while he sleeps.", "predicament": "Someone powerful is furious with you but cannot reach you where you are safe, and you could sting them again.", "moral": null},
{"chunk": 146, "story": 146, "summary": "A dog invited by a friend to his master's feast is thrown out by the cook and pretends he was too drunk to remember.", "predicament": "An insider invited you to help yourself at their employer's expense, and you were thrown out and must explain it to your peers.", "moral": null},
{"chunk": 147, "story": 147, "summary": "Thieves steal a cock who pleads he wakes men to work, and they say that is why he must die.", "predicament": "You plead your usefulness to people you have fallen among, not seeing that your usefulness is exactly what they cannot stand.", "moral": "The safeguards of virtue are hateful to those with evil intentions."},
{"chunk": 148, "story": 148, "summary": "Trained monkeys dance like courtiers until someone throws nuts and they brawl for them.", "predicament": "Your team has learned to perform with polish, and a rival is about to toss something in front of them to expose them.", "moral": null},
{"chunk": 149, "story": 149, "summary": "A farmer takes revenge on a fox by setting its tail alight, and it runs through his own wheat.", "predicament": "You finally have the person who has been robbing you at your mercy, and your revenge could easily burn your own harvest.", "moral": null},
{"chunk": 150, "story": 150, "summary": "Fortune wakes a traveller asleep on a well's brink, lest she be blamed for his fall.", "predicament": "You are careless in a dangerous spot, and if you come to grief you will blame bad luck rather than yourself.", "moral": "Everyone is more or less master of his own fate."},
{"chunk": 151, "story": 151, "summary": "A seagull bursts its gullet on too large a fish, and a kite says a bird of the air should not feed from the sea.", "predicament": "You have taken on far more than you can manage in a field that is not yours, and it is tearing you apart.", "moral": "Every man should be content to mind his own business."},
{"chunk": 152, "story": 152, "summary": "A lion and a bear fight over a kid until both are exhausted, and a fox runs off with it.", "predicament": "You and a powerful rival are exhausting each other over one prize, while someone else circles waiting to walk off with it.", "moral": "It sometimes happens that one man has all the toil, and another all the profit."},
{"chunk": 153, "story": 153, "summary": "A philosopher decrying Providence for drowning the innocent with the guilty tramples an anthill for one sting.", "predicament": "You are loudly condemning those above for punishing many for one person's fault, and you have just done the same to those below.", "moral": null},
{"chunk": 154, "story": 154, "summary": "A peasant frees an eagle, which later snatches his bundle to lure him from under a wall that then falls.", "predicament": "Someone you once freed from a trap suddenly snatches something of yours, and you are angry without knowing why they did it.", "moral": null},
{"chunk": 155, "story": 155, "summary": "A leopard and a fox dispute their beauty, and the fox says his is in the mind.", "predicament": "A colleague shows off their visible credentials one by one to prove they are the better, and you have only your wits.", "moral": null},
{"chunk": 156, "story": 156, "summary": "A lion leaves a sleeping hare to chase a hart, loses the hart, and returns to find the hare gone.", "predicament": "You have an easy win within reach, and a bigger, faster prize has just run past that you could chase instead.", "moral": null},
{"chunk": 157, "story": 157, "summary": "A poor carpenter smashes the idol that never helped him, and gold pours out of its head.", "predicament": "You have courted a patron respectfully for years with nothing to show, and anger tempts you to smash the relationship.", "moral": null},
{"chunk": 158, "story": 158, "summary": "A lion eats the ass who divided their spoil equally, and the fox, having learned, leaves himself a morsel.", "predicament": "A powerful partner asks you to divide the spoils, and you have just seen what happened to the last one who divided them fairly.", "moral": "Happy is the man who learns from the misfortunes of others."},
{"chunk": 159, "story": 159, "summary": "A bull hiding from a lion in a cave is butted by a goat, and says he will answer once the lion is gone.", "predicament": "While you are sheltering from a bigger threat, someone lesser takes the chance to attack you, knowing you cannot answer yet.", "moral": "It shows an evil disposition to take advantage of a friend in distress."},
{"chunk": 160, "story": 160, "summary": "A bald knight's wig blows off during a hunt, and he joins the laughter with a joke.", "predicament": "Something you were hiding about yourself has just been exposed in front of your companions, and everyone is laughing.", "moral": null},
{"chunk": 161, "story": 161, "summary": "The oaks complain they are always felled, and Jupiter says it is because they are so useful.", "predicament": "You complain that you are always picked for the hardest jobs, and are told it is because you are so good at them.", "moral": null},
{"chunk": 162, "story": 162, "summary": "A monkey mother smothers her favourite twin with love while the neglected one thrives.", "predicament": "You lavish all your care on one favourite protege and neglect another, and your attention may be what harms the favourite.", "moral": "The best intentions will not always ensure success."},
{"chunk": 163, "story": 163, "summary": "A hound gives up chasing a hare and, mocked, says he ran for a dinner but the hare for his life.", "predicament": "Someone mocks you for losing to a weaker rival, but they were fighting for everything and you only for a little.", "moral": null},
{"chunk": 164, "story": 164, "summary": "A shepherd is about to shut a wolf in the fold, and his dog asks how the sheep can then be safe.", "predicament": "Your boss is about to bring a known predator into the team, and you are the one placed to say so.", "moral": null},
{"chunk": 165, "story": 165, "summary": "An oak split by wedges cut from its own branches grieves more at them than at the axe.", "predicament": "You are being broken apart by people who came from your own side, and it hurts more than any outside attack.", "moral": "Misfortunes springing from ourselves are the hardest to bear."},
{"chunk": 166, "story": 166, "summary": "A snake tormented by a wasp puts its head under a wagon wheel so they die together.", "predicament": "Someone is tormenting you without pause and you cannot shake them, and you could take them down with you.", "moral": null},
{"chunk": 167, "story": 167, "summary": "A peacock mocks a plain crane's plumage, and the crane says he flies to the heavens while the peacock walks the dunghill.", "predicament": "A showy colleague mocks your plain appearance in front of others, and you could answer with what you can actually do.", "moral": "Fine feathers don’t make fine birds."},
{"chunk": 168, "story": 168, "summary": "A couple kill their hen that lays golden eggs to get the gold inside and find nothing.", "predicament": "Something steadily brings you a small, sure return, and you are tempted to break it open to get everything at once.", "moral": null},
{"chunk": 169, "story": 169, "summary": "An ass who falls in a pond groans, and the frogs ask what he would do if he lived there always.", "predicament": "You are making a great fuss about a small setback in front of people who live with far worse every day.", "moral": "Men often bear little grievances with less courage than they do large misfortunes."},
{"chunk": 170, "story": 170, "summary": "A crow jealous of the raven's standing as an omen caws at travellers, who dismiss her cry.", "predicament": "Envying a colleague whose word carries weight, you are tempted to speak up as if yours carried the same.", "moral": "Those who assume a character which does not belong to them, only make themselves ridiculous."},
{"chunk": 171, "story": 171, "summary": "The trees give a man a young ash for his axe handle, and he fells the great trees with it.", "predicament": "Someone asks your group to give up just one small, junior member, and that concession is what they need to cut down the rest.", "moral": null},
{"chunk": 172, "story": 172, "summary": "Wolves urge the sheepdogs to betray the flock and live as brothers, and then tear the dogs apart.", "predicament": "Rivals flatter you as one of their own and urge you to hand over what you guard and share the spoils with them.", "moral": null},
{"chunk": 173, "story": 173, "summary": "A lioness mourns her cub killed by a bull, and a hunter reminds her how many she has made mourn.", "predicament": "You are loudly grieving a loss, and someone reminds you how many people have suffered the same at your hands.", "moral": null},
{"chunk": 174, "story": 174, "summary": "A lion wounded by a bowman's arrow flees, saying he dare not face the man if that is his messenger.", "predicament": "An opponent's first warning shot has already hurt you badly, and an adviser urges you not to give up at the first blow.", "moral": "Be on guard against men who can strike from a distance."},
{"chunk": 175, "story": 175, "summary": "Men first flee the huge camel, then, finding it meek, bridle it and let a child drive it.", "predicament": "People who once feared you have noticed you never push back, and are growing bolder by the day.", "moral": "Use serves to overcome dread."},
{"chunk": 176, "story": 176, "summary": "A crab that moved inland to feed is eaten by a fox and blames himself for leaving the sea.", "predicament": "You left the field you are made for to chase better prospects elsewhere, and now you are exposed and out of your depth.", "moral": "Contentment with our lot is an element of happiness."},
{"chunk": 177, "story": 177, "summary": "An ass refuses to flee the enemy with his master, since any master will load him the same.", "predicament": "Your boss urges you to fight off a takeover, and you suspect any new owner would work you exactly the same.", "moral": "In a change of government the poor change nothing beyond the name of their master."},
{"chunk": 178, "story": 178, "summary": "A wounded fox refuses to have the sated flies driven off, lest hungrier ones replace them.", "predicament": "Someone offers to rid you of the people draining you, but those ones are already well fed and hungrier ones would follow.", "moral": null},
{"chunk": 179, "story": 179, "summary": "A woman doubles her hen's feed to get two eggs a day, and it grows fat and stops laying.", "predicament": "A reliable source gives you a steady return, and you are thinking of pushing extra into it to double what it produces.", "moral": null},
{"chunk": 180, "story": 180, "summary": "Kites that could once sing try to neigh like horses and lose their song.", "predicament": "You are so taken with a colleague's style that you are trying to copy it, and your own gift is starting to fade.", "moral": "The desire for imaginary benefits often involves the loss of present blessings."},
{"chunk": 181, "story": 181, "summary": "A hound alternately bites and fawns on a hare, who asks him to show his true colours.", "predicament": "Someone alternately attacks you and flatters you, and you cannot tell whether to treat them as friend or enemy.", "moral": "No one can be a friend if you know not whether to trust or distrust him."},
{"chunk": 182, "story": 182, "summary": "Hares at war with eagles ask the foxes for help, who decline knowing both sides.", "predicament": "Someone weak who has picked a fight with the powerful asks you to join their side.", "moral": "Count the cost before you commit yourselves."},
{"chunk": 183, "story": 183, "summary": "A calf offers to show a bull the way through a narrow passage, and the bull says he knew it before the calf was born.", "predicament": "A newcomer offers to show you how to do something you have been doing since before they arrived.", "moral": null},
{"chunk": 184, "story": 184, "summary": "A stag asks a sheep for a loan with the wolf as surety, and the sheep declines, doubting she could ever collect.", "predicament": "Someone asks you for a loan and offers as guarantor another person well known for taking what they want and vanishing.", "moral": "Two blacks do not make one white."}
]
@@ -0,0 +1,45 @@
[
{"chunk": 185, "story": 185, "summary": "A cat tells an eagle and a sow each that the other plans to kill her young, and both starve in fear while the cat feeds.", "predicament": "A colleague privately warns you that your neighbour is plotting against you, and you suspect they said the same to your neighbour.", "moral": null},
{"chunk": 186, "story": 186, "summary": "A huge wolf nicknamed 'Lion' leaves the wolves to live among lions, and a fox mocks his conceit.", "predicament": "Your peers jokingly call you the equal of those at the top, and you are tempted to leave them and move among the top.", "moral": null},
{"chunk": 187, "story": 187, "summary": "An idle, overfed mule boasts he is a racer's son, and after a long hard journey decides his father was an ass.", "predicament": "After an easy spell you have been boasting of your pedigree and speed, and tomorrow brings a long, hard assignment.", "moral": null},
{"chunk": 188, "story": 188, "summary": "A fortune-teller runs home on hearing his house is being robbed, and a neighbour asks why he did not foresee it.", "predicament": "You make your living advising others on what is coming, and a disaster has just struck you that you failed to foresee.", "moral": null},
{"chunk": 189, "story": 189, "summary": "A frog refuses a friend's invitation to leave his exposed gully for a safe pond and is crushed by a wagon.", "predicament": "A friend urges you to leave your familiar but exposed position for a safer one, and you cannot bring yourself to move.", "moral": "A willful man will have his way to his own hurt."},
{"chunk": 190, "story": 190, "summary": "A countryman frees an eagle from a serpent, and the eagle later knocks away the drink the serpent poisoned.", "predicament": "You stepped in to rescue someone from a dangerous enemy, and that enemy has quietly set a trap for you in return.", "moral": null},
{"chunk": 191, "story": 191, "summary": "A thirsty crow raises the water in a pitcher by dropping in stones one by one.", "predicament": "What you urgently need is just out of reach, and none of the obvious approaches has worked.", "moral": "Necessity is the mother of invention."},
{"chunk": 192, "story": 192, "summary": "A thief frightens an innkeeper with a tale that he turns into a wolf, and makes off with his coat.", "predicament": "A stranger tells you an alarming story and urges you to act at once, and the action would leave your goods in their hands.", "moral": "Every tale is not to be believed."},
{"chunk": 193, "story": 193, "summary": "A hart hidden under a vine eats its leaves once the hunters pass, and is spotted and shot.", "predicament": "Someone sheltered you when you were in danger, and now that the danger seems past you are tempted to help yourself to their things.", "moral": null},
{"chunk": 194, "story": 194, "summary": "A gnat stings a lion into tearing his own face, then is caught and eaten by a spider.", "predicament": "You have just beaten a powerful opponent and are celebrating loudly, not watching for small, patient dangers.", "moral": null},
{"chunk": 195, "story": 195, "summary": "A fox that cannot reach the grapes walks away saying they are sour.", "predicament": "You tried everything to get something you wanted and failed, and people are watching to see how you take it.", "moral": null},
{"chunk": 196, "story": 196, "summary": "A roadside walnut tree is beaten with sticks by passers-by who want its nuts.", "predicament": "The more you give, the more roughly people treat you to get more, and those you feed are the ones doing the damage.", "moral": null},
{"chunk": 197, "story": 197, "summary": "A kid caught by a wolf asks him to pipe a last dance, and the music brings hounds that chase off the wolf.", "predicament": "Someone who has you cornered is enjoying their power, and you could ask for one small favour that might draw help.", "moral": null},
{"chunk": 198, "story": 198, "summary": "A dolphin carrying a monkey from a wreck drowns him when he lies about his noble birth and 'knowing' the Piraeus.", "predicament": "Someone is helping you because they think you are one of their own, and asks questions you can only answer by lying.", "moral": null},
{"chunk": 199, "story": 199, "summary": "A horse accepts a man's bit and saddle to get revenge on a stag, and is enslaved for good.", "predicament": "To get back at a newcomer who shares your territory, someone powerful offers help if you accept their harness.", "moral": null},
{"chunk": 200, "story": 200, "summary": "A jackdaw painted white lives among doves until he chatters, and is then rejected by both doves and jackdaws.", "predicament": "You have disguised yourself as one of a better-fed group to share their benefits, and must keep silent to pass.", "moral": null},
{"chunk": 201, "story": 201, "summary": "A monkey claims a cemetery's monuments honour his ancestors, and a fox notes no ancestor can contradict him.", "predicament": "You are inflating your background to a companion, and they have noticed that nobody who could contradict you is around.", "moral": "A false tale often betrays itself."},
{"chunk": 202, "story": 202, "summary": "A man sends his disliked wife to her father's house, and her report of the herdsmen's looks confirms her effect on everyone.", "predicament": "Someone you are responsible for is disliked by everyone around them, and you want to learn whether it is them or the place.", "moral": "Straws show how the wind blows."},
{"chunk": 203, "story": 203, "summary": "A horse, ox and dog repay a man's shelter by giving the stages of his life their own tempers.", "predicament": "People you took in during hard times want to repay you by shaping you in their own likeness.", "moral": null},
{"chunk": 204, "story": 204, "summary": "A thief throws meat to a housedog, who says the sudden kindness only makes him more watchful.", "predicament": "A stranger showers you with sudden favours just as you are guarding something for your employer.", "moral": null},
{"chunk": 205, "story": 205, "summary": "An ape king rewards a liar's flattery and has his court maul a truthful traveller.", "predicament": "A vain leader asks your honest opinion of them and their court, and has just richly rewarded someone who flattered them.", "moral": null},
{"chunk": 206, "story": 206, "summary": "A fox terrified at first sight of a lion grows bolder each meeting until he chats with him.", "predicament": "You were terrified the first time you met someone very powerful, and each meeting since, you have been growing bolder.", "moral": "Acquaintance softens prejudices."},
{"chunk": 207, "story": 207, "summary": "An old weasel rolls in flour to look like food, and an old mouse sees through it.", "predicament": "Something tempting lies in a dark corner, and you notice that everyone who went for it has vanished.", "moral": null},
{"chunk": 208, "story": 208, "summary": "A drowning boy asks a traveller who scolds him to help first and scold afterwards.", "predicament": "You are in serious trouble and the person who could help is busy lecturing you on how you got there.", "moral": "Counsel without help is useless."},
{"chunk": 209, "story": 209, "summary": "A peacock complains to Juno that he cannot sing, and she tells him each has his own gift.", "predicament": "You are admired for one gift but resent being laughed at for lacking another that a colleague has.", "moral": null},
{"chunk": 210, "story": 210, "summary": "A wolf follows a flock harmlessly for so long that the shepherd leaves him in charge, and he kills the flock.", "predicament": "Someone you once guarded against has behaved so well for so long that you are about to leave them in charge.", "moral": null},
{"chunk": 211, "story": 211, "summary": "Hares argue that all beasts should be equal, and lions say the words lack claws and teeth.", "predicament": "You are arguing before the powerful that everyone should be treated as equals, and you have nothing to back it with.", "moral": null},
{"chunk": 212, "story": 212, "summary": "A man selling an image of Mercury claims it brings wealth, and says he sells because its gifts come too slowly.", "predicament": "You are selling something by promising it makes its owner rich, and a customer asks why you would part with it.", "moral": null},
{"chunk": 213, "story": 213, "summary": "A hawk refuses a nightingale's plea to let him go for larger birds not yet in sight.", "predicament": "You have someone in your power who argues you should let them go and chase a bigger target instead.", "moral": null},
{"chunk": 214, "story": 214, "summary": "A lark stays put while the farmer relies on friends to reap, and moves when he says he will reap himself.", "predicament": "Your boss keeps announcing a shake-up, and you must judge whether they mean it this time or will leave it to others again.", "moral": "Self-help is the best help."},
{"chunk": 215, "story": 215, "summary": "A fox flatters a cock in a tree, who invites him to wake the 'porter' below, and the dog kills the fox.", "predicament": "A stranger known to prey on people like you is praising you warmly and asking to be let in to meet you properly.", "moral": null},
{"chunk": 216, "story": 216, "summary": "Cranes fly off at a birdcatcher's approach, while the heavier geese are caught.", "predicament": "Danger is coming for everyone in your position, and the nimble are already slipping away while you are weighed down.", "moral": null},
{"chunk": 217, "story": 217, "summary": "An ass feigns a thorn in his hoof, and when the wolf goes to pull it he kicks his teeth in.", "predicament": "Someone stronger has you cornered, and you could ask them for a small service that would put them off their guard.", "moral": null},
{"chunk": 218, "story": 218, "summary": "A goat envious of the ass advises him to feign illness, and the goat's lungs are then prescribed to heal him.", "predicament": "Out of envy you are urging a colleague to fake an illness to escape work, and the fallout could land on you.", "moral": null},
{"chunk": 219, "story": 219, "summary": "A lion invites a bull to dine on a sheep, and the bull sees only spits and cauldrons big enough for a bull.", "predicament": "Someone who would gain by your downfall invites you to share a feast, and the preparations look suspiciously large.", "moral": null},
{"chunk": 220, "story": 220, "summary": "A fox finds a lifelike mask in an actor's house and says it is beautiful but has no brains.", "predicament": "An impressive-looking candidate is presented to you, and you notice there seems to be nothing behind the face.", "moral": null},
{"chunk": 221, "story": 221, "summary": "An owl kept awake by a grasshopper flatters her voice and invites her to drink, then kills her.", "predicament": "Someone you have been annoying suddenly praises you and invites you in for a treat, after asking you nicely to stop.", "moral": null},
{"chunk": 222, "story": 222, "summary": "A fowler staring up at a thrush treads on a viper and is fatally stung.", "predicament": "You are so intent on a target you are stalking that you have stopped watching where you are putting your own feet.", "moral": null},
{"chunk": 223, "story": 223, "summary": "A proud horse threatens a laden ass, then broken-winded is put to a dungcart and mocked by the ass.", "predicament": "Someone high in favour sneers at you and your heavy load, and you could answer back or hold your peace.", "moral": null},
{"chunk": 224, "story": 224, "summary": "A lion afraid of three bulls together separates them with sly talk and eats them one by one.", "predicament": "Someone who fears you and your colleagues together is quietly talking each of you into going your own way.", "moral": "Union is strength."},
{"chunk": 225, "story": 225, "summary": "A wolf urges a goat on a cliff to come down to the tender grass, and she knows he wants to eat her.", "predicament": "You hold a secure position, and someone who would profit from your fall urges you down to where the rewards are richer.", "moral": null},
{"chunk": 226, "story": 226, "summary": "A fly on the axle threatens to sting the mule, who says he heeds only the driver.", "predicament": "Someone with no authority over you is loudly telling you to hurry up and threatening you if you do not.", "moral": null},
{"chunk": 227, "story": 227, "summary": "Fishermen rejoice at heavy nets that turn out full of stones, and an old man says sorrow is twin to joy.", "predicament": "You celebrated early over what looked like a huge haul, and it has turned out to be mostly worthless.", "moral": null}
]
@@ -0,0 +1,47 @@
[
{"chunk": 228, "story": 228, "summary": "A country mouse visits his friend's rich town house, is chased from every meal, and goes back to his safe plain fare.", "predicament": "A well-off friend urges you to leave your plain, safe post for their lavish one, where every meal comes with a fright.", "moral": null},
{"chunk": 229, "story": 229, "summary": "An ape judging a wolf's theft charge against a fox rules that the wolf lost nothing and the fox stole anyway.", "predicament": "You must settle a dispute between two people with bad reputations, and you believe neither of their accounts.", "moral": "The dishonest, if they act honestly, get no credit."},
{"chunk": 230, "story": 230, "summary": "Wasps and partridges promise a farmer service for water, and he says his oxen already do it without promises.", "predicament": "Newcomers promise you great service in return for a favour now, while your steady workers already do it without promising.", "moral": null},
{"chunk": 231, "story": 231, "summary": "A father tells his vain son and plain, spiteful daughter both to look in the mirror daily, to mind their conduct.", "predicament": "Two people in your care are at odds, one vain of their gifts and the other spiteful for lacking them, and both appeal.", "moral": null},
{"chunk": 232, "story": 232, "summary": "Dogs tear at a lion's skin, and a fox says they would learn a lion's claws if it were alive.", "predicament": "Someone who once ruled over you is gone for good, and everyone is now bravely tearing into their reputation.", "moral": "It is easy to kick a man that is down."},
{"chunk": 233, "story": 233, "summary": "A blind man feeling a wolf cub cannot say if it is fox or wolf, but knows it must not go in the sheepfold.", "predicament": "You are asked to vouch for a young newcomer whose record is unclear, but whose instincts are plainly those of a predator.", "moral": "Evil tendencies are shown in early life."},
{"chunk": 234, "story": 234, "summary": "A failed cobbler poses as a doctor with a cure-all, and confesses when the governor tests him with 'poison'.", "predicament": "Your reputation as an expert was built on noise rather than skill, and someone powerful is about to test it on you.", "moral": null},
{"chunk": 235, "story": 235, "summary": "A wolf says he left a field of oats untouched for the horse, who says he would not if wolves ate oats.", "predicament": "Someone with a bad reputation makes a show of having saved something for you that they could never have used themselves.", "moral": "Men of evil reputation, when they perform a good deed, fail to get credit for it."},
{"chunk": 236, "story": 236, "summary": "Two enemies on a sinking ship sit at opposite ends, and one is content if his enemy's end sinks first.", "predicament": "You and a bitter enemy are going down together, and you care more about seeing them fall first than about saving yourself.", "moral": null},
{"chunk": 237, "story": 237, "summary": "A partridge pecked by gamecocks thinks it is because he is a stranger, until he sees them fight each other.", "predicament": "You are new and the old hands keep attacking you, and you assume it is because you are an outsider.", "moral": null},
{"chunk": 238, "story": 238, "summary": "A fox reviles a caged lion, who says it is his mischance, not the fox, that insults him.", "predicament": "Someone powerful is trapped by circumstances for now, and it is tempting to insult them while they cannot answer.", "moral": null},
{"chunk": 239, "story": 239, "summary": "A frog proclaims himself a physician, and a fox asks why he cannot cure his own gait and skin.", "predicament": "Someone offers to fix everyone else's problems, while their own obvious failings are there for all to see.", "moral": null},
{"chunk": 240, "story": 240, "summary": "A wolf accuses the absent fox to the sick lion, and the fox prescribes the wolf's warm skin as the cure.", "predicament": "A rival is denouncing you to the boss just as you walk in, and you could turn the boss's anger back on them.", "moral": null},
{"chunk": 241, "story": 241, "summary": "A dog curled against winter cold plans a house, but stretched out in summer thinks one too big a job.", "predicament": "In hard times you resolved to build yourself some security, and now that times are easy it seems too big a job.", "moral": null},
{"chunk": 242, "story": 242, "summary": "The north wind blows in vain to strip a traveller's cloak, and the sun's warmth makes him take it off.", "predicament": "You need someone to give something up, and the harder you push the tighter they cling to it.", "moral": "Persuasion is better than Force."},
{"chunk": 243, "story": 243, "summary": "A crow breaks his vow to Apollo after being freed, and when caught again Mercury will not believe his new vow.", "predicament": "You broke your promise to the last person who got you out of trouble, and now you need a new patron to trust you.", "moral": null},
{"chunk": 244, "story": 244, "summary": "A fox serves a crane soup in a flat dish, and the crane repays him with a narrow-necked jar.", "predicament": "Someone humiliated you with a show of hospitality you could not use, and now it is your turn to host them.", "moral": null},
{"chunk": 245, "story": 245, "summary": "A wolf seeing his long evening shadow thinks he should be king, and a lion kills him.", "predicament": "Things are going so well that you feel bigger than the people above you and start to think you deserve their place.", "moral": null},
{"chunk": 246, "story": 246, "summary": "A bat fights for whichever side, birds or beasts, is winning, and after peace both condemn him.", "predicament": "Two factions are at war, and you could keep switching to whichever side is winning at the moment.", "moral": null},
{"chunk": 247, "story": 247, "summary": "A spendthrift sells his last cloak on seeing an early swallow, and the frost returns.", "predicament": "Having run through almost everything, you see an early sign of good times and are tempted to sell your last safeguard.", "moral": null},
{"chunk": 248, "story": 248, "summary": "A captured trumpeter pleads he carried no weapon, and his captors say his trumpet roused all the others.", "predicament": "You are caught on the losing side and plead that you never did harm yourself, only urged others on.", "moral": null},
{"chunk": 249, "story": 249, "summary": "The birds scorn the owl's warnings about acorns, flax and archers until they come true.", "predicament": "You warned your group early about dangers others could not yet see, and they called you mad.", "moral": null},
{"chunk": 250, "story": 250, "summary": "Driven out by the ills, the goods ask Jupiter for protection, and he sends them to men one at a time.", "predicament": "Troubles keep arriving together while good things come one at a time, and you must learn to spot the good when it comes.", "moral": null},
{"chunk": 251, "story": 251, "summary": "An ass in a lion's skin frightens the foolish beasts until a fox hears him bray.", "predicament": "You have borrowed the trappings of real authority and are enjoying frightening people, and now you meet someone who listens.", "moral": null},
{"chunk": 252, "story": 252, "summary": "A sparrow mocks a hare seized by an eagle and is himself taken by a hawk.", "predicament": "A colleague has just been brought down, and it is tempting to mock them for failing, as if it could not happen to you.", "moral": null},
{"chunk": 253, "story": 253, "summary": "A flea asks why the ox slaves for men, and the ox says he is loved and patted, while a pat means the flea's death.", "predicament": "A freeloader asks why you work so hard for your employer when they themselves take freely and give nothing.", "moral": null},
{"chunk": 254, "story": 254, "summary": "A buyer returns an ass on trial because it at once joined the laziest ass in the yard.", "predicament": "You are new and on trial, and the first thing you do is choose whom to fall in with.", "moral": "A man is known by the company he keeps."},
{"chunk": 255, "story": 255, "summary": "A caged dove boasts of her many young, and a crow says that only means more of them in prison.", "predicament": "You boast of how many people you have brought into the organisation, when all of them are stuck there with you.", "moral": null},
{"chunk": 256, "story": 256, "summary": "A satyr breaks his friendship with a man who blows on his hands to warm them and on his food to cool it.", "predicament": "Your new ally has watched you argue both sides of the same question within a day, and is doubting you.", "moral": null},
{"chunk": 257, "story": 257, "summary": "Momus, made judge of the gods' works, envies and faults all three, and is expelled.", "predicament": "You have been asked to judge between colleagues' work, and your envy is tempting you to find fault with all of it.", "moral": null},
{"chunk": 258, "story": 258, "summary": "A jackdaw envious of an eagle tries to carry off a ram, gets caught in the fleece, and is clipped and given to children.", "predicament": "You watched a star performer pull off a feat and are about to try an even bigger one yourself, without their strength.", "moral": null},
{"chunk": 259, "story": 259, "summary": "An eagle steals her neighbour fox's cub, and later her own young burn in a nest fired by a stolen cinder.", "predicament": "A powerful neighbour who swore friendship has taken something precious from you, and you cannot reach them to answer it.", "moral": null},
{"chunk": 260, "story": 260, "summary": "Every man carries a bag of his neighbours' faults in front and a bigger bag of his own behind.", "predicament": "You see a colleague's faults very clearly and are ready to point them out, without looking at your own.", "moral": "Hence it is that men are quick to see the faults of others, and yet are often blind to their own failings."},
{"chunk": 261, "story": 261, "summary": "A bitch granted a place to whelp later uses her grown pups to bar the shepherd from it.", "predicament": "Someone you let use your space for a while has built up a following and now claims it as their own.", "moral": null},
{"chunk": 262, "story": 262, "summary": "A stag admires his antlers and despises his thin legs, which save him until the antlers catch in a thicket.", "predicament": "You prize your showy strengths and are ashamed of your plain ones, and trouble is coming that will test which matters.", "moral": "What is most truly valuable is often underrated."},
{"chunk": 263, "story": 263, "summary": "A lark born before the earth, with nowhere to bury her father, buries him in her own head.", "predicament": "You owe a duty of respect to someone who has gone, and there is no proper place to pay it but within yourself.", "moral": "Youth’s first duty is reverence to parents."},
{"chunk": 264, "story": 264, "summary": "A gnat asks a bull if he should leave, and the bull says he never noticed him come.", "predicament": "You are making a show of whether to leave, sure your departure will be felt, and you may not have been noticed at all.", "moral": "Some men are of more consequence in their own eyes than in the eyes of their neighbors."},
{"chunk": 265, "story": 265, "summary": "A camel envious of the monkey's applauded dance tries to dance and is driven out.", "predicament": "A colleague's performance has just been loudly applauded, and you are tempted to get up and try to outdo them.", "moral": "It is absurd to ape our betters."},
{"chunk": 266, "story": 266, "summary": "Hungry dogs try to drink a river dry to reach hides in it and burst.", "predicament": "Your group has agreed on a plan to reach something it wants that would require doing the impossible.", "moral": "Attempt not impossibilities."},
{"chunk": 267, "story": 267, "summary": "A hungry jackdaw waits on a fig tree for out-of-season figs to ripen.", "predicament": "You are waiting, hungry, for a promise that is out of season to come good, and someone tells you it never will.", "moral": null},
{"chunk": 268, "story": 268, "summary": "An honest woodman is given gold and silver axes, and a neighbour who lies to get the same loses his own axe.", "predicament": "A colleague was rewarded for honesty in a lucky accident, and you could stage the same accident and claim the reward.", "moral": null},
{"chunk": 269, "story": 269, "summary": "A peasant ignores the pleas of birds to spare his barren tree, but spares it on finding honey inside.", "predicament": "You are about to cut something that has not paid its way, and those who depend on it beg you to spare it.", "moral": "Self-interest alone moves some men."},
{"chunk": 270, "story": 270, "summary": "A soldier who fled a robber returns boasting after his comrade has killed him, and is rebuked.", "predicament": "You ran when your partner was in danger, and now that it is over you are tempted to boast of your courage.", "moral": null},
{"chunk": 271, "story": 271, "summary": "A shepherd shakes down acorns onto his cloak, and the sheep eating them tear it.", "predicament": "The people you work to provide for have carelessly damaged something of yours while taking what you gave them.", "moral": null},
{"chunk": 272, "story": 272, "summary": "The gods choose fruitless trees so as not to seem covetous, and Minerva prefers the olive for its fruit.", "predicament": "Your peers choose honours that look disinterested, and you would rather be known for work that is plainly useful.", "moral": null}
]
@@ -0,0 +1,42 @@
[
{"chunk": 273, "story": 273, "summary": "A wrestler bitten by a flea calls on Hercules, and wonders what help to expect against greater foes if none comes for a flea.", "predicament": "You keep calling on your powerful backer over every small irritation, and wonder whether they will come when it truly matters.", "moral": null},
{"chunk": 274, "story": 274, "summary": "A fox who finds prey for a lion grows jealous of the lion's share, hunts alone, and is caught.", "predicament": "You do the scouting while a stronger partner takes the biggest share, and you are tempted to go it alone.", "moral": null},
{"chunk": 275, "story": 275, "summary": "A traveller meets Truth alone in the desert, who says she left the city because falsehood is now with everyone.", "predicament": "Everyone around you now lies as a matter of course, and speaking plainly has left you entirely on your own.", "moral": null},
{"chunk": 276, "story": 276, "summary": "A murderer fleeing his victim's kin climbs from a lion into a serpent's tree and jumps into a crocodile's river.", "predicament": "Pursued for a real wrong you did, you find every place you run to is more dangerous than the last.", "moral": null},
{"chunk": 277, "story": 277, "summary": "An eagle proposes an alliance, and the lion asks for a surety since the eagle could fly off whenever he likes.", "predicament": "Someone proposes a partnership who could walk away from it at any moment, while you could not.", "moral": "Try before you trust."},
{"chunk": 278, "story": 278, "summary": "An ass bolts for a precipice, and his owner, unable to hold him by the tail, lets go.", "predicament": "Someone you are responsible for is determined to throw themselves at a ruinous course, and holding them back is hurting you both.", "moral": null},
{"chunk": 279, "story": 279, "summary": "A thrush lingers on a myrtle for its berries and is caught by a fowler.", "predicament": "You have been lingering in one pleasant spot because it is so rewarding, and someone has noticed exactly where to find you.", "moral": null},
{"chunk": 280, "story": 280, "summary": "A wolf waits all day at a cottage door after hearing a mother threaten to throw her child out to him.", "predicament": "Someone made an angry threat in your hearing that seemed to promise you a windfall, and you are waiting for them to follow through.", "moral": null},
{"chunk": 281, "story": 281, "summary": "A hen hatches viper eggs, and a swallow warns they will harm everyone, starting with her.", "predicament": "You are carefully nurturing a group of newcomers who, once grown, are likely to turn on everyone, starting with you.", "moral": null},
{"chunk": 282, "story": 282, "summary": "An amaranth envies the rose, who replies that her beauty is brief while the amaranth never fades.", "predicament": "You envy a colleague's dazzling reputation, and they tell you it will not last while your quieter one will.", "moral": null},
{"chunk": 283, "story": 283, "summary": "Travellers resting in a plane tree's shade call it useless, and the tree rebukes them.", "predicament": "People who depend on you every day are, in your hearing, calling you useless because you do not produce anything showy.", "moral": "Some men underrate their best blessings."},
{"chunk": 284, "story": 284, "summary": "A horse refuses the ass a little feed now but promises a sackful later, and the ass does not believe it.", "predicament": "Someone refuses you a small favour now but promises a much larger one later, and you are asked to be grateful.", "moral": null},
{"chunk": 285, "story": 285, "summary": "A crow rides a sheep's back and says she bullies the weak and flatters the strong.", "predicament": "A colleague bullies you freely, and openly admits they would never try it with someone who could bite back.", "moral": null},
{"chunk": 286, "story": 286, "summary": "A slipping fox grabs a bramble for help, is torn by it, and is told he should have known its nature.", "predicament": "In a crisis you grabbed for help from someone known to take advantage of everyone, and they have hurt you.", "moral": null},
{"chunk": 287, "story": 287, "summary": "An ass envies the pampered warhorse until the horse is killed in battle.", "predicament": "You envy how well a favoured colleague is kept, not asking what they are being kept for.", "moral": null},
{"chunk": 288, "story": 288, "summary": "A lion ashamed of fearing a cock finds an elephant terrified of a gnat, and is consoled.", "predicament": "You are strong in every way but one small fear, and it shames you so much that you are ready to give up.", "moral": null},
{"chunk": 289, "story": 289, "summary": "A dog used to eggs swallows an oyster whole and suffers for thinking everything round is an egg.", "predicament": "Something new looks just like what you are used to handling, and you are about to take it on without a second look.", "moral": "They who act without sufficient thought, will often fall into unsuspected danger."},
{"chunk": 290, "story": 290, "summary": "Robbers wound the proud mule carrying treasure and ignore the one carrying grain.", "predicament": "You are proud to carry the most valuable load and make sure everyone hears it, while a colleague carries theirs quietly.", "moral": null},
{"chunk": 291, "story": 291, "summary": "A lamb fleeing a wolf into a temple says being sacrificed there is better than being eaten by him.", "predicament": "Someone chasing you warns that the refuge you are running to will be no kinder to you than they would be.", "moral": null},
{"chunk": 292, "story": 292, "summary": "A partridge offers to lure other partridges if spared, and the fowler kills him for it.", "predicament": "You have been caught, and you could save yourself by offering to deliver your colleagues to the one who caught you.", "moral": null},
{"chunk": 293, "story": 293, "summary": "A man catches a flea who pleads it does little harm, and kills it because no evil should be tolerated.", "predicament": "You have caught someone in a petty offence, and they plead that what they did was too small to matter.", "moral": null},
{"chunk": 294, "story": 294, "summary": "A rich man presses his tanner neighbour to move, the tanner stalls, and the rich man grows used to the smell.", "predicament": "A powerful neighbour wants you gone and keeps pressing, and you could keep promising to leave soon without actually going.", "moral": null},
{"chunk": 295, "story": 295, "summary": "A viper asks a file for a meal, and the file says he takes from everyone and gives nothing.", "predicament": "You have gone to ask for help from someone well known for taking from everyone and never giving.", "moral": "The covetous are poor givers."},
{"chunk": 296, "story": 296, "summary": "A shepherd pulls a thorn from a lion's paw, and the lion later spares him in the arena.", "predicament": "Someone dangerous and in pain comes to you for help, and helping them means getting close to their claws.", "moral": null},
{"chunk": 297, "story": 297, "summary": "A camel envying the bull's horns asks Jupiter for some and loses part of his ears.", "predicament": "Not content with your strengths, you are asking the boss for a colleague's distinctions too.", "moral": null},
{"chunk": 298, "story": 298, "summary": "A panther in a pit, stoned by some shepherds and fed by others, escapes and takes revenge only on his attackers.", "predicament": "Someone dangerous has fallen, and others are pelting them while a few offer help, and you must choose which you will be.", "moral": null},
{"chunk": 299, "story": 299, "summary": "A kite boasts he can catch ostriches to win an eagle's hand, and brings her a stale mouse.", "predicament": "Someone courting you for a partnership boasts of what they can deliver, and you have no way yet to check.", "moral": null},
{"chunk": 300, "story": 300, "summary": "An eagle freed by a new owner brings him a hare, and a fox advises courting the old owner who clipped him.", "predicament": "A new employer has restored what your old one took from you, and you must decide whom to cultivate.", "moral": null},
{"chunk": 301, "story": 301, "summary": "A prince confined because of his father's dream of a lion strikes at a painted lion, is pricked by a thorn and dies.", "predicament": "You have been confined to protect you from a danger someone only dreamed of, and you are raging against it.", "moral": "We had better bear our troubles bravely than try to escape them."},
{"chunk": 302, "story": 302, "summary": "A cat turned into a woman for love leaps from the bridal couch after a mouse.", "predicament": "You have been given a new, polished role, and an old temptation is about to be dropped in front of you.", "moral": "Nature exceeds nurture."},
{"chunk": 303, "story": 303, "summary": "A beetle whose young an eagle ate pursues her eggs even into Jupiter's lap until they are broken.", "predicament": "Someone far more powerful destroyed what you cared about, and you could pursue them relentlessly even into their protector's presence.", "moral": "The weak often revenge themselves on those who use them ill, even though they be more powerful."},
{"chunk": 304, "story": 304, "summary": "The he-goats complain the she-goats got beards, and Jupiter says an empty badge makes them no equals.", "predicament": "Juniors have been given the same badge of rank as you, and you are tempted to complain to those above.", "moral": "It matters little if those who are inferior to us in merit should be like us in outside appearances."},
{"chunk": 305, "story": 305, "summary": "A bald man slaps his own head at a fly, and says he forgives himself but would kill the fly at any cost.", "predicament": "Someone small keeps needling you, and your efforts to hit back are hurting you more than them.", "moral": null},
{"chunk": 306, "story": 306, "summary": "A shipwrecked man blames the sea, who says the winds are to blame for her fury.", "predicament": "You were ruined in a venture and blame the institution, which says it was only stirred up by others.", "moral": null},
{"chunk": 307, "story": 307, "summary": "A crowd prefers a buffoon's fake pig squeal to a countryman's real pig, until he shows it.", "predicament": "The crowd has already decided their favourite is better than you, however genuine your work, and you must show them.", "moral": null},
{"chunk": 308, "story": 308, "summary": "A hungry crow seizes a sleeping serpent as a windfall and is bitten to death.", "predicament": "You are desperate, and an easy prize seems to have been left lying unguarded right in front of you.", "moral": null},
{"chunk": 309, "story": 309, "summary": "A horseman takes a hunter's hare under pretence of buying it and gallops off, and the hunter calls it a gift.", "predicament": "Someone has made off with what you earned, pretending to buy it, and you cannot catch them.", "moral": null},
{"chunk": 310, "story": 310, "summary": "An evergreen olive mocks the fig for shedding leaves, and snow breaks the olive but passes through the fig.", "predicament": "A colleague mocks you for scaling back in lean seasons while they keep up appearances all year round.", "moral": null},
{"chunk": 311, "story": 311, "summary": "The frogs protest the sun's marriage, fearing that more suns would parch them worse.", "predicament": "Someone who already makes your life hard is about to gain more power, and you could protest before it happens.", "moral": null},
{"chunk": 312, "story": 312, "summary": "A brazier scolds his dog for sleeping while he works and waking only to beg at dinner.", "predicament": "Someone who dozes through all the work always wakes up just in time to ask for a share of the rewards.", "moral": null}
]
@@ -0,0 +1,120 @@
#!/usr/bin/env python3
"""Assemble records.json, groups.json and options_by_entry.json from batches/, groups_src.py and
options_src.py, and check them. Jacobs' build.py plus the checks this corpus needs: one scene per
fable, predicament length and name leaks, verbatim morals and evidence, the 13-fable recurrence rule,
and the catalogue ids the options measurement uses. No inference."""
import collections, glob, json, pathlib, re, sys
sys.dont_write_bytecode = True # the catalogue import below must not leave caches outside probe/aesop/
from groups_src import G, STANDING
from options_src import O, NEW_ENTRIES
here = pathlib.Path(__file__).parent
sys.path.insert(0, str(here.parent.parent / 'catalogue' / 'v2'))
from catalogue_v2_src import CATALOGUE
chunks = json.loads((here.parent / 'chunks.json').read_text())
stories = json.loads((here.parent / 'stories.json').read_text())
recs = [r for f in sorted(glob.glob(str(here / 'batches/s*.json'))) for r in json.loads(open(f).read())]
assert [r['chunk'] for r in recs] == list(range(len(chunks))), 'every fable, once, in order'
assert all(chunks[r['chunk']]['story'] == r['story'] for r in recs)
assert all(set(r) == {'chunk', 'story', 'summary', 'predicament', 'moral'} for r in recs)
# ---- records -------------------------------------------------------------------------------------
NAMES = ('amaranth ant ape apple ass bat bear bee beetle bird boar bramble bull calf camel cat cock crab crane '
'crow dog doe dolphin dove eagle elephant fawn fig filbert fir fish flea fly flies frog gnat goat goose '
'geese grape grasshopper hare hart hawk hedgehog heifer hen horse hound jackdaw kid kite lamb lark '
'leopard lion lioness locust mole monkey mouse mice mule nettle nightingale oak olive ox oxen oyster '
'panther partridge peacock pig pigeon pomegranate porker raven reed rose satyr seagull serpent sheep '
'snake sow sparrow sprat stag stork swallow swan thrush tortoise vine viper walnut wasp weasel whale '
'whelp wolf wolves jupiter juno venus mercury minerva neptune momus hercules apollo pallas hermes '
'axe net sling fleece wool manger pitcher honey acorn').split()
NOPLURAL = {'doe'} # 'does' is a verb
leak = re.compile(r'\b(' + '|'.join(n + ('' if n in NOPLURAL else 's?') for n in NAMES) + r')\b', re.I)
def norm(s): return ' '.join(s.split())
problems = []
for r in recs:
p, n = r['predicament'], len(r['predicament'].split())
if not 15 <= n <= 24: problems.append(f"chunk {r['chunk']}: predicament has {n} words")
if len(re.findall(r'[.!?](?:\s|$)', p)) != 1 or not p.endswith('.'): problems.append(f"chunk {r['chunk']}: not one sentence")
if leak.search(p): problems.append(f"chunk {r['chunk']}: name or story object in predicament: {leak.search(p).group(0)}")
if r['moral'] is not None and norm(r['moral']) not in norm(chunks[r['chunk']]['text']):
problems.append(f"chunk {r['chunk']}: moral is not verbatim")
# ---- groups --------------------------------------------------------------------------------------
MIN_MEMBERS = max(3, round(0.04 * len(stories))) # 13 for 313 fables
SKILLS = {'wit', 'prudence'}
seen = collections.Counter(m for g in G for m in g['members'])
dup = [m for m, k in seen.items() if k > 1]
if dup: problems.append(f'fables in two groups: {dup}')
assert set(STANDING) == set(range(len(recs))), 'STANDING covers every fable'
by = {r['chunk']: r for r in recs}
out = []
for g in G:
small = g.get('small', False)
k = len(g['members'])
if small and not 5 <= k <= 12: problems.append(f"{g['id']}: marked small but has {k} fables")
if not small and k < MIN_MEMBERS: problems.append(f"{g['id']}: {k} fables, below the {MIN_MEMBERS}-fable rule")
if not 3 <= len(g['options']) <= 5: problems.append(f"{g['id']}: {len(g['options'])} options")
used = {p for _, _, mv in g['options'] for p in mv if '.' not in p and p not in ('money', 'standing')}
if not used <= SKILLS: problems.append(f"{g['id']}: skill labels outside {SKILLS}: {used - SKILLS}")
for _, s, mv in g['options']:
if not all(v in ('+', '-', 'risk', 'set') for v in mv.values()): problems.append(f"{g['id']}: bad direction in {mv}")
if s.startswith('scene:') and not 0 <= int(s.split(':')[1]) < len(recs): problems.append(f"{g['id']}: bad source {s}")
st = sorted({by[m]['story'] for m in g['members']})
stand = collections.Counter(STANDING[by[m]['story']] for m in g['members'])
out.append({
'id': g['id'], 'name': g['name'], 'predicament': g['predicament'], 'small': small,
'sentence': f"A {g['actor']} wants {g['wants']} from {g['counterpart']}.",
'actor': g['actor'], 'wants': g['wants'], 'counterpart': g['counterpart'],
'stories': st, 'story_titles': [stories[s]['title'] for s in st],
'standing': dict(stand), 'stage': stand.most_common(1)[0][0],
'members': [{'chunk': m, 'story': by[m]['story'], 'predicament': by[m]['predicament'],
'moral': by[m]['moral']} for m in g['members']],
'options': [{'text': t, 'source': s, 'moves': mv,
'in_group': (int(s.split(':')[1]) in g['members']) if s.startswith('scene:') else None}
for t, s, mv in g['options']],
})
unassigned = [r['chunk'] for r in recs if r['chunk'] not in seen]
# ---- options measurement -------------------------------------------------------------------------
v2 = {e['id'] for e in CATALOGUE}
obe, new_used = collections.defaultdict(list), set()
for entry, c, text, mv, ev, stated in O:
if entry.startswith('new:'):
if entry[4:] not in NEW_ENTRIES: problems.append(f'{entry}: not defined in NEW_ENTRIES')
if entry[4:] in v2: problems.append(f'{entry}: already a v2 id')
new_used.add(entry[4:])
elif entry not in v2: problems.append(f'{entry}: not a v2 catalogue id')
ev = by[c]['moral'] if ev == 'M' else ev
if ev is None: problems.append(f'chunk {c}: evidence M but the fable has no moral')
elif norm(ev) not in norm(chunks[c]['text']): problems.append(f'chunk {c}: evidence not verbatim: {ev[:50]}')
elif len(ev.split()) > 30: problems.append(f'chunk {c}: evidence over 30 words')
bad = [p for p in mv if not (p in ('money', 'standing') or p.startswith('relationships.'))]
if bad: problems.append(f'chunk {c}: measurement moves use {bad}; money, standing, relationships only')
if not all(v in ('+', '-', 'risk') for v in mv.values()): problems.append(f'chunk {c}: bad direction in {mv}')
obe[entry].append({'text': text, 'moves': mv, 'source': f'chunk:{c}', 'evidence': ev, 'stated': stated})
unused = sorted(set(NEW_ENTRIES) - new_used)
if unused: problems.append(f'NEW_ENTRIES never used: {unused}')
if problems:
print('\n'.join(problems)); sys.exit(1)
obe_out = {k: obe[k] for k in sorted(obe, key=lambda k: (k.startswith('new:'), k))}
obe_out['_new_entries'] = {f'new:{k}': {'name': n, 'definition': d, 'differs_from': x}
for k, (n, d, x) in NEW_ENTRIES.items()}
(here / 'records.json').write_text(json.dumps(recs, indent=1, ensure_ascii=False))
(here / 'groups.json').write_text(json.dumps({'groups': out, 'unassigned': unassigned}, indent=1, ensure_ascii=False))
(here / 'options_by_entry.json').write_text(json.dumps(obe_out, indent=1, ensure_ascii=False))
# ---- report --------------------------------------------------------------------------------------
big = [g for g in out if not g['small']]
print(f'{len(recs)} fables, {sum(r["moral"] is not None for r in recs)} with a stated moral; '
f'{len(big)} groups of {MIN_MEMBERS}+ fables, {len(out) - len(big)} small groups (5-12); '
f'{sum(seen.values())} assigned, {len(unassigned)} unassigned')
for g in out:
print(f"{g['id']} {len(g['members']):2} fables stage {g['stage']:6} {'SMALL ' if g['small'] else ''}{g['name']}")
src = collections.Counter(o['source'].split(':')[0] for g in out for o in g['options'])
print('group option sources:', dict(src), '| scene options citing a fable outside their group:',
sum(o['in_group'] is False for g in out for o in g['options']))
opts = [o for k, v in obe.items() for o in v]
cov_v2 = sorted(k for k in obe if not k.startswith('new:'))
print(f'options measurement: {len(opts)} options, {sum(o["stated"] for o in opts)} stated '
f'({sum(o["stated"] for o in opts) / len(opts):.0%}); {len(cov_v2)} of {len(v2)} v2 entries covered, '
f'{len(new_used)} new entries; from {len({o["source"] for o in opts})} distinct fables')
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,228 @@
"""Hand-built reference grouping of the Aesop predicaments (Claude-written, no inference of any kind).
One fable is one story and one scene, so a group's member count is also its story count.
Recurrence rule, scaled to the corpus: with 313 fables a group needs at least 13 members
(max(3, 4% of 313) = 13). Groups of 5-12 are allowed but are marked SMALL below and reported
separately. Each fable is in at most one group; fables that fit no recurring situation stay
unassigned.
Options follow DESIGN.md: 3-5 per group, each marked by where it came from --
'archetype' a fixed, setting-free option
'scene:N' what someone in fable N actually did (or refused to do)
'filled' written to fill a gap the fables leave
`moves` names spine paths and a direction only (+ / - / risk / set). No magnitudes: the model never
chooses a number. Skill labels proposed for this corpus: wit (seeing through a trick, and turning it),
prudence (looking before you leap, knowing your limits, keeping what you have).
"""
G = [
# ---- the powerful and the weak ---------------------------------------------------------------------
dict(id='G01', name='A friendly approach from someone who would gain by your fall',
predicament='Someone whose nature is to prey on people like you comes friendly, praising, inviting or offering peace, and what they propose would put you in reach.',
actor='person with something to lose', wants='to keep it', counterpart='a known predator acting friendly',
members=[30, 36, 63, 64, 73, 92, 96, 144, 172, 192, 204, 207, 215, 219, 221, 225],
options=[
('Keep your distance and decline politely.', 'scene:36', {'prudence':'+', 'relationships.predator':'-'}),
('Accept the invitation and go in.', 'scene:221', {'relationships.predator':'+', 'standing':'risk'}),
('Say out loud what they are really after.', 'scene:225', {'wit':'+', 'relationships.predator':'-'}),
('Send them round to someone who can deal with them.', 'scene:215', {'wit':'+', 'relationships.predator':'-', 'flags.turned_the_tables':'set'}),
('Rise to the praise and show them what you can do.', 'scene:96', {'money':'-', 'standing':'-'})]),
dict(id='G02', name='At the mercy of someone who has already decided',
predicament='Someone who holds your fate has caught you and is looking for a reason, and you have one chance to talk your way out.',
actor='person caught', wants='to be let go', counterpart='the one who has them',
members=[1, 5, 26, 39, 43, 55, 131, 135, 147, 197, 211, 217, 248, 292],
options=[
('Answer every charge with the facts.', 'scene:1', {'standing':'risk', 'relationships.captor':'-'}),
('Show them the one thing you do that nobody else can.', 'scene:135', {'standing':'+', 'relationships.captor':'+'}),
('Tell them you belong to the side they spare.', 'scene:5', {'wit':'+', 'flags.two_faced':'set'}),
('Ask for one small favour that puts them off guard.', 'scene:217', {'wit':'+', 'relationships.captor':'-'}),
('Offer to hand over your own people instead.', 'scene:292', {'relationships.colleagues':'-', 'standing':'-', 'flags.informer':'set'})]),
dict(id='G03', name='Trading one hardship for another',
predicament='Your present lot is hard, and you could change master, protector or post, though the new one may be worse.',
actor='person with a hard lot', wants='something better', counterpart='the master or post on offer',
members=[47, 53, 76, 79, 109, 115, 125, 136, 177, 178, 189, 199, 228, 291],
options=[
('Ask for a new master.', 'scene:125', {'relationships.boss':'-', 'standing':'risk'}),
('Bring in a strong protector.', 'scene:79', {'relationships.protector':'+', 'standing':'risk'}),
('Keep the harm you know.', 'scene:53', {'prudence':'+'}),
('Go back to your plain, safe post.', 'scene:228', {'prudence':'+', 'money':'-'}),
('Sell up and stake it all on the change.', 'scene:109', {'money':'risk', 'flags.staked_all':'set'})]),
dict(id='G04', name='Envying another\'s gift',
predicament='You envy a colleague\'s gift or standing so much that you are tempted to copy them, or ask for what they have.',
actor='person with plainer gifts', wants='what the admired one has', counterpart='the admired colleague',
members=[2, 29, 31, 52, 68, 98, 134, 170, 180, 186, 209, 258, 265, 268, 282, 287, 297],
options=[
('Copy what they do.', 'scene:265', {'standing':'risk', 'relationships.admired':'-'}),
('Ask those above for what they have.', 'scene:297', {'relationships.boss':'-', 'standing':'-'}),
('Stick to what you are good at.', 'scene:209', {'prudence':'+'}),
('Look at what their position costs them.', 'scene:287', {'prudence':'+', 'relationships.admired':'+'}),
('Learn the craft properly before you try it.', 'filled', {'money':'-', 'wit':'+'})]),
dict(id='G05', name='Passing for more than you are',
predicament='You are passing for braver, grander or more skilled than you are, and the moment that would test it has come.',
actor='pretender', wants='to keep the credit', counterpart='whoever might test them',
members=[40, 42, 65, 138, 148, 160, 187, 198, 200, 201, 234, 251, 270, 302],
options=[
('Keep up the pretence and say nothing.', 'scene:200', {'standing':'risk'}),
('Confess before you are tested.', 'scene:234', {'standing':'-', 'relationships.examiner':'+'}),
('Laugh with them when it slips.', 'scene:160', {'standing':'+', 'relationships.companions':'+'}),
('Double the claim.', 'scene:198', {'standing':'risk', 'flags.liar':'set'}),
('Back out quietly.', 'scene:138', {'standing':'-'})]),
dict(id='G06', name='Riding high',
predicament='Things are going your way, and you are tempted to show it, crow about it, or take on someone bigger.',
actor='person on top for now', wants='to be seen on top', counterpart='rivals and onlookers',
members=[27, 57, 71, 108, 110, 117, 126, 141, 194, 245, 255, 264, 290],
options=[
('Crow about it where everyone can see.', 'scene:71', {'standing':'risk', 'relationships.rival':'-'}),
('Press on and take on someone bigger.', 'scene:110', {'standing':'risk', 'flags.overreached':'set'}),
('Keep quiet and go on shining.', 'scene:141', {'prudence':'+', 'standing':'+'}),
('Ask an old hand what your mark really means.', 'scene:57', {'relationships.mentor':'+', 'prudence':'+'})]),
dict(id='G07', name='Sneered at by someone showier',
predicament='A showier or better-placed colleague sneers at your plainness or your load, and you must decide how to answer.',
actor='plain worker', wants='respect', counterpart='a showier colleague',
members=[7, 11, 22, 24, 70, 88, 155, 163, 167, 223, 226, 253, 310],
options=[
('Answer with what you can do that they cannot.', 'scene:167', {'wit':'+', 'standing':'+', 'relationships.rival':'-'}),
('Hold your peace and wait.', 'scene:223', {'prudence':'+', 'relationships.rival':'-'}),
('Challenge them to a test.', 'scene:11', {'standing':'risk', 'relationships.rival':'-'}),
('Ignore them and heed only the one in charge.', 'scene:226', {'relationships.boss':'+'}),
('Try to outshine them on their terms.', 'filled', {'money':'-', 'standing':'risk'})]),
# ---- help, greed, partners -------------------------------------------------------------------------
dict(id='G08', name='Help asked in need',
predicament='Someone in trouble asks for help, or you need it yourself, and nobody can tell how the help will be repaid.',
actor='person asked for help', wants='to do right without being bitten', counterpart='someone in need',
members=[0, 10, 23, 51, 132, 154, 190, 193, 208, 230, 261, 286, 295, 296],
options=[
('Help, though they can give nothing back now.', 'scene:0', {'relationships.helped':'+', 'money':'-'}),
('Refuse: they should have looked ahead.', 'scene:10', {'relationships.asker':'-', 'money':'+'}),
('Take them in and nurse them.', 'scene:23', {'relationships.helped':'+', 'standing':'risk'}),
('Refuse to lift any of their load.', 'scene:51', {'relationships.partner':'-', 'money':'risk'}),
('Stick with those who already serve you without promises.', 'scene:230', {'prudence':'+', 'relationships.staff':'+'})]),
dict(id='G09', name='Wanting more than you hold',
predicament='You already have something good, and a chance to grab more, squeeze more or stay longer is tempting you.',
actor='person with something in hand', wants='more', counterpart='the bigger prize',
members=[15, 21, 46, 95, 113, 137, 139, 151, 156, 168, 179, 213, 279],
options=[
('Keep what you hold.', 'scene:137', {'money':'+', 'prudence':'+'}),
('Drop it and chase the bigger prize.', 'scene:156', {'money':'risk'}),
('Squeeze the steady source for more.', 'scene:168', {'money':'risk', 'flags.killed_the_goose':'set'}),
('Take half and get free.', 'scene:46', {'prudence':'+', 'money':'-'}),
('Stay and enjoy it a while longer.', 'scene:279', {'money':'+', 'standing':'risk'})]),
dict(id='G10', name='Your side divided',
predicament='You and a rival, or the people on your own side, are quarrelling, and someone else stands to profit from it.',
actor='member of a divided side', wants='to win the quarrel, or end it', counterpart='the rival, and whoever is waiting',
members=[4, 25, 48, 75, 80, 105, 124, 152, 165, 166, 171, 185, 224, 236, 246],
options=[
('Make peace with the rival before others profit.', 'scene:105', {'relationships.rival':'+'}),
('Show them together they cannot be broken.', 'scene:4', {'relationships.team':'+', 'standing':'+'}),
('Fight it out to the end.', 'scene:152', {'relationships.rival':'-', 'money':'-'}),
('Stop supplying the part you resent.', 'scene:75', {'relationships.team':'-', 'money':'-'}),
('Keep switching to whichever side is winning.', 'scene:246', {'wit':'+', 'relationships.team':'-', 'flags.turncoat':'set'})]),
dict(id='G11', name='A partner you may not be able to count on',
predicament='You are joined, or about to be joined, to a partner or ally, and you cannot be sure they will stand by you.',
actor='person choosing a partner', wants='someone to rely on', counterpart='a doubtful partner',
members=[12, 20, 37, 58, 60, 82, 90, 102, 120, 127, 181, 182, 184, 254, 256, 277, 284, 299],
options=[
('Ask for a surety before you join.', 'scene:277', {'prudence':'+', 'relationships.partner':'-'}),
('Decline: their ways would undo yours.', 'scene:12', {'prudence':'+', 'relationships.partner':'-'}),
('Save yourself and leave the partner to it.', 'scene:37', {'relationships.partner':'-', 'flags.deserted':'set'}),
('Bind yourself to them.', 'scene:90', {'relationships.partner':'+', 'standing':'risk'}),
('Hold them to their own words.', 'scene:120', {'wit':'+', 'relationships.partner':'-'})]),
dict(id='G12', name='Rushing in without looking',
predicament='Something you want is right in front of you, or you are intent on a target, and you have not looked at the danger.',
actor='eager person', wants='what is in front of them', counterpart='the danger they have not seen',
members=[13, 18, 32, 62, 99, 107, 140, 150, 216, 222, 247, 289, 308],
options=[
('Go for it now before it is gone.', 'scene:32', {'money':'risk', 'standing':'risk'}),
('Ask how you get out before going in.', 'scene:140', {'prudence':'+'}),
('Keep your eyes on your target.', 'scene:222', {'money':'+', 'standing':'risk'}),
('Wait for a surer sign before you act.', 'filled', {'prudence':'+', 'money':'-'})]),
dict(id='G13', name='Pointing at others\' faults',
predicament='Faults are being pointed out, by you or at you, and the one pointing shares the fault or gains by the blame.',
actor='critic or criticised', wants='to be in the right', counterpart='the other party',
members=[9, 28, 38, 84, 111, 116, 122, 153, 173, 188, 239, 257, 260, 306],
options=[
('Ask them to show you how.', 'scene:84', {'wit':'+', 'relationships.critic':'-'}),
('Point out that they do the same.', 'scene:122', {'wit':'+', 'relationships.critic':'-', 'standing':'+'}),
('Ask what they gain by the advice.', 'scene:38', {'wit':'+', 'relationships.adviser':'-'}),
('Find fault with everyone.', 'scene:257', {'standing':'-', 'relationships.colleagues':'-'}),
('Look at your own faults first.', 'filled', {'prudence':'+', 'relationships.colleagues':'+'})]),
dict(id='G14', name='Liberties between the weak and the strong',
predicament='Someone powerful is down, caged or out of reach, or someone small is needling you, and a blow could be struck.',
actor='weak or strong party', wants='to strike, or to be left alone', counterpart='the other party',
members=[49, 66, 77, 121, 145, 159, 175, 206, 232, 238, 252, 285, 298, 303, 305],
options=[
('Taunt them while they cannot reach you.', 'scene:66', {'standing':'+', 'relationships.powerful':'-'}),
('Pursue them however long it takes.', 'scene:303', {'relationships.powerful':'-', 'flags.revenge':'set', 'standing':'risk'}),
('Help them while they are down.', 'scene:298', {'relationships.powerful':'+', 'money':'-'}),
('Kick them now that they are down.', 'scene:232', {'relationships.powerful':'-', 'standing':'-'}),
('Let a small insult pass.', 'filled', {'prudence':'+'})]),
dict(id='G15', name='A hard lot',
predicament='You are stuck, worn down or beaten, and it is tempting to despair, complain, or wait for someone to rescue you.',
actor='person in hard times', wants='a way through', counterpart='their own circumstances',
members=[16, 61, 72, 87, 133, 157, 169, 191, 195, 227, 267, 273, 288, 301],
options=[
('Put your own shoulder to it.', 'scene:16', {'prudence':'+', 'money':'+'}),
('Try something nobody has tried.', 'scene:191', {'wit':'+', 'money':'+'}),
('Say you never wanted it anyway.', 'scene:195', {'standing':'+'}),
('Call on your backer.', 'scene:273', {'relationships.patron':'risk'}),
('Give it up entirely.', 'scene:87', {'standing':'-', 'flags.gave_up':'set'})]),
dict(id='G16', name='Worked hard, badly repaid',
predicament='You carry the load for the one you serve, and they take you for granted, work you into the ground or skim what you need.',
actor='worker', wants='fair treatment', counterpart='the one they serve',
members=[34, 45, 50, 74, 100, 118, 119, 142, 161, 196, 271, 283, 312],
options=[
('Carry on in silence.', 'scene:34', {'relationships.boss':'+', 'standing':'-'}),
('Tell them plainly what they are doing to you.', 'scene:50', {'relationships.boss':'risk', 'standing':'+'}),
('Remind them what you were.', 'scene:119', {'relationships.boss':'risk'}),
('Leave before you are next.', 'scene:118', {'prudence':'+', 'money':'-', 'relationships.boss':'-'}),
('Stop being so useful.', 'filled', {'money':'-', 'relationships.boss':'-'})]),
# ---- SMALL groups (5-12 fables): below the 13-fable recurrence rule, reported separately ----------
dict(id='G17', name='Letting a known predator inside', small=True, # SMALL: 6 fables
predicament='Someone with a predator\'s instincts is about to be let inside, or trained, or left in charge, and you know what they are.',
actor='keeper', wants='to use them safely', counterpart='a known predator',
members=[83, 129, 164, 210, 233, 281],
options=[
('Speak up before they are let in.', 'scene:164', {'relationships.boss':'risk', 'standing':'+'}),
('Trust them after long good behaviour.', 'scene:210', {'relationships.newcomer':'+', 'money':'risk'}),
('Let them go and cut your losses.', 'scene:129', {'money':'-', 'prudence':'+'}),
('Train them to your uses.', 'scene:83', {'money':'+', 'relationships.newcomer':'risk'})]),
dict(id='G18', name='The lion\'s share', small=True, # SMALL: 6 fables
predicament='You did the work alongside someone far stronger, and now the proceeds are being divided on their terms.',
actor='junior partner', wants='a fair share', counterpart='a far stronger partner',
members=[3, 101, 130, 158, 274, 309],
options=[
('Divide it fairly.', 'scene:158', {'relationships.partner':'-', 'standing':'risk'}),
('Leave yourself almost nothing.', 'scene:158', {'money':'-', 'relationships.partner':'+'}),
('Go it alone next time.', 'scene:274', {'money':'risk', 'relationships.partner':'-'}),
('Ask for what you were promised.', 'scene:3', {'relationships.partner':'-', 'standing':'risk'})]),
dict(id='G19', name='A bad record when you need trust', small=True, # SMALL: 5 fables
predicament='You need people to believe you or help you now, and your record gives them every reason not to.',
actor='person with a past', wants='to be believed', counterpart='those who remember',
members=[54, 104, 229, 235, 243],
options=[
('Raise the alarm anyway.', 'scene:54', {'standing':'-'}),
('Make a new promise to a new patron.', 'scene:243', {'relationships.patron':'-'}),
('Do a good turn to mend your name.', 'scene:235', {'relationships.neighbour':'risk'}),
('Earn trust in good times, before you need it.', 'filled', {'relationships.allies':'+'})]),
dict(id='G20', name='A warning before the trouble', small=True, # SMALL: 6 fables
predicament='Trouble is coming but not yet here, and you must decide whether to prepare, warn others, or take the threat seriously.',
actor='person with warning', wants='to be ready', counterpart='the trouble coming',
members=[35, 112, 174, 214, 241, 249],
options=[
('Prepare now while it is quiet.', 'scene:112', {'prudence':'+', 'money':'-'}),
('Warn the others though they laugh.', 'scene:249', {'standing':'-', 'relationships.team':'-'}),
('Wait until they mean it.', 'scene:214', {'prudence':'+'}),
('Put it off until next time.', 'scene:241', {'money':'+', 'prudence':'-'})]),
]
# Protagonist's power in the situation each predicament describes, for stage assignment (DESIGN.md
# "Stages"). One fable is one scene, so this is per fable. 'high' means the "you" of the predicament
# holds power over the others in it, 'middle' that they deal as a peer, 'low' that they are at
# someone's mercy or under their orders.
HIGH = {0, 4, 17, 33, 49, 69, 73, 84, 85, 86, 89, 126, 137, 152, 153, 156, 162, 173, 175, 183, 202,
203, 213, 220, 229, 230, 231, 257, 261, 269, 271, 277, 278, 288, 293, 305, 312}
MIDDLE = {2, 6, 7, 10, 12, 14, 15, 21, 22, 23, 24, 25, 27, 28, 30, 31, 37, 38, 40, 42, 44, 46, 48, 51,
58, 59, 60, 61, 62, 65, 67, 71, 78, 83, 91, 93, 95, 96, 97, 102, 103, 105, 108, 111, 112, 114,
116, 120, 123, 124, 129, 132, 138, 139, 140, 141, 143, 148, 149, 150, 151, 154, 155, 159,
160, 163, 165, 167, 168, 171, 174, 179, 180, 182, 184, 185, 186, 188, 190, 192, 194, 199,
201, 209, 210, 212, 219, 222, 224, 225, 227, 233, 235, 236, 239, 242, 244, 245, 249, 250,
251, 252, 256, 260, 262, 263, 270, 272, 281, 282, 289, 290, 296, 297, 298, 299, 302, 304, 310}
STANDING = {i: 'high' if i in HIGH else 'middle' if i in MIDDLE else 'low' for i in range(313)}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,342 @@
"""The options measurement: which catalogue situations the fables supply options for, and whether the
fable itself shows where each option's moves go. Hand-written by Claude reading every fable; no inference.
Each row: (entry, chunk, text, moves, evidence, stated)
entry a catalogue v2 id, or 'new:<id>' defined in NEW_ENTRIES
chunk the fable the option comes from (written out as source 'chunk:N')
text the move, transplanted to a workplace
moves spine paths with a direction. Only money, standing and relationships.<role>: a skill label
or a flag is a design decision about the option, not an outcome a story can show, so
none is used here (the group options in groups_src.py carry them)
evidence a verbatim excerpt of the fable, at most 30 words, or 'M' for the fable's stated moral
stated True only if the fable's own outcome or moral shows the direction of EVERY path in moves.
How an outcome is read as a direction (the same reading for every row):
money goods, food, pay, property or a prize gained (+) or lost (-); a heavier load or harder
work for the same keep counts as (-)
standing the actor's safety, position or name: made king, spared, pardoned, praised, winning
the contest (+); killed, caught, beaten, driven out, exposed or publicly rebuked (-)
relationships.<role> how that party treats the actor afterwards: repays, rescues, makes peace (+);
turns on them, deserts them, refuses them, stops trusting them (-)
'risk' stated only when the same fable shows the same move ending both ways
A moral that only calls a move wise or foolish does not state a direction; one that names the
effect ("wins the race", "lost both") does. An outcome that befalls the actor but is not caused by
the move (the sparrow taken by a hawk while mocking the hare) is not counted as stated.
"""
NEW_ENTRIES = {
'friendly_predator': ('A friendly approach from someone who would gain by your fall',
'Someone whose nature is to prey on people like you comes friendly, praising, inviting, offering peace or a small favour to ask, and what they propose would put you in their reach.',
'near sure_thing (an easy fortune that is a trap) and not_who_they_seem (a false face among you); here the danger is known, and the bait is friendship, not fortune'),
'better_the_devil': ('Trading one hardship for another',
'Your present master, protector or post is hard on you, and you could change it, though the new one may be worse.',
'no v2 entry; the decision is whether to change your lot, not how to bear it'),
'ape_your_betters': ('Envying another\'s gift',
'You envy a colleague\'s gift, looks or standing so much that you are tempted to copy them, ask for what they have, or leave your own kind to join theirs.',
'near overlooked (wanting, once, to be noticed beside the admired one); here the move is imitation'),
'riding_high': ('Riding high',
'Things are going your way, and you are tempted to show it: crow, parade your honours, or take on someone bigger.',
'no v2 entry; the fables\' most common turn, pride before a fall'),
'sneered_at': ('Sneered at by someone showier',
'A showier or better-placed colleague sneers at your plainness, slowness or load; you are the one sneered at, or the one sneering.',
'near power_over_you and despised, but the sneerer has no power over you'),
'grasping': ('Wanting more than you hold',
'You already have something good, and the chance to grab more, squeeze more out of it, or stay longer is tempting you.',
'no v2 entry'),
'divided': ('Your side divided',
'You and a rival, or the people on your own side, are quarrelling, and someone else stands to profit from it.',
'no v2 entry'),
'doubtful_ally': ('A partner you may not be able to count on',
'You are joined, or about to be joined, to a partner or ally, and cannot be sure they will stand by you.',
'near used; here nothing is hidden yet, the question is whether to rely on them'),
'heedless': ('Rushing in without looking',
'Something you want is right in front of you, or you are intent on a target, and you have not looked at the danger.',
'no v2 entry'),
'pot_and_kettle': ('Pointing at others\' faults',
'Faults are being pointed out, by you or at you, and the one pointing shares the fault or gains by the blame.',
'near own_words_back'),
'needling_the_strong': ('Liberties between the weak and the strong',
'Someone powerful is down, caged or out of reach, or someone small is needling you, and a blow could be struck.',
'near revenge and at_their_mercy'),
'hard_lot': ('A hard lot',
'You are stuck, worn down or beaten, and it is tempting to despair, complain, or wait for someone to rescue you.',
'near dead_end, which is years of thankless work; this is any hardship'),
'used_up': ('Worked hard, badly repaid',
'You carry the load for the one you serve, and they take you for granted, work you into the ground or skim what you need.',
'near overlooked and bow_for_your_living'),
'predator_inside': ('Letting a known predator inside',
'Someone with a predator\'s instincts is about to be let in, trained or left in charge, and you know what they are.',
'near warning'),
'lions_share': ('The lion\'s share',
'You did the work alongside someone far stronger, and the proceeds are being divided on their terms.',
'near used and power_over_you'),
'bad_record': ('A bad record when you need trust',
'You need people to believe or help you now, and your record gives them every reason not to.',
'near unbelievable_truth, but here the listeners are right to doubt you'),
'asking_above': ('Asking the power above for a favour',
'You can ask someone far above you for a favour, a change or a rescue, and what you ask for may not serve you.',
'near patron and benefactor; the fables\' petitions to Jupiter'),
'please_everyone': ('Trying to please everyone',
'Several people want different things of you, and changing to suit each one in turn is tempting.',
'near peace_at_home'),
'make_them_move': ('Getting someone to move',
'You need someone to do or give up something, and must choose between coaxing, tricking and forcing them.',
'no v2 entry'),
}
M = 'M'
O = [
# ---- at the mercy of the powerful ----------------------------------------------------------------
('at_their_mercy', 1, 'Answer every charge with the facts.', {'standing':'-'}, M, True),
('at_their_mercy', 5, 'Tell each captor you belong to the side they spare.', {'standing':'+'}, 'The Bat assured him that he was not a mouse, but a bat, and thus a second time escaped.', True),
('at_their_mercy', 26, 'Plead your good character, though you were caught with the wrongdoers.', {'standing':'-'}, 'I have taken you with these robbers, the Cranes, and you must die in their company.', True),
('at_their_mercy', 39, 'Defend yourself against the excuse they have found.', {'standing':'-'}, 'Although you abound in specious apologies, I shall not remain supperless;', True),
('at_their_mercy', 55, 'Ask them to stop, since their sport is your ruin.', {'relationships.powerful':'+'}, 'Pray stop, my boys: what is sport to you, is death to us.', False),
('at_their_mercy', 131, 'Plead how useful you are when they must cut someone.', {'standing':'risk'}, 'The Birdcatcher spared his life, and determined to pick out a fine young Cock just attaining to his comb.', True),
('at_their_mercy', 135, 'Show the one real talent that sets you apart.', {'standing':'+'}, 'made himself known by his voice, and preserved his life by his melody.', True),
('at_their_mercy', 147, 'Plead your usefulness to people your usefulness threatens.', {'standing':'-'}, 'That is the very reason why we must the more kill you,', True),
('at_their_mercy', 197, 'Ask the one who has you for a small favour that may draw help.', {'standing':'+'}, 'some hounds hearing the sound ran up and began chasing the Wolf.', True),
('at_their_mercy', 211, 'Argue that everyone should be equal, with nothing to back it.', {'standing':'-'}, 'Your words, O Hares! are good; but they lack both claws and teeth such as we have.', False),
('at_their_mercy', 217, 'Ask for a small service that puts them off guard.', {'standing':'+', 'relationships.captor':'-'}, 'the Ass, with his heels, kicked his teeth into his mouth and galloped away.', True),
('at_their_mercy', 248, 'Plead that you never did harm yourself, you only urged others on.', {'standing':'-'}, 'That is the very reason for which you should be put to death,', True),
('at_their_mercy', 292, 'Offer to deliver your colleagues in return for your own escape.', {'standing':'-'}, 'I shall now with less scruple take your life, because you are willing to save it at the cost of betraying your friends and relations.', True),
('at_their_mercy', 293, 'Plead that your offence was too small to matter.', {'standing':'-'}, 'Now you shall certainly die by mine own hands, for no evil, whether it be small or large, ought to be tolerated.', True),
('station', 43, 'Agree to the powerful suitor, on a condition that leaves them harmless.', {'relationships.powerful':'-'}, 'the Woodman, no longer afraid, set upon him with his club, and drove him away into the forest.', True),
('power_over_you', 205, 'Give a vain leader your honest opinion.', {'standing':'-'}, 'The King of the Apes, enraged at hearing these truths, gave him over to the teeth and claws of his companions.', True),
('power_over_you', 205, 'Flatter a vain leader.', {'money':'+'}, 'The Ape and all his court, gratified with the lie, commanded that a handsome present be given to the flatterer.', True),
# ---- a friendly approach from a predator ----------------------------------------------------------
('new:friendly_predator', 36, 'Stay outside and ask after them from a safe distance.', {'relationships.predator':'-'}, 'I notice that there are many prints of feet entering your cave, but I see no trace of any returning.', False),
('new:friendly_predator', 36, 'Go in when they call you close.', {'standing':'-'}, 'The beasts expressed their sorrow, and came one by one to his den, where the Lion devoured them.', True),
('new:friendly_predator', 63, 'Dismiss your protectors to make peace with your enemies.', {'standing':'-'}, 'The Sheep, poor silly creatures, were easily beguiled and dismissed the Dogs, whereupon the Wolves destroyed the unguarded flock at their own pleasure.', True),
('new:friendly_predator', 64, 'Tell the helper you will stay well if they go away.', {'relationships.predator':'-'}, 'We are all very well, and shall continue so, if you will only be good enough to go away, and leave us as we are.', False),
('new:friendly_predator', 92, 'Refuse the small favour that would bring you in reach.', {'relationships.predator':'-'}, M, False),
('new:friendly_predator', 96, 'Speak up to prove the flatterer\'s one doubt wrong.', {'money':'-', 'standing':'-'}, 'My good Crow, your voice is right enough, but your wit is wanting.', True),
('new:friendly_predator', 144, 'Stay put, however harmless they now look.', {'relationships.predator':'-'}, 'even though you should turn into a meal-bag, we will not come near you.', False),
('new:friendly_predator', 192, 'Act at once on a stranger\'s alarming story.', {'money':'-'}, 'The Thief made off with the coat and did not return again to the inn.', True),
('new:friendly_predator', 207, 'Go for the tempting thing lying in the dark corner.', {'standing':'-'}, 'A Mouse, supposing him to be food, leaped upon him, and was instantly caught and squeezed to death.', True),
('new:friendly_predator', 215, 'Send the flatterer round to the one who guards you.', {'relationships.predator':'-'}, 'When the Fox approached the tree, the Dog sprang out and caught him, and tore him to pieces.', True),
('new:friendly_predator', 219, 'Look at the preparations and leave without a word.', {'relationships.host':'-'}, 'The Lion inquired why he went off so abruptly without a word of salutation to his host', True),
('new:friendly_predator', 221, 'Accept the sudden praise and invitation of someone you annoyed.', {'standing':'-'}, 'The Owl came forth from her hollow, seized her, and put her to death.', True),
('new:friendly_predator', 225, 'Stay on your secure ledge and name what they are after.', {'relationships.predator':'-'}, 'it is not for the pasture that you invite me, but for yourself, who are in want of food.', False),
('in_your_keeping', 204, 'Refuse a stranger\'s sudden favours and keep watch.', {'relationships.stranger':'-'}, 'This sudden kindness at your hands will only make me more watchful', False),
('sure_thing', 73, 'Take up the windfall a jealous colleague says they kept for you.', {'standing':'-'}, 'The Monkey approached carelessly and was caught in the trap;', True),
('used', 30, 'Let the one in trouble climb out on your back, on a promise to pull you after.', {'relationships.partner':'-', 'standing':'-'}, 'he safely reached the mouth of the well and made off as fast as he could.', True),
('used', 309, 'Hand your catch to someone who says they will pay for it.', {'money':'-'}, 'However, when the Horseman got the hare, he rode off as fast as he could.', True),
('your_scheme', 185, 'Warn each neighbour privately that the other plots against them.', {'money':'+'}, 'afforded ample provision for the Cat and her kittens.', True),
('your_scheme', 56, 'Repeat the shortcut that lightened your load once.', {'money':'-'}, 'And thus his trick recoiled on him, for he now carried on his back a double burden.', True),
('your_scheme', 218, 'Out of envy, urge a colleague to fake an illness to escape work.', {'standing':'-'}, 'They at once killed the Goat, and so healed the Ass.', True),
('compromise_for_money', 172, 'Hand over what you guard, for a share with the rivals.', {'standing':'-'}, 'entering the den of the Wolves, they were set upon and torn to pieces.', True),
('compromise_for_money', 268, 'Tell the truth about what you lost, though a richer answer is offered.', {'money':'+'}, 'Mercury, pleased with his honesty, gave him the golden and silver axes in addition to his own.', True),
('compromise_for_money', 268, 'Claim the richer thing is yours.', {'money':'-'}, 'not only took away the golden axe, but refused to recover for him the axe he had thrown into the pool.', True),
('pressed_to_wrong', 20, 'Hand your partner over to the powerful in return for your own safety.', {'standing':'-', 'relationships.partner':'-'}, 'The Lion, seeing that the Ass was secured, immediately clutched the Fox, and attacked the Ass at his leisure.', True),
('strings', 199, 'Accept a powerful helper\'s harness to get your revenge.', {'standing':'-'}, 'instead of obtaining revenge on the Stag, he had enslaved himself to the service of man.', True),
('strings', 115, 'Turn down a comfortable post that comes with a chain.', {'money':'-'}, 'May no friend of mine ever be in such a plight; for the weight of this chain is enough to spoil the appetite.', False),
# ---- trading hardships, and asking the power above ------------------------------------------------
('new:better_the_devil', 47, 'Keep demanding a stronger leader from above.', {'standing':'-'}, 'sent a Heron, who preyed upon the Frogs day by day till there were none left to croak upon the lake.', True),
('new:better_the_devil', 53, 'Keep the harm you know rather than risk a worse replacement.', {'standing':'+'}, M, False),
('new:better_the_devil', 76, 'Get rid of what sets the harsh pace.', {'money':'-'}, 'woke them up to their work in the middle of the night.', True),
('new:better_the_devil', 79, 'Invite a powerful protector inside.', {'standing':'-'}, 'he made more havoc and slew a larger number of them in one day than the Kite could pounce upon in a whole year.', True),
('new:better_the_devil', 109, 'Sell what you have and stake it all on a calm-looking trade.', {'money':'-'}, 'he threw all his merchandise overboard, and barely escaped with his life in the empty ship.', True),
('new:better_the_devil', 125, 'Ask for a new master each time you are unhappy.', {'money':'-'}, 'The Ass found that he had fallen into worse hands', True),
('new:better_the_devil', 136, 'Flee into the shelter of someone more dangerous.', {'standing':'-'}, 'when she was safe within the cave, sprang upon her and tore her to pieces.', True),
('new:better_the_devil', 176, 'Leave the field you are made for to chase better prospects.', {'standing':'-'}, 'A Fox came across him, and being very hungry ate him up.', True),
('new:better_the_devil', 177, 'Refuse to fight a takeover, since any master will work you the same.', {'relationships.boss':'-'}, M, False),
('new:better_the_devil', 178, 'Keep the sated drainers rather than invite hungrier ones.', {'money':'+'}, 'others more hungry will come in their place, and will drink up all the blood I have left.', False),
('new:better_the_devil', 189, 'Stay in your familiar, exposed spot.', {'standing':'-'}, 'A few days afterwards a heavy wagon passed through the gully and crushed him to death under its wheels.', True),
('new:better_the_devil', 228, 'Go back to plain fare where you can live without fear.', {'money':'-'}, 'I prefer my bare plowlands and roots from the hedgerow, where I can live in safety, and without fear.', True),
('new:better_the_devil', 291, 'Take refuge with those who may also harm you, rather than with the one chasing you.', {'standing':'+'}, 'It would be better for me to be sacrificed in the Temple than to be eaten by you.', False),
('new:asking_above', 16, 'Wait for someone powerful to rescue you before you try.', {'relationships.patron':'-'}, 'never more pray to me for help, until you have done your best to help yourself', True),
('new:asking_above', 114, 'Ask your patron for the power to punish anyone who touches what is yours.', {'standing':'risk'}, 'if you use your sting, it shall remain in the wound you make, and then you will die from the loss of it.', False),
('new:asking_above', 157, 'Smash your ties with the patron who never helped you.', {'money':'+'}, 'When its head was knocked off, out came a stream of gold, which the Carpenter quickly picked up', True),
('new:asking_above', 297, 'Ask the boss for a colleague\'s distinctions as well as your own.', {'standing':'-'}, 'not only refused to give him horns, but even deprived him of a portion of his ears.', True),
# ---- envy and pretence ----------------------------------------------------------------------------
('new:ape_your_betters', 2, 'Copy the habits of the one you admire.', {'standing':'-'}, 'The Ass resolved that he would live only upon dew, and in a short time died of hunger.', True),
('new:ape_your_betters', 29, 'Pay someone powerful to lift you into a role beyond your nature.', {'standing':'-'}, 'suddenly he let her go, and she fell on a lofty mountain, dashing her shell to pieces.', True),
('new:ape_your_betters', 31, 'Give up the work that feeds you to copy their habits.', {'money':'-'}, 'he could not change their color, while through want of food he perished.', True),
('new:ape_your_betters', 52, 'Try the favourite\'s tricks on the boss.', {'standing':'-'}, 'drove out the Ass to his stable with kicks and clubs and cuffs.', True),
('new:ape_your_betters', 68, 'Puff yourself up to match the one who crushed yours.', {'standing':'-'}, 'you would, I assure you, sooner burst than successfully imitate the hugeness of that monster.', False),
('new:ape_your_betters', 98, 'Copy the antics everyone applauded in a favourite.', {'standing':'-'}, 'The owner went up after him and quickly drove him down, beating him severely with a thick wooden cudgel.', True),
('new:ape_your_betters', 134, 'Try the experts\' job with their tools, untaught.', {'standing':'-'}, 'became tangled in the meshes and drowned.', True),
('new:ape_your_betters', 170, 'Speak up as if your word carried a respected colleague\'s weight.', {'standing':'-'}, M, True),
('new:ape_your_betters', 180, 'Copy an admired style until you lose your own.', {'standing':'-'}, 'in trying to neigh, they forgot how to sing.', False),
('new:ape_your_betters', 186, 'Leave your peers to live among those at the top.', {'standing':'-'}, 'in a herd of lions you are definitely a wolf.', False),
('new:ape_your_betters', 258, 'Try a bigger version of the star performer\'s feat.', {'standing':'-'}, 'He at once clipped the Jackdaw’s wings, and taking him home at night, gave him to his children.', True),
('new:ape_your_betters', 265, 'Get up and try to outdo the colleague everyone applauded.', {'standing':'-'}, 'the Beasts, in a fit of indignation, set upon him with clubs and drove him out of the assembly.', True),
('pretence', 40, 'Disguise yourself as one of the harmless to get what you want.', {'standing':'-'}, 'mistakenly caught up the Wolf instead of a sheep, and killed him instantly.', True),
('pretence', 42, 'Boast of a feat done far away, with witnesses.', {'standing':'-'}, 'Suppose this to be Rhodes, and leap for us.', False),
('pretence', 65, 'Present yourself decked in achievements borrowed from colleagues.', {'standing':'-', 'relationships.colleagues':'-'}, 'each plucked from him his own feathers, leaving the Jackdaw nothing but a Jackdaw.', True),
('pretence', 198, 'Lie about your background to someone helping you as one of their own.', {'standing':'-'}, 'The Dolphin, indignant at these falsehoods, dipped the Monkey under the water and drowned him.', True),
('pretence', 200, 'Disguise yourself to share a better-fed group\'s benefits.', {'standing':'-', 'relationships.own_kind':'-'}, 'They too, not recognizing him on account of his color, expelled him from living with them.', True),
('pretence', 201, 'Inflate your background where nobody can contradict you.', {'standing':'-'}, M, False),
('pretence', 234, 'Confess when your fake expertise is about to be tested.', {'standing':'-'}, 'confessed that he had no knowledge of medicine, and was only made famous by the stupid clamors of the crowd.', True),
('pretence', 251, 'Borrow the trappings of authority and frighten people with them.', {'standing':'-'}, 'I might possibly have been frightened myself, if I had not heard your bray.', True),
('courage_doubted', 138, 'Talk big, then back out when offered the real thing.', {'standing':'-'}, 'it is his track only I am in search of, not the Lion himself.', False),
('courage_doubted', 270, 'Run when your partner is in danger, then boast once it is over.', {'relationships.partner':'-'}, 'no dependence can be placed on your valor.', True),
('habit', 148, 'Let an old appetite break your polished act.', {'standing':'-'}, 'The dancing spectacle thus came to an end amidst the laughter and ridicule of the audience.', True),
('habit', 302, 'Let an old temptation pull you out of your new role.', {'standing':'-'}, 'Venus was much disappointed and again caused her to return to her former shape.', True),
('caught_out', 99, 'Relax once the careless have passed you by.', {'standing':'-'}, 'he ordered that the Stag should be seized and killed.', True),
('caught_out', 160, 'Laugh along when your secret is exposed.', {'relationships.companions':'+'}, 'with great glee joined in the joke', False),
('cover_up_spiral', 41, 'Ask the witness to keep quiet about the damage.', {'relationships.boss':'-'}, 'the horn will speak though I be silent.', False),
# ---- riding high, and the sneer -------------------------------------------------------------------
('new:riding_high', 27, 'Make a great commotion about what you are about to produce.', {'standing':'-'}, 'out came a Mouse.', False),
('new:riding_high', 57, 'Parade the mark you take for an honour.', {'standing':'-'}, 'a public notice to all men to avoid you as an ill mannered dog.', True),
('new:riding_high', 71, 'Crow over your beaten rival from the most exposed place.', {'standing':'-'}, 'An Eagle sailing through the air pounced upon him and carried him off in his talons.', True),
('new:riding_high', 108, 'Wear your marks of rank into the fight.', {'standing':'-'}, 'The generals, not being able to get in on account of the ornaments on their heads, were all captured and eaten by the Weasels.', True),
('new:riding_high', 110, 'Chase someone powerful who has just backed off from another.', {'standing':'-'}, 'the Lion, turning about, seized him and tore him to pieces.', True),
('new:riding_high', 117, 'Take the bows meant for what you carry as your own.', {'standing':'-'}, 'laid his whip lustily about his shoulders', True),
('new:riding_high', 126, 'Ask, incognito, how highly you are rated.', {'standing':'-'}, 'Well, if you will buy these, I’ll fling you that into the bargain.', True),
('new:riding_high', 141, 'Claim to outshine the people who truly lead.', {'standing':'-'}, 'Boast no more, but henceforth be content to give thy light in silence.', True),
('new:riding_high', 194, 'Celebrate loudly after beating a powerful opponent.', {'standing':'-'}, 'he became entangled in the meshes of a cobweb and was eaten by a spider.', False),
('new:riding_high', 245, 'Think yourself bigger than those above you.', {'standing':'-'}, 'this overestimation of myself is the cause of my destruction.', True),
('new:riding_high', 264, 'Make a show of whether to leave, sure you will be missed.', {'standing':'-'}, 'I did not know you had come, and I shall not miss you when you go away.', True),
('new:riding_high', 290, 'Carry your valuable load with your bells ringing.', {'money':'-', 'standing':'-'}, 'wounded with a sword the Mule carrying the treasure, which they greedily seized while taking no notice of the grain.', False),
('new:sneered_at', 7, 'Answer that your plainness lasts when times turn hard.', {'standing':'+'}, 'The Crow put an end to the dispute by saying,', True),
('new:sneered_at', 11, 'Challenge the one who mocks you, and keep a steady pace.', {'standing':'+'}, M, True),
('new:sneered_at', 11, 'Take the contest for granted and rest.', {'standing':'-'}, 'he saw the Tortoise had reached the goal, and was comfortably dozing after her fatigue.', True),
('new:sneered_at', 22, 'Answer that yours are few but of real quality.', {'standing':'+'}, M, False),
('new:sneered_at', 70, 'Mock the hard worker from your idle favour.', {'standing':'-'}, 'For this you were allowed to live in idleness, because you were presently to be sacrificed.', False),
('new:sneered_at', 155, 'Answer the display of credentials with your wits.', {'standing':'+'}, 'And how much more beautiful than you am I, who am decorated, not in body, but in mind.', False),
('new:sneered_at', 167, 'Answer the show-off with what you can actually do.', {'standing':'+'}, M, False),
('new:sneered_at', 223, 'Hold your peace and wait for their fall.', {'relationships.rival':'-'}, 'The Ass held his peace, and made only a silent appeal to the justice of the gods.', False),
('new:sneered_at', 223, 'Sneer at a laden colleague from your height of favour.', {'standing':'-'}, 'the Horse, having become broken-winded, was sent by his owner to the farm.', False),
('new:sneered_at', 226, 'Heed only the one in charge, not the loud one.', {'relationships.boss':'+'}, 'I only care for him who sits above you', False),
('new:sneered_at', 310, 'Keep up appearances in every season, and mock those who scale back.', {'standing':'-'}, 'at once despoiling it of its beauty and killing the tree.', True),
('new:sneered_at', 310, 'Scale back in lean seasons, whatever the mockers say.', {'standing':'+'}, 'the snow fell through to the ground, and did not injure it at all.', False),
# ---- help asked, and who repays -------------------------------------------------------------------
('plea_for_help', 0, 'Spare someone beneath you who begs to be let off.', {'relationships.spared':'+'}, 'now you know that it is possible for even a Mouse to confer benefits on a Lion.', True),
('plea_for_help', 10, 'Refuse someone who idled while you saved.', {'relationships.asker':'-'}, 'If you were foolish enough to sing all the summer, you must dance supperless to bed in the winter.', False),
('plea_for_help', 10, 'Ask those who saved to share with you, having idled yourself.', {'standing':'-'}, 'If you were foolish enough to sing all the summer, you must dance supperless to bed in the winter.', True),
('plea_for_help', 23, 'Take in and nurse someone known for treachery.', {'relationships.helped':'-', 'standing':'-'}, 'bit its benefactor, inflicting on him a mortal wound.', True),
('plea_for_help', 51, 'Refuse to take any of a struggling partner\'s load.', {'relationships.partner':'-', 'money':'-'}, 'I should not now be bearing, together with his burden, himself as well.', True),
('plea_for_help', 132, 'Help someone in trouble who can give nothing now.', {'relationships.helped':'+'}, 'The Ant, perceiving his design, stung him in the foot.', True),
('plea_for_help', 154, 'Free someone caught in a trap.', {'relationships.freed':'+'}, 'he marveled at the service rendered him by the Eagle.', True),
('plea_for_help', 190, 'Rescue someone from a dangerous enemy.', {'relationships.rescued':'+', 'relationships.enemy':'-'}, 'The Serpent, irritated at the escape of his prey, injected his poison into the drinking horn of the countryman.', True),
('plea_for_help', 230, 'Give to those who already serve you, not to those who promise.', {'relationships.staff':'+'}, 'It is surely better for me to give the water to them than to you.', False),
('plea_for_help', 286, 'Grab for help from someone known to take from everyone.', {'standing':'-'}, 'Having pricked and grievously torn the soles of his feet', True),
('plea_for_help', 296, 'Pull the thorn from someone dangerous who is in pain.', {'relationships.helped':'+', 'standing':'+'}, 'the Shepherd to be pardoned and restored to his friends.', True),
('protecting_hunted', 127, 'Protect the hunted in words while your gestures give them away.', {'relationships.hunted':'-'}, 'the Fox departed without taking any notice of the Woodcutter', True),
('protecting_hunted', 193, 'Help yourself to your protector\'s things once the danger seems past.', {'standing':'-'}, 'seeing the Hart, shot an arrow from his bow and struck it.', True),
('despised', 0, 'Offer your help to someone powerful who laughs at the idea.', {'relationships.powerful':'+'}, 'The Lion laughed and let him go.', True),
('unwelcome_in_home', 261, 'Let someone use your space a little longer.', {'money':'-'}, 'asserted her exclusive right to the place and would not permit the shepherd to approach.', True),
('unwelcome_in_home', 294, 'Keep promising the neighbour who wants you gone that you will leave soon.', {'relationships.neighbour':'+'}, 'the rich man became accustomed to the smell, and feeling no manner of inconvenience, made no further complaints.', False),
('after_your_money', 60, 'Let every well-wisher help themselves while you are down.', {'money':'-'}, 'he died, not from his sickness, but from the failure of the means of living.', True),
# ---- wanting more ---------------------------------------------------------------------------------
('new:grasping', 15, 'Let go of what you hold to snatch at a bigger prize.', {'money':'-'}, 'He thus lost both:', True),
('new:grasping', 21, 'Keep indulging in the easy pleasure.', {'standing':'-'}, 'for the sake of a little pleasure we have destroyed ourselves.', True),
('new:grasping', 46, 'Take half and get your hand free.', {'money':'-'}, 'Be satisfied with half the quantity, and you will readily draw out your hand.', False),
('new:grasping', 95, 'Repeat the pleasing exchange every day.', {'relationships.partner':'-'}, 'If you go on in this way, you will soon destroy by frequent use the pleasure of your exchange', False),
('new:grasping', 113, 'Spend, in your head, what your one asset will become.', {'money':'-'}, 'down fell the milk pail to the ground, and all her imaginary schemes perished in a moment.', True),
('new:grasping', 137, 'Keep the small sure catch rather than wait for a bigger one.', {'money':'+'}, 'I were to forego my present certain gain.', True),
('new:grasping', 139, 'Help yourself freely to what is left unguarded.', {'standing':'-'}, 'he was so full that he was not able to get out', False),
('new:grasping', 151, 'Bite off more than you can swallow in someone else\'s field.', {'standing':'-'}, 'burst its deep gullet-bag and lay down on the shore to die.', True),
('new:grasping', 156, 'Leave the sure win to chase the bigger prize.', {'money':'-'}, 'I am rightly served, for having let go of the food that I had in my hand for the chance of obtaining more.', True),
('new:grasping', 168, 'Break open the steady source to get everything at once.', {'money':'-'}, 'deprived themselves of the gain of which they were assured day by day.', True),
('new:grasping', 179, 'Feed the steady source extra to double what it yields.', {'money':'-'}, 'the Hen became fat and sleek, and never once laid another egg.', True),
('new:grasping', 213, 'Keep the one in hand rather than chase bigger ones not yet in sight.', {'money':'+'}, 'I should indeed have lost my senses if I should let go food ready in my hand', True),
('new:grasping', 266, 'Agree on a plan that needs the impossible to reach what you want.', {'standing':'-'}, 'they burst themselves with drinking long before they reached the hides.', True),
('new:grasping', 279, 'Linger where it is most rewarding.', {'standing':'-'}, 'For the sake of a little pleasant food I have deprived myself of my life.', True),
('mistook_them', 44, 'Hoard what you never use.', {'money':'-'}, 'digging down, came to the lump of gold, and stole it.', True),
('mistook_them', 262, 'Prize your showy strengths over your plain ones.', {'standing':'-'}, 'These feet which would have saved me I despised, and I gloried in these antlers which have proved my destruction.', True),
# ---- divided sides and doubtful partners ----------------------------------------------------------
('new:divided', 4, 'Show your quarrelling people that together they cannot be broken.', {'relationships.team':'+'}, 'if you are divided among yourselves, you will be broken as easily as these sticks.', False),
('new:divided', 75, 'Stop supplying the part you resent.', {'standing':'-'}, 'The whole Body quickly became debilitated', True),
('new:divided', 80, 'Offer to settle a quarrel between powerful factions.', {'relationships.factions':'-'}, 'We would far rather be destroyed in our battle with each other than admit any interference from you in our affairs.', True),
('new:divided', 105, 'Make peace with your rival once you see others waiting to profit.', {'relationships.rival':'+'}, 'They at once made up their quarrel', True),
('new:divided', 124, 'Fight a client over a technicality.', {'money':'-'}, 'The quarrel proceeded from words to blows, and while the men fought, the Ass galloped off.', True),
('new:divided', 152, 'Fight a rival to exhaustion over one prize.', {'money':'-'}, 'He ran in between them, and seizing the Kid scampered off as fast as he could.', True),
('new:divided', 171, 'Give up one junior member when you are asked.', {'standing':'-'}, 'The first step has lost us all.', True),
('new:divided', 185, 'Believe a colleague\'s whisper that your neighbour means you harm.', {'relationships.neighbour':'-', 'standing':'-'}, 'the Eagle, full of fear of the Sow, sat still on the branches, and the Sow, terrified by the Eagle, did not dare to go out from her cave.', True),
('new:divided', 224, 'Go your own way when a smooth talker suggests it.', {'standing':'-'}, 'he attacked them without fear as they fed alone, and feasted on them one by one at his own leisure.', True),
('new:divided', 246, 'Keep switching to whichever side is winning.', {'relationships.both_sides':'-', 'standing':'-'}, 'being condemned by each for his treachery, he was driven forth from the light of day', True),
('new:doubtful_ally', 12, 'Decline to share premises with someone whose work undoes yours.', {'money':'-'}, 'whatever I should whiten, you would immediately blacken again with your charcoal.', False),
('new:doubtful_ally', 37, 'Save yourself and leave your companion to face it.', {'relationships.companion':'-'}, 'Never travel with a friend who deserts you at the approach of danger.', True),
('new:doubtful_ally', 58, 'Treat new allies better than old ones to win them.', {'relationships.new_allies':'-'}, 'the Wild Goats scampered away as fast as they could to the mountains.', True),
('new:doubtful_ally', 90, 'Bind your fortunes to a new acquaintance on their ground.', {'standing':'-'}, 'The unhappy Mouse was soon suffocated by the water', True),
('new:doubtful_ally', 102, 'Swear friendship with an impressive ally from another field.', {'relationships.ally':'-'}, 'The Lion abused him as a traitor.', True),
('new:doubtful_ally', 182, 'Decline to join the weak side against the powerful.', {'relationships.weak_side':'-'}, M, False),
('new:doubtful_ally', 184, 'Refuse a loan guaranteed by someone known for taking and running.', {'relationships.borrower':'-'}, 'How then shall I be able to find you, when the day of payment comes?', False),
('new:doubtful_ally', 256, 'Argue both sides of a question in front of a new ally.', {'relationships.ally':'-'}, 'I can no longer consider you as a friend', True),
('new:doubtful_ally', 259, 'Take from a weaker neighbour who trusted you.', {'standing':'-'}, 'the eaglets, as yet unfledged and helpless, were roasted in their nest and dropped down dead at the bottom of the tree.', False),
('new:doubtful_ally', 277, 'Ask for a surety before allying with someone who can walk away.', {'relationships.ally':'-'}, M, False),
('new:doubtful_ally', 284, 'Doubt a large promise from someone who refuses a small favour now.', {'relationships.partner':'-'}, 'I can’t think that you, who refuse me a little matter now, will by and by confer on me a greater benefit.', False),
('new:doubtful_ally', 299, 'Accept a partner on the strength of their boasts.', {'relationships.partner':'-'}, 'brought back the shabbiest possible mouse, stinking from the length of time it had lain about the fields.', True),
('own_words_back', 120, 'Hold your companion to their own words.', {'relationships.companion':'-'}, M, False),
('own_words_back', 67, 'Rob the client while doing the job, then sue for your fee.', {'money':'-'}, 'I on the contrary affirm that I am still blind;', False),
('newcomer', 254, 'Fall in first with the idlest of the group.', {'standing':'-'}, 'the man put a halter on him and led him back to his owner.', True),
# ---- the lion's share, and predators let in -------------------------------------------------------
('new:lions_share', 3, 'Do the risky job first and ask for the fee after.', {'money':'-'}, M, True),
('new:lions_share', 101, 'Go into a venture with a far stronger partner.', {'money':'-'}, 'unless you willingly resign it to me, and set off as fast as you can.', True),
('new:lions_share', 158, 'Divide the spoils fairly with the powerful partner.', {'standing':'-'}, 'The Lion, bursting out into a great rage, devoured the Ass.', True),
('new:lions_share', 158, 'Leave yourself the smallest share.', {'money':'-', 'standing':'+'}, 'Who has taught you, my very excellent fellow, the art of division? You are perfect to a fraction.', True),
('new:lions_share', 274, 'Go it alone because the stronger partner takes most.', {'standing':'-'}, 'he himself fell prey to the huntsmen and hounds.', True),
('new:predator_inside', 83, 'Train someone to take from others for you.', {'relationships.pupil':'-'}, 'Since you have taught me to steal, you must keep a sharp lookout, or you will lose some of your own flock.', False),
('new:predator_inside', 129, 'Shut someone far more dangerous in with you.', {'money':'-'}, 'he flew upon the sheep and killed them, and then attacked the oxen.', True),
('new:predator_inside', 164, 'Warn the boss before the predator is let in.', {'relationships.boss':'+'}, 'Master, how can you expect the sheep to be safe if you admit a wolf into the fold?', False),
('new:predator_inside', 210, 'Leave someone long harmless in charge.', {'money':'-'}, 'The Wolf, now that he had the opportunity, fell upon the sheep, and destroyed the greater part of the flock.', True),
('new:predator_inside', 233, 'Refuse to admit a newcomer with a predator\'s instincts.', {'relationships.newcomer':'-'}, M, False),
('new:predator_inside', 281, 'Nurture newcomers likely to turn on everyone.', {'relationships.newcomers':'-'}, 'will inflict injury on all, beginning with yourself?', False),
('mercy_or_law', 86, 'Praise a small ill-gotten gain from someone in your charge.', {'relationships.charge':'-'}, 'he quickly seized her ear with his teeth and bit it off.', True),
# ---- heedless, warnings, records ------------------------------------------------------------------
('new:heedless', 13, 'Grab the next easy win without looking.', {'money':'-'}, 'If you had but touched me, my friend, you would have lost me, and all your locusts too!', False),
('new:heedless', 30, 'Go in because someone praises it, without checking the way out.', {'standing':'-'}, 'nor have exposed yourself to dangers from which you had no means of escape.', True),
('new:heedless', 32, 'Rush at what you need the moment it appears.', {'standing':'-'}, 'Having broken her wings by the blow, she fell to the ground, and was caught by one of the bystanders.', True),
('new:heedless', 62, 'Keep your eyes on lofty plans and ignore what is at your feet.', {'standing':'-'}, 'he fell accidentally into a deep well.', True),
('new:heedless', 107, 'Guard only against the danger you expect.', {'standing':'-'}, 'Some boatmen sailing by saw her, and taking a successful aim, mortally wounded her.', True),
('new:heedless', 140, 'Ask how you would get out before you go in.', {'standing':'+'}, M, False),
('new:heedless', 150, 'Doze on the edge of danger, and blame luck if you fall.', {'standing':'-'}, M, False),
('new:heedless', 216, 'Stay heavy and slow while danger comes for everyone.', {'standing':'-'}, 'the Geese, being slower of flight and heavier in their bodies, were captured.', True),
('new:heedless', 222, 'Stalk your target without watching your own feet.', {'standing':'-'}, 'he unknowingly trod upon a Viper asleep just before his feet.', True),
('new:heedless', 289, 'Swallow the new thing whole because it looks like the familiar.', {'standing':'-'}, 'Soon afterwards suffering great pain in his stomach', True),
('new:heedless', 308, 'Seize the easy prize lying unguarded.', {'standing':'-'}, 'The Serpent, turning about, bit the Crow with a mortal wound.', True),
('sign', 247, 'Sell your last safeguard on an early sign of good times.', {'money':'-'}, 'winter set in again with renewed frost and cold.', True),
('warning', 35, 'Ignore threats that have never been carried out.', {'standing':'-'}, 'The Farmer, on seeing this, charged his sling with stones, and killed a great number.', True),
('warning', 112, 'Prepare while things are quiet.', {'money':'-'}, M, False),
('warning', 214, 'Stay put while they only ask others, and move when they will act themselves.', {'standing':'+'}, 'It is time now to be off, my little ones, for the man is in earnest this time', False),
('warning', 241, 'Put off building your security once times are easy.', {'money':'+'}, 'it would be neither an easy nor a necessary work to make himself such a house as would accommodate him.', False),
('warning', 249, 'Warn early, though they call you mad.', {'standing':'+'}, 'they wondered at her knowledge and deemed her to be the wisest of birds.', True),
('go_and_look', 106, 'Agree the plan, then wait for someone else to carry it out.', {'standing':'-'}, 'there was no one found to do it.', False),
('new:bad_record', 54, 'Raise a real alarm after false ones.', {'money':'-'}, 'The Wolf, having no cause of fear, at his leisure lacerated or destroyed the whole flock.', True),
('new:bad_record', 104, 'Look for help after cheating everyone who could give it.', {'relationships.allies':'-'}, 'which of the gods do you think will pity you?', True),
('new:bad_record', 235, 'Make a show of a favour you could never have used yourself.', {'relationships.neighbour':'-'}, M, False),
('new:bad_record', 243, 'Make a new vow to a new patron after breaking the last.', {'relationships.patron':'-'}, 'how can I believe thee, who hast disowned and wronged thy former patron?', True),
('waiting', 267, 'Keep waiting for an out-of-season promise to come good.', {'money':'-'}, 'you are indulging a hope strong enough to cheat you, but which will never reward you with enjoyment.', False),
('waiting', 280, 'Wait on an angry threat that seems to promise you a windfall.', {'money':'-'}, 'The Wolf, hearing these words, went home, gasping with cold and hunger.', False),
# ---- criticism, the strong and the weak, revenge -------------------------------------------------
('new:pot_and_kettle', 38, 'Urge everyone to give up what you have lost.', {'standing':'-'}, 'If you had not yourself lost your tail, my friend, you would not thus counsel us.', True),
('new:pot_and_kettle', 84, 'Correct a junior for a fault you share.', {'standing':'-'}, 'The Mother tried in vain, and submitted without remonstrance to the reproof of her child.', True),
('new:pot_and_kettle', 111, 'Tell those who blame you to stop joining you.', {'relationships.critics':'-'}, 'Pray cease to flow into me, and then you will not be made briny.', False),
('new:pot_and_kettle', 116, 'Recommend your own trade as the answer to a crisis.', {'standing':'-'}, M, False),
('new:pot_and_kettle', 153, 'Condemn those above for what you do to those below.', {'standing':'-'}, 'Mercury presented himself, and striking the Philosopher with his wand', True),
('new:pot_and_kettle', 257, 'Find fault with everyone\'s work out of envy.', {'standing':'-'}, 'drove him from his office of judge, and expelled him from the mansions of Olympus.', True),
('wrongly_judged', 9, 'Point out that you have long been ready and are waiting on them.', {'relationships.boss':'-'}, M, False),
('called_to_account', 240, 'Turn the boss\'s anger back on the one accusing you.', {'standing':'+', 'relationships.accuser':'-'}, 'The Wolf was at once taken and flayed;', True),
('new:needling_the_strong', 49, 'Make a great deal of a small liberty.', {'standing':'-'}, 'A fine Lion you are, to be frightened of a Mouse.', False),
('new:needling_the_strong', 66, 'Taunt someone powerful while you are out of their reach.', {'standing':'+'}, M, False),
('new:needling_the_strong', 145, 'Sting the powerful again from your safe place.', {'standing':'+'}, 'The great do not always prevail.', True),
('new:needling_the_strong', 159, 'Attack someone bigger while they shelter from a worse threat.', {'relationships.bigger':'-'}, 'Let that monster go away and I will soon let you know what is the respective strength of a Goat and a Bull.', False),
('new:needling_the_strong', 252, 'Mock a colleague who has just been brought down.', {'standing':'-'}, 'While the Sparrow was thus speaking, a hawk suddenly seized him and killed him.', False),
('new:needling_the_strong', 285, 'Bully the weak and flatter the strong.', {'standing':'+'}, 'I know whom I may bully and whom I must flatter; and I thus prolong my life to a good old age.', False),
('new:needling_the_strong', 298, 'Pelt someone dangerous while they are down.', {'standing':'-'}, 'killing the Shepherds who had attacked him, raged with angry fury.', True),
('new:needling_the_strong', 298, 'Feed someone dangerous while they are down.', {'relationships.powerful':'+'}, 'I return as an enemy only to those who injured me.', True),
('new:needling_the_strong', 305, 'Strike at the small tormentor, whatever it costs you.', {'standing':'-'}, 'gave himself a heavy slap.', True),
('revenge', 149, 'Take a cruel revenge on the one who robbed you.', {'money':'-'}, 'the Farmer reaped nothing that year and returned home grieving sorely.', True),
('revenge', 166, 'Take your tormentor down with you.', {'standing':'-'}, 'At least my enemy and I shall perish together.', True),
('revenge', 244, 'Humiliate a guest with hospitality they cannot use.', {'relationships.guest':'-'}, 'The Fox, unable even to taste it, met with a fitting requital, after the fashion of her own hospitality.', True),
('revenge', 303, 'Pursue the powerful one who wronged you, even into their protector\'s presence.', {'relationships.powerful':'-'}, M, False),
('owning_up', 48, 'Offer peace to someone you hurt, who hurt you worse.', {'relationships.wronged':'-'}, 'There can henceforth be no peace between us;', True),
# ---- hard lots, used up, pleasing everyone, making them move --------------------------------------
('new:hard_lot', 61, 'Grasp the prickly problem boldly.', {'standing':'+'}, 'grasp it boldly, and it will be soft as silk to your hand, and not in the least hurt you.', False),
('new:hard_lot', 72, 'Keep bemoaning the post you have lost.', {'standing':'-'}, 'Forbear', False),
('new:hard_lot', 191, 'Try something new, a little at a time.', {'money':'+'}, 'until he brought the water within his reach and thus saved his life.', True),
('new:hard_lot', 195, 'Walk away saying you never wanted it.', {'standing':'+'}, 'The Grapes are sour, and not ripe as I thought.', False),
('new:hard_lot', 301, 'Rage against the confinement meant to protect you.', {'standing':'-'}, 'A violent fever suddenly set in, from which he died not many days later.', True),
('new:used_up', 74, 'Work a helper into the ground once the crisis has passed.', {'relationships.helper':'-'}, 'You must now go to the war on foot', True),
('new:used_up', 118, 'Leave before the one who sacrificed others turns to you.', {'relationships.boss':'-'}, M, False),
('new:used_up', 119, 'Ask to be praised for what you were, not blamed for what you are.', {'relationships.boss':'+'}, 'I rather deserve to be praised for what I have been, than to be blamed for what I am.', False),
('new:used_up', 161, 'Complain that you are always given the hardest jobs.', {'relationships.boss':'-'}, 'You have only to thank yourselves for the misfortunes to which you are exposed', False),
('new:please_everyone', 59, 'Let each party remake you to their taste.', {'relationships.parties':'-'}, M, True),
('new:please_everyone', 143, 'Change how you work at every critic\'s word.', {'money':'-', 'standing':'-'}, 'by endeavoring to please everybody he had pleased nobody, and lost his Ass in the bargain.', True),
('new:make_them_move', 14, 'Stop coaxing and use the tool you have.', {'money':'+'}, 'casting his net into the sea, made an excellent haul of fish.', True),
('new:make_them_move', 69, 'Tell your successors there is treasure hidden in the work.', {'money':'+'}, 'the vines repaid their labor by an extraordinary and superabundant crop.', True),
('new:make_them_move', 242, 'Use warmth, not force.', {'standing':'+'}, 'The Traveler no sooner felt his genial rays than he took off one garment after another', True),
('new:make_them_move', 242, 'Push harder.', {'standing':'-'}, 'the keener his blasts, the closer the Traveler wrapped his cloak around him', True),
]
@@ -0,0 +1,67 @@
#!/usr/bin/env python3
"""Render groups.json + records.json + options_by_entry.json as one self-contained page: REFERENCE.html."""
import html, json, pathlib
here = pathlib.Path(__file__).parent
d = json.loads((here / 'groups.json').read_text())
recs = {r['chunk']: r for r in json.loads((here / 'records.json').read_text())}
stories = json.loads((here.parent / 'stories.json').read_text())
obe = json.loads((here / 'options_by_entry.json').read_text())
new = obe.pop('_new_entries')
e = html.escape
SRC = {'archetype': 'archetype', 'filled': 'filled gap'}
def src(o):
if o['source'].startswith('scene:'):
n = o['source'].split(':')[1]
return f'from fable {n}' + ('' if o['in_group'] else ' <span class="warn">(outside this group)</span>')
return SRC[o['source']]
def moves(m): return ' '.join(f'<code>{e(k)} {e(v)}</code>' for k, v in m.items())
def scene(c):
r = recs[c]
moral = f'<br><i>Moral:</i> {e(r["moral"])}' if r['moral'] else ''
return (f'<details><summary><b>{c}</b> · <i>{e(stories[r["story"]]["title"])}</i> — {e(r["predicament"])}</summary>'
f'<p class="sum">{e(r["summary"])}{moral}</p></details>')
def section(g):
tag = ' <span class="warn">small group, below the 13-fable rule</span>' if g['small'] else ''
return f'''<section><h2>{g["id"]} · {e(g["name"])}{tag}</h2>
<p class="pred">{e(g["predicament"])}</p>
<p class="meta">{e(g["sentence"])} · {len(g["members"])} fables · stage <b>{g["stage"]}</b></p>
<h3>Options</h3><ol>{"".join(f"<li>{e(o['text'])} <span class='src'>{src(o)}</span><br>{moves(o['moves'])}</li>" for o in g["options"])}</ol>
<h3>Fables</h3>{"".join(scene(m["chunk"]) for m in g["members"])}</section>'''
big = ''.join(section(g) for g in d['groups'] if not g['small'])
small = ''.join(section(g) for g in d['groups'] if g['small'])
un = ''.join(scene(c) for c in d['unassigned'])
def entry(k, v):
name = new[k]['name'] + ' <span class="src">(new)</span>' if k in new else e(k)
rows = ''.join(f'<li>{e(o["text"])} {moves(o["moves"])} <span class="src">fable {o["source"].split(":")[1]} · '
f'{"<b>stated</b>" if o["stated"] else "inferred"}</span><br><span class="sum">“{e(o["evidence"])}”</span></li>'
for o in v)
return f'<details><summary><b>{name}</b> — {len(v)} options, {sum(o["stated"] for o in v)} stated</summary><ul>{rows}</ul></details>'
opts = [o for v in obe.values() for o in v]
meas = ''.join(entry(k, v) for k, v in obe.items())
page = f'''<!doctype html><html lang="en"><head><meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1"><title>Aesop Reference Groups</title>
<style>
:root{{--bg:#fbfaf7;--fg:#1d1d1b;--mute:#6b6760;--line:#e2ded6;--acc:#2f5d8a;--warn:#a4481c}}
@media (prefers-color-scheme:dark){{:root:not([data-theme="light"]){{--bg:#191917;--fg:#e8e6e1;--mute:#a09c94;--line:#34332f;--acc:#8ab4dc;--warn:#e6915f}}}}
:root[data-theme="dark"]{{--bg:#191917;--fg:#e8e6e1;--mute:#a09c94;--line:#34332f;--acc:#8ab4dc;--warn:#e6915f}}
body{{background:var(--bg);color:var(--fg);font:16px/1.5 Georgia,serif;max-width:52rem;margin:0 auto;padding:1rem 16px 4rem}}
h1{{font-size:1.5rem}} h2{{font-size:1.15rem;margin:0 0 .3rem}} h3{{font-size:.8rem;text-transform:uppercase;letter-spacing:.06em;color:var(--mute);margin:.9rem 0 .3rem}}
section{{border-top:1px solid var(--line);padding:1.2rem 0}} .pred{{font-size:1.05rem;margin:.2rem 0}}
.meta,.src,.sum{{color:var(--mute);font-size:.88rem}} .warn{{color:var(--warn);font-size:.85rem}}
code{{font:12px ui-monospace,monospace;border:1px solid var(--line);border-radius:3px;padding:0 .3em;margin-right:.2em;overflow-wrap:anywhere}}
li{{margin:.35rem 0}} details{{margin:.2rem 0}} summary{{cursor:pointer}} .sum{{margin:.2rem 0 .5rem 1.2rem}}
</style></head><body>
<h1>Aesop's Fables: reference groups</h1>
<p class="meta"><i>Three Hundred Aesop's Fables</i>, tr. George Fyler Townsend, 1867 (Project Gutenberg). 313 fables, one scene
per fable. Summaries, predicaments, groups, options and the options measurement written by Claude reading every fable:
no inference of any kind. A comparison baseline, not a pack. Option moves give a direction only, never a number.</p>
{big}
<section><h2>Small groups (5-12 fables)</h2><p class="meta">Situations that recur, but below the 13-fable rule this corpus's size sets.</p></section>
{small}
<section><h2>Unassigned ({len(d["unassigned"])})</h2><p class="meta">Fables that fit no situation recurring in five or more fables.</p>{un}</section>
<section><h2>Fables as an option source</h2>
<p class="meta">{len(opts)} options for {len(obe)} catalogue situations, {sum(o["stated"] for o in opts)} of them
<b>stated</b>: the fable's own outcome or moral shows where every move goes. The rest are inferred.</p>{meas}</section>
</body></html>'''
(here / 'REFERENCE.html').write_text(page, encoding='utf-8')
print('wrote', here / 'REFERENCE.html', len(page), 'bytes')
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,36 @@
"""Split the Project Gutenberg text of *Three Hundred Aesop's Fables*, translated by George Fyler Townsend (1867,
eBook #21), one story per fable and ONE SCENE PER FABLE. This departs from the usual scene rule on purpose:
most fables are under 80 words, so the rule's 80-word tail would discard them, and a fable split in two would
lose its turn. Titles come from the contents (after its AESOP'S FABLES line); each must be found, in order, as
a line of its own in the body. The preface and the life of Aesop are dropped. The printed drop capital was lost
in transcription, so many fables open with the first word's initial letter missing (e.g. "WOLF" for "A WOLF")."""
import json, pathlib, re, sys
sys.path.insert(0, '..')
from gutenberg_chunks import gutenberg_body, paragraphs
VOLUME = "Three Hundred Aesop's Fables (tr. George Fyler Townsend, 1867)"
lines = gutenberg_body('corpus/three-hundred-aesops-fables.txt')
c0 = next(i for i, l in enumerate(lines) if l.strip() == 'CONTENTS')
f0 = next(i for i, l in enumerate(lines) if i > c0 and l.strip().upper().replace('Æ', 'AE') in ("AESOP’S FABLES", "AESOP'S FABLES"))
titles = []
for l in lines[f0 + 1:]:
if l.strip(): titles.append(l.strip())
elif titles and not any(x.strip() for x in lines[lines.index(l) + 1:lines.index(l) + 3]): break
titles = [t for t in titles if t not in ('FOOTNOTES', 'INDEX')] # back matter listed in the contents
body0 = next(i for i, l in enumerate(lines) if i > f0 + len(titles) and l.strip() == titles[0])
heads, at = [], body0
for t in titles:
at = next(i for i in range(at, len(lines)) if lines[i].strip() == t and not lines[i].startswith(' '))
heads.append(at); at += 1
end = next(i for i in range(heads[-1] + 1, len(lines)) if lines[i].strip() in ('FOOTNOTES', 'INDEX'))
stories, chunks = [], []
for n, (t, a) in enumerate(zip(titles, heads)):
text = ' '.join(paragraphs('\n'.join(lines[a + 1:(heads[n + 1] if n + 1 < len(heads) else end)])))
w = len(text.split())
stories.append({'volume': VOLUME, 'title': t, 'words': w, 'text': text})
chunks.append({'story': n, 'title': t, 'volume': VOLUME, 'text': text, 'words': w})
pathlib.Path('stories.json').write_text(json.dumps(stories, indent=1, ensure_ascii=False), encoding='utf-8')
pathlib.Path('chunks.json').write_text(json.dumps(chunks, ensure_ascii=False), encoding='utf-8')
ws = sorted(c['words'] for c in chunks)
print(f'fables {len(stories)} words/fable min {ws[0]} median {ws[len(ws)//2]} max {ws[-1]} total {sum(ws):,}')
print('shortest:', min(stories, key=lambda s: s['words'])['title'], '| longest:', max(stories, key=lambda s: s['words'])['title'])
File diff suppressed because it is too large Load Diff