Files
TheLadder/tools/story-to-pack/probe/torchy/claude/groups_src.py
T
JesseMarkowitzandClaude Opus 5.5 3a4758172d 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
2026-10-07 06:05:51 -04:00

437 lines
39 KiB
Python

"""Hand-built reference grouping of the Torchy 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 stories, and no story supplies more than half a group's members.
Stories 30 and 31 are one story in two parts (the lobster boat and the unmasking), so they count
as ONE story for both rules. Chunks 245, 736 and 737 are publisher's advertising and are in no
group; 244 and 735 are real story endings.
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: cheek (saying the bold thing to people
above you: the frank answer, the bluff, the backchat) and savvy (street sense: seeing through a
fraud, reading a room, solving by common sense what the experts dress up).
Relationship roles are generic: `boss` is whoever is over you at the top (the old head or his heir),
`boss_family` his relatives, `supervisor` the fussy official between you and the top.
"""
G = [
# ---- the door, the boss and the office ------------------------------------------------------------
dict(id='G01', name='Deciding who gets past the door',
predicament='You keep the door to someone important, and a caller is pushing to get past, or somebody is pushing you to let them through.',
actor='gatekeeper', wants='to let the right people through', counterpart='callers at the door',
members=[74, 75, 195, 196, 273, 301, 303, 440, 442, 487, 488, 606, 633, 721],
options=[
('Hold the line: nobody gets past but the one you were told to admit.', 'scene:440', {'relationships.boss':'+', 'relationships.visitor':'-'}),
('Give them nothing until they say what they want.', 'scene:196', {'cheek':'+', 'relationships.visitor':'risk'}),
('Hear them out yourself, courteously, and promise an answer.', 'scene:488', {'relationships.visitor':'+', 'standing':'+', 'savvy':'+'}),
('Tell them bluntly to stop rocking the boat.', 'scene:721', {'cheek':'+', 'relationships.visitor':'-', 'standing':'risk'}),
('Send them straight in and let the boss sort it out.', 'filled', {'relationships.boss':'-', 'relationships.visitor':'+'})]),
dict(id='G02', name='Judging a caller on sight',
predicament='You have to judge a caller at the door by how they look, and what you see tells you to send them away.',
actor='gatekeeper', wants='to be rid of a nuisance', counterpart='a caller who looks like nobody who matters',
members=[18, 105, 106, 107, 202, 203, 302, 306, 354, 355, 364],
options=[
('Mock them and send them off.', 'scene:106', {'cheek':'+', 'relationships.visitor':'-', 'standing':'risk'}),
('Block them outright.', 'scene:18', {'relationships.visitor':'-', 'relationships.boss':'risk'}),
('Plan a chilly welcome and keep them waiting.', 'scene:302', {'relationships.boss_family':'-'}),
('Ask their business before you judge.', 'filled', {'savvy':'+', 'relationships.visitor':'+'}),
('Hear them out and take their case up yourself.', 'scene:204', {'relationships.visitor':'+', 'relationships.supervisor':'-', 'standing':'risk'})]),
dict(id='G03', name='Called in, and expecting the sack',
predicament='You have been summoned over something you really did, you expect to be fired, and all that is left to choose is how you answer.',
actor='junior in trouble', wants='to keep the job, or at least their pride', counterpart='the boss sitting in judgement',
members=[3, 4, 20, 21, 64, 65, 66, 146, 154, 155, 156, 244, 259, 312, 313],
options=[
('Own up frankly, and offer to go.', 'scene:155', {'cheek':'+', 'relationships.boss':'+', 'standing':'risk'}),
('Joke your way through the questions.', 'scene:20', {'cheek':'+', 'relationships.boss':'risk'}),
('Confess before you are even asked.', 'scene:65', {'relationships.boss':'+', 'flags.owned_up':'set'}),
('Deny everything.', 'filled', {'relationships.boss':'-', 'standing':'risk'}),
('Apologise and promise it will never happen again.', 'filled', {'standing':'-', 'relationships.boss':'+'})]),
dict(id='G04', name='A petty supervisor who resents you',
predicament='The official between you and the top wanted someone meeker, resents you, and is waiting for you to slip.',
actor='junior', wants='to be left alone, or to get the better of him', counterpart='a petty supervisor',
members=[16, 17, 19, 31, 82, 118, 119, 128, 129, 189, 236, 261, 262, 272, 322],
options=[
('Needle him for sport.', 'scene:16', {'cheek':'+', 'relationships.supervisor':'-'}),
('Answer his lectures with cheek.', 'scene:119', {'cheek':'+', 'relationships.supervisor':'-', 'standing':'risk'}),
('Dare him to fire you, knowing he cannot.', 'scene:32', {'cheek':'+', 'relationships.supervisor':'-', 'relationships.colleague':'+'}),
('Work with him on the boss\'s errand, just this once.', 'scene:262', {'relationships.supervisor':'+'}),
('Keep your head down and give him nothing to report.', 'archetype', {'relationships.supervisor':'+', 'cheek':'-'})]),
dict(id='G05', name='Pulled off your job for a family chore',
predicament='Someone in the boss\'s family wants a private favour done, nothing to do with your job, and the boss has already said you can go.',
actor='junior', wants='to stay in favour without becoming a servant', counterpart='the boss\'s family',
members=[24, 25, 27, 41, 43, 157, 158, 167, 215, 216, 217, 221, 326, 341, 353, 382, 712],
options=[
('Take the expense money and get it done, whatever it takes.', 'scene:27', {'relationships.boss_family':'+', 'standing':'+', 'flags.family_errand':'set'}),
('Try to excuse yourself as there on company business.', 'scene:216', {'relationships.boss_family':'-'}),
('Do it, then bill them to the penny.', 'scene:353', {'cheek':'+', 'money':'+', 'relationships.boss_family':'risk'}),
('Stay late for it, and ask nothing.', 'scene:382', {'relationships.boss':'+'}),
('Ask what is in it for you before you agree.', 'filled', {'savvy':'+', 'money':'+', 'relationships.boss_family':'-'})]),
dict(id='G06', name='Sent to stand in for the boss',
predicament='The boss, or someone in his family, has sent you in his place to judge, host or negotiate with people far above your rank.',
actor='junior stand-in', wants='to bring back what was wanted', counterpart='people who expected the boss',
members=[274, 275, 276, 277, 278, 286, 327, 328, 331, 340, 444, 445, 446, 447, 452, 620, 622, 728, 729, 730,
733, 735],
options=[
('Recite the brief you were given, word for word.', 'scene:331', {'standing':'risk', 'savvy':'-'}),
('Admit plainly how junior you are.', 'scene:447', {'relationships.visitor':'+', 'standing':'-'}),
('Drop the brief and use your own common sense.', 'scene:278', {'savvy':'+', 'relationships.boss':'risk'}),
('Roll up your sleeves and do the work yourself.', 'scene:622', {'relationships.boss':'+', 'standing':'-'}),
('Report back that the one to win over is not the one you were sent to beat.', 'scene:452', {'savvy':'+', 'relationships.boss':'+'})]),
dict(id='G07', name='The boss\'s family troubles land on you',
predicament='Someone in the boss\'s family is in a scrape, a quarrel or an unhappy marriage, and you are the one on the spot.',
actor='junior', wants='to fix it quietly', counterpart='the boss\'s family',
members=[108, 110, 113, 114, 309, 310, 311, 386, 388, 389, 429, 430, 431, 432, 433, 434, 435, 436, 437, 470,
471, 480, 537, 559],
options=[
('Slip away so someone is free to help from outside.', 'scene:310', {'savvy':'+', 'relationships.boss_family':'+'}),
('Hurry them away before the police arrive.', 'scene:110', {'relationships.boss_family':'+', 'flags.hushed_up':'set'}),
('Suggest a secret dodge that spares everyone a scene.', 'scene:471', {'savvy':'+', 'relationships.boss_family':'+', 'flags.hushed_up':'set'}),
('Stay as a witness, in case it turns ugly.', 'scene:388', {'relationships.boss':'+'}),
('Tell the boss everything.', 'filled', {'relationships.boss':'+', 'relationships.boss_family':'-'})]),
dict(id='G08', name='Someone in the boss\'s family is being taken in',
predicament='Someone in the boss\'s family is being flattered by a person you know is after their money, and they will not thank you for saying so.',
actor='junior', wants='to protect them without telling tales', counterpart='the boss\'s relative and the flatterer',
members=[46, 47, 48, 49, 50, 53, 454, 455, 456, 465, 466, 467, 469, 557, 558, 561],
options=[
('Warn them to their face.', 'scene:50', {'cheek':'+', 'relationships.boss_family':'-'}),
('Let them hear the truth from the flatterer\'s own mouth.', 'scene:51', {'savvy':'+', 'relationships.boss_family':'+'}),
('Dig up everything on the flatterer first.', 'scene:457', {'savvy':'+', 'money':'-'}),
('Take it to the boss and let him deal with it.', 'scene:456', {'relationships.boss':'+', 'relationships.boss_family':'-'}),
('Say nothing; it is not your business.', 'archetype', {'relationships.boss_family':'risk'})]),
dict(id='G09', name='Getting rid of an embarrassing guest',
predicament='Someone the family does not want is about to spoil an occasion, and you have been told, or have offered, to get them out without a scene.',
actor='junior', wants='them gone quietly', counterpart='an unwanted guest',
members=[76, 77, 78, 116, 117, 395, 396, 560, 562, 563, 564, 713, 714, 715, 717, 718, 719, 720],
options=[
('Bundle them off with a vague story and no plan.', 'scene:77', {'relationships.boss_family':'+', 'money':'+'}),
('Scare them off with a danger you invent.', 'scene:562', {'savvy':'+', 'cheek':'+', 'flags.told_a_tale':'set'}),
('Stage a scene that makes them leave of their own accord.', 'scene:718', {'savvy':'+', 'relationships.boss':'+', 'flags.told_a_tale':'set'}),
('Pass the problem on to someone you dislike.', 'scene:117', {'relationships.colleague':'-', 'money':'+'}),
('Pay their fare to go far away.', 'scene:395', {'money':'-', 'relationships.boss':'+'})]),
dict(id='G10', name='Talking the boss into backing someone overlooked',
predicament='Someone capable is stuck, snubbed or about to be let go, and you could put their case to the boss yourself.',
actor='junior', wants='a fair chance for someone else', counterpart='the boss',
members=[40, 187, 188, 200, 201, 204, 205, 356, 362, 365, 499, 507],
options=[
('Take the blame for them, and tell the boss their whole story.', 'scene:40', {'relationships.boss':'risk', 'relationships.colleague':'+', 'flags.recommended':'set'}),
('Go to the boss at home and ask for the promotion outright.', 'scene:200', {'cheek':'+', 'relationships.boss':'risk', 'relationships.colleague':'+', 'flags.recommended':'set'}),
('Slip their proposal onto the boss\'s desk as if it came through channels.', 'scene:204', {'savvy':'+', 'relationships.supervisor':'-', 'standing':'risk'}),
('Argue they are too valuable to lose.', 'scene:187', {'relationships.boss':'+', 'savvy':'+'}),
('Keep out of it; it is not your place.', 'archetype', {'relationships.colleague':'-'})]),
dict(id='G11', name='Someone everyone makes fun of',
predicament='There is one person everyone around you mocks, and you can join in, look away or take their side.',
actor='onlooker', wants='to fit in, or to do right', counterpart='the butt of the joke',
members=[28, 30, 32, 177, 178, 179, 180, 367, 578, 579, 580, 581, 607, 608, 609, 610, 611, 614, 615, 616,
617],
options=[
('Mock them along with everyone else.', 'scene:28', {'relationships.outcast':'-'}),
('Stand up for them against the one bullying them.', 'scene:32', {'cheek':'+', 'relationships.outcast':'+', 'relationships.supervisor':'-'}),
('Make friends with them.', 'scene:179', {'relationships.outcast':'+'}),
('Tell them their work is good.', 'scene:578', {'relationships.outcast':'+', 'savvy':'+'}),
('Stay out of it; it is only fun.', 'archetype', {'relationships.outcast':'-', 'flags.looked_away':'set'})]),
dict(id='G12', name='Minding someone who will not be minded',
predicament='You have been put in charge of someone, a relative or a colleague, who does not want a minder and means to go their own way.',
actor='minder', wants='to keep them out of trouble', counterpart='a charge who resists',
members=[111, 112, 222, 223, 224, 225, 226, 290, 291, 292, 294, 295, 296, 297, 299, 343, 344, 345, 347],
options=[
('Tell them bluntly what they are doing wrong.', 'scene:295', {'cheek':'+', 'relationships.charge':'risk'}),
('Give them plain advice and a push.', 'scene:296', {'relationships.charge':'+', 'savvy':'+'}),
('Wrestle them into line.', 'scene:225', {'relationships.charge':'-'}),
('Tell them you disapprove, and keep your distance.', 'scene:347', {'relationships.charge':'-', 'cheek':'+'}),
('Report honestly to whoever put you in charge, even if it costs you.', 'scene:299', {'money':'risk', 'relationships.boss_family':'risk', 'flags.honest_report':'set'})]),
dict(id='G13', name='Calling on a friend from the bottom rung',
predicament='What you need cannot be got through the proper channels, and an old friend from lower down could get it for you.',
actor='junior', wants='what the front door will not give', counterpart='old friends from the bottom rung',
members=[26, 88, 100, 101, 401, 457, 458, 531, 532, 598, 731, 732],
options=[
('Get an old friend to deliver a fake message.', 'scene:26', {'savvy':'+', 'relationships.old_friends':'+', 'flags.trick':'set'}),
('Ask an old acquaintance what the street says.', 'scene:88', {'savvy':'+', 'relationships.old_friends':'+'}),
('Trade on your old rank and its slang.', 'scene:531', {'relationships.old_friends':'+', 'savvy':'+'}),
('Pay for what they tell you.', 'scene:532', {'money':'-', 'savvy':'+'}),
('Promise them something back, and pay it.', 'scene:101', {'relationships.old_friends':'+', 'standing':'-'})]),
dict(id='G14', name='A bluff on the spot',
predicament='A door, a guard or a desk is between you and where you need to be, and a quick lie might get you past.',
actor='junior', wants='to get past', counterpart='whoever guards the way',
members=[34, 35, 36, 37, 38, 39, 51, 99, 144, 463, 529, 530, 533],
options=[
('Pose as someone with business there.', 'scene:463', {'cheek':'+', 'standing':'risk', 'flags.bluffed':'set'}),
('Claim a powerful connection you do not have.', 'scene:144', {'cheek':'+', 'standing':'risk', 'flags.bluffed':'set'}),
('Find a cover story that suits the one you want to reach.', 'scene:533', {'savvy':'+', 'money':'-'}),
('When the bluff walks into its owner, stall and signal for help.', 'scene:37', {'cheek':'+', 'relationships.boss':'risk'}),
('Give up and go the proper way.', 'archetype', {'standing':'-'})]),
# ---- station, rising, and looking the part ------------------------------------------------------------
dict(id='G15', name='Passing for grander than you are',
predicament='You are being taken for grander than you are, and it is working, as long as nobody finds out where you come from.',
actor='person passing', wants='to be taken for more', counterpart='a company that believes it',
members=[54, 59, 60, 67, 135, 136, 137, 139, 552, 553, 556, 569],
options=[
('Neither confirm nor deny what they say about you.', 'scene:60', {'standing':'+', 'flags.passing':'set'}),
('Borrow the clothes and take the floor.', 'scene:136', {'cheek':'+', 'standing':'risk'}),
('Slip back into your real place before anyone asks.', 'scene:139', {'savvy':'+'}),
('Look straight through the people you came from.', 'scene:556', {'standing':'+', 'relationships.family':'-', 'flags.passing':'set'}),
('Tell them plainly where you come from.', 'filled', {'standing':'-', 'relationships.family':'+'})]),
dict(id='G16', name='Out of place among the rich',
predicament='You are among people far richer than you, plainly not one of them, and everyone can see it.',
actor='outsider', wants='to hold your own', counterpart='a rich crowd',
members=[44, 68, 133, 168, 171, 172, 342, 407, 551],
options=[
('Brazen it out and enjoy yourself.', 'scene:342', {'cheek':'+', 'standing':'risk'}),
('Retreat to a corner and wait for it to end.', 'scene:171', {'standing':'-'}),
('Refuse what they offer you.', 'scene:172', {'standing':'+'}),
('Spend what you must to look the part.', 'scene:551', {'money':'-', 'standing':'+'}),
('Find the one person there who treats you as an equal.', 'scene:173', {'relationships.sweetheart':'+'})]),
dict(id='G17', name='Making yourself fit for the next rung',
predicament='You want to be ready for the rung above you, and looking and sounding the part will cost money, evenings or pride.',
actor='ambitious junior', wants='to be ready when the chance comes', counterpart='the people who will judge them',
members=[94, 95, 232, 481, 482, 555],
options=[
('Study in every spare moment.', 'scene:95', {'savvy':'+', 'relationships.friend':'+'}),
('Spend on a made-to-measure suit.', 'scene:481', {'money':'-', 'standing':'+'}),
('Pay for lessons so you will not shame yourself.', 'scene:555', {'money':'-', 'standing':'+'}),
('Smarten up quietly and daydream.', 'scene:232', {'standing':'+'}),
('Save your money; they can take you as you are.', 'archetype', {'money':'+', 'standing':'-'})]),
dict(id='G18', name='Still on the bottom rung',
predicament='Years in, you are still at the bottom, people expected you to be higher by now, and you must decide whether to wait, push or go.',
actor='long-serving junior', wants='to rise', counterpart='the people who could raise them',
members=[29, 33, 181, 246, 479, 490],
options=[
('Tell them you like it where you are.', 'scene:246', {'relationships.boss':'+', 'standing':'-'}),
('Keep away from everyone until you have made good.', 'scene:33', {'relationships.friend':'-', 'savvy':'+'}),
('Accept that someone has to stay at the bottom.', 'scene:181', {'standing':'-', 'flags.gave_up':'set'}),
('Threaten to quit unless your place is made plain.', 'scene:490', {'cheek':'+', 'relationships.boss':'risk', 'standing':'risk'}),
('Leave and try elsewhere.', 'scene:29', {'money':'risk', 'relationships.boss':'-'})]),
# ---- courtship --------------------------------------------------------------------------------------
dict(id='G19', name='A sweetheart far above you',
predicament='Someone far above you in station has been kind to you, and you cannot believe you have any right to hope.',
actor='suitor of low standing', wants='to be worthy of them', counterpart='a sweetheart far above',
members=[173, 174, 190, 191, 230, 231, 233, 234, 243, 397, 667],
options=[
('Keep their picture and tell yourself it is hopeless.', 'scene:230', {'relationships.sweetheart':'-'}),
('Let the letters quietly die.', 'scene:191', {'relationships.sweetheart':'-', 'money':'+'}),
('Greet them warmly in front of their crowd anyway.', 'scene:173', {'relationships.sweetheart':'+', 'standing':'risk'}),
('Tell them how you feel before they go.', 'filled', {'relationships.sweetheart':'risk', 'cheek':'+'}),
('Wait until you can meet them as an equal.', 'scene:479', {'relationships.sweetheart':'risk', 'standing':'+'})]),
dict(id='G20', name='Her guardian says you are not good enough',
predicament='The person who has charge of the one you love has decided you are beneath her, and has the means to keep you apart.',
actor='suitor', wants='to be accepted', counterpart='the sweetheart\'s guardian',
members=[198, 199, 247, 248, 258, 403, 423, 424, 475, 476, 484, 485, 486, 489, 492, 508, 522, 565, 568, 576,
621, 623, 624, 625, 632, 665, 666, 668, 669, 670, 671, 672, 673, 674],
options=[
('Give a flip answer and leave.', 'scene:258', {'cheek':'+', 'relationships.guardian':'-'}),
('Answer every question about your pay and post honestly.', 'scene:198', {'relationships.guardian':'risk', 'standing':'-'}),
('Do her a service she cannot refuse, and let her thank you.', 'scene:522', {'relationships.guardian':'+', 'savvy':'+'}),
('Give her advice so good she has to take it.', 'scene:623', {'relationships.guardian':'+', 'savvy':'+'}),
('Let your new standing speak for you.', 'scene:492', {'standing':'+', 'relationships.guardian':'-'})]),
dict(id='G21', name='Contriving a way to be near her',
predicament='You have been kept from the one you love, and a ruse, a disguise or a borrowed invitation might put you in the same room.',
actor='banned suitor', wants='time with her', counterpart='whoever keeps them apart',
members=[235, 237, 242, 249, 250, 255, 256, 257, 404, 405, 408, 409, 411, 412, 413, 414, 419, 420, 422,
472, 473, 474, 477, 478, 538, 539, 540, 612],
options=[
('Take a humble job that puts you near her.', 'scene:409', {'standing':'-', 'relationships.sweetheart':'+', 'flags.in_disguise':'set'}),
('Forge a message so you are the one sent.', 'scene:237', {'savvy':'+', 'cheek':'+', 'relationships.boss':'risk'}),
('Hang back while the rivals rush off.', 'scene:255', {'savvy':'+', 'relationships.sweetheart':'+'}),
('Quietly sabotage the rival\'s plans to stretch out the time.', 'scene:419', {'relationships.rival':'-', 'relationships.sweetheart':'+', 'flags.sabotage':'set'}),
('Steer someone else\'s invitation so you are included.', 'scene:539', {'savvy':'+', 'relationships.boss_family':'+'})]),
dict(id='G22', name='A rival for her in the room',
predicament='Someone richer or grander is courting the person you love, often with her family\'s blessing, and he is right there.',
actor='suitor', wants='to win her', counterpart='a rival suitor',
members=[130, 131, 132, 138, 239, 240, 241, 251, 252, 253, 254, 406, 415, 416, 417, 418, 421, 566, 567, 571, 572],
options=[
('Spend more than you can afford to outshine him.', 'scene:130', {'money':'-', 'relationships.sweetheart':'risk'}),
('Push forward, rival or no rival.', 'scene:239', {'cheek':'+', 'relationships.sweetheart':'+', 'relationships.rival':'-'}),
('Pack the rival off in another carriage.', 'scene:241', {'savvy':'+', 'relationships.rival':'-', 'relationships.sweetheart':'+'}),
('Hide rather than be seen at a disadvantage.', 'scene:406', {'standing':'-'}),
('Show him you bear no grudge.', 'scene:132', {'relationships.rival':'+', 'money':'+'})]),
dict(id='G23', name='The boss notices you are in love',
predicament='The boss has noticed your mind is on someone, and you must decide whether to confide in him or ask a favour.',
actor='junior in love', wants='time and help', counterpart='a kindly boss',
members=[175, 194, 398, 399, 483],
options=[
('Blurt out that you need time off at once.', 'scene:399', {'relationships.boss':'risk', 'money':'+', 'relationships.sweetheart':'+'}),
('Confide in the boss what it is all for.', 'scene:483', {'relationships.boss':'+'}),
('Sulk at your desk and hope nobody asks.', 'scene:398', {'relationships.boss':'-'}),
('Ask for time off, too happy to ask whether it is paid.', 'scene:194', {'money':'risk', 'relationships.sweetheart':'+'}),
('Keep work and courtship apart.', 'archetype', {'relationships.boss':'+', 'relationships.sweetheart':'-'})]),
dict(id='G24', name='Meddling in the boss\'s love life',
predicament='You know more about the boss\'s heart than anyone, and you could take a hand in his romance, whether or not he asked you to.',
actor='trusted junior', wants='to repay the boss\'s kindness', counterpart='the boss and the woman he loves',
members=[675, 678, 679, 680, 681, 682, 683, 684, 685, 686, 688, 689, 690, 691, 692, 693, 694, 695, 698, 699,
700, 701, 711],
options=[
('Plant a reminder where he will find it.', 'scene:680', {'savvy':'+', 'relationships.boss':'risk'}),
('Send a gift in his name without telling him.', 'scene:683', {'cheek':'+', 'relationships.boss':'risk', 'flags.meddled':'set'}),
('Go through his private files to find out what went wrong.', 'scene:694', {'savvy':'+', 'relationships.boss':'risk', 'flags.meddled':'set'}),
('Plead his case to her yourself.', 'scene:692', {'relationships.boss':'+', 'relationships.boss_love':'+'}),
('Leave his private life alone.', 'archetype', {'relationships.boss':'+'})]),
dict(id='G25', name='Stiffening a timid man\'s spine',
predicament='Someone decent is about to back down before a bully, a tyrant or the woman he loves, and a push from you might make him stand firm.',
actor='onlooker', wants='to see them stand firm', counterpart='a timid man',
members=[98, 102, 103, 104, 380, 381, 438, 439, 545, 546, 547, 548, 573, 696, 697],
options=[
('Call him spineless to his face.', 'scene:98', {'cheek':'+', 'relationships.friend':'risk'}),
('Tell him to walk in and say it straight, and announce him yourself.', 'scene:547', {'cheek':'+', 'relationships.friend':'+'}),
('Answer for him when he cannot.', 'scene:380', {'cheek':'+', 'relationships.friend':'risk', 'flags.committed_him':'set'}),
('Advise a firmer line, and plan it with him.', 'scene:438', {'savvy':'+', 'relationships.friend':'+'}),
('Let him find his own nerve.', 'archetype', {'relationships.friend':'-'})]),
# ---- after the promotion ----------------------------------------------------------------------------
dict(id='G26', name='Newly promoted, and not everyone accepts it',
predicament='You have just been raised above people who used to order you about: some defer, some resent it, and some have not heard.',
actor='newly promoted junior', wants='to be taken seriously in the new place', counterpart='the old hierarchy',
members=[96, 97, 491, 493, 494, 495, 496, 497, 498, 523, 524, 525, 526, 536, 634, 635],
options=[
('Refuse the deference and offer your hand.', 'scene:496', {'relationships.colleagues':'+', 'standing':'+'}),
('Let yourself be ordered about as the boy again, and wait.', 'scene:525', {'relationships.boss':'+', 'standing':'-'}),
('Let yourself feel like the indispensable one.', 'scene:523', {'standing':'risk', 'relationships.colleagues':'-'}),
('Sit brooding that you are only a dummy in the post.', 'scene:498', {'standing':'-'}),
('Prove yourself on the first real test.', 'scene:536', {'relationships.boss':'+', 'money':'+', 'savvy':'+'})]),
dict(id='G27', name='Everyone trusts the expert, and you think he is wrong',
predicament='An expert, a senior colleague or the police have settled what is going on, everyone above you believes them, and your common sense says otherwise.',
actor='junior', wants='to be proved right', counterpart='a trusted expert',
members=[115, 263, 264, 265, 266, 267, 268, 270, 500, 501, 502, 504, 506, 599, 601],
options=[
('Quietly run down your own lead.', 'scene:267', {'savvy':'+', 'relationships.boss':'risk'}),
('Tell the boss the expert is simply wrong.', 'scene:501', {'cheek':'+', 'relationships.supervisor':'-', 'standing':'risk'}),
('Learn the subject overnight and argue it before the top.', 'scene:500', {'savvy':'+', 'standing':'risk', 'relationships.boss':'+'}),
('Say nothing; the expert knows best.', 'archetype', {'relationships.supervisor':'+'}),
('Keep your doubt to yourself until you have proof.', 'filled', {'savvy':'+'})]),
# ---- wrongdoing, secrets and access -------------------------------------------------------------------
dict(id='G28', name='A wrongdoer at your mercy',
predicament='Someone who did real wrong is in your hands, begging, and handing them over would be right but hard.',
actor='person holding the proof', wants='to do right by everyone', counterpart='a culprit who begs',
members=[87, 89, 90, 91, 92, 93, 387, 390, 393, 600, 602, 603, 604],
options=[
('Quietly undo the damage and say nothing.', 'scene:93', {'relationships.culprit':'+', 'flags.kept_quiet':'set'}),
('Name the theft to their face.', 'scene:92', {'cheek':'+', 'relationships.culprit':'-'}),
('Bargain: everything back, and the charge dropped.', 'scene:603', {'savvy':'+', 'relationships.culprit':'+'}),
('Give them what they ask, to be rid of them.', 'scene:393', {'money':'-', 'relationships.culprit':'+'}),
('Report it to the boss.', 'filled', {'relationships.boss':'+', 'relationships.culprit':'-'})]),
dict(id='G29', name='Standing by someone the law or a mob is after',
predicament='Someone you owe or pity is cornered by officials or an angry crowd, and you could step clear of them.',
actor='loyal junior', wants='to see them safe', counterpart='the hunted, and those hunting them',
members=[12, 13, 122, 124, 125, 126, 127, 592, 593, 594],
options=[
('Insist they are honest, whatever the officials say.', 'scene:12', {'relationships.hunted':'+', 'standing':'risk'}),
('Barge in with a bluff to reach them.', 'scene:124', {'cheek':'+', 'relationships.hunted':'+', 'flags.bluffed':'set'}),
('Refuse to leave when told to save yourself.', 'scene:125', {'relationships.hunted':'+', 'standing':'risk'}),
('Take their hand as if they were with you.', 'scene:593', {'relationships.hunted':'+', 'relationships.sweetheart':'risk'}),
('Step clear before you are mixed up in it.', 'archetype', {'relationships.hunted':'-'})]),
dict(id='G30', name='An order from above you think is wrong',
predicament='The boss has given an order you think dishonest or reckless, and you are the one who must carry it out or refuse.',
actor='subordinate', wants='to keep the job and a clear conscience', counterpart='the boss',
members=[183, 184, 185, 186, 314, 315, 317, 459],
options=[
('Refuse, and resign rather than make a false entry.', 'scene:185', {'relationships.boss':'-', 'money':'-', 'flags.refused_order':'set'}),
('Say nothing and let it go out.', 'scene:315', {'relationships.boss':'+', 'flags.looked_away':'set'}),
('Carry it out with a flourish and a joke.', 'scene:317', {'cheek':'+', 'relationships.boss':'+'}),
('Do it, and complain bitterly afterwards.', 'scene:459', {'money':'+', 'standing':'-'}),
('Tell the boss plainly it should not be done.', 'filled', {'cheek':'+', 'relationships.boss':'risk'})]),
dict(id='G31', name='Pumped for what you know',
predicament='Someone friendly, or someone official, is asking you questions, and what you know belongs to someone else.',
actor='junior', wants='to be obliging without betraying anyone', counterpart='a questioner',
members=[9, 69, 70, 71, 153, 332, 333],
options=[
('Stall them, then tell the boss.', 'scene:9', {'relationships.boss':'+', 'savvy':'+'}),
('Enjoy the treats and chatter on.', 'scene:71', {'relationships.friend':'-', 'savvy':'-', 'flags.let_slip':'set'}),
('Tell the truth, for the fun of shocking them.', 'scene:153', {'cheek':'+', 'relationships.boss':'risk', 'flags.let_slip':'set'}),
('Ask who they are before you say a word.', 'filled', {'savvy':'+'}),
('Say nothing at all.', 'archetype', {'relationships.questioner':'-'})]),
dict(id='G32', name='Covering for the boss\'s absence',
predicament='Someone above you has gone off on private business just when he is needed, and you are the one left to cover for him.',
actor='junior', wants='to protect him without lying outright', counterpart='those asking where he is',
members=[84, 85, 86, 166, 169, 170, 176, 709, 710, 722],
options=[
('Tell a kindly cover story.', 'scene:85', {'relationships.boss':'+', 'flags.covered':'set'}),
('Pay out of your own pocket so nobody is let down.', 'scene:86', {'money':'-', 'relationships.family':'+'}),
('Quietly do his forgotten duty yourself.', 'scene:170', {'savvy':'+', 'relationships.boss':'+', 'flags.covered':'set'}),
('Tell the one asking the truth, lightly.', 'scene:710', {'relationships.boss':'risk', 'standing':'+'}),
('Say you do not know where he is.', 'archetype', {'relationships.boss':'-'})]),
dict(id='G33', name='Someone wants to trade on your access',
predicament='Because you sit near the powerful, a stranger or an old acquaintance wants you to open a door, pass on a word or lend your name.',
actor='trusted insider', wants='to stay trusted', counterpart='someone who wants access',
members=[383, 384, 385, 509, 510, 511, 646, 647, 648, 649, 653],
options=[
('Check with the one they claim to know before you pay a cent.', 'scene:385', {'savvy':'+', 'relationships.boss':'+'}),
('Brush them off with a joke.', 'scene:510', {'cheek':'+'}),
('Shadow them to see what they are really after.', 'scene:511', {'savvy':'+', 'relationships.boss':'+'}),
('Ask who told them you were such an easy mark.', 'scene:649', {'cheek':'+', 'relationships.stranger':'-'}),
('Do the favour; it costs you nothing.', 'filled', {'relationships.stranger':'+', 'relationships.boss':'risk', 'flags.lent_name':'set'})]),
dict(id='G34', name='The boss in a temper',
predicament='The boss is raging, the whole place is afraid of him, and you have to go in anyway.',
actor='junior', wants='to get through it, or bring him round', counterpart='a raging boss',
members=[55, 56, 164, 165, 305, 316, 318, 319, 687],
options=[
('Take your time, and refuse to be rattled.', 'scene:164', {'cheek':'+', 'relationships.boss':'risk'}),
('Tease him that his temper is mostly bluff.', 'scene:317', {'cheek':'+', 'relationships.boss':'+'}),
('Walk in as calm as a guest.', 'scene:55', {'standing':'+', 'relationships.boss':'+'}),
('Find him something else to do.', 'scene:318', {'savvy':'+', 'relationships.boss':'+', 'money':'-'}),
('Keep out of his way until it blows over.', 'archetype', {'relationships.boss':'-'})]),
# ---- benefactors, families and old loves -------------------------------------------------------------
dict(id='G35', name='A benefactor who wants to run your life',
predicament='Someone who supports you, a rich relative or a parent, has decided what work and what marriage are good for you.',
actor='dependent', wants='to live their own way', counterpart='a controlling benefactor',
members=[300, 334, 335, 336, 337, 370, 371, 372, 374],
options=[
('Walk away from the money.', 'scene:335', {'money':'-', 'relationships.benefactor':'risk', 'flags.walked_away':'set'}),
('Own the deception, and leave with a handshake.', 'scene:336', {'relationships.benefactor':'+', 'money':'-'}),
('Stay at the dreary work and tell yourself you deserve no better.', 'scene:371', {'money':'+', 'standing':'-'}),
('Keep your real work secret under their roof.', 'scene:334', {'relationships.benefactor':'-', 'flags.secret_work':'set'}),
('Ask them what they are afraid you will become.', 'filled', {'relationships.benefactor':'+', 'savvy':'+'})]),
dict(id='G36', name='Taken in by someone richer',
predicament='Someone older and richer has taken you in, and you must decide how much of their generosity, and their rules, to accept.',
actor='young person taken in', wants='a home without losing themselves', counterpart='a benefactor',
members=[147, 148, 149, 150, 152, 636, 637, 638, 663, 664],
options=[
('Come back when you could have run.', 'scene:147', {'relationships.benefactor':'+'}),
('Be yourself at their table, irreverence and all.', 'scene:149', {'cheek':'+', 'relationships.benefactor':'+'}),
('Side with the lively one against the pious one.', 'scene:638', {'relationships.benefactor':'+', 'relationships.household':'-'}),
('Take the gift on its thin pretext.', 'scene:664', {'relationships.benefactor':'+', 'relationships.sweetheart':'+'}),
('Insist on paying your own way.', 'filled', {'money':'-', 'standing':'+'})]),
dict(id='G37', name='Helping a couple against the family',
predicament='A couple you know want to marry, and someone in the family is set on stopping it.',
actor='ally of the couple', wants='to see them married', counterpart='a family elder who forbids it',
members=[72, 73, 197, 541, 542, 543, 549, 644, 645],
options=[
('Stand by the couple against the elder.', 'scene:73', {'relationships.couple':'+', 'relationships.elder':'-'}),
('Let the elder see them together, and soften.', 'scene:197', {'relationships.couple':'+', 'relationships.elder':'+'}),
('Keep the elder distracted while the couple act.', 'scene:543', {'savvy':'+', 'relationships.elder':'risk'}),
('Give them your blessing after the fact.', 'scene:645', {'relationships.couple':'+'}),
('Stay out of family business.', 'archetype', {'relationships.elder':'+', 'relationships.couple':'-'})]),
dict(id='G38', name='A love let slip, and one more chance',
predicament='You let someone you loved drift away, through pride, work or neglect, and a last chance to see them has come.',
actor='former suitor', wants='them back', counterpart='the one who got away',
members=[192, 193, 279, 280, 281, 283, 284, 285, 639, 640, 641, 642, 643, 676, 677],
options=[
('Go, and marry them that same night.', 'scene:193', {'relationships.lost_love':'+', 'money':'risk'}),
('Wait for them in the cold, however long it takes.', 'scene:284', {'relationships.lost_love':'risk', 'standing':'-'}),
('Tell yourself it is hopeless and put their picture away.', 'scene:677', {'relationships.lost_love':'-'}),
('Turn up at their door and ask whether they are still themselves.', 'scene:641', {'relationships.lost_love':'+', 'cheek':'+'}),
('Give the ring to someone who waited for you instead.', 'scene:286', {'relationships.lost_love':'-'})]),
dict(id='G39', name='A snob shown up',
predicament='Someone around you looks down on a humble person you have reason to think is worth far more, and the truth is about to come out.',
actor='onlooker', wants='to see the snob put right', counterpart='a snob and the person they scorn',
members=[79, 80, 287, 293, 298, 357, 363, 366, 570, 574, 575, 626, 627, 628, 629, 630, 631, 725],
options=[
('Mock the snob for it.', 'scene:357', {'cheek':'+', 'relationships.snob':'-'}),
('Rub it in once the truth is out.', 'scene:366', {'cheek':'+', 'relationships.snob':'-', 'standing':'+'}),
('Hand the snob to the one person who can show them up.', 'scene:78', {'savvy':'+', 'relationships.snob':'-'}),
('Refuse to join the sneering.', 'scene:294', {'relationships.snob':'risk', 'relationships.humble':'+'}),
('Let the snob find out for themselves.', 'archetype', {'savvy':'+'})]),
]
# 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.
# Judged by RANK, the job he holds in the story, so that all three volumes use one measure.
STANDING = {**{s: 'low' for s in range(0, 37)}, # office boy at the gate (0 at a swindle's two-room office)
**{s: 'middle' for s in range(37, 50)}, # private secretary to a subsidiary
**{s: 'high' for s in range(50, 55)}} # in the directors' meetings, acting head, near equal
# Story 36 is low: he is promoted only in its last scenes (491-493). 48 and 49 stay middle: learning his
# family changes his standing with the guardian, not his job. From 50 he sits in on directors' meetings.
# The readers staged by different measures. Volume 1's reader used rank (all low) and noted that his
# PULL rises from story 12. Volume 2's reader used trust and reach, and rated 21, 24, 25, 29, 32, 33
# and 34 middle, the stories where he acts in the boss's name with money or authority. Volume 3's
# reader used rank. Those seven stay low here: he is still the office boy in all of them. Where his
# influence runs ahead of his rank is shown by the groups (G06, G10), not by his stage.