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,479 @@
"""Hand-built reference grouping of the Keefe 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 23 stories, and no story supplies more than half a
group's members. Story 6 (the world tour, 146 scenes) is capped like any other.
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
The narrator is unreliable, so a 'scene:N' option is what he actually did, not what he claims he
did; and each group carries at least one move a wiser person would make, marked 'filled' where
nobody in the book makes it.
`moves` names spine paths and a direction only (+ / - / risk / set). No magnitudes: the model never
chooses a number. Skill labels proposed for this corpus: savvy (seeing through a joke, a con or a
flatterer, and knowing your own worth), discipline (doing what the work demands -- training, sobriety,
turning up -- whatever you feel like).
Relationship roles are generic and the same in both halves of the book: `boss` is the manager or
owner in baseball and the captain or sergeant in the army; `colleagues` are teammates or comrades.
"""
G = [
# ---- pay, position and the boss ---------------------------------------------------------------------
dict(id='G01', name='Asking for more money',
predicament='You are sure you are worth far more than you are paid, and it is time to name a figure to the person who pays you.',
actor='employee', wants='more pay', counterpart='the one who pays them',
members=[2, 3, 4, 61, 63, 91, 92, 110, 112, 113, 150, 751, 761, 764, 766, 768, 769, 770, 771, 772, 775, 812, 829, 830, 839],
options=[
('Name a big figure and swear you will not sign for less.', 'scene:3', {'money':'risk', 'relationships.boss':'-', 'flags.held_out':'set'}),
('Sign for what they offer, and call it a win.', 'scene:113', {'money':'-', 'relationships.boss':'+'}),
('Offer to earn it: a raise if you deliver on one test.', 'scene:830', {'money':'risk', 'discipline':'+', 'relationships.boss':'+'}),
('Try to reopen a deal you have already signed.', 'scene:91', {'relationships.boss':'-', 'standing':'-'}),
('Find out what others like you are paid, and ask for that.', 'filled', {'savvy':'+', 'money':'+', 'relationships.boss':'risk'})]),
dict(id='G02', name='Threatening to leave for a rival employer',
predicament='You are unhappy where you are and tell yourself a rival would snap you up, though you are not sure you are free to go or that they want you.',
actor='discontented employee', wants='to be wanted, or better paid', counterpart='their employer and the rival',
members=[93, 94, 95, 104, 107, 108, 234, 280, 375, 380, 390, 391, 392, 393, 402, 403, 404, 426, 755, 759, 760, 773, 774, 802, 878, 879, 890, 891, 892, 893, 900, 902, 906, 907, 908, 909],
options=[
('Tell the boss you are leaving for the rival.', 'scene:392', {'relationships.boss':'-', 'standing':'risk', 'flags.threatened_to_leave':'set'}),
('Sound out the rival quietly before you say a word.', 'scene:891', {'savvy':'+', 'relationships.rival_employer':'risk'}),
('Walk out now and wait to be begged back.', 'scene:906', {'money':'-', 'relationships.boss':'-', 'flags.walked_out':'set'}),
('Stay, and tell everyone it was your own choice.', 'scene:404', {'relationships.boss':'+', 'standing':'-'}),
('Take the grievance to the boss plainly, with no threat.', 'filled', {'relationships.boss':'+', 'savvy':'+'})]),
dict(id='G03', name='Sent down, or left on the bench',
predicament='You have been sent down to a lesser post, or kept out of the real work, and are sure it is a mistake or a slight.',
actor='demoted worker', wants='their place back', counterpart='the one who sent them down',
members=[19, 22, 30, 31, 32, 100, 115, 116, 117, 122, 128, 260, 334, 410, 438, 507, 522, 533, 567, 880],
options=[
('Go where you are sent and work your way back.', 'scene:31', {'discipline':'+', 'standing':'-', 'relationships.boss':'+'}),
('Refuse to report.', 'scene:30', {'standing':'risk', 'relationships.boss':'-', 'money':'-'}),
('Tell yourself it is really a sign of their confidence.', 'scene:122', {'standing':'-', 'flags.in_denial':'set'}),
('Ask the boss plainly what you must do to get back.', 'scene:128', {'relationships.boss':'+', 'savvy':'+'}),
('Scheme to be picked up by someone else.', 'scene:32', {'savvy':'+', 'relationships.boss':'-'})]),
dict(id='G04', name='A boss who manages by mockery',
predicament='The person in charge of you keeps making jokes at your expense, and you cannot tell, or will not see, whether it is praise or contempt.',
actor='subordinate', wants='the boss\'s regard', counterpart='a boss who mocks',
members=[6, 10, 13, 14, 17, 40, 90, 149, 151, 192, 193, 222, 242, 339, 409, 763, 777, 782, 792, 803],
options=[
('Take it as praise.', 'scene:149', {'relationships.boss':'+', 'savvy':'-'}),
('Answer back in kind, in front of everyone.', 'scene:40', {'standing':'risk', 'relationships.boss':'-'}),
('Laugh along, and take the point behind the joke.', 'filled', {'savvy':'+', 'discipline':'+', 'relationships.boss':'+'}),
('Swear to yourself you will hit him next time.', 'scene:14', {'relationships.boss':'-', 'flags.grudge':'set'})]),
dict(id='G05', name='Whose fault was it?',
predicament='You have failed in front of everyone, and there are plenty of other people and things you could put it down to.',
actor='person who failed', wants='to keep their good name', counterpart='colleagues and onlookers',
members=[26, 29, 53, 56, 132, 201, 240, 265, 269, 340, 383, 384, 385, 386, 423, 425, 517, 518, 617, 675, 676, 795, 817, 864, 877, 889],
options=[
('Blame the conditions, your body and your teammates.', 'scene:26', {'relationships.colleagues':'-', 'standing':'-'}),
('Write home a version where it was not your fault.', 'scene:29', {'relationships.friend':'+', 'flags.tall_tale':'set'}),
('Own the mistake to the people who saw it.', 'filled', {'standing':'+', 'relationships.colleagues':'+'}),
('Say nothing, and work on what went wrong.', 'archetype', {'discipline':'+'})]),
dict(id='G06', name='A step up goes to your head',
predicament='You have been raised a little above the people you worked beside, and it is tempting to act as if you had been raised a lot.',
actor='newly favoured worker', wants='to be respected in the new place', counterpart='former equals',
members=[12, 20, 38, 39, 476, 485, 486, 487, 489, 495, 530, 788, 789, 883],
options=[
('Hold yourself apart from your old friends.', 'scene:495', {'standing':'+', 'relationships.colleagues':'-'}),
('Throw your weight about with the one who answers back.', 'scene:530', {'relationships.colleagues':'-', 'standing':'risk'}),
('Ease off, now that your place is safe.', 'scene:789', {'discipline':'-', 'relationships.boss':'-'}),
('Keep working exactly as before.', 'filled', {'discipline':'+', 'relationships.colleagues':'+'}),
('Give the credit to the one who taught you.', 'filled', {'relationships.boss':'+', 'savvy':'+'})]),
dict(id='G07', name='Called to account for a lapse',
predicament='Someone above you has you in front of them over something you really did, and what happens next depends on how you answer.',
actor='person in trouble', wants='to get off lightly', counterpart='a superior sitting in judgement',
members=[89, 111, 129, 135, 136, 506, 564, 565, 566, 591, 847, 887, 888, 897],
options=[
('Tell a flimsy story.', 'scene:887', {'standing':'risk', 'relationships.boss':'-'}),
('Explain what really happened, even though it makes you look a fool.', 'scene:565', {'standing':'-', 'relationships.boss':'+'}),
('Protest that you are being treated unfairly.', 'scene:129', {'relationships.boss':'-', 'money':'-'}),
('Take the penalty and promise to change.', 'filled', {'money':'-', 'relationships.boss':'+', 'discipline':'+'}),
('Say it was what you wanted all along.', 'scene:567', {'standing':'-', 'flags.saved_face':'set'})]),
dict(id='G08', name='Sure you know better than the boss',
predicament='The person in charge has made a call you are sure is wrong, and you are the one who has to live with it.',
actor='subordinate', wants='to be proved right', counterpart='the one in charge',
members=[24, 45, 266, 479, 618, 635, 636, 637, 649, 650, 716, 808, 809, 881],
options=[
('Tell the boss to their face that they are wrong.', 'scene:24', {'relationships.boss':'-', 'standing':'risk'}),
('Do it your way, against orders.', 'scene:45', {'relationships.boss':'-', 'standing':'risk', 'flags.defied_orders':'set'}),
('Send your advice up in writing.', 'scene:618', {'standing':'risk', 'savvy':'-'}),
('Do as you are told, and say your piece afterwards.', 'filled', {'relationships.boss':'+', 'savvy':'+'})]),
dict(id='G09', name='The boss takes a hand in your private life',
predicament='The person who holds your job has decided your private life is hurting your work, and is taking it in hand, for your good or theirs.',
actor='employee', wants='to live as they please', counterpart='a boss who intervenes',
members=[11, 35, 48, 49, 118, 121, 124, 173, 798, 805, 806, 815, 818, 837, 838, 884],
options=[
('Tell them to mind their own business.', 'scene:35', {'relationships.boss':'-', 'standing':'risk'}),
('Do as they say, and take the reward.', 'scene:818', {'relationships.boss':'+', 'money':'+', 'discipline':'+'}),
('Agree, then sneak off anyway.', 'scene:124', {'discipline':'-', 'relationships.boss':'risk'}),
('Set your own conditions before you comply.', 'scene:838', {'relationships.boss':'-', 'relationships.spouse':'-'})]),
dict(id='G10', name='Counting on who you used to be',
predicament='You expect your past record to open doors, and the people who could open them are not impressed.',
actor='former star', wants='to be taken on their own terms', counterpart='people with work to give',
members=[443, 458, 738, 747, 749, 750, 754, 895],
options=[
('Wait for them to come to you.', 'scene:750', {'money':'-', 'standing':'risk'}),
('Remind them of everything you have done.', 'scene:749', {'standing':'-', 'relationships.boss':'-'}),
('Take the modest opening and prove yourself again.', 'scene:748', {'money':'+', 'standing':'-', 'discipline':'+'}),
('Ask plainly what they can offer you now.', 'filled', {'savvy':'+'})]),
dict(id='G11', name='The big occasion, and you are not ready',
predicament='The moment you have been waiting for has arrived, and your mind, your body or your preparation is somewhere else.',
actor='person given a big chance', wants='to shine', counterpart='the watching crowd and the boss',
members=[25, 27, 28, 50, 52, 168, 169, 170, 172, 632, 833, 835, 886, 904, 905],
options=[
('Go out and give it everything you have.', 'scene:52', {'standing':'risk', 'discipline':'+'}),
('Ask to be taken out.', 'scene:171', {'relationships.boss':'-', 'standing':'-'}),
('Let what is on your mind take over.', 'scene:834', {'standing':'-', 'relationships.spouse':'risk'}),
('Prepare properly the day before.', 'filled', {'discipline':'+', 'relationships.boss':'+'})]),
dict(id='G12', name='A personal score in the middle of the work',
predicament='Someone you have a private quarrel with is right there in the work, and you could settle it at your side\'s expense.',
actor='worker with a grudge', wants='to get even', counterpart='a rival',
members=[41, 131, 133, 134, 137, 139, 295, 865, 867, 894],
options=[
('Settle it now, whatever it costs the side.', 'scene:134', {'relationships.rival':'-', 'relationships.boss':'-', 'money':'-', 'flags.grudge':'set'}),
('Beat them by doing the job well.', 'scene:139', {'standing':'+', 'relationships.boss':'+'}),
('Back down, and call it the clever thing to do.', 'scene:866', {'standing':'-'}),
('Put your teammates first, whatever you feel.', 'scene:894', {'relationships.colleagues':'+', 'discipline':'+'})]),
dict(id='G13', name='A drink against the rules',
predicament='A drink is on offer where drinking is forbidden or will cost you tomorrow, and you are sure nobody will notice.',
actor='worker told to stay sober', wants='a drink', counterpart='whoever enforces the rule',
members=[42, 85, 444, 445, 578, 605, 813, 814, 836, 882, 885, 903],
options=[
('Have one; nobody will notice.', 'scene:885', {'discipline':'-', 'relationships.boss':'risk'}),
('Drink to drown it.', 'scene:605', {'discipline':'-', 'standing':'-', 'flags.drinking':'set'}),
('Blame whatever you ate.', 'scene:903', {'standing':'-', 'savvy':'-'}),
('Turn it down, and say why.', 'filled', {'discipline':'+', 'relationships.colleagues':'-'})]),
# ---- duty, danger and courage ----------------------------------------------------------------------
dict(id='G14', name='Looking for a way out of what everyone must do',
predicament='Everyone in your position has to face a duty, and you are hunting for a reason you should be excused.',
actor='person with a duty', wants='to be excused', counterpart='the ones who decide',
members=[7, 154, 420, 429, 431, 434, 452, 700],
options=[
('Claim an ailment.', 'scene:431', {'discipline':'-', 'standing':'risk'}),
('Plead your family and your employer.', 'scene:429', {'relationships.family':'+', 'standing':'-'}),
('Rearrange things so the excuse becomes true.', 'scene:434', {'savvy':'+', 'relationships.spouse':'-', 'flags.gamed_the_rules':'set'}),
('Ask to be let off because you are above it.', 'scene:452', {'standing':'-', 'relationships.boss':'-'}),
('Do it, like everyone else.', 'archetype', {'discipline':'+', 'relationships.colleagues':'+'})]),
dict(id='G15', name='Fear passed off as something nobler',
predicament='You are afraid of what you are being asked to face, and a more respectable reason for avoiding it is close at hand.',
actor='frightened person', wants='to stay safe and keep their pride', counterpart='whoever expects them to go',
members=[120, 209, 464, 466, 467, 502, 505, 620, 624, 627, 651, 667, 695, 708, 816, 866],
options=[
('Give a noble reason for staying out of it.', 'scene:624', {'standing':'risk', 'flags.fear_as_duty':'set'}),
('Back down, and call it restraint.', 'scene:120', {'standing':'-', 'flags.fear_as_duty':'set', 'savvy':'-'}),
('Stay back quietly and let others go.', 'archetype', {'relationships.colleagues':'-'}),
('Admit you are afraid, and go anyway.', 'filled', {'discipline':'+', 'standing':'+'})]),
dict(id='G16', name='Talking brave, and being taken at your word',
predicament='You have talked loudly about how brave you would be, and now someone is ready to take you up on it.',
actor='boaster', wants='to be thought brave without the risk', counterpart='those who heard the boast',
members=[51, 414, 504, 544, 677, 699, 709, 733, 849],
options=[
('Volunteer, now that you have been called on it.', 'scene:709', {'standing':'+', 'relationships.colleagues':'+', 'flags.volunteered':'set'}),
('Keep talking brave and hope nobody takes you up.', 'scene:544', {'standing':'risk'}),
('Say it is the others who are really afraid.', 'scene:677', {'relationships.colleagues':'-'}),
('Say plainly what you will and will not do.', 'filled', {'savvy':'+', 'standing':'-'})]),
dict(id='G17', name='Sure you are going to your death',
predicament='You have convinced yourself that you will not come back from what lies ahead, and want to set things in order and be remembered well.',
actor='person expecting to die', wants='a good farewell', counterpart='the people they leave behind',
members=[210, 212, 500, 540, 558, 559, 686, 730],
options=[
('Write a grand farewell.', 'scene:500', {'relationships.family':'+', 'standing':'risk'}),
('Settle your affairs with your oldest friend.', 'scene:212', {'relationships.friend':'+'}),
('Swear you will stay at your post to the last.', 'scene:559', {'standing':'+', 'discipline':'+'}),
('Find out how real the danger is before you say goodbye.', 'filled', {'savvy':'+'})]),
dict(id='G18', name='Waiting, with nothing to do',
predicament='You were sent to face something, and instead there is only waiting, rain and routine, and the waiting is wearing you down.',
actor='person kept waiting', wants='something to happen', counterpart='those who keep them waiting',
members=[367, 592, 608, 647, 648, 680, 685, 693, 694, 715, 722, 780],
options=[
('Wish for trouble, anything to break it.', 'scene:694', {'discipline':'-'}),
('Grumble at those above for wasting you.', 'scene:722', {'relationships.boss':'-'}),
('Tell yourself it will never come your way.', 'scene:648', {'savvy':'-'}),
('Keep yourself sharp for when it comes.', 'filled', {'discipline':'+'})]),
dict(id='G19', name='Hardship you think is beneath you',
predicament='You are used to better, and now you are fed, housed and moved about like everyone else, which you feel you do not deserve.',
actor='person used to comfort', wants='the treatment they are used to', counterpart='the people sharing the hardship',
members=[244, 446, 547, 572, 573, 574, 607, 679, 691, 692],
options=[
('Complain that you deserve better.', 'scene:572', {'relationships.colleagues':'-', 'standing':'-'}),
('Say others have an easy ride.', 'scene:607', {'relationships.colleagues':'-'}),
('Make the best of it with the others.', 'filled', {'relationships.colleagues':'+', 'discipline':'+'})]),
# ---- newcomers, old hands and colleagues ---------------------------------------------------------------
dict(id='G20', name='New, and sure you are already the best',
predicament='You are new to an outfit of old hands, have seen nothing like it before, and are sure you are already better than all of them.',
actor='newcomer', wants='to be recognised at once', counterpart='the old hands',
members=[0, 1, 5, 8, 9, 441, 449, 450, 451, 546, 575, 712, 796],
options=[
('Go at it full force to impress them.', 'scene:8', {'relationships.colleagues':'-', 'standing':'risk'}),
('Tell them how good you are.', 'scene:449', {'standing':'-', 'relationships.colleagues':'-'}),
('Sneer at the rough company you have been thrown in with.', 'scene:441', {'relationships.colleagues':'-'}),
('Take the old hands\' advice.', 'filled', {'relationships.colleagues':'+', 'discipline':'+'}),
('Keep quiet and watch how it is done.', 'archetype', {'savvy':'+'})]),
dict(id='G21', name='A tall tale of danger from the old hands',
predicament='Colleagues who know more than you describe a terrible danger ahead, and you cannot tell whether it is true or a joke at your expense.',
actor='newcomer', wants='to be safe without being fooled', counterpart='jokers who know the ropes',
members=[207, 208, 219, 250, 263, 309, 312, 317, 323, 337, 453, 456, 463, 465, 494, 497, 499, 501, 503, 556, 557, 668, 723],
options=[
('Believe it and take every precaution.', 'scene:310', {'savvy':'-', 'standing':'-'}),
('Hide until the danger has passed.', 'scene:320', {'standing':'-', 'flags.hid':'set'}),
('Check the story with someone who is not in on it.', 'filled', {'savvy':'+'}),
('Laugh it off in front of them.', 'archetype', {'standing':'+', 'relationships.jokers':'+'})]),
dict(id='G22', name='A flattering prospect that may be a joke',
predicament='Out of nowhere comes the recognition you always felt you deserved, an offer or a summons or an admirer, and the people who brought it are grinning.',
actor='person who feels overlooked', wants='the recognition', counterpart='colleagues who may be pranking them',
members=[225, 275, 376, 377, 378, 619, 621, 622, 623, 631, 658, 663, 683, 689, 706],
options=[
('Take it at face value and act on it at once.', 'scene:379', {'money':'-', 'savvy':'-', 'flags.fooled':'set'}),
('Show it off to everyone.', 'scene:623', {'standing':'risk'}),
('Check it with the person it is supposed to come from.', 'scene:402', {'savvy':'+', 'money':'-'}),
('Ask yourself who would be laughing if it were false.', 'filled', {'savvy':'+', 'relationships.jokers':'-'})]),
dict(id='G23', name='Saving face after being made a fool of',
predicament='You have been fooled, rejected or beaten, everyone knows it, and you must decide what story to tell about it.',
actor='person made a fool of', wants='to keep their pride', counterpart='the people who know what happened',
members=[33, 57, 315, 325, 326, 327, 405, 406, 471, 496, 563, 568, 569, 570, 669, 673, 711, 717, 758, 804, 875, 910, 911],
options=[
('Say you saw through it all along.', 'scene:471', {'standing':'risk', 'relationships.jokers':'-', 'flags.saved_face':'set'}),
('Say you never wanted it anyway.', 'scene:673', {'standing':'-', 'flags.saved_face':'set'}),
('Blame the one who talked you into it.', 'scene:676', {'relationships.colleagues':'-'}),
('Laugh at yourself along with them.', 'filled', {'standing':'+', 'relationships.colleagues':'+', 'savvy':'+'}),
('Tell your friend the truth, at least.', 'scene:327', {'relationships.friend':'+'})]),
dict(id='G24', name='Made a public laughing-stock',
predicament='Colleagues have made you the joke of the whole company, in public, and everyone is waiting to see how you take it.',
actor='butt of the joke', wants='to have the last laugh', counterpart='the pranksters and the crowd',
members=[18, 277, 278, 279, 346, 472, 475, 603, 604, 606, 678, 876],
options=[
('Storm off and vow to quit.', 'scene:279', {'relationships.colleagues':'-', 'standing':'-'}),
('Vow to get even.', 'scene:606', {'relationships.jokers':'-', 'flags.vowed_revenge':'set'}),
('Insist it was never meant seriously.', 'scene:604', {'standing':'-', 'savvy':'-'}),
('Pay them back in the work itself.', 'scene:295', {'standing':'risk', 'relationships.jokers':'-'}),
('Laugh along and let it pass.', 'archetype', {'relationships.colleagues':'+', 'standing':'+'})]),
dict(id='G25', name='A cruel joke on someone who cannot take it',
predicament='Your colleagues are playing a joke on someone weaker that is turning cruel or dangerous, and you are in on it or watching.',
actor='bystander or prankster', wants='the fun without the blame', counterpart='the victim and the other jokers',
members=[462, 644, 645, 646, 714, 721, 724, 729],
options=[
('Join in; it is only fun.', 'scene:645', {'relationships.colleagues':'+', 'relationships.victim':'-'}),
('Say it is none of your business.', 'scene:724', {'relationships.victim':'-', 'flags.looked_away':'set'}),
('Condemn it loudly, and do nothing.', 'scene:721', {'standing':'risk'}),
('Tip the victim off quietly.', 'scene:714', {'relationships.victim':'+', 'relationships.colleagues':'-'}),
('Stop it before it goes too far.', 'filled', {'relationships.victim':'+', 'standing':'+', 'relationships.colleagues':'-'})]),
dict(id='G26', name='Needled by a colleague',
predicament='A colleague keeps making digs at you in front of the others, and you want to make them stop.',
actor='person being needled', wants='to make them stop', counterpart='a colleague with a sharp tongue',
members=[16, 138, 345, 347, 474, 610, 672],
options=[
('Threaten to knock them down.', 'scene:345', {'relationships.colleague':'-', 'standing':'risk'}),
('Answer with a joke of your own.', 'scene:138', {'standing':'+'}),
('Take it to someone above.', 'filled', {'relationships.boss':'risk', 'relationships.colleague':'-'}),
('Let it roll off you.', 'archetype', {'discipline':'+', 'relationships.colleague':'+'})]),
dict(id='G27', name='Sure a colleague is up to something',
predicament='You have decided a colleague is plotting against you or betraying everyone, and you have nothing to go on but their manner.',
actor='suspicious person', wants='to expose them', counterpart='a colleague under suspicion',
members=[144, 360, 454, 455, 461, 653, 654, 655, 662, 670],
options=[
('Watch them and build a case.', 'scene:656', {'relationships.colleague':'-', 'flags.suspicion':'set'}),
('Accuse them before the one in charge.', 'scene:670', {'relationships.boss':'risk', 'relationships.colleague':'-', 'standing':'risk'}),
('Ask them straight out.', 'scene:660', {'relationships.colleague':'risk', 'savvy':'+'}),
('Let it go: you have no real evidence.', 'filled', {'savvy':'+', 'relationships.colleague':'+'})]),
dict(id='G28', name='Boasting to people who know better',
predicament='You have a story about your own exploits to tell, and the people listening were there, or know how it really went.',
actor='storyteller', wants='to be admired', counterpart='colleagues who know better',
members=[601, 602, 616, 753, 778, 781, 785, 797, 811, 821, 823, 859],
options=[
('Tell it again, bigger.', 'scene:601', {'standing':'risk', 'relationships.colleagues':'-'}),
('Snap that you were the one who was actually there.', 'scene:778', {'relationships.colleagues':'-'}),
('Mock the other braggart, and keep telling yours.', 'scene:811', {'savvy':'-', 'relationships.colleagues':'risk'}),
('Let someone else tell it.', 'filled', {'relationships.colleagues':'+'})]),
dict(id='G29', name='A new skill that looks easy',
predicament='You are faced with something you have never done, and you are sure your talent at your own work will carry you straight through it.',
actor='confident novice', wants='to master it at once', counterpart='teachers and people who know it',
members=[296, 297, 298, 299, 300, 473, 480, 488, 493, 512, 515, 516, 625, 746],
options=[
('Bet that you can do it first time.', 'scene:297', {'money':'risk', 'standing':'risk'}),
('Lie about your experience to get in.', 'scene:512', {'standing':'risk', 'flags.lied':'set'}),
('Correct the instructor.', 'scene:488', {'relationships.boss':'-'}),
('Quit, and say it was beneath you.', 'scene:493', {'standing':'-'}),
('Take the lessons and the practice.', 'filled', {'discipline':'+'})]),
dict(id='G30', name='You swore you were above it',
predicament='You said loudly that you would never stoop to something, and now you want to do it after all.',
actor='proud person', wants='the thing without the loss of face', counterpart='those who heard the vow',
members=[71, 72, 582, 583, 584, 613, 614, 615, 744, 745],
options=[
('Swear you will never do it.', 'scene:71', {'standing':'+', 'money':'risk'}),
('Do it, and say you were misunderstood into it.', 'scene:615', {'standing':'-'}),
('Say you were only stalling.', 'scene:582', {'standing':'risk', 'savvy':'-'}),
('Change your mind openly.', 'filled', {'savvy':'+'})]),
dict(id='G31', name='In the spotlight, sure you are the hit',
predicament='You have been given a stage in front of important people, and you are sure the laughter and applause are for you.',
actor='performer', wants='to be admired', counterpart='an audience that may be laughing',
members=[196, 226, 228, 245, 306, 381, 388, 596, 600],
options=[
('Give it everything, and bask in the applause.', 'scene:306', {'standing':'risk'}),
('Use the platform to excuse your failures.', 'scene:245', {'standing':'-'}),
('Say you are too busy, then agree.', 'scene:596', {'standing':'risk', 'savvy':'-'}),
('Keep it short and thank your hosts.', 'filled', {'standing':'+'})]),
# ---- money ----------------------------------------------------------------------------------------
dict(id='G32', name='A bargain that is a swindle',
predicament='A rare bargain or a sure tip has come your way through someone friendly, and it must be decided now.',
actor='buyer', wants='something for nothing', counterpart='a friendly seller or tipster',
members=[350, 351, 353, 354, 355, 356, 361, 362, 713, 720, 852, 860, 869, 870, 871, 872, 874],
options=[
('Snap it up before it is gone, with borrowed money if need be.', 'scene:355', {'money':'-', 'savvy':'-'}),
('Haggle a little, then buy.', 'scene:356', {'money':'-'}),
('Bet everything on it to shut the doubters up.', 'scene:872', {'money':'risk', 'relationships.colleagues':'risk'}),
('Pass the tip on to a friend.', 'scene:871', {'relationships.friend':'risk'}),
('Walk away from anything that must be decided tonight.', 'filled', {'savvy':'+'})]),
dict(id='G33', name='Expected to pay, and you hate paying',
predicament='Everyone around you tips, treats and gives presents as a matter of course, and you begrudge every cent.',
actor='tight-fisted person', wants='to keep their money', counterpart='people who expect to be paid',
members=[21, 43, 47, 64, 157, 237, 247, 256, 330, 333],
options=[
('Pay the least you can.', 'scene:237', {'money':'+', 'standing':'-'}),
('Refuse, and call it graft.', 'scene:333', {'money':'+', 'relationships.colleagues':'-'}),
('Give something that cost you nothing.', 'scene:247', {'relationships.spouse':'-'}),
('Pay what is customary and forget it.', 'filled', {'money':'-', 'standing':'+'})]),
dict(id='G34', name='Leaning on the friend back home',
predicament='There is one old friend who always comes through, and you need them again, though you have given little back.',
actor='person in a fix', wants='help, again', counterpart='a loyal old friend',
members=[73, 77, 98, 109, 125, 183, 332, 561, 579, 898],
options=[
('Ask for another loan.', 'scene:98', {'money':'+', 'relationships.friend':'-'}),
('Blame the friend when their help falls short.', 'scene:77', {'relationships.friend':'-', 'standing':'-'}),
('Send them something that cost you nothing.', 'scene:332', {'relationships.friend':'risk'}),
('Repay what you owe before spending on yourself.', 'scene:140', {'money':'-', 'relationships.friend':'+'})]),
# ---- home ------------------------------------------------------------------------------------------
dict(id='G35', name='Whose money is it at home?',
predicament='Your spouse is spending money you earned on things you think you cannot afford, and wants more.',
actor='earner', wants='to keep control of the money', counterpart='a spouse with other ideas',
members=[66, 70, 74, 75, 80, 81, 82, 162, 290, 291, 411, 756, 757, 842, 861, 863],
options=[
('Hand it over to keep the peace.', 'scene:291', {'money':'-', 'relationships.spouse':'+'}),
('Refuse flatly.', 'scene:162', {'money':'+', 'relationships.spouse':'-'}),
('Spend more yourself to keep up with the relatives.', 'scene:81', {'money':'-', 'relationships.inlaws':'-'}),
('Refuse them an equal share in what you buy together.', 'scene:863', {'relationships.spouse':'-', 'money':'risk'}),
('Sit down together and agree what you can afford.', 'filled', {'savvy':'+', 'relationships.spouse':'+'})]),
dict(id='G36', name='A spouse who earns more',
predicament='Your spouse has gone into work of their own and is doing better at it than you are at yours.',
actor='spouse who was the earner', wants='to stay the head of the house', counterpart='a spouse who earns more',
members=[412, 415, 416, 417, 422, 427, 752, 767, 810, 820, 824, 825, 899, 901],
options=[
('Laugh at the idea that it could work.', 'scene:412', {'relationships.spouse':'-', 'savvy':'-'}),
('Brag about it as if it were your doing.', 'scene:427', {'relationships.spouse':'+', 'standing':'risk'}),
('Push them to give it up and stay home.', 'scene:899', {'relationships.spouse':'-', 'money':'-'}),
('Give your advice, and leave the decision to them.', 'scene:820', {'relationships.spouse':'+', 'savvy':'+'})]),
dict(id='G37', name='A quarrel at home: who gives way?',
predicament='You and your spouse have fallen out, one of you has walked out or threatened to, and someone has to give way.',
actor='spouse', wants='to win, or to have peace', counterpart='their spouse',
members=[67, 68, 69, 97, 141, 179, 181, 182, 437, 527, 832],
options=[
('Call their bluff and go out.', 'scene:68', {'relationships.spouse':'-'}),
('Go after them and make it up.', 'scene:69', {'relationships.spouse':'+', 'standing':'-'}),
('Give way when they cry.', 'scene:437', {'relationships.spouse':'+'}),
('Threaten lawyers.', 'scene:126', {'relationships.spouse':'-', 'money':'-'}),
('Tell your friend you laid down the law.', 'scene:832', {'relationships.friend':'+', 'flags.tall_tale':'set'})]),
dict(id='G38', name='Coming home to find them gone',
predicament='You come home, perhaps to surprise them, and find nobody there and nobody who can say where they went.',
actor='returning spouse', wants='a welcome', counterpart='a family that went on without them',
members=[99, 102, 398, 399, 400, 401, 524, 525, 526, 826],
options=[
('Drink alone until they come.', 'scene:526', {'discipline':'-', 'relationships.spouse':'-'}),
('Wait up, and have it out when they come in.', 'scene:527', {'relationships.spouse':'-', 'standing':'+'}),
('Go after them.', 'scene:69', {'relationships.spouse':'+', 'standing':'-'}),
('Let them know next time you are coming.', 'filled', {'relationships.spouse':'+', 'savvy':'+'})]),
dict(id='G39', name='Suspecting your spouse',
predicament='Something tells you your spouse has a life you do not know about, and you cannot tell if it is innocent.',
actor='jealous spouse', wants='the truth, and to be the one who matters', counterpart='their spouse',
members=[176, 177, 178, 562, 827, 828, 834],
options=[
('Demand an explanation.', 'scene:828', {'relationships.spouse':'-'}),
('Confront the stranger.', 'scene:834', {'relationships.spouse':'-', 'standing':'risk'}),
('Plan to take the children and go.', 'scene:179', {'relationships.spouse':'-', 'relationships.family':'risk'}),
('Ask calmly, and believe the answer.', 'filled', {'relationships.spouse':'+', 'savvy':'+'})]),
dict(id='G40', name='Far away, and no word from home',
predicament='You are far from your family and have heard nothing for too long, and you cannot tell if they are ill or just not writing.',
actor='person far from home', wants='news of the family', counterpart='a silent family',
members=[155, 156, 231, 236, 257, 271, 289, 364, 365, 468, 470, 599],
options=[
('Swear you will go home if no word comes.', 'scene:233', {'standing':'risk', 'relationships.family':'+'}),
('Let the worry wreck your work.', 'scene:155', {'discipline':'-'}),
('Resent their silence.', 'scene:365', {'relationships.spouse':'-'}),
('Pay for a wire, and ask.', 'filled', {'money':'-', 'relationships.family':'+'}),
('Keep your mind on the work and trust they are well.', 'filled', {'discipline':'+'})]),
dict(id='G41', name='Work pulls against a promise to your family',
predicament='You promised your family you would be with them, and the people you work for want you somewhere else.',
actor='worker with a family', wants='to keep both happy', counterpart='the boss and the family',
members=[36, 171, 185, 186, 189, 202, 205, 459, 498, 739],
options=[
('Keep your promise and go home.', 'scene:205', {'relationships.family':'+', 'relationships.boss':'-'}),
('Stay a little longer, since they say they need you.', 'scene:186', {'relationships.boss':'+', 'relationships.family':'-'}),
('Leave your post without permission.', 'scene:171', {'relationships.boss':'-', 'money':'risk', 'relationships.family':'+'}),
('Ask your family what they want you to do.', 'filled', {'relationships.family':'+', 'savvy':'+'})]),
dict(id='G42', name='Relatives under one roof',
predicament='You and relatives you resent are sharing a home, and each side thinks the other is living off it.',
actor='householder or guest', wants='their fair share, or the relatives gone', counterpart='resented relatives',
members=[83, 84, 86, 96, 126, 140, 160, 161, 180, 197, 199],
options=[
('Accuse them of sponging first.', 'scene:161', {'relationships.inlaws':'-'}),
('Move out, whatever it costs.', 'scene:179', {'money':'-', 'relationships.inlaws':'-', 'relationships.spouse':'+'}),
('Keep them out of a chance you could share.', 'scene:199', {'relationships.inlaws':'-', 'flags.spite':'set'}),
('Take the hand they offer.', 'scene:126', {'relationships.inlaws':'+'}),
('Pay your share and keep the peace.', 'filled', {'money':'-', 'relationships.inlaws':'+', 'relationships.spouse':'+'})]),
dict(id='G43', name='Your spouse snubs people you owe',
predicament='Your spouse looks down on old friends or humble companions who have been good to you, and you are caught between them.',
actor='person between two loyalties', wants='to keep both', counterpart='a snobbish spouse and humbler friends',
members=[76, 78, 477, 478, 560],
options=[
('Side with your spouse.', 'scene:78', {'relationships.friend':'-', 'relationships.spouse':'+'}),
('Propose they all travel together anyway.', 'scene:477', {'relationships.spouse':'-', 'relationships.friend':'+'}),
('Look down on the humbler couple yourself.', 'scene:478', {'relationships.friend':'-', 'standing':'+'}),
('Make amends to them yourself.', 'filled', {'relationships.friend':'+', 'money':'-'})]),
dict(id='G44', name='A new parent sure they know best',
predicament='You have a new child, you are sure you understand it better than anyone, and you are about to act on it.',
actor='new parent', wants='to do right by the child', counterpart='the other parent',
members=[142, 143, 145, 146, 147, 164, 165, 190, 394, 440, 725],
options=[
('Trust your own judgement over the other parent\'s.', 'scene:147', {'relationships.spouse':'-', 'savvy':'-'}),
('Call in an expert, and another.', 'scene:165', {'money':'-'}),
('Direct everything from far away.', 'scene:725', {'relationships.spouse':'-'}),
('Do as the other parent says.', 'filled', {'relationships.spouse':'+', 'relationships.family':'+'})]),
# ---- admirers --------------------------------------------------------------------------------------
dict(id='G45', name='Sure they are smitten with you',
predicament='Someone has been pleasant to you, and you are sure they are falling for you.',
actor='person who thinks themselves admired', wants='to be adored', counterpart='someone merely polite',
members=[270, 305, 374, 510, 521, 587, 588, 589, 593, 633, 690, 707, 740, 783, 787, 841, 845, 846, 851, 853, 854, 862],
options=[
('Nobly keep your distance, to spare them.', 'scene:589', {'relationships.admirer':'-', 'flags.imagined_admirer':'set'}),
('Show off for them.', 'scene:845', {'money':'-', 'relationships.spouse':'-'}),
('Muscle in ahead of a friend who is keen on them.', 'scene:587', {'relationships.friend':'-', 'relationships.admirer':'risk'}),
('Take it as ordinary politeness.', 'filled', {'savvy':'+'})]),
dict(id='G46', name='Stringing along an admirer while you are not free',
predicament='An admirer does not know you are married or promised, it is getting warmer, and every letter makes the truth harder to tell.',
actor='person who is not free', wants='the attention without the reckoning', counterpart='an admirer, and a spouse who does not know',
members=[44, 46, 54, 509, 514, 519, 520, 523, 528, 529, 534, 536, 594, 595, 597, 598, 630, 640, 684, 697, 698, 705, 790, 793, 794, 799],
options=[
('Keep it going; it is only kindness.', 'scene:514', {'relationships.admirer':'+', 'relationships.spouse':'risk', 'flags.strung_along':'set'}),
('Blame your spouse\'s neglect, and go ahead.', 'scene:640', {'relationships.spouse':'-', 'flags.strung_along':'set'}),
('Agree to meet, meaning to confess in person.', 'scene:536', {'relationships.spouse':'risk', 'standing':'risk'}),
('Stop writing without a word.', 'scene:529', {'relationships.admirer':'-'}),
('Tell them at once that you are not free.', 'filled', {'relationships.admirer':'-', 'relationships.spouse':'+'})]),
dict(id='G47', name='Caught with an admirer',
predicament='The admirer you have kept from your spouse, or the spouse you have kept from your admirer, is about to find out, in front of you.',
actor='person caught out', wants='to get out of it whole', counterpart='the admirer, the spouse, or whoever exposes them',
members=[537, 538, 539, 642, 742, 743, 800, 801, 850],
options=[
('Deny who you are.', 'scene:537', {'relationships.admirer':'-', 'standing':'risk'}),
('Claim you were just about to tell them.', 'scene:801', {'standing':'-'}),
('Pay your way out.', 'scene:642', {'money':'-'}),
('Offer your spouse a flattering story.', 'scene:743', {'relationships.spouse':'+', 'savvy':'+'}),
('Own it to your spouse.', 'filled', {'relationships.spouse':'risk', 'standing':'+'})]),
]
# 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:'low', 2:'middle', 3:'middle', 4:'middle', 5:'middle', 6:'middle', 7:'middle',
8:'middle', 9:'low', 10:'low', 11:'low', 12:'low', 13:'low', 14:'low', 15:'low', 16:'low',
17:'low', 18:'low', 19:'middle', 20:'middle', 21:'middle', 22:'middle'}
# A rookie on trial and a pitcher sent to the minors rank low (0-1); a regular big-league pitcher,
# on the world tour and at home in the draft summer, middle (2-8). A draftee private, a corporal
# of seven men and a private again rank low (9-17), and so does a wounded veteran out of work (18).
# Back as a regular starter he is middle again (19-22), though 22 ends with him traded away.
# Nobody ranks high: Keefe never rises above a working pitcher, and the owners and generals above
# him are never the protagonist.