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

179 lines
14 KiB
Python

"""Hand-built reference grouping of the Chekhov 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: patience, tact.
"""
G = [
dict(id='G01', name='Stuck in a life that has stopped meaning anything',
predicament='You have done the same thankless duty for years, you no longer believe it matters, and you cannot see any way out.',
actor='person worn down by routine', wants='a reason to keep going', counterpart='the life they are stuck in',
members=[0, 6, 7, 53, 56, 121, 122, 123, 163],
options=[
('Keep at it without complaint.', 'scene:7', {'patience':'+', 'flags.resigned':'set'}),
('Drink to make the days pass.', 'scene:53', {'money':'-', 'standing':'-'}),
('Take your complaint to those above you, again.', 'scene:3', {'relationships.authority':'-', 'standing':'risk'}),
('Tell yourself real life is elsewhere, and wait for your chance.', 'scene:128', {'flags.dreaming_of_escape':'set'}),
('Give it up and leave for something else.', 'filled', {'money':'risk', 'standing':'risk', 'flags.left':'set'})]),
dict(id='G02', name='A grief nobody will hear',
predicament='You have lost someone, and the people around you will not listen, or tell you that you are mourning wrongly.',
actor='bereaved person', wants='someone to hear their grief', counterpart='people who will not listen',
members=[47, 49, 50, 51, 52, 84, 135, 167, 169],
options=[
('Keep trying to tell whoever is nearest.', 'scene:50', {'patience':'+', 'relationships.stranger':'risk'}),
('Laugh along and keep it to yourself.', 'scene:49', {'patience':'+', 'flags.grief_unspoken':'set'}),
('Pour it out to something that cannot answer back.', 'scene:52', {'flags.grief_unspoken':'set'}),
('Mourn your own way, whatever they say.', 'scene:169', {'standing':'-', 'relationships.family':'+'}),
('Tell them to their face that they are heartless.', 'scene:84', {'standing':'-', 'relationships.stranger':'-'})]),
dict(id='G03', name='A glimpse of the life you are missing',
predicament='In the middle of an ordinary dull day, something brings back or shows you a fuller life than yours.',
actor='person in a narrow life', wants='the life they glimpsed', counterpart='a passing vision of something better',
members=[11, 12, 128, 208, 210, 213, 214, 217],
options=[
('Let yourself feel it, then go back to your work.', 'scene:12', {'patience':'+'}),
('Keep looking for as long as it lasts.', 'scene:213', {'flags.longing':'set'}),
('Start planning seriously how to get there.', 'scene:128', {'money':'-', 'flags.dreaming_of_escape':'set'}),
('Speak to the person who stirred it.', 'filled', {'tact':'+', 'relationships.stranger':'risk'})]),
dict(id='G04', name='On the outside of other people\'s warmth',
predicament='Other people are celebrating together, or a whole household is gathered in warmth, and you are outside it.',
actor='person left out', wants='a share of the warmth', counterpart='a household or crowd enjoying itself',
members=[132, 133, 134, 162, 173, 218],
options=[
('Accept the welcome and join in.', 'scene:134', {'tact':'+', 'relationships.host':'+'}),
('Take the extra work for the extra money.', 'scene:162', {'money':'+', 'relationships.peers':'-'}),
('Watch from outside and keep your thoughts to yourself.', 'scene:173', {'patience':'+'}),
('Grumble aloud at the unfairness of it.', 'scene:218', {'standing':'-', 'flags.resentment':'set'})]),
dict(id='G05', name='Talked down to by those above you',
predicament='Someone above you brushes you off, scolds you, or treats you as beneath their notice, and you need them.',
actor='humble person', wants='to be heard and treated decently', counterpart='someone above them',
members=[3, 43, 101, 102, 125, 140, 161, 166, 168, 220],
options=[
('Bow, flatter them and ask again.', 'scene:112', {'tact':'+', 'standing':'-', 'relationships.superior':'+'}),
('Take the insult and carry on.', 'scene:125', {'patience':'+', 'standing':'-'}),
('Go over their head to someone higher.', 'scene:102', {'standing':'risk', 'relationships.superior':'-'}),
('Argue your case back to them.', 'scene:168', {'standing':'risk', 'relationships.superior':'-'}),
('Send the polite greetings you do not mean.', 'scene:161', {'tact':'+', 'relationships.superior':'+', 'flags.resentment':'set'})]),
dict(id='G06', name='Nothing moves without a little something',
predicament='An ordinary thing you are owed will only happen if you slip someone something, and everyone around you already does.',
actor='person who needs an ordinary thing done', wants='it done in time', counterpart='people who expect a little something',
members=[9, 88, 90, 93, 95, 97, 104, 124, 164],
options=[
('Pay what is hinted, without a word.', 'scene:88', {'money':'-', 'tact':'+', 'relationships.gatekeeper':'+'}),
('Refuse, and put a complaint in writing.', 'scene:105', {'standing':'risk', 'relationships.gatekeeper':'-', 'flags.complaint_lodged':'set'}),
('Treat them generously and make a friend of them.', 'scene:96', {'money':'-', 'relationships.gatekeeper':'+'}),
('Keep your hands clean and wait it out.', 'archetype', {'patience':'+', 'money':'risk'}),
('Take a cut of your own while you are at it.', 'scene:164', {'money':'+', 'standing':'risk', 'flags.dishonest':'set'})]),
dict(id='G07', name='Your work goes unrecognised',
predicament='You have worked hard and well, and nobody has heard of you, while showier people get all the notice.',
actor='hard worker', wants='credit for their work', counterpart='an indifferent public',
members=[38, 142, 143, 144, 145, 147, 148, 149, 199],
options=[
('Keep working and let the work speak for itself.', 'archetype', {'patience':'+'}),
('Fish for notice among strangers.', 'scene:148', {'standing':'-'}),
('Go where people who matter might see it.', 'scene:146', {'money':'-', 'standing':'risk'}),
('Laugh about it with someone in the same boat.', 'scene:150', {'relationships.peer':'+'})]),
dict(id='G08', name='A marriage gone numb',
predicament='Your spouse adores or depends on you, and you have long since stopped seeing them at all.',
actor='married person', wants='something to break the monotony', counterpart='a devoted spouse',
members=[54, 55, 57, 113],
options=[
('Take your boredom out on them.', 'scene:54', {'relationships.spouse':'-'}),
('Walk out to be alone with your thoughts.', 'scene:55', {'relationships.spouse':'-'}),
('Humour their worries and stay home.', 'filled', {'patience':'+', 'relationships.spouse':'+'}),
('Look at them properly, for once.', 'scene:113', {'relationships.spouse':'+', 'flags.woke_up':'set'})]),
dict(id='G09', name='Too late to make it right',
predicament='You see at last what you owed someone, or what you let slip with them, and it is already too late.',
actor='person who let it slip', wants='another chance', counterpart='someone they failed',
members=[69, 70, 114, 115, 116, 117, 170],
options=[
('Say it now, late as it is.', 'filled', {'tact':'-', 'relationships.lost':'+'}),
('Sit with it together in silence.', 'scene:70', {'patience':'+', 'relationships.lost':'+'}),
('Promise to change.', 'scene:114', {'flags.vowed':'set'}),
('Put right the duties you left undone.', 'scene:117', {'money':'-', 'standing':'+'})]),
dict(id='G10', name='Drawn to someone of another rank',
predicament='You are drawn to someone well above or below you, and the gap between you seems too wide to cross.',
actor='person drawn across a gap in rank', wants='the one they are drawn to', counterpart='someone above or below them',
members=[2, 5, 65, 66, 67, 68, 212, 216],
options=[
('Declare yourself and ask for nothing.', 'scene:66', {'standing':'risk', 'relationships.beloved':'+'}),
('Enjoy their admiration and decide nothing.', 'scene:67', {'standing':'+', 'relationships.beloved':'risk'}),
('Mock their world instead of trying to enter it.', 'scene:68', {'relationships.beloved':'-', 'flags.bitter':'set'}),
('Keep your place.', 'archetype', {'standing':'+', 'relationships.beloved':'-'})]),
dict(id='G11', name='Want nothing and nothing can hurt you',
predicament='After loss or hardship, you are tempted, or urged, to stop wanting anything at all so nothing can hurt you again.',
actor='person worn down by loss', wants='to stop hurting', counterpart='their own longing',
members=[72, 73, 78, 197, 226, 227],
options=[
('Train yourself to want nothing.', 'scene:73', {'patience':'+', 'relationships.family':'-', 'flags.hardened':'set'}),
('Take one day of happiness at any price.', 'scene:78', {'money':'risk', 'relationships.family':'+'}),
('Give up the prize you were chasing.', 'scene:197', {'money':'-', 'standing':'+'}),
('Make your peace with your lot.', 'scene:227', {'patience':'+'})]),
dict(id='G12', name='Racing to save someone who is slipping away',
predicament='Someone you love is failing, and you are spending everything you have to reach anyone who might save them.',
actor='person whose loved one is failing', wants='help in time', counterpart='whoever might save them',
members=[75, 77, 82, 110, 111, 112],
options=[
('Drive through anything to reach help.', 'scene:110', {'money':'-', 'relationships.family':'+'}),
('Spend whatever it takes on one more hope.', 'scene:82', {'money':'-', 'flags.desperate':'set'}),
('Grovel before whoever can help.', 'scene:112', {'standing':'-', 'relationships.helper':'+'}),
('Accept that it is beyond help.', 'archetype', {'patience':'+', 'relationships.family':'-'})]),
dict(id='G13', name='At odds with a parent over the life you chose',
predicament='You and a parent cannot accept how the other lives, and neither of you will give way.',
actor='grown child', wants='to live their own way', counterpart='a parent who disapproves',
members=[91, 98, 152, 153, 154, 171, 172],
options=[
('Speak up to them.', 'scene:98', {'relationships.parent':'-', 'flags.defied_parent':'set'}),
('Run off and do it anyway.', 'scene:153', {'standing':'-', 'relationships.parent':'-', 'flags.disowned':'set'}),
('Write home asking forgiveness, and help.', 'scene:154', {'money':'+', 'relationships.parent':'risk'}),
('Go home and try to reach them.', 'scene:171', {'tact':'+', 'relationships.parent':'risk'}),
('Do as you are told.', 'archetype', {'patience':'+', 'relationships.parent':'+'})]),
dict(id='G14', name='Frightened by something you cannot explain',
predicament='Something you cannot account for has frightened you, alone or far from help, and you must decide what to do.',
actor='frightened person', wants='to understand it, or get away', counterpart='something unexplained',
members=[33, 129, 178, 180, 182, 183, 184, 185, 186, 187, 188],
options=[
('Get away as fast as you can.', 'scene:184', {'standing':'-'}),
('Find someone and ask what it was.', 'scene:186', {'relationships.stranger':'+'}),
('Tell yourself it is nothing and carry on.', 'archetype', {'patience':'+', 'flags.faced_fear':'set'}),
('Stay close to someone who is not afraid.', 'scene:180', {'relationships.companion':'+'})]),
dict(id='G15', name='Far from home and your own people',
predicament='You are stuck far from home and the people you love, in a hard place that does not want you.',
actor='person far from home', wants='to be with their own people', counterpart='a hard, strange place',
members=[1, 71, 74, 80, 81, 179],
options=[
('Beg to be taken home.', 'scene:179', {'relationships.guardian':'-', 'relationships.family':'+'}),
('Ask your people to come to you.', 'scene:80', {'money':'-', 'relationships.family':'+'}),
('Keep writing home for help.', 'scene:74', {'money':'risk', 'relationships.family':'+'}),
('Settle in and make the best of it.', 'filled', {'patience':'+', 'money':'+'})]),
dict(id='G16', name='A stranger\'s death lands on you',
predicament='Someone you barely knew has died near you, and the aftermath has become your chore or your fright.',
actor='person drawn into the aftermath', wants='to be done with it', counterpart='a stranger\'s tragedy',
members=[118, 119, 120, 174, 175],
options=[
('Do what duty asks, and no more.', 'scene:174', {'patience':'+'}),
('Complain about the inconvenience.', 'scene:119', {'standing':'-', 'relationships.bereaved':'-'}),
('Get away somewhere comfortable until it is over.', 'scene:130', {'relationships.neighbours':'-'}),
('Stay with the frightened people who cannot leave.', 'filled', {'standing':'+', 'relationships.neighbours':'+'})]),
dict(id='G17', name='Covering up a disgrace',
predicament='Something shameful has come to light, or is about to, and you could still hide it from those who would judge you.',
actor='person with a disgrace to hide', wants='to keep their good name', counterpart='those who would judge them',
members=[155, 156, 157, 158, 159, 160, 176, 177, 198],
options=[
('Get rid of the evidence quietly.', 'scene:156', {'tact':'+', 'flags.secret_kept':'set'}),
('Pay to have it smoothed over.', 'scene:176', {'money':'-', 'standing':'+', 'flags.secret_kept':'set'}),
('Confess to those closest to you.', 'scene:159', {'standing':'-', 'relationships.spouse':'risk'}),
('Call it a joke and take it back.', 'scene:160', {'relationships.spouse':'-'})]),
]
# 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:'middle', 2:'low', 3:'middle', 4:'middle', 5:'high', 6:'low', 7:'middle',
8:'low', 9:'middle', 10:'high', 11:'middle', 12:'middle', 13:'low', 14:'middle',
15:'low', 16:'high', 17:'high', 18:'low', 19:'middle', 20:'low'}
# Story 3's narrator is a poor noble in a low post: ranked middle. Story 9 is told from the young
# official's side, not the old messenger's. Story 18's protagonist is the old gardener, not the buyers.