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
@@ -0,0 +1,308 @@
"""Hand-built reference grouping of the Bierce predicaments (Claude-written, no local inference).
Each scene is in at most one group; scenes that fit no recurring situation stay unassigned.
Every group spans at least three of the 26 stories, and no story supplies more than half a
group's members.
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 scene N actually did (or refused to do)
'filled' written to fill a gap the scenes 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: nerve (kept from Jacobs: holding steady
under fear), wits (reading the signs and thinking coolly in a tight spot).
"""
G = [
dict(id='G01', name='On watch, and your guard slips',
predicament='You were trusted to keep watch through the night, your guard has slipped, and something may already be coming.',
actor='person on watch', wants='to keep everyone safe and the lapse unseen', counterpart='whatever is out in the dark',
members=[0, 1, 3, 160, 271, 289],
options=[
('Own up at once and raise the alarm.', 'filled', {'standing':'-', 'relationships.comrades':'+'}),
('Say nothing and hope nobody noticed.', 'archetype', {'flags.slept_on_watch':'set', 'standing':'risk'}),
('Challenge whatever is out there, loudly.', 'scene:160', {'nerve':'+', 'relationships.comrades':'risk'}),
('Force yourself awake and keep your eyes on the dark.', 'scene:3', {'nerve':'+'})]),
dict(id='G02', name='Duty demands you harm someone you love',
predicament='Your duty requires you to do something that will destroy someone you love, and nobody else can do it for you.',
actor='person under a duty', wants='to do right by both', counterpart='someone they love on the wrong side of it',
members=[5, 6, 7, 9, 77, 78, 121, 126, 127],
options=[
('Do your duty, and tell nobody what it cost you.', 'scene:9', {'standing':'+', 'relationships.loved_one':'-', 'flags.duty_over_love':'set'}),
('Ask whether it is truly required.', 'scene:78', {'relationships.authority':'-', 'standing':'-'}),
('Give them a chance to get clear before you act.', 'scene:6', {'relationships.loved_one':'+', 'standing':'risk'}),
('Refuse, and take the punishment yourself.', 'filled', {'standing':'-', 'relationships.loved_one':'+', 'relationships.authority':'-'})]),
dict(id='G03', name='Told to obey without question',
predicament='You have been told flatly to obey and not to ask why, and you believe the order will get the wrong people hurt.',
actor='subordinate', wants='to do right without defying orders', counterpart='the one giving orders',
members=[76, 79, 128, 134, 138, 139, 152, 153],
options=[
('Obey to the letter, and make sure someone witnessed the order.', 'scene:128', {'relationships.authority':'-', 'flags.order_witnessed':'set', 'standing':'risk'}),
('Obey, and answer anyone who objects with the words used on you.', 'scene:138', {'relationships.subordinates':'-', 'standing':'risk'}),
('Ask plainly whether it is really meant.', 'scene:78', {'relationships.authority':'-', 'nerve':'+'}),
('Refuse, and accept what follows.', 'filled', {'standing':'-', 'relationships.authority':'-', 'nerve':'+'}),
('Hold your tongue and do as you are told.', 'archetype', {'relationships.authority':'+'})]),
dict(id='G04', name='A private score settled through official power',
predicament='Someone with power over you is using it to settle a private score, and it may cost lives besides yours.',
actor='person caught in a grudge', wants='to survive it and stop the harm', counterpart='someone in authority with a grudge',
members=[75, 80, 81, 91, 95, 141],
options=[
('Answer the insult to their face, and go anyway.', 'scene:91', {'nerve':'+', 'relationships.rival':'-', 'standing':'risk'}),
('Say nothing now, and wait for your chance.', 'scene:141', {'wits':'+', 'relationships.rival':'-', 'flags.revenge':'set'}),
('Stop it on your own authority.', 'scene:81', {'nerve':'+', 'relationships.authority':'-', 'standing':'risk'}),
('Keep the gossip quiet and let the matter lie.', 'scene:80', {'relationships.authority':'+', 'standing':'+'})]),
dict(id='G05', name='A stranger who is not what they seem',
predicament='A stranger everyone else accepts seems not quite right to you, and you cannot yet say why.',
actor='watchful person', wants='to know who they really are', counterpart='a charming stranger',
members=[16, 119, 122, 274, 275],
options=[
('Go after them and demand the truth.', 'scene:120', {'nerve':'+', 'relationships.stranger':'-'}),
('Ask around quietly.', 'scene:275', {'wits':'+'}),
('Keep them at arm\'s length.', 'archetype', {'relationships.stranger':'-'}),
('Let yourself be charmed.', 'scene:276', {'relationships.stranger':'+', 'flags.charmed':'set'})]),
dict(id='G06', name='Your heart is on the other side',
predicament='You serve one side while your family, your feelings or your oldest ties belong to the other.',
actor='person of divided loyalty', wants='to be trusted without disowning their own', counterpart='those who doubt them',
members=[2, 105, 164, 165],
options=[
('Tell your family plainly where you stand.', 'scene:2', {'relationships.family':'-', 'standing':'+'}),
('Serve by your head, not your heart, and say so.', 'scene:105', {'standing':'risk', 'relationships.authority':'+'}),
('Keep quiet about where your ties lie.', 'archetype', {'flags.hidden_ties':'set'}),
('Keep in touch with the other side in secret.', 'filled', {'relationships.family':'+', 'standing':'risk', 'flags.divided_loyalty':'set'})]),
dict(id='G07', name='The only way to know is to go and look',
predicament='Nobody knows what waits ahead, and the only way to find out is for someone to walk into it alone.',
actor='volunteer', wants='to learn the truth and bring it back', counterpart='whatever lies ahead',
members=[35, 38, 40, 41, 42, 46, 47, 48, 49, 50, 162],
options=[
('Go yourself, alone.', 'scene:38', {'nerve':'+', 'standing':'+', 'flags.volunteered':'set'}),
('Creep in slowly and read the signs.', 'scene:48', {'wits':'+'}),
('Push on further to be certain.', 'scene:49', {'wits':'+', 'standing':'risk'}),
('Send someone else in.', 'filled', {'relationships.comrades':'-', 'standing':'-'}),
('Hurry back with what you know.', 'archetype', {'relationships.comrades':'+'})]),
dict(id='G08', name='One bold act sweeps everyone into slaughter',
predicament='One person\'s bold act has set everyone around them in motion, and the cost is falling on the rest.',
actor='person caught up in it', wants='to honour the act without dying for it', counterpart='the one who acted, and whoever commands',
members=[44, 45, 70, 71, 115, 116, 117],
options=[
('Rush forward with the rest.', 'scene:44', {'nerve':'+', 'relationships.comrades':'+', 'standing':'risk'}),
('Call everyone back, and bear their anger.', 'scene:45', {'relationships.comrades':'-', 'standing':'+'}),
('Try to stop the one who started it.', 'scene:70', {'nerve':'+', 'standing':'risk'}),
('Hold your place as ordered.', 'archetype', {'relationships.authority':'+', 'relationships.comrades':'-'})]),
dict(id='G09', name='Refusing the safe way out, lest it look like fear',
predicament='There is a safe way out of the danger, and you will not take it because someone might call it fear.',
actor='person proud of their courage', wants='never to be seen afraid', counterpart='the watching crowd, or their own pride',
members=[67, 68, 72, 154, 230, 231],
options=[
('Stand in the open and let them see.', 'scene:67', {'standing':'+', 'nerve':'+', 'flags.reckless':'set'}),
('Refuse to yield, arms folded.', 'scene:154', {'nerve':'+', 'standing':'risk'}),
('Take cover like everyone else.', 'archetype', {'standing':'-'}),
('Call for help, whatever it looks like.', 'scene:230', {'relationships.household':'+', 'standing':'-'})]),
dict(id='G10', name='Your courage is called into question',
predicament='People doubt your courage, and you are ready to risk a great deal to prove them wrong.',
actor='person whose courage is doubted', wants='to be believed brave', counterpart='those who doubt them',
members=[145, 150, 155, 215, 216, 262, 263],
options=[
('Accept the dare.', 'scene:263', {'nerve':'+', 'standing':'risk', 'flags.took_dare':'set'}),
('Explain yourself plainly.', 'filled', {'standing':'+', 'relationships.doubters':'+'}),
('Endure it in silence and wait for a chance to show them.', 'scene:144', {'relationships.doubters':'-', 'standing':'-'}),
('Laugh it off.', 'archetype', {'relationships.doubters':'+'}),
('Stand up for someone else who is being called a coward.', 'scene:155', {'relationships.friend':'+', 'nerve':'+'})]),
dict(id='G11', name='Finding out you are afraid',
predicament='You have always thought yourself brave, and now, where nobody can see, you find that you are afraid.',
actor='person who thought themselves fearless', wants='to master their fear', counterpart='their own nerves',
members=[57, 59, 61, 146, 148, 217, 247],
options=[
('Tell yourself it is nothing, and look away.', 'scene:57', {'nerve':'-'}),
('Name the fear and keep your place.', 'filled', {'nerve':'+', 'standing':'+'}),
('Find one small thing to do about it.', 'scene:62', {'nerve':'+', 'wits':'+'}),
('Cry out for help.', 'scene:59', {'nerve':'-', 'relationships.comrades':'+'})]),
dict(id='G12', name='A gaze you cannot escape',
predicament='Something has fixed its eyes on you, and while you look back you cannot move, think or get away.',
actor='person held by a stare', wants='to break free', counterpart='whatever holds them',
members=[56, 60, 184, 191, 232, 233, 290, 291],
options=[
('Look away and back off slowly.', 'scene:231', {'wits':'+', 'standing':'-'}),
('Hold still and shield whoever is with you.', 'scene:291', {'nerve':'+', 'relationships.family':'+'}),
('Strike out at it.', 'scene:297', {'nerve':'+', 'flags.struck_blind':'set'}),
('Give in to it.', 'scene:184', {'nerve':'-', 'relationships.controller':'+'})]),
dict(id='G13', name='Alone at night with the dead',
predicament='You are alone at night with the dead, and every small sound in the dark begins to seem like movement.',
actor='person keeping vigil', wants='to last until morning', counterpart='the dead, or what seems to be',
members=[212, 213, 218, 219, 245, 249, 250, 251, 272],
options=[
('Sit tight and read until daylight.', 'scene:213', {'nerve':'+'}),
('Light your last candle and look.', 'scene:218', {'nerve':'+', 'wits':'+'}),
('Force it open and face it.', 'scene:251', {'nerve':'+', 'flags.faced_the_dead':'set', 'standing':'risk'}),
('Fire into the dark.', 'scene:273', {'nerve':'+', 'flags.struck_blind':'set'}),
('Call out for someone.', 'archetype', {'nerve':'-', 'relationships.neighbours':'+'})]),
dict(id='G14', name='The one you struck in the dark',
predicament='You struck at someone you could not see clearly, and the one you hurt may be someone you love.',
actor='person who struck in the dark', wants='to know, and to undo it', counterpart='the unseen victim',
members=[65, 136, 137, 161, 166, 297, 298],
options=[
('Go back and search until you find them.', 'scene:162', {'nerve':'+', 'flags.searched':'set'}),
('Keep quiet and let it be forgotten.', 'scene:161', {'standing':'+', 'flags.guilty_secret':'set'}),
('Keep firing until it is over.', 'scene:137', {'standing':'risk', 'flags.struck_blind':'set'}),
('Tell someone what you did.', 'filled', {'standing':'-', 'relationships.comrades':'+'})]),
dict(id='G15', name='Condemned and waiting to die',
predicament='You have been condemned, the end is fixed, and all that is left to decide is how you meet it.',
actor='condemned person', wants='dignity, or a way out', counterpart='those who condemned them',
members=[10, 12, 13, 96, 98, 100, 101, 123],
options=[
('Meet it with jokes.', 'scene:96', {'nerve':'+', 'relationships.captor':'+'}),
('Give your word to go quietly.', 'scene:123', {'standing':'+', 'relationships.captor':'+'}),
('Plead for more time.', 'scene:101', {'standing':'-', 'nerve':'-'}),
('Fix your thoughts on your family.', 'scene:14', {'relationships.family':'+'})]),
dict(id='G16', name='Cornered, looking for a way out',
predicament='You are trapped with almost no room to move, and must find whatever way out is left to you.',
actor='trapped person', wants='to get free', counterpart='whatever holds them',
members=[14, 53, 54, 55, 97, 102],
options=[
('Take stock calmly, as if it were an enemy.', 'scene:53', {'wits':'+'}),
('Seize the nearest weapon and fight.', 'scene:102', {'nerve':'+', 'flags.violent':'set', 'standing':'risk'}),
('Plan a desperate escape and wait for the moment.', 'scene:14', {'wits':'+', 'nerve':'+'}),
('Wait to be found.', 'scene:59', {'relationships.comrades':'+'})]),
dict(id='G17', name='The danger you can only wait for',
predicament='Danger is coming and there is nothing to do but wait for it, and the waiting is worse than the blow.',
actor='person waiting', wants='to hold on', counterpart='the danger that has not yet come',
members=[62, 63, 130, 131, 142, 143, 149],
options=[
('Hold your place and keep your head.', 'archetype', {'nerve':'+'}),
('Keep busy with something small.', 'scene:62', {'nerve':'+', 'wits':'+'}),
('Go and meet it rather than wait.', 'scene:63', {'nerve':'+', 'standing':'risk'}),
('Dig in without being told.', 'scene:131', {'relationships.comrades':'+', 'wits':'+'})]),
dict(id='G18', name='A warning easy to laugh off',
predicament='Someone has warned of a danger that sounds like superstition, and it would be easy to laugh it off.',
actor='sceptic', wants='to carry on as usual', counterpart='the one who warned them',
members=[182, 228, 234, 287, 288, 294],
options=[
('Laugh it off kindly and carry on.', 'scene:288', {'relationships.warner':'-', 'flags.ignored_warning':'set'}),
('Stay home, just this once.', 'scene:287', {'relationships.warner':'+', 'money':'-'}),
('Find a sensible explanation for it.', 'scene:294', {'wits':'+', 'flags.ignored_warning':'set'}),
('Trust your own dread, whatever others say.', 'scene:182', {'relationships.others':'-', 'wits':'+'})]),
dict(id='G19', name='A truth nobody would believe',
predicament='You know something true that sounds impossible, and telling it would make you look a liar or a fool.',
actor='witness', wants='to be believed, or at least not mocked', counterpart='those who would hear it',
members=[8, 163, 180, 264, 285],
options=[
('Say nothing of it.', 'scene:9', {'standing':'+', 'flags.kept_silent':'set'}),
('Tell it anyway and let them laugh.', 'scene:264', {'standing':'-', 'nerve':'+'}),
('Find proof before you speak.', 'scene:162', {'wits':'+', 'nerve':'+'}),
('Tell a smaller story they will believe.', 'filled', {'wits':'+', 'standing':'+'})]),
dict(id='G20', name='Your careless words cost a life',
predicament='Something you said or set going lightly has cost someone their life, and now you must face what you did.',
actor='person at fault', wants='to escape the blame', counterpart='the dead person\'s memory, and everyone else',
members=[74, 107, 220, 221, 224, 266],
options=[
('Go in and face what you caused.', 'scene:221', {'standing':'+', 'nerve':'+', 'flags.faced_it':'set'}),
('Slip away and leave town.', 'scene:224', {'standing':'risk', 'flags.fled':'set'}),
('Quietly hide the proof.', 'scene:118', {'standing':'+', 'flags.guilty_secret':'set'}),
('Confess to the authorities.', 'filled', {'standing':'-', 'relationships.authority':'+'})]),
dict(id='G21', name='Judged before you are heard',
predicament='Everyone around you has already made up their mind about you, and nobody is waiting to hear your side.',
actor='accused person', wants='a fair hearing', counterpart='the people who have judged them',
members=[73, 140, 144, 192, 194, 195],
options=[
('Explain yourself, whatever it costs.', 'filled', {'standing':'risk', 'relationships.accusers':'+'}),
('Refer them to the one who can clear you.', 'scene:140', {'standing':'risk', 'relationships.witness':'risk'}),
('Too proud to explain, endure it.', 'scene:144', {'standing':'-', 'nerve':'+'}),
('Lie low and mend your ways.', 'scene:195', {'standing':'+', 'money':'-'}),
('Get out before they act.', 'scene:193', {'standing':'-', 'flags.run_off':'set'})]),
dict(id='G22', name='A tempting chance with a hidden price',
predicament='You have been handed an easy chance at what you want most, and there may be a price hidden in it.',
actor='person tempted', wants='the prize', counterpart='whoever offered it',
members=[15, 196, 197, 198, 242, 243, 244],
options=[
('Take it and go at once.', 'scene:238', {'money':'+', 'flags.took_the_chance':'set', 'standing':'risk'}),
('Accept, laughing, and deal with the catch later.', 'scene:197', {'money':'+', 'relationships.giver':'+', 'flags.bound_by_terms':'set'}),
('Ask who is offering, and why.', 'filled', {'wits':'+'}),
('Leave it alone.', 'archetype', {'money':'-'})]),
dict(id='G23', name='Turned away when you need help most',
predicament='You need help badly, and the very people who should give it look on, turn away, or explain why they cannot.',
actor='person in need', wants='help', counterpart='those who could give it',
members=[11, 88, 114, 208, 209, 210],
options=[
('Ask plainly, and keep asking.', 'scene:114', {'relationships.helpers':'risk', 'standing':'-'}),
('Tell them who you really are.', 'filled', {'standing':'+', 'relationships.helpers':'risk'}),
('Walk away into the cold.', 'scene:210', {'standing':'-', 'flags.turned_away':'set'}),
('Help yourself, however you can.', 'archetype', {'nerve':'+'})]),
dict(id='G24', name='Watching others suffer from safety',
predicament='Others are suffering in front of you, you are safe yourself, and it is easy to treat it as a show.',
actor='onlooker', wants='to feel as they should, or not at all', counterpart='the people suffering',
members=[30, 31, 33, 89, 108, 253, 254],
options=[
('Get down and help.', 'filled', {'relationships.sufferers':'+', 'money':'-'}),
('Walk on past; there is nothing you can do.', 'scene:89', {'relationships.sufferers':'-'}),
('Make a show of it for your companions.', 'scene:253', {'standing':'+', 'relationships.companions':'+'}),
('Stop the others treating it as a spectacle.', 'scene:254', {'relationships.companions':'-', 'standing':'+'})]),
dict(id='G25', name='Trying to save someone who will not be saved',
predicament='Someone you care about is heading for harm, and refuses every help or reason you offer them.',
actor='friend', wants='to save them', counterpart='someone set on their course',
members=[69, 106, 156, 186, 284],
options=[
('Remonstrate with them, and be laughed off.', 'scene:69', {'relationships.friend':'-'}),
('Threaten to go to the authorities.', 'scene:187', {'relationships.friend':'-', 'nerve':'+'}),
('Give them what they ask, and let them go.', 'scene:106', {'relationships.friend':'+', 'flags.let_them_go':'set'}),
('Shout a warning and run after them.', 'scene:295', {'nerve':'+', 'relationships.friend':'risk'})]),
dict(id='G26', name='Devoted to someone who wronged you',
predicament='The person you love has wronged you badly, and you stand by them anyway, whatever it costs you.',
actor='devoted partner', wants='to keep them', counterpart='the partner who wronged them',
members=[171, 174, 176, 185, 187, 241],
options=[
('Keep their secret, and bear the cost.', 'scene:171', {'relationships.partner':'+', 'money':'-', 'flags.kept_secret':'set'}),
('Hold to your promise out of honour.', 'scene:241', {'standing':'+', 'relationships.partner':'+'}),
('Deny everything to protect them.', 'scene:187', {'relationships.partner':'+', 'relationships.outsider':'-'}),
('Walk away.', 'archetype', {'relationships.partner':'-', 'standing':'+'})]),
dict(id='G27', name='Someone you thought gone for good turns up',
predicament='Someone you thought gone from your life for good is suddenly in front of you, and the past comes with them.',
actor='person with a past', wants='to keep the present intact', counterpart='someone from before',
members=[120, 175, 202, 225, 252, 279, 282],
options=[
('Face them and name them.', 'scene:122', {'nerve':'+', 'relationships.former':'risk'}),
('Pretend you do not know them.', 'filled', {'wits':'+', 'relationships.former':'-'}),
('Make light of the past in front of others.', 'scene:253', {'standing':'risk'}),
('Go to them, whatever the world sees.', 'scene:175', {'relationships.former':'+', 'standing':'-'})]),
dict(id='G28', name='Coming home too late',
predicament='You come back to the people you left behind and find you have arrived too late to help them.',
actor='person returning home', wants='to find them safe', counterpart='the family they left',
members=[34, 86, 87, 270, 292],
options=[
('Stay with them and grieve.', 'scene:87', {'relationships.family':'+', 'standing':'-'}),
('Nurse them yourself, far from help.', 'scene:270', {'relationships.family':'+', 'money':'-'}),
('Go for help at once.', 'filled', {'relationships.neighbours':'+'})]),
dict(id='G29', name='Alone with an old grief',
predicament='You live alone with an old grief, keeping a habit nobody understands, and people have stopped asking why.',
actor='recluse', wants='to keep faith with what they lost', counterpart='neighbours who do not understand',
members=[167, 168, 267, 268, 296],
options=[
('Keep to your ritual.', 'scene:168', {'relationships.neighbours':'-', 'flags.ritual':'set'}),
('Shut away whatever reminds you.', 'scene:268', {'standing':'-'}),
('Tell someone the story at last.', 'filled', {'relationships.neighbours':'+'}),
('Move on, as everyone else has.', 'archetype', {'money':'+', 'relationships.neighbours':'+'})]),
dict(id='G30', name='Lost in the dark, far from help',
predicament='You are lost at night far from anyone who knows you, and the way home looks strange and wrong.',
actor='lost person', wants='to get home', counterpart='the dark country around them',
members=[22, 23, 27, 28, 256, 257],
options=[
('Push on by the stars.', 'scene:256', {'nerve':'+', 'wits':'+'}),
('Lie down and wait for daylight.', 'scene:27', {'nerve':'-'}),
('Go toward the light, whatever it is.', 'scene:31', {'nerve':'+', 'standing':'risk'}),
('Turn back the way you came.', 'archetype', {'wits':'+'})]),
dict(id='G31', name='New to a hardened company',
predicament='You have joined a hardened group that does not know you, and they have already made up their minds about you.',
actor='newcomer', wants='to be accepted', counterpart='the old hands',
members=[37, 66, 151],
options=[
('Prove yourself in the first danger.', 'scene:67', {'nerve':'+', 'relationships.comrades':'+', 'standing':'risk'}),
('Keep to yourself and do your work.', 'scene:151', {'relationships.comrades':'-'}),
('Dress and carry yourself as you please, and let them laugh.', 'scene:37', {'standing':'-', 'nerve':'+'}),
('Win them over with good manners.', 'scene:66', {'relationships.comrades':'+'})]),
]
# Protagonist standing by story, for stage assignment (DESIGN.md "Stages"). Per story, not per
# scene: a coarse first cut, and the one place this grouping uses a judgement not in the text.
STANDING = {0:'low', 1:'high', 2:'low', 3:'middle', 4:'low', 5:'middle', 6:'middle', 7:'middle',
8:'low', 9:'high', 10:'middle', 11:'middle', 12:'middle', 13:'middle', 14:'low',
15:'middle', 16:'middle', 17:'high', 18:'low', 19:'middle', 20:'high', 21:'low',
22:'middle', 23:'low', 24:'high', 25:'middle'}
# Enlisted men, a captive, a child, a pauper and two frontier loners rank low; officers and
# professionals middle; a planter, a governor, a camp's leading citizen, a rich idler and an
# heiress high. Story 15's couple were rich once and are poor now: judged middle.