Files
TheLadder/tools/story-to-pack/probe/poe/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

257 lines
20 KiB
Python

"""Hand-built reference grouping of the Poe predicaments (Claude-written, no local inference).
Each scene is in at most one group; scenes that fit no recurring situation stay unassigned.
Options follow DESIGN.md: 3-5 per group, each marked by where it came from --
'archetype' a fixed, setting-free option
'scene:N' what someone in 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 (holding steady under dread) and
reason (keeping your head and thinking it through: the searcher, the man in the whirlpool, the
prisoner under the blade).
"""
G = [
dict(id='G01', name='The urge you cannot resist',
predicament='Something in you keeps pulling towards the one act you know will ruin you, and resisting only makes it stronger.',
actor='person in the grip of a compulsion', wants='to be free of the urge', counterpart='the thing they are fixed on',
members=[30, 119, 189, 190, 191, 192, 337, 338, 341, 342, 349, 350, 351, 352, 356],
options=[
('Give in to it and have done.', 'scene:119', {'flags.gave_in':'set', 'standing':'-', 'nerve':'-'}),
('Put it off another day, and another.', 'scene:191', {'reason':'-', 'standing':'risk'}),
('Sit with it and study it until it passes.', 'scene:350', {'reason':'+', 'relationships.household':'-'}),
('Step back from the edge, or let someone hold you back.', 'scene:192', {'nerve':'+', 'relationships.confidant':'+'}),
('Get rid of whatever sets it off.', 'scene:337', {'flags.violent':'set', 'relationships.household':'-'})]),
dict(id='G02', name='Safe, and about to give yourself away',
predicament='You have got away with it, and the safer you feel, the stronger the urge to let it slip.',
actor='person with a hidden crime', wants='to stay safe', counterpart='people who suspect nothing',
members=[128, 129, 130, 194, 195, 329, 330, 339, 344, 345],
options=[
('Say nothing more and let them go.', 'archetype', {'nerve':'+'}),
('Make one small boast, to show how safe you are.', 'scene:129', {'standing':'risk', 'flags.exposed':'set'}),
('Talk louder and faster to drown out what you hear.', 'scene:345', {'nerve':'-', 'standing':'risk'}),
('Run from the thought before it reaches your tongue.', 'scene:195', {'nerve':'-', 'relationships.crowd':'-'}),
('Confess it yourself and have it over.', 'filled', {'standing':'-', 'flags.confessed':'set'})]),
dict(id='G03', name='Hiding what you did, with the searchers on their way',
predicament='You have hidden what you did, and the people who will look for it are on their way.',
actor='person with something to hide', wants='it never to be found', counterpart='the searchers',
members=[82, 126, 127, 193, 343],
options=[
('Hide it where no one would think to look.', 'scene:127', {'reason':'+', 'flags.evidence_hidden':'set'}),
('Destroy the evidence the moment you are caught.', 'scene:82', {'nerve':'+', 'standing':'risk'}),
('Open the door calmly and invite them to search.', 'scene:343', {'nerve':'+', 'relationships.searchers':'+'}),
('Plan it so that nothing can ever be traced.', 'scene:193', {'reason':'+', 'money':'+'}),
('Leave before they come.', 'filled', {'standing':'-', 'flags.fled':'set'})]),
dict(id='G04', name='Shut in the dark, and no one knows',
predicament='You are shut in where no one knows to look, and help is only a few feet away.',
actor='person sealed in', wants='to be found', counterpart='the people just out of reach',
members=[185, 226, 227, 248, 250, 251, 253, 254, 260, 261],
options=[
('Beat on the door until someone hears.', 'scene:248', {'nerve':'+', 'relationships.rescuers':'risk'}),
('Force your way out by main strength.', 'scene:250', {'nerve':'+', 'flags.escaped':'set'}),
('Lie still and save your breath.', 'filled', {'reason':'+'}),
('Beg the one who shut you in to call it a joke.', 'scene:185', {'relationships.captor':'risk', 'nerve':'-'}),
('Keep trying to make them understand you are alive.', 'scene:253', {'relationships.rescuers':'+'})]),
dict(id='G05', name='The one you gave up for dead',
predicament='Someone everyone gave up for dead may still be alive, and every hour you do nothing may be too late.',
actor='mourner', wants='to have done right by the dead', counterpart='the one taken for dead',
members=[111, 149, 150, 151, 160, 161, 247, 249, 252, 359],
options=[
('Open it up and look.', 'scene:249', {'nerve':'+', 'relationships.lost_one':'+'}),
('Say what you heard, now, whatever they think of you.', 'filled', {'nerve':'+', 'standing':'risk'}),
('Keep silent and tell yourself you imagined it.', 'scene:160', {'nerve':'-', 'relationships.lost_one':'-', 'flags.let_them_lie':'set'}),
('Close it up and walk away.', 'scene:151', {'relationships.lost_one':'-', 'flags.let_them_lie':'set'}),
('Fetch someone who knows the signs before you decide.', 'scene:252', {'relationships.physician':'+', 'money':'-'})]),
dict(id='G06', name='Death coming slowly, and one cool head',
predicament='Death is coming closer step by step, and only a cool head and close watching might find a way out.',
actor='trapped person', wants='to survive', counterpart='what is closing in',
members=[64, 65, 66, 67, 68, 70, 71, 72, 73, 232, 234, 235, 236, 237, 238, 239, 240, 241, 244],
options=[
('Watch everything around you for a pattern you can use.', 'scene:73', {'reason':'+', 'flags.found_way_out':'set'}),
('Turn what torments you into the means of escape.', 'scene:240', {'reason':'+', 'nerve':'+'}),
('Lie perfectly still through the pain until it works.', 'scene:241', {'nerve':'+'}),
('Struggle against it with everything you have.', 'scene:236', {'nerve':'-'}),
('Give up hope, and find how calm it leaves you.', 'scene:67', {'nerve':'+', 'reason':'+'})]),
dict(id='G07', name='Nobody will believe what you saw',
predicament='What you lived through sounds like madness, and the listener who matters will not believe a word of it.',
actor='witness', wants='to be believed', counterpart='a doubting listener',
members=[38, 39, 40, 41, 42, 43, 44, 45, 46, 50, 75, 87, 101, 115, 360],
options=[
('Tell it plainly, without comment, and let them judge.', 'scene:87', {'standing':'risk', 'reason':'+'}),
('Take them to the place and show them.', 'scene:50', {'relationships.listener':'+', 'nerve':'+'}),
('Keep adding proof until they must believe.', 'scene:45', {'relationships.listener':'-', 'standing':'risk'}),
('Stop before their patience runs out.', 'filled', {'relationships.listener':'+', 'standing':'-'}),
('Keep it to yourself.', 'archetype', {'flags.untold':'set'})]),
dict(id='G08', name='The reminder that will not go away',
predicament='Something keeps turning up to remind you of what you did, and you can neither face it nor get rid of it.',
actor='guilty person', wants='peace', counterpart='the reminder that will not go',
members=[120, 121, 122, 123, 124, 319, 324, 332, 333, 358, 368],
options=[
('Explain it away.', 'scene:121', {'reason':'+', 'flags.guilty_secret':'set'}),
('Run from it, as far as you can go.', 'scene:332', {'money':'-', 'standing':'-'}),
('Try to destroy it.', 'scene:125', {'flags.violent':'set', 'relationships.household':'-'}),
('Listen to what it is telling you.', 'scene:319', {'standing':'+', 'relationships.conscience':'+'}),
('Drown it in drink.', 'scene:118', {'money':'-', 'nerve':'-'})]),
dict(id='G09', name='A rival who is your mirror',
predicament='A rival matches you move for move, as if they knew your mind as well as you do.',
actor='person used to winning', wants='to come out on top', counterpart='a rival who mirrors them',
members=[12, 13, 17, 312, 313, 314, 315, 316, 317, 318, 320, 321, 331],
options=[
('Get inside their head: think exactly as they think.', 'scene:13', {'reason':'+'}),
('Mock their one weakness.', 'scene:315', {'relationships.rival':'-', 'standing':'-'}),
('Act in public as if they are no match for you.', 'scene:313', {'standing':'+', 'relationships.rival':'-'}),
('Catch them off guard when they are unprotected.', 'scene:321', {'relationships.rival':'-', 'nerve':'risk'}),
('Admit they are your equal.', 'filled', {'relationships.rival':'+'})]),
dict(id='G10', name='A revenge they cannot escape',
predicament='Someone has wronged you once too often, and you want a revenge they cannot escape and will know came from you.',
actor='wronged person', wants='revenge without risk', counterpart='the one who wronged them',
members=[24, 25, 178, 179, 180, 181, 182, 183, 184, 186, 334, 335, 336],
options=[
('Keep smiling and wait for your moment.', 'scene:178', {'nerve':'+', 'relationships.enemy':'+'}),
('Lure them in through their vanity.', 'scene:179', {'reason':'+', 'relationships.enemy':'risk'}),
('Leave them a sign so they know it was you.', 'scene:25', {'standing':'+', 'relationships.enemy':'-'}),
('Have it out face to face, here and now.', 'scene:335', {'flags.violent':'set', 'standing':'risk'}),
('Let it go.', 'archetype', {'standing':'-', 'relationships.enemy':'+'})]),
dict(id='G11', name='Walled off from the danger outside',
predicament='You have shut yourself away from a danger everyone else must face, and you are no longer sure the walls will hold.',
actor='person behind walls', wants='to stay safe', counterpart='the danger outside',
members=[141, 167, 168, 169, 170, 172, 173, 174, 176, 177, 259, 262],
options=[
('Seal the gates and make merry inside.', 'scene:167', {'money':'-', 'relationships.outside':'-', 'flags.walled_in':'set'}),
('Build every precaution you can think of.', 'scene:259', {'money':'-', 'reason':'+'}),
('Face the intruder yourself.', 'scene:176', {'nerve':'+', 'standing':'risk'}),
('Stop leaving the house at all.', 'scene:141', {'nerve':'-', 'relationships.outside':'-'}),
('Go out and live anyway.', 'scene:264', {'nerve':'+', 'standing':'+'})]),
dict(id='G12', name='A companion who may not be sane',
predicament='Someone close to you speaks of a danger only they can sense, and you cannot tell whether it is real or madness.',
actor='companion', wants='to know what is real', counterpart='a friend who may be mad',
members=[51, 140, 144, 145, 147, 148, 152, 154, 155, 158, 171, 214, 216],
options=[
('Explain it away, gently, to calm them.', 'scene:155', {'reason':'+', 'relationships.friend':'+'}),
('Hide your own fear so as not to feed theirs.', 'scene:158', {'nerve':'+'}),
('Humour them and go along with it.', 'scene:171', {'relationships.friend':'+', 'standing':'risk'}),
('Take them at their word and look for yourself.', 'filled', {'nerve':'+', 'relationships.friend':'+'}),
('Leave while you still can.', 'archetype', {'relationships.friend':'-'})]),
dict(id='G13', name='Sent for by a friend in a bad way',
predicament='An old friend in a bad way has sent for you, and the person you find is not the one you remember.',
actor='old friend', wants='to help', counterpart='a friend who has changed',
members=[88, 104, 133, 139, 143, 212, 213],
options=[
('Go at once, whatever the reason.', 'scene:133', {'relationships.friend':'+', 'money':'-'}),
('Keep them company and try to lift their spirits.', 'scene:143', {'relationships.friend':'+', 'nerve':'-'}),
('Talk to the people looking after them first.', 'scene:105', {'reason':'+', 'relationships.physician':'+'}),
('Do what they ask, though you have doubts.', 'scene:106', {'relationships.friend':'+', 'flags.consented':'set'}),
('Send your regrets and stay away.', 'archetype', {'relationships.friend':'-'})]),
dict(id='G14', name='Experimenting on the dying',
predicament='Someone who trusts you is dying, and you could use their last hours to learn what no one has ever learned.',
actor='practitioner', wants='to learn what lies past death', counterpart='a dying subject',
members=[89, 90, 91, 100, 102, 103, 106, 107, 108, 109, 110, 112, 113, 114],
options=[
('Go ahead, with their consent and a witness.', 'scene:106', {'reason':'+', 'standing':'risk', 'flags.experiment':'set'}),
('Keep them where they are, between life and death, and see.', 'scene:113', {'standing':'risk', 'relationships.subject':'-'}),
('Let them go when they beg to die.', 'filled', {'relationships.subject':'+'}),
('Ask one more question.', 'scene:110', {'reason':'+', 'relationships.subject':'-'}),
('Bring them back, whatever it costs.', 'scene:114', {'nerve':'+', 'standing':'-'})]),
dict(id='G15', name='At the mercy of someone without pity',
predicament='Your life is in the hands of someone without pity, who may be watching to see how you take it.',
actor='captive', wants='to live', counterpart='a pitiless captor',
members=[26, 28, 29, 47, 163, 164, 165, 166, 222, 228, 229, 230, 231, 242, 243],
options=[
('Keep them interested, one night at a time.', 'scene:28', {'reason':'+', 'relationships.captor':'+'}),
('Endure whatever comes and do not flinch.', 'scene:164', {'nerve':'+'}),
('Learn every inch of where they have put you.', 'scene:229', {'reason':'+'}),
('Break and run.', 'scene:165', {'nerve':'-', 'flags.fled':'set'}),
('Accept it with good grace.', 'scene:49', {'standing':'+', 'nerve':'+'})]),
dict(id='G16', name='A sound in the night',
predicament='You are awake in the dark and hear something you cannot explain, and reasoning it away no longer works.',
actor='person awake at night', wants='to be safe', counterpart='whatever is making the sound',
members=[153, 156, 157, 257, 340],
options=[
('Tell yourself it is nothing, and read on.', 'scene:156', {'reason':'+', 'nerve':'-'}),
('Get up and pace until it passes.', 'scene:153', {'nerve':'+'}),
('Sit up and listen, without moving.', 'scene:339', {'nerve':'-'}),
('Go and see what it is.', 'filled', {'nerve':'+', 'flags.faced_fear':'set'})]),
dict(id='G17', name='A place that works on you',
predicament='A place seems to be working on you, and the harder you reason against the feeling, the stronger it grows.',
actor='newcomer to a place', wants='to shake off the feeling', counterpart='the place itself',
members=[52, 132, 135, 136, 137, 138, 201, 233],
options=[
('Look at it from another angle to break the spell.', 'scene:132', {'reason':'+', 'nerve':'-'}),
('Examine it closely for plain causes.', 'scene:136', {'reason':'+'}),
('Turn round and leave.', 'archetype', {'nerve':'-', 'standing':'-'}),
('Go in anyway.', 'scene:137', {'nerve':'+', 'flags.entered':'set'})]),
dict(id='G18', name='Your companion breaks',
predicament='At the worst moment the one person beside you breaks under the terror, and you must choose between saving them and yourself.',
actor='survivor', wants='to live', counterpart='a companion broken by fear',
members=[69, 74, 159],
options=[
('Give them what they are fighting you for.', 'scene:69', {'relationships.companion':'+', 'nerve':'+'}),
('Show them your plan and beg them to follow.', 'scene:74', {'relationships.companion':'+'}),
('Leave them to their fate.', 'scene:74', {'relationships.companion':'-', 'flags.left_behind':'set'}),
('Shake them back to their senses.', 'scene:159', {'nerve':'+', 'relationships.companion':'risk'})]),
dict(id='G19', name='Going to the bad',
predicament='You can feel yourself turning into someone worse, and the people who depend on you feel it first.',
actor='person going to the bad', wants='the next indulgence', counterpart='those who depend on them',
members=[117, 118, 125, 305, 322, 323, 325, 326, 327, 328],
options=[
('Drink to forget what you did last night.', 'scene:118', {'money':'-', 'relationships.household':'-'}),
('Pay for it by cheating people who trust you.', 'scene:326', {'money':'+', 'standing':'risk', 'flags.cheat':'set'}),
('Throw yourself into the next revel.', 'scene:322', {'money':'-', 'standing':'+'}),
('Stop while you still can.', 'filled', {'standing':'+', 'relationships.household':'+'})]),
dict(id='G20', name='A love you are not free to have',
predicament='The one you love is bound to someone else or lost to death, and a promise still ties you to them.',
actor='lover', wants='the one they cannot have', counterpart='a love held by another, or by death',
members=[207, 208, 209, 217, 218, 219, 220, 365, 367],
options=[
('Watch from hiding, and act when the moment comes.', 'scene:208', {'relationships.beloved':'+', 'standing':'risk'}),
('Make a secret appointment.', 'scene:209', {'relationships.beloved':'+', 'relationships.spouse':'-', 'flags.secret_affair':'set'}),
('Swear never to love another.', 'scene:365', {'relationships.beloved':'+', 'flags.vow':'set'}),
('Break the vow and love again.', 'scene:368', {'relationships.new_love':'+', 'flags.broke_vow':'set'}),
('Keep the appointment, whatever it costs.', 'scene:220', {'flags.fatal':'set', 'standing':'-'})]),
dict(id='G21', name='Someone you love fading into a stranger',
predicament='Someone you love is wasting away into a stranger, and you can neither stop it nor bear to watch.',
actor='one who stays', wants='the person they knew back', counterpart='a loved one who is fading',
members=[142, 348, 353, 354, 355, 364, 366],
options=[
('Promise them whatever will ease their end.', 'scene:365', {'relationships.loved_one':'+', 'flags.vow':'set'}),
('Marry them out of pity.', 'scene:354', {'relationships.loved_one':'+', 'standing':'risk'}),
('Stay, and watch every change.', 'scene:348', {'nerve':'-', 'relationships.loved_one':'+'}),
('Leave the place that reminds you.', 'scene:367', {'relationships.loved_one':'-', 'standing':'+'})]),
dict(id='G22', name='A fortune everyone is watching',
predicament='You have come into more money than anyone can account for, and everyone is watching to see what you do.',
actor='suddenly rich person', wants='to use it their own way', counterpart='the watching world',
members=[81, 85, 86, 267, 268],
options=[
('Refuse to say where it came from.', 'scene:81', {'standing':'-', 'flags.suspected':'set'}),
('Hand part of it to your family.', 'scene:268', {'money':'-', 'relationships.family':'+'}),
('Put all of it into one private dream.', 'scene:269', {'money':'-', 'standing':'risk'}),
('Keep the secret of how until you choose to share it.', 'scene:85', {'money':'+', 'reason':'+'})]),
dict(id='G23', name='Hidden in plain sight',
predicament='Something you must find has been hidden by someone cleverer than you, and all your careful searching has failed.',
actor='searcher', wants='what was hidden', counterpart='a cunning hider',
members=[4, 5, 6, 7, 8, 9, 11, 14, 19, 20, 21, 22, 83, 84],
options=[
('Search it all again, harder.', 'scene:8', {'money':'-'}),
('Pay someone cleverer to find it.', 'scene:10', {'money':'-', 'relationships.adviser':'+'}),
('Think as the hider thinks, and look where it is too obvious to see.', 'scene:19', {'reason':'+'}),
('Call on them with a pretext and look around.', 'scene:20', {'reason':'+', 'relationships.hider':'risk'}),
('Have them waylaid and searched.', 'scene:5', {'standing':'risk', 'relationships.hider':'-'})]),
dict(id='G24', name='A world of your own',
predicament='You have the means to shut out the world and build a place entirely to your own design.',
actor='dreamer with means', wants='a world of their own', counterpart='the world outside',
members=[197, 199, 269, 270, 278, 279, 280, 361, 362, 363],
options=[
('Go as far from everyone as you can.', 'scene:279', {'relationships.outside':'-', 'flags.withdrawn':'set'}),
('Stay near enough to come back when you choose.', 'scene:279', {'relationships.outside':'+'}),
('Pour everything you have into it.', 'scene:278', {'money':'-', 'standing':'+'}),
('Share it with one person only.', 'scene:361', {'relationships.companion':'+'})]),
]
# 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:'middle', 1:'high', 2:'low', 3:'low', 4:'middle', 5:'middle', 6:'middle', 7:'high',
8:'high', 9:'high', 10:'high', 11:'middle', 12:'middle', 13:'high', 14:'low', 15:'middle',
16:'high', 17:'middle', 18:'high', 19:'low', 20:'high', 21:'middle'}
# Story 0's protagonist is the reasoner, a gentleman of reduced means, not the minister he outwits.
# Story 3's is the poor chemist, not the commentator. Story 8's is the stately man on the rock.
# Story 19's narrator lives in the old man's house as a dependant, so he ranks low.