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

216 lines
18 KiB
Python

"""Hand-built reference grouping of the Lorimer predicaments (Claude-written, no inference of any kind).
Lorimer's *Letters from a Self-Made Merchant to His Son* is an advice book, not a story collection: each of
its twenty letters is a "story", and the scenes are stretches of a father's advice and the anecdotes he
tells to carry it. Each scene is in at most one group; scenes that fit no recurring situation stay
unassigned. Every group spans at least three of the 20 letters, and no letter supplies more than half a
group's members.
Options follow DESIGN.md: 3-5 per group, each marked by where it came from --
'archetype' a fixed, setting-free option
'scene:N' what someone in scene N actually did (or refused to do)
'advice:N' a move the book itself advises for or against in scene N (see batches/, `advice`)
'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: judgment (sizing up goods, prices, people and
claims: the father's "one-part talk and nine-parts judgment") and hustle (drive, application, doing the
second half of the work).
"""
G = [
# ---- money habits ---------------------------------------------------------------------------------
dict(id='G01', name='Spending ahead of what you earn',
predicament='You are spending more than you earn, often to keep up with free-spending company, and the bills are coming due.',
actor='young earner', wants='to live well now', counterpart='their own pay packet, and the company they keep',
members=[8, 10, 11, 25, 63, 64],
options=[
('Bring your spending down to what you actually earn.', 'advice:8', {'money':'+', 'relationships.peers':'-'}),
('Keep saving, and keep expenses down.', 'advice:10', {'money':'+', 'flags.buying_in':'set'}),
('Spend freely, so nobody thinks you mean.', 'advice:11', {'relationships.peers':'+', 'money':'-', 'standing':'-'}),
('Ask for an advance on your pay.', 'scene:13', {'money':'+', 'relationships.boss':'-'}),
('Spend it as fast as it comes.', 'advice:10', {'money':'-', 'relationships.peers':'+'})]),
dict(id='G02', name='Starting at the bottom',
predicament='You are starting at the bottom on low pay and dull work, and must decide whether it is a first step or a resting place.',
actor='new hand', wants='to rise', counterpart='the boss who put them there',
members=[9, 19, 20, 26, 33, 34, 35],
options=[
('Take the first job offered and use it as bait for a better one.', 'advice:26', {'money':'+', 'standing':'+'}),
('Find a way to do the work cheaper, even if it abolishes your job.', 'advice:20', {'judgment':'+', 'money':'+', 'relationships.boss':'+'}),
('Learn how little you can do and still keep the job.', 'scene:33', {'relationships.boss':'-', 'standing':'-'}),
('Hold your own job firmly and reach for the next one.', 'advice:33', {'hustle':'+', 'relationships.boss':'+'}),
('Come early, stay late and keep at it.', 'advice:35', {'hustle':'+', 'standing':'+'})]),
dict(id='G03', name='Doing just enough',
predicament='You could keep your place with half your effort, and must decide whether the other half is worth giving.',
actor='settled employee', wants='to keep the job without killing themselves', counterpart='the boss deciding who rises',
members=[40, 41, 44, 80, 81, 87, 119],
options=[
('Do just enough to keep from being dismissed.', 'advice:80', {'relationships.boss':'-', 'standing':'-'}),
('Put in the second half of the effort.', 'advice:80', {'hustle':'+', 'relationships.boss':'+'}),
('Learn more of the business than your job needs.', 'advice:81', {'judgment':'+', 'flags.promoted':'set'}),
('Come in late, leave early, and do your own business in between.', 'advice:44', {'money':'+', 'flags.passed_over':'set'}),
('Take on every extra job going, and cheerfully.', 'advice:87', {'hustle':'+', 'flags.promoted':'set'})]),
# ---- those above you ------------------------------------------------------------------------------
dict(id='G04', name='A hard boss',
predicament='Your superior is gruff, demanding and unimpressed with you, and you are tempted to complain, sulk or go over their head.',
actor='subordinate', wants='fair treatment and a chance', counterpart='a gruff superior',
members=[38, 45, 46, 88, 89],
options=[
('Say you cannot work under them.', 'advice:45', {'relationships.boss':'-', 'standing':'-'}),
('Give way to them, and approach them with respect.', 'advice:46', {'relationships.boss':'+'}),
('Go over their head and report what is wrong with them.', 'advice:46', {'relationships.boss':'-', 'relationships.owner':'risk'}),
('Take the criticism in wounded silence.', 'advice:88', {'relationships.boss':'-'}),
('Complain that you are being held down.', 'advice:89', {'relationships.boss':'-', 'standing':'-'})]),
dict(id='G05', name='Talking yourself up',
predicament='You are doing well, or want to seem to, and are tempted to make sure everyone knows it.',
actor='rising employee', wants='to be noticed', counterpart='superiors and colleagues',
members=[50, 90, 91, 138, 139, 140],
options=[
('Tell your superiors how well you are doing.', 'advice:138', {'relationships.boss':'-'}),
('Say nothing, and let the results speak.', 'advice:140', {'standing':'+', 'hustle':'+'}),
('Put on airs around the office.', 'advice:50', {'standing':'-', 'relationships.peers':'-'}),
('Rise on talk and show while it works.', 'advice:139', {'standing':'risk'}),
('Give more than you are paid for.', 'advice:138', {'hustle':'+', 'standing':'+'})]),
dict(id='G06', name='Saying too much',
predicament='You are tempted to say more than you need to: a joke, a retort, an opinion, or a complaint about someone.',
actor='talker', wants='to be heard', counterpart='whoever is listening',
members=[32, 47, 49, 71, 72],
options=[
('Say what you came to say, and stop.', 'advice:32', {'judgment':'+', 'money':'+'}),
('Listen more than you talk.', 'advice:33', {'judgment':'+', 'relationships.counterpart':'+'}),
('Crack the joke.', 'advice:72', {'standing':'-', 'relationships.counterpart':'+'}),
('Run down the people you used to work for.', 'advice:49', {'relationships.boss':'-', 'flags.not_hired':'set'}),
('Answer back with a smart retort.', 'advice:71', {'relationships.counterpart':'-', 'money':'-'})]),
# ---- customers and the trade ----------------------------------------------------------------------
dict(id='G07', name='A customer tries you',
predicament='A customer complains, needles you or sets a trap, and how you answer decides whether you keep their trade.',
actor='seller', wants='to keep the trade', counterpart='a difficult customer',
members=[74, 75, 82, 93],
options=[
('Settle a fair complaint on the spot, bargaining down from the first figure.', 'advice:75', {'money':'-', 'relationships.customer':'+'}),
('Know your goods well enough to turn their trap round.', 'advice:82', {'judgment':'+', 'money':'+', 'standing':'+'}),
('Say something about them that they will take as praise.', 'advice:93', {'judgment':'+', 'relationships.customer':'+', 'money':'+'}),
('Flatter them.', 'advice:74', {'relationships.customer':'+', 'standing':'-'}),
('Tell them to their face that they are a liar.', 'advice:93', {'relationships.customer':'-', 'flags.fought':'set'})]),
dict(id='G08', name='Goods nobody wants',
predicament='You have goods to sell and buyers who feel no need of them.',
actor='seller', wants='to move the goods', counterpart='buyers who are not hungry',
members=[51, 52, 77, 95, 98, 99],
options=[
('Give them a grander label and a higher price.', 'advice:52', {'money':'+', 'judgment':'+'}),
('Tell the buyers plainly that they need it.', 'scene:77', {'relationships.customer':'-'}),
('Stage a show that makes the need feel real.', 'advice:98', {'money':'+', 'flags.sharp_practice':'set'}),
('Dress the same goods up as something new.', 'advice:51', {'money':'-'}),
('Take them where the money already is.', 'advice:78', {'money':'+', 'hustle':'+'})]),
dict(id='G09', name='Easy money',
predicament='Someone offers, or the market seems to offer, money for nothing, and you have a little you could stake.',
actor='person of small means', wants='to get rich quicker', counterpart='a schemer, a tipster, or the market',
members=[30, 36, 37, 109, 111, 117],
options=[
('Stay clear: take the elevator to the roof garden.', 'advice:36', {'judgment':'+', 'relationships.schemer':'-'}),
('Take a little flyer on it.', 'scene:108', {'money':'risk', 'relationships.boss':'-', 'flags.speculated':'set'}),
('Lend them a little rather than join in.', 'advice:37', {'money':'-', 'relationships.schemer':'+'}),
('Ask why the return is so high before you trust it.', 'advice:111', {'judgment':'+'}),
('Talk yourself into it, principles and all.', 'scene:117', {'money':'risk', 'standing':'-'})]),
dict(id='G17', name='Rivals are taking the trade',
predicament='Rivals are getting the better of you in the trade, and you must decide whether to explain it, shrug it off or go after them.',
actor='seller or manager', wants='the business', counterpart='rival firms',
members=[76, 78, 127, 148],
options=[
('Send in a full account of what the competition is doing.', 'advice:78', {'relationships.boss':'-', 'flags.resigned':'set'}),
('Go for all of the trade, not a share of it.', 'advice:128', {'hustle':'+', 'money':'+', 'relationships.rival':'-'}),
('Take up the line you left to them.', 'advice:127', {'money':'+', 'hustle':'+'}),
('Stand and fight: you never sold what you could not deliver.', 'advice:148', {'standing':'+', 'relationships.rival':'-'}),
('Go where the money already is.', 'advice:78', {'money':'+', 'judgment':'+'})]),
# ---- judging people -------------------------------------------------------------------------------
dict(id='G10', name='Taking someone on',
predicament='You are about to hire or trust someone on the strength of how they look, how they talk, or who vouches for them.',
actor='employer', wants='a good hand', counterpart='the candidate and whoever vouches for them',
members=[48, 53, 56, 59, 105, 106, 107],
options=[
('Take them on the word of whoever vouches for them.', 'scene:53', {'relationships.friend':'+', 'money':'risk'}),
('Try them out in the work before committing.', 'advice:105', {'judgment':'+'}),
("Get an outsider's valuation, in figures.", 'advice:56', {'judgment':'+', 'relationships.friend':'-'}),
('Trust the one with the polished manners.', 'advice:107', {'relationships.hire':'+', 'money':'risk'}),
('Be on your guard against anyone too smooth.', 'advice:48', {'judgment':'+', 'relationships.hire':'-'})]),
dict(id='G11', name='Looking the part',
predicament='You want to be taken for more than you yet are, and must decide how much to spend on looking the part.',
actor='person on the way up', wants='to be taken seriously', counterpart='the people who judge by appearances',
members=[31, 100, 101, 102, 104, 134, 135, 144],
options=[
('Get a sober, well-made suit and look the part.', 'scene:100', {'money':'-', 'standing':'+'}),
('Look like someone of consequence before you are one.', 'advice:104', {'standing':'+', 'money':'-'}),
('Build your name on your work, not on borrowed rank.', 'advice:31', {'standing':'+', 'hustle':'+'}),
('Throw a lavish show to win acceptance.', 'advice:135', {'money':'-', 'standing':'-', 'flags.public_scandal':'set'}),
('Keep up appearances beyond your means.', 'advice:144', {'money':'-', 'standing':'risk'})]),
# ---- in charge ------------------------------------------------------------------------------------
dict(id='G12', name='Someone under you falls short',
predicament='Someone under you is slack, wrong for the post, or in a bad habit, and it falls to you to act.',
actor='manager', wants='the work done well', counterpart='a subordinate falling short',
members=[28, 43, 103, 121, 122],
options=[
("Let a wrong hire go at once, with a month's pay.", 'advice:122', {'money':'-', 'relationships.staff':'+'}),
('Put it off a little longer.', 'advice:28', {'money':'-', 'flags.lost_good_hand':'set'}),
('Set the example yourself, starting with your own habits.', 'advice:103', {'hustle':'+', 'relationships.staff':'+'}),
('Tell them bluntly what is wrong with them.', 'advice:121', {'relationships.staff':'-'}),
('Threaten them.', 'advice:122', {'relationships.staff':'-', 'standing':'risk'})]),
dict(id='G13', name='Caught between two sides',
predicament='You stand between two sides who each want your loyalty, and favouring either openly will cost you with the other.',
actor='go-between', wants='to keep both sides', counterpart='those above and those below, or the firm and the customer',
members=[92, 94, 128, 129, 149],
options=[
('Try openly to please both sides.', 'advice:92', {'relationships.boss':'-', 'relationships.other_side':'-'}),
('Keep them apart, and let each think they have slightly the better of it.', 'advice:92', {'judgment':'+', 'relationships.boss':'+', 'relationships.other_side':'+'}),
('Please your own side and let the other grumble.', 'advice:149', {'relationships.boss':'+', 'relationships.other_side':'-'}),
('Cut a corner on one side to keep the other sweet.', 'advice:94', {'relationships.boss':'+', 'relationships.other_side':'-', 'flags.skinned_someone':'set'}),
('Explain yourself to both.', 'advice:128', {'relationships.other_side':'+', 'standing':'-'})]),
# ---- private life ---------------------------------------------------------------------------------
dict(id='G14', name='Sizing up a match',
predicament='You are drifting toward marrying someone and have not yet taken a clear look at them, their family, or what it will cost.',
actor='suitor', wants='to marry well', counterpart='the person they are courting, and that person\'s family',
members=[65, 70, 158, 159, 172, 173],
options=[
('Size them up before you are engaged, at breakfast as well as at the theatre.', 'advice:172', {'judgment':'+', 'relationships.partner':'risk'}),
('Marry someone raised above the means you can give them.', 'advice:65', {'relationships.partner':'+', 'money':'-'}),
('Tell them exactly what you earn.', 'advice:63', {'relationships.partner':'risk', 'judgment':'+'}),
('Marry a sensible partner, even on modest pay.', 'advice:158', {'relationships.partner':'+', 'money':'-'}),
('Propose first and find out later.', 'advice:172', {'relationships.partner':'+', 'flags.married_in_haste':'set'})]),
dict(id='G15', name='The wrong line of work',
predicament='You are in, or headed for, work that does not suit you, and must decide whether to push on, switch, or wait for something better.',
actor='misfit', wants='work that suits them', counterpart='a parent or an employer with other plans',
members=[5, 6, 7, 18, 57, 58, 62, 141],
options=[
('Try the work you are set on, whatever your family says.', 'advice:57', {'relationships.family':'-', 'money':'risk'}),
('Leave the family trade for one that suits your gifts.', 'advice:62', {'money':'+', 'relationships.family':'-'}),
('Hold out for work worthy of your old position.', 'advice:141', {'money':'-', 'standing':'-'}),
('Take whatever work is going, however heavy.', 'scene:19', {'money':'+', 'hustle':'+', 'standing':'-'}),
('Tell your new superior how it ought to be done.', 'advice:6', {'relationships.boss':'-', 'flags.dismissed':'set'})]),
dict(id='G16', name='The fast set',
predicament='The people around you are spending their time and money on amusement, and you must decide how far to go along.',
actor='young person', wants='to belong', counterpart='free-spending companions',
members=[3, 14, 15, 130, 131, 137],
options=[
('Do as everyone else does.', 'advice:14', {'relationships.peers':'+', 'money':'-', 'standing':'-'}),
('Keep away, even if it leaves you on your own.', 'advice:15', {'relationships.peers':'-', 'judgment':'+'}),
('Go slow, and pick your amusements.', 'advice:3', {'judgment':'+'}),
('Take working afternoons off to play.', 'advice:130', {'relationships.peers':'+', 'relationships.boss':'-'}),
('Cultivate the fashionable set.', 'advice:131', {'relationships.peers':'+', 'money':'-', 'standing':'risk'})]),
dict(id='G18', name='Your mistake has come to light',
predicament='A mistake of yours has come to light, and you can own up, joke it off, cover it, or let it pass.',
actor='person at fault', wants='to come out of it well', counterpart='the one who found out',
members=[29, 39, 108, 146, 147],
options=[
('Own up at once.', 'advice:93', {'standing':'-', 'relationships.boss':'+'}),
('Make a joke of it.', 'scene:39', {'relationships.boss':'-'}),
('Keep quiet and hope it passes.', 'advice:93', {'relationships.boss':'risk', 'flags.covered_up':'set'}),
('Take the public humbling.', 'advice:147', {'standing':'-', 'judgment':'+'}),
('Make sure it never happens twice.', 'advice:29', {'judgment':'+'})]),
]
# The son's standing by letter, for stage assignment (DESIGN.md "Stages"). Per letter, not per scene. The
# son is the protagonist even where a scene is an anecdote about someone else, so this stages the letter,
# not the anecdote. Letters 1-5 (0-4): a student, then a graduate about to start. Letters 6-9 (5-8): the
# mailing desk, then the billing desk. Letters 10-14 (9-13): a travelling salesman, raised to thirty a week
# in letter 13. Letters 15-20 (14-19): assistant manager of a department at fifty a week. "high" is only the
# top of this book's ladder, a junior manager, not the owner's chair.
STANDING = {0:'low', 1:'low', 2:'low', 3:'low', 4:'low', 5:'low', 6:'low', 7:'low', 8:'low',
9:'middle', 10:'middle', 11:'middle', 12:'middle', 13:'middle',
14:'high', 15:'high', 16:'high', 17:'high', 18:'high', 19:'high'}