Replace clustering with a catalogue, and hand-write the references to judge it against

The pipeline's embed-and-cluster step is dead, and this commit holds both the
evidence for that and the step proposed to replace it.

Predicaments. Scenes are re-described as "what the person is up against", with
no names, jobs or places, then embedded and clustered (redescribe.py,
topic_words.py, topic_share.py). The pilot chose qwen3:14b over 3b by reading
both side by side. Two defects the pilot exposed are fixed: split.py missed
titles in quotes and a contents subtitle after a dash, so three stories had been
merged into their neighbours, and strip_names.py read New York place names as
people. The corrected corpus is probe/v2 (97 stories, 839 scenes);
carry_summaries.py reuses the 829 unchanged v1 summaries. Topic share fell from
20% to 13% at k=60, short of the pre-registered 10%.

Hand references. Three corpora were read scene by scene and written up by hand,
under the same prompt rules the local models get, as a baseline to judge them
against: O. Henry (probe/v2/claude, 839 scenes, 20 situations), Wharton's
Descent of Man (probe/wharton, 262 scenes, 16 groups) and Jacobs's The Lady of
the Barge (probe/jacobs, 157 scenes, 19 groups). Each has its own README and a
readable page. No inference was used for any of them.

Catalogue. probe/catalogue maps every hand group in the three references onto 36
situation entries, with an answer key per corpus and one recurrence rule applied
to all three. classify.py assigns a scene one entry or none, leave-one-corpus-
out; score.py checks it against the key, with a self-test on random labels.

Why clustering is out: hand-written predicaments, embedded and clustered exactly
as the model's were, agree with the hand grouping at ARI 0.05 — no better than
the 14B text's 0.07. Better rewriting cannot rescue it. Embeddings cannot even
shortlist: the hand label is the nearest entry 13% of the time and in the top 8
half the time.

The classification runs are not here. The dev and test runs are pre-registered
in probe/catalogue/README.md with the bar set beforehand, and are blocked on the
inference host, whose GPU has fallen off the PCIe bus three times. The 30-scene
partial output in out/ is not a result.

Review page. The situation review is now a browser page rather than JSON edited
by hand (review_page.py, review_page_logic.cjs with Node tests, format schema
v2). It has never been rendered in a real browser.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014BygvsUXV9eU6oHkTCkKZ1
This commit is contained in:
JesseMarkowitz
2026-09-20 17:19:42 -04:00
co-authored by Claude Opus 5
parent fa3769d0fe
commit e5617b86ba
135 changed files with 82027 additions and 1778 deletions
+46 -23
View File
@@ -12,28 +12,42 @@ versioned alongside the pack format it targets, without touching `main`.
## Status
Selection is settled as **gate G2 followed by a structured human review** (see below). Every automated
Selection was settled as **gate G2 followed by a structured human review** (see below). Every automated
alternative tried — three more geometric gates and two model-judged gates — was worse on fresh,
blind-labelled data. Nothing downstream of selection (paths and directions, numbers, pack output) is
built yet.
blind-labelled data. The first real review then found G2's groups were **topics** (artists, police,
hotels), not situations. **Now under test:** re-describe every scene as its main person's
**predicament** with qwen3:14b, regroup, and read the groups (SELECTION.md, "Predicaments"). Nothing
downstream of selection (paths and directions, numbers, pack output) is built yet.
## Layout
`probe/` holds the v1 data every G1–G4 result was measured on. `probe/v2/` is the corrected corpus
(97 stories, 839 scenes: v1's splitter merged three quoted-title stories into their neighbours), built by
running the same scripts from inside `v2/` (`python3 ../split.py`, and so on).
```
probe/
corpus/ O. Henry's Four Million cycle, Project Gutenberg (public domain)
split.py, chunk.py volumes -> stories.json -> chunks.json (838 scenes)
split.py, chunk.py volumes -> stories.json -> chunks.json (838 scenes in v1, 839 in v2)
carry_summaries.py v1 summaries onto v2 scenes; only new scene text goes to the model
redescribe.py scene -> its main person's predicament, via the model -> predicaments.json
topic_words.py, topic_share.py how much groups are held together by a job, relationship or place word
pilot_page.py side-by-side page for the 3B / 14B predicament pilot -> pilot-compare.html
groups_page.py reading page for regrouped predicaments -> v2/groups-*.html
ollama.py the only module that talks to an inference host (host from STP_OLLAMA)
summarise.py scene -> one sentence, via the model -> summaries.json
strip_names.py names removed deterministically -> summaries_clean.json
embed.py texts -> vectors -> embeddings.json, summary_embeddings.json
measure.py, signals.py, gate2.py, gate3.py, judge.py … the selection experiments
labels-*.json, sheet-*.txt, candidates-*.json, *-map.json blind labels and what they labelled
review.py G2 on a partition -> a review package for a human
review_format.py the review form: schema, checks, conversion
apply_review.py filled review.json -> situations.json
test_review.py tests for the review form
review/<run>/ review packages: REVIEW.md, review.json, candidates.json, situations.json
review.py G2 on a partition -> REVIEW.html and candidates.json
review_page.py renders the page; picks out role words for each group
review_page.html the page template
review_page_logic.cjs the rules the page applies (also run by the Node tests)
review_format.py the saved review's format, checks and conversion
apply_review.py saved review -> situations.json
test_review.py, test_review_page.mjs tests
review/<run>/ REVIEW.html, candidates.json, and situations.json once applied
```
Not committed (see `.gitignore`): the inference host's power and kernel logs, and caches that the
@@ -52,29 +66,38 @@ export STP_OLLAMA=http://<inference-host>:11434
## Reviewing situations
The review happens in a web page. Nobody edits JSON.
```sh
cd probe
python3 review.py # k = 60, seed 24 -> review/k60-s24/
python3 review.py # k = 60, seed 24 -> review/k60-s24/REVIEW.html
```
That writes three files into the run directory:
- **`REVIEW.md`** — what the program found, and exactly what the reviewer is asked to decide for
each candidate, with every scene listed. Read this.
- **`review.json`** — the form. The only file the reviewer edits.
- **`candidates.json`** — what the program found, for the checker. Do not edit.
When the form is filled in:
1. **Open `review/k60-s24/REVIEW.html` in a browser** (double-click it; nothing to install). The first
screen explains the job with examples.
2. **One group per screen.** For each: keep it, drop it, or mark it the same as a group already kept;
untick scenes that don't fit; and fill in "A ___ wants ___ from ___", with the people named in its
scenes offered as click-to-fill words. The page shows as you go whether a group still has enough
scenes, and colours each group in the strip across the top. Keys: K keep, D drop, ← →.
3. **Progress saves in the browser** after every change, so you can close it and come back.
4. **"Finish & save"** lists anything unfinished and saves `review-k60-s24.json`, usually to Downloads.
5. **Then:**
```sh
python3 apply_review.py review/k60-s24
```
It reports every problem at once and writes nothing until the form is complete and consistent; then
it writes **`situations.json`**, the machine-readable input for the next stage: each situation's
wording, roles and stakes, the scenes that show it (with story and summary), and which candidates it
came from.
It finds the saved review in Downloads by itself, checks everything again, and names any problem the
way the page does ("Group 4: kept, but its name is not finished"). Nothing is written until the
review passes; then it writes **`situations.json`**: each situation's sentence and roles, the scenes
that show it with their stories, and which groups it came from.
`candidates.json` in the run directory is the program's record for the checker; leave it alone.
```sh
python3 -m unittest test_review # the review form's checks
python3 -m unittest test_review # the saved review's checks, the page renderer, apply_review.py
node --test test_review_page.mjs # the rules the page applies as you review
```
The page's drawing code is only checked for syntax and for starting up; how it looks and behaves in a
real browser has to be tried by a person.
+151 -4
View File
@@ -1,10 +1,18 @@
# story-to-pack — selecting situations
> **Decision (2026-09-15): selection is gate G2 followed by a structured human review.** `probe/review.py`
> writes a review package (`REVIEW.md`, `review.json`, `candidates.json`); the reviewer fills in
> `review.json`; `probe/apply_review.py` checks it and writes `situations.json` for the next stage. See
> the README. The record below is how that decision was reached: four gate designs and two
> model-judged gates, each tested against blind labels.
> writes `REVIEW.html`, a page where the reviewer keeps, drops or merges each group, unticks scenes and
> names the situation; the page saves a review file, and `probe/apply_review.py` checks it and writes
> `situations.json` for the next stage. See the README.
>
> The first version asked the reviewer to read a long Markdown file and edit JSON by hand. The first
> real attempt stopped before a single entry: what to decide was unclear, there was too much to read at
> once, hand-edited JSON broke easily, and the wording was hard to write. The page answers each of those.
> The record below is how the G2 decision was reached: four gate designs and two model-judged gates,
> each tested against blind labels.
>
> **Superseded in part (2026-09-15), see "Predicaments" at the end:** reading the page, the reviewer
> found the groups were topics, not situations.
The step after clustering: from the clusters of summarised scenes, choose the ones that are genuine
**recurring situations** — the raw material of a recurring event — and reject the rest. Companion to
@@ -742,3 +750,142 @@ terms of roles and a concrete want** and rejects answers without both; scoring t
the named situation (for example, requiring the named situation to be closer to the member summaries
than to the corpus average in embedding space); and G2 AND G4 evaluated as a pre-registered gate on a
fresh partition, since every labelled cluster now informs this observation.
---
## Predicaments (recorded 2026-09-15, before any model call)
### What the first real review found
The designer opened `REVIEW.html` for run k60-s24 and read four groups closely:
- **Group 1 is artists.** It holds at least three different situations: an artist in a new place using
the art to get on, being paid for the work against what the work is worth, and plain money trouble.
- **Group 2 is police and court officers.** Inside it: being coerced, with the police watching or
arriving; and a crime that is stopped or found out.
- **Group 6 is flirting and infatuation.**
- **Extra group 1 is room and board**: hotels, dinners and the like.
None of these is "one person wanting something specific from another". Checked across all 20 groups,
most are held together by who is in the scenes or where they happen: *artist* in 44% of group 1's
scenes, *policeman* in 54% of group 3's, *uncle* and *lawyer* in group 4, *marriage* and *wedding* in
group 8, *restaurant* and *customers* in group 12, *hotel* in 41% of extra group 1.
**Why every earlier test missed it.** A topic group is as cohesive and as spread across stories as a
situation group, so cohesion, story spread, word dominance and the model's own judgement all passed it.
Summaries keep jobs and places, and the embeddings group on them. It took a person reading the groups.
### Decisions (designer, 2026-09-15)
1. **The unit is a predicament**, not a two-person transaction: what the main person is up against and
what they want out of it, as The Ladder's existing events are (the rent bouncing, the mail cart).
The sub-themes the designer found inside groups 1 and 2 are this kind of thing.
2. **Re-describe every scene as a predicament, then regroup**, rather than splitting topic groups by hand.
### Method, fixed before any call
- `probe/redescribe.py` gives the model each scene's own prose (not its summary) and the prompt in that
script: one sentence, at most 20 words, no names, jobs, places, businesses or story-specific objects,
saying what the person is up against and what they want. No example of the output vocabulary.
- Names are then removed deterministically (`strip_names.py`), the sentences embedded (`embed.py`), and
the embeddings clustered at k = 60.
- **Pilot first:** the first 40 scenes, with both `qwen2.5:3b-instruct` and `qwen3:14b`, read by the
designer side by side before any full run. The full run uses the model the designer prefers.
### How it is judged
- **Topic share** (`probe/topic_share.py`): for each candidate group, the share of its scenes whose
original summary contains the group's most common job, relationship or place word; median over groups
and seeds 11–13 at k = 60. The baseline on the summary embeddings is measured before any call and
recorded below. **Pass: the median falls to half the baseline or less**, with at least 30 candidate
groups remaining at k = 60 (enough material for a two-stage pack).
- **Leakage:** how many predicament sentences still contain a job, relationship or place word. Reported,
not gated.
- **The real test is the designer reading the regrouped top groups** in the review page: most should
read as one predicament. Numbers alone passed topic groups before.
### Baseline (measured 2026-09-15, before any model call)
A first measurement counted words for a person with no role at all ("man", "woman", "girl"), and scored
one group 90% topic-bound for saying "man". Those words (`GENERIC_PEOPLE` in `probe/topic_words.py`)
were taken out of the measure, and the baseline re-measured, still before any predicament was generated.
`python3 topic_share.py summary_embeddings.json` (`probe/topic-share-baseline.log`):
| Seed | Candidate groups | Median top topic-word share |
| --- | --- | --- |
| 11 | 40 | 16% |
| 12 | 41 | 20% |
| 13 | 42 | 22% |
| **Median** | **41** | **20%** |
Most topic-bound at seed 11: *wife* 47% of 15, *dinner* 47% of 15, *policeman* 40% of 15 and 38% of 16,
*brother* 38% of 8, *artist* 36% of 11. **Pass mark for the predicament groups: median 10% or less, with
at least 30 candidate groups.**
### Pilot (2026-09-15)
First 40 scenes, one request at a time on the GPU host (3B 39 s, 14B 111 s; no GPU faults; logs in
`probe/gpu-logs/*-2026-09-15-1803*`). Read side by side in `probe/pilot-compare.html` (`pilot_page.py`).
| | qwen2.5:3b-instruct | qwen3:14b |
| --- | --- | --- |
| Has a job, relationship or place word | 15 of 40 | 13 of 40 (mostly *wife*, *husband*) |
| Mean words (limit 20) | 14 | 25; 34 of 40 over |
| Most common opening | "The Kid seeks…" ×3 | "A man struggles…" ×6 |
3B mostly retells the plot, keeping names, objects and places. 14B writes something close to a
predicament but ignores the length limit and repeats a few openings. **Designer's read: scenes 1–10,
14B dramatically better in every one; stopped there. The full run uses qwen3:14b.**
Found while reading: `split.py` skips a title written in quotation marks, so three stories were
merged into the story before them. "Little Speck in Garnered Fruit" is inside "Dougherty's
Eye-Opener", "The Guilty Party" inside "A Harlem Tragedy", and "What You Want" inside "The Duel". The
corpus has 97 stories, not 94. Separately, `strip_names.py` treats *York*, *Manhattan* and *Broadway*
as personal names, which gives "New someone" in 29 of 838 summaries.
### Corrections before the full run (2026-09-15, designer's go-ahead)
The v1 data and every G1–G4 record stay as they were, in `probe/`. The corrected corpus is built in
`probe/v2/`, running the same scripts from that directory.
- **Split.** `split.py` accepts a quoted title and matches a contents entry by the part before a dash
(“THE GUILTY PARTY”—AN EAST SIDE TRAGEDY). Result: **97 stories, 839 scenes**. Exactly the three
missing stories were added, nothing was lost, and only their three host stories changed.
- **Summaries carried over.** 829 of the 839 scenes have text identical to a v1 scene and keep that
v1 summary verbatim (`carry_summaries.py`). The other 10 are summarised with the v1 model and prompt.
- **Name stripper.** New York places (New York, Manhattan, Broadway, Harlem, the Bowery, and a few
others) become "the city" before names are looked for, and days and holidays are never names. Months
stay ambiguous ("May" is a person in scene 5) and are left alone.
- **The baseline is re-measured on v2** (the v2 summaries, re-embedded), because both fixes change
what is embedded. It is recorded below before any predicament is read.
- **No trimming to 20 words.** Tried on the 14B pilot: cutting at the last clause break within 20
words removed what the person is up against in most cut sentences ("…with a promise of future money"
without "but his dishonesty sparks a violent confrontation"), and 10 of 40 had no clean break.
The full 14B sentence is embedded.
### Result (2026-09-15)
Full run: 839 scenes re-described by `qwen3:14b`, one request at a time, 37 minutes on the GPU host
(peak 270 W, mean 136 W, 65 °C, no faults; logs in `probe/gpu-logs/*-2026-09-15-1831*`). Sentences
average 25 words. 219 of 839 still contain a job, relationship or place word, most often a relationship
(*wife*, *husband*) — reported, not gated.
`topic_share.py`, k = 60, seeds 11–13, both measured on the v2 corpus:
| | Candidate groups | Median top topic-word share |
| --- | --- | --- |
| v2 summaries (baseline, `topic-share-baseline-v2.log`) | 45 | **20%** |
| Predicaments (`topic-share-predicaments.log`) | 42 | **13%** |
**The pre-registered pass mark is not met.** It asked for half the baseline or less (10%); the measure
fell by about a third, from 20% to 13%. The group-count mark is met (42 ≥ 30). The most topic-bound
groups are also much weaker than the baseline's: the worst predicament group is *room* at 40% of 5
scenes, against the baseline's *bride* at 62% of 8 and *policeman* at 60% of 20.
Not a pass and not a wash, so the decision goes to the reading test that this whole step exists for:
`groups_page.py` builds `v2/groups-predicaments-k60-s24.html`, which lists each group's predicament
sentences with each scene's original summary beneath, most cohesive group first, and asks the designer
to mark each group **one predicament**, **two or three mixed**, or **not a predicament**. The openings
repeat ("A man must" 45 times, "A man struggles" 37), so the risk to watch for is a group held together
by that phrasing rather than by a predicament.
+45 -20
View File
@@ -1,50 +1,75 @@
"""Check a filled-in review form and turn it into situations.json.
"""Check a saved review and turn it into situations.json.
python3 apply_review.py review/k60-s24
python3 apply_review.py review/k60-s24 # finds the saved review itself
python3 apply_review.py review/k60-s24 ~/Downloads/review-k60-s24.json
Reads candidates.json and review.json from that directory. If the form is complete and consistent, it
writes situations.json there and exits 0. Otherwise it prints every problem at once, writes nothing,
and exits 1.
Without a file named, it uses the newest review-<run>*.json in the run directory, and
otherwise the newest one in ~/Downloads, where a browser saves it. It prints every problem
at once and writes nothing until the review passes; then it writes situations.json into the
run directory.
"""
import datetime, json, pathlib, sys
import datetime, json, os, pathlib, sys
import review_format as rf
def downloads_dir():
return pathlib.Path(os.environ.get('STP_DOWNLOADS', pathlib.Path.home() / 'Downloads'))
def find_review(run_dir, run_id):
for folder in (run_dir, downloads_dir()):
if folder.is_dir():
found = sorted(folder.glob(f'review-{run_id}*.json'), key=lambda p: p.stat().st_mtime, reverse=True)
if found:
return found[0]
return None
def main(argv):
if len(argv) != 2:
if len(argv) not in (2, 3):
print(__doc__.strip())
return 2
run_dir = pathlib.Path(argv[1])
cand_path, form_path = run_dir / 'candidates.json', run_dir / 'review.json'
for p in (cand_path, form_path):
if not p.exists():
print(f'{p} does not exist. Run review.py first, or check the directory name.')
cand_path = run_dir / 'candidates.json'
if not cand_path.exists():
print(f'{run_dir} has no candidates.json. Check the folder name, or run review.py first.')
return 1
candidates = json.loads(cand_path.read_text(encoding='utf-8'))
run_id = candidates['run']['id']
review_path = pathlib.Path(argv[2]).expanduser() if len(argv) == 3 else find_review(run_dir, run_id)
if review_path is None or not review_path.exists():
print(f'No saved review found for run {run_id}.')
print(f'Open {run_dir / "REVIEW.html"} in a browser, and at the end press "Save review file".')
print(f'It saves review-{run_id}.json into Downloads, where this looks for it.')
return 1
print(f'reading {review_path}')
try:
form = json.loads(form_path.read_text(encoding='utf-8'))
except json.JSONDecodeError as e:
print(f'{form_path} is not valid JSON: line {e.lineno}, column {e.colno}: {e.msg}.')
print('Common causes: a missing comma between fields, a trailing comma before } or ], or a quote left open.')
form = json.loads(review_path.read_text(encoding='utf-8'))
except json.JSONDecodeError:
print('That file is damaged and cannot be read. Save the review again from REVIEW.html; '
'your progress is still in the browser.')
return 1
errors, warnings, result = rf.validate(candidates, form)
for w in warnings:
print(f'warning: {w}')
print(f'note: {w}')
if errors:
print(f'\n{len(errors)} problem(s) to fix in {form_path}; nothing was written:')
print(f'\nThe review is not finished. {len(errors)} thing(s) to sort out in REVIEW.html, '
f'then save the review file again:')
for e in errors:
print(f' - {e}')
return 1
result['applied'] = datetime.datetime.now().astimezone().isoformat(timespec='seconds')
result['review_file'] = str(review_path)
out = run_dir / 'situations.json'
out.write_text(json.dumps(result, indent=1, ensure_ascii=False), encoding='utf-8')
c = result['counts']
print(f'\n{out}: {c["situations"]} situations from {c["accepted"]} accepted and {c["merged"]} merged '
f'candidates; {c["rejected"]} rejected, {c["skipped"]} skipped.')
print(f'\n{out}: {c["situations"]} situations ({c["kept"]} kept, {c["same"]} merged in, '
f'{c["dropped"]} dropped, {c["left_out"]} extras left out).')
for s in result['situations']:
print(f' {s["id"]} ({s["size"]} scenes, {s["stories"]} stories, from {"+".join(s["from"])}): {s["situation"]}')
print(f' {s["id"]} {s["situation"]} ({s["size"]} scenes, {s["stories"]} stories)')
return 0
@@ -0,0 +1,42 @@
"""Carry v1 scene summaries over to a re-split corpus, summarising only scenes whose text is new.
cd v2 && STP_OLLAMA=http://host:11434 python3 ../carry_summaries.py ../summaries.json summaries.json
The v1 split merged three quoted-title stories into their neighbours (SELECTION.md, "Pilot"). Re-splitting
renumbers every later scene but leaves almost every scene's text identical, so a scene whose text matches
a v1 scene keeps its v1 summary verbatim, and only the rest go to the model, with summarise.py's model
and prompt. Output has summarise.py's layout, in the new scene order, with 'carried' marking which is which.
"""
import json, pathlib, re, sys, time
import ollama
src, dst = pathlib.Path(sys.argv[1]), pathlib.Path(sys.argv[2])
old = json.loads(src.read_text(encoding='utf-8'))
old_chunks = json.loads((src.parent / 'chunks.json').read_text(encoding='utf-8'))
chunks = json.loads(pathlib.Path('chunks.json').read_text(encoding='utf-8'))
# summarise.py runs on import, so its prompt is read from the file; it must be the one v1 was made with.
code = (pathlib.Path(__file__).parent / 'summarise.py').read_text(encoding='utf-8')
SYSTEM = re.search(r'SYSTEM = """(.*?)"""', code, re.S).group(1)
END = re.compile(r'(?<!\bMr)(?<!\bMrs)(?<!\bMs)(?<!\bDr)(?<!\bSt)(?<!\bNo)[.!?](?:\s|$)')
if SYSTEM != old['prompt']:
sys.exit('summarise.py prompt differs from the one v1 summaries were made with')
by_text = {old_chunks[x['chunk']]['text']: x for x in old['summaries']}
out, fresh, t0 = [], 0, time.time()
for i, c in enumerate(chunks):
prev = by_text.get(c['text'])
if prev:
out.append({'chunk': i, 'story': c['story'], 'summary': prev['summary'],
'model_output': prev['model_output'], 'carried': prev['chunk']})
continue
text, _, _ = ollama.chat(old['model'], SYSTEM, c['text'])
t = re.sub(r'\s+', ' ', text).strip().strip('"')
m = END.search(t)
out.append({'chunk': i, 'story': c['story'], 'summary': t[:m.end()].strip() if m else t,
'model_output': text, 'carried': None})
fresh += 1
print(f' new scene {i} ({c["title"]}): {out[-1]["summary"]}', flush=True)
dst.write_text(json.dumps({'model': old['model'], 'prompt': SYSTEM, 'summaries': out}, indent=1), encoding='utf-8')
print(f'{len(out)} summaries: {len(out) - fresh} carried from {src}, {fresh} new, {time.time() - t0:.0f}s')
@@ -0,0 +1,108 @@
# Situation catalogue: classify, don't cluster
Built 2026-09-17 from the three hand references: O. Henry (`../v2/claude/`), Wharton (`../wharton/claude/`)
and Jacobs (`../jacobs/claude/`). This is the step that replaces embed-and-cluster in the proposed pipeline:
a model assigns each scene's predicament one catalogue entry, or `none`.
## Files
| File | What |
| --- | --- |
| `catalogue_src.py` | The 36 entries (definition, includes, excludes, tone, recurs) and `SOURCES`, which maps every hand group in the three references to exactly one entry. Running it checks the mapping and writes the rest. No inference. |
| `catalogue.json` | The entries, with up to three worked examples per corpus, each tagged with its corpus |
| `labels-<corpus>.json` | Every scene's catalogue label from the hand grouping, or `none`. This is the answer key for scoring |
| `recurrence.log` | One recurrence rule applied to all three: at least 5 scenes, at least max(3, 4% of the stories) stories, and no story over 50% |
| `classify.py` | Classifies one scene per request through `../ollama.py`. Leave-one-corpus-out: the examples never come from the corpus being classified. `--k 0` offers the whole catalogue |
| `score.py` | Scores classifier output against `labels-*.json`. `--selftest` checks the scorer on hand-vs-hand and on random labels |
| `emb/` | Cached nomic-embed-text vectors for the catalogue and the O. Henry 14B predicaments |
| `out/` | Classifier output |
## Results so far
**1. One rule for all three corpora** (`recurrence.log`). O. Henry keeps 16 recurring situations and
Wharton keeps 16. Jacobs falls from its hand-counted 19 to **6**, because its groups had used a two-story
minimum. With 12 stories, three stories a group is the least that means "recurs", and most of its
groups do not reach it. Only `rival`, `strings` and `newcomer` are found in all three corpora; ten more
are in two. A 20-30 story corpus is a real floor.
**2. Clustering fails even on the best text.** My 839 hand-written O. Henry predicaments were
embedded exactly as `embed.py` embedded the 14B ones (`../v2/claude/predicament_embeddings-claude.json`),
and the same k = 60 k-means was run on them (`../v2/claude/compare-claude-embeddings.log`). The groups
agree with my own hand grouping at **ARI 0.05** (0.05-0.05 over four seeds), no better than the 14B text's
0.07. The fault is the embed-and-cluster step, not the predicament text. Better rewriting will not
rescue clustering.
**3. Embeddings cannot even shortlist.** With the 14B predicaments against the catalogue definitions, the
hand label is the nearest entry for 13% of situated scenes, is in the top 8 for 50%, and is in the top 20
for 83%. So `classify.py` now offers the whole catalogue (`--k 0`), with the catalogue in the system prompt
so the server can reuse the cached prefix.
**4. Classifier pilot: 40 scenes only, too small to judge** (`pilot40.log`; qwen3:14b, shortlist k = 8,
14B predicaments). The model called 34 of 40 scenes situated where the hand labels have 14. Where both
called a scene situated, its label was right in 3 of 13 (23%). Kappa was 0.09. The prompt has since been
changed: the whole catalogue, a note to expect about half `none`, and a fit rating from 1 to 3 that
`score.py --minfit=` can threshold. The changed prompt has not been measured.
**4b. The changed prompt, on 30 scenes before the host hung** (`out/ohenry-q14-dev1.partial.json`, scored
in `pilot40.log`): it tells situated scenes from `none` better (precision 67%, recall 100%, kappa 0.23), but
where both call a scene situated, its label is right in only 2 of 14. Reading the confusions, some of its
labels are defensible. I labelled a whole story arc with one situation (every scene of *A Lickpenny Lover* is
`station`), while the model judges each scene alone (`pretence`, `unspoken`). And the 14B predicaments
("A man struggles to reconcile his pride with...") are too vague to classify from. So the next development
round should (a) also give the classifier the scene summary, or the predicaments either side, and (b) score
at the level a pack uses: which situations recur, with what members, rather than scene-exact agreement.
## Not done: the inference host's GPU fell off the bus
At **22:19:07 on 2026-09-17**, the inference host's GPU fell off the PCIe bus (kernel: `Xid 79`, then `Xid 154, GPU Reset
Required`). It happened in the middle of a `classify.py` development request whose prompt was about 2,450 tokens (the
whole catalogue). Over the ten minutes before, calls had slowed from about 2 s a scene to about 20 s. This is the
second such fault; the first was on 2026-09-13. **No power or link loggers were running**, because SSH was refused
while the key was out of the agent, so there is no evidence either way on power. After the fault, Ollama carried on
on the CPU. That is why nomic-embed-text still answered, and finding 2 was computed on CPU embeddings, which does
not change the method. All client processes were stopped. The host needs a reboot (reset required). The NVIDIA
driver asks for `nvidia-bug-report.sh` to be run as root before the module is unloaded.
The prompt design matters for this host: offering the whole catalogue makes every call a long prefill. Either keep
the catalogue as a cached prefix (the current `classify.py`, which puts it in the system prompt; untested on the
GPU), or shortlist with something better than embeddings, or run with a lower power limit and the loggers on.
### Third fault, with the loggers running: 2026-09-18 01:00:03
After a reboot, with the power limit set to 200 W (from 280 W) and all three loggers running, a 20-scene pilot
(`classify.py ohenry q14 --limit 20 --tag=-dev1`, catalogue as the cached system prompt) lost the GPU about 15 s in.
The logs are in `gpu-logs/*-2026-09-18-0056.*`. From the link/power CSV:
| Time | Power | Utilisation | Notes |
| --- | --- | --- | --- |
| 00:59:54 | 309.31 W | 49% | enforced limit 200 W; throttle reason 0x4 (SW power cap) |
| 00:59:55 to 00:59:59 | about 178 to 202 W | 100% | sustained prefill |
| 01:00:02 | 174.96 W | | last good sample |
| 01:00:03 | | | "GPU is lost"; dmon shows `-` from here |
The temperature never went above 39 °C, so the cause is not thermal. The link was PCIe gen 3 x4. The card drew
309 W for a sample despite a 200 W cap, and then dropped after about ten seconds of load at the cap. That points to
power delivery to the card or the OCuLink dock, not to the prompt or the software. A lower cap did not prevent it.
**No more classification runs on that host until its hardware has been looked at.** The pilot output is not a result.
`gpu-logs/nvidia-bug-report-2026-09-18.log.gz` is the driver's report, taken after the fault. The kernel log in it
shows no AER or PCIe error messages at any fault. That is not evidence of a clean link: at boot the kernel logs `_OSC: platform does not support [SHPCHotplug AER LTR DPC]`, so the firmware never gives the OS AER control and link errors would not be reported. There
was an `Xid 32` (corrupted push-buffer stream) from Ollama at 00:54:48, five minutes before this drop, and an `Xid 13`
graphics exception on 2026-09-13, before the first drop.
## Next, once the host is healthy
The plan below is fixed before any of the runs, so they cannot be tuned after the fact.
- **Development slice:** O. Henry scenes 0-119. Tune the prompt and the `--minfit` threshold only here.
(`classify.py ohenry q14 --limit 120 --tag=-dev1`)
- **Test:** O. Henry scenes 120-838, run once (`--start 120 --tag=-test`). Score with
`score.py out/ohenry-q14-test.json --range=120:839`. Then run the same prompt on the hand-written
predicaments (`ohenry claude`) to separate rewrite quality from classification quality. Then run
`wharton claude` and `jacobs claude`, which have no local-model predicaments yet, to see how the
catalogue transfers.
- **What counts as success** is precision per situation, not the number of situations that pass:
`--selftest` shows random labels also "pass" all 16. The bar is set before the test run: for the
situations both hand and model call recurring, a median model precision of at least 60%.
- At about 2 s a scene, O. Henry takes about 30 minutes a text set. That is a long run, so start the
loggers first.
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,271 @@
"""The situation catalogue: a closed list a model classifies scenes against, instead of clustering them.
Seeded from three hand-made references (O. Henry ../v2/claude, Wharton ../wharton/claude, Jacobs ../jacobs/claude).
Every hand group in those references maps to exactly one catalogue entry (SOURCES). Running this file:
1. checks the mapping is total and every entry has at least one source,
2. writes catalogue.json (entries + worked examples, tagged by corpus so a classifier can leave a corpus out),
3. writes labels-<corpus>.json: every scene's catalogue label from the hand grouping, or "none",
4. applies ONE recurrence rule to all three corpora and writes recurrence.log.
No inference.
"""
import collections, json, math, pathlib, sys
HERE = pathlib.Path(__file__).resolve().parent
PROBE = HERE.parent
E = lambda id, name, definition, includes, excludes, tone='any', recurs=True: dict(
id=id, name=name, definition=definition, includes=includes, excludes=excludes, tone=tone, recurs=recurs)
CATALOGUE = [
E('rival', 'A rival for the same person',
'Someone else wants the person you want, and only one of you can have them.',
'suitors competing; fear of losing a partner to someone else; temptation to strike at the rival',
'competing for money or a prize that is not a person (your_scheme)'),
E('strings', 'Help with strings attached',
'Help, money or a chance is offered to you, but only on terms that will cost you something you value.',
'family money conditional on obeying them; a backer who now wants something; a windfall with a hidden cost',
'the terms require doing something you think wrong (compromise_for_money); a stranger\'s trap (sure_thing)'),
E('compromise_for_money', 'Money for going along',
'You can have money, success or a meal if you go along with something you think wrong or false.',
'selling out your standards for pay; the client wants the flattering or fake version; a compromising offer when you are hungry',
'the cost is only inconvenient, not wrong (strings)'),
E('sure_thing', 'The sure thing',
'A plausible person offers an easy fortune that is probably a trap set for you.',
'confidence tricks aimed at you; too-good-to-be-true bargains; strangers who befriend you for your money',
'you are the one running the scheme (your_scheme)'),
E('your_scheme', 'Your scheme turns on you',
'You are running a scheme or quietly tipping a deal your way, and it may be about to turn on you.',
'cheating a partner; rigging a contest; a trick coming apart in front of the people you meant to fool',
'someone else is scheming against you (sure_thing)'),
E('after_your_money', 'People after your money',
'You have money, or are thought to, and people around you are suddenly courting it.',
'heirs circling; flatterers and hangers-on; pressure to reveal a hidden windfall',
'a single stranger\'s con (sure_thing)'),
E('past_comes_back', 'The past comes back',
'Someone from your past, or your partner\'s, turns up with a claim or a hold that threatens your present life.',
'blackmail over an old secret; a former spouse or intimate who still has a claim; an old associate who could expose you',
'you simply discover something a person close to you hid (what_they_hid)'),
E('hiding_from_close', 'Hiding it from someone close',
'You are hiding something, and someone close to you keeps innocently coming near it.',
'keeping a guilty or embarrassing secret from a spouse or family; near misses',
'the secret belongs to someone else (their_secret)'),
E('their_secret', 'Keeping someone else\'s secret',
'You have been drawn into another person\'s secret and must decide whether to lie, stay silent or give it up.',
'covering for a friend or employer; being questioned by a suspicious superior',
'your own secret (hiding_from_close)'),
E('what_they_hid', 'What they hid',
'You discover that a person close to you has been hiding something, and must decide what it changes.',
'a partner\'s concealed past or disappointment; a friend\'s lie revealed',
'the hidden thing arrives as a claim or threat from outside (past_comes_back)'),
E('pretence', 'Passing for more than you are',
'You are pretending to be more, or other, than you are, to impress someone, and may be found out.',
'dressing and talking above your station; invented titles or histories; a thrilling story nobody can check',
'you are genuinely above or below the other person and must decide what to show (station)'),
E('caught_out', 'Caught out',
'You have been caught, or are about to be seen, doing or being what you meant nobody to see.',
'a private arrangement about to be judged publicly; caught somewhere you should not be; a joke taken in earnest',
'you are blamed for something you did not do (wrongly_judged)'),
E('wrongly_judged', 'What it looked like',
'Someone whose opinion matters has judged you by appearances, for something you did not do, and will not hear you out.',
'an innocent moment misread; suspected of a theft; taken for a fraud because of how you look',
'you really did it (caught_out)'),
E('let_another_take_blame', 'Someone else is taking the blame',
'Suspicion has fallen on someone innocent for what you did, and you could let it stay there.',
'an innocent person punished for your act; a stranger\'s blunder gives you a scapegoat',
'you are the innocent one (wrongly_judged)'),
E('cant_prove_it', 'Sure, but cannot prove it',
'You are sure who wronged you, and you cannot prove it.',
'accusing without evidence; authorities brushing you off; trying to trap the suspect',
'you are the one accused (wrongly_judged)'),
E('station', 'Across the gap in station',
'Someone well above or below you in station wants you, and each of you must decide how much to show of where you really stand.',
'courting or marrying across class; ashamed of your origins before a grander partner; a rich suitor not believed',
'pretending to a station you do not have (pretence)'),
E('home_unseen', 'Unseen at home',
'You and a partner at home have stopped really seeing each other, and one of you wants to be noticed.',
'neglect; taking a spouse for granted; a partner whose blind approval or coarseness makes nothing matter',
'open quarrels about blame (peace_at_home)'),
E('peace_at_home', 'Keeping the peace at home',
'Someone at home blames you or demands their way, and you must decide whether to give way to keep the peace.',
'being held responsible for household trouble; backing down before a spouse or elder; household quarrels',
'loneliness without conflict (home_unseen); an outsider in the house (unwelcome_in_home)'),
E('unwelcome_in_home', 'An unwelcome guest',
'Someone you do not want has settled into your home, and you cannot seem to make them go.',
'a relative or intruder who stays; having to make polite room for someone who holds power over the household',
'a former partner\'s claim (past_comes_back)'),
E('power_over_you', 'Under someone\'s thumb',
'Someone with power over you treats you with contempt, or must be humoured though you resent them, and you want respect or to turn the tables.',
'a superior who humiliates you; having to be civil and helpful to someone you fear or dislike because of your position',
'a well-meaning benefactor (benefactor)'),
E('benefactor', 'Help nobody asked for',
'Someone with money wants to do good to someone below them on their own terms: either you are offered such help, or you are the one offering it.',
'charity with a sermon or a price in pride; reformers who stop you working; a rich person seeking gratitude or restitution',
'a conditional offer between equals (strings)'),
E('patron', 'A handshake from the top',
'Someone powerful could be seen with you, and getting that notice will cost you.',
'currying favour with a great man; spending to be seen with the important; wanting a patron at your wedding',
'being humiliated by them (power_over_you)'),
E('pressed_to_wrong', 'Pressed to do wrong',
'Someone is pressing you to do something you believe is wrong or dangerous, including turning on a friend you owe.',
'pressure to testify against or turn in a friend; a loved one begging you to do something wicked; being invited into a crooked scheme',
'you are merely paid to compromise your standards (compromise_for_money)'),
E('go_between', 'Carrying someone else\'s case',
'You are asked to carry another person\'s claim or warning to a third party, knowing it may cost you with one side or the other.',
'pleading a case you doubt; passing on an unwelcome message; warning an outsider about a relative',
'keeping a secret (their_secret)'),
E('sacrifice', 'Giving it up for them',
'You can help or protect someone you care for only by giving up something of your own, and they may never know.',
'selling a treasure for a gift; secret humble work; giving your savings or name away for another',
'being paid to give something up (strings)'),
E('owning_up', 'Owning up',
'You once wronged someone, and now face them, or a stand-in, and must decide how much to admit or how to make amends.',
'confession; seeking forgiveness; a public show of devotion to win someone back',
'an innocent is blamed right now for what you did (let_another_take_blame)'),
E('own_words_back', 'Held to your own words',
'A principle, promise or rule you once used for your own ends is now turned against you.',
'hoist by your own code; a promise you never expected to be called in', '', recurs=False),
E('newcomer', 'New to the place',
'You are new to a place or household that ignores you, warns you, or leaves you lost, and you must find your footing.',
'arriving in the city; a new post with warnings about the person in charge; waking somewhere strange',
'news from the place you left (homecoming)'),
E('homecoming', 'Word from home',
'The people you left want you back, and word of them has reached you.',
'a messenger from home; a parent waiting; a reunion with an old friend from where you came from',
'a claim or threat from the past (past_comes_back)'),
E('dread', 'Something in the dark',
'Something frightening may be close by, and you must decide whether to face it.',
'fear of what a wish or deed has brought; noises in the dark; a thing you must undo before it arrives',
'ordinary social danger', tone='horror'),
E('waiting', 'Waiting on their decision',
'Your hopes hang on a decision entirely in another\'s hands, and nothing you do seems to hurry it.',
'waiting for a proposal, a verdict or a signal; pretending indifference while it hangs',
'you are the one who cannot speak (unspoken)'),
E('unspoken', 'You cannot say it',
'Someone you want is waiting for you to say it, and you cannot find the words or the moment.',
'shy lovers; a single short chance to speak; feelings hidden behind a business arrangement',
'waiting for the other to decide (waiting)'),
E('overlooked', 'Beside the admired one',
'You are the plain or overlooked one beside someone admired, and want, once, to be noticed.',
'the plain co-worker; going to dances on someone else\'s arm',
'a partner at home who ignores you (home_unseen)'),
E('sign', 'A sign',
'Someone in a bad way wants a sign to tell them what to do, and one seems to have turned up.',
'fortune-tellers, omens, mysterious messages, reading a coincidence as meant for you',
'real supernatural danger (dread)'),
E('despised', 'The one nobody thinks much of',
'Someone everybody looks down on wants a chance, and may be the only one who can help.',
'a tramp, a foreigner, a crook or a failure who turns out to be the helper',
'someone powerful (patron)'),
E('habit', 'The old habit',
'An old habit gives you away at exactly the moment you need to be someone new.',
'a former trade\'s manner resurfacing; an old craving at the worst moment',
'', recurs=False),
]
# every hand group in the three references -> one catalogue id
SOURCES = {
'ohenry': {'pose': 'pretence', 'benefactor': 'benefactor', 'taken_for_granted': 'home_unseen', 'station': 'station',
'newcomer': 'newcomer', 'easy_money': 'sure_thing', 'sacrifice': 'sacrifice', 'rival': 'rival',
'price': 'compromise_for_money', 'despised': 'despised', 'loyalty': 'pressed_to_wrong',
'appearances': 'wrongly_judged', 'sign': 'sign', 'strings': 'strings', 'honest_work': 'compromise_for_money',
'unspoken': 'unspoken', 'overlooked': 'overlooked', 'homecoming': 'homecoming', 'patron': 'patron', 'habit': 'habit'},
'wharton': {'tainted_money': 'compromise_for_money', 'strings_attached': 'strings', 'old_attachment': 'past_comes_back',
'what_they_hid': 'what_they_hid', 'keep_their_secret': 'their_secret', 'exposed': 'caught_out',
'civil_to_them': 'power_over_you', 'plead_their_case': 'go_between', 'own_words_back': 'own_words_back',
'give_it_up': 'sacrifice', 'keep_the_peace': 'peace_at_home', 'unseen_at_home': 'home_unseen',
'new_and_warned': 'newcomer', 'the_rival': 'rival', 'owning_up': 'owning_up', 'waiting_on_them': 'waiting'},
'jacobs': {'G01': 'past_comes_back', 'G02': 'hiding_from_close', 'G03': 'let_another_take_blame', 'G04': 'rival',
'G05': 'your_scheme', 'G06': 'your_scheme', 'G07': 'after_your_money', 'G08': 'strings', 'G09': 'your_scheme',
'G10': 'power_over_you', 'G11': 'unwelcome_in_home', 'G12': 'dread', 'G13': 'pressed_to_wrong',
'G14': 'pretence', 'G15': 'caught_out', 'G16': 'peace_at_home', 'G17': 'cant_prove_it', 'G18': 'newcomer',
'G19': 'owning_up'},
}
def load_corpus(name):
"""-> chunks, {chunk: predicament}, {chunk: hand group id}"""
if name == 'ohenry':
d = PROBE / 'v2'
sys.path.insert(0, str(d / 'claude')); from assign import ASSIGN
pred = {x['chunk']: x['summary'] for x in json.load(open(d / 'claude/predicaments-claude.json'))['summaries']}
return json.load(open(d / 'chunks.json')), pred, dict(ASSIGN)
d = PROBE / name
groups = json.load(open(d / 'claude/groups.json'))['groups']
hand = {}
for g in groups:
for m in g['members']:
c = m if isinstance(m, int) else m['chunk']
assert c not in hand, (name, c); hand[c] = g['id']
if name == 'wharton':
pred = {x['chunk']: x['summary'] for x in json.load(open(d / 'claude/predicaments.json'))['summaries']}
else:
rec = json.load(open(d / 'claude/records.json')); rec = rec if isinstance(rec, list) else rec['records']
pred = {r['chunk']: r['predicament'] for r in rec}
return json.load(open(d / 'chunks.json')), pred, hand
CORPORA = ['ohenry', 'wharton', 'jacobs']
# ---- one recurrence rule for all three --------------------------------------------------------------
def min_stories(n_stories): return max(3, math.ceil(0.04 * n_stories)) # 3 for 10-12 stories, 4 for 97
MIN_SCENES, MAX_DOMINANT = 5, 0.50
def recurs(members, story):
st = collections.Counter(story[c] for c in members)
return len(members) >= MIN_SCENES and len(st) >= min_stories(len(set(story))) and max(st.values()) / len(members) <= MAX_DOMINANT, len(st), (max(st.values()) / len(members) if members else 0)
if __name__ == '__main__':
ids = [e['id'] for e in CATALOGUE]
assert len(ids) == len(set(ids)), 'duplicate id'
problems = []
for corpus, m in SOURCES.items():
for g, c in m.items():
if c not in ids: problems.append(f'{corpus}:{g} -> unknown {c}')
used = {c for m in SOURCES.values() for c in m.values()}
problems += [f'catalogue entry {i} has no source group' for i in ids if i not in used]
for e in CATALOGUE:
for x in e['excludes'].split(';'):
for i in ids:
pass
examples = collections.defaultdict(list)
log = []
for corpus in CORPORA:
chunks, pred, hand = load_corpus(corpus)
unmapped = sorted({g for g in hand.values() if g not in SOURCES[corpus]})
if unmapped: problems.append(f'{corpus}: hand groups not in SOURCES: {unmapped}')
labels = {i: SOURCES[corpus].get(hand[i], 'none') if i in hand else 'none' for i in range(len(chunks))}
(HERE / f'labels-{corpus}.json').write_text(json.dumps(
{'corpus': corpus, 'from': 'hand groups mapped through catalogue_src.SOURCES',
'labels': [{'chunk': i, 'story': chunks[i]['story'], 'label': labels[i], 'predicament': pred[i]} for i in range(len(chunks))]},
indent=0, ensure_ascii=False))
# examples: up to 3 per (entry, corpus), spread across stories, taken from the hand members
per = collections.defaultdict(list)
for i in sorted(labels):
if labels[i] != 'none': per[labels[i]].append(i)
for lab, mem in per.items():
seen = set()
for i in mem:
if chunks[i]['story'] in seen: continue
seen.add(chunks[i]['story']); examples[lab].append({'corpus': corpus, 'chunk': i, 'predicament': pred[i]})
if len(seen) == 3: break
story = [c['story'] for c in chunks]
ns = len(set(story))
log.append(f'\n== {corpus}: {ns} stories, {len(chunks)} scenes; rule: >= {MIN_SCENES} scenes, >= {min_stories(ns)} stories, no story over {MAX_DOMINANT:.0%}')
log.append(f' scenes labelled: {sum(l != "none" for l in labels.values())} ({sum(l != "none" for l in labels.values())/len(chunks):.0%})')
passing = []
for lab in sorted(per, key=lambda k: -len(per[k])):
ok, nst, dom = recurs(per[lab], story)
passing += [lab] if ok else []
log.append(f' {"PASS" if ok else " "} {lab:24s} {len(per[lab]):3d} scenes {nst:3d} stories top story {dom:4.0%}')
log.append(f' -> {len(passing)} recurring situations of {len(per)} present')
cover = collections.defaultdict(set)
for corpus, m in SOURCES.items():
for c in m.values(): cover[c].add(corpus)
log.append('\n== catalogue coverage: entries found in 3 / 2 / 1 corpora')
for k in (3, 2, 1):
log.append(f' {k}: ' + ', '.join(i for i in ids if len(cover[i]) == k))
if problems:
print('\n'.join(problems)); sys.exit(1)
out = {'about': 'Situation catalogue for story-to-pack, seeded by hand from O. Henry, Wharton and Jacobs references (2026-09-17). '
'A classifier assigns each scene predicament one entry or "none". Examples carry their corpus so a test '
'on one corpus can use only the others.',
'entries': [dict(e, corpora=sorted(cover[e['id']]), examples=examples[e['id']]) for e in CATALOGUE]}
(HERE / 'catalogue.json').write_text(json.dumps(out, indent=1, ensure_ascii=False))
(HERE / 'recurrence.log').write_text('\n'.join(log).lstrip() + '\n')
print(f'catalogue.json: {len(CATALOGUE)} entries'); print('\n'.join(log))
@@ -0,0 +1,107 @@
"""Classify scene predicaments against the catalogue, one scene at a time.
STP_OLLAMA=http://<host>:11434 python3 classify.py <corpus> <text-set> [--limit N]
corpus ohenry | wharton | jacobs
text-set claude (the hand-written predicaments) | q14 (qwen3:14b predicaments, O. Henry only)
Leave-one-corpus-out: the worked examples shown never come from the corpus being classified, so this
tests the catalogue on a corpus it has not seen. Embeddings (nomic-embed-text) only narrow the choice:
the scene's K nearest entries, plus "none", go to the model. Checkpoints after every scene; resumes.
Writes out/<corpus>-<text-set>.json.
"""
import argparse, json, math, pathlib, re, sys, time
HERE = pathlib.Path(__file__).resolve().parent
PROBE = HERE.parent
sys.path.insert(0, str(PROBE))
import ollama
ap = argparse.ArgumentParser()
ap.add_argument('corpus'); ap.add_argument('textset')
ap.add_argument('--limit', type=int); ap.add_argument('--k', type=int, default=0, help='0 = offer the whole catalogue')
ap.add_argument('--start', type=int, default=0)
ap.add_argument('--tag', default='')
ap.add_argument('--model', default='qwen3:14b')
args = ap.parse_args()
EMB = 'nomic-embed-text'
cat = json.load(open(HERE / 'catalogue.json'))['entries']
labels = json.load(open(HERE / f'labels-{args.corpus}.json'))['labels']
if args.textset == 'claude':
texts = [x['predicament'] for x in labels]
elif args.textset == 'q14':
assert args.corpus == 'ohenry'
q = {x['chunk']: x['summary'] for x in json.load(open(PROBE / 'v2/predicaments_clean.json'))['summaries']}
texts = [q[x['chunk']] for x in labels]
else:
sys.exit('text-set must be claude or q14')
def norm(v):
m = math.sqrt(sum(x * x for x in v)) or 1.0
return [x / m for x in v]
# embeddings, cached
def cached_embed(name, items):
p = HERE / 'emb' / f'{name}.json'; p.parent.mkdir(exist_ok=True)
if p.exists():
d = json.load(open(p))
if d['texts'] == items: return d['vectors']
vecs = []
for i in range(0, len(items), 16):
vecs += ollama.embed(EMB, ['search_query: ' + t if name != 'catalogue' else 'search_document: ' + t for t in items[i:i + 16]])
p.write_text(json.dumps({'model': EMB, 'texts': items, 'vectors': vecs}))
return vecs
entry_text = [f"{e['name']}. {e['definition']} Includes: {e['includes']}." for e in cat]
E = [norm(v) for v in cached_embed('catalogue', entry_text)]
S = [norm(v) for v in cached_embed(f'{args.corpus}-{args.textset}', texts)]
def examples_for(e):
ex = [x for x in e['examples'] if x['corpus'] != args.corpus][:2]
return ''.join(f'\n e.g. "{x["predicament"]}"' for x in ex)
SYSTEM = """You sort scenes from short stories into recurring SITUATIONS for a life-simulation game.
You get one scene, described as its main person's predicament, and a short list of candidate situations.
Answer with the ONE candidate that the predicament is an instance of, or "none".
Choose "none" when the scene is narration, scene-setting, a description of a place or type of person, or a
one-off turn that is not really any of the candidates. A shared word or setting is not enough: the
predicament itself -- what the person is up against and what they want -- must match the situation.
Most scenes in a story are NOT one of these situations: expect about half to be "none".
Also rate how clearly the predicament is an instance of your choice: 3 = plainly this situation,
2 = arguably, 1 = only loosely.
Reply with JSON only: {"label": "<candidate id or none>", "fit": <1, 2 or 3>}"""
out_path = HERE / 'out' / f'{args.corpus}-{args.textset}{args.tag}.json'; out_path.parent.mkdir(exist_ok=True)
state = json.load(open(out_path)) if out_path.exists() else {'model': args.model, 'k': args.k, 'results': []}
done = {r['chunk'] for r in state['results']}
n = len(texts) if not args.limit else min(args.limit, len(texts))
t0 = time.time(); new = 0
for i in range(args.start, n):
if labels[i]['chunk'] in done: continue
order = sorted(range(len(cat)), key=lambda j: -sum(a * b for a, b in zip(S[i], E[j])))
sims = order[:args.k] if args.k else list(range(len(cat)))
cands = '\n'.join(f"- {cat[j]['id']}: {cat[j]['definition']}{examples_for(cat[j])}" for j in sims)
# candidates go in the system prompt, identical from scene to scene when the whole catalogue is offered,
# so the server can reuse its cached prefix; the predicament comes last
system = SYSTEM + '\n\nCandidates:\n' + cands + '\n- none: not one of these situations'
user = f'Predicament: "{texts[i]}"'
raw, _, _ = ollama.chat(args.model, system, user, num_ctx=4096, num_predict=40, fmt='json',
think=False if args.model.startswith('qwen3') else None)
try:
j = json.loads(raw); lab = str(j.get('label', '')).strip(); fit = j.get('fit')
except Exception:
m = re.search(r'"label"\s*:\s*"([^"]+)"', raw); lab = m.group(1) if m else ''; fit = None
valid = {cat[j]['id'] for j in sims} | {'none'}
state['results'].append({'chunk': labels[i]['chunk'], 'label': lab if lab in valid else 'none',
'fit': fit, 'raw': raw if lab not in valid else None, 'candidates': [cat[j]['id'] for j in sims],
'nearest': cat[sims[0]]['id']})
new += 1
if new % 10 == 0 or i == n - 1:
out_path.write_text(json.dumps(state, indent=0))
el = time.time() - t0
print(f' {len(state["results"])}/{n} {el:.0f}s {el / new:.2f}s/scene', flush=True)
out_path.write_text(json.dumps(state, indent=0))
print('done', out_path.name, len(state['results']))
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,948 @@
{
"corpus": "jacobs",
"from": "hand groups mapped through catalogue_src.SOURCES",
"labels": [
{
"chunk": 0,
"story": 0,
"label": "peace_at_home",
"predicament": "Someone waiting up for a relative who comes in late wants to reproach him, and gets cheek back."
},
{
"chunk": 1,
"story": 0,
"label": "peace_at_home",
"predicament": "A man learns a relative has promised a stranger his hospitality without asking, and fears what his spouse will say."
},
{
"chunk": 2,
"story": 0,
"label": "unwelcome_in_home",
"predicament": "A man who wants to turn an unwelcome guest away cannot find the nerve to say it."
},
{
"chunk": 3,
"story": 0,
"label": "peace_at_home",
"predicament": "A man who has let something happen under his roof fears his spouse will hold him responsible for it."
},
{
"chunk": 4,
"story": 0,
"label": "rival",
"predicament": "A young man who brought the person he is courting along is pushed aside by an older man who takes charge of her."
},
{
"chunk": 5,
"story": 0,
"label": "rival",
"predicament": "A jealous suitor tries to put his rival in his place, and only makes himself look childish."
},
{
"chunk": 6,
"story": 0,
"label": "none",
"predicament": "A spurned man realises he holds something over the rival who humiliated him, and decides to use it."
},
{
"chunk": 7,
"story": 0,
"label": "hiding_from_close",
"predicament": "A man hiding an innocent but compromising secret is met by his spouse, while the one person who could clear him refuses to."
},
{
"chunk": 8,
"story": 0,
"label": "hiding_from_close",
"predicament": "A man tries to hurry his spouse away from a secret while someone signals behind his back that something is up."
},
{
"chunk": 9,
"story": 0,
"label": "caught_out",
"predicament": "A man caught with an innocent secret is disowned by the one person who could explain it."
},
{
"chunk": 10,
"story": 0,
"label": "let_another_take_blame",
"predicament": "A man whose spite has got an innocent person abused must decide whether to own up and defend her."
},
{
"chunk": 11,
"story": 0,
"label": "owning_up",
"predicament": "A man tries to win back someone he wronged with a dangerous public show of devotion."
},
{
"chunk": 12,
"story": 0,
"label": "your_scheme",
"predicament": "A man pretends to be in danger to win sympathy, and the one who saved him sees through it."
},
{
"chunk": 13,
"story": 0,
"label": "owning_up",
"predicament": "Two men who quarrelled over a woman are both left out in the cold by the women they wronged."
},
{
"chunk": 14,
"story": 1,
"label": "caught_out",
"predicament": "A man losing a friendly contest tries to distract from his mistake, and is caught at it by his family."
},
{
"chunk": 15,
"story": 1,
"label": "none",
"predicament": "A guest who wants to leave a dangerous subject alone is coaxed by his hosts' curiosity into bringing it out."
},
{
"chunk": 16,
"story": 1,
"label": "strings",
"predicament": "Someone offered a thing that grants wishes is warned by the man who used it that it brings sorrow."
},
{
"chunk": 17,
"story": 1,
"label": "strings",
"predicament": "A man is offered a dangerous gift by someone who begs him to destroy it, and wants to keep it anyway."
},
{
"chunk": 18,
"story": 1,
"label": "strings",
"predicament": "A man half-believing in a promise of easy money must decide whether to test it and what to ask for."
},
{
"chunk": 19,
"story": 1,
"label": "dread",
"predicament": "A family that tempted fate laughs off their fears in daylight while one of them cannot shake them."
},
{
"chunk": 20,
"story": 1,
"label": "strings",
"predicament": "A family waiting on a hoped-for windfall sees a stranger approach who might bring it, or bad news."
},
{
"chunk": 21,
"story": 1,
"label": "none",
"predicament": "Parents receive news that their only child has been killed, from someone who cannot bring himself to say it."
},
{
"chunk": 22,
"story": 1,
"label": "strings",
"predicament": "A man learns the money he wished for has come as compensation for his child's death."
},
{
"chunk": 23,
"story": 1,
"label": "pressed_to_wrong",
"predicament": "A grieving woman seizes on a desperate chance to undo a death, and her spouse is afraid of what it would bring back."
},
{
"chunk": 24,
"story": 1,
"label": "pressed_to_wrong",
"predicament": "A man pressed by his grieving spouse must decide whether to do something he believes is wicked and dangerous."
},
{
"chunk": 25,
"story": 1,
"label": "dread",
"predicament": "A man who dreads what his wish may bring home must stop his spouse from opening the door to it."
},
{
"chunk": 26,
"story": 1,
"label": "dread",
"predicament": "A man must use his last chance to undo what his spouse most longs for, before she lets it in."
},
{
"chunk": 27,
"story": 2,
"label": "after_your_money",
"predicament": "A man who has hoarded his savings all his life falls ill far from anywhere he could spend them."
},
{
"chunk": 28,
"story": 2,
"label": "after_your_money",
"predicament": "A dying miser, surrounded by people hoping to inherit, is determined that nobody will get his money."
},
{
"chunk": 29,
"story": 2,
"label": "pressed_to_wrong",
"predicament": "Someone who spots a colleague quietly scheming to take unclaimed money must decide whether to expose him or join in."
},
{
"chunk": 30,
"story": 2,
"label": "your_scheme",
"predicament": "Two partners convinced a weaker person is secretly holding a fortune want to find it before anyone else learns of it."
},
{
"chunk": 31,
"story": 2,
"label": "cant_prove_it",
"predicament": "A schemer whose secret searches keep failing decides to confront the person he suspects directly."
},
{
"chunk": 32,
"story": 2,
"label": "after_your_money",
"predicament": "Someone suspected of hiding a windfall is pressed with bribes and threats by people who have no right to it."
},
{
"chunk": 33,
"story": 2,
"label": "your_scheme",
"predicament": "Someone forced to share a hidden windfall admits it is now stuck where neither partner can get at it."
},
{
"chunk": 34,
"story": 2,
"label": "your_scheme",
"predicament": "Distrustful partners stare at a fortune they cannot reach without getting caught, and blame each other for it."
},
{
"chunk": 35,
"story": 2,
"label": "your_scheme",
"predicament": "A man wants something a superior owns without revealing why, and tries flattery to get it."
},
{
"chunk": 36,
"story": 2,
"label": "your_scheme",
"predicament": "A buyer who cannot reveal why he wants something is made to pay more by a seller who senses his eagerness."
},
{
"chunk": 37,
"story": 2,
"label": "your_scheme",
"predicament": "A man who wants to cheat his partner out of a shared prize is watched too closely to slip away."
},
{
"chunk": 38,
"story": 2,
"label": "your_scheme",
"predicament": "A man trying to slip away with a shared prize is held up until the partner he meant to cheat catches him."
},
{
"chunk": 39,
"story": 2,
"label": "your_scheme",
"predicament": "A man who schemed to cheat a partner finds the prize gone and realises he may have been cheated himself."
},
{
"chunk": 40,
"story": 2,
"label": "your_scheme",
"predicament": "A schemer who was outwitted must stand and smile at the people who got the better of him."
},
{
"chunk": 41,
"story": 3,
"label": "none",
"predicament": "A man about to marry is needled by a dependent relative who hints at something to his discredit."
},
{
"chunk": 42,
"story": 3,
"label": "none",
"predicament": "A man in desperate debt makes veiled hints to the relative he hopes will pay it."
},
{
"chunk": 43,
"story": 3,
"label": "past_comes_back",
"predicament": "A man is blackmailed by a relative with old letters that could cost him the person he loves."
},
{
"chunk": 44,
"story": 3,
"label": "let_another_take_blame",
"predicament": "A man who has done something terrible in anger must cover for a relative's sudden disappearance."
},
{
"chunk": 45,
"story": 3,
"label": "hiding_from_close",
"predicament": "A man with a guilty secret must keep calm while someone he loves insists on lingering right at the spot."
},
{
"chunk": 46,
"story": 3,
"label": "hiding_from_close",
"predicament": "A man hiding a crime hears it discussed innocently and betrays his feelings with an outburst."
},
{
"chunk": 47,
"story": 3,
"label": "hiding_from_close",
"predicament": "A guilty man tries to hurry someone away from the scene of his crime, and she insists on staying."
},
{
"chunk": 48,
"story": 3,
"label": "hiding_from_close",
"predicament": "A man hiding something learns it may be discovered by an innocent accident, and must not show his fear."
},
{
"chunk": 49,
"story": 3,
"label": "hiding_from_close",
"predicament": "A man must retrieve something from where his secret lies before anyone else goes looking."
},
{
"chunk": 50,
"story": 3,
"label": "hiding_from_close",
"predicament": "A man secretly searching where his crime lies keeps pulling up reminders of it."
},
{
"chunk": 51,
"story": 3,
"label": "hiding_from_close",
"predicament": "A man who has failed to fix things quietly must now involve others while still keeping his secret."
},
{
"chunk": 52,
"story": 3,
"label": "hiding_from_close",
"predicament": "A man hiding something is offered help he cannot accept without being found out."
},
{
"chunk": 53,
"story": 3,
"label": "none",
"predicament": "A man who must face the thing he did alone gathers his nerve while others watch and wonder."
},
{
"chunk": 54,
"story": 3,
"label": "your_scheme",
"predicament": "A man who hid a crime is dragged down by it at the moment he tries to undo its consequences."
},
{
"chunk": 55,
"story": 4,
"label": "peace_at_home",
"predicament": "A woman who has lost something valuable suspects the people around her, and resents her spouse for not caring as much."
},
{
"chunk": 56,
"story": 4,
"label": "cant_prove_it",
"predicament": "Someone who has lost something accuses the most defenceless person nearby, and punishes her before any proof."
},
{
"chunk": 57,
"story": 4,
"label": "peace_at_home",
"predicament": "A man who thinks a household fuss is foolish keeps defending the accused and is scolded for taking her side."
},
{
"chunk": 58,
"story": 4,
"label": "caught_out",
"predicament": "A man who finds a family inquiry ridiculous cannot keep a straight face in front of its self-important leader."
},
{
"chunk": 59,
"story": 4,
"label": "let_another_take_blame",
"predicament": "A man who sees an innocent neighbour blamed for evidence he himself left must decide whether to own up."
},
{
"chunk": 60,
"story": 4,
"label": "caught_out",
"predicament": "A man who knows more than he says can barely hide his amusement from the self-important person running the inquiry."
},
{
"chunk": 61,
"story": 4,
"label": "cant_prove_it",
"predicament": "A self-important man, teased that a neighbour fancies him, resolves to prove his point by trapping her."
},
{
"chunk": 62,
"story": 4,
"label": "pressed_to_wrong",
"predicament": "A man refuses to let his home be used to entrap a friend, so the schemer plans to go behind his back."
},
{
"chunk": 63,
"story": 4,
"label": "unwelcome_in_home",
"predicament": "A man stuck with an unwelcome relative in his home sees a chance to have him disgraced and driven off."
},
{
"chunk": 64,
"story": 4,
"label": "power_over_you",
"predicament": "A man who has trapped his rival in an embarrassing hiding place decides to make the most of it."
},
{
"chunk": 65,
"story": 4,
"label": "caught_out",
"predicament": "A trapped man must listen in silence while someone tells a neighbour a story about him that he cannot deny."
},
{
"chunk": 66,
"story": 4,
"label": "caught_out",
"predicament": "A man caught somewhere he should not be is handed an embarrassing explanation, and has no better one to offer."
},
{
"chunk": 67,
"story": 5,
"label": "past_comes_back",
"predicament": "A man found out in wrongdoing is ordered by his partner to give up everything and leave by morning."
},
{
"chunk": 68,
"story": 5,
"label": "past_comes_back",
"predicament": "A man offered a harsh but fair way out of his disgrace wants a quieter bargain the other will not give."
},
{
"chunk": 69,
"story": 5,
"label": "pressed_to_wrong",
"predicament": "A man facing ruin threatens the only person who can expose him, and must choose whether to go through with it."
},
{
"chunk": 70,
"story": 5,
"label": "none",
"predicament": "A man who has just done something terrible in rage panics and must steady himself when a figure of the law appears."
},
{
"chunk": 71,
"story": 5,
"label": "none",
"predicament": "A man with a crime behind him and a few hours' start must decide what to take and where to run."
},
{
"chunk": 72,
"story": 5,
"label": "none",
"predicament": "A fugitive planning his escape finds that every choice might be the one that gets him caught."
},
{
"chunk": 73,
"story": 5,
"label": "dread",
"predicament": "A man alone with what he has done hears noises in the dark and fears it has come back for him."
},
{
"chunk": 74,
"story": 5,
"label": "let_another_take_blame",
"predicament": "A guilty man realises a stranger's blunder gives him someone else to blame."
},
{
"chunk": 75,
"story": 5,
"label": "let_another_take_blame",
"predicament": "A man framing an innocent person must act the outraged victim in front of the law."
},
{
"chunk": 76,
"story": 5,
"label": "let_another_take_blame",
"predicament": "A man must play the shocked innocent while the person he framed pleads the truth."
},
{
"chunk": 77,
"story": 5,
"label": "let_another_take_blame",
"predicament": "Someone falsely accused points to the real culprit, who must hold his nerve and keep up his story."
},
{
"chunk": 78,
"story": 5,
"label": "your_scheme",
"predicament": "A man who thought he had got away with it learns the one witness who could hang him is still alive."
},
{
"chunk": 79,
"story": 5,
"label": "your_scheme",
"predicament": "A man whose deceit has collapsed can only watch as the truth comes out and he is taken away."
},
{
"chunk": 80,
"story": 6,
"label": "none",
"predicament": "A penniless newcomer forces his way into a place he does not belong, counting on a secret to back him."
},
{
"chunk": 81,
"story": 6,
"label": "past_comes_back",
"predicament": "A man who has built a respectable new life is found by an old associate who threatens to expose his past."
},
{
"chunk": 82,
"story": 6,
"label": "past_comes_back",
"predicament": "A man pays off a blackmailer and learns the price will be half of everything, for good."
},
{
"chunk": 83,
"story": 6,
"label": "past_comes_back",
"predicament": "A reformed man warns a blackmailer not to push him too far, while the blackmailer sets his sights on the man's family."
},
{
"chunk": 84,
"story": 6,
"label": "none",
"predicament": "A man who has seized power over another knows the danger he is in, and guards himself even as he gloats."
},
{
"chunk": 85,
"story": 6,
"label": "unwelcome_in_home",
"predicament": "A household must make polite space for someone who holds them hostage."
},
{
"chunk": 86,
"story": 6,
"label": "unwelcome_in_home",
"predicament": "Someone watches a person she trusts give way at every turn to an intruder, and demands that he stand up for himself."
},
{
"chunk": 87,
"story": 6,
"label": "past_comes_back",
"predicament": "A man who is being blackmailed hears his tormentor threaten someone he loves, and must choose between swallowing it and hitting back."
},
{
"chunk": 88,
"story": 6,
"label": "your_scheme",
"predicament": "A blackmailer's hold depends on his victim's life, and that victim suddenly collapses."
},
{
"chunk": 89,
"story": 6,
"label": "none",
"predicament": "A blackmailer whose victim is dying must grab what he can before his hold disappears."
},
{
"chunk": 90,
"story": 6,
"label": "past_comes_back",
"predicament": "A dying man pressed by his tormentor bargains for time and for provision for someone he loves."
},
{
"chunk": 91,
"story": 6,
"label": "your_scheme",
"predicament": "A man who thinks his helpless victim is at his mercy leans in close to hear the secret."
},
{
"chunk": 92,
"story": 6,
"label": "power_over_you",
"predicament": "A man who pretended to be helpless strikes at the tormentor who threatened his family."
},
{
"chunk": 93,
"story": 6,
"label": "let_another_take_blame",
"predicament": "A man who has done a desperate thing arranges things so that suspicion falls elsewhere."
},
{
"chunk": 94,
"story": 7,
"label": "none",
"predicament": "A craftsman told his work looks like something else quietly fixes it before anyone else notices."
},
{
"chunk": 95,
"story": 7,
"label": "pretence",
"predicament": "An old man looking for a free drink offers a story in exchange."
},
{
"chunk": 96,
"story": 7,
"label": "dread",
"predicament": "People who laughed at a distant danger panic when it seems to have arrived on their doorstep."
},
{
"chunk": 97,
"story": 7,
"label": "dread",
"predicament": "Someone must choose between keeping himself safe behind a barred door and letting in a stranger in danger."
},
{
"chunk": 98,
"story": 7,
"label": "pretence",
"predicament": "A stranger with a thrilling tale of danger is rewarded by a frightened crowd without anyone checking it."
},
{
"chunk": 99,
"story": 7,
"label": "dread",
"predicament": "A community living in fear of an unseen threat ignores the one doubter, because he has a bad name."
},
{
"chunk": 100,
"story": 7,
"label": "cant_prove_it",
"predicament": "A man who has suffered a loss goes to the authorities for help and is brushed off as a nuisance."
},
{
"chunk": 101,
"story": 7,
"label": "none",
"predicament": "A community suffering repeated losses cannot get help, and cannot agree how to protect itself."
},
{
"chunk": 102,
"story": 7,
"label": "pretence",
"predicament": "A man tells a dramatic story of narrow escape to an audience eager to believe it."
},
{
"chunk": 103,
"story": 7,
"label": "pretence",
"predicament": "A man caught in a boastful lie is 'backed up' by a rival, who now has him trapped by it."
},
{
"chunk": 104,
"story": 7,
"label": "none",
"predicament": "People told their fears are nonsense by outsiders decide to take matters into their own hands."
},
{
"chunk": 105,
"story": 7,
"label": "none",
"predicament": "A band that set out to face a danger returns relieved to have found nothing, and is then called to face it for real."
},
{
"chunk": 106,
"story": 7,
"label": "caught_out",
"predicament": "A man with something to hide has an armed crowd force its way into his home."
},
{
"chunk": 107,
"story": 7,
"label": "caught_out",
"predicament": "A man caught with the evidence of his thefts brazens it out and dares his accusers to prove anything."
},
{
"chunk": 108,
"story": 7,
"label": "caught_out",
"predicament": "A man accused of wrongdoing turns his accusers' own exaggerations into his defence."
},
{
"chunk": 109,
"story": 7,
"label": "cant_prove_it",
"predicament": "People who know they were swindled cannot prove it, and must watch the swindler profit."
},
{
"chunk": 110,
"story": 8,
"label": "none",
"predicament": "A man nervously setting out to do something that matters to him is stopped by a friend with questions."
},
{
"chunk": 111,
"story": 8,
"label": "rival",
"predicament": "A man discovers a friend is after the same person he is, on the same day, and each races to get there first."
},
{
"chunk": 112,
"story": 8,
"label": "rival",
"predicament": "Two rivals agree someone must go first, and neither will be the one to wait."
},
{
"chunk": 113,
"story": 8,
"label": "rival",
"predicament": "Two rivals for the same prize trade claims of priority, and each suspects the other of a trick."
},
{
"chunk": 114,
"story": 8,
"label": "your_scheme",
"predicament": "Two rivals agree to settle who goes first by a game, and one slips in a condition the other does not examine."
},
{
"chunk": 115,
"story": 8,
"label": "your_scheme",
"predicament": "A man who tried to tip a contest in his favour loses it through his own oversight."
},
{
"chunk": 116,
"story": 8,
"label": "rival",
"predicament": "A man who lost the right to try first must wait while his rival takes his chance."
},
{
"chunk": 117,
"story": 8,
"label": "rival",
"predicament": "A man finds the rival he lost to has been refused, but can still use the terms of their bargain to keep him out."
},
{
"chunk": 118,
"story": 8,
"label": "rival",
"predicament": "A man bound by a promise he made watches a rival use it to keep him from what he wants."
},
{
"chunk": 119,
"story": 8,
"label": "caught_out",
"predicament": "A man who has been avoiding someone he cares for must explain why, and the only honest answer is embarrassing."
},
{
"chunk": 120,
"story": 8,
"label": "none",
"predicament": "A man bound by a rash promise finds the person he hoped to win is willing to help him get round it."
},
{
"chunk": 121,
"story": 8,
"label": "none",
"predicament": "Someone arranges to accept the suitor she prefers in a way his rival cannot object to."
},
{
"chunk": 122,
"story": 9,
"label": "newcomer",
"predicament": "A man wakes up somewhere strange with no idea how he got there."
},
{
"chunk": 123,
"story": 9,
"label": "newcomer",
"predicament": "A man in an unknown place looks for his one companion and a first clue to how they came to be there."
},
{
"chunk": 124,
"story": 9,
"label": "power_over_you",
"predicament": "A man who has always been obeyed tries to give orders somewhere nobody knows or believes who he is."
},
{
"chunk": 125,
"story": 9,
"label": "your_scheme",
"predicament": "Two people in trouble together try to put on a united front and end up blaming each other."
},
{
"chunk": 126,
"story": 9,
"label": "power_over_you",
"predicament": "Two people who claim to be respected professionals are treated as impostors and forced to do menial work."
},
{
"chunk": 127,
"story": 9,
"label": "power_over_you",
"predicament": "People brought low insist on their old status, and are mocked for it by those around them."
},
{
"chunk": 128,
"story": 9,
"label": "power_over_you",
"predicament": "A humiliated man pretends to submit while he quietly prepares his revenge."
},
{
"chunk": 129,
"story": 9,
"label": "power_over_you",
"predicament": "A man mocked for claiming skill is suddenly needed for it, and names his price."
},
{
"chunk": 130,
"story": 9,
"label": "power_over_you",
"predicament": "A man who has gained the upper hand over those who humiliated him enjoys every moment of it."
},
{
"chunk": 131,
"story": 9,
"label": "power_over_you",
"predicament": "A man who has secretly caused the trouble only he can cure makes the most of it."
},
{
"chunk": 132,
"story": 9,
"label": "none",
"predicament": "A man who swore he would never pay the person he scorned is forced by suffering to haggle with him."
},
{
"chunk": 133,
"story": 9,
"label": "power_over_you",
"predicament": "People who scorned two outsiders now depend on them completely, and pay for the privilege."
},
{
"chunk": 134,
"story": 9,
"label": "power_over_you",
"predicament": "A man who got even with his tormentors leaves them knowing they were had."
},
{
"chunk": 135,
"story": 10,
"label": "strings",
"predicament": "Someone given news that might change their life cannot take it in, while the people around them itch to know."
},
{
"chunk": 136,
"story": 10,
"label": "strings",
"predicament": "Someone who has never had luck is told of a windfall and is afraid to believe it."
},
{
"chunk": 137,
"story": 10,
"label": "strings",
"predicament": "A man sees a relative come into money and resents that luck never comes his way."
},
{
"chunk": 138,
"story": 10,
"label": "after_your_money",
"predicament": "A man flattered by new friends is told they are really after a relative's money."
},
{
"chunk": 139,
"story": 10,
"label": "after_your_money",
"predicament": "A man trying to expose flattering suitors trips over his own family's sensibilities."
},
{
"chunk": 140,
"story": 10,
"label": "rival",
"predicament": "Two rivals courting the same person keep topping each other's compliments while the family grows fed up."
},
{
"chunk": 141,
"story": 10,
"label": "rival",
"predicament": "A slow-talking man losing a contest to a glib rival looks for a trick instead of better words."
},
{
"chunk": 142,
"story": 10,
"label": "rival",
"predicament": "A man hires someone to spread a false rumour that will drive off his rival, and the hireling drives a hard bargain."
},
{
"chunk": 143,
"story": 10,
"label": "your_scheme",
"predicament": "A man courting for money pretends not to care about it and flatters the one he courts by letting her win."
},
{
"chunk": 144,
"story": 10,
"label": "your_scheme",
"predicament": "A schemer who thinks his deal is done walks away gloating too soon."
},
{
"chunk": 145,
"story": 10,
"label": "your_scheme",
"predicament": "A man makes a public show of selfless devotion, sure that it will cost him nothing."
},
{
"chunk": 146,
"story": 10,
"label": "your_scheme",
"predicament": "A schemer whose plan has worked is thanked for his goodness while the ground starts to shift under him."
},
{
"chunk": 147,
"story": 10,
"label": "your_scheme",
"predicament": "A man who faked a disaster to win a prize learns the disaster is real, and he is bound to his promise."
},
{
"chunk": 148,
"story": 11,
"label": "pretence",
"predicament": "A sceptic among believers is pressed to admit whether he has ever seen anything he could not explain."
},
{
"chunk": 149,
"story": 11,
"label": "newcomer",
"predicament": "A young man who arrived to find no one expecting him has to fill empty days in a strange place."
},
{
"chunk": 150,
"story": 11,
"label": "newcomer",
"predicament": "A traveller lost in the dark and the cold must find shelter before night closes in."
},
{
"chunk": 151,
"story": 11,
"label": "dread",
"predicament": "A worn-out traveller must choose between a long walk on and a nearby shelter he has been warned against."
},
{
"chunk": 152,
"story": 11,
"label": "dread",
"predicament": "A stranger taken in by odd hosts who seem keen to keep him wonders whether he has walked into a trap."
},
{
"chunk": 153,
"story": 11,
"label": "dread",
"predicament": "A guest must sit down in the dark with someone he cannot see, on hosts' terms he does not understand."
},
{
"chunk": 154,
"story": 11,
"label": "dread",
"predicament": "A guest left alone with a stranger he cannot see grows afraid, and must decide whether to trust his hosts."
},
{
"chunk": 155,
"story": 11,
"label": "dread",
"predicament": "A frightened man sees what he feared, and learns it is someone who was hurt and ashamed to be seen."
},
{
"chunk": 156,
"story": 11,
"label": "owning_up",
"predicament": "A man who shrank from someone must make amends, and finds they deserve his respect."
}
]
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,36 @@
Pilot, qwen3:14b, shortlist k=8, 14B predicaments, O. Henry scenes 0-39. The output file was later deleted;
these figures were copied by hand from the session transcript (score.py output):
situated? precision 38% recall 93% (model calls 34, hand 14)
label right where both situated: 23% of 13
kappa over all labels incl. none: 0.09
embedding-only baseline (nearest entry) on hand-situated scenes: 36%
hand label inside the shortlist offered: 71%
ohenry-q14-dev1.partial: 30 scenes
situated? precision 67% recall 100% (model calls 21, hand 14)
label right where both situated: 14% of 14
kappa over all labels incl. none: 0.23
ohenry-q14-dev1.partial fit>=3: 30 scenes
situated? precision 62% recall 57% (model calls 13, hand 14)
label right where both situated: 0% of 8
kappa over all labels incl. none: 0.09
6 hand=none model=unspoken fit=3 | Someone and the narrator sit in silence, caught between the quiet intimacy of the moment and the unspoken weig
9 hand=home_unseen model=home_unseen fit=2 | Someone longs for connection but is trapped in a life of monotony and shallow conversation.
10 hand=none model=caught_out fit=3 | A man tries to pay for a purchase with a promise of future money, but his dishonesty sparks a violent confront
11 hand=none model=caught_out fit=2 | A man flees from police pursuit, seeking refuge in an unknown vehicle that offers him a chance to escape, but
12 hand=none model=their_secret fit=3 | A man finds himself unexpectedly drawn into a personal conflict he did not ask for, yet must navigate with cou
13 hand=none model=owning_up fit=3 | Someone must confront a man who has wronged a woman he now feels compelled to protect, risking his own safety
14 hand=none model=compromise_for_money fit=2 | A man struggles to reconcile his growing affection for a woman with the rigid expectations of his social circl
16 hand=station model=compromise_for_money fit=2 | A man finds himself trapped in an awkward encounter with a shopgirl whose icy beauty challenges his composure,
17 hand=station model=pretence fit=2 | A man struggling with his pride and social conventions finds himself awkwardly drawn to a shopgirl, determined
18 hand=station model=compromise_for_money fit=2 | A young woman balances between curiosity and caution as she agrees to meet a man she barely knows, hoping to e
19 hand=station model=unspoken fit=3 | A man torn between his growing feelings for a woman he barely knows and his fear of losing control of his life
20 hand=station model=pretence fit=3 | A man insists a woman marry him, claiming his wealth and status make them equal, but she sees through his word
21 hand=station model=strings fit=2 | A man tries to convince a hesitant woman to leave her mundane life and embark on an extravagant, uncertain jou
22 hand=station model=pretence fit=3 | A woman hides her growing feelings for a man while pretending to be uninterested, hoping to keep their connect
23 hand=none model=hiding_from_close fit=3 | Big someone must navigate the rigid codes of his underground world while seeking a way to break free and claim
24 hand=home_unseen model=home_unseen fit=2 | A man struggles to balance his cultural identity and personal life while navigating the expectations of his co
25 hand=home_unseen model=habit fit=3 | A man accustomed to routine is confronted with an unexpected request for companionship, forcing him to reconsi
26 hand=home_unseen model=hiding_from_close fit=3 | A man struggling to reconcile his desire to display his wife publicly with his fear of judgment finds himself
27 hand=home_unseen model=what_they_hid fit=3 | A man struggles to reconcile his pride with the growing awareness of his wife's hidden talents and the shame o
28 hand=home_unseen model=hiding_from_close fit=3 | A man struggles to reconcile his quiet life with the sudden, overwhelming attention his wife receives, threate
29 hand=home_unseen model=peace_at_home fit=3 | A man faces a choice between social obligation and personal pride, seeking to assert his dignity while preserv
@@ -0,0 +1,68 @@
== ohenry: 97 stories, 839 scenes; rule: >= 5 scenes, >= 4 stories, no story over 50%
scenes labelled: 475 (57%)
PASS pretence 52 scenes 12 stories top story 15%
PASS benefactor 48 scenes 14 stories top story 17%
PASS home_unseen 47 scenes 11 stories top story 15%
PASS station 47 scenes 10 stories top story 17%
PASS compromise_for_money 38 scenes 13 stories top story 18%
PASS newcomer 32 scenes 8 stories top story 22%
PASS sure_thing 30 scenes 7 stories top story 23%
PASS sacrifice 25 scenes 8 stories top story 28%
PASS rival 24 scenes 6 stories top story 29%
PASS despised 20 scenes 7 stories top story 30%
PASS pressed_to_wrong 19 scenes 5 stories top story 32%
PASS wrongly_judged 19 scenes 7 stories top story 26%
PASS sign 17 scenes 5 stories top story 35%
strings 15 scenes 4 stories top story 53%
PASS unspoken 13 scenes 4 stories top story 38%
overlooked 9 scenes 3 stories top story 67%
PASS homecoming 8 scenes 4 stories top story 50%
PASS patron 8 scenes 4 stories top story 50%
habit 4 scenes 3 stories top story 50%
-> 16 recurring situations of 19 present
== wharton: 10 stories, 262 scenes; rule: >= 5 scenes, >= 3 stories, no story over 50%
scenes labelled: 129 (49%)
PASS caught_out 12 scenes 4 stories top story 50%
PASS compromise_for_money 12 scenes 4 stories top story 50%
PASS past_comes_back 12 scenes 3 stories top story 50%
PASS what_they_hid 10 scenes 6 stories top story 20%
PASS peace_at_home 8 scenes 5 stories top story 38%
PASS newcomer 8 scenes 3 stories top story 50%
PASS rival 8 scenes 4 stories top story 50%
PASS power_over_you 8 scenes 4 stories top story 50%
PASS sacrifice 8 scenes 5 stories top story 38%
PASS owning_up 8 scenes 4 stories top story 38%
PASS home_unseen 7 scenes 4 stories top story 43%
PASS go_between 6 scenes 3 stories top story 50%
PASS waiting 6 scenes 3 stories top story 50%
PASS own_words_back 6 scenes 3 stories top story 50%
PASS strings 5 scenes 4 stories top story 40%
PASS their_secret 5 scenes 3 stories top story 40%
-> 16 recurring situations of 16 present
== jacobs: 12 stories, 157 scenes; rule: >= 5 scenes, >= 3 stories, no story over 50%
scenes labelled: 137 (87%)
PASS your_scheme 23 scenes 8 stories top story 39%
PASS dread 12 scenes 4 stories top story 42%
rival 11 scenes 3 stories top story 55%
power_over_you 11 scenes 3 stories top story 82%
hiding_from_close 10 scenes 2 stories top story 80%
PASS caught_out 10 scenes 5 stories top story 40%
PASS let_another_take_blame 8 scenes 5 stories top story 50%
strings 8 scenes 2 stories top story 62%
past_comes_back 8 scenes 3 stories top story 62%
peace_at_home 5 scenes 2 stories top story 60%
PASS pressed_to_wrong 5 scenes 4 stories top story 40%
after_your_money 5 scenes 2 stories top story 60%
PASS cant_prove_it 5 scenes 3 stories top story 40%
pretence 5 scenes 2 stories top story 80%
unwelcome_in_home 4 scenes 3 stories top story 50%
newcomer 4 scenes 2 stories top story 50%
owning_up 3 scenes 2 stories top story 67%
-> 6 recurring situations of 17 present
== catalogue coverage: entries found in 3 / 2 / 1 corpora
3: rival, strings, newcomer
2: compromise_for_money, past_comes_back, pretence, caught_out, home_unseen, peace_at_home, power_over_you, pressed_to_wrong, sacrifice, owning_up
1: sure_thing, your_scheme, after_your_money, hiding_from_close, their_secret, what_they_hid, wrongly_judged, let_another_take_blame, cant_prove_it, station, unwelcome_in_home, benefactor, patron, go_between, own_words_back, homecoming, dread, waiting, unspoken, overlooked, sign, despised, habit
@@ -0,0 +1,70 @@
"""Score classifier output against the hand labels. No inference.
python3 score.py out/ohenry-q14.json [more files] # or --selftest
Reports: (1) does it find the situated scenes (label vs none); (2) on scenes both call situated, is the
label right; (3) Cohen's kappa over everything; (4) the embedding-only baseline (nearest entry, no
model) on the same scenes; (5) the recurring situations a pack would get under the one shared rule,
from the model's labels against the hand labels. The recall of the K-nearest shortlist is reported
too: a hand label that was never offered cannot be chosen.
"""
import collections, json, pathlib, random, sys
HERE = pathlib.Path(__file__).resolve().parent
sys.path.insert(0, str(HERE))
from catalogue_src import recurs, load_corpus
def kappa(a, b):
n = len(a); po = sum(x == y for x, y in zip(a, b)) / n
ca, cb = collections.Counter(a), collections.Counter(b)
pe = sum(ca[k] * cb[k] for k in ca) / n / n
return (po - pe) / (1 - pe) if pe < 1 else 1.0
def score(corpus, hand, pred, nearest=None, cands=None, name=''):
chunks = sorted(pred)
h = [hand[c] for c in chunks]; p = [pred[c] for c in chunks]
tp = sum(x != 'none' and y != 'none' for x, y in zip(h, p))
prec = tp / max(1, sum(y != 'none' for y in p)); rec = tp / max(1, sum(x != 'none' for x in h))
both = [(x, y) for x, y in zip(h, p) if x != 'none' and y != 'none']
acc = sum(x == y for x, y in both) / max(1, len(both))
lines = [f'{name}: {len(chunks)} scenes',
f' situated? precision {prec:.0%} recall {rec:.0%} (model calls {sum(y != "none" for y in p)}, hand {sum(x != "none" for x in h)})',
f' label right where both situated: {acc:.0%} of {len(both)}',
f' kappa over all labels incl. none: {kappa(h, p):.2f}']
if nearest:
sit = [c for c in chunks if hand[c] != 'none']
lines.append(f' embedding-only baseline (nearest entry) on hand-situated scenes: {sum(nearest[c] == hand[c] for c in sit) / max(1, len(sit)):.0%}')
lines.append(f' hand label inside the shortlist offered: {sum(hand[c] in cands[c] for c in sit) / max(1, len(sit)):.0%}')
chunks_all, _, _ = load_corpus(corpus); story = [c['story'] for c in chunks_all]
def passing(lab):
mem = collections.defaultdict(list)
for c, l in lab.items():
if l != 'none': mem[l].append(c)
return {l: m for l, m in mem.items() if recurs(m, story)[0]}
ph = passing({c: hand[c] for c in chunks}); pp = passing({c: pred[c] for c in chunks})
common = set(ph) & set(pp)
lines.append(f' recurring situations: hand {len(ph)}, model {len(pp)}, both {len(common)}')
lines.append(f' model only: {", ".join(sorted(set(pp) - set(ph))) or "-"}')
lines.append(f' hand only: {", ".join(sorted(set(ph) - set(pp))) or "-"}')
for l in sorted(common, key=lambda l: -len(ph[l])):
a, b = set(ph[l]), set(pp[l])
lines.append(f' {l:24s} hand {len(a):3d} model {len(b):3d} overlap {len(a & b):3d} (model precision {len(a & b) / len(b):.0%}, recall {len(a & b) / len(a):.0%})')
return '\n'.join(lines)
if __name__ == '__main__':
out = []
if sys.argv[1:] == ['--selftest']:
lab = json.load(open(HERE / 'labels-ohenry.json'))['labels']; hand = {x['chunk']: x['label'] for x in lab}
out.append(score('ohenry', hand, dict(hand), name='SELFTEST hand vs itself (expect 100% / kappa 1.00)'))
rnd = random.Random(1); ids = sorted(set(hand.values()))
out.append(score('ohenry', hand, {c: rnd.choice(ids) for c in hand}, name='SELFTEST random labels (expect kappa ~0)'))
for f in sys.argv[1:]:
if f.startswith('--'): continue
corpus = pathlib.Path(f).stem.split('-')[0]
lab = json.load(open(HERE / f'labels-{corpus}.json'))['labels']; hand = {x['chunk']: x['label'] for x in lab}
res = json.load(open(f))['results']
minfit = int(next((a.split('=')[1] for a in sys.argv if a.startswith('--minfit=')), 0))
rng = next((a.split('=')[1] for a in sys.argv if a.startswith('--range=')), None)
if rng: lo, hi = map(int, rng.split(':')); res = [r for r in res if lo <= r['chunk'] < hi]
pred = {r['chunk']: (r['label'] if (r.get('fit') or 3) >= minfit else 'none') for r in res}
out.append(score(corpus, hand, pred, {r['chunk']: r['nearest'] for r in res}, {r['chunk']: r['candidates'] for r in res}, name=pathlib.Path(f).stem + (f' fit>={minfit}' if minfit else '') + (f' scenes {rng}' if rng else '')))
print('\n\n'.join(out))
+138
View File
@@ -0,0 +1,138 @@
"""A reading page for regrouped predicaments: does each group read as one predicament?
cd v2 && python3 ../groups_page.py predicament_embeddings.json predicaments_clean.json > groups-k60-s24.html
Clusters the embeddings at k = 60, seed 24 (the seed the first review used, kept apart from the
measurement seeds 11-13), keeps the candidate groups (at least 5 scenes, 4 stories, no story over 40%),
and lists them most cohesive first. Each scene shows its predicament sentence, the scene's original
summary underneath, and its story. The reviewer marks each group: one predicament, a few mixed, or not
a predicament, with an optional name and note. Marks are kept in the browser and saved as a JSON file.
Naming a kept group ("A ___ wants ___ from ___") is left for the full review page, once groups read well.
No inference.
"""
import collections, html, json, pathlib, re, sys
from topic_words import TOPIC_WORDS
emb_path, text_path = sys.argv[1], sys.argv[2]
K, SEED = 60, 24
sys.argv = ['measure.py', emb_path]
exec(pathlib.Path(__file__).with_name('measure.py').read_text(encoding='utf-8').split("print(f'{path.name}")[0])
# now defined: chunks, V, n, story, kmeans, describe, MIN_SIZE, MIN_STORIES, MAX_DOMINANT
pred = {x['chunk']: x['summary'] for x in json.loads(pathlib.Path(text_path).read_text(encoding='utf-8'))['summaries']}
orig = {x['chunk']: x['summary'] for x in
json.loads(pathlib.Path('summaries_clean.json').read_text(encoding='utf-8'))['summaries']}
def cross_story_cohesion(group):
tot = cnt = 0
for a in group:
for b in group:
if a < b and story[a] != story[b]:
tot += sum(x * y for x, y in zip(V[a], V[b])); cnt += 1
return tot / cnt if cnt else 0.0
groups = []
for g in kmeans(K, SEED):
size, nst, dom, _ = describe(g)
if size < MIN_SIZE or nst < MIN_STORIES or dom > MAX_DOMINANT:
continue
topics = collections.Counter(w for i in g for w in set(re.findall(r"[a-zé]+", orig.get(i, '').lower())) & TOPIC_WORDS)
word, hits = topics.most_common(1)[0] if topics else ('-', 0)
groups.append({'members': g, 'stories': nst, 'cohesion': cross_story_cohesion(g), 'topic': (word, hits / size)})
groups.sort(key=lambda x: -x['cohesion'])
run = f'{pathlib.Path(emb_path).stem}-k{K}-s{SEED}'
sections = []
for gi, grp in enumerate(groups, 1):
rows = ''.join(
f'<li><span class="p">{html.escape(pred.get(i, ""))}</span>'
f'<span class="o">{html.escape(orig.get(i, ""))}</span>'
f'<span class="t">{html.escape(chunks[i]["title"].title())}</span></li>'
for i in grp['members'])
word, share = grp['topic']
sections.append(f'''<section id="g{gi}" data-g="{gi}">
<h2>Group {gi}</h2>
<p class="meta">{len(grp["members"])} scenes from {grp["stories"]} stories · cohesion {grp["cohesion"]:.3f} ·
most common job, relationship or place word in the original summaries: <b>{html.escape(word)}</b>, {share:.0%} of scenes</p>
<ol>{rows}</ol>
<div class="verdict">
<label><input type="radio" name="v{gi}" value="one"> One predicament</label>
<label><input type="radio" name="v{gi}" value="mixed"> Two or three mixed together</label>
<label><input type="radio" name="v{gi}" value="none"> Not a predicament</label>
<input type="text" class="name" data-g="{gi}" placeholder="Short name, if it is one (optional)" maxlength="80">
<input type="text" class="note" data-g="{gi}" placeholder="Note (optional)" maxlength="300">
</div></section>''')
index = ''.join(f'<a href="#g{i}" data-g="{i}">{i}</a>' for i in range(1, len(groups) + 1))
data = json.dumps({'run': run, 'groups': [{'group': i, 'chunks': grp['members']} for i, grp in enumerate(groups, 1)]})
print(f'''<!doctype html><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>Predicament groups</title>
<style>
:root{{--bg:#f7f6f2;--card:#fff;--ink:#222;--dim:#666;--line:#ddd;--one:#dff0e3;--mixed:#fdf1d6;--none:#f6dede;--accent:#2f6f4f}}
@media (prefers-color-scheme:dark){{:root{{--bg:#1b1b1d;--card:#252528;--ink:#e6e6e6;--dim:#9a9a9a;--line:#3a3a3e;--one:#233d2a;--mixed:#443a1c;--none:#472828;--accent:#7cc39c}}}}
body{{background:var(--bg);color:var(--ink);font:15px/1.5 system-ui,sans-serif;margin:0;padding:24px 16px}}
main{{max-width:900px;margin:auto}} h1{{margin:0 0 6px}} .dim,.meta{{color:var(--dim)}} .meta{{font-size:13px;margin:0 0 8px}}
#bar{{position:sticky;top:0;background:var(--bg);border-bottom:1px solid var(--line);padding:8px 0;z-index:1}}
#index{{display:flex;flex-wrap:wrap;gap:4px;margin-top:6px}}
#index a{{min-width:26px;text-align:center;font-size:12px;border:1px solid var(--line);border-radius:4px;color:var(--ink);text-decoration:none;padding:1px 3px}}
#index a.one{{background:var(--one)}} #index a.mixed{{background:var(--mixed)}} #index a.none{{background:var(--none)}}
button{{font:inherit;padding:4px 12px;border-radius:6px;border:1px solid var(--accent);background:var(--accent);color:var(--bg);cursor:pointer}}
section{{background:var(--card);border:1px solid var(--line);border-radius:8px;padding:12px 16px;margin:16px 0}}
section.one{{border-left:6px solid #3a9a63}} section.mixed{{border-left:6px solid #c9962b}} section.none{{border-left:6px solid #c45050}}
h2{{margin:0 0 2px;font-size:18px}} ol{{padding-left:22px;margin:6px 0}} li{{margin:0 0 8px}}
.p{{display:block}} .o{{display:block;font-size:13px;color:var(--dim)}} .t{{display:block;font-size:12px;color:var(--dim);font-style:italic}}
.verdict{{display:flex;flex-wrap:wrap;gap:6px 14px;align-items:center;border-top:1px solid var(--line);padding-top:8px}}
.verdict input[type=text]{{flex:1 1 220px;min-width:0;font:inherit;padding:4px 6px;border:1px solid var(--line);border-radius:4px;background:var(--bg);color:var(--ink)}}
</style>
<main>
<h1>Predicament groups</h1>
<p class="dim">Every scene was re-described as its main person's predicament and the scenes were regrouped by
those sentences. Each line below is one scene: its predicament, the scene's original summary under it, and
its story. Read a group and mark whether most of its scenes are <b>one predicament</b> (the same kind of
trouble, and wanting the same kind of way out), <b>two or three mixed together</b>, or <b>not a
predicament</b> (held together by wording, a topic, or nothing). Most cohesive groups first; the first ten
or so are enough to judge. Marks save in this browser as you go; "Save marks" downloads them for the program.</p>
<div id="bar"><span id="tally"></span> <button id="save">Save marks</button><div id="index">{index}</div></div>
{"".join(sections)}
</main>
<script>
const DATA={data.replace("</", "<\\\\/")};
const KEY='stp-groups:'+DATA.run;
let marks={{}}; try{{marks=JSON.parse(localStorage.getItem(KEY)||'{{}}')}}catch(e){{}}
function mark(g){{return marks[g]||(marks[g]={{verdict:'',name:'',note:''}})}}
function paint(){{
const c={{one:0,mixed:0,none:0}};
for(const {{group:g}} of DATA.groups){{
const m=marks[g]||{{}}, v=m.verdict||'';
if(v) c[v]++;
document.getElementById('g'+g).className=v;
document.querySelector(`#index a[data-g="${{g}}"]`).className=v;
}}
const done=c.one+c.mixed+c.none;
document.getElementById('tally').textContent=`Marked ${{done}} of ${{DATA.groups.length}}: one predicament ${{c.one}}, mixed ${{c.mixed}}, not ${{c.none}}`;
}}
function store(){{try{{localStorage.setItem(KEY,JSON.stringify(marks))}}catch(e){{}} paint()}}
for(const [g,m] of Object.entries(marks)){{
const r=document.querySelector(`input[name="v${{g}}"][value="${{m.verdict}}"]`); if(r) r.checked=true;
const n=document.querySelector(`.name[data-g="${{g}}"]`); if(n) n.value=m.name||'';
const t=document.querySelector(`.note[data-g="${{g}}"]`); if(t) t.value=m.note||'';
}}
document.addEventListener('change',e=>{{
if(e.target.type==='radio'){{mark(e.target.name.slice(1)).verdict=e.target.value; store()}}
}});
document.addEventListener('input',e=>{{
const g=e.target.dataset.g; if(!g) return;
mark(g)[e.target.classList.contains('name')?'name':'note']=e.target.value; store();
}});
document.getElementById('save').onclick=()=>{{
const out={{run:DATA.run,saved:new Date().toISOString(),groups:DATA.groups.map(x=>({{...x,...(marks[x.group]||{{verdict:'',name:'',note:''}})}}))}};
const a=document.createElement('a');
a.href=URL.createObjectURL(new Blob([JSON.stringify(out,null,1)],{{type:'application/json'}}));
a.download=`groups-marks-${{DATA.run}}.json`; a.click(); URL.revokeObjectURL(a.href);
}};
paint();
</script>''')
@@ -0,0 +1,43 @@
# Jacobs reference set: *The Lady of the Barge* (1902)
A hand-made comparison baseline for the story-to-pack pipeline, the Jacobs twin of the O. Henry
reference in `../v2/claude/`. Every summary, predicament, group and option here was written by
Claude reading the scenes. **No local inference was used.** Compare the local-model runs against it.
Do not treat it as ground truth: it is one careful reading.
| File | What it is |
| --- | --- |
| `corpus/lady-of-the-barge.html` | Standard Ebooks single-page text (public domain) |
| `split_se.py` | → `stories.json` (12 stories, split on `<h2>`) and `chunks.json` (157 scenes, same 320-word paragraph rule as `../chunk.py`) |
| `dump.py` | `python3 dump.py A B` prints scenes A..B for reading |
| `claude/batches/sNN.json` | per story: `{chunk, story, summary, predicament}`, the same schema as `../v2/claude/batches/` |
| `claude/groups_src.py` | the groups, options and per-story protagonist standing |
| `claude/build.py` | checks everything, then writes `claude/records.json` and `claude/groups.json` |
| `claude/page.py` | → `claude/REFERENCE.html`, the readable page |
Rebuild: `python3 split_se.py && cd claude && python3 build.py && python3 page.py`.
## What is in it
- **157 predicaments**: one sentence each (median 19 words, max 24), written to the `redescribe.py`
rules: no names, jobs, places or story-only objects. The `topic_words` leak check flags 23 of 157.
All 23 are role words (rival, partner, guest, neighbour, suitor, newcomer), kept on purpose because
the design's cast is roles.
- **19 groups**, each a situation that recurs in **two or more stories**. Each scene sits in at most
one group: 137 are assigned and 20 fit nothing that recurs.
- **Options**: 3 to 5 per group, 79 in all. 61 come from what someone in a scene did (`scene:N`),
10 are archetypes and 8 fill gaps. **8 scene options cite a scene outside their own group.** That
is looser than DESIGN.md's "drawn from other scenes in the cluster", and `groups.json` marks each
one `in_group: false`.
- **Moves**: spine paths with a direction only (`+`, `-`, `risk`, `set`). There are no magnitudes,
as the design requires. Skill labels proposed for this corpus: `nerve` and `cunning`.
- **Stage** comes from protagonist standing, judged **per story, not per scene**. That is the
coarsest judgement in the set, recorded in `STANDING` in `groups_src.py`.
## How this corpus differs from O. Henry
It is small, 12 stories against 97. It also mixes registers: comic waterfront and village yarns,
plus four horror or crime stories (*The Monkey's Paw*, *The Well*, *In the Library*,
*Captain Rogers*). So several groups straddle the two registers. G09 "Your scheme turns on you"
holds both a comic fake-drowning and a murderer caught out. A tool that groups by register or
mood, rather than by predicament, should split them.
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,86 @@
[
{
"chunk": 0,
"story": 0,
"summary": "A skipper waiting up for his late-returning mate and brother-in-law has just lost a shouted argument with a neighbouring crew; the mate arrives and answers his rebuke with cheek.",
"predicament": "Someone waiting up for a relative who comes in late wants to reproach him, and gets cheek back."
},
{
"chunk": 1,
"story": 0,
"summary": "The mate tells the skipper he has invited his sweetheart on the voyage without asking; the skipper is appalled and asks what his wife will say.",
"predicament": "A man learns a relative has promised a stranger his hospitality without asking, and fears what his spouse will say."
},
{
"chunk": 2,
"story": 0,
"summary": "The skipper tries to refuse the young woman passage but cannot bring himself to say so, and ends up eating supper with the couple.",
"predicament": "A man who wants to turn an unwelcome guest away cannot find the nerve to say it."
},
{
"chunk": 3,
"story": 0,
"summary": "The girl balks at her cramped quarters but stays; the skipper warns that his wife will blame him, and the mate says his sister can mind her own business.",
"predicament": "A man who has let something happen under his roof fears his spouse will hold him responsible for it."
},
{
"chunk": 4,
"story": 0,
"summary": "The skipper insists on chaperoning the girl at meals himself, leaving the mate to steer and eat cold leftovers while she laughs at the skipper's stories.",
"predicament": "A young man who brought the person he is courting along is pushed aside by an older man who takes charge of her."
},
{
"chunk": 5,
"story": 0,
"summary": "Jealous, the mate hints at the skipper's wife, is mocked by the pair, is rude to the girl, and is sent away.",
"predicament": "A jealous suitor tries to put his rival in his place, and only makes himself look childish."
},
{
"chunk": 6,
"story": 0,
"summary": "The girl snubs the mate as 'only the mate'; he turns the tables by threatening to let the skipper explain her presence to his wife alone.",
"predicament": "A spurned man realises he holds something over the rival who humiliated him, and decides to use it."
},
{
"chunk": 7,
"story": 0,
"summary": "The mate refuses to back the skipper's story; the skipper hides the girl below as they arrive to find his wife waiting on the quay.",
"predicament": "A man hiding an innocent but compromising secret is met by his spouse, while the one person who could clear him refuses to."
},
{
"chunk": 8,
"story": 0,
"summary": "The mate pulls meaningful faces behind the skipper's back until the wife grows suspicious; the skipper invents a toothache and tries to steer her away.",
"predicament": "A man tries to hurry his spouse away from a secret while someone signals behind his back that something is up."
},
{
"chunk": 9,
"story": 0,
"summary": "The wife stamps her foot, the hidden girl appears, and the mate lets his brother-in-law take the blame while pretending to shield him.",
"predicament": "A man caught with an innocent secret is disowned by the one person who could explain it."
},
{
"chunk": 10,
"story": 0,
"summary": "The wife abuses the girl, knocks her purse into the water, and orders her off; the mate, now remorseful, takes responsibility and defends her.",
"predicament": "A man whose spite has got an innocent person abused must decide whether to own up and defend her."
},
{
"chunk": 11,
"story": 0,
"summary": "The mate dives repeatedly for the purse to win the girl back; she begs him to come out but refuses to make up.",
"predicament": "A man tries to win back someone he wronged with a dangerous public show of devotion."
},
{
"chunk": 12,
"story": 0,
"summary": "The mate fakes drowning; the skipper rescues him, sees him wink while the girl kisses him, and the wife boxes his ears.",
"predicament": "A man pretends to be in danger to win sympathy, and the one who saved him sees through it."
},
{
"chunk": 13,
"story": 0,
"summary": "The wife takes the girl home to breakfast, leaving both men soaked, while the skipper fends off the mate's apologies with a boathook.",
"predicament": "Two men who quarrelled over a woman are both left out in the cold by the women they wronged."
}
]
@@ -0,0 +1,15 @@
[
{"chunk":14,"story":1,"summary":"An old man losing at chess to his son grumbles at the weather and their remote house while waiting for a guest, who arrives: an old friend back from long service abroad.","predicament":"A man losing a friendly contest tries to distract from his mistake, and is caught at it by his family."},
{"chunk":15,"story":1,"summary":"Warmed by whisky, the guest tells tales of distant lands; pressed by his host, he reluctantly produces a dried monkey's paw he calls magic.","predicament":"A guest who wants to leave a dangerous subject alone is coaxed by his hosts' curiosity into bringing it out."},
{"chunk":16,"story":1,"summary":"The guest explains the paw grants three men three wishes each, that he has had his, and that the last owner wished for death; asked if he would wish again, he wavers.","predicament":"Someone offered a thing that grants wishes is warned by the man who used it that it brings sorrow."},
{"chunk":17,"story":1,"summary":"The guest throws the paw on the fire; the host snatches it back and keeps it despite repeated warnings to wish sensibly or not at all.","predicament":"A man is offered a dangerous gift by someone who begs him to destroy it, and wants to keep it anyway."},
{"chunk":18,"story":1,"summary":"Egged on by his joking son, the old man wishes for two hundred pounds to clear the house; the paw twists in his hand, but no money appears.","predicament":"A man half-believing in a promise of easy money must decide whether to test it and what to ask for."},
{"chunk":19,"story":1,"summary":"An uneasy night passes; in the morning the family laugh off their fears, though the father recalls that the wishes come true in ways that look like coincidence.","predicament":"A family that tempted fate laughs off their fears in daylight while one of them cannot shake them."},
{"chunk":20,"story":1,"summary":"The son leaves for work; later the mother, half-hoping for money, sees a well-dressed stranger hesitate several times at the gate before coming in.","predicament":"A family waiting on a hoped-for windfall sees a stranger approach who might bring it, or bad news."},
{"chunk":21,"story":1,"summary":"The stranger, from the son's employers, tells the parents their only son has been killed in the machinery.","predicament":"Parents receive news that their only child has been killed, from someone who cannot bring himself to say it."},
{"chunk":22,"story":1,"summary":"The firm denies liability but offers compensation of exactly two hundred pounds; the father collapses. They bury their son and sink into silent grief.","predicament":"A man learns the money he wished for has come as compensation for his child's death."},
{"chunk":23,"story":1,"summary":"A week later the grieving mother remembers the paw's other two wishes and demands that her husband wish their son alive; he calls it madness.","predicament":"A grieving woman seizes on a desperate chance to undo a death, and her spouse is afraid of what it would bring back."},
{"chunk":24,"story":1,"summary":"The father tells her their son was mutilated beyond recognition, but she insists; terrified, he fetches the paw and makes the second wish.","predicament":"A man pressed by his grieving spouse must decide whether to do something he believes is wicked and dangerous."},
{"chunk":25,"story":1,"summary":"Nothing seems to happen; then a stealthy knock comes at the door, and the mother cries that it is their son while the father holds her back.","predicament":"A man who dreads what his wish may bring home must stop his spouse from opening the door to it."},
{"chunk":26,"story":1,"summary":"The mother breaks free and struggles with the bolt; the father finds the paw and makes the third wish, and the door opens on an empty road.","predicament":"A man must use his last chance to undo what his spouse most longs for, before she lets it in."}
]
@@ -0,0 +1,16 @@
[
{"chunk":27,"story":2,"summary":"An old watchman recalls a shipmate, an aged miser worth six hundred pounds, who fell ill a month out on the voyage home.","predicament":"A man who has hoarded his savings all his life falls ill far from anywhere he could spend them."},
{"chunk":28,"story":2,"summary":"The dying miser refuses to believe he is dying and leave his money; his shipmates circle hopefully, and one finds a money belt on him and guesses his plan to be buried with it.","predicament":"A dying miser, surrounded by people hoping to inherit, is determined that nobody will get his money."},
{"chunk":29,"story":2,"summary":"The miser dies boasting that he had a boy throw his banknotes overboard; one sailor scares the boy into silence, and the narrator threatens to tell unless let in on the scheme.","predicament":"Someone who spots a colleague quietly scheming to take unclaimed money must decide whether to expose him or join in."},
{"chunk":30,"story":2,"summary":"The schemer reveals he thinks the boy kept the money; the two agree to split it, and search the boy's bunk and pockets at night without success.","predicament":"Two partners convinced a weaker person is secretly holding a fortune want to find it before anyone else learns of it."},
{"chunk":31,"story":2,"summary":"A night search is foiled when a ticklish shipmate wakes screaming; a week of prodding the boy finds nothing, so they corner him and demand the money outright.","predicament":"A schemer whose secret searches keep failing decides to confront the person he suspects directly."},
{"chunk":32,"story":2,"summary":"The boy insists he threw the money overboard; they search him, offer him a third, then threaten to have him searched ashore and jailed.","predicament":"Someone suspected of hiding a windfall is pressed with bribes and threats by people who have no right to it."},
{"chunk":33,"story":2,"summary":"When the sailor heads to tell the captain, the boy gives in: he kept the money but, frightened by the searches, hid it in an officer's mattress where he cannot now reach it.","predicament":"Someone forced to share a hidden windfall admits it is now stuck where neither partner can get at it."},
{"chunk":34,"story":2,"summary":"Neither the man nor the boy can get aft unseen, the officer sleeps on the money every night, and the two partners blame each other.","predicament":"Distrustful partners stare at a fortune they cannot reach without getting caught, and blame each other for it."},
{"chunk":35,"story":2,"summary":"The boy proposes the man fake an accident to get quartered aft; the man refuses and secretly flatters the officer, asking to buy his mattress as a keepsake.","predicament":"A man wants something a superior owns without revealing why, and tries flattery to get it."},
{"chunk":36,"story":2,"summary":"The officer plays up the mattress's value and the sailor, afraid to seem eager, settles at two pounds, to be handed over ashore.","predicament":"A buyer who cannot reveal why he wants something is made to pay more by a seller who senses his eagerness."},
{"chunk":37,"story":2,"summary":"The sailor now plans to cut the boy out and split with the narrator alone, but the suspicious boy shadows him all the way into port.","predicament":"A man who wants to cheat his partner out of a shared prize is watched too closely to slip away."},
{"chunk":38,"story":2,"summary":"The officer delays the hand-over with a long speech until the boy arrives, sees the sack, and refuses to let them leave without his share.","predicament":"A man trying to slip away with a shared prize is held up until the partner he meant to cheat catches him."},
{"chunk":39,"story":2,"summary":"The boy stays on deck while the men cut the mattress open below; it is empty, and when they come up the boy has vanished.","predicament":"A man who schemed to cheat a partner finds the prize gone and realises he may have been cheated himself."},
{"chunk":40,"story":2,"summary":"The boy never returns, not even for his pay, and the officer smilingly asks the sailor how he slept.","predicament":"A schemer who was outwitted must stand and smile at the people who got the better of him."}
]
@@ -0,0 +1,16 @@
[
{"chunk":41,"story":3,"summary":"A rich man soon to marry sits with his idle, indebted cousin, who needles him about his wealth and his fiancée's goodness.","predicament":"A man about to marry is needled by a dependent relative who hints at something to his discredit."},
{"chunk":42,"story":3,"summary":"The cousin hints that the fiancée would drop him if she knew what he really was, then says he needs fifteen hundred pounds within a fortnight or faces prison.","predicament":"A man in desperate debt makes veiled hints to the relative he hopes will pay it."},
{"chunk":43,"story":3,"summary":"Refused, the cousin offers to sell compromising old letters, threatening to sell them to a rival suitor; the rich man seizes him and is stopped only by a servant entering.","predicament":"A man is blackmailed by a relative with old letters that could cost him the person he loves."},
{"chunk":44,"story":3,"summary":"The cousin walks out into the park to let him think it over; the rich man follows, and later tells his mother the cousin has gone for good after a quarrel over money.","predicament":"A man who has done something terrible in anger must cover for a relative's sudden disappearance."},
{"chunk":45,"story":3,"summary":"The man walks with his fiancée to a disused well in the park, her favourite spot; he urges her not to sit on its edge.","predicament":"A man with a guilty secret must keep calm while someone he loves insists on lingering right at the spot."},
{"chunk":46,"story":3,"summary":"She asks about the missing cousin and defends him; the man bursts out that the cousin was a blackmailer, a liar and a cur.","predicament":"A man hiding a crime hears it discussed innocently and betrays his feelings with an outburst."},
{"chunk":47,"story":3,"summary":"She is startled by a whisper she imagines saying 'Jem, help me out'; shaken, he tries to take her indoors, but she insists on staying.","predicament":"A guilty man tries to hurry someone away from the scene of his crime, and she insists on staying."},
{"chunk":48,"story":3,"summary":"She drops her mother's diamond bracelet down the well and wants it drained; he looks at her in horror, then covers it by saying he feared she was falling.","predicament":"A man hiding something learns it may be discovered by an innocent accident, and must not show his fear."},
{"chunk":49,"story":3,"summary":"He promises to recover the bracelet himself by morning and makes her swear to tell no one; his mother suggests filling the well in.","predicament":"A man must retrieve something from where his secret lies before anyone else goes looking."},
{"chunk":50,"story":3,"summary":"At night he secretly fishes the well with a line and hook, and dredges up keys instead of the bracelet.","predicament":"A man secretly searching where his crime lies keeps pulling up reminders of it."},
{"chunk":51,"story":3,"summary":"The hook snags; he gives up, spends a sleepless night, and at dawn meets his grooms, whom he has ordered to lower him into the well.","predicament":"A man who has failed to fix things quietly must now involve others while still keeping his secret."},
{"chunk":52,"story":3,"summary":"His groom offers to go down instead, since the master looks ill; he refuses curtly and starts to test the air with a candle.","predicament":"A man hiding something is offered help he cannot accept without being found out."},
{"chunk":53,"story":3,"summary":"The candle is lost; he stops the groom fetching another, strips, and sits a long time on the well's edge before going down.","predicament":"A man who must face the thing he did alone gathers his nerve while others watch and wonder."},
{"chunk":54,"story":3,"summary":"Below, something drags at the rope; the grooms haul up the dead cousin's face with their master behind it, let go in horror, and both fall back into the water.","predicament":"A man who hid a crime is dragged down by it at the moment he tries to undo its consequences."}
]
@@ -0,0 +1,74 @@
[
{
"chunk": 55,
"story": 4,
"summary": "A farmer's wife, her husband, and her retired-policeman uncle discuss a stolen brooch; the uncle has been hiding under their bed hoping to catch the thief, and the wife casts suspicion on a neighbour while accusing her husband of not caring.",
"predicament": "A woman who has lost something valuable suspects the people around her, and resents her spouse for not caring as much."
},
{
"chunk": 56,
"story": 4,
"summary": "The uncle declares everyone guilty until proven innocent; the wife recounts missing the brooch, accusing and sacking her servant, who cried on her box.",
"predicament": "Someone who has lost something accuses the most defenceless person nearby, and punishes her before any proof."
},
{
"chunk": 57,
"story": 4,
"summary": "The servant's box held nothing; the husband defends her and is snapped at, while the uncle, pencil and notebook out, pursues the investigation with great ceremony.",
"predicament": "A man who thinks a household fuss is foolish keeps defending the accused and is scolded for taking her side."
},
{
"chunk": 58,
"story": 4,
"summary": "The husband eats a lozenge from the evidence box and cannot stop laughing; the uncle establishes that no one could have entered the bedroom unheard.",
"predicament": "A man who finds a family inquiry ridiculous cannot keep a straight face in front of its self-important leader."
},
{
"chunk": 59,
"story": 4,
"summary": "Suspicion turns to a widow who visited that morning; the uncle finds muddy footprints on the stairs, which are in fact the husband's, and he stays guiltily quiet.",
"predicament": "A man who sees an innocent neighbour blamed for evidence he himself left must decide whether to own up."
},
{
"chunk": 60,
"story": 4,
"summary": "The husband slyly deflects the footprint evidence, then exchanges silent signals with his wife until the uncle demands to know what is funny.",
"predicament": "A man who knows more than he says can barely hide his amusement from the self-important person running the inquiry."
},
{
"chunk": 61,
"story": 4,
"summary": "The husband reveals he thinks the widow is after the uncle, not the brooch; the uncle is outraged, then proposes inviting her to tea to trap her into confessing.",
"predicament": "A self-important man, teased that a neighbour fancies him, resolves to prove his point by trapping her."
},
{
"chunk": 62,
"story": 4,
"summary": "The husband refuses to have a guest trapped in his house; the uncle secretly tells his niece he will search the widow's cottage without leave.",
"predicament": "A man refuses to let his home be used to entrap a friend, so the schemer plans to go behind his back."
},
{
"chunk": 63,
"story": 4,
"summary": "The husband, who resents the uncle living with them for his wife's hopes of an inheritance, plans to let the widow catch the uncle searching her house, and shadows him.",
"predicament": "A man stuck with an unwelcome relative in his home sees a chance to have him disgraced and driven off."
},
{
"chunk": 64,
"story": 4,
"summary": "The husband brings the widow home early; the uncle, trapped inside, hides in the larder, and the husband settles in for beer and begins praising him.",
"predicament": "A man who has trapped his rival in an embarrassing hiding place decides to make the most of it."
},
{
"chunk": 65,
"story": 4,
"summary": "Within the uncle's hearing, the husband tells the widow the uncle is shy and devoted to her, and has been asking whether she likes jewellery.",
"predicament": "A trapped man must listen in silence while someone tells a neighbour a story about him that he cannot deny."
},
{
"chunk": 66,
"story": 4,
"summary": "Asked for bread and cheese, the widow opens the larder, the uncle bursts out, and her friend takes his hiding there as a bashful suitor's courtship.",
"predicament": "A man caught somewhere he should not be is handed an embarrassing explanation, and has no better one to offer."
}
]
@@ -0,0 +1,15 @@
[
{"chunk":67,"story":5,"summary":"Late at night one co-owner of a house and a business sits hating his partner, who has discovered his embezzlement and ordered him to leave both by morning.","predicament":"A man found out in wrongdoing is ordered by his partner to give up everything and leave by morning."},
{"chunk":68,"story":5,"summary":"The honest partner refuses to cover the theft quietly, offers the exile two hundred pounds, and mentions the servants are away until morning.","predicament":"A man offered a harsh but fair way out of his disgrace wants a quieter bargain the other will not give."},
{"chunk":69,"story":5,"summary":"The exile demands the matter be hushed up, draws a sword from the wall, and stabs his partner when he refuses.","predicament":"A man facing ruin threatens the only person who can expose him, and must choose whether to go through with it."},
{"chunk":70,"story":5,"summary":"Sickened, the killer turns out the lights, flees to the gate, and sees a constable coming up the road.","predicament":"A man who has just done something terrible in rage panics and must steady himself when a figure of the law appears."},
{"chunk":71,"story":5,"summary":"He bids the constable good night, returns inside, and gathers his cash and valuables, reckoning he has eight hours' start.","predicament":"A man with a crime behind him and a few hours' start must decide what to take and where to run."},
{"chunk":72,"story":5,"summary":"He plans his escape, weighing a crowded district against the seaside, and finds every choice may mean life or death.","predicament":"A fugitive planning his escape finds that every choice might be the one that gets him caught."},
{"chunk":73,"story":5,"summary":"At one o'clock he hears creaks on the stairs, and fears the dead man is moving about the house.","predicament":"A man alone with what he has done hears noises in the dark and fears it has come back for him."},
{"chunk":74,"story":5,"summary":"Finding the library door open, he locks someone inside, then realises it is a burglar he can blame for the killing.","predicament":"A guilty man realises a stranger's blunder gives him someone else to blame."},
{"chunk":75,"story":5,"summary":"He fires through the door, raises the alarm, and the police break in and seize the terrified intruder.","predicament":"A man framing an innocent person must act the outraged victim in front of the law."},
{"chunk":76,"story":5,"summary":"The intruder swears the body was there when he arrived; the sergeant uncovers it, and the killer feigns horror.","predicament":"A man must play the shocked innocent while the person he framed pleads the truth."},
{"chunk":77,"story":5,"summary":"The killer names his friend and accuses the intruder, who accuses him back; the sergeant seems to side with the killer.","predicament":"Someone falsely accused points to the real culprit, who must hold his nerve and keep up his story."},
{"chunk":78,"story":5,"summary":"The sergeant takes the pistol, handcuffs the killer without warning, and sends for a doctor, since the victim is not dead.","predicament":"A man who thought he had got away with it learns the one witness who could hang him is still alive."},
{"chunk":79,"story":5,"summary":"The dying partner opens his eyes and speaks; the sergeant takes notes and leads the killer away.","predicament":"A man whose deceit has collapsed can only watch as the truth comes out and he is taken away."}
]
@@ -0,0 +1,86 @@
[
{
"chunk": 80,
"story": 6,
"summary": "A ragged stranger swaggers into the best inn in a small town, bullies the waiter who tries to turn him out, and demands to see the landlord.",
"predicament": "A penniless newcomer forces his way into a place he does not belong, counting on a secret to back him."
},
{
"chunk": 81,
"story": 6,
"summary": "The stranger greets the landlord by another name, a wanted pirate's, and demands clothes, lodging and money in return for silence.",
"predicament": "A man who has built a respectable new life is found by an old associate who threatens to expose his past."
},
{
"chunk": 82,
"story": 6,
"summary": "The landlord gives him money; the blackmailer draws a pistol, declares he will take half of everything from now on, and settles in.",
"predicament": "A man pays off a blackmailer and learns the price will be half of everything, for good."
},
{
"chunk": 83,
"story": 6,
"summary": "The landlord says he has lived honestly for fifteen years and warns the man not to wake the devil in him; the blackmailer meets the landlord's stepdaughter and says he will stay.",
"predicament": "A reformed man warns a blackmailer not to push him too far, while the blackmailer sets his sights on the man's family."
},
{
"chunk": 84,
"story": 6,
"summary": "The blackmailer orders the best supper and room, and sleeps with his door barricaded and a pistol under his pillow.",
"predicament": "A man who has seized power over another knows the danger he is in, and guards himself even as he gloats."
},
{
"chunk": 85,
"story": 6,
"summary": "He pushes in at the family breakfast table, eyes the stepdaughter, hints at the landlord's past before her, and goes out to buy new clothes.",
"predicament": "A household must make polite space for someone who holds them hostage."
},
{
"chunk": 86,
"story": 6,
"summary": "Within a month the blackmailer runs the inn; the landlord, failing in health, backs him in sacking a loyal old servant, and his daughter demands to know who is master.",
"predicament": "Someone watches a person she trusts give way at every turn to an intruder, and demands that he stand up for himself."
},
{
"chunk": 87,
"story": 6,
"summary": "The landlord sides with the blackmailer, who threatens to ruin the girl and have the landlord hanged; the landlord pleads for peace.",
"predicament": "A man who is being blackmailed hears his tormentor threaten someone he loves, and must choose between swallowing it and hitting back."
},
{
"chunk": 88,
"story": 6,
"summary": "The inn decays under the blackmailer's rule; the landlord collapses with a fit, which upsets the blackmailer's plans.",
"predicament": "A blackmailer's hold depends on his victim's life, and that victim suddenly collapses."
},
{
"chunk": 89,
"story": 6,
"summary": "The landlord lies dying, anxious to please the blackmailer, while his daughter nurses him; the blackmailer resolves to get the hidden money before he dies.",
"predicament": "A blackmailer whose victim is dying must grab what he can before his hold disappears."
},
{
"chunk": 90,
"story": 6,
"summary": "The blackmailer threatens to inform; the dying man begs for time and promises to reveal his money that night if his daughter gets a share.",
"predicament": "A dying man pressed by his tormentor bargains for time and for provision for someone he loves."
},
{
"chunk": 91,
"story": 6,
"summary": "At night the blackmailer drugs the nurse and demands the money; the landlord extracts his promise about the daughter.",
"predicament": "A man who thinks his helpless victim is at his mercy leans in close to hear the secret."
},
{
"chunk": 92,
"story": 6,
"summary": "The 'dying' landlord seizes and strangles him, revealing he has been shamming weakness and planning to blame the killing on the blackmailer's own followers.",
"predicament": "A man who pretended to be helpless strikes at the tormentor who threatened his family."
},
{
"chunk": 93,
"story": 6,
"summary": "He stages the scene as a robbery and returns to bed as the drugged nurse unwittingly provides his alibi.",
"predicament": "A man who has done a desperate thing arranges things so that suspicion falls elsewhere."
}
]
@@ -0,0 +1,18 @@
[
{"chunk":94,"story":7,"summary":"An old villager chats with a travelling painter repainting the inn sign, which had been mistaken for a portrait of a king.","predicament":"A craftsman told his work looks like something else quietly fixes it before anyone else notices."},
{"chunk":95,"story":7,"summary":"The painter shares his beer, and the old man begins the tale of a travelling circus that stopped in the village.","predicament":"An old man looking for a free drink offers a story in exchange."},
{"chunk":96,"story":7,"summary":"News comes that the circus tiger has escaped nearby; a tramp comes running to the inn shouting that the tiger is after him, and the drinkers rush indoors.","predicament":"People who laughed at a distant danger panic when it seems to have arrived on their doorstep."},
{"chunk":97,"story":7,"summary":"The landlord bars the door against the tramp; a man knocks the landlord down to get out to protect the families, and the tramp gets in.","predicament":"Someone must choose between keeping himself safe behind a barred door and letting in a stranger in danger."},
{"chunk":98,"story":7,"summary":"The tramp, revived with free brandy, tells a vivid tale of fleeing the tiger, and the men are afraid to go home.","predicament":"A stranger with a thrilling tale of danger is rewarded by a frightened crowd without anyone checking it."},
{"chunk":99,"story":7,"summary":"The men sleep at the inn; the tramp is gone by morning; the village lives in fear, though the local rogue laughs at the whole thing.","predicament":"A community living in fear of an unseen threat ignores the one doubter, because he has a bad name."},
{"chunk":100,"story":7,"summary":"A villager's hens are taken; he carries the evidence to the constable in the next village, who shoves him away as drunk.","predicament":"A man who has suffered a loss goes to the authorities for help and is brushed off as a nuisance."},
{"chunk":101,"story":7,"summary":"Pigs vanish night after night; the authorities do nothing, and neighbours squabble over whether to take animals indoors.","predicament":"A community suffering repeated losses cannot get help, and cannot agree how to protect itself."},
{"chunk":102,"story":7,"summary":"Children claim sightings, and a villager staggers in describing how the tiger chased him up a tree.","predicament":"A man tells a dramatic story of narrow escape to an audience eager to believe it."},
{"chunk":103,"story":7,"summary":"When one man questions the story, the rogue 'confirms' it, claiming he watched from another tree; the storyteller, caught out, goes home silent.","predicament":"A man caught in a boastful lie is 'backed up' by a rival, who now has him trapped by it."},
{"chunk":104,"story":7,"summary":"The neighbouring town and the clergyman say there was no tiger; after more losses a former militiaman raises a band of seventeen to hunt it.","predicament":"People told their fears are nonsense by outsiders decide to take matters into their own hands."},
{"chunk":105,"story":7,"summary":"The hunt searches the wood timidly and finds nothing; back at the inn, an old man reports the tiger has just gone into the rogue's cottage.","predicament":"A band that set out to face a danger returns relieved to have found nothing, and is then called to face it for real."},
{"chunk":106,"story":7,"summary":"The armed men crowd into the rogue's cottage, pushing him ahead of them, despite his protests.","predicament":"A man with something to hide has an armed crowd force its way into his home."},
{"chunk":107,"story":7,"summary":"His kitchen is full of pork and poultry; accused of theft, he brazenly claims to have gone into the meat trade.","predicament":"A man caught with the evidence of his thefts brazens it out and dares his accusers to prove anything."},
{"chunk":108,"story":7,"summary":"He turns their own tiger sightings against them: those who swore they saw it would have to repeat it on oath.","predicament":"A man accused of wrongdoing turns his accusers' own exaggerations into his defence."},
{"chunk":109,"story":7,"summary":"He claims to have receipts, offers to sell them the meat, and gets away with it; he and the tramp turn out to have known each other.","predicament":"People who know they were swindled cannot prove it, and must watch the swindler profit."}
]
@@ -0,0 +1,14 @@
[
{"chunk":110,"story":8,"summary":"A retired officer, dressed with great care, sets out on a hot afternoon and overtakes a friend who stares uneasily at his loud tie.","predicament":"A man nervously setting out to do something that matters to him is stopped by a friend with questions."},
{"chunk":111,"story":8,"summary":"The officer confides he is going to propose to a widow; his friend, equally dressed up, says he is on the same errand, and the two race along the road.","predicament":"A man discovers a friend is after the same person he is, on the same day, and each races to get there first."},
{"chunk":112,"story":8,"summary":"Followed by jeering boys, they stop and agree they cannot propose together, but neither will yield the day, each pleading an excuse.","predicament":"Two rivals agree someone must go first, and neither will be the one to wait."},
{"chunk":113,"story":8,"summary":"Each claims precedence; the officer vows that if they go together he will match any proposal on the spot, and refuses to be put off.","predicament":"Two rivals for the same prize trade claims of priority, and each suspects the other of a trick."},
{"chunk":114,"story":8,"summary":"The officer proposes they play one game of chess for the right to propose first; the friend agrees, on condition that if the winner is refused, the loser may not propose without his permission.","predicament":"Two rivals agree to settle who goes first by a game, and one slips in a condition the other does not examine."},
{"chunk":115,"story":8,"summary":"The officer offers his rival a large brandy, which the rival sets aside; after a long game the rival checkmates him with a bishop the officer had forgotten.","predicament":"A man who tried to tip a contest in his favour loses it through his own oversight."},
{"chunk":116,"story":8,"summary":"The winner tidies himself in the loser's house and goes off to propose; the loser waits up all night and next morning goes to hear the result.","predicament":"A man who lost the right to try first must wait while his rival takes his chance."},
{"chunk":117,"story":8,"summary":"The rival was refused, but holds the officer to the condition and plans to keep proposing until the widow accepts him.","predicament":"A man finds the rival he lost to has been refused, but can still use the terms of their bargain to keep him out."},
{"chunk":118,"story":8,"summary":"The rival says he will warn the widow off the officer, suggests the officer court her companion instead, and the officer storms out and sulks for weeks.","predicament":"A man bound by a promise he made watches a rival use it to keep him from what he wants."},
{"chunk":119,"story":8,"summary":"Meeting the widow by chance, the officer confesses the chess game to explain his absence; she is indignant, then laughs.","predicament":"A man who has been avoiding someone he cares for must explain why, and the only honest answer is embarrassing."},
{"chunk":120,"story":8,"summary":"She says she is angry with him for losing, and proposes a plan so that he can win at cards what he lost at chess, under the rival's eyes.","predicament":"A man bound by a rash promise finds the person he hoped to win is willing to help him get round it."},
{"chunk":121,"story":8,"summary":"Playing cards, the widow asks the officer if he would like her hand; he takes it and kisses it, she 'meant the cards', then lets him keep it, and the rival is left fuming.","predicament":"Someone arranges to accept the suitor she prefers in a way his rival cannot object to."}
]
@@ -0,0 +1,15 @@
[
{"chunk":122,"story":9,"summary":"A man wakes up thirsty in a cramped, reeking bunk, with a stranger's face swearing at him, and cannot tell where he is.","predicament":"A man wakes up somewhere strange with no idea how he got there."},
{"chunk":123,"story":9,"summary":"He realises he is on a ship, dressed in rags; he finds his friend among the sleepers and learns the ship's name.","predicament":"A man in an unknown place looks for his one companion and a first clue to how they came to be there."},
{"chunk":124,"story":9,"summary":"Seasick and far from land, he goes aft and demands to be taken home; the officer calls him mad and orders him forward.","predicament":"A man who has always been obeyed tries to give orders somewhere nobody knows or believes who he is."},
{"chunk":125,"story":9,"summary":"His friend tries to threaten legal consequences but is too sick to finish; the two bicker over which of them was drunk.","predicament":"Two people in trouble together try to put on a united front and end up blaming each other."},
{"chunk":126,"story":9,"summary":"The captain says they signed on as cook and seaman, calls them drunk impostors, and threatens jail; they are put to work.","predicament":"Two people who claim to be respected professionals are treated as impostors and forced to do menial work."},
{"chunk":127,"story":9,"summary":"The crew mocks their claims of being drugged and of sobriety; their airs make the officers dislike them all the more.","predicament":"People brought low insist on their old status, and are mocked for it by those around them."},
{"chunk":128,"story":9,"summary":"The captain humiliates the cook; the cook obeys, tidies the cabin, and comes back with a secret smile and something in his pocket, telling his friend it won't be for long.","predicament":"A humiliated man pretends to submit while he quietly prepares his revenge."},
{"chunk":129,"story":9,"summary":"The captain is struck with violent pains; the cook refuses to treat him, as he 'only shipped as cook', until he agrees to pay a professional fee.","predicament":"A man mocked for claiming skill is suddenly needed for it, and names his price."},
{"chunk":130,"story":9,"summary":"The cook prescribes, collects his fee, scares the captain about making a will, and has the mate sent out for snuffling.","predicament":"A man who has gained the upper hand over those who humiliated him enjoys every moment of it."},
{"chunk":131,"story":9,"summary":"The cook hints he dosed the food from the medicine chest; the mate falls ill too, and the cook demands to be treated as surgeon.","predicament":"A man who has secretly caused the trouble only he can cure makes the most of it."},
{"chunk":132,"story":9,"summary":"The mate haggles over the fee; the second officer falls ill too; the sick captain scolds the sick mate for being ill at all.","predicament":"A man who swore he would never pay the person he scorned is forced by suffering to haggle with him."},
{"chunk":133,"story":9,"summary":"The cook treats and weakens all three officers; the captain and mate pay the other man to draw up their wills; they recover slowly as they reach port.","predicament":"People who scorned two outsiders now depend on them completely, and pay for the privilege."},
{"chunk":134,"story":9,"summary":"Ashore, the cook tells the captain he ate something that disagreed with him, and leaves with a wave.","predicament":"A man who got even with his tormentors leaves them knowing they were had."}
]
@@ -0,0 +1,15 @@
[
{"chunk":135,"story":10,"summary":"At a crowded family breakfast, a poor widow living with her sister's family gets a letter and reads it so slowly that the others nearly burst with impatience.","predicament":"Someone given news that might change their life cannot take it in, while the people around them itch to know."},
{"chunk":136,"story":10,"summary":"The widow fears the letter is a hoax; her brother-in-law thinks so too, until her sister reads it and rejoices.","predicament":"Someone who has never had luck is told of a windfall and is afraid to believe it."},
{"chunk":137,"story":10,"summary":"The widow has inherited two thousand pounds from a former employer; the brother-in-law grumbles that nobody ever left him anything, and spreads the news through the town.","predicament":"A man sees a relative come into money and resents that luck never comes his way."},
{"chunk":138,"story":10,"summary":"Local men suddenly befriend the brother-in-law; his wife points out that two old dealers are courting the heiress for her money.","predicament":"A man flattered by new friends is told they are really after a relative's money."},
{"chunk":139,"story":10,"summary":"The brother-in-law watches the two suitors flatter the widow and tries to undercut them by announcing her age, nearly giving away his wife's.","predicament":"A man trying to expose flattering suitors trips over his own family's sensibilities."},
{"chunk":140,"story":10,"summary":"The suitors outbid each other with compliments; the wife's temper frays, and the visitors are shown out with the door shut hard.","predicament":"Two rivals courting the same person keep topping each other's compliments while the family grows fed up."},
{"chunk":141,"story":10,"summary":"The family, wanting to keep the money, fail to warn the widow; the slow dealer, losing ground to his glib rival, hatches a plan and enlists a small-time dealer.","predicament":"A slow-talking man losing a contest to a glib rival looks for a trick instead of better words."},
{"chunk":142,"story":10,"summary":"The dealer bribes an accomplice, who holds out for a bigger fee, to tell the rival in confidence that the widow has lost her fortune; the rival swallows it.","predicament":"A man hires someone to spread a false rumour that will drive off his rival, and the hireling drives a hard bargain."},
{"chunk":143,"story":10,"summary":"With the rival gone, the dealer courts the widow alone, preaching the virtues of poverty, and loses seven games of draughts to her on purpose.","predicament":"A man courting for money pretends not to care about it and flatters the one he courts by letting her win."},
{"chunk":144,"story":10,"summary":"He blows her kisses and fusses over a bumped head, invites himself back, and walks home sure the money is his.","predicament":"A schemer who thinks his deal is done walks away gloating too soon."},
{"chunk":145,"story":10,"summary":"He spreads the rumour of her ruin through the town, then proposes publicly 'now that she is poor', to look noble.","predicament":"A man makes a public show of selfless devotion, sure that it will cost him nothing."},
{"chunk":146,"story":10,"summary":"She accepts; the family, touched, apologise for misjudging him, then mention a letter that arrived.","predicament":"A schemer whose plan has worked is thanked for his goodness while the ground starts to shift under him."},
{"chunk":147,"story":10,"summary":"The lawyers' letter says a later will was found and she has nothing; the dealer, now engaged to a poor woman, is left alone with her to court.","predicament":"A man who faked a disaster to win a prize learns the disaster is real, and he is bound to his promise."}
]
@@ -0,0 +1,56 @@
[
{
"chunk": 148,
"story": 11,
"summary": "In an inn, men trade ghost stories; a sceptical old sailor mocks sailors' visions, then admits one uncanny experience on land.",
"predicament": "A sceptic among believers is pressed to admit whether he has ever seen anything he could not explain."
},
{
"chunk": 149,
"story": 11,
"summary": "As a young man back from abroad, the narrator found his relatives away, took lodgings at a dull inn, and set out on a long country walk.",
"predicament": "A young man who arrived to find no one expecting him has to fill empty days in a strange place."
},
{
"chunk": 150,
"story": 11,
"summary": "He loses his way in the marshes as fog and night come down, and at last finds a road and hears footsteps.",
"predicament": "A traveller lost in the dark and the cold must find shelter before night closes in."
},
{
"chunk": 151,
"story": 11,
"summary": "A countryman sets him on the road but warns him away from a lit house nearby, said to hide something monstrous; tired, he goes to it anyway.",
"predicament": "A worn-out traveller must choose between a long walk on and a nearby shelter he has been warned against."
},
{
"chunk": 152,
"story": 11,
"summary": "A grim old woman and a huge old man answer; after a furtive exchange the man insists he stay for dinner, and he feels trapped.",
"predicament": "A stranger taken in by odd hosts who seem keen to keep him wonders whether he has walked into a trap."
},
{
"chunk": 153,
"story": 11,
"summary": "The host says his son will dine with them in the dark because of his eyes; he puts out the candles, and a strange voice speaks.",
"predicament": "A guest must sit down in the dark with someone he cannot see, on hosts' terms he does not understand."
},
{
"chunk": 154,
"story": 11,
"summary": "The host leaves him alone with the unseen son, and the guest thinks he sees wild eyes shining at him across the table.",
"predicament": "A guest left alone with a stranger he cannot see grows afraid, and must decide whether to trust his hosts."
},
{
"chunk": 155,
"story": 11,
"summary": "The screen falls, and firelight shows the son's ruined face; the father lights the candles and explains his son was disfigured in a fire.",
"predicament": "A frightened man sees what he feared, and learns it is someone who was hurt and ashamed to be seen."
},
{
"chunk": 156,
"story": 11,
"summary": "The guest apologises warmly; they celebrate the son's birthday until midnight, and the father toasts the children his son saved.",
"predicament": "A man who shrank from someone must make amends, and finds they deserve his respect."
}
]
@@ -0,0 +1,42 @@
#!/usr/bin/env python3
"""Assemble records.json and groups.json from batches/ and groups_src.py, and check them."""
import collections, glob, json, pathlib
from groups_src import G, STANDING
here = pathlib.Path(__file__).parent
chunks = json.loads((here.parent / 'chunks.json').read_text())
stories = json.loads((here.parent / 'stories.json').read_text())
recs = [r for f in sorted(glob.glob(str(here / 'batches/s*.json'))) for r in json.loads(open(f).read())]
assert [r['chunk'] for r in recs] == list(range(len(chunks))), 'every scene, once, in order'
assert all(chunks[r['chunk']]['story'] == r['story'] for r in recs)
seen = collections.Counter(m for g in G for m in g['members'])
dup = [m for m, n in seen.items() if n > 1]
assert not dup, f'scenes in two groups: {dup}'
by = {r['chunk']: r for r in recs}
out = []
for g in G:
assert 3 <= len(g['options']) <= 5, g['id']
st = sorted({by[m]['story'] for m in g['members']})
stand = collections.Counter(STANDING[by[m]['story']] for m in g['members'])
out.append({
'id': g['id'], 'name': g['name'], 'predicament': g['predicament'],
'sentence': f"A {g['actor']} wants {g['wants']} from {g['counterpart']}.",
'actor': g['actor'], 'wants': g['wants'], 'counterpart': g['counterpart'],
'stories': st, 'story_titles': [stories[s]['title'] for s in st],
'standing': dict(stand), 'stage': stand.most_common(1)[0][0],
'members': [{'chunk': m, 'story': by[m]['story'], 'predicament': by[m]['predicament']} for m in g['members']],
'options': [{'text': t, 'source': s, 'moves': mv,
'in_group': (int(s.split(':')[1]) in g['members']) if s.startswith('scene:') else None}
for t, s, mv in g['options']],
})
unassigned = [r['chunk'] for r in recs if r['chunk'] not in seen]
(here / 'records.json').write_text(json.dumps(recs, indent=1, ensure_ascii=False))
(here / 'groups.json').write_text(json.dumps({'groups': out, 'unassigned': unassigned}, indent=1, ensure_ascii=False))
multi = sum(len(g['stories']) >= 2 for g in out)
print(f'{len(recs)} scenes, {len(out)} groups ({multi} span 2+ stories), '
f'{sum(seen.values())} assigned, {len(unassigned)} unassigned: {unassigned}')
for g in out:
print(f"{g['id']} {len(g['members']):2} scenes {len(g['stories'])} stories stage {g['stage']:6} {g['name']}")
src = collections.Counter(o['source'].split(':')[0] for g in out for o in g['options'])
print('option sources:', dict(src), '| scene options citing a scene outside their group:',
sum(o['in_group'] is False for g in out for o in g['options']))
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,192 @@
"""Hand-built reference grouping of the Jacobs 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). No magnitudes: the model never
chooses a number. Skill labels proposed for this corpus: nerve, cunning.
"""
G = [
dict(id='G01', name='Someone who knows your past names a price',
predicament='Someone who knows what you did wants paying to keep quiet, and you have a life to lose.',
actor='respectable person', wants='silence', counterpart='someone who knows their past',
members=[43, 67, 68, 81, 82, 83, 87, 90],
options=[
('Pay what they ask.', 'scene:82', {'money':'-', 'standing':'+', 'relationships.blackmailer':'+'}),
('Refuse, and dare them to tell.', 'scene:43', {'nerve':'+', 'standing':'risk'}),
('Seem to give in, and wait for your moment.', 'scene:87', {'cunning':'+', 'relationships.family':'-'}),
('Try to take the evidence off them by force.', 'scene:43', {'nerve':'+', 'flags.violent':'set', 'standing':'risk'}),
('Tell the truth yourself before they can.', 'filled', {'standing':'-', 'relationships.blackmailer':'-'})]),
dict(id='G02', name='Hiding something from someone close who keeps getting near it',
predicament='You are hiding something, and someone you care for keeps innocently coming close to it.',
actor='person with a secret', wants='to keep it hidden', counterpart='someone close to them',
members=[7, 8, 45, 46, 47, 48, 49, 50, 51, 52],
options=[
('Change the subject and steer them away.', 'scene:47', {'cunning':'+', 'relationships.close':'-'}),
('Keep your face still and say nothing.', 'archetype', {'nerve':'+'}),
('Promise to deal with it yourself, alone.', 'scene:49', {'nerve':'+', 'flags.secret_kept':'set'}),
('Tell them the truth.', 'filled', {'relationships.close':'risk', 'standing':'-'})]),
dict(id='G03', name='Someone innocent is taking the blame for what you did',
predicament='Suspicion has fallen on someone else for what you did, and you could let it stay there.',
actor='person at fault', wants='to escape blame', counterpart='an innocent suspect',
members=[10, 44, 59, 74, 75, 76, 77, 93],
options=[
('Own up.', 'scene:10', {'standing':'-', 'relationships.suspect':'+'}),
('Say nothing and let it pass.', 'archetype', {'relationships.suspect':'-', 'flags.guilty_secret':'set'}),
('Quietly steer suspicion away from them without confessing.', 'scene:60', {'cunning':'+'}),
('Point at them outright.', 'scene:75', {'standing':'+', 'relationships.suspect':'-', 'flags.guilty_secret':'set'})]),
dict(id='G04', name='A rival is after the same person',
predicament='Someone else wants the person you want, and only one of you can have them.',
actor='suitor', wants='the person they are courting', counterpart='a rival',
members=[4, 5, 111, 112, 113, 116, 117, 118, 140, 141, 142],
options=[
('Race them to it.', 'scene:111', {'nerve':'+', 'relationships.rival':'-'}),
('Settle it between you by a game or a bargain.', 'scene:114', {'relationships.rival':'+', 'standing':'risk'}),
('Put the rival in a bad light.', 'scene:142', {'cunning':'+', 'relationships.rival':'-', 'money':'-'}),
('Outdo their compliments.', 'scene:140', {'relationships.courted':'+'}),
('Step aside.', 'archetype', {'relationships.rival':'+', 'relationships.courted':'-'})]),
dict(id='G05', name='A deal you could tip in your favour',
predicament='You want something from someone and could quietly tip the deal your way.',
actor='bargainer', wants='the better end of a deal', counterpart='the other party',
members=[35, 36, 114, 115, 143],
options=[
('Deal straight.', 'archetype', {'standing':'+'}),
('Hide why you want it and haggle.', 'scene:36', {'cunning':'+', 'money':'-'}),
('Butter them up first: let them win, fill their glass.', 'scene:143', {'cunning':'+', 'relationships.other':'+'}),
('Slip in a condition they will not notice.', 'scene:114', {'cunning':'+', 'relationships.other':'risk'})]),
dict(id='G06', name='Partners who do not trust each other over a shared prize',
predicament='You and a partner are after the same prize, and neither of you trusts the other.',
actor='partner', wants='their share, or all of it', counterpart='their partner',
members=[30, 33, 34, 37, 38, 125],
options=[
('Split it fairly and keep your word.', 'archetype', {'relationships.partner':'+', 'money':'+'}),
('Cut your partner out.', 'scene:37', {'cunning':'+', 'money':'risk', 'relationships.partner':'-'}),
('Keep your partner where you can see them.', 'scene:38', {'nerve':'+'}),
('Threaten to tell unless they cut you in.', 'scene:29', {'money':'+', 'relationships.partner':'-'})]),
dict(id='G07', name='People are after your money',
predicament='You have money, or people think you do, and everyone around you suddenly wants a piece.',
actor='person with money', wants='to keep it', counterpart='people courting it',
members=[27, 28, 32, 138, 139],
options=[
('Enjoy the attention while it lasts.', 'scene:138', {'relationships.flatterer':'+', 'money':'risk'}),
('Tell them plainly what you think they are after.', 'filled', {'nerve':'+', 'relationships.flatterer':'-'}),
('Make sure nobody gets it.', 'scene:28', {'money':'+', 'standing':'-'}),
('Deny you have anything.', 'scene:32', {'cunning':'+'})]),
dict(id='G08', name='A windfall with a catch',
predicament='Something could change your fortunes overnight, and you are not sure what it will cost.',
actor='person of small means', wants='a change of fortune', counterpart='whoever offers it',
members=[16, 17, 18, 20, 22, 135, 136, 137],
options=[
('Try it and see.', 'scene:18', {'money':'+', 'flags.tempted_fate':'set'}),
('Throw it away.', 'scene:17', {'nerve':'+'}),
('Ask someone who knows before you decide.', 'scene:16', {'relationships.adviser':'+'}),
('Keep it quiet until you are sure.', 'filled', {'cunning':'+'})]),
dict(id='G09', name='Your scheme turns on you',
predicament='A plan you were sure of is coming apart, and the people you meant to fool are watching.',
actor='schemer', wants='to come out ahead', counterpart='the people they tried to fool',
members=[12, 39, 40, 54, 78, 79, 88, 91, 144, 145, 146, 147],
options=[
('Keep smiling and take your loss.', 'scene:40', {'standing':'-', 'nerve':'+'}),
('Brazen it out.', 'scene:107', {'nerve':'+', 'standing':'risk'}),
('Double down on the plan.', 'scene:145', {'cunning':'+', 'money':'risk'}),
('Own up and ask for mercy.', 'filled', {'standing':'-', 'relationships.fooled':'+'})]),
dict(id='G10', name='Treated with contempt by those over you',
predicament='People with power over you treat you with contempt, and you want to turn the tables.',
actor='person brought low', wants='respect, or revenge', counterpart='those in charge',
members=[64, 92, 124, 126, 127, 128, 129, 130, 131, 133, 134],
options=[
('Swallow it and do as you are told.', 'scene:128', {'relationships.authority':'+', 'standing':'-'}),
('Insist on who you really are.', 'scene:124', {'standing':'risk', 'relationships.authority':'-'}),
('Wait until they need you, then name your price.', 'scene:129', {'money':'+', 'cunning':'+'}),
('Get even quietly.', 'scene:131', {'cunning':'+', 'relationships.authority':'-', 'flags.revenge':'set'})]),
dict(id='G11', name='Someone unwelcome has settled into your home',
predicament='Someone you do not want has settled into your home, and you cannot seem to make them go.',
actor='householder', wants='them gone', counterpart='an unwelcome guest',
members=[2, 63, 85, 86],
options=[
('Tell them to go.', 'filled', {'nerve':'+', 'relationships.guest':'-'}),
('Put up with it.', 'scene:85', {'relationships.household':'-'}),
('Arrange for them to disgrace themselves.', 'scene:63', {'cunning':'+', 'relationships.guest':'-'}),
('Stand up for the people they are hurting.', 'scene:86', {'relationships.household':'+', 'nerve':'+'})]),
dict(id='G12', name='Something may be waiting in the dark',
predicament='Something frightening may be close by in the dark, and you must decide whether to face it.',
actor='frightened person', wants='to be safe', counterpart='whatever is out there',
members=[19, 25, 26, 73, 96, 97, 99, 151, 152, 153, 154, 155],
options=[
('Open the door and look.', 'scene:155', {'nerve':'+', 'flags.faced_fear':'set'}),
('Bar the door and stay put.', 'scene:97', {'nerve':'-'}),
('Go on through the dark anyway.', 'scene:151', {'nerve':'+', 'standing':'risk'}),
('Laugh it off in front of the others.', 'scene:19', {'standing':'+'})]),
dict(id='G13', name='Pressed to do something you believe is wrong',
predicament='Someone is pressing you to do something you believe is wrong or dangerous.',
actor='reluctant person', wants='to do right without losing them', counterpart='the one pressing',
members=[23, 24, 29, 62, 69],
options=[
('Refuse flatly.', 'scene:62', {'nerve':'+', 'relationships.presser':'-'}),
('Do it, to keep the peace.', 'scene:24', {'relationships.presser':'+', 'flags.did_wrong':'set'}),
('Go along, for a share.', 'scene:29', {'money':'+', 'flags.did_wrong':'set'}),
('Agree, then quietly undo it.', 'scene:26', {'cunning':'+', 'relationships.presser':'risk'})]),
dict(id='G14', name='A story nobody can check',
predicament='You have a story to tell that nobody can check, and people are ready to believe it.',
actor='storyteller', wants='to be believed', counterpart='a listening crowd',
members=[95, 98, 102, 103, 148],
options=[
('Tell it big.', 'scene:102', {'standing':'+', 'flags.tall_tale':'set'}),
('Tell it straight.', 'archetype', {'standing':'+'}),
('Get someone to vouch for you.', 'scene:103', {'relationships.voucher':'risk'}),
('Say you have seen nothing worth telling.', 'scene:148', {'nerve':'+'})]),
dict(id='G15', name='Caught where you should not be',
predicament='You have been caught where you should not be, and need an explanation right now.',
actor='person caught out', wants='to get away with it', counterpart='whoever caught them',
members=[9, 14, 58, 60, 65, 66, 106, 107, 108, 119],
options=[
('Brazen it out.', 'scene:107', {'nerve':'+', 'standing':'risk'}),
('Take the embarrassing explanation you are offered.', 'scene:66', {'standing':'-', 'relationships.catcher':'+'}),
('Tell the plain truth.', 'scene:119', {'standing':'-', 'relationships.catcher':'+'}),
('Say nothing and slip away.', 'archetype', {'relationships.catcher':'-'})]),
dict(id='G16', name='Blamed at home',
predicament='Someone at home holds you responsible for trouble you think is not your fault.',
actor='person being blamed', wants='peace at home', counterpart='the one blaming them',
members=[0, 1, 3, 55, 57],
options=[
('Put it on someone else.', 'scene:9', {'relationships.spouse':'+', 'relationships.other':'-'}),
('Keep your head down until it blows over.', 'archetype', {'relationships.spouse':'-'}),
('Speak up for yourself.', 'scene:57', {'nerve':'+', 'relationships.spouse':'risk'}),
('Smooth it over with a peace offering.', 'filled', {'money':'-', 'relationships.spouse':'+'})]),
dict(id='G17', name='You are sure who did it and cannot prove it',
predicament='You are sure who wronged you, and you cannot prove it.',
actor='wronged person', wants='what was taken, or justice', counterpart='the suspect',
members=[31, 56, 61, 100, 109],
options=[
('Search them.', 'scene:31', {'relationships.suspect':'-', 'standing':'risk'}),
('Accuse them openly.', 'scene:56', {'nerve':'+', 'relationships.suspect':'-'}),
('Set a trap.', 'scene:61', {'cunning':'+'}),
('Take it to the authorities.', 'scene:100', {'relationships.authority':'risk'}),
('Let it drop.', 'archetype', {'money':'-', 'standing':'-'})]),
dict(id='G18', name='Lost, far from anything you know',
predicament='You find yourself lost, far from anyone you know, and must get your bearings.',
actor='stranded person', wants='to get back', counterpart='whoever is nearby',
members=[122, 123, 149, 150],
options=[
('Ask the first person you meet for help.', 'scene:151', {'relationships.stranger':'+'}),
('Find your companion and make a plan together.', 'scene:123', {'relationships.companion':'+'}),
('Push on alone.', 'scene:150', {'nerve':'+', 'standing':'risk'}),
('Demand to be taken back at once.', 'scene:124', {'standing':'risk', 'relationships.authority':'-'})]),
dict(id='G19', name='Making amends',
predicament='You have wronged someone, and want them to forgive you.',
actor='person in the wrong', wants='forgiveness', counterpart='the person they wronged',
members=[11, 13, 156],
options=[
('Apologise plainly.', 'scene:156', {'relationships.wronged':'+'}),
('Make a grand gesture.', 'scene:11', {'nerve':'+', 'relationships.wronged':'risk'}),
('Pay for the damage.', 'filled', {'money':'-', 'relationships.wronged':'+'}),
('Leave it and hope it is forgotten.', 'archetype', {'relationships.wronged':'-'})]),
]
# 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:'middle', 2:'low', 3:'high', 4:'middle', 5:'high', 6:'middle',
7:'low', 8:'high', 9:'low', 10:'low', 11:'middle'}
# Story 9's professionals are treated as crew for the whole voyage, so they rank low.
@@ -0,0 +1,49 @@
#!/usr/bin/env python3
"""Render groups.json + records.json as one self-contained page: REFERENCE.html."""
import html, json, pathlib
here = pathlib.Path(__file__).parent
d = json.loads((here / 'groups.json').read_text())
recs = {r['chunk']: r for r in json.loads((here / 'records.json').read_text())}
stories = json.loads((here.parent / 'stories.json').read_text())
e = html.escape
SRC = {'archetype': 'archetype', 'filled': 'filled gap'}
def src(o):
if o['source'].startswith('scene:'):
n = o['source'].split(':')[1]
return f'from scene {n}' + ('' if o['in_group'] else ' <span class="warn">(outside this group)</span>')
return SRC[o['source']]
def moves(m): return ' '.join(f'<code>{e(k)} {e(v)}</code>' for k, v in m.items())
def scene(c):
r = recs[c]
return (f'<details><summary><b>{c}</b> · <i>{e(stories[r["story"]]["title"])}</i> — {e(r["predicament"])}</summary>'
f'<p class="sum">{e(r["summary"])}</p></details>')
out = []
for g in d['groups']:
out.append(f'''<section><h2>{g["id"]} · {e(g["name"])}</h2>
<p class="pred">{e(g["predicament"])}</p>
<p class="meta">{e(g["sentence"])} · {len(g["members"])} scenes from {len(g["stories"])} stories
({e(", ".join(g["story_titles"]))}) · stage <b>{g["stage"]}</b></p>
<h3>Options</h3><ol>{"".join(f"<li>{e(o['text'])} <span class='src'>{src(o)}</span><br>{moves(o['moves'])}</li>" for o in g["options"])}</ol>
<h3>Scenes</h3>{"".join(scene(m["chunk"]) for m in g["members"])}</section>''')
un = ''.join(scene(c) for c in d['unassigned'])
page = f'''<!doctype html><html lang="en"><head><meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1"><title>Jacobs Reference Groups</title>
<style>
:root{{--bg:#fbfaf7;--fg:#1d1d1b;--mute:#6b6760;--line:#e2ded6;--acc:#2f5d8a;--warn:#a4481c}}
@media (prefers-color-scheme:dark){{:root{{--bg:#191917;--fg:#e8e6e1;--mute:#a09c94;--line:#34332f;--acc:#8ab4dc;--warn:#e6915f}}}}
body{{background:var(--bg);color:var(--fg);font:16px/1.5 Georgia,serif;max-width:52rem;margin:0 auto;padding:1rem 16px 4rem}}
h1{{font-size:1.5rem}} h2{{font-size:1.15rem;margin:0 0 .3rem}} h3{{font-size:.8rem;text-transform:uppercase;letter-spacing:.06em;color:var(--mute);margin:.9rem 0 .3rem}}
section{{border-top:1px solid var(--line);padding:1.2rem 0}} .pred{{font-size:1.05rem;margin:.2rem 0}}
.meta,.src,.sum{{color:var(--mute);font-size:.88rem}} .warn{{color:var(--warn)}}
code{{font:12px ui-monospace,monospace;border:1px solid var(--line);border-radius:3px;padding:0 .3em;margin-right:.2em}}
li{{margin:.35rem 0}} details{{margin:.2rem 0}} summary{{cursor:pointer}} .sum{{margin:.2rem 0 .5rem 1.2rem}}
</style></head><body>
<h1>The Lady of the Barge: reference groups</h1>
<p class="meta">W. W. Jacobs, 1902 (Standard Ebooks text). 12 stories, 157 scenes cut by the same rule as <code>chunk.py</code>.
Summaries, predicaments, groups and options written by Claude by reading every scene: no local inference.
A comparison baseline, not a pack. Option moves give a direction only, never a number.</p>
{"".join(out)}
<section><h2>Unassigned ({len(d["unassigned"])})</h2><p class="meta">Scenes that fit no situation recurring in two or more stories.</p>{un}</section>
</body></html>'''
(here / 'REFERENCE.html').write_text(page, encoding='utf-8')
print('wrote', here / 'REFERENCE.html', len(page), 'bytes')
@@ -0,0 +1,944 @@
[
{
"chunk": 0,
"story": 0,
"summary": "A skipper waiting up for his late-returning mate and brother-in-law has just lost a shouted argument with a neighbouring crew; the mate arrives and answers his rebuke with cheek.",
"predicament": "Someone waiting up for a relative who comes in late wants to reproach him, and gets cheek back."
},
{
"chunk": 1,
"story": 0,
"summary": "The mate tells the skipper he has invited his sweetheart on the voyage without asking; the skipper is appalled and asks what his wife will say.",
"predicament": "A man learns a relative has promised a stranger his hospitality without asking, and fears what his spouse will say."
},
{
"chunk": 2,
"story": 0,
"summary": "The skipper tries to refuse the young woman passage but cannot bring himself to say so, and ends up eating supper with the couple.",
"predicament": "A man who wants to turn an unwelcome guest away cannot find the nerve to say it."
},
{
"chunk": 3,
"story": 0,
"summary": "The girl balks at her cramped quarters but stays; the skipper warns that his wife will blame him, and the mate says his sister can mind her own business.",
"predicament": "A man who has let something happen under his roof fears his spouse will hold him responsible for it."
},
{
"chunk": 4,
"story": 0,
"summary": "The skipper insists on chaperoning the girl at meals himself, leaving the mate to steer and eat cold leftovers while she laughs at the skipper's stories.",
"predicament": "A young man who brought the person he is courting along is pushed aside by an older man who takes charge of her."
},
{
"chunk": 5,
"story": 0,
"summary": "Jealous, the mate hints at the skipper's wife, is mocked by the pair, is rude to the girl, and is sent away.",
"predicament": "A jealous suitor tries to put his rival in his place, and only makes himself look childish."
},
{
"chunk": 6,
"story": 0,
"summary": "The girl snubs the mate as 'only the mate'; he turns the tables by threatening to let the skipper explain her presence to his wife alone.",
"predicament": "A spurned man realises he holds something over the rival who humiliated him, and decides to use it."
},
{
"chunk": 7,
"story": 0,
"summary": "The mate refuses to back the skipper's story; the skipper hides the girl below as they arrive to find his wife waiting on the quay.",
"predicament": "A man hiding an innocent but compromising secret is met by his spouse, while the one person who could clear him refuses to."
},
{
"chunk": 8,
"story": 0,
"summary": "The mate pulls meaningful faces behind the skipper's back until the wife grows suspicious; the skipper invents a toothache and tries to steer her away.",
"predicament": "A man tries to hurry his spouse away from a secret while someone signals behind his back that something is up."
},
{
"chunk": 9,
"story": 0,
"summary": "The wife stamps her foot, the hidden girl appears, and the mate lets his brother-in-law take the blame while pretending to shield him.",
"predicament": "A man caught with an innocent secret is disowned by the one person who could explain it."
},
{
"chunk": 10,
"story": 0,
"summary": "The wife abuses the girl, knocks her purse into the water, and orders her off; the mate, now remorseful, takes responsibility and defends her.",
"predicament": "A man whose spite has got an innocent person abused must decide whether to own up and defend her."
},
{
"chunk": 11,
"story": 0,
"summary": "The mate dives repeatedly for the purse to win the girl back; she begs him to come out but refuses to make up.",
"predicament": "A man tries to win back someone he wronged with a dangerous public show of devotion."
},
{
"chunk": 12,
"story": 0,
"summary": "The mate fakes drowning; the skipper rescues him, sees him wink while the girl kisses him, and the wife boxes his ears.",
"predicament": "A man pretends to be in danger to win sympathy, and the one who saved him sees through it."
},
{
"chunk": 13,
"story": 0,
"summary": "The wife takes the girl home to breakfast, leaving both men soaked, while the skipper fends off the mate's apologies with a boathook.",
"predicament": "Two men who quarrelled over a woman are both left out in the cold by the women they wronged."
},
{
"chunk": 14,
"story": 1,
"summary": "An old man losing at chess to his son grumbles at the weather and their remote house while waiting for a guest, who arrives: an old friend back from long service abroad.",
"predicament": "A man losing a friendly contest tries to distract from his mistake, and is caught at it by his family."
},
{
"chunk": 15,
"story": 1,
"summary": "Warmed by whisky, the guest tells tales of distant lands; pressed by his host, he reluctantly produces a dried monkey's paw he calls magic.",
"predicament": "A guest who wants to leave a dangerous subject alone is coaxed by his hosts' curiosity into bringing it out."
},
{
"chunk": 16,
"story": 1,
"summary": "The guest explains the paw grants three men three wishes each, that he has had his, and that the last owner wished for death; asked if he would wish again, he wavers.",
"predicament": "Someone offered a thing that grants wishes is warned by the man who used it that it brings sorrow."
},
{
"chunk": 17,
"story": 1,
"summary": "The guest throws the paw on the fire; the host snatches it back and keeps it despite repeated warnings to wish sensibly or not at all.",
"predicament": "A man is offered a dangerous gift by someone who begs him to destroy it, and wants to keep it anyway."
},
{
"chunk": 18,
"story": 1,
"summary": "Egged on by his joking son, the old man wishes for two hundred pounds to clear the house; the paw twists in his hand, but no money appears.",
"predicament": "A man half-believing in a promise of easy money must decide whether to test it and what to ask for."
},
{
"chunk": 19,
"story": 1,
"summary": "An uneasy night passes; in the morning the family laugh off their fears, though the father recalls that the wishes come true in ways that look like coincidence.",
"predicament": "A family that tempted fate laughs off their fears in daylight while one of them cannot shake them."
},
{
"chunk": 20,
"story": 1,
"summary": "The son leaves for work; later the mother, half-hoping for money, sees a well-dressed stranger hesitate several times at the gate before coming in.",
"predicament": "A family waiting on a hoped-for windfall sees a stranger approach who might bring it, or bad news."
},
{
"chunk": 21,
"story": 1,
"summary": "The stranger, from the son's employers, tells the parents their only son has been killed in the machinery.",
"predicament": "Parents receive news that their only child has been killed, from someone who cannot bring himself to say it."
},
{
"chunk": 22,
"story": 1,
"summary": "The firm denies liability but offers compensation of exactly two hundred pounds; the father collapses. They bury their son and sink into silent grief.",
"predicament": "A man learns the money he wished for has come as compensation for his child's death."
},
{
"chunk": 23,
"story": 1,
"summary": "A week later the grieving mother remembers the paw's other two wishes and demands that her husband wish their son alive; he calls it madness.",
"predicament": "A grieving woman seizes on a desperate chance to undo a death, and her spouse is afraid of what it would bring back."
},
{
"chunk": 24,
"story": 1,
"summary": "The father tells her their son was mutilated beyond recognition, but she insists; terrified, he fetches the paw and makes the second wish.",
"predicament": "A man pressed by his grieving spouse must decide whether to do something he believes is wicked and dangerous."
},
{
"chunk": 25,
"story": 1,
"summary": "Nothing seems to happen; then a stealthy knock comes at the door, and the mother cries that it is their son while the father holds her back.",
"predicament": "A man who dreads what his wish may bring home must stop his spouse from opening the door to it."
},
{
"chunk": 26,
"story": 1,
"summary": "The mother breaks free and struggles with the bolt; the father finds the paw and makes the third wish, and the door opens on an empty road.",
"predicament": "A man must use his last chance to undo what his spouse most longs for, before she lets it in."
},
{
"chunk": 27,
"story": 2,
"summary": "An old watchman recalls a shipmate, an aged miser worth six hundred pounds, who fell ill a month out on the voyage home.",
"predicament": "A man who has hoarded his savings all his life falls ill far from anywhere he could spend them."
},
{
"chunk": 28,
"story": 2,
"summary": "The dying miser refuses to believe he is dying and leave his money; his shipmates circle hopefully, and one finds a money belt on him and guesses his plan to be buried with it.",
"predicament": "A dying miser, surrounded by people hoping to inherit, is determined that nobody will get his money."
},
{
"chunk": 29,
"story": 2,
"summary": "The miser dies boasting that he had a boy throw his banknotes overboard; one sailor scares the boy into silence, and the narrator threatens to tell unless let in on the scheme.",
"predicament": "Someone who spots a colleague quietly scheming to take unclaimed money must decide whether to expose him or join in."
},
{
"chunk": 30,
"story": 2,
"summary": "The schemer reveals he thinks the boy kept the money; the two agree to split it, and search the boy's bunk and pockets at night without success.",
"predicament": "Two partners convinced a weaker person is secretly holding a fortune want to find it before anyone else learns of it."
},
{
"chunk": 31,
"story": 2,
"summary": "A night search is foiled when a ticklish shipmate wakes screaming; a week of prodding the boy finds nothing, so they corner him and demand the money outright.",
"predicament": "A schemer whose secret searches keep failing decides to confront the person he suspects directly."
},
{
"chunk": 32,
"story": 2,
"summary": "The boy insists he threw the money overboard; they search him, offer him a third, then threaten to have him searched ashore and jailed.",
"predicament": "Someone suspected of hiding a windfall is pressed with bribes and threats by people who have no right to it."
},
{
"chunk": 33,
"story": 2,
"summary": "When the sailor heads to tell the captain, the boy gives in: he kept the money but, frightened by the searches, hid it in an officer's mattress where he cannot now reach it.",
"predicament": "Someone forced to share a hidden windfall admits it is now stuck where neither partner can get at it."
},
{
"chunk": 34,
"story": 2,
"summary": "Neither the man nor the boy can get aft unseen, the officer sleeps on the money every night, and the two partners blame each other.",
"predicament": "Distrustful partners stare at a fortune they cannot reach without getting caught, and blame each other for it."
},
{
"chunk": 35,
"story": 2,
"summary": "The boy proposes the man fake an accident to get quartered aft; the man refuses and secretly flatters the officer, asking to buy his mattress as a keepsake.",
"predicament": "A man wants something a superior owns without revealing why, and tries flattery to get it."
},
{
"chunk": 36,
"story": 2,
"summary": "The officer plays up the mattress's value and the sailor, afraid to seem eager, settles at two pounds, to be handed over ashore.",
"predicament": "A buyer who cannot reveal why he wants something is made to pay more by a seller who senses his eagerness."
},
{
"chunk": 37,
"story": 2,
"summary": "The sailor now plans to cut the boy out and split with the narrator alone, but the suspicious boy shadows him all the way into port.",
"predicament": "A man who wants to cheat his partner out of a shared prize is watched too closely to slip away."
},
{
"chunk": 38,
"story": 2,
"summary": "The officer delays the hand-over with a long speech until the boy arrives, sees the sack, and refuses to let them leave without his share.",
"predicament": "A man trying to slip away with a shared prize is held up until the partner he meant to cheat catches him."
},
{
"chunk": 39,
"story": 2,
"summary": "The boy stays on deck while the men cut the mattress open below; it is empty, and when they come up the boy has vanished.",
"predicament": "A man who schemed to cheat a partner finds the prize gone and realises he may have been cheated himself."
},
{
"chunk": 40,
"story": 2,
"summary": "The boy never returns, not even for his pay, and the officer smilingly asks the sailor how he slept.",
"predicament": "A schemer who was outwitted must stand and smile at the people who got the better of him."
},
{
"chunk": 41,
"story": 3,
"summary": "A rich man soon to marry sits with his idle, indebted cousin, who needles him about his wealth and his fiancée's goodness.",
"predicament": "A man about to marry is needled by a dependent relative who hints at something to his discredit."
},
{
"chunk": 42,
"story": 3,
"summary": "The cousin hints that the fiancée would drop him if she knew what he really was, then says he needs fifteen hundred pounds within a fortnight or faces prison.",
"predicament": "A man in desperate debt makes veiled hints to the relative he hopes will pay it."
},
{
"chunk": 43,
"story": 3,
"summary": "Refused, the cousin offers to sell compromising old letters, threatening to sell them to a rival suitor; the rich man seizes him and is stopped only by a servant entering.",
"predicament": "A man is blackmailed by a relative with old letters that could cost him the person he loves."
},
{
"chunk": 44,
"story": 3,
"summary": "The cousin walks out into the park to let him think it over; the rich man follows, and later tells his mother the cousin has gone for good after a quarrel over money.",
"predicament": "A man who has done something terrible in anger must cover for a relative's sudden disappearance."
},
{
"chunk": 45,
"story": 3,
"summary": "The man walks with his fiancée to a disused well in the park, her favourite spot; he urges her not to sit on its edge.",
"predicament": "A man with a guilty secret must keep calm while someone he loves insists on lingering right at the spot."
},
{
"chunk": 46,
"story": 3,
"summary": "She asks about the missing cousin and defends him; the man bursts out that the cousin was a blackmailer, a liar and a cur.",
"predicament": "A man hiding a crime hears it discussed innocently and betrays his feelings with an outburst."
},
{
"chunk": 47,
"story": 3,
"summary": "She is startled by a whisper she imagines saying 'Jem, help me out'; shaken, he tries to take her indoors, but she insists on staying.",
"predicament": "A guilty man tries to hurry someone away from the scene of his crime, and she insists on staying."
},
{
"chunk": 48,
"story": 3,
"summary": "She drops her mother's diamond bracelet down the well and wants it drained; he looks at her in horror, then covers it by saying he feared she was falling.",
"predicament": "A man hiding something learns it may be discovered by an innocent accident, and must not show his fear."
},
{
"chunk": 49,
"story": 3,
"summary": "He promises to recover the bracelet himself by morning and makes her swear to tell no one; his mother suggests filling the well in.",
"predicament": "A man must retrieve something from where his secret lies before anyone else goes looking."
},
{
"chunk": 50,
"story": 3,
"summary": "At night he secretly fishes the well with a line and hook, and dredges up keys instead of the bracelet.",
"predicament": "A man secretly searching where his crime lies keeps pulling up reminders of it."
},
{
"chunk": 51,
"story": 3,
"summary": "The hook snags; he gives up, spends a sleepless night, and at dawn meets his grooms, whom he has ordered to lower him into the well.",
"predicament": "A man who has failed to fix things quietly must now involve others while still keeping his secret."
},
{
"chunk": 52,
"story": 3,
"summary": "His groom offers to go down instead, since the master looks ill; he refuses curtly and starts to test the air with a candle.",
"predicament": "A man hiding something is offered help he cannot accept without being found out."
},
{
"chunk": 53,
"story": 3,
"summary": "The candle is lost; he stops the groom fetching another, strips, and sits a long time on the well's edge before going down.",
"predicament": "A man who must face the thing he did alone gathers his nerve while others watch and wonder."
},
{
"chunk": 54,
"story": 3,
"summary": "Below, something drags at the rope; the grooms haul up the dead cousin's face with their master behind it, let go in horror, and both fall back into the water.",
"predicament": "A man who hid a crime is dragged down by it at the moment he tries to undo its consequences."
},
{
"chunk": 55,
"story": 4,
"summary": "A farmer's wife, her husband, and her retired-policeman uncle discuss a stolen brooch; the uncle has been hiding under their bed hoping to catch the thief, and the wife casts suspicion on a neighbour while accusing her husband of not caring.",
"predicament": "A woman who has lost something valuable suspects the people around her, and resents her spouse for not caring as much."
},
{
"chunk": 56,
"story": 4,
"summary": "The uncle declares everyone guilty until proven innocent; the wife recounts missing the brooch, accusing and sacking her servant, who cried on her box.",
"predicament": "Someone who has lost something accuses the most defenceless person nearby, and punishes her before any proof."
},
{
"chunk": 57,
"story": 4,
"summary": "The servant's box held nothing; the husband defends her and is snapped at, while the uncle, pencil and notebook out, pursues the investigation with great ceremony.",
"predicament": "A man who thinks a household fuss is foolish keeps defending the accused and is scolded for taking her side."
},
{
"chunk": 58,
"story": 4,
"summary": "The husband eats a lozenge from the evidence box and cannot stop laughing; the uncle establishes that no one could have entered the bedroom unheard.",
"predicament": "A man who finds a family inquiry ridiculous cannot keep a straight face in front of its self-important leader."
},
{
"chunk": 59,
"story": 4,
"summary": "Suspicion turns to a widow who visited that morning; the uncle finds muddy footprints on the stairs, which are in fact the husband's, and he stays guiltily quiet.",
"predicament": "A man who sees an innocent neighbour blamed for evidence he himself left must decide whether to own up."
},
{
"chunk": 60,
"story": 4,
"summary": "The husband slyly deflects the footprint evidence, then exchanges silent signals with his wife until the uncle demands to know what is funny.",
"predicament": "A man who knows more than he says can barely hide his amusement from the self-important person running the inquiry."
},
{
"chunk": 61,
"story": 4,
"summary": "The husband reveals he thinks the widow is after the uncle, not the brooch; the uncle is outraged, then proposes inviting her to tea to trap her into confessing.",
"predicament": "A self-important man, teased that a neighbour fancies him, resolves to prove his point by trapping her."
},
{
"chunk": 62,
"story": 4,
"summary": "The husband refuses to have a guest trapped in his house; the uncle secretly tells his niece he will search the widow's cottage without leave.",
"predicament": "A man refuses to let his home be used to entrap a friend, so the schemer plans to go behind his back."
},
{
"chunk": 63,
"story": 4,
"summary": "The husband, who resents the uncle living with them for his wife's hopes of an inheritance, plans to let the widow catch the uncle searching her house, and shadows him.",
"predicament": "A man stuck with an unwelcome relative in his home sees a chance to have him disgraced and driven off."
},
{
"chunk": 64,
"story": 4,
"summary": "The husband brings the widow home early; the uncle, trapped inside, hides in the larder, and the husband settles in for beer and begins praising him.",
"predicament": "A man who has trapped his rival in an embarrassing hiding place decides to make the most of it."
},
{
"chunk": 65,
"story": 4,
"summary": "Within the uncle's hearing, the husband tells the widow the uncle is shy and devoted to her, and has been asking whether she likes jewellery.",
"predicament": "A trapped man must listen in silence while someone tells a neighbour a story about him that he cannot deny."
},
{
"chunk": 66,
"story": 4,
"summary": "Asked for bread and cheese, the widow opens the larder, the uncle bursts out, and her friend takes his hiding there as a bashful suitor's courtship.",
"predicament": "A man caught somewhere he should not be is handed an embarrassing explanation, and has no better one to offer."
},
{
"chunk": 67,
"story": 5,
"summary": "Late at night one co-owner of a house and a business sits hating his partner, who has discovered his embezzlement and ordered him to leave both by morning.",
"predicament": "A man found out in wrongdoing is ordered by his partner to give up everything and leave by morning."
},
{
"chunk": 68,
"story": 5,
"summary": "The honest partner refuses to cover the theft quietly, offers the exile two hundred pounds, and mentions the servants are away until morning.",
"predicament": "A man offered a harsh but fair way out of his disgrace wants a quieter bargain the other will not give."
},
{
"chunk": 69,
"story": 5,
"summary": "The exile demands the matter be hushed up, draws a sword from the wall, and stabs his partner when he refuses.",
"predicament": "A man facing ruin threatens the only person who can expose him, and must choose whether to go through with it."
},
{
"chunk": 70,
"story": 5,
"summary": "Sickened, the killer turns out the lights, flees to the gate, and sees a constable coming up the road.",
"predicament": "A man who has just done something terrible in rage panics and must steady himself when a figure of the law appears."
},
{
"chunk": 71,
"story": 5,
"summary": "He bids the constable good night, returns inside, and gathers his cash and valuables, reckoning he has eight hours' start.",
"predicament": "A man with a crime behind him and a few hours' start must decide what to take and where to run."
},
{
"chunk": 72,
"story": 5,
"summary": "He plans his escape, weighing a crowded district against the seaside, and finds every choice may mean life or death.",
"predicament": "A fugitive planning his escape finds that every choice might be the one that gets him caught."
},
{
"chunk": 73,
"story": 5,
"summary": "At one o'clock he hears creaks on the stairs, and fears the dead man is moving about the house.",
"predicament": "A man alone with what he has done hears noises in the dark and fears it has come back for him."
},
{
"chunk": 74,
"story": 5,
"summary": "Finding the library door open, he locks someone inside, then realises it is a burglar he can blame for the killing.",
"predicament": "A guilty man realises a stranger's blunder gives him someone else to blame."
},
{
"chunk": 75,
"story": 5,
"summary": "He fires through the door, raises the alarm, and the police break in and seize the terrified intruder.",
"predicament": "A man framing an innocent person must act the outraged victim in front of the law."
},
{
"chunk": 76,
"story": 5,
"summary": "The intruder swears the body was there when he arrived; the sergeant uncovers it, and the killer feigns horror.",
"predicament": "A man must play the shocked innocent while the person he framed pleads the truth."
},
{
"chunk": 77,
"story": 5,
"summary": "The killer names his friend and accuses the intruder, who accuses him back; the sergeant seems to side with the killer.",
"predicament": "Someone falsely accused points to the real culprit, who must hold his nerve and keep up his story."
},
{
"chunk": 78,
"story": 5,
"summary": "The sergeant takes the pistol, handcuffs the killer without warning, and sends for a doctor, since the victim is not dead.",
"predicament": "A man who thought he had got away with it learns the one witness who could hang him is still alive."
},
{
"chunk": 79,
"story": 5,
"summary": "The dying partner opens his eyes and speaks; the sergeant takes notes and leads the killer away.",
"predicament": "A man whose deceit has collapsed can only watch as the truth comes out and he is taken away."
},
{
"chunk": 80,
"story": 6,
"summary": "A ragged stranger swaggers into the best inn in a small town, bullies the waiter who tries to turn him out, and demands to see the landlord.",
"predicament": "A penniless newcomer forces his way into a place he does not belong, counting on a secret to back him."
},
{
"chunk": 81,
"story": 6,
"summary": "The stranger greets the landlord by another name, a wanted pirate's, and demands clothes, lodging and money in return for silence.",
"predicament": "A man who has built a respectable new life is found by an old associate who threatens to expose his past."
},
{
"chunk": 82,
"story": 6,
"summary": "The landlord gives him money; the blackmailer draws a pistol, declares he will take half of everything from now on, and settles in.",
"predicament": "A man pays off a blackmailer and learns the price will be half of everything, for good."
},
{
"chunk": 83,
"story": 6,
"summary": "The landlord says he has lived honestly for fifteen years and warns the man not to wake the devil in him; the blackmailer meets the landlord's stepdaughter and says he will stay.",
"predicament": "A reformed man warns a blackmailer not to push him too far, while the blackmailer sets his sights on the man's family."
},
{
"chunk": 84,
"story": 6,
"summary": "The blackmailer orders the best supper and room, and sleeps with his door barricaded and a pistol under his pillow.",
"predicament": "A man who has seized power over another knows the danger he is in, and guards himself even as he gloats."
},
{
"chunk": 85,
"story": 6,
"summary": "He pushes in at the family breakfast table, eyes the stepdaughter, hints at the landlord's past before her, and goes out to buy new clothes.",
"predicament": "A household must make polite space for someone who holds them hostage."
},
{
"chunk": 86,
"story": 6,
"summary": "Within a month the blackmailer runs the inn; the landlord, failing in health, backs him in sacking a loyal old servant, and his daughter demands to know who is master.",
"predicament": "Someone watches a person she trusts give way at every turn to an intruder, and demands that he stand up for himself."
},
{
"chunk": 87,
"story": 6,
"summary": "The landlord sides with the blackmailer, who threatens to ruin the girl and have the landlord hanged; the landlord pleads for peace.",
"predicament": "A man who is being blackmailed hears his tormentor threaten someone he loves, and must choose between swallowing it and hitting back."
},
{
"chunk": 88,
"story": 6,
"summary": "The inn decays under the blackmailer's rule; the landlord collapses with a fit, which upsets the blackmailer's plans.",
"predicament": "A blackmailer's hold depends on his victim's life, and that victim suddenly collapses."
},
{
"chunk": 89,
"story": 6,
"summary": "The landlord lies dying, anxious to please the blackmailer, while his daughter nurses him; the blackmailer resolves to get the hidden money before he dies.",
"predicament": "A blackmailer whose victim is dying must grab what he can before his hold disappears."
},
{
"chunk": 90,
"story": 6,
"summary": "The blackmailer threatens to inform; the dying man begs for time and promises to reveal his money that night if his daughter gets a share.",
"predicament": "A dying man pressed by his tormentor bargains for time and for provision for someone he loves."
},
{
"chunk": 91,
"story": 6,
"summary": "At night the blackmailer drugs the nurse and demands the money; the landlord extracts his promise about the daughter.",
"predicament": "A man who thinks his helpless victim is at his mercy leans in close to hear the secret."
},
{
"chunk": 92,
"story": 6,
"summary": "The 'dying' landlord seizes and strangles him, revealing he has been shamming weakness and planning to blame the killing on the blackmailer's own followers.",
"predicament": "A man who pretended to be helpless strikes at the tormentor who threatened his family."
},
{
"chunk": 93,
"story": 6,
"summary": "He stages the scene as a robbery and returns to bed as the drugged nurse unwittingly provides his alibi.",
"predicament": "A man who has done a desperate thing arranges things so that suspicion falls elsewhere."
},
{
"chunk": 94,
"story": 7,
"summary": "An old villager chats with a travelling painter repainting the inn sign, which had been mistaken for a portrait of a king.",
"predicament": "A craftsman told his work looks like something else quietly fixes it before anyone else notices."
},
{
"chunk": 95,
"story": 7,
"summary": "The painter shares his beer, and the old man begins the tale of a travelling circus that stopped in the village.",
"predicament": "An old man looking for a free drink offers a story in exchange."
},
{
"chunk": 96,
"story": 7,
"summary": "News comes that the circus tiger has escaped nearby; a tramp comes running to the inn shouting that the tiger is after him, and the drinkers rush indoors.",
"predicament": "People who laughed at a distant danger panic when it seems to have arrived on their doorstep."
},
{
"chunk": 97,
"story": 7,
"summary": "The landlord bars the door against the tramp; a man knocks the landlord down to get out to protect the families, and the tramp gets in.",
"predicament": "Someone must choose between keeping himself safe behind a barred door and letting in a stranger in danger."
},
{
"chunk": 98,
"story": 7,
"summary": "The tramp, revived with free brandy, tells a vivid tale of fleeing the tiger, and the men are afraid to go home.",
"predicament": "A stranger with a thrilling tale of danger is rewarded by a frightened crowd without anyone checking it."
},
{
"chunk": 99,
"story": 7,
"summary": "The men sleep at the inn; the tramp is gone by morning; the village lives in fear, though the local rogue laughs at the whole thing.",
"predicament": "A community living in fear of an unseen threat ignores the one doubter, because he has a bad name."
},
{
"chunk": 100,
"story": 7,
"summary": "A villager's hens are taken; he carries the evidence to the constable in the next village, who shoves him away as drunk.",
"predicament": "A man who has suffered a loss goes to the authorities for help and is brushed off as a nuisance."
},
{
"chunk": 101,
"story": 7,
"summary": "Pigs vanish night after night; the authorities do nothing, and neighbours squabble over whether to take animals indoors.",
"predicament": "A community suffering repeated losses cannot get help, and cannot agree how to protect itself."
},
{
"chunk": 102,
"story": 7,
"summary": "Children claim sightings, and a villager staggers in describing how the tiger chased him up a tree.",
"predicament": "A man tells a dramatic story of narrow escape to an audience eager to believe it."
},
{
"chunk": 103,
"story": 7,
"summary": "When one man questions the story, the rogue 'confirms' it, claiming he watched from another tree; the storyteller, caught out, goes home silent.",
"predicament": "A man caught in a boastful lie is 'backed up' by a rival, who now has him trapped by it."
},
{
"chunk": 104,
"story": 7,
"summary": "The neighbouring town and the clergyman say there was no tiger; after more losses a former militiaman raises a band of seventeen to hunt it.",
"predicament": "People told their fears are nonsense by outsiders decide to take matters into their own hands."
},
{
"chunk": 105,
"story": 7,
"summary": "The hunt searches the wood timidly and finds nothing; back at the inn, an old man reports the tiger has just gone into the rogue's cottage.",
"predicament": "A band that set out to face a danger returns relieved to have found nothing, and is then called to face it for real."
},
{
"chunk": 106,
"story": 7,
"summary": "The armed men crowd into the rogue's cottage, pushing him ahead of them, despite his protests.",
"predicament": "A man with something to hide has an armed crowd force its way into his home."
},
{
"chunk": 107,
"story": 7,
"summary": "His kitchen is full of pork and poultry; accused of theft, he brazenly claims to have gone into the meat trade.",
"predicament": "A man caught with the evidence of his thefts brazens it out and dares his accusers to prove anything."
},
{
"chunk": 108,
"story": 7,
"summary": "He turns their own tiger sightings against them: those who swore they saw it would have to repeat it on oath.",
"predicament": "A man accused of wrongdoing turns his accusers' own exaggerations into his defence."
},
{
"chunk": 109,
"story": 7,
"summary": "He claims to have receipts, offers to sell them the meat, and gets away with it; he and the tramp turn out to have known each other.",
"predicament": "People who know they were swindled cannot prove it, and must watch the swindler profit."
},
{
"chunk": 110,
"story": 8,
"summary": "A retired officer, dressed with great care, sets out on a hot afternoon and overtakes a friend who stares uneasily at his loud tie.",
"predicament": "A man nervously setting out to do something that matters to him is stopped by a friend with questions."
},
{
"chunk": 111,
"story": 8,
"summary": "The officer confides he is going to propose to a widow; his friend, equally dressed up, says he is on the same errand, and the two race along the road.",
"predicament": "A man discovers a friend is after the same person he is, on the same day, and each races to get there first."
},
{
"chunk": 112,
"story": 8,
"summary": "Followed by jeering boys, they stop and agree they cannot propose together, but neither will yield the day, each pleading an excuse.",
"predicament": "Two rivals agree someone must go first, and neither will be the one to wait."
},
{
"chunk": 113,
"story": 8,
"summary": "Each claims precedence; the officer vows that if they go together he will match any proposal on the spot, and refuses to be put off.",
"predicament": "Two rivals for the same prize trade claims of priority, and each suspects the other of a trick."
},
{
"chunk": 114,
"story": 8,
"summary": "The officer proposes they play one game of chess for the right to propose first; the friend agrees, on condition that if the winner is refused, the loser may not propose without his permission.",
"predicament": "Two rivals agree to settle who goes first by a game, and one slips in a condition the other does not examine."
},
{
"chunk": 115,
"story": 8,
"summary": "The officer offers his rival a large brandy, which the rival sets aside; after a long game the rival checkmates him with a bishop the officer had forgotten.",
"predicament": "A man who tried to tip a contest in his favour loses it through his own oversight."
},
{
"chunk": 116,
"story": 8,
"summary": "The winner tidies himself in the loser's house and goes off to propose; the loser waits up all night and next morning goes to hear the result.",
"predicament": "A man who lost the right to try first must wait while his rival takes his chance."
},
{
"chunk": 117,
"story": 8,
"summary": "The rival was refused, but holds the officer to the condition and plans to keep proposing until the widow accepts him.",
"predicament": "A man finds the rival he lost to has been refused, but can still use the terms of their bargain to keep him out."
},
{
"chunk": 118,
"story": 8,
"summary": "The rival says he will warn the widow off the officer, suggests the officer court her companion instead, and the officer storms out and sulks for weeks.",
"predicament": "A man bound by a promise he made watches a rival use it to keep him from what he wants."
},
{
"chunk": 119,
"story": 8,
"summary": "Meeting the widow by chance, the officer confesses the chess game to explain his absence; she is indignant, then laughs.",
"predicament": "A man who has been avoiding someone he cares for must explain why, and the only honest answer is embarrassing."
},
{
"chunk": 120,
"story": 8,
"summary": "She says she is angry with him for losing, and proposes a plan so that he can win at cards what he lost at chess, under the rival's eyes.",
"predicament": "A man bound by a rash promise finds the person he hoped to win is willing to help him get round it."
},
{
"chunk": 121,
"story": 8,
"summary": "Playing cards, the widow asks the officer if he would like her hand; he takes it and kisses it, she 'meant the cards', then lets him keep it, and the rival is left fuming.",
"predicament": "Someone arranges to accept the suitor she prefers in a way his rival cannot object to."
},
{
"chunk": 122,
"story": 9,
"summary": "A man wakes up thirsty in a cramped, reeking bunk, with a stranger's face swearing at him, and cannot tell where he is.",
"predicament": "A man wakes up somewhere strange with no idea how he got there."
},
{
"chunk": 123,
"story": 9,
"summary": "He realises he is on a ship, dressed in rags; he finds his friend among the sleepers and learns the ship's name.",
"predicament": "A man in an unknown place looks for his one companion and a first clue to how they came to be there."
},
{
"chunk": 124,
"story": 9,
"summary": "Seasick and far from land, he goes aft and demands to be taken home; the officer calls him mad and orders him forward.",
"predicament": "A man who has always been obeyed tries to give orders somewhere nobody knows or believes who he is."
},
{
"chunk": 125,
"story": 9,
"summary": "His friend tries to threaten legal consequences but is too sick to finish; the two bicker over which of them was drunk.",
"predicament": "Two people in trouble together try to put on a united front and end up blaming each other."
},
{
"chunk": 126,
"story": 9,
"summary": "The captain says they signed on as cook and seaman, calls them drunk impostors, and threatens jail; they are put to work.",
"predicament": "Two people who claim to be respected professionals are treated as impostors and forced to do menial work."
},
{
"chunk": 127,
"story": 9,
"summary": "The crew mocks their claims of being drugged and of sobriety; their airs make the officers dislike them all the more.",
"predicament": "People brought low insist on their old status, and are mocked for it by those around them."
},
{
"chunk": 128,
"story": 9,
"summary": "The captain humiliates the cook; the cook obeys, tidies the cabin, and comes back with a secret smile and something in his pocket, telling his friend it won't be for long.",
"predicament": "A humiliated man pretends to submit while he quietly prepares his revenge."
},
{
"chunk": 129,
"story": 9,
"summary": "The captain is struck with violent pains; the cook refuses to treat him, as he 'only shipped as cook', until he agrees to pay a professional fee.",
"predicament": "A man mocked for claiming skill is suddenly needed for it, and names his price."
},
{
"chunk": 130,
"story": 9,
"summary": "The cook prescribes, collects his fee, scares the captain about making a will, and has the mate sent out for snuffling.",
"predicament": "A man who has gained the upper hand over those who humiliated him enjoys every moment of it."
},
{
"chunk": 131,
"story": 9,
"summary": "The cook hints he dosed the food from the medicine chest; the mate falls ill too, and the cook demands to be treated as surgeon.",
"predicament": "A man who has secretly caused the trouble only he can cure makes the most of it."
},
{
"chunk": 132,
"story": 9,
"summary": "The mate haggles over the fee; the second officer falls ill too; the sick captain scolds the sick mate for being ill at all.",
"predicament": "A man who swore he would never pay the person he scorned is forced by suffering to haggle with him."
},
{
"chunk": 133,
"story": 9,
"summary": "The cook treats and weakens all three officers; the captain and mate pay the other man to draw up their wills; they recover slowly as they reach port.",
"predicament": "People who scorned two outsiders now depend on them completely, and pay for the privilege."
},
{
"chunk": 134,
"story": 9,
"summary": "Ashore, the cook tells the captain he ate something that disagreed with him, and leaves with a wave.",
"predicament": "A man who got even with his tormentors leaves them knowing they were had."
},
{
"chunk": 135,
"story": 10,
"summary": "At a crowded family breakfast, a poor widow living with her sister's family gets a letter and reads it so slowly that the others nearly burst with impatience.",
"predicament": "Someone given news that might change their life cannot take it in, while the people around them itch to know."
},
{
"chunk": 136,
"story": 10,
"summary": "The widow fears the letter is a hoax; her brother-in-law thinks so too, until her sister reads it and rejoices.",
"predicament": "Someone who has never had luck is told of a windfall and is afraid to believe it."
},
{
"chunk": 137,
"story": 10,
"summary": "The widow has inherited two thousand pounds from a former employer; the brother-in-law grumbles that nobody ever left him anything, and spreads the news through the town.",
"predicament": "A man sees a relative come into money and resents that luck never comes his way."
},
{
"chunk": 138,
"story": 10,
"summary": "Local men suddenly befriend the brother-in-law; his wife points out that two old dealers are courting the heiress for her money.",
"predicament": "A man flattered by new friends is told they are really after a relative's money."
},
{
"chunk": 139,
"story": 10,
"summary": "The brother-in-law watches the two suitors flatter the widow and tries to undercut them by announcing her age, nearly giving away his wife's.",
"predicament": "A man trying to expose flattering suitors trips over his own family's sensibilities."
},
{
"chunk": 140,
"story": 10,
"summary": "The suitors outbid each other with compliments; the wife's temper frays, and the visitors are shown out with the door shut hard.",
"predicament": "Two rivals courting the same person keep topping each other's compliments while the family grows fed up."
},
{
"chunk": 141,
"story": 10,
"summary": "The family, wanting to keep the money, fail to warn the widow; the slow dealer, losing ground to his glib rival, hatches a plan and enlists a small-time dealer.",
"predicament": "A slow-talking man losing a contest to a glib rival looks for a trick instead of better words."
},
{
"chunk": 142,
"story": 10,
"summary": "The dealer bribes an accomplice, who holds out for a bigger fee, to tell the rival in confidence that the widow has lost her fortune; the rival swallows it.",
"predicament": "A man hires someone to spread a false rumour that will drive off his rival, and the hireling drives a hard bargain."
},
{
"chunk": 143,
"story": 10,
"summary": "With the rival gone, the dealer courts the widow alone, preaching the virtues of poverty, and loses seven games of draughts to her on purpose.",
"predicament": "A man courting for money pretends not to care about it and flatters the one he courts by letting her win."
},
{
"chunk": 144,
"story": 10,
"summary": "He blows her kisses and fusses over a bumped head, invites himself back, and walks home sure the money is his.",
"predicament": "A schemer who thinks his deal is done walks away gloating too soon."
},
{
"chunk": 145,
"story": 10,
"summary": "He spreads the rumour of her ruin through the town, then proposes publicly 'now that she is poor', to look noble.",
"predicament": "A man makes a public show of selfless devotion, sure that it will cost him nothing."
},
{
"chunk": 146,
"story": 10,
"summary": "She accepts; the family, touched, apologise for misjudging him, then mention a letter that arrived.",
"predicament": "A schemer whose plan has worked is thanked for his goodness while the ground starts to shift under him."
},
{
"chunk": 147,
"story": 10,
"summary": "The lawyers' letter says a later will was found and she has nothing; the dealer, now engaged to a poor woman, is left alone with her to court.",
"predicament": "A man who faked a disaster to win a prize learns the disaster is real, and he is bound to his promise."
},
{
"chunk": 148,
"story": 11,
"summary": "In an inn, men trade ghost stories; a sceptical old sailor mocks sailors' visions, then admits one uncanny experience on land.",
"predicament": "A sceptic among believers is pressed to admit whether he has ever seen anything he could not explain."
},
{
"chunk": 149,
"story": 11,
"summary": "As a young man back from abroad, the narrator found his relatives away, took lodgings at a dull inn, and set out on a long country walk.",
"predicament": "A young man who arrived to find no one expecting him has to fill empty days in a strange place."
},
{
"chunk": 150,
"story": 11,
"summary": "He loses his way in the marshes as fog and night come down, and at last finds a road and hears footsteps.",
"predicament": "A traveller lost in the dark and the cold must find shelter before night closes in."
},
{
"chunk": 151,
"story": 11,
"summary": "A countryman sets him on the road but warns him away from a lit house nearby, said to hide something monstrous; tired, he goes to it anyway.",
"predicament": "A worn-out traveller must choose between a long walk on and a nearby shelter he has been warned against."
},
{
"chunk": 152,
"story": 11,
"summary": "A grim old woman and a huge old man answer; after a furtive exchange the man insists he stay for dinner, and he feels trapped.",
"predicament": "A stranger taken in by odd hosts who seem keen to keep him wonders whether he has walked into a trap."
},
{
"chunk": 153,
"story": 11,
"summary": "The host says his son will dine with them in the dark because of his eyes; he puts out the candles, and a strange voice speaks.",
"predicament": "A guest must sit down in the dark with someone he cannot see, on hosts' terms he does not understand."
},
{
"chunk": 154,
"story": 11,
"summary": "The host leaves him alone with the unseen son, and the guest thinks he sees wild eyes shining at him across the table.",
"predicament": "A guest left alone with a stranger he cannot see grows afraid, and must decide whether to trust his hosts."
},
{
"chunk": 155,
"story": 11,
"summary": "The screen falls, and firelight shows the son's ruined face; the father lights the candles and explains his son was disfigured in a fire.",
"predicament": "A frightened man sees what he feared, and learns it is someone who was hurt and ashamed to be seen."
},
{
"chunk": 156,
"story": 11,
"summary": "The guest apologises warmly; they celebrate the son's birthday until midnight, and the father toasts the children his son saved.",
"predicament": "A man who shrank from someone must make amends, and finds they deserve his respect."
}
]
File diff suppressed because one or more lines are too long
+13
View File
@@ -0,0 +1,13 @@
#!/usr/bin/env python3
"""Print a range of scenes for reading. Usage: dump.py <first_chunk> <last_chunk>"""
import json, sys
chunks = json.load(open(__file__.rsplit('/',1)[0] + '/chunks.json'))
a, b = int(sys.argv[1]), int(sys.argv[2])
cur = None
for i in range(a, min(b + 1, len(chunks))):
c = chunks[i]
if c['story'] != cur:
cur = c['story']
print(f"\n########## STORY {cur}: {c['title']} ##########")
print(f"\n----- scene {i} (story {cur}) -----")
print(c['text'].strip())
@@ -0,0 +1,48 @@
"""Split the Standard Ebooks single-page HTML of W. W. Jacobs, *The Lady of the Barge*, into stories,
then cut scenes with the same rule as ../chunk.py (paragraph boundaries, ~320 words, tail >= 80).
Deterministic: each story is a <section> with an <h2 epub:type="title">. Front and back matter
(contents, imprint, colophon, uncopyright) are dropped by name."""
import html, json, pathlib, re
SKIP = {'Table of Contents', 'Imprint', 'Colophon', 'Uncopyright'}
TARGET = 320
VOLUME = 'The Lady of the Barge (W. W. Jacobs, 1902)'
raw = pathlib.Path('corpus/lady-of-the-barge.html').read_text(encoding='utf-8')
body = raw[raw.find('<body'):]
parts = re.split(r'<h2[^>]*epub:type="title"[^>]*>(.*?)</h2>', body, flags=re.S)
def text_of(fragment):
paras = []
for p in re.findall(r'<p[^>]*>(.*?)</p>', fragment, flags=re.S):
t = html.unescape(re.sub(r'<[^>]+>', '', p))
t = re.sub(r'\s+', ' ', t).strip()
if t: paras.append(t)
return paras
stories = []
for i in range(1, len(parts), 2):
title = html.unescape(re.sub(r'<[^>]+>', '', parts[i])).strip()
if title in SKIP: continue
paras = text_of(parts[i + 1])
stories.append({'volume': VOLUME, 'title': title, 'words': sum(len(p.split()) for p in paras),
'text': '\n\n'.join(paras)})
chunks = []
for si, s in enumerate(stories):
buf, n = [], 0
for p in s['text'].split('\n\n'):
w = len(p.split())
if n + w > TARGET and buf:
chunks.append({'story': si, 'title': s['title'], 'volume': s['volume'], 'text': ' '.join(buf), 'words': n})
buf, n = [], 0
buf.append(p); n += w
if buf and n >= 80:
chunks.append({'story': si, 'title': s['title'], 'volume': s['volume'], 'text': ' '.join(buf), 'words': n})
pathlib.Path('stories.json').write_text(json.dumps(stories, indent=1, ensure_ascii=False), encoding='utf-8')
pathlib.Path('chunks.json').write_text(json.dumps(chunks, ensure_ascii=False), encoding='utf-8')
for si, s in enumerate(stories):
print(f"{si:2} {s['title']:24} {s['words']:6} words {sum(c['story']==si for c in chunks):3} scenes")
ws = sorted(c['words'] for c in chunks)
print(f'stories {len(stories)} scenes {len(chunks)} words/scene min {ws[0]} median {ws[len(ws)//2]} max {ws[-1]} total {sum(ws):,}')
File diff suppressed because one or more lines are too long
@@ -0,0 +1,351 @@
{
"model": "qwen3:14b",
"prompt": "You describe the predicament of the main person in a passage of fiction, in ONE sentence.\n\nA predicament is what that person is up against and what they want out of it: the kind of trouble or opportunity that could happen to anyone, in any line of work, in any town.\n\nRules:\n- Exactly one sentence, at most 20 words.\n- Leave out everything that ties it to this story: no names, no jobs or professions, no places, no businesses, and no objects that only belong to this story.\n- Say what the person is up against, and what they want.\n- Do not describe the writing, the mood, or who is telling the story.\n- Output only the sentence.",
"summaries": [
{
"chunk": 0,
"story": 0,
"summary": "A man struggles to understand the overwhelming complexity of a city's collective voice, seeking clarity in a world filled with individual sounds but no unified message.",
"model_output": "A man struggles to understand the overwhelming complexity of a city's collective voice, seeking clarity in a world filled with individual sounds but no unified message.",
"raw": "A man struggles to understand the overwhelming complexity of a city's collective voice, seeking clarity in a world filled with individual sounds but no unified message.",
"names_removed": []
},
{
"chunk": 1,
"story": 0,
"summary": "The person is trying to understand the city's hidden message, hoping to find a unified voice that reveals its true nature.",
"model_output": "The person is trying to understand the city's hidden message, hoping to find a unified voice that reveals its true nature.",
"raw": "The person is trying to understand the city's hidden message, hoping to find a unified voice that reveals its true nature.",
"names_removed": []
},
{
"chunk": 2,
"story": 0,
"summary": "A man determined to uncover the unique voice of a city faces the challenge of distinguishing its true character from the distractions and distractions of daily life.",
"model_output": "A man determined to uncover the unique voice of a city faces the challenge of distinguishing its true character from the distractions and distractions of daily life.",
"raw": "A man determined to uncover the unique voice of a city faces the challenge of distinguishing its true character from the distractions and distractions of daily life.",
"names_removed": []
},
{
"chunk": 3,
"story": 0,
"summary": "A man tries to uncover the city's hidden voice through a cop, only to find that the cop's personal life and indifference to the city's soul leave him with no real answers.",
"model_output": "A man tries to uncover the city's hidden voice through a cop, only to find that the cop's personal life and indifference to the city's soul leave him with no real answers.",
"raw": "A man tries to uncover the city's hidden voice through a cop, only to find that the cop's personal life and indifference to the city's soul leave him with no real answers.",
"names_removed": []
},
{
"chunk": 4,
"story": 0,
"summary": "A man seeks to capture the essence of a city's soul through a unique blend of its sounds, hoping to create a single, powerful vocalization that represents its spirit.",
"model_output": "A man seeks to capture the essence of a city's soul through a unique blend of its sounds, hoping to create a single, powerful vocalization that represents its spirit.",
"raw": "A man seeks to capture the essence of a city's soul through a unique blend of its sounds, hoping to create a single, powerful vocalization that represents its spirit.",
"names_removed": []
},
{
"chunk": 5,
"story": 0,
"summary": "A man seeks understanding from a city that refuses to speak, desperate to uncover a hidden truth that eludes everyone else.",
"model_output": "A man seeks understanding from a city that refuses to speak, desperate to uncover a hidden truth that eludes everyone else.",
"raw": "A man seeks understanding from a city that refuses to speak, desperate to uncover a hidden truth that eludes everyone else.",
"names_removed": []
},
{
"chunk": 6,
"story": 0,
"summary": "Someone and the narrator sit in silence, caught between the quiet intimacy of the moment and the unspoken weight of the city's presence.",
"model_output": "Aurelia and the narrator sit in silence, caught between the quiet intimacy of the moment and the unspoken weight of the city's presence.",
"raw": "Aurelia and the narrator sit in silence, caught between the quiet intimacy of the moment and the unspoken weight of the city's presence.",
"names_removed": [
"Aurelia"
]
},
{
"chunk": 7,
"story": 1,
"summary": "Someone must navigate the harsh realities of poverty, love, and war all at once in the crowded, unforgiving city.",
"model_output": "John Hopkins must navigate the harsh realities of poverty, love, and war all at once in the crowded, unforgiving city.",
"raw": "John Hopkins must navigate the harsh realities of poverty, love, and war all at once in the crowded, unforgiving city.",
"names_removed": [
"John",
"Hopkins"
]
},
{
"chunk": 8,
"story": 1,
"summary": "Someone must navigate the chaotic unpredictability of city life while clinging to the comfort of her familiar routines.",
"model_output": "Mrs. Hopkins must navigate the chaotic unpredictability of city life while clinging to the comfort of her familiar routines.",
"raw": "Mrs. Hopkins must navigate the chaotic unpredictability of city life while clinging to the comfort of her familiar routines.",
"names_removed": [
"Mrs.",
"Hopkins"
]
},
{
"chunk": 9,
"story": 1,
"summary": "Someone longs for connection but is trapped in a life of monotony and shallow conversation.",
"model_output": "John Hopkins longs for connection but is trapped in a life of monotony and shallow conversation.",
"raw": "John Hopkins longs for connection but is trapped in a life of monotony and shallow conversation.",
"names_removed": [
"John",
"Hopkins"
]
},
{
"chunk": 10,
"story": 1,
"summary": "A man tries to pay for a purchase with a promise of future money, but his dishonesty sparks a violent confrontation with a shopkeeper who sees his actions as proof of humanity's corruption.",
"model_output": "A man tries to pay for a purchase with a promise of future money, but his dishonesty sparks a violent confrontation with a shopkeeper who sees his actions as proof of humanity's corruption.",
"raw": "A man tries to pay for a purchase with a promise of future money, but his dishonesty sparks a violent confrontation with a shopkeeper who sees his actions as proof of humanity's corruption.",
"names_removed": []
},
{
"chunk": 11,
"story": 1,
"summary": "A man flees from police pursuit, seeking refuge in an unknown vehicle that offers him a chance to escape, but must decide whether to trust his mysterious rescuer.",
"model_output": "A man flees from police pursuit, seeking refuge in an unknown vehicle that offers him a chance to escape, but must decide whether to trust his mysterious rescuer.",
"raw": "A man flees from police pursuit, seeking refuge in an unknown vehicle that offers him a chance to escape, but must decide whether to trust his mysterious rescuer.",
"names_removed": []
},
{
"chunk": 12,
"story": 1,
"summary": "A man finds himself unexpectedly drawn into a personal conflict he did not ask for, yet must navigate with courage and discretion.",
"model_output": "A man finds himself unexpectedly drawn into a personal conflict he did not ask for, yet must navigate with courage and discretion.",
"raw": "A man finds himself unexpectedly drawn into a personal conflict he did not ask for, yet must navigate with courage and discretion.",
"names_removed": []
},
{
"chunk": 13,
"story": 1,
"summary": "Someone must confront a man who has wronged a woman he now feels compelled to protect, risking his own safety to do so.",
"model_output": "John Hopkins must confront a man who has wronged a woman he now feels compelled to protect, risking his own safety to do so.",
"raw": "John Hopkins must confront a man who has wronged a woman he now feels compelled to protect, risking his own safety to do so.",
"names_removed": [
"John",
"Hopkins"
]
},
{
"chunk": 14,
"story": 1,
"summary": "A man struggles to reconcile his growing affection for a woman with the rigid expectations of his social circle.",
"model_output": "A man struggles to reconcile his growing affection for a woman with the rigid expectations of his social circle.",
"raw": "A man struggles to reconcile his growing affection for a woman with the rigid expectations of his social circle.",
"names_removed": []
},
{
"chunk": 15,
"story": 2,
"summary": "Someone, trapped in a monotonous job she despises, longs for a life that offers more than just the dull routine of selling gloves.",
"model_output": "Masie, trapped in a monotonous job she despises, longs for a life that offers more than just the dull routine of selling gloves.",
"raw": "Masie, trapped in a monotonous job she despises, longs for a life that offers more than just the dull routine of selling gloves.",
"names_removed": [
"Masie"
]
},
{
"chunk": 16,
"story": 2,
"summary": "A man finds himself trapped in an awkward encounter with a shopgirl whose icy beauty challenges his composure, forcing him to navigate the delicate line between professional decorum and unexpected attraction.",
"model_output": "A man finds himself trapped in an awkward encounter with a shopgirl whose icy beauty challenges his composure, forcing him to navigate the delicate line between professional decorum and unexpected attraction.",
"raw": "A man finds himself trapped in an awkward encounter with a shopgirl whose icy beauty challenges his composure, forcing him to navigate the delicate line between professional decorum and unexpected attraction.",
"names_removed": []
},
{
"chunk": 17,
"story": 2,
"summary": "A man struggling with his pride and social conventions finds himself awkwardly drawn to a shopgirl, determined to win her favor despite his usual confidence.",
"model_output": "A man struggling with his pride and social conventions finds himself awkwardly drawn to a shopgirl, determined to win her favor despite his usual confidence.",
"raw": "A man struggling with his pride and social conventions finds himself awkwardly drawn to a shopgirl, determined to win her favor despite his usual confidence.",
"names_removed": []
},
{
"chunk": 18,
"story": 2,
"summary": "A young woman balances between curiosity and caution as she agrees to meet a man she barely knows, hoping to explore new possibilities without disappointing her family or losing her sense of self.",
"model_output": "A young woman balances between curiosity and caution as she agrees to meet a man she barely knows, hoping to explore new possibilities without disappointing her family or losing her sense of self.",
"raw": "A young woman balances between curiosity and caution as she agrees to meet a man she barely knows, hoping to explore new possibilities without disappointing her family or losing her sense of self.",
"names_removed": []
},
{
"chunk": 19,
"story": 2,
"summary": "A man torn between his growing feelings for a woman he barely knows and his fear of losing control of his life struggles to navigate the uncertain path of love.",
"model_output": "A man torn between his growing feelings for a woman he barely knows and his fear of losing control of his life struggles to navigate the uncertain path of love.",
"raw": "A man torn between his growing feelings for a woman he barely knows and his fear of losing control of his life struggles to navigate the uncertain path of love.",
"names_removed": []
},
{
"chunk": 20,
"story": 2,
"summary": "A man insists a woman marry him, claiming his wealth and status make them equal, but she sees through his words and mocks his desperate, insincere pursuit.",
"model_output": "A man insists a woman marry him, claiming his wealth and status make them equal, but she sees through his words and mocks his desperate, insincere pursuit.",
"raw": "A man insists a woman marry him, claiming his wealth and status make them equal, but she sees through his words and mocks his desperate, insincere pursuit.",
"names_removed": []
},
{
"chunk": 21,
"story": 2,
"summary": "A man tries to convince a hesitant woman to leave her mundane life and embark on an extravagant, uncertain journey with him.",
"model_output": "A man tries to convince a hesitant woman to leave her mundane life and embark on an extravagant, uncertain journey with him.",
"raw": "A man tries to convince a hesitant woman to leave her mundane life and embark on an extravagant, uncertain journey with him.",
"names_removed": []
},
{
"chunk": 22,
"story": 2,
"summary": "A woman hides her growing feelings for a man while pretending to be uninterested, hoping to keep their connection without giving in to the possibility of love.",
"model_output": "A woman hides her growing feelings for a man while pretending to be uninterested, hoping to keep their connection without giving in to the possibility of love.",
"raw": "A woman hides her growing feelings for a man while pretending to be uninterested, hoping to keep their connection without giving in to the possibility of love.",
"names_removed": []
},
{
"chunk": 23,
"story": 3,
"summary": "Big someone must navigate the rigid codes of his underground world while seeking a way to break free and claim a life beyond the shadows.",
"model_output": "Big Jim Dougherty must navigate the rigid codes of his underground world while seeking a way to break free and claim a life beyond the shadows.",
"raw": "Big Jim Dougherty must navigate the rigid codes of his underground world while seeking a way to break free and claim a life beyond the shadows.",
"names_removed": [
"Jim",
"Dougherty"
]
},
{
"chunk": 24,
"story": 3,
"summary": "A man struggles to balance his cultural identity and personal life while navigating the expectations of his community and the quiet routine of his domestic existence.",
"model_output": "A man struggles to balance his cultural identity and personal life while navigating the expectations of his community and the quiet routine of his domestic existence.",
"raw": "A man struggles to balance his cultural identity and personal life while navigating the expectations of his community and the quiet routine of his domestic existence.",
"names_removed": []
},
{
"chunk": 25,
"story": 3,
"summary": "A man accustomed to routine is confronted with an unexpected request for companionship, forcing him to reconsider the balance between habit and connection.",
"model_output": "A man accustomed to routine is confronted with an unexpected request for companionship, forcing him to reconsider the balance between habit and connection.",
"raw": "A man accustomed to routine is confronted with an unexpected request for companionship, forcing him to reconsider the balance between habit and connection.",
"names_removed": []
},
{
"chunk": 26,
"story": 3,
"summary": "A man struggling to reconcile his desire to display his wife publicly with his fear of judgment finds himself torn between pride and secrecy.",
"model_output": "A man struggling to reconcile his desire to display his wife publicly with his fear of judgment finds himself torn between pride and secrecy.",
"raw": "A man struggling to reconcile his desire to display his wife publicly with his fear of judgment finds himself torn between pride and secrecy.",
"names_removed": []
},
{
"chunk": 27,
"story": 3,
"summary": "A man struggles to reconcile his pride with the growing awareness of his wife's hidden talents and the shame of having underestimated her.",
"model_output": "A man struggles to reconcile his pride with the growing awareness of his wife's hidden talents and the shame of having underestimated her.",
"raw": "A man struggles to reconcile his pride with the growing awareness of his wife's hidden talents and the shame of having underestimated her.",
"names_removed": []
},
{
"chunk": 28,
"story": 3,
"summary": "A man struggles to reconcile his quiet life with the sudden, overwhelming attention his wife receives, threatening to expose the hidden depths of their marriage.",
"model_output": "A man struggles to reconcile his quiet life with the sudden, overwhelming attention his wife receives, threatening to expose the hidden depths of their marriage.",
"raw": "A man struggles to reconcile his quiet life with the sudden, overwhelming attention his wife receives, threatening to expose the hidden depths of their marriage.",
"names_removed": []
},
{
"chunk": 29,
"story": 3,
"summary": "A man struggles to maintain his pride and dignity after a public embarrassment, while trying to preserve his relationship and quiet his wife's growing happiness.",
"model_output": "A man struggles to maintain his pride and dignity after a public embarrassment, while trying to preserve his relationship and quiet his wife's growing happiness.",
"raw": "A man struggles to maintain his pride and dignity after a public embarrassment, while trying to preserve his relationship and quiet his wife's growing happiness.",
"names_removed": []
},
{
"chunk": 30,
"story": 3,
"summary": "A woman trapped in a love that bends her will longs for a simple peach, while her powerful but obedient husband struggles to fulfill her wish in a world that resists giving way.",
"model_output": "A woman trapped in a love that bends her will longs for a simple peach, while her powerful but obedient husband struggles to fulfill her wish in a world that resists giving way.",
"raw": "A woman trapped in a love that bends her will longs for a simple peach, while her powerful but obedient husband struggles to fulfill her wish in a world that resists giving way.",
"names_removed": []
},
{
"chunk": 31,
"story": 3,
"summary": "The Kid needs to find a peach for a woman who insists on it, but every vendor says it's too soon and offers only oranges instead.",
"model_output": "The Kid needs to find a peach for a woman who insists on it, but every vendor says it's too soon and offers only oranges instead.",
"raw": "The Kid needs to find a peach for a woman who insists on it, but every vendor says it's too soon and offers only oranges instead.",
"names_removed": []
},
{
"chunk": 32,
"story": 3,
"summary": "The Kid needs to convince the captain to raid a gambling den controlled by an old enemy, but he must do so quickly before the enemy discovers his betrayal.",
"model_output": "The Kid needs to convince the captain to raid a gambling den controlled by an old enemy, but he must do so quickly before the enemy discovers his betrayal.",
"raw": "The Kid needs to convince the captain to raid a gambling den controlled by an old enemy, but he must do so quickly before the enemy discovers his betrayal.",
"names_removed": []
},
{
"chunk": 33,
"story": 3,
"summary": "A man must prove his worth in a dangerous confrontation to claim a prize he's risking everything for.",
"model_output": "A man must prove his worth in a dangerous confrontation to claim a prize he's risking everything for.",
"raw": "A man must prove his worth in a dangerous confrontation to claim a prize he's risking everything for.",
"names_removed": []
},
{
"chunk": 34,
"story": 3,
"summary": "A man desperate to find a peach before it's too late races against time and rivals to secure his prize before it vanishes entirely.",
"model_output": "A man desperate to find a peach before it's too late races against time and rivals to secure his prize before it vanishes entirely.",
"raw": "A man desperate to find a peach before it's too late races against time and rivals to secure his prize before it vanishes entirely.",
"names_removed": []
},
{
"chunk": 35,
"story": 3,
"summary": "He risks danger to fetch a trivial gift for his bride, only to find her preference has changed.",
"model_output": "He risks danger to fetch a trivial gift for his bride, only to find her preference has changed.",
"raw": "He risks danger to fetch a trivial gift for his bride, only to find her preference has changed.",
"names_removed": []
},
{
"chunk": 36,
"story": 4,
"summary": "A man trapped in the monotony of city life longs for the genuine signs of spring, but finds only artificial reports replacing nature's quiet signals.",
"model_output": "A man trapped in the monotony of city life longs for the genuine signs of spring, but finds only artificial reports replacing nature's quiet signals.",
"raw": "A man trapped in the monotony of city life longs for the genuine signs of spring, but finds only artificial reports replacing nature's quiet signals.",
"names_removed": []
},
{
"chunk": 37,
"story": 4,
"summary": "Three men plot to steal a dollar from someone\u2019s wife, who unknowingly possesses it, forcing him to confront his friends' greed and protect her from their violent intentions.",
"model_output": "Three men plot to steal a dollar from Mr. Peters's wife, who unknowingly possesses it, forcing him to confront his friends' greed and protect her from their violent intentions.",
"raw": "Three men plot to steal a dollar from Mr. Peters's wife, who unknowingly possesses it, forcing him to confront his friends' greed and protect her from their violent intentions.",
"names_removed": [
"Mr.",
"Peters's"
]
},
{
"chunk": 38,
"story": 4,
"summary": "Someone must steal a case note from his wife's hidden stash to buy a dollar for beer, but he refuses to harm her despite his desperation.",
"model_output": "Mr. Peters must steal a case note from his wife's hidden stash to buy a dollar for beer, but he refuses to harm her despite his desperation.",
"raw": "Mr. Peters must steal a case note from his wife's hidden stash to buy a dollar for beer, but he refuses to harm her despite his desperation.",
"names_removed": [
"Mr.",
"Peters"
]
},
{
"chunk": 39,
"story": 4,
"summary": "A man trying to manipulate a woman with false promises faces her sharp rejection and must find another way to achieve his goal.",
"model_output": "A man trying to manipulate a woman with false promises faces her sharp rejection and must find another way to achieve his goal.",
"raw": "A man trying to manipulate a woman with false promises faces her sharp rejection and must find another way to achieve his goal.",
"names_removed": []
}
]
}
@@ -0,0 +1,410 @@
{
"model": "qwen2.5:3b-instruct",
"prompt": "You describe the predicament of the main person in a passage of fiction, in ONE sentence.\n\nA predicament is what that person is up against and what they want out of it: the kind of trouble or opportunity that could happen to anyone, in any line of work, in any town.\n\nRules:\n- Exactly one sentence, at most 20 words.\n- Leave out everything that ties it to this story: no names, no jobs or professions, no places, no businesses, and no objects that only belong to this story.\n- Say what the person is up against, and what they want.\n- Do not describe the writing, the mood, or who is telling the story.\n- Output only the sentence.",
"summaries": [
{
"chunk": 0,
"story": 0,
"summary": "Finding the voice of a big city, I sought in vain among school chants.",
"model_output": "Finding the voice of a big city, I sought in vain among school chants.",
"raw": "Finding the voice of a big city, I sought in vain among school chants.",
"names_removed": []
},
{
"chunk": 1,
"story": 0,
"summary": "I want to know the city's voice, but it echoes like someone.",
"model_output": "I want to know the city's voice, but it echoes like Philadelphia.",
"raw": "I want to know the city's voice, but it echoes like Philadelphia.",
"names_removed": [
"Philadelphia"
]
},
{
"chunk": 2,
"story": 0,
"summary": "I must find the unique voice of New someone, proving it doesn't treat me like a cigar.",
"model_output": "I must find the unique voice of New York, proving it doesn't treat me like a cigar.",
"raw": "I must find the unique voice of New York, proving it doesn't treat me like a cigar.",
"names_removed": [
"York"
]
},
{
"chunk": 3,
"story": 0,
"summary": "I want to know the city's cry, but the cop only follows orders.",
"model_output": "I want to know the city's cry, but the cop only follows orders.",
"raw": "I want to know the city's cry, but the cop only follows orders.",
"names_removed": []
},
{
"chunk": 4,
"story": 0,
"summary": "Bill, find the essence of New someone\u2019s chaos and harmony.",
"model_output": "Bill, find the essence of New York's chaos and harmony.",
"raw": "Bill, find the essence of New York's chaos and harmony.",
"names_removed": [
"York's"
]
},
{
"chunk": 5,
"story": 0,
"summary": "The poet seeks a hit with his poem, fearing rejection.",
"model_output": "The poet seeks a hit with his poem, fearing rejection.",
"raw": "The poet seeks a hit with his poem, fearing rejection.",
"names_removed": []
},
{
"chunk": 6,
"story": 0,
"summary": "Someone waits alone, wanting her companion to speak.",
"model_output": "Aurelia waits alone, wanting her companion to speak.",
"raw": "Aurelia waits alone, wanting her companion to speak.",
"names_removed": [
"Aurelia"
]
},
{
"chunk": 7,
"story": 1,
"summary": "Someone finds deepest life joys in a hidden quarter, not wealth.",
"model_output": "John Hopkins finds deepest life joys in a hidden quarter, not wealth.",
"raw": "John Hopkins finds deepest life joys in a hidden quarter, not wealth.",
"names_removed": [
"John",
"Hopkins"
]
},
{
"chunk": 8,
"story": 1,
"summary": "Someone struggles to balance her desires and fears in the fast-paced city.",
"model_output": "Mrs. Hopkins struggles to balance her desires and fears in the fast-paced city.",
"raw": "Mrs. Hopkins struggles to balance her desires and fears in the fast-paced city.",
"names_removed": [
"Mrs.",
"Hopkins"
]
},
{
"chunk": 9,
"story": 1,
"summary": "Someone sought to inject conversation into his tasteless existence by buying a cigar.",
"model_output": "John Hopkins sought to inject conversation into his tasteless existence by buying a cigar.",
"raw": "John Hopkins sought to inject conversation into his tasteless existence by buying a cigar.",
"names_removed": [
"John",
"Hopkins"
]
},
{
"chunk": 10,
"story": 1,
"summary": "Someone buys spinach, finds no cash, challenges tobacconist someone.",
"model_output": "Hopkins buys spinach, finds no cash, challenges tobacconist Freshmayer.",
"raw": "Hopkins buys spinach, finds no cash, challenges tobacconist Freshmayer.",
"names_removed": [
"Hopkins",
"Freshmayer"
]
},
{
"chunk": 11,
"story": 1,
"summary": "Someone sought revenge, but found himself pursued by law enforcers and a mysterious chauffeur in a racing car.",
"model_output": "John Hopkins sought revenge, but found himself pursued by law enforcers and a mysterious chauffeur in a racing car.",
"raw": "John Hopkins sought revenge, but found himself pursued by law enforcers and a mysterious chauffeur in a racing car.",
"names_removed": [
"John",
"Hopkins"
]
},
{
"chunk": 12,
"story": 1,
"summary": "Someone wants Milady's assistance against unseen attackers, while Milady seeks a brave companion.",
"model_output": "Hopkins wants Milady's assistance against unseen attackers, while Milady seeks a brave companion.",
"raw": "Hopkins wants Milady's assistance against unseen attackers, while Milady seeks a brave companion.",
"names_removed": [
"Hopkins"
]
},
{
"chunk": 13,
"story": 1,
"summary": "Someone seeks a romantic encounter, only to be kidnapped by a mysterious lady.",
"model_output": "John Hopkins seeks a romantic encounter, only to be kidnapped by a mysterious lady.",
"raw": "John Hopkins seeks a romantic encounter, only to be kidnapped by a mysterious lady.",
"names_removed": [
"John",
"Hopkins"
]
},
{
"chunk": 14,
"story": 1,
"summary": "Bess wants her St. Bernard, but someone wants her to stop reading dangerous novels.",
"model_output": "Bess wants her St. Bernard, but John wants her to stop reading dangerous novels.",
"raw": "Bess wants her St. Bernard, but John wants her to stop reading dangerous novels.",
"names_removed": [
"John"
]
},
{
"chunk": 15,
"story": 2,
"summary": "Someone, a young saleslady, seeks to navigate the complexities of human nature while hiding her true identity.",
"model_output": "Masie, a young saleslady, seeks to navigate the complexities of human nature while hiding her true identity.",
"raw": "Masie, a young saleslady, seeks to navigate the complexities of human nature while hiding her true identity.",
"names_removed": [
"Masie"
]
},
{
"chunk": 16,
"story": 2,
"summary": "The shopgirl someone confronts the floorwalker someone with her flirtatious gaze, testing his resolve.",
"model_output": "The shopgirl Masie confronts the floorwalker Irving Carter with her flirtatious gaze, testing his resolve.",
"raw": "The shopgirl Masie confronts the floorwalker Irving Carter with her flirtatious gaze, testing his resolve.",
"names_removed": [
"Masie",
"Irving",
"Carter"
]
},
{
"chunk": 17,
"story": 2,
"summary": "Someone desires to charm a shopgirl despite feeling out of place.",
"model_output": "Irving Carter desires to charm a shopgirl despite feeling out of place.",
"raw": "Irving Carter desires to charm a shopgirl despite feeling out of place.",
"names_removed": [
"Irving",
"Carter"
]
},
{
"chunk": 18,
"story": 2,
"summary": "Willie nervously asked for her company, hoping she'd agree to a date.",
"model_output": "Willie nervously asked for her company, hoping she'd agree to a date.",
"raw": "Willie nervously asked for her company, hoping she'd agree to a date.",
"names_removed": []
},
{
"chunk": 19,
"story": 2,
"summary": "Someone seeks love but fears rejection, while someone uses him to prove her worth.",
"model_output": "Carter seeks love but fears rejection, while Masie uses him to prove her worth.",
"raw": "Carter seeks love but fears rejection, while Masie uses him to prove her worth.",
"names_removed": [
"Carter",
"Masie"
]
},
{
"chunk": 20,
"story": 2,
"summary": "Someone faces someone\u2019s marriage proposal, wanting to see through his sincerity.",
"model_output": "Masie faces Carter's marriage proposal, wanting to see through his sincerity.",
"raw": "Masie faces Carter's marriage proposal, wanting to see through his sincerity.",
"names_removed": [
"Masie",
"Carter's"
]
},
{
"chunk": 21,
"story": 2,
"summary": "Someone looked up at someone, her eyes alight with a flicker of possibility.",
"model_output": "Masie looked up at Carter, her eyes alight with a flicker of possibility.",
"raw": "Masie looked up at Carter, her eyes alight with a flicker of possibility.",
"names_removed": [
"Masie",
"Carter"
]
},
{
"chunk": 22,
"story": 2,
"summary": "She wants to end their secret affair, but he feels a hidden joy.",
"model_output": "She wants to end their secret affair, but he feels a hidden joy.",
"raw": "She wants to end their secret affair, but he feels a hidden joy.",
"names_removed": []
},
{
"chunk": 23,
"story": 3,
"summary": "Big someone sought acceptance in someone\u2019s titled nobility of sportdom.",
"model_output": "Big Jim Dougherty sought acceptance in Manhattan's titled nobility of sportdom.",
"raw": "Big Jim Dougherty sought acceptance in Manhattan's titled nobility of sportdom.",
"names_removed": [
"Jim",
"Dougherty",
"Manhattan's"
]
},
{
"chunk": 24,
"story": 3,
"summary": "He seeks a private life away from his public Oriental sport, yet feels trapped in public life.",
"model_output": "He seeks a private life away from his public Oriental sport, yet feels trapped in public life.",
"raw": "He seeks a private life away from his public Oriental sport, yet feels trapped in public life.",
"names_removed": []
},
{
"chunk": 25,
"story": 3,
"summary": "Big someone\" expected her to ask for a dinner date, not insist on one.",
"model_output": "\"Big Jim\" expected her to ask for a dinner date, not insist on one.",
"raw": "Big Jim\" expected her to ask for a dinner date, not insist on one.",
"names_removed": [
"Jim"
]
},
{
"chunk": 26,
"story": 3,
"summary": "Big someone wanted to hide his wife's presence, but a mysterious bird-like being at her side made him change plans.",
"model_output": "Big Jim Dougherty wanted to hide his wife's presence, but a mysterious bird-like being at her side made him change plans.",
"raw": "Big Jim Dougherty wanted to hide his wife's presence, but a mysterious bird-like being at her side made him change plans.",
"names_removed": [
"Jim",
"Dougherty"
]
},
{
"chunk": 27,
"story": 3,
"summary": "Big someone seeks to impress his wife at a fancy restaurant, hoping her beauty and charm will win him praise.",
"model_output": "Big Jim seeks to impress his wife at a fancy restaurant, hoping her beauty and charm will win him praise.",
"raw": "Big Jim seeks to impress his wife at a fancy restaurant, hoping her beauty and charm will win him praise.",
"names_removed": [
"Jim"
]
},
{
"chunk": 28,
"story": 3,
"summary": "The honorable someone seeks to expose a secret and win someone\u2019s heart, while \"Big someone\" struggles to keep up.",
"model_output": "The honorable Patrick Corrigan seeks to expose a secret and win Mrs. Dougherty's heart, while \"Big Jim\" struggles to keep up.",
"raw": "The honorable Patrick Corrigan seeks to expose a secret and win Mrs. Dougherty's heart, while \"Big Jim\" struggles to keep up.",
"names_removed": [
"Patrick",
"Corrigan",
"Mrs.",
"Dougherty's",
"Jim"
]
},
{
"chunk": 29,
"story": 3,
"summary": "Someone seeks to impress someone with a bold gesture, but is thwarted by her quicker action.",
"model_output": "Patrick seeks to impress Mrs. Dougherty with a bold gesture, but is thwarted by her quicker action.",
"raw": "Patrick seeks to impress Mrs. Dougherty with a bold gesture, but is thwarted by her quicker action.",
"names_removed": [
"Patrick",
"Mrs.",
"Dougherty"
]
},
{
"chunk": 30,
"story": 3,
"summary": "The bride desires her husband's affection, yet fears losing him to distant admirers.",
"model_output": "The bride desires her husband's affection, yet fears losing him to distant admirers.",
"raw": "The bride desires her husband's affection, yet fears losing him to distant admirers.",
"names_removed": []
},
{
"chunk": 31,
"story": 3,
"summary": "The Kid seeks a peach but finds oranges instead, rushing to a fruiterer just as the lights go out.",
"model_output": "The Kid seeks a peach but finds oranges instead, rushing to a fruiterer just as the lights go out.",
"raw": "The Kid seeks a peach but finds oranges instead, rushing to a fruiterer just as the lights go out.",
"names_removed": []
},
{
"chunk": 32,
"story": 3,
"summary": "Kid seeks to infiltrate someone\u2019s gambling den but finds it closed, needing help from the captain.",
"model_output": "Kid seeks to infiltrate Denver Dick's gambling den but finds it closed, needing help from the captain.",
"raw": "Kid seeks to infiltrate Denver Dick's gambling den but finds it closed, needing help from the captain.",
"names_removed": [
"Denver",
"Dick's"
]
},
{
"chunk": 33,
"story": 3,
"summary": "The captain seeks to lead a raid, but doubts success as the Kid's plan unfolds.",
"model_output": "The captain seeks to lead a raid, but doubts success as the Kid's plan unfolds.",
"raw": "The captain seeks to lead a raid, but doubts success as the Kid's plan unfolds.",
"names_removed": []
},
{
"chunk": 34,
"story": 3,
"summary": "The Kid seeks a last peach at a lavish dinner, fearing theft, while authorities arrive.",
"model_output": "The Kid seeks a last peach at a lavish dinner, fearing theft, while authorities arrive.",
"raw": "The Kid seeks a last peach at a lavish dinner, fearing theft, while authorities arrive.",
"names_removed": []
},
{
"chunk": 35,
"story": 3,
"summary": "The Kid seeks to please his bride by delivering a requested peach, despite its trivial nature.",
"model_output": "The Kid seeks to please his bride by delivering a requested peach, despite its trivial nature.",
"raw": "The Kid seeks to please his bride by delivering a requested peach, despite its trivial nature.",
"names_removed": []
},
{
"chunk": 36,
"story": 4,
"summary": "Stuck in stone walls, city man craves nature's first signs to confirm spring's arrival.",
"model_output": "Stuck in stone walls, city man craves nature's first signs to confirm spring's arrival.",
"raw": "Stuck in stone walls, city man craves nature's first signs to confirm spring's arrival.",
"names_removed": []
},
{
"chunk": 37,
"story": 4,
"summary": "Someone wants the dollar his wife has, but fears losing face among friends.",
"model_output": "Mr. Peters wants the dollar his wife has, but fears losing face among friends.",
"raw": "Mr. Peters wants the dollar his wife has, but fears losing face among friends.",
"names_removed": [
"Mr.",
"Peters"
]
},
{
"chunk": 38,
"story": 4,
"summary": "Someone wants the dollar, but someone plans to get the case note instead.",
"model_output": "Maguire wants the dollar, but Mr. Peters plans to get the case note instead.",
"raw": "Maguire wants the dollar, but Mr. Peters plans to get the case note instead.",
"names_removed": [
"Maguire",
"Mr.",
"Peters"
]
},
{
"chunk": 39,
"story": 4,
"summary": "Someone schemes to charm someone away from a tea job, while she resists with a tough stance.",
"model_output": "Mr. Peters schemes to charm Mrs. Peters away from a tea job, while she resists with a tough stance.",
"raw": "Mr. Peters schemes to charm Mrs. Peters away from a tea job, while she resists with a tough stance.",
"names_removed": [
"Mr.",
"Peters",
"Mrs.",
"Peters"
]
}
]
}
@@ -0,0 +1,862 @@
<!doctype html><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>Predicament pilot</title>
<style>
:root{--bg:#f7f6f2;--card:#fff;--ink:#222;--dim:#666;--line:#ddd;--mark:#ffe08a;--pick:#e3f1e6}
@media (prefers-color-scheme:dark){:root{--bg:#1b1b1d;--card:#252528;--ink:#e6e6e6;--dim:#999;--line:#3a3a3e;--mark:#6b5415;--pick:#23402b}}
body{background:var(--bg);color:var(--ink);font:15px/1.5 system-ui,sans-serif;margin:0;padding:24px 16px}
main{max-width:980px;margin:auto} h1{margin:0 0 4px} .dim{color:var(--dim)}
table{border-collapse:collapse;margin:12px 0;font-size:14px} td,th{border-bottom:1px solid var(--line);padding:4px 10px;text-align:left}
.wrap{overflow-x:auto}
#tally{position:sticky;top:0;background:var(--bg);padding:8px 0;border-bottom:1px solid var(--line);z-index:1}
section{background:var(--card);border:1px solid var(--line);border-radius:8px;padding:12px 14px;margin:14px 0}
header .n{color:var(--dim);margin-right:4px} summary{cursor:pointer;color:var(--dim);margin:6px 0}
.scene{white-space:pre-wrap;font-size:13px;color:var(--dim)}
.pair{display:grid;grid-template-columns:1fr 1fr;gap:10px} @media (max-width:640px){.pair{grid-template-columns:1fr}}
.pred{border:1px solid var(--line);border-radius:6px;padding:8px 10px} .pred p{margin:4px 0 8px}
.pred:has(input:checked){background:var(--pick)} .who{font-size:12px;color:var(--dim)}
mark{background:var(--mark);color:inherit;border-radius:2px} .both{display:block;margin-top:8px;font-size:13px;color:var(--dim)}
</style>
<main>
<h1>Predicament pilot</h1>
<p class="dim">The first 40 scenes, each re-described by two models as the main person's predicament. Names are
already removed as the full run would. <mark>Highlighted</mark> words are jobs, relationships and places, the
words the old groups formed around. Pick the better sentence in each scene, or "neither". The column order
is fixed: qwen2.5:3b-instruct on the left.</p>
<p class="dim">What to look for: does the sentence say what the person is up against and what they want? Could
it happen to anyone, anywhere? Would two scenes with the same predicament end up with similar sentences?</p>
<div class="wrap"><table><tr><th>Model</th><th>Has a highlighted word</th><th>Says "city"</th><th>Words, mean</th><th>Most common openings</th></tr><tr><td>qwen2.5:3b-instruct</td><td>15 of 40</td><td>5</td><td>14</td><td>“The Kid seeks…” ×3; “I want to…” ×2; “Someone wants the…” ×2</td></tr><tr><td>qwen3:14b</td><td>13 of 40</td><td>10</td><td>25</td><td>“A man struggles…” ×6; “A man tries…” ×3; “A man seeks…” ×2</td></tr></table></div>
<div id="tally"></div>
<section data-i="0">
<header><span class="n">1</span> <b>THE VOICE OF THE CITY</b></header>
<details><summary>Scene summary: Someone, a schoolteacher, seeks the wisdom of her former students to understand the complex vocal messages of a bustling city.</summary>
<p class="scene">Twenty-five years ago the school children used to chant their
lessons. The manner of their delivery was a singsong recitative
between the utterance of an Episcopal minister and the drone of a
tired sawmill. I mean no disrespect. We must have lumber and sawdust. I remember one beautiful and instructive little lyric that emanated
from the physiology class. The most striking line of it was this: &quot;The shin-bone is the long-est bone in the hu-man bod-y.&quot; What an inestimable boon it would have been if all the corporeal
and spiritual facts pertaining to man had thus been tunefully and
logically inculcated in our youthful minds! But what we gained in
anatomy, music and philosophy was meagre. The other day I became confused. I needed a ray of light. I turned
back to those school days for aid. But in all the nasal harmonies
we whined forth from those hard benches I could not recall one that
treated of the voice of agglomerated mankind. In other words, of the composite vocal message of massed humanity. In other words, of the Voice of a Big City. Now, the individual voice is not lacking. We can understand the
song of the poet, the ripple of the brook, the meaning of the man
who wants $5 until …</p></details>
<div class="pair"><div class="pred"><span class="who">qwen2.5:3b-instruct</span><p>Finding the voice of a big city, I sought in vain among school chants.</p><label><input type="radio" name="p0" value="0"> better</label></div><div class="pred"><span class="who">qwen3:14b</span><p>A man struggles to understand the overwhelming complexity of a city&#x27;s collective voice, seeking clarity in a world filled with individual sounds but no unified message.</p><label><input type="radio" name="p0" value="1"> better</label></div></div>
<label class="both"><input type="radio" name="p0" value="n"> neither is a predicament</label>
</section><section data-i="1">
<header><span class="n">2</span> <b>THE VOICE OF THE CITY</b></header>
<details><summary>Scene summary: I want to know what the city says, but someone thinks it repeats what someone says.</summary>
<p class="scene">&quot;Tell me,&quot; I said, stammeringly, for I have no voice of my own, &quot;what
does this big--er--enormous--er--whopping city say? It must have a
voice of some kind. Does it ever speak to you? How do you interpret
its meaning? It is a tremendous mass, but it must have a key.&quot; &quot;Like a Saratoga trunk?&quot; asked Aurelia. &quot;No,&quot; said I. &quot;Please do not refer to the lid. I have a fancy that
every city has a voice. Each one has something to say to the one who
can hear it. What does the big one say to you?&quot; &quot;All cities,&quot; said Aurelia, judicially, &quot;say the same thing. When
they get through saying it there is an echo from Philadelphia. So,
they are unanimous.&quot; &quot;Here are 4,000,000 people,&quot; said I, scholastically, &quot;compressed upon
an island, which is mostly lamb surrounded by Wall Street water. The
conjunction of so many units into so small a space must result in an
identity--or, or rather a homogeneity that finds its oral expression
through a common channel. It is, as you might say, a consensus of
translation, concentrating in a crystallized, general idea which
reveals itself in what may be termed the Voice of the City. Can you
tell me what it is?&quot; Aurelia smiled wonderfully. She sat on the high stoop. A …</p></details>
<div class="pair"><div class="pred"><span class="who">qwen2.5:3b-instruct</span><p>I want to know the city&#x27;s voice, but it echoes like someone.</p><label><input type="radio" name="p1" value="0"> better</label></div><div class="pred"><span class="who">qwen3:14b</span><p>The person is trying to understand the city&#x27;s hidden message, hoping to find a unified voice that reveals its true nature.</p><label><input type="radio" name="p1" value="1"> better</label></div></div>
<label class="both"><input type="radio" name="p1" value="n"> neither is a predicament</label>
</section><section data-i="2">
<header><span class="n">3</span> <b>THE VOICE OF THE CITY</b></header>
<details><summary>Scene summary: I must find the Voice of New someone, but first I seek out someone, the best <mark>bartender</mark>, to learn the city&#x27;s unique ways.</summary>
<p class="scene">&quot;I must go and find out,&quot; I said, &quot;what is the Voice of this City.
Other cities have voices. It is an assignment. I must have it. New
York,&quot; I continued, in a rising tone, &quot;had better not hand me a cigar
and say: &#x27;Old man, I can&#x27;t talk for publication.&#x27; No other city acts
in that way. Chicago says, unhesitatingly, &#x27;I will;&#x27; I Philadelphia
says, &#x27;I should;&#x27; New Orleans says, &#x27;I used to;&#x27; Louisville says,
&#x27;Don&#x27;t care if I do;&#x27; St. Louis says, &#x27;Excuse me;&#x27; Pittsburg says,
&#x27;Smoke up.&#x27; Now, New York--&quot; Aurelia smiled. &quot;Very well,&quot; said I, &quot;I must go elsewhere and find out.&quot; I went into a palace, tile-floored, cherub-ceilinged and square with
the cop. I put my foot on the brass rail and said to Billy Magnus,
the best bartender in the diocese: &quot;Billy, you&#x27;ve lived in New York a long time--what kind of a
song-and-dance does this old town give you? What I mean is, doesn&#x27;t
the gab of it seem to kind of bunch up and slide over the bar to you
in a sort of amalgamated tip that hits off the burg in a kind of an
epigram with a dash of bitters and a slice of--&quot; &quot;Excuse me a minute,&quot; said Billy, &quot;somebody&#x27;s punching the button at
the side door.&quot; He went away; came back with an empty tin bucket; aga…</p></details>
<div class="pair"><div class="pred"><span class="who">qwen2.5:3b-instruct</span><p>I must find the unique voice of New someone, proving it doesn&#x27;t treat me like a cigar.</p><label><input type="radio" name="p2" value="0"> better</label></div><div class="pred"><span class="who">qwen3:14b</span><p>A man determined to uncover the unique voice of a city faces the challenge of distinguishing its true character from the distractions and distractions of daily life.</p><label><input type="radio" name="p2" value="1"> better</label></div></div>
<label class="both"><input type="radio" name="p2" value="n"> neither is a predicament</label>
</section><section data-i="3">
<header><span class="n">4</span> <b>THE VOICE OF THE CITY</b></header>
<details><summary>Scene summary: The <mark>cop</mark>, tasked with maintaining order, confronts a young man who questions the <mark>cop</mark>&#x27;s role and civic duty, leading to a conversation about the city&#x27;s unrest and the <mark>cop</mark>&#x27;s mundane nightly duties.</summary>
<p class="scene">I walked up to Broadway. I saw a cop on the corner. The cops take
kids up, women across, and men in. I went up to him. &quot;If I&#x27;m not exceeding the spiel limit,&quot; I said, &quot;let me ask you. You
see New York during its vocative hours. It is the function of you and
your brother cops to preserve the acoustics of the city. There must
be a civic voice that is intelligible to you. At night during your
lonely rounds you must have heard it. What is the epitome of its
turmoil and shouting? What does the city say to you?&quot; &quot;Friend,&quot; said the policeman, spinning his club, &quot;it don&#x27;t say
nothing. I get my orders from the man higher up. Say, I guess you&#x27;re
all right. Stand here for a few minutes and keep an eye open for the
roundsman.&quot; The cop melted into the darkness of the side street. In ten minutes
he had returned. &quot;Married last Tuesday,&quot; he said, half gruffly. &quot;You know how they
are. She comes to that corner at nine every night for a--comes to say
&#x27;hello!&#x27; I generally manage to be there. Say, what was it you asked
me a bit ago--what&#x27;s doing in the city? Oh, there&#x27;s a roof-garden or
two just opened, twelve blocks up.&quot; I crossed a crow&#x27;s-foot of street-car tracks, and skirted the edge
of an umbrageo…</p></details>
<div class="pair"><div class="pred"><span class="who">qwen2.5:3b-instruct</span><p>I want to know the city&#x27;s cry, but the <mark>cop</mark> only follows orders.</p><label><input type="radio" name="p3" value="0"> better</label></div><div class="pred"><span class="who">qwen3:14b</span><p>A man tries to uncover the city&#x27;s hidden voice through a <mark>cop</mark>, only to find that the <mark>cop</mark>&#x27;s personal life and indifference to the city&#x27;s soul leave him with no real answers.</p><label><input type="radio" name="p3" value="1"> better</label></div></div>
<label class="both"><input type="radio" name="p3" value="n"> neither is a predicament</label>
</section><section data-i="4">
<header><span class="n">5</span> <b>THE VOICE OF THE CITY</b></header>
<details><summary>Scene summary: Bill, in the role of someone, seeks a poetic description of New someone’s soul from someone, someone, someone, May, and someone, hinting at a symposium to capture the city&#x27;s multifaceted voice.</summary>
<p class="scene">&quot;Bill,&quot; said I (in the magazine he is Cleon), &quot;give me a lift. I am
on an assignment to find out the Voice of the city. You see, it&#x27;s a
special order. Ordinarily a symposium comprising the views of Henry
Clews, John L. Sullivan, Edwin Markham, May Irwin and Charles Schwab
would be about all. But this is a different matter. We want a broad,
poetic, mystic vocalization of the city&#x27;s soul and meaning. You are
the very chap to give me a hint. Some years ago a man got at the
Niagara Falls and gave us its pitch. The note was about two feet
below the lowest G on the piano. Now, you can&#x27;t put New York into a
note unless it&#x27;s better indorsed than that. But give me an idea of
what it would say if it should speak. It is bound to be a mighty and
far-reaching utterance. To arrive at it we must take the tremendous
crash of the chords of the day&#x27;s traffic, the laughter and music
of the night, the solemn tones of Dr. Parkhurst, the rag-time, the
weeping, the stealthy hum of cab-wheels, the shout of the press
agent, the tinkle of fountains on the roof gardens, the hullabaloo
of the strawberry vender and the covers of _Everybody&#x27;s Magazine_,
the whispers of the lovers in the parks--all these sounds …</p></details>
<div class="pair"><div class="pred"><span class="who">qwen2.5:3b-instruct</span><p>Bill, find the essence of New someone’s chaos and harmony.</p><label><input type="radio" name="p4" value="0"> better</label></div><div class="pred"><span class="who">qwen3:14b</span><p>A man seeks to capture the essence of a city&#x27;s soul through a unique blend of its sounds, hoping to create a single, powerful vocalization that represents its spirit.</p><label><input type="radio" name="p4" value="1"> better</label></div></div>
<label class="both"><input type="radio" name="p4" value="n"> neither is a predicament</label>
</section><section data-i="5">
<header><span class="n">6</span> <b>THE VOICE OF THE CITY</b></header>
<details><summary>Scene summary: The <mark>poet</mark> seeks advice from someone about his failed ties and unfulfilled prophecy, while a newsboy offers practical advice about buying a birthday present for someone.</summary>
<p class="scene">&quot;Do you remember,&quot; asked the poet, with a chuckle, &quot;that California
girl we met at Stiver&#x27;s studio last week? Well, I&#x27;m on my way to see
her. She repeated that poem of mine, &#x27;The Tribute of Spring,&#x27; word
for word. She&#x27;s the smartest proposition in this town just at
present. Say, how does this confounded tie look? I spoiled four
before I got one to set right.&quot; &quot;And the Voice that I asked you about?&quot; I inquired. &quot;Oh, she doesn&#x27;t sing,&quot; said Cleon. &quot;But you ought to hear her recite
my &#x27;Angel of the Inshore Wind.&#x27;&quot; I passed on. I cornered a newsboy and he flashed at me prophetic pink
papers that outstripped the news by two revolutions of the clock&#x27;s
longest hand. &quot;Son,&quot; I said, while I pretended to chase coins in my penny pocket,
&quot;doesn&#x27;t it sometimes seem to you as if the city ought to be able to
talk? All these ups and downs and funny business and queer things
happening every day--what would it say, do you think, if it could
speak?&quot; &quot;Quit yer kiddin&#x27;,&quot; said the boy. &quot;Wot paper yer want? I got no time
to waste. It&#x27;s Mag&#x27;s birthday, and I want thirty cents to git her a
present.&quot; Here was no interpreter of the city&#x27;s mouthpiece. I bought a paper,
and consigned its undeclared treaties, i…</p></details>
<div class="pair"><div class="pred"><span class="who">qwen2.5:3b-instruct</span><p>The <mark>poet</mark> seeks a hit with his poem, fearing rejection.</p><label><input type="radio" name="p5" value="0"> better</label></div><div class="pred"><span class="who">qwen3:14b</span><p>A man seeks understanding from a city that refuses to speak, desperate to uncover a hidden truth that eludes everyone else.</p><label><input type="radio" name="p5" value="1"> better</label></div></div>
<label class="both"><input type="radio" name="p5" value="n"> neither is a predicament</label>
</section><section data-i="6">
<header><span class="n">7</span> <b>THE VOICE OF THE CITY</b></header>
<details><summary>Scene summary: Someone waits on her porch as night deepens, while her companion remains silent, their hands finally meeting in a moment of unspoken understanding.</summary>
<p class="scene">Aurelia was still on the stoop. The moon was higher and the ivy
shadows were deeper. I sat at her side and we watched a little cloud
tilt at the drifting moon and go asunder quite pale and discomfited. And then, wonder of wonders and delight of delights! our hands
somehow touched, and our fingers closed together and did not part. After half an hour Aurelia said, with that smile of hers: &quot;Do you know, you haven&#x27;t spoken a word since you came back!&quot; &quot;That,&quot; said I, nodding wisely, &quot;is the Voice of the City.&quot; II</p></details>
<div class="pair"><div class="pred"><span class="who">qwen2.5:3b-instruct</span><p>Someone waits alone, wanting her companion to speak.</p><label><input type="radio" name="p6" value="0"> better</label></div><div class="pred"><span class="who">qwen3:14b</span><p>Someone and the narrator sit in silence, caught between the quiet intimacy of the moment and the unspoken weight of the city&#x27;s presence.</p><label><input type="radio" name="p6" value="1"> better</label></div></div>
<label class="both"><input type="radio" name="p6" value="n"> neither is a predicament</label>
</section><section data-i="7">
<header><span class="n">8</span> <b>THE COMPLETE LIFE OF JOHN HOPKINS</b></header>
<details><summary>Scene summary: Someone, a <mark>clerk</mark> at Insurance, seeks to understand life through poverty, love, and war, finding deeper meaning in urban experiences.</summary>
<p class="scene">There is a saying that no man has tasted the full flavour of life
until he has known poverty, love and war. The justness of this
reflection commends it to the lover of condensed philosophy. The
three conditions embrace about all there is in life worth knowing. A
surface thinker might deem that wealth should be added to the list.
Not so. When a poor man finds a long-hidden quarter-dollar that has
slipped through a rip into his vest lining, he sounds the pleasure of
life with a deeper plummet than any millionaire can hope to cast. It seems that the wise executive power that rules life has thought
best to drill man in these three conditions; and none may escape all
three. In rural places the terms do not mean so much. Poverty is less
pinching; love is temperate; war shrinks to contests about boundary
lines and the neighbors&#x27; hens. It is in the cities that our epigram
gains in truth and vigor; and it has remained for one John Hopkins to
crowd the experience into a rather small space of time. The Hopkins flat was like a thousand others. There was a rubber plant
in one window; a flea-bitten terrier sat in the other, wondering when
he was to have his day. John Hopkins was like a thousand …</p></details>
<div class="pair"><div class="pred"><span class="who">qwen2.5:3b-instruct</span><p>Someone finds deepest life joys in a hidden quarter, not wealth.</p><label><input type="radio" name="p7" value="0"> better</label></div><div class="pred"><span class="who">qwen3:14b</span><p>Someone must navigate the harsh realities of poverty, love, and war all at once in the crowded, unforgiving city.</p><label><input type="radio" name="p7" value="1"> better</label></div></div>
<label class="both"><input type="radio" name="p7" value="n"> neither is a predicament</label>
</section><section data-i="8">
<header><span class="n">9</span> <b>THE COMPLETE LIFE OF JOHN HOPKINS</b></header>
<details><summary>Scene summary: Someone navigated the mundane routines and sudden upheavals of city life, from thrift <mark>store</mark> sales to <mark>street</mark> encounters with danger.</summary>
<p class="scene">Mrs. Hopkins was like a thousand others. The auriferous tooth, the
sedentary disposition, the Sunday afternoon wanderlust, the draught
upon the delicatessen store for home-made comforts, the furor for
department store marked-down sales, the feeling of superiority to
the lady in the third-floor front who wore genuine ostrich tips and
had two names over her bell, the mucilaginous hours during which
she remained glued to the window sill, the vigilant avoidance of
the instalment man, the tireless patronage of the acoustics of the
dumb-waiter shaft--all the attributes of the Gotham flat-dweller were
hers. One moment yet of sententiousness and the story moves. In the Big City large and sudden things happen. You round a corner
and thrust the rib of your umbrella into the eye of your old friend
from Kootenai Falls. You stroll out to pluck a Sweet William in
the park--and lo! bandits attack you--you are ambulanced to the
hospital--you marry your nurse; are divorced--get squeezed while
short on U. P. S. and D. O. W. N. S.--stand in the bread line--marry
an heiress, take out your laundry and pay your club dues--seemingly
all in the wink of an eye. You travel the streets, and a finger
beckons …</p></details>
<div class="pair"><div class="pred"><span class="who">qwen2.5:3b-instruct</span><p>Someone struggles to balance her desires and fears in the fast-paced city.</p><label><input type="radio" name="p8" value="0"> better</label></div><div class="pred"><span class="who">qwen3:14b</span><p>Someone must navigate the chaotic unpredictability of city life while clinging to the comfort of her familiar routines.</p><label><input type="radio" name="p8" value="1"> better</label></div></div>
<label class="both"><input type="radio" name="p8" value="n"> neither is a predicament</label>
</section><section data-i="9">
<header><span class="n">10</span> <b>THE COMPLETE LIFE OF JOHN HOPKINS</b></header>
<details><summary>Scene summary: Someone sat in his <mark>flat</mark>, seeking conversation to spice up his life, while someone complained about the smells from across the hall.</summary>
<p class="scene">John Hopkins sat, after a compressed dinner, in his glove-fitting
straight-front flat. He sat upon a hornblende couch and gazed, with
satiated eyes, at Art Brought Home to the People in the shape of &quot;The
Storm&quot; tacked against the wall. Mrs. Hopkins discoursed droningly
of the dinner smells from the flat across the hall. The flea-bitten
terrier gave Hopkins a look of disgust, and showed a man-hating
tooth. Here was neither poverty, love, nor war; but upon such barren stems
may be grafted those essentials of a complete life. John Hopkins sought to inject a few raisins of conversation into
the tasteless dough of existence. &quot;Putting a new elevator in at the
office,&quot; he said, discarding the nominative noun, &quot;and the boss has
turned out his whiskers.&quot; &quot;You don&#x27;t mean it!&quot; commented Mrs. Hopkins. &quot;Mr. Whipples,&quot; continued John, &quot;wore his new spring suit down
to-day. I liked it fine It&#x27;s a gray with--&quot; He stopped, suddenly
stricken by a need that made itself known to him. &quot;I believe I&#x27;ll
walk down to the corner and get a five-cent cigar,&quot; he concluded. John Hopkins took his hat and picked his way down the musty halls and
stairs of the flat-house. The evening air was mild, and the streets s…</p></details>
<div class="pair"><div class="pred"><span class="who">qwen2.5:3b-instruct</span><p>Someone sought to inject conversation into his tasteless existence by buying a cigar.</p><label><input type="radio" name="p9" value="0"> better</label></div><div class="pred"><span class="who">qwen3:14b</span><p>Someone longs for connection but is trapped in a life of monotony and shallow conversation.</p><label><input type="radio" name="p9" value="1"> better</label></div></div>
<label class="both"><input type="radio" name="p9" value="n"> neither is a predicament</label>
</section><section data-i="10">
<header><span class="n">11</span> <b>THE COMPLETE LIFE OF JOHN HOPKINS</b></header>
<details><summary>Scene summary: Someone, seeking groceries, confronts someone over payment, escalating into a physical altercation in the <mark>store</mark>.</summary>
<p class="scene">Hopkins, unknown in the store, entered and called genially for his
&quot;bunch of spinach, car-fare grade.&quot; This imputation deepened the
pessimism of Freshmayer; but he set out a brand that came perilously
near to filling the order. Hopkins bit off the roots of his purchase,
and lighted up at the swinging gas jet. Feeling in his pockets to
make payment, he found not a penny there. &quot;Say, my friend,&quot; he explained, frankly, &quot;I&#x27;ve come out without any
change. Hand you that nickel first time I pass.&quot; Joy surged in Freshmayer&#x27;s heart. Here was corroboration of his
belief that the world was rotten and man a peripatetic evil. Without
a word he rounded the end of his counter and made earnest onslaught
upon his customer. Hopkins was no man to serve as a punching-bag for
a pessimistic tobacconist. He quickly bestowed upon Freshmayer a
colorado-maduro eye in return for the ardent kick that he received
from that dealer in goods for cash only. The impetus of the enemy&#x27;s attack forced the Hopkins line back to
the sidewalk. There the conflict raged; the pacific wooden Indian,
with his carven smile, was overturned, and those of the street who
delighted in carnage pressed round to view the zealous joust.</p></details>
<div class="pair"><div class="pred"><span class="who">qwen2.5:3b-instruct</span><p>Someone buys spinach, finds no cash, challenges tobacconist someone.</p><label><input type="radio" name="p10" value="0"> better</label></div><div class="pred"><span class="who">qwen3:14b</span><p>A man tries to pay for a purchase with a promise of future money, but his dishonesty sparks a violent confrontation with a <mark>shopkeeper</mark> who sees his actions as proof of humanity&#x27;s corruption.</p><label><input type="radio" name="p10" value="1"> better</label></div></div>
<label class="both"><input type="radio" name="p10" value="n"> neither is a predicament</label>
</section><section data-i="11">
<header><span class="n">12</span> <b>THE COMPLETE LIFE OF JOHN HOPKINS</b></header>
<details><summary>Scene summary: Someone, a rebus worker, eludes a <mark>policeman</mark> by running and jumping into a speeding car driven by a masked <mark>chauffeur</mark>, unaware of his passenger&#x27;s indifference.</summary>
<p class="scene">But then came the inevitable cop and imminent inconvenience for both
the attacker and attacked. John Hopkins was a peaceful citizen, who
worked at rebuses of nights in a flat, but he was not without the
fundamental spirit of resistance that comes with the battle-rage.
He knocked the policeman into a grocer&#x27;s sidewalk display of goods
and gave Freshmayer a punch that caused him temporarily to regret
that he had not made it a rule to extend a five-cent line of credit
to certain customers. Then Hopkins took spiritedly to his heels down
the sidewalk, closely followed by the cigar-dealer and the policeman,
whose uniform testified to the reason in the grocer&#x27;s sign that read:
&quot;Eggs cheaper than anywhere else in the city.&quot; As Hopkins ran he became aware of a big, low, red, racing automobile
that kept abreast of him in the street. This auto steered in to the
side of the sidewalk, and the man guiding it motioned to Hopkins
to jump into it. He did so without slackening his speed, and fell
into the turkey-red upholstered seat beside the chauffeur. The big
machine, with a diminuendo cough, flew away like an albatross down
the avenue into which the street emptied. The driver of the auto sped hi…</p></details>
<div class="pair"><div class="pred"><span class="who">qwen2.5:3b-instruct</span><p>Someone sought revenge, but found himself pursued by law enforcers and a mysterious <mark>chauffeur</mark> in a racing car.</p><label><input type="radio" name="p11" value="0"> better</label></div><div class="pred"><span class="who">qwen3:14b</span><p>A man flees from police pursuit, seeking refuge in an unknown vehicle that offers him a chance to escape, but must decide whether to trust his mysterious rescuer.</p><label><input type="radio" name="p11" value="1"> better</label></div></div>
<label class="both"><input type="radio" name="p11" value="n"> neither is a predicament</label>
</section><section data-i="12">
<header><span class="n">13</span> <b>THE COMPLETE LIFE OF JOHN HOPKINS</b></header>
<details><summary>Scene summary: Someone, seeking revenge for mistreatment by a man who has insulted the lady, agrees to help despite someone’s initial reluctance.</summary>
<p class="scene">&quot;Come quick. The lady, she will explain. It is the great honor you
will have, monsieur. Ah, that milady could call upon Armand to do
this thing! But, no, I am only one chauffeur.&quot; With vehement gestures the chauffeur conducted Hopkins into the
house. He was ushered into a small but luxurious reception chamber. A
lady, young, and possessing the beauty of visions, rose from a chair.
In her eyes smouldered a becoming anger. Her high-arched, threadlike
brows were ruffled into a delicious frown. &quot;Milady,&quot; said the chauffeur, bowing low, &quot;I have the honor to
relate to you that I went to the house of Monsieur Long and found
him to be not at home. As I came back I see this gentleman in
combat against--how you say--greatest odds. He is fighting with
five--ten--thirty men--gendarmes, _aussi_. Yes, milady, he what you
call &#x27;swat&#x27; one--three--eight policemans. If that Monsieur Long is
out I say to myself this gentleman he will serve milady so well, and
I bring him here.&quot; &quot;Very well, Armand,&quot; said the lady, &quot;you may go.&quot; She turned to
Hopkins. &quot;I sent my chauffeur,&quot; she said, &quot;to bring my cousin, Walter Long.
There is a man in this house who has treated me with insult and
abuse. I have complain…</p></details>
<div class="pair"><div class="pred"><span class="who">qwen2.5:3b-instruct</span><p>Someone wants Milady&#x27;s assistance against unseen attackers, while Milady seeks a brave companion.</p><label><input type="radio" name="p12" value="0"> better</label></div><div class="pred"><span class="who">qwen3:14b</span><p>A man finds himself unexpectedly drawn into a personal conflict he did not ask for, yet must navigate with courage and discretion.</p><label><input type="radio" name="p12" value="1"> better</label></div></div>
<label class="both"><input type="radio" name="p12" value="n"> neither is a predicament</label>
</section><section data-i="13">
<header><span class="n">14</span> <b>THE COMPLETE LIFE OF JOHN HOPKINS</b></header>
<details><summary>Scene summary: Someone, smug after a romantic encounter, confronts a young man who had been flirting with a lady he desires.</summary>
<p class="scene">John Hopkins thrust the remains of his cigar into his coat pocket.
He looked upon this winning creature and felt his first thrill of
romance. It was a knightly love, and contained no disloyalty to the
flat with the flea-bitten terrier and the lady of his choice. He had
married her after a picnic of the Lady Label Stickers&#x27; Union, Lodge
No. 2, on a dare and a bet of new hats and chowder all around with
his friend, Billy McManus. This angel who was begging him to come
to her rescue was something too heavenly for chowder, and as for
hats--golden, jewelled crowns for her! &quot;Say,&quot; said John Hopkins, &quot;just show me the guy that you&#x27;ve got the
grouch at. I&#x27;ve neglected my talents as a scrapper heretofore, but
this is my busy night.&quot; &quot;He is in there,&quot; said the lady, pointing to a closed door. &quot;Come.
Are you sure that you do not falter or fear?&quot; &quot;Me?&quot; said John Hopkins. &quot;Just give me one of those roses in the
bunch you are wearing, will you?&quot; The lady gave him a red, red rose. John Hopkins kissed it, stuffed it
into his vest pocket, opened the door and walked into the room. It
was a handsome library, softly but brightly lighted. A young man was
there, reading. &quot;Books on etiquette is what you …</p></details>
<div class="pair"><div class="pred"><span class="who">qwen2.5:3b-instruct</span><p>Someone seeks a romantic encounter, only to be kidnapped by a mysterious lady.</p><label><input type="radio" name="p13" value="0"> better</label></div><div class="pred"><span class="who">qwen3:14b</span><p>Someone must confront a man who has wronged a woman he now feels compelled to protect, risking his own safety to do so.</p><label><input type="radio" name="p13" value="1"> better</label></div></div>
<label class="both"><input type="radio" name="p13" value="n"> neither is a predicament</label>
</section><section data-i="14">
<header><span class="n">15</span> <b>THE COMPLETE LIFE OF JOHN HOPKINS</b></header>
<details><summary>Scene summary: Someone and someone argue over someone, a St. Bernard dog, while someone watches his philandering <mark>wife</mark> and <mark>daughter</mark>.</summary>
<p class="scene">&quot;Bess,&quot; he said calmly, &quot;I wish you would quit reading historical
novels. How in the world did that fellow get in here?&quot; &quot;Armand brought him,&quot; said the young lady. &quot;I think you are awfully
mean not to let me have that St. Bernard. I sent Armand for Walter. I
was so angry with you.&quot; &quot;Be sensible, Bess,&quot; said the young man, taking her arm. &quot;That dog
isn&#x27;t safe. He has bitten two or three people around the kennels.
Come now, let&#x27;s go tell auntie we are in good humor again.&quot; Arm in arm, they moved away. John Hopkins walked to his flat. The janitor&#x27;s five-year-old daughter
was playing on the steps. Hopkins gave her a nice, red rose and
walked upstairs. Mrs. Hopkins was philandering with curl-papers. &quot;Get your cigar?&quot; she asked, disinterestedly. &quot;Sure,&quot; said Hopkins, &quot;and I knocked around a while outside. It&#x27;s a
nice night.&quot; He sat upon the hornblende sofa, took out the stump of his cigar,
lighted it, and gazed at the graceful figures in &quot;The Storm&quot; on the
opposite wall. &quot;I was telling you,&quot; said he, &quot;about Mr. Whipple&#x27;s suit. It&#x27;s a gray,
with an invisible check, and it looks fine.&quot; III</p></details>
<div class="pair"><div class="pred"><span class="who">qwen2.5:3b-instruct</span><p>Bess wants her St. Bernard, but someone wants her to stop reading dangerous novels.</p><label><input type="radio" name="p14" value="0"> better</label></div><div class="pred"><span class="who">qwen3:14b</span><p>A man struggles to reconcile his growing affection for a woman with the rigid expectations of his social circle.</p><label><input type="radio" name="p14" value="1"> better</label></div></div>
<label class="both"><input type="radio" name="p14" value="n"> neither is a predicament</label>
</section><section data-i="15">
<header><span class="n">16</span> <b>A LICKPENNY LOVER</b></header>
<details><summary>Scene summary: Someone, a 19-year-old <mark>saleslady</mark> in men&#x27;s gloves, learns much about customers and human nature in the Biggest <mark>Store</mark>, while keeping her own secrets.</summary>
<p class="scene">There, were 3,000 girls in the Biggest Store. Masie was one of them.
She was eighteen and a saleslady in the gents&#x27; gloves. Here she
became versed in two varieties of human beings--the kind of gents who
buy their gloves in department stores and the kind of women who buy
gloves for unfortunate gents. Besides this wide knowledge of the
human species, Masie had acquired other information. She had listened
to the promulgated wisdom of the 2,999 other girls and had stored it
in a brain that was as secretive and wary as that of a Maltese cat.
Perhaps nature, foreseeing that she would lack wise counsellors, had
mingled the saving ingredient of shrewdness along with her beauty, as
she has endowed the silver fox of the priceless fur above the other
animals with cunning. For Masie was beautiful. She was a deep-tinted blonde, with the calm
poise of a lady who cooks butter cakes in a window. She stood behind
her counter in the Biggest Store; and as you closed your hand over
the tape-line for your glove measure you thought of Hebe; and as you
looked again you wondered how she had come by Minerva&#x27;s eyes. When the floorwalker was not looking Masie chewed tutti frutti; when
he was looking she gaze…</p></details>
<div class="pair"><div class="pred"><span class="who">qwen2.5:3b-instruct</span><p>Someone, a young <mark>saleslady</mark>, seeks to navigate the complexities of human nature while hiding her true identity.</p><label><input type="radio" name="p15" value="0"> better</label></div><div class="pred"><span class="who">qwen3:14b</span><p>Someone, trapped in a monotonous job she despises, longs for a life that offers more than just the dull routine of selling gloves.</p><label><input type="radio" name="p15" value="1"> better</label></div></div>
<label class="both"><input type="radio" name="p15" value="n"> neither is a predicament</label>
</section><section data-i="16">
<header><span class="n">17</span> <b>A LICKPENNY LOVER</b></header>
<details><summary>Scene summary: Someone, a wealthy <mark>visitor</mark>, hesitates as floorwalker someone confronts him with a <mark>shopgirl</mark> smile, unaware of the flirtatious nature of his profession.</summary>
<p class="scene">That is the shopgirl smile, and I enjoin you to shun it unless you
are well fortified with callosity of the heart, caramels and a
congeniality for the capers of Cupid. This smile belonged to Masie&#x27;s
recreation hours and not to the store; but the floorwalker must have
his own. He is the Shylock of the stores. When he comes nosing around
the bridge of his nose is a toll-bridge. It is goo-goo eyes or &quot;git&quot;
when he looks toward a pretty girl. Of course not all floorwalkers
are thus. Only a few days ago the papers printed news of one over
eighty years of age. One day Irving Carter, painter, millionaire, traveller, poet,
automobilist, happened to enter the Biggest Store. It is due to him
to add that his visit was not voluntary. Filial duty took him by the
collar and dragged him inside, while his mother philandered among the
bronze and terra-cotta statuettes. Carter strolled across to the glove counter in order to shoot a
few minutes on the wing. His need for gloves was genuine; he had
forgotten to bring a pair with him. But his action hardly calls for
apology, because he had never heard of glove-counter flirtations. As he neared the vicinity of his fate he hesitated, suddenly
conscious o…</p></details>
<div class="pair"><div class="pred"><span class="who">qwen2.5:3b-instruct</span><p>The <mark>shopgirl</mark> someone confronts the floorwalker someone with her flirtatious gaze, testing his resolve.</p><label><input type="radio" name="p16" value="0"> better</label></div><div class="pred"><span class="who">qwen3:14b</span><p>A man finds himself trapped in an awkward encounter with a <mark>shopgirl</mark> whose icy beauty challenges his composure, forcing him to navigate the delicate line between professional decorum and unexpected attraction.</p><label><input type="radio" name="p16" value="1"> better</label></div></div>
<label class="both"><input type="radio" name="p16" value="n"> neither is a predicament</label>
</section><section data-i="17">
<header><span class="n">18</span> <b>A LICKPENNY LOVER</b></header>
<details><summary>Scene summary: Someone, <mark>millionaire</mark>, felt both flattered and awkward as he encountered someone, a <mark>shopgirl</mark>, in a glove <mark>shop</mark>, realizing he had no social means to propose to her.</summary>
<p class="scene">And then Irving Carter, painter, millionaire, etc., felt a warm flush
rise to his aristocratically pale face. But not from diffidence. The
blush was intellectual in origin. He knew in a moment that he stood
in the ranks of the ready-made youths who wooed the giggling girls at
other counters. Himself leaned against the oaken trysting place of
a cockney Cupid with a desire in his heart for the favor of a glove
salesgirl. He was no more than Bill and Jack and Mickey. And then he
felt a sudden tolerance for them, and an elating, courageous contempt
for the conventions upon which he had fed, and an unhesitating
determination to have this perfect creature for his own. When the gloves were paid for and wrapped Carter lingered for a
moment. The dimples at the corners of Masie&#x27;s damask mouth deepened.
All gentlemen who bought gloves lingered in just that way. She curved
an arm, showing like Psyche&#x27;s through her shirt-waist sleeve, and
rested an elbow upon the show-case edge. Carter had never before encountered a situation of which he had not
been perfect master. But now he stood far more awkward than Bill
or Jack or Mickey. He had no chance of meeting this beautiful girl
socially. His mind …</p></details>
<div class="pair"><div class="pred"><span class="who">qwen2.5:3b-instruct</span><p>Someone desires to charm a <mark>shopgirl</mark> despite feeling out of place.</p><label><input type="radio" name="p17" value="0"> better</label></div><div class="pred"><span class="who">qwen3:14b</span><p>A man struggling with his pride and social conventions finds himself awkwardly drawn to a <mark>shopgirl</mark>, determined to win her favor despite his usual confidence.</p><label><input type="radio" name="p17" value="1"> better</label></div></div>
<label class="both"><input type="radio" name="p17" value="n"> neither is a predicament</label>
</section><section data-i="18">
<header><span class="n">19</span> <b>A LICKPENNY LOVER</b></header>
<details><summary>Scene summary: Someone, a lady in her late twenties, diplomatically turns down a man&#x27;s romantic overtures while subtly arranging a clandestine meeting with him.</summary>
<p class="scene">&quot;Will you please pardon me,&quot; he said, &quot;if I seem too bold; but I
earnestly hope you will allow me the pleasure of seeing you again.
There is my name; I assure you that it is with the greatest respect
that I ask the favor of becoming one of your fr--acquaintances. May
I not hope for the privilege?&quot; Masie knew men--especially men who buy gloves. Without hesitation she
looked him frankly and smilingly in the eyes, and said: &quot;Sure. I guess you&#x27;re all right. I don&#x27;t usually go out with strange
gentlemen, though. It ain&#x27;t quite ladylike. When should you want to
see me again?&quot; &quot;As soon as I may,&quot; said Carter. &quot;If you would allow me to call at
your home, I--&quot; Masie laughed musically. &quot;Oh, gee, no!&quot; she said, emphatically. &quot;If
you could see our flat once! There&#x27;s five of us in three rooms. I&#x27;d
just like to see ma&#x27;s face if I was to bring a gentleman friend
there!&quot; &quot;Anywhere, then,&quot; said the enamored Carter, &quot;that will be convenient
to you.&quot; &quot;Say,&quot; suggested Masie, with a bright-idea look in her peach-blow
face; &quot;I guess Thursday night will about suit me. Suppose you come to
the corner of Eighth Avenue and Forty-eighth Street at 7:30. I live
right near the corner. But I&#x27;ve got to be back hom…</p></details>
<div class="pair"><div class="pred"><span class="who">qwen2.5:3b-instruct</span><p>Willie nervously asked for her company, hoping she&#x27;d agree to a date.</p><label><input type="radio" name="p18" value="0"> better</label></div><div class="pred"><span class="who">qwen3:14b</span><p>A young woman balances between curiosity and caution as she agrees to meet a man she barely knows, hoping to explore new possibilities without disappointing her family or losing her sense of self.</p><label><input type="radio" name="p18" value="1"> better</label></div></div>
<label class="both"><input type="radio" name="p18" value="n"> neither is a predicament</label>
</section><section data-i="19">
<header><span class="n">20</span> <b>A LICKPENNY LOVER</b></header>
<details><summary>Scene summary: Someone, a young man, eagerly awaits a date with a <mark>street</mark>-corner <mark>shopgirl</mark>, while his <mark>mother</mark> chauffeurs him to a fancy <mark>restaurant</mark>.</summary>
<p class="scene">&quot;Permission to call!&quot; echoed small eyes, with a snigger. &quot;Did he say
anything about dinner in the Waldorf and a spin in his auto
afterward?&quot; &quot;Oh, cheese it!&quot; said Masie, wearily. &quot;You&#x27;ve been used to swell
things, I don&#x27;t think. You&#x27;ve had a swelled head ever since that
hose-cart driver took you out to a chop suey joint. No, he never
mentioned the Waldorf; but there&#x27;s a Fifth Avenue address on his
card, and if he buys the supper you can bet your life there won&#x27;t be
no pigtail on the waiter what takes the order.&quot; As Carter glided away from the Biggest Store with his mother in his
electric runabout, he bit his lip with a dull pain at his heart.
He knew that love had come to him for the first time in all the
twenty-nine years of his life. And that the object of it should make
so readily an appointment with him at a street corner, though it was
a step toward his desires, tortured him with misgivings. Carter did not know the shopgirl. He did not know that her home is
often either a scarcely habitable tiny room or a domicile filled to
overflowing with kith and kin. The street-corner is her parlor, the
park is her drawing-room; the avenue is her garden walk; yet for the
most part she is a…</p></details>
<div class="pair"><div class="pred"><span class="who">qwen2.5:3b-instruct</span><p>Someone seeks love but fears rejection, while someone uses him to prove her worth.</p><label><input type="radio" name="p19" value="0"> better</label></div><div class="pred"><span class="who">qwen3:14b</span><p>A man torn between his growing feelings for a woman he barely knows and his fear of losing control of his life struggles to navigate the uncertain path of love.</p><label><input type="radio" name="p19" value="1"> better</label></div></div>
<label class="both"><input type="radio" name="p19" value="n"> neither is a predicament</label>
</section><section data-i="20">
<header><span class="n">21</span> <b>A LICKPENNY LOVER</b></header>
<details><summary>Scene summary: Someone, a <mark>suitor</mark>, pressures someone into marriage, emphasizing his social superiority and wealth, while someone questions his sincerity and social status.</summary>
<p class="scene">&quot;Masie,&quot; said Carter, earnestly, &quot;you surely know that I love you. I
ask you sincerely to marry me. You know me well enough by this time
to have no doubts of me. I want you, and I must have you. I care
nothing for the difference in our stations.&quot; &quot;What is the difference?&quot; asked Masie, curiously. &quot;Well, there isn&#x27;t any,&quot; said Carter, quickly, &quot;except in the minds
of foolish people. It is in my power to give you a life of luxury. My
social position is beyond dispute, and my means are ample.&quot; &quot;They all say that,&quot; remarked Masie. &quot;It&#x27;s the kid they all give you.
I suppose you really work in a delicatessen or follow the races. I
ain&#x27;t as green as I look.&quot; &quot;I can furnish you all the proofs you want,&quot; said Carter, gently.
&quot;And I want you, Masie. I loved you the first day I saw you.&quot; &quot;They all do,&quot; said Masie, with an amused laugh, &quot;to hear &#x27;em talk.
If I could meet a man that got stuck on me the third time he&#x27;d seen
me I think I&#x27;d get mashed on him.&quot; &quot;Please don&#x27;t say such things,&quot; pleaded Carter. &quot;Listen to me, dear.
Ever since I first looked into your eyes you have been the only woman
in the world for me.&quot; &quot;Oh, ain&#x27;t you the kidder!&quot; smiled Masie. &quot;How many other girls did
you ever tell…</p></details>
<div class="pair"><div class="pred"><span class="who">qwen2.5:3b-instruct</span><p>Someone faces someone’s marriage proposal, wanting to see through his sincerity.</p><label><input type="radio" name="p20" value="0"> better</label></div><div class="pred"><span class="who">qwen3:14b</span><p>A man insists a woman marry him, claiming his wealth and status make them equal, but she sees through his words and mocks his desperate, insincere pursuit.</p><label><input type="radio" name="p20" value="1"> better</label></div></div>
<label class="both"><input type="radio" name="p20" value="n"> neither is a predicament</label>
</section><section data-i="21">
<header><span class="n">22</span> <b>A LICKPENNY LOVER</b></header>
<details><summary>Scene summary: Someone persistently courted someone, a <mark>shopgirl</mark>, offering her a life of leisure in exotic locations to break her from her mundane existence.</summary>
<p class="scene">But Carter persisted. And at length he reached the flimsy, fluttering
little soul of the shopgirl that existed somewhere deep down in her
lovely bosom. His words penetrated the heart whose very lightness was
its safest armor. She looked up at him with eyes that saw. And a warm
glow visited her cool cheeks. Tremblingly, awfully, her moth wings
closed, and she seemed about to settle upon the flower of love. Some
faint glimmer of life and its possibilities on the other side of her
glove counter dawned upon her. Carter felt the change and crowded the
opportunity. &quot;Marry me, Masie,&quot; he whispered softly, &quot;and we will go away from
this ugly city to beautiful ones. We will forget work and business,
and life will be one long holiday. I know where I should take you--I
have been there often. Just think of a shore where summer is eternal,
where the waves are always rippling on the lovely beach and the
people are happy and free as children. We will sail to those shores
and remain there as long as you please. In one of those far-away
cities there are grand and lovely palaces and towers full of
beautiful pictures and statues. The streets of the city are water,
and one travels about in--&quot; &quot;I know,…</p></details>
<div class="pair"><div class="pred"><span class="who">qwen2.5:3b-instruct</span><p>Someone looked up at someone, her eyes alight with a flicker of possibility.</p><label><input type="radio" name="p21" value="0"> better</label></div><div class="pred"><span class="who">qwen3:14b</span><p>A man tries to convince a hesitant woman to leave her mundane life and embark on an extravagant, uncertain journey with him.</p><label><input type="radio" name="p21" value="1"> better</label></div></div>
<label class="both"><input type="radio" name="p21" value="n"> neither is a predicament</label>
</section><section data-i="22">
<header><span class="n">23</span> <b>A LICKPENNY LOVER</b></header>
<details><summary>Scene summary: Someone, cool in his authority, insists they leave while someone’s uncertain nature holds sway, hinting at her potential marriage proposal to someone’s friend.</summary>
<p class="scene">&quot;I think we had better be going home,&quot; she said, coolly. &quot;It&#x27;s
getting late.&quot; Carter humored her. He had come to know her varying, thistle-down
moods, and that it was useless to combat them. But he felt a certain
happy triumph. He had held for a moment, though but by a silken
thread, the soul of his wild Psyche, and hope was stronger within
him. Once she had folded her wings and her cool hand had closed about
his own. At the Biggest Store the next day Masie&#x27;s chum, Lulu, waylaid her in
an angle of the counter. &quot;How are you and your swell friend making it? she asked. &quot;Oh, him?&quot; said Masie, patting her side curls. &quot;He ain&#x27;t in it any
more. Say, Lu, what do you think that fellow wanted me to do?&quot; &quot;Go on the stage?&quot; guessed Lulu, breathlessly. &quot;Nit; he&#x27;s too cheap a guy for that. He wanted me to marry him and go
down to Coney Island for a wedding tour!&quot; IV</p></details>
<div class="pair"><div class="pred"><span class="who">qwen2.5:3b-instruct</span><p>She wants to end their secret affair, but he feels a hidden joy.</p><label><input type="radio" name="p22" value="0"> better</label></div><div class="pred"><span class="who">qwen3:14b</span><p>A woman hides her growing feelings for a man while pretending to be uninterested, hoping to keep their connection without giving in to the possibility of love.</p><label><input type="radio" name="p22" value="1"> better</label></div></div>
<label class="both"><input type="radio" name="p22" value="n"> neither is a predicament</label>
</section><section data-i="23">
<header><span class="n">24</span> <b>DOUGHERTY&#x27;S EYE-OPENER</b></header>
<details><summary>Scene summary: Big someone coveted social acceptance from the titled nobility of someone’s sport world.</summary>
<p class="scene">Big Jim Dougherty was a sport. He belonged to that race of men.
In Manhattan it is a distinct race. They are the Caribs of the
North--strong, artful, self-sufficient, clannish, honorable within
the laws of their race, holding in lenient contempt neighboring
tribes who bow to the measure of Society&#x27;s tapeline. I refer, of
course, to the titled nobility of sportdom. There is a class which
bears as a qualifying adjective the substantive belonging to a wind
instrument made of a cheap and base metal. But the tin mines of
Cornwall never produced the material for manufacturing descriptive
nomenclature for &quot;Big Jim&quot; Dougherty. The habitat of the sport is the lobby or the outside corner of
certain hotels and combination restaurants and cafés. They are mostly
men of different sizes, running from small to large; but they are
unanimous in the possession of a recently shaven, blue-black cheek
and chin and dark overcoats (in season) with black velvet collars. Of the domestic life of the sport little is known. It has been said
that Cupid and Hymen sometimes take a hand in the game and copper the
queen of hearts to lose. Daring theorists have averred--not content
with simply saying--that a sport o…</p></details>
<div class="pair"><div class="pred"><span class="who">qwen2.5:3b-instruct</span><p>Big someone sought acceptance in someone’s titled nobility of sportdom.</p><label><input type="radio" name="p23" value="0"> better</label></div><div class="pred"><span class="who">qwen3:14b</span><p>Big someone must navigate the rigid codes of his underground world while seeking a way to break free and claim a life beyond the shadows.</p><label><input type="radio" name="p23" value="1"> better</label></div></div>
<label class="both"><input type="radio" name="p23" value="n"> neither is a predicament</label>
</section><section data-i="24">
<header><span class="n">25</span> <b>DOUGHERTY&#x27;S EYE-OPENER</b></header>
<details><summary>Scene summary: Big someone&quot; attends social gatherings with his fellow someone, avoiding his <mark>wife</mark> at home.</summary>
<p class="scene">But mostly the sport is Oriental. He believes his women-folk should
not be too patent. Somewhere behind grilles or flower-ornamented fire
escapes they await him. There, no doubt, they tread on rugs from
Teheran and are diverted by the bulbul and play upon the dulcimer and
feed upon sweetmeats. But away from his home the sport is an integer.
He does not, as men of other races in Manhattan do, become the convoy
in his unoccupied hours of fluttering laces and high heels that tick
off delectably the happy seconds of the evening parade. He herds with
his own race at corners, and delivers a commentary in his Carib lingo
upon the passing show. &quot;Big Jim&quot; Dougherty had a wife, but he did not wear a button portrait
of her upon his lapel. He had a home in one of those brown-stone,
iron-railed streets on the west side that look like a recently
excavated bowling alley of Pompeii. To this home of his Mr. Dougherty repaired each night when the hour
was so late as to promise no further diversion in the arch domains
of sport. By that time the occupant of the monogamistic harem would
be in dreamland, the bulbul silenced and the hour propitious for
slumber. &quot;Big Jim&quot; always arose at twelve, meridian,…</p></details>
<div class="pair"><div class="pred"><span class="who">qwen2.5:3b-instruct</span><p>He seeks a private life away from his public Oriental sport, yet feels trapped in public life.</p><label><input type="radio" name="p24" value="0"> better</label></div><div class="pred"><span class="who">qwen3:14b</span><p>A man struggles to balance his cultural identity and personal life while navigating the expectations of his community and the quiet routine of his domestic existence.</p><label><input type="radio" name="p24" value="1"> better</label></div></div>
<label class="both"><input type="radio" name="p24" value="n"> neither is a predicament</label>
</section><section data-i="25">
<header><span class="n">26</span> <b>DOUGHERTY&#x27;S EYE-OPENER</b></header>
<details><summary>Scene summary: Big someone&quot; someone reluctantly agreed to go out for <mark>dinner</mark> after his <mark>wife</mark> insisted, challenging his usual reluctance to leave the <mark>house</mark>.</summary>
<p class="scene">&quot;Big Jim&quot; Dougherty even listened to this conversation of hers
sometimes. He knew that she would have a nice dinner ready for him
every evening at seven when he came for it. She sometimes went to
matinées, and she had a talking machine with six dozen records. Once
when her Uncle Amos blew in on a wind from up-state, she went with
him to the Eden Musée. Surely these things were diversions enough for
any woman. One afternoon Mr. Dougherty finished his breakfast, put on his hat
and got away fairly for the door. When his hand was on the knob be
heard his wife&#x27;s voice. &quot;Jim,&quot; she said, firmly, &quot;I wish you would take me out to dinner this
evening. It has been three years since you have been outside the door
with me.&quot; &quot;Big Jim&quot; was astounded. She had never asked anything like this
before. It had the flavour of a totally new proposition. But he was a
game sport. &quot;All right,&quot; he said. &quot;You be ready when I come at seven. None of
this &#x27;wait two minutes till I primp an hour or two&#x27; kind of business,
now, Dele.&quot; &quot;I&#x27;ll be ready,&quot; said his wife, calmly. At seven she descended the stone steps in the Pompeian bowling alley
at the side of &quot;Big Jim&quot; Dougherty. She wore a dinner gown made of
a stuff t…</p></details>
<div class="pair"><div class="pred"><span class="who">qwen2.5:3b-instruct</span><p>Big someone&quot; expected her to ask for a <mark>dinner</mark> date, not insist on one.</p><label><input type="radio" name="p25" value="0"> better</label></div><div class="pred"><span class="who">qwen3:14b</span><p>A man accustomed to routine is confronted with an unexpected request for companionship, forcing him to reconsider the balance between habit and connection.</p><label><input type="radio" name="p25" value="1"> better</label></div></div>
<label class="both"><input type="radio" name="p25" value="n"> neither is a predicament</label>
</section><section data-i="26">
<header><span class="n">27</span> <b>DOUGHERTY&#x27;S EYE-OPENER</b></header>
<details><summary>Scene summary: Big someone, unsure of his new <mark>wife</mark>&#x27;s identity, decided to flaunt her at his usual haunts to impress his social circle.</summary>
<p class="scene">&quot;Big Jim&quot; Dougherty was troubled. There was a being at his side whom
he did not know. He thought of the sober-hued plumage that this bird
of paradise was accustomed to wear in her cage, and this winged
revelation puzzled him. In some way she reminded him of the Delia
Cullen that he had married four years before. Shyly and rather
awkwardly he stalked at her right hand. &quot;After dinner I&#x27;ll take you back home, Dele,&quot; said Mr. Dougherty,
&quot;and then I&#x27;ll drop back up to Seltzer&#x27;s with the boys. You can have
swell chuck to-night if you want it. I made a winning on Anaconda
yesterday; so you can go as far as you like.&quot; Mr. Dougherty had intended to make the outing with his unwonted wife
an inconspicuous one. Uxoriousness was a weakness that the precepts
of the Caribs did not countenance. If any of his friends of the
track, the billiard cloth or the square circle had wives they had
never complained of the fact in public. There were a number of table
d&#x27;hôte places on the cross streets near the broad and shining way;
and to one of these he had purposed to escort her, so that the bushel
might not be removed from the light of his domesticity. But while on the way Mr. Dougherty altered those inte…</p></details>
<div class="pair"><div class="pred"><span class="who">qwen2.5:3b-instruct</span><p>Big someone wanted to hide his <mark>wife</mark>&#x27;s presence, but a mysterious bird-like being at her side made him change plans.</p><label><input type="radio" name="p26" value="0"> better</label></div><div class="pred"><span class="who">qwen3:14b</span><p>A man struggling to reconcile his desire to display his <mark>wife</mark> publicly with his fear of judgment finds himself torn between pride and secrecy.</p><label><input type="radio" name="p26" value="1"> better</label></div></div>
<label class="both"><input type="radio" name="p26" value="n"> neither is a predicament</label>
</section><section data-i="27">
<header><span class="n">28</span> <b>DOUGHERTY&#x27;S EYE-OPENER</b></header>
<details><summary>Scene summary: Seltzer&#x27;s tribal gentlemen watch as someone and his <mark>wife</mark> someone enter, impressed but wary, while the guests enjoy a lively meal.</summary>
<p class="scene">The congregation of smooth-faced tribal gentlemen were on watch at
Seltzer&#x27;s. As Mr. Dougherty and his reorganized Delia passed they
stared, momentarily petrified, and then removed their hats--a
performance as unusual to them as was the astonishing innovation
presented to their gaze by &quot;Big Jim&quot;. On the latter gentleman&#x27;s
impassive face there appeared a slight flicker of triumph--a faint
flicker, no more to be observed than the expression called there by
the draft of little casino to a four-card spade flush. Hoogley&#x27;s was animated. Electric lights shone as, indeed, they were
expected to do. And the napery, the glassware and the flowers also
meritoriously performed the spectacular duties required of them. The
guests were numerous, well-dressed and gay. A waiter--not necessarily obsequious--conducted &quot;Big Jim&quot; Dougherty
and his wife to a table. &quot;Play that menu straight across for what you like, Dele,&quot; said &quot;Big
Jim.&quot; &quot;It&#x27;s you for a trough of the gilded oats to-night. It strikes
me that maybe we&#x27;ve been sticking too fast to home fodder.&quot; &quot;Big Jim&#x27;s&quot; wife gave her order. He looked at her with respect. She
had mentioned truffles; and he had not known that she knew what
truffles were. F…</p></details>
<div class="pair"><div class="pred"><span class="who">qwen2.5:3b-instruct</span><p>Big someone seeks to impress his <mark>wife</mark> at a fancy <mark>restaurant</mark>, hoping her beauty and charm will win him praise.</p><label><input type="radio" name="p27" value="0"> better</label></div><div class="pred"><span class="who">qwen3:14b</span><p>A man struggles to reconcile his pride with the growing awareness of his <mark>wife</mark>&#x27;s hidden talents and the shame of having underestimated her.</p><label><input type="radio" name="p27" value="1"> better</label></div></div>
<label class="both"><input type="radio" name="p27" value="n"> neither is a predicament</label>
</section><section data-i="28">
<header><span class="n">29</span> <b>DOUGHERTY&#x27;S EYE-OPENER</b></header>
<details><summary>Scene summary: The Honorable someone, seeking to impress, engages the reluctant someone in a lively conversation, transforming her into the center of attention as other politicians and acquaintances arrive.</summary>
<p class="scene">But when the Honorable Patrick Corrigan, leader in Dougherty&#x27;s
district and a friend of his, saw them and came over to the table,
matters got to the three-quarter stretch. The Honorable Patrick was a
gallant man, both in deeds and words. As for the Blarney stone, his
previous actions toward it must have been pronounced. Heavy damages
for breach of promise could surely have been obtained had the Blarney
stone seen fit to sue the Honorable Patrick. &quot;Jimmy, old man!&quot; he called; he clapped Dougherty on the back; he
shone like a midday sun upon Delia. &quot;Honorable Mr. Corrigan--Mrs. Dougherty,&quot; said &quot;Big Jim.&quot; The Honorable Patrick became a fountain of entertainment and
admiration. The waiter had to fetch a third chair for him; he made
another at the table, and the wineglasses were refilled. &quot;You selfish old rascal!&quot; he exclaimed, shaking an arch finger at
&quot;Big Jim,&quot; &quot;to have kept Mrs. Dougherty a secret from us.&quot; And then &quot;Big Jim&quot; Dougherty, who was no talker, sat dumb, and saw
the wife who had dined every evening for three years at home, blossom
like a fairy flower. Quick, witty, charming, full of light and ready
talk, she received the experienced attack of the Honorable Patrick on
the…</p></details>
<div class="pair"><div class="pred"><span class="who">qwen2.5:3b-instruct</span><p>The honorable someone seeks to expose a secret and win someone’s heart, while &quot;Big someone&quot; struggles to keep up.</p><label><input type="radio" name="p28" value="0"> better</label></div><div class="pred"><span class="who">qwen3:14b</span><p>A man struggles to reconcile his quiet life with the sudden, overwhelming attention his <mark>wife</mark> receives, threatening to expose the hidden depths of their marriage.</p><label><input type="radio" name="p28" value="1"> better</label></div></div>
<label class="both"><input type="radio" name="p28" value="n"> neither is a predicament</label>
</section><section data-i="29">
<header><span class="n">30</span> <b>DOUGHERTY&#x27;S EYE-OPENER</b></header>
<details><summary>Scene summary: The Honorable someone, seeking to impress someone, attempts to seduce her, leading to a confrontation and a decision to take her to a pub instead.</summary>
<p class="scene">The dinner came to an end. The Honorable Patrick reached for Mrs.
Dougherty&#x27;s cloak; but that was a matter of action instead of words,
and Dougherty&#x27;s big hand got it first by two seconds. While the farewells were being said at the door the Honorable Patrick
smote Dougherty mightily between the shoulders. &quot;Jimmy, me boy,&quot; he declared, in a giant whisper, &quot;the madam is a
jewel of the first water. Ye&#x27;re a lucky dog.&quot; &quot;Big Jim&quot; walked homeward with his wife. She seemed quite as
pleased with the lights and show windows in the streets as with the
admiration of the men in Hoogley&#x27;s. As they passed Seltzer&#x27;s they
heard the sound of many voices in the café. The boys would be
starting the drinks around now and discussing past performances. At the door of their home Delia paused. The pleasure of the outing
radiated softly from her countenance. She could not hope for Jim of
evenings, but the glory of this one would lighten her lonely hours
for a long time. &quot;Thank you for taking me out, Jim,&quot; she said, gratefully. &quot;You&#x27;ll be
going back up to Seltzer&#x27;s now, of course.&quot; &quot;To ---- with Seltzer&#x27;s,&quot; said &quot;Big Jim,&quot; emphatically. &quot;And d----
Pat Corrigan! Does he think I haven&#x27;t got any eyes?&quot; And the…</p></details>
<div class="pair"><div class="pred"><span class="who">qwen2.5:3b-instruct</span><p>Someone seeks to impress someone with a bold gesture, but is thwarted by her quicker action.</p><label><input type="radio" name="p29" value="0"> better</label></div><div class="pred"><span class="who">qwen3:14b</span><p>A man struggles to maintain his pride and dignity after a public embarrassment, while trying to preserve his relationship and quiet his <mark>wife</mark>&#x27;s growing happiness.</p><label><input type="radio" name="p29" value="1"> better</label></div></div>
<label class="both"><input type="radio" name="p29" value="n"> neither is a predicament</label>
</section><section data-i="30">
<header><span class="n">31</span> <b>DOUGHERTY&#x27;S EYE-OPENER</b></header>
<details><summary>Scene summary: The <mark>bride</mark> desires a peach from her distant <mark>lover</mark>, while he holds power over her marriage and her desires.</summary>
<p class="scene">The bride sat in the rocker with her feet resting upon the world. She
was wrapt in rosy dreams and a kimono of the same hue. She wondered
what the people in Greenland and Tasmania and Beloochistan were
saying one to another about her marriage to Kid McGarry. Not that it
made any difference. There was no welter-weight from London to the
Southern Cross that could stand up four hours--no; four rounds--with
her bridegroom. And he had been hers for three weeks; and the crook
of her little finger could sway him more than the fist of any
142-pounder in the world. Love, when it is ours, is the other name for self-abnegation and
sacrifice. When it belongs to people across the airshaft it means
arrogance and self-conceit. The bride crossed her oxfords and looked thoughtfully at the
distemper Cupids on the ceiling. &quot;Precious,&quot; said she, with the air of Cleopatra asking Antony for
Rome done up in tissue paper and delivered at residence, &quot;I think
I would like a peach.&quot; Kid McGarry arose and put on his coat and hat. He was serious,
shaven, sentimental, and spry. &quot;All right,&quot; said he, as coolly as though he were only agreeing to
sign articles to fight the champion of England. &quot;I&#x27;ll step down and
…</p></details>
<div class="pair"><div class="pred"><span class="who">qwen2.5:3b-instruct</span><p>The <mark>bride</mark> desires her <mark>husband</mark>&#x27;s affection, yet fears losing him to distant admirers.</p><label><input type="radio" name="p30" value="0"> better</label></div><div class="pred"><span class="who">qwen3:14b</span><p>A woman trapped in a love that bends her will longs for a simple peach, while her powerful but obedient <mark>husband</mark> struggles to fulfill her wish in a world that resists giving way.</p><label><input type="radio" name="p30" value="1"> better</label></div></div>
<label class="both"><input type="radio" name="p30" value="n"> neither is a predicament</label>
</section><section data-i="31">
<header><span class="n">32</span> <b>DOUGHERTY&#x27;S EYE-OPENER</b></header>
<details><summary>Scene summary: The Kid seeks a peach for a <mark>lover</mark>, vying with a fruit vendor and a reluctant someone, who ultimately agrees to find oranges instead.</summary>
<p class="scene">&quot;Gotta da peach?&quot; asked the Kid in the tongue of Dante, the lover of
lovers. &quot;Ah, no,--&quot; sighed the vender. &quot;Not for one mont com-a da peach. Too
soon. Gotta da nice-a orange. Like-a da orange?&quot; Scornful, the Kid pursued his quest. He entered the all-night
chop-house, café, and bowling-alley of his friend and admirer, Justus
O&#x27;Callahan. The O&#x27;Callahan was about in his institution, looking for
leaks. &quot;I want it straight,&quot; said the Kid to him. &quot;The old woman has got a
hunch that she wants a peach. Now, if you&#x27;ve got a peach, Cal, get it
out quick. I want it and others like it if you&#x27;ve got &#x27;em in plural
quantities.&quot; &quot;The house is yours,&quot; said O&#x27;Callahan. &quot;But there&#x27;s no peach in it.
It&#x27;s too soon. I don&#x27;t suppose you could even find &#x27;em at one of the
Broadway joints. That&#x27;s too bad. When a lady fixes her mouth for a
certain kind of fruit nothing else won&#x27;t do. It&#x27;s too late now to
find any of the first-class fruiterers open. But if you think the
missis would like some nice oranges I&#x27;ve just got a box of fine ones
in that she might--&quot; &quot;Much obliged, Cal. It&#x27;s a peach proposition right from the ring of
the gong. I&#x27;ll try further.&quot; The time was nearly midnight as the Kid walked down the…</p></details>
<div class="pair"><div class="pred"><span class="who">qwen2.5:3b-instruct</span><p>The Kid seeks a peach but finds oranges instead, rushing to a fruiterer just as the lights go out.</p><label><input type="radio" name="p31" value="0"> better</label></div><div class="pred"><span class="who">qwen3:14b</span><p>The Kid needs to find a peach for a woman who insists on it, but every vendor says it&#x27;s too soon and offers only oranges instead.</p><label><input type="radio" name="p31" value="1"> better</label></div></div>
<label class="both"><input type="radio" name="p31" value="n"> neither is a predicament</label>
</section><section data-i="32">
<header><span class="n">33</span> <b>DOUGHERTY&#x27;S EYE-OPENER</b></header>
<details><summary>Scene summary: The Kid seeks employment, while the <mark>Captain</mark> of Police considers helping him infiltrate gambling den someone’s, despite previous conflicts.</summary>
<p class="scene">&quot;Peaches?&quot; said he, with extreme deliberation. &quot;Well, no, Sir. Not for three or four weeks yet. I haven&#x27;t any idea
where you might find some. There may be a few in town from under
the glass, but they&#x27;d be hard to locate. Maybe at one of the more
expensive hotels--some place where there&#x27;s plenty of money to waste.
I&#x27;ve got some very fine oranges, though--from a shipload that came in
to-day.&quot; The Kid lingered on the corner for a moment, and then set out briskly
toward a pair of green lights that flanked the steps of a building
down a dark side street. &quot;Captain around anywhere?&quot; he asked of the desk sergeant of the
police station. At that moment the captain came briskly forward from the rear. He was
in plain clothes and had a busy air. &quot;Hello, Kid,&quot; he said to the pugilist. &quot;Thought you were
bridal-touring? &quot;Got back yesterday. I&#x27;m a solid citizen now. Think I&#x27;ll take an
interest in municipal doings. How would it suit you to get into
Denver Dick&#x27;s place to-night, Cap? &quot;Past performances,&quot; said the captain, twisting his moustache.
&quot;Denver was closed up two months ago.&quot; &quot;Correct,&quot; said the Kid. &quot;Rafferty chased him out of the Forty-third.
He&#x27;s running in your precinct now, and his game&#x27;…</p></details>
<div class="pair"><div class="pred"><span class="who">qwen2.5:3b-instruct</span><p>Kid seeks to infiltrate someone’s gambling den but finds it closed, needing help from the <mark>captain</mark>.</p><label><input type="radio" name="p32" value="0"> better</label></div><div class="pred"><span class="who">qwen3:14b</span><p>The Kid needs to convince the <mark>captain</mark> to raid a gambling den controlled by an old enemy, but he must do so quickly before the enemy discovers his betrayal.</p><label><input type="radio" name="p32" value="1"> better</label></div></div>
<label class="both"><input type="radio" name="p32" value="n"> neither is a predicament</label>
</section><section data-i="33">
<header><span class="n">34</span> <b>DOUGHERTY&#x27;S EYE-OPENER</b></header>
<details><summary>Scene summary: The <mark>captain</mark> and his dozen men, led by the Kid, raided a dark building, encountering a heated game of chance and a <mark>rival</mark> gang, before capturing the premises.</summary>
<p class="scene">Before ten minutes had sped the captain with a dozen men stole with
their guide into the hallway of a dark and virtuous-looking building
in which many businesses were conducted by day. &quot;Third floor, rear,&quot; said the Kid, softly. &quot;I&#x27;ll lead the way.&quot; Two axemen faced the door that he pointed out to them. &quot;It seems all quiet,&quot; said the captain, doubtfully. &quot;Are you sure
your tip is straight?&quot; &quot;Cut away!&quot; said the Kid. &quot;It&#x27;s on me if it ain&#x27;t.&quot; The axes crashed through the as yet unprotected door. A blaze of
light from within poured through the smashed panels. The door fell,
and the raiders sprang into the room with their guns handy. The big room was furnished with the gaudy magnificence dear to Denver
Dick&#x27;s western ideas. Various well-patronized games were in progress.
About fifty men who were in the room rushed upon the police in a
grand break for personal liberty. The plain-clothes men had to do a
little club-swinging. More than half the patrons escaped. Denver Dick had graced his game with his own presence that night.
He led the rush that was intended to sweep away the smaller body of
raiders, But when he saw the Kid his manner became personal. Being
in the heavyweight class he ca…</p></details>
<div class="pair"><div class="pred"><span class="who">qwen2.5:3b-instruct</span><p>The <mark>captain</mark> seeks to lead a raid, but doubts success as the Kid&#x27;s plan unfolds.</p><label><input type="radio" name="p33" value="0"> better</label></div><div class="pred"><span class="who">qwen3:14b</span><p>A man must prove his worth in a dangerous confrontation to claim a prize he&#x27;s risking everything for.</p><label><input type="radio" name="p33" value="1"> better</label></div></div>
<label class="both"><input type="radio" name="p33" value="n"> neither is a predicament</label>
</section><section data-i="34">
<header><span class="n">35</span> <b>DOUGHERTY&#x27;S EYE-OPENER</b></header>
<details><summary>Scene summary: The Kid demands control of a lavish <mark>dinner</mark> <mark>party</mark>, suspects theft, and retrieves the last peach, threatening violence if it happens again.</summary>
<p class="scene">Here was a long table set with choicest chinaware and silver, and
lavishly furnished with food of that expensive and spectacular sort
of which the devotees of sport are supposed to be fond. Here again
was to be perceived the liberal and florid taste of the gentleman
with the urban cognomenal prefix. A No. 10 patent leather shoe protruded a few of its inches outside
the tablecloth along the floor. The Kid seized this and plucked forth
a black man in a white tie and the garb of a servitor. &quot;Get up!&quot; commanded the Kid. &quot;Are you in charge of this free lunch?&quot; &quot;Yes, sah, I was. Has they done pinched us ag&#x27;in, boss?&quot; &quot;Looks that way. Listen to me. Are there any peaches in this layout?
If there ain&#x27;t I&#x27;ll have to throw up the sponge.&quot; &quot;There was three dozen, sah, when the game opened this evenin&#x27;; but
I reckon the gentlemen done eat &#x27;em all up. If you&#x27;d like to eat a
fust-rate orange, sah, I kin find you some.&quot; &quot;Get busy,&quot; ordered the Kid, sternly, &quot;and move whatever peach crop
you&#x27;ve got quick or there&#x27;ll be trouble. If anybody oranges me again
to-night, I&#x27;ll knock his face off.&quot; The raid on Denver Dick&#x27;s high-priced and prodigal luncheon revealed
one lone, last peach that had escaped th…</p></details>
<div class="pair"><div class="pred"><span class="who">qwen2.5:3b-instruct</span><p>The Kid seeks a last peach at a lavish <mark>dinner</mark>, fearing theft, while authorities arrive.</p><label><input type="radio" name="p34" value="0"> better</label></div><div class="pred"><span class="who">qwen3:14b</span><p>A man desperate to find a peach before it&#x27;s too late races against time and rivals to secure his prize before it vanishes entirely.</p><label><input type="radio" name="p34" value="1"> better</label></div></div>
<label class="both"><input type="radio" name="p34" value="n"> neither is a predicament</label>
</section><section data-i="35">
<header><span class="n">36</span> <b>DOUGHERTY&#x27;S EYE-OPENER</b></header>
<details><summary>Scene summary: The Knight returns to someone with a stolen peach for his <mark>bride</mark>, who prefers an orange.</summary>
<p class="scene">His heart was light as he went. So rode the knights back to Camelot
after perils and high deeds done for their ladies fair. The Kid&#x27;s
lady had commanded him and he had obeyed. True, it was but a peach
that she had craved; but it had been no small deed to glean a peach
at midnight from that wintry city where yet the February snows lay
like iron. She had asked for a peach; she was his bride; in his
pocket the peach was warming in his hand that held it for fear that
it might fall out and be lost. On the way the Kid turned in at an all-night drug store and said to
the spectacled clerk: &quot;Say, sport, I wish you&#x27;d size up this rib of mine and see if it&#x27;s
broke. I was in a little scrap and bumped down a flight or two of
stairs.&quot; The druggist made an examination. &quot;It isn&#x27;t broken,&quot; was his
diagnosis, &quot;but you have a bruise there that looks like you&#x27;d fallen
off the Flatiron twice.&quot; &quot;That&#x27;s all right,&quot; said the Kid. &quot;Let&#x27;s have your clothesbrush,
please.&quot; The bride waited in the rosy glow of the pink lamp shade. The
miracles were not all passed away. By breathing a desire for some
slight thing--a flower, a pomegranate, a--oh, yes, a peach--she could
send forth her man into the night, into th…</p></details>
<div class="pair"><div class="pred"><span class="who">qwen2.5:3b-instruct</span><p>The Kid seeks to please his <mark>bride</mark> by delivering a requested peach, despite its trivial nature.</p><label><input type="radio" name="p35" value="0"> better</label></div><div class="pred"><span class="who">qwen3:14b</span><p>He risks danger to fetch a trivial gift for his <mark>bride</mark>, only to find her preference has changed.</p><label><input type="radio" name="p35" value="1"> better</label></div></div>
<label class="both"><input type="radio" name="p35" value="n"> neither is a predicament</label>
</section><section data-i="36">
<header><span class="n">37</span> <b>THE HARBINGER</b></header>
<details><summary>Scene summary: The city <mark>editor</mark> reads news from across the country while the farmer sees only winter on his fields, unaware that someone’s search for someone signals the arrival of spring.</summary>
<p class="scene">Long before the springtide is felt in the dull bosom of the yokel
does the city man know that the grass-green goddess is upon her
throne. He sits at his breakfast eggs and toast, begirt by stone
walls, opens his morning paper and sees journalism leave vernalism
at the post. For, whereas, spring&#x27;s couriers were once the evidence of our finer
senses, now the Associated Press does the trick. The warble of the first robin in Hackensack, the stirring of the
maple sap in Bennington, the budding of the pussy willows along Main
Street in Syracuse, the first chirp of the bluebird, the swan song of
the Blue Point, the annual tornado in St. Louis, the plaint of the
peach pessimist from Pompton, N. J., the regular visit of the tame
wild goose with a broken leg to the pond near Bilgewater Junction,
the base attempt of the Drug Trust to boost the price of quinine
foiled in the House by Congressman Jinks, the first tall poplar
struck by lightning and the usual stunned picknickers who had taken
refuge, the first crack of the ice jam in the Allegheny River, the
finding of a violet in its mossy bed by the correspondent at Round
Corners--these are the advance signs of the burgeoning season that
are w…</p></details>
<div class="pair"><div class="pred"><span class="who">qwen2.5:3b-instruct</span><p>Stuck in stone walls, city man craves nature&#x27;s first signs to confirm spring&#x27;s arrival.</p><label><input type="radio" name="p36" value="0"> better</label></div><div class="pred"><span class="who">qwen3:14b</span><p>A man trapped in the monotony of city life longs for the genuine signs of spring, but finds only artificial reports replacing nature&#x27;s quiet signals.</p><label><input type="radio" name="p36" value="1"> better</label></div></div>
<label class="both"><input type="radio" name="p36" value="n"> neither is a predicament</label>
</section><section data-i="37">
<header><span class="n">38</span> <b>THE HARBINGER</b></header>
<details><summary>Scene summary: Someone, desperate for his <mark>wife</mark>&#x27;s dollar, conspires with someone and someone to steal it from their married friends in Union <mark>Square</mark>.</summary>
<p class="scene">Ere the first violet blew, Mr. Peters, Mr. Ragsdale and Mr. Kidd sat
together on a bench in Union Square and conspired. Mr. Peters was the
D&#x27;Artagnan of the loafers there. He was the dingiest, the laziest,
the sorriest brown blot against the green background of any bench in
the park. But just then he was the most important of the trio. Mr. Peters had a wife. This had not heretofore affected his standing
with Ragsy and Kidd. But to-day it invested him with a peculiar
interest. His friends, having escaped matrimony, had shown a
disposition to deride Mr. Peters for his venture on that troubled
sea. But at last they had been forced to acknowledge that either
he had been gifted with a large foresight or that he was one of
Fortune&#x27;s lucky sons. For, Mrs. Peters had a dollar. A whole dollar bill, good and
receivable by the Government for customs, taxes and all public
dues. How to get possession of that dollar was the question up for
discussion by the three musty musketeers. &quot;How do you know it was a dollar?&quot; asked Ragsy, the immensity of the
sum inclining him to scepticism. &quot;The coalman seen her have it,&quot; said Mr. Peters. &quot;She went out
and done some washing yesterday. And look what she gi…</p></details>
<div class="pair"><div class="pred"><span class="who">qwen2.5:3b-instruct</span><p>Someone wants the dollar his <mark>wife</mark> has, but fears losing face among friends.</p><label><input type="radio" name="p37" value="0"> better</label></div><div class="pred"><span class="who">qwen3:14b</span><p>Three men plot to steal a dollar from someone’s <mark>wife</mark>, who unknowingly possesses it, forcing him to confront his friends&#x27; greed and protect her from their violent intentions.</p><label><input type="radio" name="p37" value="1"> better</label></div></div>
<label class="both"><input type="radio" name="p37" value="n"> neither is a predicament</label>
</section><section data-i="38">
<header><span class="n">39</span> <b>THE HARBINGER</b></header>
<details><summary>Scene summary: Someone threatens to leave someone to seek payment from their adulterous <mark>daughter</mark>-in-law someone.</summary>
<p class="scene">&quot;Maguire,&quot; said Ragsy, pointedly, &quot;has got his bock beer sign out. If
we had a dollar we could--&quot; &quot;Hush up!&quot; said Mr. Peters, licking his lips. &quot;We got to get that
case note somehow, boys. Ain&#x27;t what&#x27;s a man&#x27;s wife&#x27;s his? Leave it to
me. I&#x27;ll go over to the house and get it. Wait here for me.&quot; &quot;I&#x27;ve seen &#x27;em give up quick, and tell you where it&#x27;s hid if you kick
&#x27;em in the ribs,&quot; said Kidd. &quot;No man would kick a woman,&quot; said Peters, virtuously. &quot;A little
choking--just a touch on the windpipe--that gets away with &#x27;em--and
no marks left. Wait for me. I&#x27;ll bring back that dollar, boys.&quot; High up in a tenement-house between Second Avenue and the river lived
the Peterses in a back room so gloomy that the landlord blushed to
take the rent for it. Mrs. Peters worked at sundry times, doing odd
jobs of scrubbing and washing. Mr. Peters had a pure, unbroken record
of five years without having earned a penny. And yet they clung
together, sharing each other&#x27;s hatred and misery, being creatures
of habit. Of habit, the power that keeps the earth from flying to
pieces; though there is some silly theory of gravitation. Mrs. Peters reposed her 200 pounds on the safer of the two chairs and
gazed stoli…</p></details>
<div class="pair"><div class="pred"><span class="who">qwen2.5:3b-instruct</span><p>Someone wants the dollar, but someone plans to get the case note instead.</p><label><input type="radio" name="p38" value="0"> better</label></div><div class="pred"><span class="who">qwen3:14b</span><p>Someone must steal a case note from his <mark>wife</mark>&#x27;s hidden stash to buy a dollar for beer, but he refuses to harm her despite his desperation.</p><label><input type="radio" name="p38" value="1"> better</label></div></div>
<label class="both"><input type="radio" name="p38" value="n"> neither is a predicament</label>
</section><section data-i="39">
<header><span class="n">40</span> <b>THE HARBINGER</b></header>
<details><summary>Scene summary: Someone calculated someone’s distance, eyeing her as a potential victim for his planned blackmail.</summary>
<p class="scene">Mr. Peters&#x27;s eye calculated the distance between them. By taking her
by surprise it might be possible to spring upon her, overthrow her,
and apply the throttling tactics of which he had boasted to his
waiting comrades. True, it had been only a boast; never yet had he
dared to lay violent hands upon her; but with the thoughts of the
delicious, cool bock or Culmbacher bracing his nerves, he was near
to upsetting his own theories of the treatment due by a gentleman
to a lady. But, with his loafer&#x27;s love for the more artistic and
less strenuous way, he chose diplomacy first, the high card in the
game--the assumed attitude of success already attained. &quot;You have a dollar,&quot; he said, loftily, but significantly in the tone
that goes with the lighting of a cigar--when the properties are at
hand. &quot;I have,&quot; said Mrs. Peters, producing the bill from her bosom and
crackling it, teasingly. &quot;I am offered a position in a--in a tea store,&quot; said Mr. Peters. &quot;I
am to begin work to-morrow. But it will be necessary for me to buy a
pair of--&quot; &quot;You are a liar,&quot; said Mrs. Peters, reinterring the note. &quot;No tea
store, nor no A B C store, nor no junk shop would have you. I rubbed
the skin off both me hands wa…</p></details>
<div class="pair"><div class="pred"><span class="who">qwen2.5:3b-instruct</span><p>Someone schemes to charm someone away from a tea job, while she resists with a tough stance.</p><label><input type="radio" name="p39" value="0"> better</label></div><div class="pred"><span class="who">qwen3:14b</span><p>A man trying to manipulate a woman with false promises faces her sharp rejection and must find another way to achieve his goal.</p><label><input type="radio" name="p39" value="1"> better</label></div></div>
<label class="both"><input type="radio" name="p39" value="n"> neither is a predicament</label>
</section>
</main>
<script>
const KEY='stp-pilot:'+["qwen2.5:3b-instruct", "qwen3:14b"].join('|'), labels=["qwen2.5:3b-instruct", "qwen3:14b"];
let saved={}; try{saved=JSON.parse(localStorage.getItem(KEY)||'{}')}catch(e){}
for(const [k,v] of Object.entries(saved)){const el=document.querySelector(`input[name="${k}"][value="${v}"]`); if(el) el.checked=true}
function tally(){
const c={0:0,1:0,n:0}; let done=0;
document.querySelectorAll('input[type=radio]:checked').forEach(r=>{c[r.value]++;done++});
document.getElementById('tally').textContent=`Picked ${done} of 40: ${labels[0]} ${c[0]}, ${labels[1]} ${c[1]}, neither ${c.n}`;
}
document.addEventListener('change',e=>{if(e.target.type!=='radio')return; saved[e.target.name]=e.target.value;
try{localStorage.setItem(KEY,JSON.stringify(saved))}catch(err){} tally()});
tally();
</script>
@@ -0,0 +1,246 @@
{
"model": "qwen3:14b",
"prompt": "You describe the predicament of the main person in a passage of fiction, in ONE sentence.\n\nA predicament is what that person is up against and what they want out of it: the kind of trouble or opportunity that could happen to anyone, in any line of work, in any town.\n\nRules:\n- Exactly one sentence, at most 20 words.\n- Leave out everything that ties it to this story: no names, no jobs or professions, no places, no businesses, and no objects that only belong to this story.\n- Say what the person is up against, and what they want.\n- Do not describe the writing, the mood, or who is telling the story.\n- Output only the sentence.",
"summaries": [
{
"chunk": 0,
"story": 0,
"summary": "A man struggles to understand the overwhelming complexity of a city's collective voice, seeking clarity in a world filled with individual sounds but no unified message.",
"model_output": "A man struggles to understand the overwhelming complexity of a city's collective voice, seeking clarity in a world filled with individual sounds but no unified message."
},
{
"chunk": 1,
"story": 0,
"summary": "The person is trying to understand the city's hidden message, hoping to find a unified voice that reveals its true nature.",
"model_output": "The person is trying to understand the city's hidden message, hoping to find a unified voice that reveals its true nature."
},
{
"chunk": 2,
"story": 0,
"summary": "A man determined to uncover the unique voice of a city faces the challenge of distinguishing its true character from the distractions and distractions of daily life.",
"model_output": "A man determined to uncover the unique voice of a city faces the challenge of distinguishing its true character from the distractions and distractions of daily life."
},
{
"chunk": 3,
"story": 0,
"summary": "A man tries to uncover the city's hidden voice through a cop, only to find that the cop's personal life and indifference to the city's soul leave him with no real answers.",
"model_output": "A man tries to uncover the city's hidden voice through a cop, only to find that the cop's personal life and indifference to the city's soul leave him with no real answers."
},
{
"chunk": 4,
"story": 0,
"summary": "A man seeks to capture the essence of a city's soul through a unique blend of its sounds, hoping to create a single, powerful vocalization that represents its spirit.",
"model_output": "A man seeks to capture the essence of a city's soul through a unique blend of its sounds, hoping to create a single, powerful vocalization that represents its spirit."
},
{
"chunk": 5,
"story": 0,
"summary": "A man seeks understanding from a city that refuses to speak, desperate to uncover a hidden truth that eludes everyone else.",
"model_output": "A man seeks understanding from a city that refuses to speak, desperate to uncover a hidden truth that eludes everyone else."
},
{
"chunk": 6,
"story": 0,
"summary": "Aurelia and the narrator sit in silence, caught between the quiet intimacy of the moment and the unspoken weight of the city's presence.",
"model_output": "Aurelia and the narrator sit in silence, caught between the quiet intimacy of the moment and the unspoken weight of the city's presence."
},
{
"chunk": 7,
"story": 1,
"summary": "John Hopkins must navigate the harsh realities of poverty, love, and war all at once in the crowded, unforgiving city.",
"model_output": "John Hopkins must navigate the harsh realities of poverty, love, and war all at once in the crowded, unforgiving city."
},
{
"chunk": 8,
"story": 1,
"summary": "Mrs. Hopkins must navigate the chaotic unpredictability of city life while clinging to the comfort of her familiar routines.",
"model_output": "Mrs. Hopkins must navigate the chaotic unpredictability of city life while clinging to the comfort of her familiar routines."
},
{
"chunk": 9,
"story": 1,
"summary": "John Hopkins longs for connection but is trapped in a life of monotony and shallow conversation.",
"model_output": "John Hopkins longs for connection but is trapped in a life of monotony and shallow conversation."
},
{
"chunk": 10,
"story": 1,
"summary": "A man tries to pay for a purchase with a promise of future money, but his dishonesty sparks a violent confrontation with a shopkeeper who sees his actions as proof of humanity's corruption.",
"model_output": "A man tries to pay for a purchase with a promise of future money, but his dishonesty sparks a violent confrontation with a shopkeeper who sees his actions as proof of humanity's corruption."
},
{
"chunk": 11,
"story": 1,
"summary": "A man flees from police pursuit, seeking refuge in an unknown vehicle that offers him a chance to escape, but must decide whether to trust his mysterious rescuer.",
"model_output": "A man flees from police pursuit, seeking refuge in an unknown vehicle that offers him a chance to escape, but must decide whether to trust his mysterious rescuer."
},
{
"chunk": 12,
"story": 1,
"summary": "A man finds himself unexpectedly drawn into a personal conflict he did not ask for, yet must navigate with courage and discretion.",
"model_output": "A man finds himself unexpectedly drawn into a personal conflict he did not ask for, yet must navigate with courage and discretion."
},
{
"chunk": 13,
"story": 1,
"summary": "John Hopkins must confront a man who has wronged a woman he now feels compelled to protect, risking his own safety to do so.",
"model_output": "John Hopkins must confront a man who has wronged a woman he now feels compelled to protect, risking his own safety to do so."
},
{
"chunk": 14,
"story": 1,
"summary": "A man struggles to reconcile his growing affection for a woman with the rigid expectations of his social circle.",
"model_output": "A man struggles to reconcile his growing affection for a woman with the rigid expectations of his social circle."
},
{
"chunk": 15,
"story": 2,
"summary": "Masie, trapped in a monotonous job she despises, longs for a life that offers more than just the dull routine of selling gloves.",
"model_output": "Masie, trapped in a monotonous job she despises, longs for a life that offers more than just the dull routine of selling gloves."
},
{
"chunk": 16,
"story": 2,
"summary": "A man finds himself trapped in an awkward encounter with a shopgirl whose icy beauty challenges his composure, forcing him to navigate the delicate line between professional decorum and unexpected attraction.",
"model_output": "A man finds himself trapped in an awkward encounter with a shopgirl whose icy beauty challenges his composure, forcing him to navigate the delicate line between professional decorum and unexpected attraction."
},
{
"chunk": 17,
"story": 2,
"summary": "A man struggling with his pride and social conventions finds himself awkwardly drawn to a shopgirl, determined to win her favor despite his usual confidence.",
"model_output": "A man struggling with his pride and social conventions finds himself awkwardly drawn to a shopgirl, determined to win her favor despite his usual confidence."
},
{
"chunk": 18,
"story": 2,
"summary": "A young woman balances between curiosity and caution as she agrees to meet a man she barely knows, hoping to explore new possibilities without disappointing her family or losing her sense of self.",
"model_output": "A young woman balances between curiosity and caution as she agrees to meet a man she barely knows, hoping to explore new possibilities without disappointing her family or losing her sense of self."
},
{
"chunk": 19,
"story": 2,
"summary": "A man torn between his growing feelings for a woman he barely knows and his fear of losing control of his life struggles to navigate the uncertain path of love.",
"model_output": "A man torn between his growing feelings for a woman he barely knows and his fear of losing control of his life struggles to navigate the uncertain path of love."
},
{
"chunk": 20,
"story": 2,
"summary": "A man insists a woman marry him, claiming his wealth and status make them equal, but she sees through his words and mocks his desperate, insincere pursuit.",
"model_output": "A man insists a woman marry him, claiming his wealth and status make them equal, but she sees through his words and mocks his desperate, insincere pursuit."
},
{
"chunk": 21,
"story": 2,
"summary": "A man tries to convince a hesitant woman to leave her mundane life and embark on an extravagant, uncertain journey with him.",
"model_output": "A man tries to convince a hesitant woman to leave her mundane life and embark on an extravagant, uncertain journey with him."
},
{
"chunk": 22,
"story": 2,
"summary": "A woman hides her growing feelings for a man while pretending to be uninterested, hoping to keep their connection without giving in to the possibility of love.",
"model_output": "A woman hides her growing feelings for a man while pretending to be uninterested, hoping to keep their connection without giving in to the possibility of love."
},
{
"chunk": 23,
"story": 3,
"summary": "Big Jim Dougherty must navigate the rigid codes of his underground world while seeking a way to break free and claim a life beyond the shadows.",
"model_output": "Big Jim Dougherty must navigate the rigid codes of his underground world while seeking a way to break free and claim a life beyond the shadows."
},
{
"chunk": 24,
"story": 3,
"summary": "A man struggles to balance his cultural identity and personal life while navigating the expectations of his community and the quiet routine of his domestic existence.",
"model_output": "A man struggles to balance his cultural identity and personal life while navigating the expectations of his community and the quiet routine of his domestic existence."
},
{
"chunk": 25,
"story": 3,
"summary": "A man accustomed to routine is confronted with an unexpected request for companionship, forcing him to reconsider the balance between habit and connection.",
"model_output": "A man accustomed to routine is confronted with an unexpected request for companionship, forcing him to reconsider the balance between habit and connection."
},
{
"chunk": 26,
"story": 3,
"summary": "A man struggling to reconcile his desire to display his wife publicly with his fear of judgment finds himself torn between pride and secrecy.",
"model_output": "A man struggling to reconcile his desire to display his wife publicly with his fear of judgment finds himself torn between pride and secrecy."
},
{
"chunk": 27,
"story": 3,
"summary": "A man struggles to reconcile his pride with the growing awareness of his wife's hidden talents and the shame of having underestimated her.",
"model_output": "A man struggles to reconcile his pride with the growing awareness of his wife's hidden talents and the shame of having underestimated her."
},
{
"chunk": 28,
"story": 3,
"summary": "A man struggles to reconcile his quiet life with the sudden, overwhelming attention his wife receives, threatening to expose the hidden depths of their marriage.",
"model_output": "A man struggles to reconcile his quiet life with the sudden, overwhelming attention his wife receives, threatening to expose the hidden depths of their marriage."
},
{
"chunk": 29,
"story": 3,
"summary": "A man struggles to maintain his pride and dignity after a public embarrassment, while trying to preserve his relationship and quiet his wife's growing happiness.",
"model_output": "A man struggles to maintain his pride and dignity after a public embarrassment, while trying to preserve his relationship and quiet his wife's growing happiness."
},
{
"chunk": 30,
"story": 3,
"summary": "A woman trapped in a love that bends her will longs for a simple peach, while her powerful but obedient husband struggles to fulfill her wish in a world that resists giving way.",
"model_output": "A woman trapped in a love that bends her will longs for a simple peach, while her powerful but obedient husband struggles to fulfill her wish in a world that resists giving way."
},
{
"chunk": 31,
"story": 3,
"summary": "The Kid needs to find a peach for a woman who insists on it, but every vendor says it's too soon and offers only oranges instead.",
"model_output": "The Kid needs to find a peach for a woman who insists on it, but every vendor says it's too soon and offers only oranges instead."
},
{
"chunk": 32,
"story": 3,
"summary": "The Kid needs to convince the captain to raid a gambling den controlled by an old enemy, but he must do so quickly before the enemy discovers his betrayal.",
"model_output": "The Kid needs to convince the captain to raid a gambling den controlled by an old enemy, but he must do so quickly before the enemy discovers his betrayal."
},
{
"chunk": 33,
"story": 3,
"summary": "A man must prove his worth in a dangerous confrontation to claim a prize he's risking everything for.",
"model_output": "A man must prove his worth in a dangerous confrontation to claim a prize he's risking everything for."
},
{
"chunk": 34,
"story": 3,
"summary": "A man desperate to find a peach before it's too late races against time and rivals to secure his prize before it vanishes entirely.",
"model_output": "A man desperate to find a peach before it's too late races against time and rivals to secure his prize before it vanishes entirely."
},
{
"chunk": 35,
"story": 3,
"summary": "He risks danger to fetch a trivial gift for his bride, only to find her preference has changed.",
"model_output": "He risks danger to fetch a trivial gift for his bride, only to find her preference has changed."
},
{
"chunk": 36,
"story": 4,
"summary": "A man trapped in the monotony of city life longs for the genuine signs of spring, but finds only artificial reports replacing nature's quiet signals.",
"model_output": "A man trapped in the monotony of city life longs for the genuine signs of spring, but finds only artificial reports replacing nature's quiet signals."
},
{
"chunk": 37,
"story": 4,
"summary": "Three men plot to steal a dollar from Mr. Peters's wife, who unknowingly possesses it, forcing him to confront his friends' greed and protect her from their violent intentions.",
"model_output": "Three men plot to steal a dollar from Mr. Peters's wife, who unknowingly possesses it, forcing him to confront his friends' greed and protect her from their violent intentions."
},
{
"chunk": 38,
"story": 4,
"summary": "Mr. Peters must steal a case note from his wife's hidden stash to buy a dollar for beer, but he refuses to harm her despite his desperation.",
"model_output": "Mr. Peters must steal a case note from his wife's hidden stash to buy a dollar for beer, but he refuses to harm her despite his desperation."
},
{
"chunk": 39,
"story": 4,
"summary": "A man trying to manipulate a woman with false promises faces her sharp rejection and must find another way to achieve his goal.",
"model_output": "A man trying to manipulate a woman with false promises faces her sharp rejection and must find another way to achieve his goal."
}
]
}
@@ -0,0 +1,246 @@
{
"model": "qwen2.5:3b-instruct",
"prompt": "You describe the predicament of the main person in a passage of fiction, in ONE sentence.\n\nA predicament is what that person is up against and what they want out of it: the kind of trouble or opportunity that could happen to anyone, in any line of work, in any town.\n\nRules:\n- Exactly one sentence, at most 20 words.\n- Leave out everything that ties it to this story: no names, no jobs or professions, no places, no businesses, and no objects that only belong to this story.\n- Say what the person is up against, and what they want.\n- Do not describe the writing, the mood, or who is telling the story.\n- Output only the sentence.",
"summaries": [
{
"chunk": 0,
"story": 0,
"summary": "Finding the voice of a big city, I sought in vain among school chants.",
"model_output": "Finding the voice of a big city, I sought in vain among school chants."
},
{
"chunk": 1,
"story": 0,
"summary": "I want to know the city's voice, but it echoes like Philadelphia.",
"model_output": "I want to know the city's voice, but it echoes like Philadelphia."
},
{
"chunk": 2,
"story": 0,
"summary": "I must find the unique voice of New York, proving it doesn't treat me like a cigar.",
"model_output": "I must find the unique voice of New York, proving it doesn't treat me like a cigar."
},
{
"chunk": 3,
"story": 0,
"summary": "I want to know the city's cry, but the cop only follows orders.",
"model_output": "I want to know the city's cry, but the cop only follows orders."
},
{
"chunk": 4,
"story": 0,
"summary": "Bill, find the essence of New York's chaos and harmony.",
"model_output": "Bill, find the essence of New York's chaos and harmony."
},
{
"chunk": 5,
"story": 0,
"summary": "The poet seeks a hit with his poem, fearing rejection.",
"model_output": "The poet seeks a hit with his poem, fearing rejection."
},
{
"chunk": 6,
"story": 0,
"summary": "Aurelia waits alone, wanting her companion to speak.",
"model_output": "Aurelia waits alone, wanting her companion to speak."
},
{
"chunk": 7,
"story": 1,
"summary": "John Hopkins finds deepest life joys in a hidden quarter, not wealth.",
"model_output": "John Hopkins finds deepest life joys in a hidden quarter, not wealth."
},
{
"chunk": 8,
"story": 1,
"summary": "Mrs. Hopkins struggles to balance her desires and fears in the fast-paced city.",
"model_output": "Mrs. Hopkins struggles to balance her desires and fears in the fast-paced city."
},
{
"chunk": 9,
"story": 1,
"summary": "John Hopkins sought to inject conversation into his tasteless existence by buying a cigar.",
"model_output": "John Hopkins sought to inject conversation into his tasteless existence by buying a cigar."
},
{
"chunk": 10,
"story": 1,
"summary": "Hopkins buys spinach, finds no cash, challenges tobacconist Freshmayer.",
"model_output": "Hopkins buys spinach, finds no cash, challenges tobacconist Freshmayer."
},
{
"chunk": 11,
"story": 1,
"summary": "John Hopkins sought revenge, but found himself pursued by law enforcers and a mysterious chauffeur in a racing car.",
"model_output": "John Hopkins sought revenge, but found himself pursued by law enforcers and a mysterious chauffeur in a racing car."
},
{
"chunk": 12,
"story": 1,
"summary": "Hopkins wants Milady's assistance against unseen attackers, while Milady seeks a brave companion.",
"model_output": "Hopkins wants Milady's assistance against unseen attackers, while Milady seeks a brave companion."
},
{
"chunk": 13,
"story": 1,
"summary": "John Hopkins seeks a romantic encounter, only to be kidnapped by a mysterious lady.",
"model_output": "John Hopkins seeks a romantic encounter, only to be kidnapped by a mysterious lady."
},
{
"chunk": 14,
"story": 1,
"summary": "Bess wants her St. Bernard, but John wants her to stop reading dangerous novels.",
"model_output": "Bess wants her St. Bernard, but John wants her to stop reading dangerous novels."
},
{
"chunk": 15,
"story": 2,
"summary": "Masie, a young saleslady, seeks to navigate the complexities of human nature while hiding her true identity.",
"model_output": "Masie, a young saleslady, seeks to navigate the complexities of human nature while hiding her true identity."
},
{
"chunk": 16,
"story": 2,
"summary": "The shopgirl Masie confronts the floorwalker Irving Carter with her flirtatious gaze, testing his resolve.",
"model_output": "The shopgirl Masie confronts the floorwalker Irving Carter with her flirtatious gaze, testing his resolve."
},
{
"chunk": 17,
"story": 2,
"summary": "Irving Carter desires to charm a shopgirl despite feeling out of place.",
"model_output": "Irving Carter desires to charm a shopgirl despite feeling out of place."
},
{
"chunk": 18,
"story": 2,
"summary": "Willie nervously asked for her company, hoping she'd agree to a date.",
"model_output": "Willie nervously asked for her company, hoping she'd agree to a date."
},
{
"chunk": 19,
"story": 2,
"summary": "Carter seeks love but fears rejection, while Masie uses him to prove her worth.",
"model_output": "Carter seeks love but fears rejection, while Masie uses him to prove her worth."
},
{
"chunk": 20,
"story": 2,
"summary": "Masie faces Carter's marriage proposal, wanting to see through his sincerity.",
"model_output": "Masie faces Carter's marriage proposal, wanting to see through his sincerity."
},
{
"chunk": 21,
"story": 2,
"summary": "Masie looked up at Carter, her eyes alight with a flicker of possibility.",
"model_output": "Masie looked up at Carter, her eyes alight with a flicker of possibility."
},
{
"chunk": 22,
"story": 2,
"summary": "She wants to end their secret affair, but he feels a hidden joy.",
"model_output": "She wants to end their secret affair, but he feels a hidden joy."
},
{
"chunk": 23,
"story": 3,
"summary": "Big Jim Dougherty sought acceptance in Manhattan's titled nobility of sportdom.",
"model_output": "Big Jim Dougherty sought acceptance in Manhattan's titled nobility of sportdom."
},
{
"chunk": 24,
"story": 3,
"summary": "He seeks a private life away from his public Oriental sport, yet feels trapped in public life.",
"model_output": "He seeks a private life away from his public Oriental sport, yet feels trapped in public life."
},
{
"chunk": 25,
"story": 3,
"summary": "Big Jim\" expected her to ask for a dinner date, not insist on one.",
"model_output": "\"Big Jim\" expected her to ask for a dinner date, not insist on one."
},
{
"chunk": 26,
"story": 3,
"summary": "Big Jim Dougherty wanted to hide his wife's presence, but a mysterious bird-like being at her side made him change plans.",
"model_output": "Big Jim Dougherty wanted to hide his wife's presence, but a mysterious bird-like being at her side made him change plans."
},
{
"chunk": 27,
"story": 3,
"summary": "Big Jim seeks to impress his wife at a fancy restaurant, hoping her beauty and charm will win him praise.",
"model_output": "Big Jim seeks to impress his wife at a fancy restaurant, hoping her beauty and charm will win him praise."
},
{
"chunk": 28,
"story": 3,
"summary": "The honorable Patrick Corrigan seeks to expose a secret and win Mrs. Dougherty's heart, while \"Big Jim\" struggles to keep up.",
"model_output": "The honorable Patrick Corrigan seeks to expose a secret and win Mrs. Dougherty's heart, while \"Big Jim\" struggles to keep up."
},
{
"chunk": 29,
"story": 3,
"summary": "Patrick seeks to impress Mrs. Dougherty with a bold gesture, but is thwarted by her quicker action.",
"model_output": "Patrick seeks to impress Mrs. Dougherty with a bold gesture, but is thwarted by her quicker action."
},
{
"chunk": 30,
"story": 3,
"summary": "The bride desires her husband's affection, yet fears losing him to distant admirers.",
"model_output": "The bride desires her husband's affection, yet fears losing him to distant admirers."
},
{
"chunk": 31,
"story": 3,
"summary": "The Kid seeks a peach but finds oranges instead, rushing to a fruiterer just as the lights go out.",
"model_output": "The Kid seeks a peach but finds oranges instead, rushing to a fruiterer just as the lights go out."
},
{
"chunk": 32,
"story": 3,
"summary": "Kid seeks to infiltrate Denver Dick's gambling den but finds it closed, needing help from the captain.",
"model_output": "Kid seeks to infiltrate Denver Dick's gambling den but finds it closed, needing help from the captain."
},
{
"chunk": 33,
"story": 3,
"summary": "The captain seeks to lead a raid, but doubts success as the Kid's plan unfolds.",
"model_output": "The captain seeks to lead a raid, but doubts success as the Kid's plan unfolds."
},
{
"chunk": 34,
"story": 3,
"summary": "The Kid seeks a last peach at a lavish dinner, fearing theft, while authorities arrive.",
"model_output": "The Kid seeks a last peach at a lavish dinner, fearing theft, while authorities arrive."
},
{
"chunk": 35,
"story": 3,
"summary": "The Kid seeks to please his bride by delivering a requested peach, despite its trivial nature.",
"model_output": "The Kid seeks to please his bride by delivering a requested peach, despite its trivial nature."
},
{
"chunk": 36,
"story": 4,
"summary": "Stuck in stone walls, city man craves nature's first signs to confirm spring's arrival.",
"model_output": "Stuck in stone walls, city man craves nature's first signs to confirm spring's arrival."
},
{
"chunk": 37,
"story": 4,
"summary": "Mr. Peters wants the dollar his wife has, but fears losing face among friends.",
"model_output": "Mr. Peters wants the dollar his wife has, but fears losing face among friends."
},
{
"chunk": 38,
"story": 4,
"summary": "Maguire wants the dollar, but Mr. Peters plans to get the case note instead.",
"model_output": "Maguire wants the dollar, but Mr. Peters plans to get the case note instead."
},
{
"chunk": 39,
"story": 4,
"summary": "Mr. Peters schemes to charm Mrs. Peters away from a tea job, while she resists with a tough stance.",
"model_output": "Mr. Peters schemes to charm Mrs. Peters away from a tea job, while she resists with a tough stance."
}
]
}
+115
View File
@@ -0,0 +1,115 @@
"""Side-by-side page for reading the predicament pilot: the scene, its summary, and what each model made of it.
python3 strip_names.py pilot-predicaments-3b.json pilot-3b-clean.json
python3 strip_names.py pilot-predicaments-14b.json pilot-14b-clean.json
python3 pilot_page.py pilot-3b-clean.json pilot-14b-clean.json > pilot-compare.html
Takes strip_names.py's output, so the page shows what the full run would actually embed. (strip_names
runs as a script on import, so it is not imported here.) Job, relationship and place words are
highlighted. A pick per scene is kept in the browser only; the tally at the top is what to report
back. No inference.
"""
import collections, html, json, pathlib, re, sys
from topic_words import TOPIC_WORDS
def clean(text):
return text # inputs are already name-stripped
a_path, b_path = sys.argv[1], sys.argv[2]
cols = [json.loads(pathlib.Path(p).read_text(encoding='utf-8')) for p in (a_path, b_path)]
labels = [c['model'] for c in cols]
chunks = json.loads(pathlib.Path('chunks.json').read_text(encoding='utf-8'))
summary = {x['chunk']: x['summary'] for x in
json.loads(pathlib.Path('summaries_clean.json').read_text(encoding='utf-8'))['summaries']}
def marked(text):
out = []
for part in re.split(r"([A-Za-zé]+)", text):
esc = html.escape(part)
out.append(f'<mark>{esc}</mark>' if part.lower() in TOPIC_WORDS else esc)
return ''.join(out)
def leaks(text):
return len(set(re.findall(r"[a-zé]+", text.lower())) & TOPIC_WORDS)
def opening(text):
return ' '.join(text.split()[:3])
rows, stats = [], []
for col in cols:
texts = [clean(x['summary']) for x in col['summaries']]
stats.append({
'leaky': sum(leaks(t) > 0 for t in texts),
'city': sum('city' in t.lower() for t in texts),
'words': sum(len(t.split()) for t in texts) / len(texts),
'openings': collections.Counter(opening(t) for t in texts).most_common(3),
})
n = min(len(c['summaries']) for c in cols)
for i in range(n):
x = cols[0]['summaries'][i]
ch = chunks[x['chunk']]
cells = ''.join(
f'<div class="pred"><span class="who">{html.escape(labels[j])}</span>'
f'<p>{marked(clean(cols[j]["summaries"][i]["summary"]))}</p>'
f'<label><input type="radio" name="p{i}" value="{j}"> better</label></div>'
for j in range(2))
rows.append(f'''<section data-i="{i}">
<header><span class="n">{i + 1}</span> <b>{html.escape(ch["title"])}</b></header>
<details><summary>Scene summary: {marked(summary.get(x["chunk"], ""))}</summary>
<p class="scene">{html.escape(ch["text"][:1200])}{"…" if len(ch["text"]) > 1200 else ""}</p></details>
<div class="pair">{cells}</div>
<label class="both"><input type="radio" name="p{i}" value="n"> neither is a predicament</label>
</section>''')
stat_rows = ''.join(
f'<tr><td>{html.escape(labels[j])}</td><td>{s["leaky"]} of {n}</td><td>{s["city"]}</td>'
f'<td>{s["words"]:.0f}</td><td>{"; ".join(f"“{html.escape(o)}…” ×{c}" for o, c in s["openings"])}</td></tr>'
for j, s in enumerate(stats))
print(f'''<!doctype html><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>Predicament pilot</title>
<style>
:root{{--bg:#f7f6f2;--card:#fff;--ink:#222;--dim:#666;--line:#ddd;--mark:#ffe08a;--pick:#e3f1e6}}
@media (prefers-color-scheme:dark){{:root{{--bg:#1b1b1d;--card:#252528;--ink:#e6e6e6;--dim:#999;--line:#3a3a3e;--mark:#6b5415;--pick:#23402b}}}}
body{{background:var(--bg);color:var(--ink);font:15px/1.5 system-ui,sans-serif;margin:0;padding:24px 16px}}
main{{max-width:980px;margin:auto}} h1{{margin:0 0 4px}} .dim{{color:var(--dim)}}
table{{border-collapse:collapse;margin:12px 0;font-size:14px}} td,th{{border-bottom:1px solid var(--line);padding:4px 10px;text-align:left}}
.wrap{{overflow-x:auto}}
#tally{{position:sticky;top:0;background:var(--bg);padding:8px 0;border-bottom:1px solid var(--line);z-index:1}}
section{{background:var(--card);border:1px solid var(--line);border-radius:8px;padding:12px 14px;margin:14px 0}}
header .n{{color:var(--dim);margin-right:4px}} summary{{cursor:pointer;color:var(--dim);margin:6px 0}}
.scene{{white-space:pre-wrap;font-size:13px;color:var(--dim)}}
.pair{{display:grid;grid-template-columns:1fr 1fr;gap:10px}} @media (max-width:640px){{.pair{{grid-template-columns:1fr}}}}
.pred{{border:1px solid var(--line);border-radius:6px;padding:8px 10px}} .pred p{{margin:4px 0 8px}}
.pred:has(input:checked){{background:var(--pick)}} .who{{font-size:12px;color:var(--dim)}}
mark{{background:var(--mark);color:inherit;border-radius:2px}} .both{{display:block;margin-top:8px;font-size:13px;color:var(--dim)}}
</style>
<main>
<h1>Predicament pilot</h1>
<p class="dim">The first {n} scenes, each re-described by two models as the main person's predicament. Names are
already removed as the full run would. <mark>Highlighted</mark> words are jobs, relationships and places, the
words the old groups formed around. Pick the better sentence in each scene, or "neither". The column order
is fixed: {html.escape(labels[0])} on the left.</p>
<p class="dim">What to look for: does the sentence say what the person is up against and what they want? Could
it happen to anyone, anywhere? Would two scenes with the same predicament end up with similar sentences?</p>
<div class="wrap"><table><tr><th>Model</th><th>Has a highlighted word</th><th>Says "city"</th><th>Words, mean</th><th>Most common openings</th></tr>{stat_rows}</table></div>
<div id="tally"></div>
{"".join(rows)}
</main>
<script>
const KEY='stp-pilot:'+{json.dumps(labels)}.join('|'), labels={json.dumps(labels)};
let saved={{}}; try{{saved=JSON.parse(localStorage.getItem(KEY)||'{{}}')}}catch(e){{}}
for(const [k,v] of Object.entries(saved)){{const el=document.querySelector(`input[name="${{k}}"][value="${{v}}"]`); if(el) el.checked=true}}
function tally(){{
const c={{0:0,1:0,n:0}}; let done=0;
document.querySelectorAll('input[type=radio]:checked').forEach(r=>{{c[r.value]++;done++}});
document.getElementById('tally').textContent=`Picked ${{done}} of {n}: ${{labels[0]}} ${{c[0]}}, ${{labels[1]}} ${{c[1]}}, neither ${{c.n}}`;
}}
document.addEventListener('change',e=>{{if(e.target.type!=='radio')return; saved[e.target.name]=e.target.value;
try{{localStorage.setItem(KEY,JSON.stringify(saved))}}catch(err){{}} tally()}});
tally();
</script>''')
+70
View File
@@ -0,0 +1,70 @@
"""Re-describe each scene as the predicament its main person is in, with nothing tying it to the story.
The first human review found the summary groups were topics (artists, police, courtship, hotels)
because summaries keep jobs and places, and those dominate the embeddings. The unit a pack needs is
a predicament: what someone is up against and what they want out of it (SELECTION.md, "Predicaments").
This rewrites the scene's own prose into that, leaving out whatever makes a topic.
STP_OLLAMA=http://host:11434 STP_CHAT_MODEL=qwen3:14b python3 redescribe.py --limit 40 --out pilot-predicaments-14b.json
STP_OLLAMA=http://host:11434 python3 redescribe.py # every scene -> predicaments.json
The output has the same layout as summaries.json ({"summaries": [{"chunk", "story", "summary"}]}),
so strip_names.py and embed.py read it unchanged. One request at a time; progress is saved after
every scene, so an interrupted run resumes.
"""
import argparse, json, os, pathlib, re, time
import ollama
from topic_words import TOPIC_WORDS
ap = argparse.ArgumentParser()
ap.add_argument('--limit', type=int, default=None)
ap.add_argument('--out', default='predicaments.json')
args = ap.parse_args()
MODEL = os.environ.get('STP_CHAT_MODEL', 'qwen2.5:3b-instruct')
# Fixed before any call (SELECTION.md). No example of the output vocabulary: the 3B model copied
# the examples it was given when summarising.
SYSTEM = """You describe the predicament of the main person in a passage of fiction, in ONE sentence.
A predicament is what that person is up against and what they want out of it: the kind of trouble or opportunity that could happen to anyone, in any line of work, in any town.
Rules:
- Exactly one sentence, at most 20 words.
- Leave out everything that ties it to this story: no names, no jobs or professions, no places, no businesses, and no objects that only belong to this story.
- Say what the person is up against, and what they want.
- Do not describe the writing, the mood, or who is telling the story.
- Output only the sentence."""
# A full stop after these is not the end of a sentence; nor is one after a single capital (an initial).
END = re.compile(r'(?<!\bMr)(?<!\bMrs)(?<!\bMs)(?<!\bDr)(?<!\bSt)(?<!\bNo)(?<![\s.][A-Z])[.!?](?:\s|$)')
def first_sentence(text):
text = re.sub(r'<think>.*?</think>', '', text, flags=re.S)
text = re.sub(r'\s+', ' ', text).strip().strip('"')
m = END.search(text)
return text[:m.end()].strip() if m else text
chunks = json.loads(pathlib.Path('chunks.json').read_text(encoding='utf-8'))
if args.limit:
chunks = chunks[:args.limit]
out = pathlib.Path(args.out)
state = json.loads(out.read_text()) if out.exists() else {'model': MODEL, 'prompt': SYSTEM, 'summaries': []}
if state['model'] != MODEL or state['prompt'] != SYSTEM:
raise SystemExit(f'{out} was made with a different model or prompt; choose another --out')
done = state['summaries']
print(f'{len(chunks)} scenes, resuming at {len(done)}, model {MODEL}', flush=True)
t0 = time.time()
for i in range(len(done), len(chunks)):
think = False if MODEL.startswith('qwen3') else None
text, _, _ = ollama.chat(MODEL, SYSTEM, chunks[i]['text'], num_ctx=2048, num_predict=80, think=think)
done.append({'chunk': i, 'story': chunks[i]['story'], 'summary': first_sentence(text), 'model_output': text})
out.write_text(json.dumps(state, indent=1, ensure_ascii=False), encoding='utf-8')
if (i + 1) % 10 == 0 or i + 1 == len(chunks):
print(f' {i + 1}/{len(chunks)} {time.time() - t0:.0f}s', flush=True)
leaks = [x for x in done if set(re.findall(r"[a-zé]+", x['summary'].lower())) & TOPIC_WORDS]
print(f'done: {len(done)} predicaments, {time.time() - t0:.0f}s this session; '
f'{len(leaks)} still mention a job, relationship or place word')
+26 -125
View File
@@ -1,20 +1,21 @@
"""Build a human-review package: the clusters gate G2 accepts, plus the nearest misses.
"""Build a review page: the groups gate G2 accepts, plus the nearest misses.
python3 review.py # k = 60, seed 24 -> review/k60-s24/
python3 review.py --k 60 --seed 31 --borderline 8
Writes into the run directory:
REVIEW.md what was found, and exactly what the reviewer decides for each candidate
review.json the form to fill in: the only file the reviewer edits
candidates.json what was found, for apply_review.py to check the form against (do not edit)
REVIEW.html open it in a browser: the whole review happens there
candidates.json what was found, for apply_review.py to check the saved review against
Then: python3 apply_review.py review/k60-s24 -> situations.json
When the review is saved from the page:
python3 apply_review.py review/k60-s24 -> situations.json
No inference: this uses the summaries and embeddings already on disk.
"""
import argparse, datetime, json, pathlib, sys
import argparse, datetime, hashlib, json, pathlib
import gate2 as g
import review_format as rf
import review_page
def gate_failures(sig, gate):
@@ -31,7 +32,7 @@ def gate_failures(sig, gate):
def shortfall(sig, gate):
"""How far a rejected candidate is from passing; smaller is closer."""
"""How far a rejected group is from passing; smaller is closer."""
s = 0.0
if gate.get('S1') is not None: s += max(0.0, gate['S1'] - sig['S1']) / 0.01
if gate.get('Z1') is not None: s += max(0.0, gate['Z1'] - sig['Z1'])
@@ -39,160 +40,60 @@ def shortfall(sig, gate):
return s
def cell(text):
return text.replace('|', '\\|').replace('\n', ' ')
def main():
ap = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter)
ap.add_argument('--k', type=int, default=60, help='number of k-means clusters (default 60)')
ap.add_argument('--seed', type=int, default=24, help='k-means seed (default 24)')
ap.add_argument('--borderline', type=int, default=8, help='near misses to offer for optional review (default 8)')
ap.add_argument('--borderline', type=int, default=8, help='near misses offered as optional extras (default 8)')
ap.add_argument('--out', help='run directory (default review/k<K>-s<SEED>)')
ap.add_argument('--force', action='store_true', help='overwrite an existing review.json')
args = ap.parse_args()
run_id = f'k{args.k}-s{args.seed}'
out = pathlib.Path(args.out or f'review/{run_id}')
if (out / 'review.json').exists() and not args.force:
sys.exit(f'{out / "review.json"} already exists and may hold a reviewer\'s work. '
f'Use --force to overwrite it, or --out for a different directory.')
gate = json.loads(pathlib.Path('gate2-frozen.json').read_text())
candidates_found = [c for c in g.kmeans(args.k, args.seed) if g.eligible(c)]
scored = [(c, g.signals(c)) for c in candidates_found]
found = [c for c in g.kmeans(args.k, args.seed) if g.eligible(c)]
scored = [(c, g.signals(c)) for c in found]
accepted = sorted([cs for cs in scored if g.g2_passes(cs[1], gate)], key=lambda cs: -cs[1]['S1'])
rejected = sorted([cs for cs in scored if not g.g2_passes(cs[1], gate)], key=lambda cs: shortfall(cs[1], gate))
borderline = rejected[:args.borderline]
listed = [(f'C{i + 1:02d}', 'accepted', c, s) for i, (c, s) in enumerate(accepted)]
listed += [(f'B{i + 1:02d}', 'borderline', c, s) for i, (c, s) in enumerate(borderline)]
centroids = {cid: g.centroid(c) for cid, _, c, _ in listed}
candidates = {}
for cid, kind, members, sig in listed:
others = [(g.dot(centroids[cid], centroids[o]), o) for o in centroids if o != cid]
cos, similar = max(others) if others else (0.0, None)
member_rows = [{'member': rf.member_id(cid, n + 1), 'chunk': chunk, 'story': g.chunks[chunk]['story'],
'title': g.chunks[chunk]['title'].title(), 'summary': g.text[chunk]}
for n, chunk in enumerate(sorted(members))]
candidates[cid] = {
'kind': kind,
'stats': {'scenes': sig['size'], 'stories': sig['stories'], 'largest_story_share': round(sig['dominant'], 3),
'S1': round(sig['S1'], 4), 'Z1': round(sig['Z1'], 2), 'W': round(sig['W'], 3), 'W_word': sig['W_word']},
'gate_failures': gate_failures(sig, gate),
'most_similar': {'id': similar, 'cosine': round(cos, 3)},
'members': [{'member': rf.member_id(cid, n + 1), 'chunk': chunk, 'story': g.chunks[chunk]['story'],
'title': g.chunks[chunk]['title'], 'summary': g.text[chunk]}
for n, chunk in enumerate(sorted(members))],
'role_hints': review_page.role_hints(member_rows),
'members': member_rows,
}
# Ties a saved review to exactly these groups, so progress for a different set of groups
# that happens to share the run name is never loaded into this page.
fingerprint = hashlib.sha1(json.dumps({cid: [m['chunk'] for m in c['members']] for cid, c in candidates.items()},
sort_keys=True).encode()).hexdigest()[:12]
document = {
'schema_version': rf.SCHEMA_VERSION,
'run': {'id': run_id, 'k': args.k, 'seed': args.seed,
'run': {'id': run_id, 'k': args.k, 'seed': args.seed, 'fingerprint': fingerprint,
'created': datetime.datetime.now().astimezone().isoformat(timespec='seconds'),
'gate': {'name': 'G2', **gate}, 'scenes': g.n, 'stories': len(set(g.story)),
'candidates_found': len(candidates_found), 'accepted': len(accepted), 'borderline': len(borderline)},
'candidates_found': len(found), 'accepted': len(accepted), 'borderline': len(borderline)},
'candidates': candidates,
}
out.mkdir(parents=True, exist_ok=True)
(out / 'candidates.json').write_text(json.dumps(document, indent=1, ensure_ascii=False), encoding='utf-8')
(out / 'review.json').write_text(json.dumps(rf.blank_form(document), indent=1, ensure_ascii=False), encoding='utf-8')
(out / 'REVIEW.md').write_text(render(document, out), encoding='utf-8')
(out / 'REVIEW.html').write_text(review_page.render_page(document), encoding='utf-8')
print(f'{run_id}: {len(candidates_found)} candidates, G2 accepts {len(accepted)}, '
f'{len(borderline)} borderline offered')
print(f'wrote {out}/REVIEW.md, {out}/review.json, {out}/candidates.json')
print(f'next: fill in {out}/review.json, then python3 apply_review.py {out}')
def render(doc, out):
run, cands = doc['run'], doc['candidates']
accepted = [cid for cid, c in cands.items() if c['kind'] == 'accepted']
borderline = [cid for cid, c in cands.items() if c['kind'] == 'borderline']
gate = run['gate']
expected_rejects = round(len(accepted) * 0.27)
L = []
L.append(f'# Situation review — run {run["id"]}\n')
L.append(f'Generated {run["created"]} by `probe/review.py` (k-means k = {run["k"]}, seed {run["seed"]}, gate G2).\n')
L.append('## What the program found\n')
L.append(f'- {run["scenes"]} scenes from {run["stories"]} stories, grouped into {run["k"]} clusters.')
L.append(f'- {run["candidates_found"]} clusters are large and varied enough to be candidates '
f'(at least {rf.MIN_MEMBERS} scenes from at least {rf.MIN_STORIES} stories, no story above {rf.MAX_DOMINANT:.0%}).')
L.append(f'- **{len(accepted)} candidates passed the automatic gate (G2): {", ".join(accepted) or "none"}.** '
f'On blind-labelled test data about 3 in 4 clusters that G2 accepts are real situations, '
f'so expect to reject roughly {expected_rejects} of these.')
L.append(f'- {len(borderline)} more candidates narrowly failed the gate: {", ".join(borderline) or "none"}. '
f'They are at the end. **Reviewing them is optional.**\n')
L.append('## What you are asked to do\n')
L.append(f'Budget about a minute per candidate. For each candidate below, read its scenes, then fill in '
f'its entry in **`review.json`** in this directory. That is the only file to edit; '
f'`candidates.json` is the program\'s record and must stay as it is.\n')
L.append('For each candidate, answer:\n')
L.append('1. **Do most of these scenes show one recurring situation** — one person wanting something '
'specific from another? → `decision`')
L.append('2. **If so, what is it?** One sentence: who wants what from whom. → `situation`, `actor`, `counterpart`, `stakes`')
L.append('3. **Which scenes do not show it?** → `exclude`')
L.append('4. **Is it the same situation as another candidate?** → `decision: "merge"` and `merge_into`\n')
L.append('| Field | What to put | When |')
L.append('| --- | --- | --- |')
L.append('| `decision` | `"accept"` — most scenes show one situation. `"reject"` — they do not. `"merge"` — the same situation as another candidate you accepted. Near misses (B…) start as `"skip"` and may be changed to `"accept"` or `"merge"`. | always |')
L.append('| `situation` | One sentence, at most 200 characters: who wants what from whom. | accept |')
L.append('| `actor` | The role that wants something — a role such as "a lodger", never a character\'s name. | accept |')
L.append('| `counterpart` | The role they want it from. | accept |')
L.append('| `stakes` | What is won or lost, in a few words. | asked for; not required |')
L.append('| `exclude` | Scene ids that do **not** show the situation, e.g. `["C04.02", "C04.11"]`. | when some do not fit |')
L.append('| `merge_into` | The id of the accepted candidate this one duplicates. | merge |')
L.append('| `notes` | Anything worth keeping. | optional |\n')
L.append('Guidance:\n')
L.append('- **A shared place, mood, job or word is not a situation.** "Scenes in restaurants" is a reject; '
'"a diner wants credit from a proprietor who wants payment" is an accept.')
L.append('- **Stay concrete.** "Conflict", "power dynamics" and "someone wants something" describe everything; '
'if that is the best you can say, reject.')
L.append(f'- **An accepted situation needs at least {rf.MIN_MEMBERS} scenes from at least {rf.MIN_STORIES} stories '
f'after exclusions, with no story above {rf.MAX_DOMINANT:.0%}.** The checker tells you if exclusions break that.')
L.append('- **"Most similar" is a hint from the embeddings and is often wrong.** Merge only when the situations are the same.')
L.append('- Scenes are machine summaries with names replaced by "someone"; the story title is the original.\n')
L.append('An invented example of a completed entry (not from this corpus):\n')
L.append('```json')
L.append(json.dumps({'id': 'C00', 'kind': 'accepted', 'decision': 'accept',
'situation': 'A junior clerk wants a raise from an employer who wants more work for the same pay.',
'actor': 'a junior clerk', 'counterpart': 'an employer', 'stakes': 'his wage and his job',
'exclude': ['C00.04'], 'merge_into': None, 'notes': ''}, indent=1))
L.append('```\n')
L.append('## When you are done\n')
L.append('```sh')
L.append(f'python3 apply_review.py {out}')
L.append('```\n')
L.append('It checks the whole form and lists **every** problem at once — a missing decision, a scene id that '
'is not in that candidate, a merge into something you rejected, exclusions that leave too few '
'stories. Nothing is written until the form passes. Then it writes **`situations.json`**: each '
'situation\'s wording, roles and stakes, the scenes that show it with their stories, and the '
'candidates it came from. That file is what the next stage reads.\n')
def section(cid):
c = cands[cid]
st = c['stats']
L.append(f'### {cid} — {st["scenes"]} scenes from {st["stories"]} stories\n')
if c['kind'] == 'accepted':
L.append(f'Passed the gate: cohesion S1 {st["S1"]:.3f} (needs {gate["S1"]:.3f}), Z1 {st["Z1"]:.1f} '
f'(needs {gate["Z1"]}); largest story share {st["largest_story_share"]:.0%}. ')
else:
L.append('Missed the gate: ' + '; '.join(c['gate_failures']) + '. ')
sim = c['most_similar']
if sim['id']:
L.append(f'Most similar candidate: {sim["id"]} (cosine {sim["cosine"]:.2f} — a hint only).\n')
L.append('| Scene | Story | Summary |')
L.append('| --- | --- | --- |')
for m in c['members']:
L.append(f'| {m["member"]} | {cell(m["title"].title())} | {cell(m["summary"])} |')
L.append('')
L.append('## Candidates that passed the gate — a decision is required\n')
for cid in accepted:
section(cid)
L.append('## Near misses — optional\n')
L.append('These failed the gate narrowly. Leave them as `"skip"` unless one clearly shows a situation.\n')
for cid in borderline:
section(cid)
return '\n'.join(L) + '\n'
print(f'{run_id}: {len(found)} candidate groups, G2 accepts {len(accepted)}, {len(borderline)} optional extras')
print(f'open this in a browser: {(out / "REVIEW.html").resolve()}')
print(f'when the review is saved: python3 apply_review.py {out}')
if __name__ == '__main__':
File diff suppressed because one or more lines are too long
@@ -1,655 +0,0 @@
# Situation review — run k60-s24
Generated 2026-09-15T06:10:32-04:00 by `probe/review.py` (k-means k = 60, seed 24, gate G2).
## What the program found
- 838 scenes from 94 stories, grouped into 60 clusters.
- 40 clusters are large and varied enough to be candidates (at least 5 scenes from at least 4 stories, no story above 40%).
- **12 candidates passed the automatic gate (G2): C01, C02, C03, C04, C05, C06, C07, C08, C09, C10, C11, C12.** On blind-labelled test data about 3 in 4 clusters that G2 accepts are real situations, so expect to reject roughly 3 of these.
- 8 more candidates narrowly failed the gate: B01, B02, B03, B04, B05, B06, B07, B08. They are at the end. **Reviewing them is optional.**
## What you are asked to do
Budget about a minute per candidate. For each candidate below, read its scenes, then fill in its entry in **`review.json`** in this directory. That is the only file to edit; `candidates.json` is the program's record and must stay as it is.
For each candidate, answer:
1. **Do most of these scenes show one recurring situation** — one person wanting something specific from another? → `decision`
2. **If so, what is it?** One sentence: who wants what from whom. → `situation`, `actor`, `counterpart`, `stakes`
3. **Which scenes do not show it?** → `exclude`
4. **Is it the same situation as another candidate?** → `decision: "merge"` and `merge_into`
| Field | What to put | When |
| --- | --- | --- |
| `decision` | `"accept"` — most scenes show one situation. `"reject"` — they do not. `"merge"` — the same situation as another candidate you accepted. Near misses (B…) start as `"skip"` and may be changed to `"accept"` or `"merge"`. | always |
| `situation` | One sentence, at most 200 characters: who wants what from whom. | accept |
| `actor` | The role that wants something — a role such as "a lodger", never a character's name. | accept |
| `counterpart` | The role they want it from. | accept |
| `stakes` | What is won or lost, in a few words. | asked for; not required |
| `exclude` | Scene ids that do **not** show the situation, e.g. `["C04.02", "C04.11"]`. | when some do not fit |
| `merge_into` | The id of the accepted candidate this one duplicates. | merge |
| `notes` | Anything worth keeping. | optional |
Guidance:
- **A shared place, mood, job or word is not a situation.** "Scenes in restaurants" is a reject; "a diner wants credit from a proprietor who wants payment" is an accept.
- **Stay concrete.** "Conflict", "power dynamics" and "someone wants something" describe everything; if that is the best you can say, reject.
- **An accepted situation needs at least 5 scenes from at least 4 stories after exclusions, with no story above 40%.** The checker tells you if exclusions break that.
- **"Most similar" is a hint from the embeddings and is often wrong.** Merge only when the situations are the same.
- Scenes are machine summaries with names replaced by "someone"; the story title is the original.
An invented example of a completed entry (not from this corpus):
```json
{
"id": "C00",
"kind": "accepted",
"decision": "accept",
"situation": "A junior clerk wants a raise from an employer who wants more work for the same pay.",
"actor": "a junior clerk",
"counterpart": "an employer",
"stakes": "his wage and his job",
"exclude": [
"C00.04"
],
"merge_into": null,
"notes": ""
}
```
## When you are done
```sh
python3 apply_review.py review/k60-s24
```
It checks the whole form and lists **every** problem at once — a missing decision, a scene id that is not in that candidate, a merge into something you rejected, exclusions that leave too few stories. Nothing is written until the form passes. Then it writes **`situations.json`**: each situation's wording, roles and stakes, the scenes that show it with their stories, and the candidates it came from. That file is what the next stage reads.
## Candidates that passed the gate — a decision is required
### C01 — 16 scenes from 8 stories
Passed the gate: cohesion S1 0.635 (needs 0.604), Z1 6.8 (needs 5); largest story share 25%.
Most similar candidate: B07 (cosine 0.87 — a hint only).
| Scene | Story | Summary |
| --- | --- | --- |
| C01.01 | Extradited From Bohemia | Someone, a painter, travels to New someone to pursue her art career, facing judgment and skepticism from both her rural hometown and urban boardinghouse dwellers. |
| C01.02 | Extradited From Bohemia | Someone, seeking to improve her lot, takes art lessons from a retired barber while navigating the harsh realities of urban life and the competitive world of art. |
| C01.03 | Extradited From Bohemia | Professor someone’s praise for someone’s sketches alternated between admiration and harsh criticism, while someone struggled with personal and professional setbacks, including a missed remittance, unsold artworks, and a headache. |
| C01.04 | From Each According To His Ability | Someone demanded someone produce a story, while someone dismissed someone’s complaints and painted vivid West Coast landscapes for the dinner guests. |
| C01.05 | The Day Resurgent | The artist struggles to depict someone, limited by tradition and personal preferences, while his mentor insists it is a concept without fixed meaning. |
| C01.06 | The Duel | Someone, ambitious businessman, and someone, aspiring artist, clash at the ferry, setting their city-savvy ambitions against each other. |
| C01.07 | A Service Of Love | Someone and someone, newlyweds with a passion for art, face financial hardship in a cramped New someone flat, questioning the value of their shared love for art amidst their struggles. |
| C01.08 | A Service Of Love | Someone and someone, aspiring artists, lived in a cramped flat, dreaming of spacious studios, while their teacher someone and piano tutor someone provided the means to achieve their goals. |
| C01.09 | A Service Of Love | Someone seeks music lessons to support her Art, while someone resents her financial independence and challenges her ambitions. |
| C01.10 | A Service Of Love | Someone pressures her music teacher husband someone to continue studying while she teaches art lessons, leading to financial gains and strained family life. |
| C01.11 | An Adjustment Of Nature | Someone, a young artist, sells his painting for $5,000 while Bill someone, a poet, recounts their past meals at someone’s, a restaurant where patrons often went unpaid, hinting at a history of financial dealings and possibly a power dynamic. |
| C01.12 | A Madison Square Arabian Night | Painter someone struggles with clients' anger and scandal after revealing hidden truths in his portraits. |
| C01.13 | A Madison Square Arabian Night | Someone, once a newspaper artist, struggles to find steady work as he exposes the flaws in people's appearances through his drawings, leading to frequent job losses and a reliance on alcohol for comfort. |
| C01.14 | A Madison Square Arabian Night | Someone, a wealthy patron, seeks someone, an artist, to critique a pastel sketch, wary of its artistic merit and fearing its value. |
| C01.15 | A Madison Square Arabian Night | Someone, eager to profit, demands the artist paint a portrait of his wife based on a drawing, offering payment for the finished work. |
| C01.16 | The Last Leaf | Someone and someone, an artist couple, seek shelter in a quirky someone Village colony, unaware that the looming Pneumonia threatens their fragile existence. |
### C02 — 11 scenes from 8 stories
Passed the gate: cohesion S1 0.626 (needs 0.604), Z1 5.4 (needs 5); largest story share 27%.
Most similar candidate: C03 (cosine 0.91 — a hint only).
| Scene | Story | Summary |
| --- | --- | --- |
| C02.01 | The Complete Life Of John Hopkins | Someone, a rebus worker, eludes a policeman by running and jumping into a speeding car driven by a masked chauffeur, unaware of his passenger's indifference. |
| C02.02 | The Girl And The Graft | Someone, a wealthy man, manipulates someone into posing as a criminal to gain attention, revealing his own ambition to be noticed through outrageous and costly efforts. |
| C02.03 | A Bird Of Bagdad | Someone, seeking romance or distress to aid, encounters a young man throwing coins into the street, drawing a crowd and halting traffic. |
| C02.04 | Past One At Rooney’S | Someone, the girl, challenges Cop someone’s authority over her man, someone, with accusations and money, while someone tries to assert his power. |
| C02.05 | Past One At Rooney’S | Cork coerces his girlfriend into a clandestine rendezvous at a known criminal's house, leading to a tense confrontation with the police. |
| C02.06 | The Cop And The Anthem | Someone, a desperate man, attempts to con a young woman by posing as a "masher" in front of a cop, unaware the officer is watching him. |
| C02.07 | The Cop And The Anthem | The policeman watched as the persecuted young woman enticed someone to flee with her, knowing his presence was futile. |
| C02.08 | The Cop And The Anthem | Someone, desperate and ambitious, schemes to escape his current plight but is confronted by a policeman, revealing his criminal activities. |
| C02.09 | Sisters Of The Golden Circle | Someone, accused of murder, throws a kiss at his wife's unseen admirer while his wife advises him to resist arrest. |
| C02.10 | A Harlem Tragedy | Special Terrestrial Officer someone presents a grim case to the court, while court officer threatens to transfer him, revealing the actual suspect is a man in the room. |
| C02.11 | Elsie In New York | Hank someone, a rancher seeking a mate, approaches someone, a shy girl, only to be interrupted by a cop who sees him talking to her. |
### C03 — 13 scenes from 8 stories
Passed the gate: cohesion S1 0.626 (needs 0.604), Z1 5.9 (needs 5); largest story share 38%.
Most similar candidate: C02 (cosine 0.91 — a hint only).
| Scene | Story | Summary |
| --- | --- | --- |
| C03.01 | The Voice Of The City | The cop, tasked with maintaining order, confronts a young man who questions the cop's role and civic duty, leading to a conversation about the city's unrest and the cop's mundane nightly duties. |
| C03.02 | The City Of Dreadful Night | The man confronts the Park someone about illegal park users, sparking a conversation about public space usage and social norms. |
| C03.03 | The Gold That Glittered | The General, cornered by street chaos and threatened by two hunters, finds unexpected help from Spider someone, who offers assistance and friendship. |
| C03.04 | Past One At Rooney’S | Someone’s men confront a cop in a dimly lit room, escalating from a casual encounter to a tense confrontation over a missing man. |
| C03.05 | Between Rounds | Policeman someone overhears someone’s domestic dispute, estimating the duration and escalating violence. |
| C03.06 | Memoirs Of A Yellow Dog | The black-and-tan dog and pointer vie for dominance in a social setting, with the black-and-tan mocking the pointer's initial shyness and boasting about his own confidence. |
| C03.07 | After Twenty Years | The policeman, vigilant and observant, encounters a man waiting outside a demolished restaurant, challenging the officer's knowledge of the area's history. |
| C03.08 | After Twenty Years | The policeman, seeking to assert his authority, confronts someone, now a stranger, while someone waits anxiously for his friend. |
| C03.09 | The Badge Of Policeman O’Roon | Someone, now seeking work, confronts someone, a former Gentle Rider, at a club, revealing their shared history and current mismatched fortunes. |
| C03.10 | The Badge Of Policeman O’Roon | Someone secures a position for someone as a mounted policeman in Central Park, leading to someone’s attraction to the officer. |
| C03.11 | The Badge Of Policeman O’Roon | Mounted Policeman someone, desperate for his badge and honor, confronts someone, his friend and rival, in the park, while someone plans to steal his identity and position. |
| C03.12 | The Badge Of Policeman O’Roon | Someone chased the fleeing victoria, his chestnut horse outmaneuvering a pair of runaway bays, while a disguised policeman tried to intervene. |
| C03.13 | The Badge Of Policeman O’Roon | Someone confronts someone, a policeman, over a damaged horse, while someone threatens retribution and invites someone to a social event. |
### C04 — 14 scenes from 11 stories
Passed the gate: cohesion S1 0.616 (needs 0.604), Z1 5.2 (needs 5); largest story share 21%.
Most similar candidate: C05 (cosine 0.88 — a hint only).
| Scene | Story | Summary |
| --- | --- | --- |
| C04.01 | The Harbinger | Someone threatens to leave someone to seek payment from their adulterous daughter-in-law someone. |
| C04.02 | One Thousand Dollars | Lawyer someone demands an account of Young someone’s expenditure of $1,000 inherited from his uncle's will, setting off a chain of events involving Old someone. |
| C04.03 | One Thousand Dollars | Someone, seeking money left by his uncle, confronts someone, a blind man, and lawyer someone in a cab, revealing a secret amendment to the will. |
| C04.04 | One Thousand Dollars | Someone confronts someone Sharp and someone, his executors, over the interpretation of a codicil to his uncle's will, threatening to expose their handling of a $1,000 bequest. |
| C04.05 | The Shocks Of Doom | Someone regains composure, demands someone leave, and challenges the lawyer, while someone faints. |
| C04.06 | The Easter Of The Soul | Someone threatens someone with losing his job and demanding repayment of a debt she owes him, while she tries to convince him it is still winter. |
| C04.07 | The Robe Of Peace | Someone, reluctant to leave his job, is pressured by someone and someone to resign, but insists he has found his true calling and will remain. |
| C04.08 | A Municipal Report | Uncle someone, a Negro with a someone coat, corners someone for a contract on her literary works before a rival publisher offers her more. |
| C04.09 | The Trimmed Lamp | Someone challenges someone over her inheritance from Uncle someone, a paltry $20,000 annually, insisting she wants more than financial security. |
| C04.10 | Brickdust Row | Someone demands answers and a cigar, while Lawyer someone holds power over someone’s estate and schedules. |
| C04.11 | Brickdust Row | Lawyer someone demands someone sign documents and discuss family property, while someone resists, preferring to avoid the unpleasant task. |
| C04.12 | Vanity And Some Sables | The father threatens to quit his plumbing job to avoid paying high wages, while his son continues to work diligently despite the family's financial struggles. |
| C04.13 | According To Their Lights | Uncle expects nephew to end engagement with heiress someone to save face, but nephew refuses, citing uncle's own nose deformity. |
| C04.14 | Elsie In New York | Someone seeks work, faces a conflicted decision as a mysterious job offer pits her against a stern, threatening figure. |
### C05 — 22 scenes from 14 stories
Passed the gate: cohesion S1 0.615 (needs 0.604), Z1 6.4 (needs 5); largest story share 14%.
Most similar candidate: B08 (cosine 0.90 — a hint only).
| Scene | Story | Summary |
| --- | --- | --- |
| C05.01 | The Harbinger | Someone, desperate for his wife's dollar, conspires with someone and someone to steal it from their married friends in Union Square. |
| C05.02 | The Harbinger | Someone struggles to convince his wife, someone, to join him in a quest for a treasure to save their failing life, while two hired guns wait outside the ruined château. |
| C05.03 | The Harbinger | Someone schemes to win back his wife, someone, with false promises, while someone and someone wait for a dollar from someone. |
| C05.04 | One Thousand Dollars | Someone, now wealthy, seeks advice on what to do with a thousand dollars after inheriting a fortune from his deceased uncle's legal firm, which includes a bequest to a microbe and a ward, leaving him perplexed about his newfound wealth. |
| C05.05 | One Thousand Dollars | Old someone flaunted his wealth and moralizing skills, offering someone various uses for a thousand dollars, to which someone responded with frustration and a desire to spend it impulsively. |
| C05.06 | The Shocks Of Doom | Someone, a panhandler, seeks financial advice from someone, a former high-flyer now destitute, as someone, his wealthy uncle, offers him a comeback. |
| C05.07 | Strictly Business | Someone Valentine, the only witness to someone death, is suspected of embezzling $647,000 and someone lover someone is convinced of his guilt. |
| C05.08 | Babes In The Jungle | Silver and someone anxiously search for the stolen painting in a pawnshop, competing with the owner for its purchase price. |
| C05.09 | The Unknown Quantity | Someone, seeking to repay his father's ill-gotten wealth, consults someone, who explains the futility of restitution to the robbed. |
| C05.10 | The Unknown Quantity | Someone, the businessman, demands repayment for a gold brick he sold, while someone, the accountant, argues the impracticality and futility of such repayment. |
| C05.11 | A Bird Of Bagdad | The young man seeks financial advice from the someone, a noble, in exchange for solving a riddle about his mundane job at someone’s shop. |
| C05.12 | Compliments Of The Season | The Millionaire seeks to solve the disappearance of his rag-doll, while someone examines the clues left by his terrier, Flip. |
| C05.13 | Compliments Of The Season | Black someone demands fifty cents for the rag-doll found at the Millionaire’s mansion, while someone insists it was given to him by the someone of someone. |
| C05.14 | Compliments Of The Season | Someone, a potential prize for the trio of street fighters someone, Black someone, and someone, is coerced into accepting a reward for his services, leading to a tense standoff at the Millionaire’s house. |
| C05.15 | A Night In New Arabia | Someone, desperate for restitution, hires detectives to find heirs of the miner who sold him land for $125 that he later sold for $10,000. |
| C05.16 | The Venturers | Someone searched his pockets for money, finding none, as a man approached him, revealing he had only two pennies for dinner. |
| C05.17 | From The Cabby’S Seat | Someone, desperate for help, brings his wife to the police station after a chaotic horse theft gone wrong. |
| C05.18 | The Assessor Of Success | Someone, with $140 in his pocket, sat on a bench in someone Square, amused by an old man begging for a dollar, sparking a conversation about work and the world's potential for wealth. |
| C05.19 | The Badge Of Policeman O’Roon | Someone, a ten-millionaire, heroically saves a runaway team and a lady, but his true identity as a discharged policeman is revealed. |
| C05.20 | The Tale Of A Tainted Tenner | Auctioneer-like Sitting Bull haggles with a 1899 five-dollar bill for a 1899 five-dollar bill, while a 1899 two-dollar bill offers to share its pocketbook story. |
| C05.21 | The Tale Of A Tainted Tenner | A worn stack of currency moves through various illicit and sometimes charitable hands, always seeking a better fate. |
| C05.22 | The Tale Of A Tainted Tenner | A banker desperate for cash extorts a loan shark, who offers him $60,000 in a safe, but warns of potential danger. |
### C06 — 35 scenes from 24 stories
Passed the gate: cohesion S1 0.610 (needs 0.604), Z1 8.2 (needs 5); largest story share 9%.
Most similar candidate: C11 (cosine 0.92 — a hint only).
| Scene | Story | Summary |
| --- | --- | --- |
| C06.01 | The Complete Life Of John Hopkins | Someone, smug after a romantic encounter, confronts a young man who had been flirting with a lady he desires. |
| C06.02 | A Lickpenny Lover | Someone, a lady in her late twenties, diplomatically turns down a man's romantic overtures while subtly arranging a clandestine meeting with him. |
| C06.03 | A Lickpenny Lover | Someone, a young man, eagerly awaits a date with a street-corner shopgirl, while his mother chauffeurs him to a fancy restaurant. |
| C06.04 | Dougherty'S Eye-Opener | The Honorable someone, seeking to impress someone, attempts to seduce her, leading to a confrontation and a decision to take her to a pub instead. |
| C06.05 | While The Auto Waits | Parkenstacker opened the meeting with flattery, but the girl responded with icy disdain, challenging his assumptions and curiosity. |
| C06.06 | While The Auto Waits | The young man, someone, seeks to understand the upper class while the girl, offended by his ignorance, tries to educate him. |
| C06.07 | While The Auto Waits | The young man seeks advice on choosing between two wealthy suitors, while the girl, of a higher social class, considers his appeal despite her own preferences. |
| C06.08 | Roses, Ruses And Romance | Someone, a poet, challenges his neighbor's romantic display, leading to a clandestine encounter where he spies on her through his window. |
| C06.09 | Roses, Ruses And Romance | Someone, the poet, schemes to meet the mysterious woman who he believes has returned to him, while someone, the businessman, arrives early for his date, frustrating someone’s plans. |
| C06.10 | The Fool-Killer | Someone, the someone, confronts someone, who he believes is a fool for waiting to marry, and tries to persuade him not to kill someone. |
| C06.11 | The Rathskeller And The Rose | Someone flatters and flirts with the actress, securing a role while her companions and rival, Summers, are left in the dark. |
| C06.12 | A Philistine In Bohemia | Someone persistently courted someone, while she temporized, unaware a date was imminent. |
| C06.13 | The Memento | Someone interrogates someone about his previous love affair, pressing for details and motives in a tense power dynamic. |
| C06.14 | Strictly Business | Someone, recovering from an accident, confronts someone the Tramp Juggler about his secretary Cherry's apparent infatuation, while someone insists she is deeply in love with him. |
| C06.15 | The Fifth Wheel | Someone, a former chauffeur, confronts an enigmatic automobilist demanding answers about his past and a prize, leading to a humiliating encounter. |
| C06.16 | The Unknown Quantity | Someone, torn between her past suitors and the mysterious stranger, struggles to decide whom to forgive and love. |
| C06.17 | A Ramble In Aphasia | A woman accuses someone of not recognizing her, leading to a tense yet intimate dinner where she reveals she remembers him from a past relationship. |
| C06.18 | A Night In New Arabia | Someone, a plain-looking but lovable girl, falls for the grocer's young man, unaware he is preoccupied with his horse, while he courts a more desirable young lady elsewhere. |
| C06.19 | A Night In New Arabia | Someone, a young man engaged to a parlor maid, seeks to impress a wealthy man by visiting his house, offering investment advice, and introducing himself to the man's daughter. |
| C06.20 | Past One At Rooney’S | Cork someone, bored in someone’s, strikes up a conversation with a mysterious girl who decides his fate with a glance. |
| C06.21 | Past One At Rooney’S | A clerk desires a woman, but her guarded responses and insincere explanations threaten to extinguish his burgeoning infatuation. |
| C06.22 | Past One At Rooney’S | Someone courts the anxious girl, while tensions rise as someone prepares to confront them. |
| C06.23 | The Venturers | Someone, exonerated by someone’s confession, reflects on his past queerness while someone accuses him of foolishly not taking what he wanted. |
| C06.24 | Memoirs Of A Yellow Dog | Benedick, frustrated with his unrequited love, insults someone, a woman he dislikes, while someone mocks his love-loving nature. |
| C06.25 | Mammon And The Archer | Someone, desperate for a date, pleads with his father for help in securing a romantic encounter with a woman, revealing his financial desperation and social constraints. |
| C06.26 | An Unfinished Story | Someone, unsure of her next move, hesitates as her landlady informs her of a gentleman caller, while secretly admiring her appearance in a mirror and contemplating her social status. |
| C06.27 | The Caliph, Cupid And The Clock | The Prince attempts to persuade the young man to abandon his job as a clockmaker, a private affair, but the young man resists, eyeing a nearby house. |
| C06.28 | The Caliph, Cupid And The Clock | The young man impatiently defies Prince someone, who insists he remain, revealing a past affair with a woman he wronged, seeking forgiveness and understanding. |
| C06.29 | The Caliph, Cupid And The Clock | The young man demands time to consider the woman's ultimatum, while she watches the clock for a signal of forgiveness or rejection. |
| C06.30 | Lost On Dress Parade | Towers someone, a man seeking a meal and a conversation, pressures a young woman into accompanying him, citing her injured ankle as a pretext, while secretly planning a romantic dinner. |
| C06.31 | By Courier | The young man implores the lady to reconsider his actions, while a streetwise boy delivers a direct challenge to the young man's message. |
| C06.32 | By Courier | The young lady demands a song and dance from the boy, warning him of consequences if he does not comply, while secretly intrigued by his unconventional message. |
| C06.33 | By Courier | The young man confronts the lady, demanding she read a letter explaining his situation, while she accuses him of trying to manipulate her with false stories. |
| C06.34 | Brickdust Row | The girl, seeking a meeting, confronts someone over his refusal to entertain her at his home, revealing her desperation and naivety. |
| C06.35 | The Ferry Of Unfulfilment | The gentleman from someone, seeking companionship, underestimated someone’s preference for financial security over his romantic advances. |
### C07 — 26 scenes from 18 stories
Passed the gate: cohesion S1 0.609 (needs 0.604), Z1 7.3 (needs 5); largest story share 12%.
Most similar candidate: C06 (cosine 0.90 — a hint only).
| Scene | Story | Summary |
| --- | --- | --- |
| C07.01 | The Complete Life Of John Hopkins | Someone, seeking groceries, confronts someone over payment, escalating into a physical altercation in the store. |
| C07.02 | One Thousand Dollars | Someone attempts to bribe someone with a thousand-dollar note, but she refuses, leading to a tense interaction between them. |
| C07.03 | The Easter Of The Soul | Someone seeks a song book for a friend in a shop, sparking a confrontation with a red-haired young woman. |
| C07.04 | The Fifth Wheel | The Preacher preaches to a crowd of miners, some of whom tipple, while someone, a former drunk, seeks shelter. |
| C07.05 | The Fifth Wheel | Someone, a young man, confronts the Preacher over unpaid debts while his lover someone arrives, revealing she saw someone at a fortune teller's. |
| C07.06 | The Poet And The Peasant | The bartender accuses someone of being part of someone’s come-on squad, while someone tries to secure change for his valise containing rural clothes. |
| C07.07 | The Call Of The Tame | Someone, a rancher, confronts former friend someone, a businessman, over someone’s new urban manners and social status, leading to a bar encounter. |
| C07.08 | The Call Of The Tame | Someone, desperate for funds, pressures someone into loaning him money and drinking with him, while someone tries to maintain control over the dinner expenses. |
| C07.09 | The Call Of The Tame | Someone, seated at a restaurant table, manipulates someone into buying drinks while trying to sell his ranch. |
| C07.10 | A Municipal Report | Major someone confronts the narrator in a bar, forcing him to confront a torn, counterfeit dollar bill, intensifying their hostile encounter. |
| C07.11 | Past One At Rooney’S | Ruby someone, a defiant young woman, challenges Cork about smoking in his bar, insisting it is acceptable despite his disapproval. |
| C07.12 | The Duel | Someone, a hat-cleaning shop worker, prefers reading someone’s sea yarns over buying expensive items, while old Tom, a soap manufacturer, tries to sell him cheap books, leading to a confrontation. |
| C07.13 | Between Rounds | Someone and someone engage in a culinary duel, interrupted by a loud scream from their home, causing them to pause briefly in a standoff, while Policeman someone overhears and decides not to intervene. |
| C07.14 | The Cop And The Anthem | Someone smashed a shop window, prompting a chase and confrontation with a policeman, who instead sought out the culprit, leading to someone’s patronizing visit to a cheap restaurant. |
| C07.15 | The Cop And The Anthem | A cigar store owner confronts someone over a stolen umbrella, escalating into a confrontation with a passing policeman. |
| C07.16 | Springtime À La Carte | Someone, a free-lance typewriter, weeps over her restaurant bill as she contemplates the absurdity of ordering an oyster with a sword. |
| C07.17 | The Trimmed Lamp | Someone, a shop-girl, argues with someone about her wages, while someone waits for them on the corner. |
| C07.18 | The Rubaiyat Of A Scotch Highball | Someone, now sober, confronts the saloon culture with newfound hostility, while his drinking companions continue their revelry. |
| C07.19 | The Rubaiyat Of A Scotch Highball | Someone challenged someone’s generosity, leading to a tense standoff and a moment of intimacy as someone revealed his true intentions. |
| C07.20 | The Lost Blend | Someone pressures Con and someone to drink more alcohol to continue their failed experiment, leading to a fight in the bar. |
| C07.21 | A Harlem Tragedy | The argument between someone and the red-haired, unshaven man over someone’s street playtime escalates into a competitive betting scenario at a saloon. |
| C07.22 | The Tale Of A Tainted Tenner | Old someone, a reluctant churchgoer, pays for drinks with money offered to a church, which someone, the proprietor, refuses, leading to a confrontation with a beggar woman. |
| C07.23 | The Tale Of A Tainted Tenner | Old someone hands a tainted bill to a woman, who then runs to a bakery and spends it on extravagant treats. |
| C07.24 | The Tale Of A Tainted Tenner | The one-spot accuses her boss of exploiting her in a slum room, while the boss mocks her religious note as worthless. |
| C07.25 | Elsie In New York | The lady accuses someone’s wealthy aunt of aiding the devil by selling brandy balls, inciting someone to seek other work to avoid assisting in their production. |
| C07.26 | Elsie In New York | Someone seeks work in New someone, encountering a stern preacher who warns of the dangers of the theatre, leading her to seek employment in a factory for artificial flowers. |
### C08 — 41 scenes from 29 stories
Passed the gate: cohesion S1 0.609 (needs 0.604), Z1 8.6 (needs 5); largest story share 10%.
Most similar candidate: C06 (cosine 0.92 — a hint only).
| Scene | Story | Summary |
| --- | --- | --- |
| C08.01 | A Lickpenny Lover | Someone, millionaire, felt both flattered and awkward as he encountered someone, a shopgirl, in a glove shop, realizing he had no social means to propose to her. |
| C08.02 | A Lickpenny Lover | Someone, a suitor, pressures someone into marriage, emphasizing his social superiority and wealth, while someone questions his sincerity and social status. |
| C08.03 | Dougherty'S Eye-Opener | Big someone, unsure of his new wife's identity, decided to flaunt her at his usual haunts to impress his social circle. |
| C08.04 | A Comedy In Rubber | Someone and Violet's wedding approached, drawing a boisterous congregation of someone to the Big Church. |
| C08.05 | A Comedy In Rubber | Someone and Violet, creatures of habit, joined the mob to watch their wedding, but returned as a crushed, hysterical woman and two policemen. |
| C08.06 | The Defeat Of The City | Tom accepted an invitation to a wrestling match with a lawyer, leading to a chaotic evening of physical contests and drunken revelry. |
| C08.07 | Roses, Ruses And Romance | Someone proposes to someone’s daughter someone, revealing he receives romantic favors in exchange for information about her whereabouts. |
| C08.08 | The Fool-Killer | Someone pressures his wife into an impulsive marriage proposal, while I, skeptical, suggests seeking advice from someone. |
| C08.09 | Extradited From Bohemia | Someone, now estranged from Sir, plans to reinvent herself in the world of someone, vowing to surpass former lovers and historical figures. |
| C08.10 | A Philistine In Bohemia | Someone, a someone head-waiter, proposes to someone, a New someone, after impressing her with his culinary skills. |
| C08.11 | From Each According To His Ability | Someone manipulates someone for information, then flirts with and proposes marriage to someone, who accepts, complicating someone’s suspicions. |
| C08.12 | Strictly Business | Old someone had hidden funds, while someone took only his salary; the New someone girl was engaged, and someone and someone ended in a half-Nelson. |
| C08.13 | Strictly Business | Someone desperately tries to convince the Tramp Juggler that his wife Cherry is not secretly in love with him, insisting it's too late and they have been married for two years. |
| C08.14 | The Girl And The Graft | Someone and someone return home after eloping, leaving someone a ticket and pants as wedding gifts. |
| C08.15 | The Unknown Quantity | Someone, desperate to win someone back, seduced her at her wedding before leaving with her soon-to-be-husband Frank. |
| C08.16 | The Unknown Quantity | Someone, the lawyer, left her office to pursue a relationship with someone, the violinist, who moved in above her, bringing much-needed life to her quiet house. |
| C08.17 | A Night In New Arabia | Someone searched for his daughter someone, who had eloped with a wealthy suitor, while his wife someone feigned ignorance. |
| C08.18 | The Girl And The Habit | Someone resigned her cashiership to someone, who eagerly accepted and promised to lavish her fortune on the adoptive couple. |
| C08.19 | The Venturers | Someone invites someone to dine with him, setting a someone evening at seven for a potential romantic engagement. |
| C08.20 | The Venturers | Someone gazed at the unchanged room, recalling his past with Lady, while someone announced her upcoming marriage. |
| C08.21 | The Skylight Room | Someone’s failed job applications and heartbreak led her to someone, who proposed marriage, prompting her to seek solace in the unlikely embrace of someone in the skylight room. |
| C08.22 | The Coming-Out Of Maggie | Someone and someone’s friendship shifted as someone accepted a date with a new suitor, leaving someone feeling sidelined and envious. |
| C08.23 | An Adjustment Of Nature | Someone proposes to the first white apron he sees, while someone and someone scheme to buy a someone cottage with their ill-gotten gains. |
| C08.24 | The Love-Philtre Of Ikey Schoenstein | Someone, uncertain about his fiancé's wedding plans, pressures someone to find a drug to ensure Rosy's attendance, while secretly preparing for their elopement. |
| C08.25 | Mammon And The Archer | Someone demanded someone show her the engagement ring, while Aunt someone revealed someone and someone were engaged, infuriating someone. |
| C08.26 | From The Cabby’S Seat | The someone family throws a noisy wedding party, drawing curious neighbors and someone’s cab to the sidewalk outside someone. |
| C08.27 | An Unfinished Story | General someone, someone’s ideal knight, looked away as she offered him jam, reminding her of his absence in someone. |
| C08.28 | Sisters Of The Golden Circle | Someone, newlyweds, attempts to impress his bride-to-be someone with his good looks and worldly wisdom. |
| C08.29 | Sisters Of The Golden Circle | A young man and a girl wait impatiently for a fairy to grant them a moment from their wedding day, while a megaphone man preaches about millionaires. |
| C08.30 | Sisters Of The Golden Circle | She lied to her brother about her sister's secret wedding to save her husband, whom she saw leaving their garden. |
| C08.31 | The Romance Of A Busy Broker | Someone proposed to someone, who initially laughed but then accepted, revealing they had secretly married the night before. |
| C08.32 | The Trimmed Lamp | Someone, a shop forelady, rejects a marriage proposal from a wealthy suitor, sparking jealousy from a coworker who had previously invited him to dine. |
| C08.33 | The Trimmed Lamp | Someone, the chaperone, balanced someone and someone’s differing priorities as they sought excitement, with someone advocating for marriage and financial independence, while someone preferred her position and learning opportunities. |
| C08.34 | The Trimmed Lamp | Someone berates someone for still working at the store, unaware that she has won a significant prize and is about to marry someone. |
| C08.35 | The Rubaiyat Of A Scotch Highball | Someone and someone covet someone, engaging in secret readings that transform the verses into a sacred text, unaware of its illicit origins until their marriage and move to New someone exposes them to its forbidden nature. |
| C08.36 | The Buyer From Cactus City | Someone, a suitor, attempts to assert dominance over someone, a wealthy woman, by proposing marriage and a lavish home, which she rebuffs with sharp wit and disdain. |
| C08.37 | The Lost Blend | Con returns to the back room after drinking a mysterious golden liquid, finding someone upstairs and preparing to propose marriage. |
| C08.38 | The Count And The Wedding Guest | Someone, the wealthy suitor, pressures and manipulates someone into marriage, while withholding gifts and control, leaving her in a financially dependent and emotionally vulnerable position. |
| C08.39 | The Count And The Wedding Guest | Someone’s engagement to someone put someone in a position of curiosity and suspicion, as he remained distant and secretive despite their intimate park bench meetings. |
| C08.40 | The Count And The Wedding Guest | Someone declines Big someone’s wedding invitation, citing a reason related to politics, despite someone’s encouragement. |
| C08.41 | The Count And The Wedding Guest | Someone, fearing her impending marriage to someone, confesses her deception involving a fake engagement to a deceased Count, while someone remains skeptical and forgiving. |
### C09 — 25 scenes from 18 stories
Passed the gate: cohesion S1 0.609 (needs 0.604), Z1 7.1 (needs 5); largest story share 12%.
Most similar candidate: C06 (cosine 0.90 — a hint only).
| Scene | Story | Summary |
| --- | --- | --- |
| C09.01 | The Voice Of The City | The poet seeks advice from someone about his failed ties and unfulfilled prophecy, while a newsboy offers practical advice about buying a birthday present for someone. |
| C09.02 | The Easter Of The Soul | Someone, a someone, accuses someone of neglecting his civic duties, while someone dismisses spring as lacking, sparking a disagreement. |
| C09.03 | The Fool-Killer | Someone and the someone argue under the moonlight, with the someone threatening someone, who senses he is the only one aware of the danger. |
| C09.04 | The Fool-Killer | Someone, a mysterious figure, confronts an old man, accusing him of being a fool and threatening to kill someone, while the old man questions someone’s identity. |
| C09.05 | The Fifth Wheel | The professor and the elderly woman argue over the validity of a someone, with the latter skeptical and the former convinced. |
| C09.06 | The Fifth Wheel | Professor someone and the lady debate the meaning of an ancient prophecy while someone, a former coachman, is approached by an enchanter about returning to his old home. |
| C09.07 | The Call Of The Tame | Someone, a man from the North, confronts a man from the West, challenging his identity and social status. |
| C09.08 | The Unknown Quantity | A mathematician and a businessman debate the nature of reality, with the former questioning the latter's assumptions. |
| C09.09 | Psyche And The Pskyscraper | The philosopher tries to explain celestial phenomena to someone, who becomes angry and insists on leaving, leading to a confrontation. |
| C09.10 | Proof Of The Pudding | Someone demands an evaluation of someone’s story, while someone criticizes someone’s writing style, leading to a heated argument. |
| C09.11 | Proof Of The Pudding | Someone and Editor someone debate how a woman would truly react in real life versus on stage, contrasting passionate speeches with mundane, muddled speech. |
| C09.12 | Proof Of The Pudding | Editor someone debated the authenticity of characters' dialogue with author someone, each holding onto their interpretation of realistic versus exaggerated reactions. |
| C09.13 | The Venturers | Someone and someone discuss the decline of adventure and excitement, comparing modern life to the more adventurous times of the someone era, while someone reflects on his failed attempts at hunting and flying. |
| C09.14 | The Venturers | Someone debates marriage prospects with someone, both uncertain about their future despite clear feelings. |
| C09.15 | Tobin’S Palm | Someone, a man of literature, argues with a long man over their differing interpretations of fate and physical appearance, leading to a disagreement and eventual parting. |
| C09.16 | A Cosmopolite In A Café | The dark-haired young man, likely a someone, challenges the someone social order by loudly interrupting the narrator's attempt to gather information about his origins. |
| C09.17 | A Cosmopolite In A Café | Someone challenged the other man's belief in regional uniformity, while the other man dismissed regional labels in favor of individuality. |
| C09.18 | Between Rounds | Someone and someone debate the loss of their lost son someone, comparing him to their deceased child someone, while below a maid searches for a missing six-year-old boy. |
| C09.19 | Mammon And The Archer | Someone, a wealthy young man, debates the merits of spending money with his friends, acknowledging its power but also its limitations in social circles. |
| C09.20 | An Unfinished Story | Someone condemns someone to the bar of judgment, while someone seeks to understand the nature of his accusers and his own fate. |
| C09.21 | By Courier | The young man demands explanation of the narrator's actions, while the narrator refuses, citing her own observations and ideals. |
| C09.22 | Two Thanksgiving Day Gentlemen | The surgeon and driver argue over the critically ill patient's condition while the Old Gentleman's family insists he's merely fasting for health reasons. |
| C09.23 | The Last Leaf | The doctor and someone argue over someone’s chances of survival, with the doctor holding power and someone pushing for any possible intervention. |
| C09.24 | The Last Leaf | Someone, someone, and someone’s sick child argue over someone’s continued presence, with someone insisting on staying to finish her drawings, while someone demands someone leave to see the last ivy leaf fall outside. |
| C09.25 | The Tale Of A Tainted Tenner | The grocer’s clerk argues with a customer over a small change, highlighting the power dynamics in a mundane transaction. |
### C10 — 29 scenes from 17 stories
Passed the gate: cohesion S1 0.608 (needs 0.604), Z1 7.4 (needs 5); largest story share 21%.
Most similar candidate: C12 (cosine 0.91 — a hint only).
| Scene | Story | Summary |
| --- | --- | --- |
| C10.01 | A Lickpenny Lover | Someone, a wealthy visitor, hesitates as floorwalker someone confronts him with a shopgirl smile, unaware of the flirtatious nature of his profession. |
| C10.02 | A Lickpenny Lover | Someone persistently courted someone, a shopgirl, offering her a life of leisure in exotic locations to break her from her mundane existence. |
| C10.03 | A Comedy In Rubber | Someone Pry, desperate for attention, coerces Violet someone into a bootblack stand with a promise of a private moment. |
| C10.04 | A Comedy In Rubber | Someone and Violet argued over whether meeting was a mistake as they waited for the bootblack to finish their boots. |
| C10.05 | One Thousand Dollars | Someone, preparing for a matinée, consults her dresser about a potential evening engagement while someone, intrigued by her wealth, asks for advice on how to spend a thousand dollars. |
| C10.06 | Transients In Arcadia | She confesses to someone her lie about wanting a vacation, revealing she actually works at a hosiery counter and is saving for this week off. |
| C10.07 | From Each According To His Ability | Someone presents himself as a crook to someone, a loafer, to seek someone’s help in dressing up for a club meeting. |
| C10.08 | From Each According To His Ability | Someone critiques someone’s outdated clothing, prompting a competitive game of high-stakes clothing swaps between them. |
| C10.09 | From Each According To His Ability | Someone, seeking to launder his stolen money, coerces someone into a tailor appointment, while someone tries to lure someone into a club dinner. |
| C10.10 | From Each According To His Ability | Someone, a successful "crook," meets someone at a café to secure a favor from someone, a legendary cow-puncher, before leaving for the West. |
| C10.11 | The Day Resurgent | Someone, flaunting new clothes, pressures someone to join her for church, hinting at a secret plan, while he dodges her questions about an upcoming event. |
| C10.12 | A Night In New Arabia | Someone, disguised as a maid, wheedles someone into lending her clothing to con someone’s wealthy suitor, someone. |
| C10.13 | A Service Of Love | Someone complains about someone’s lack of practice and monotonous white dress, while someone flaunts his gambling winnings to someone. |
| C10.14 | A Service Of Love | Someone tries to uncover someone’s deception about her true occupation as a laundry ironer, leading to a confession and a shared laugh. |
| C10.15 | The Coming-Out Of Maggie | Someone, a factory worker, eagerly awaits her someone night dance with someone, a fellow worker and close friend, despite someone’s awkwardness, to impress her boyfriend someone. |
| C10.16 | The Coming-Out Of Maggie | Someone, deceived into thinking someone is a fellow member, blackmails someone for sexual favors in exchange for protecting him from his true identity as a gangster. |
| C10.17 | The Cop And The Anthem | Someone, confident and well-groomed, seeks success at a high-end restaurant but is turned away due to his shabby attire, forcing him to reconsider his path to success. |
| C10.18 | Mammon And The Archer | Someone, seeking to win back his aunt's favor, bargains with money and Aunt someone’s affectionate ring, while secretly courting someone. |
| C10.19 | An Unfinished Story | Someone, a department store clerk, eagerly plans a dinner date with someone, hoping to impress her friend someone, despite having only fifty cents left from her meager weekly wage. |
| C10.20 | Lost On Dress Parade | Someone ironed his evening suit while his modest earnings funded his nights out in finer attire. |
| C10.21 | The Brief Début Of Tildy | A young laundry worker named someone, drunk and bold, seduced someone, making her suddenly desirable to other men. |
| C10.22 | The Trimmed Lamp | Someone and someone compete for a position and salary in a laundry, with someone emphasizing her social connections and status, while someone focuses on her personal achievements and the value of her work. |
| C10.23 | The Trimmed Lamp | Someone, seeking employment, challenges someone, a serious young electrician, to a vaudeville night for a chance to impress his wealthy friend someone. |
| C10.24 | The Trimmed Lamp | Shop-girls convene to strategize against men, viewing their gatherings as a form of warfare against the household's patriarch. |
| C10.25 | The Trimmed Lamp | Someone, a hunter, persistently pursues game while someone, a laundry worker, saves money for evening pleasures, someone her loyal companion. |
| C10.26 | The Trimmed Lamp | Someone, a working girl, debates buying expensive designer clothes with someone, a coworker who dismisses the idea, revealing their differing social statuses and attitudes. |
| C10.27 | The Trimmed Lamp | Someone, seeking advancement, navigates the social hierarchy of a fashionable salon while secretly preparing for a potential shift in values. |
| C10.28 | The Social Triangle | Someone, a tailor’s apprentice, eagerly seeks out someone at the someone after winning elections in his district. |
| C10.29 | Elsie In New York | Someone assigns someone to try on coats and hats, while behind the scenes, he arranges a dinner reservation for himself. |
### C11 — 31 scenes from 21 stories
Passed the gate: cohesion S1 0.606 (needs 0.604), Z1 7.8 (needs 5); largest story share 10%.
Most similar candidate: C06 (cosine 0.92 — a hint only).
| Scene | Story | Summary |
| --- | --- | --- |
| C11.01 | A Lickpenny Lover | Someone, cool in his authority, insists they leave while someone’s uncertain nature holds sway, hinting at her potential marriage proposal to someone’s friend. |
| C11.02 | Dougherty'S Eye-Opener | Big someone" someone reluctantly agreed to go out for dinner after his wife insisted, challenging his usual reluctance to leave the house. |
| C11.03 | The Harbinger | Someone calculated someone’s distance, eyeing her as a potential victim for his planned blackmail. |
| C11.04 | The Harbinger | Someone attempts to placate his wife, someone, while a mysterious figure in the back room threatens their marriage. |
| C11.05 | The Shocks Of Doom | Someone placates someone, a panhandling streetwalker, by taking him to lunch at a hotel, while secretly observing and possibly exploiting him. |
| C11.06 | The Fool-Killer | Someone, the someone, confronts someone, offering him a last chance to escape his impending doom, while ignoring the narrator's presence. |
| C11.07 | The Fool-Killer | Someone seeks to confront an invisible maniac, while I caution him and arrange for his return home with the someone. |
| C11.08 | The Fifth Wheel | Someone, desperate to locate her brother someone, pressures him to return home, while someone, his brother, tries to negotiate a way for someone to come home without arousing suspicion. |
| C11.09 | The Robe Of Peace | Someone, seeking to avoid suspicion, meticulously planned his disappearance, altering his wardrobe to confuse potential suspects. |
| C11.10 | The Unknown Quantity | Someone repels someone with disdain, compelling him to flee in embarrassment and shame. |
| C11.11 | The Unknown Quantity | Lodger No. 2, a charming but mysterious man, seduces someone with tales and innuendo, leading her to believe her husband has returned, despite his long absence. |
| C11.12 | A Ramble In Aphasia | The doctor feigns amnesia to protect his wife from a dangerous impostor, while the impostor tries to exploit their situation. |
| C11.13 | A Municipal Report | Someone manipulates her housekeeper someone to obtain tea and sugar, while hiding a conflict with a man in the house. |
| C11.14 | Proof Of The Pudding | Someone proposes a scheme to leave someone, pretending to flee with an understanding lover, while someone reluctantly agrees to hide in the dining room to observe her reaction. |
| C11.15 | Past One At Rooney’S | Brick someone warns someone about safety at their usual meeting spot, revealing someone’s absence and the need for caution. |
| C11.16 | Past One At Rooney’S | Cork attempts to persuade a reluctant Ruby to accompany him to her apartment, using flattery and vague references to his social status to gain her trust. |
| C11.17 | Past One At Rooney’S | Someone fears a police raid will end his career, while someone orchestrates an escape plan, engaging in tense negotiations with the police and guiding his guests through a secret ladder to safety. |
| C11.18 | The Venturers | Someone and someone engage in a card game over dinner, with someone winning and planning to use a pretext to escape. |
| C11.19 | The Venturers | Someone proposes postponing dinner indefinitely, revealing he is leaving for a world voyage to escape uncertainty, while someone expresses skepticism and hints at his own secret marriage. |
| C11.20 | The Love-Philtre Of Ikey Schoenstein | Someone schemes to bribe Rosy with a rumored love potion to prevent her from leaving Old Man Riddle. |
| C11.21 | The Love-Philtre Of Ikey Schoenstein | Someone plots to elope with Rosy, bribing someone to poison her, while someone informs someone Riddle, who will ambush them. |
| C11.22 | The Love-Philtre Of Ikey Schoenstein | Someone waits for news of Rosy's escape while someone informs him she made it, causing someone to question the efficacy of the powder. |
| C11.23 | The Green Door | A beautiful woman forces a hot roll on a man, then flees, leaving him embarrassed and buttonless, contrasting with the expectations of true adventurers. |
| C11.24 | The Green Door | Someone, seeking comfort, lies to the girl, claiming he mistook her door for a piano tuner's, to keep her company despite his intention to leave. |
| C11.25 | Lost On Dress Parade | Someone, the socialite, feigned a casual dinner with someone, while secretly planning to meet her lover at a discreet location. |
| C11.26 | A Madison Square Arabian Night | Someone invites an anonymous guest to dinner, revealing he has a secret, prompting the guest to share his own dramatic life story. |
| C11.27 | The Rubaiyat Of A Scotch Highball | Someone silently returned to the table, casting suspicious glances at someone, who had cut out drinking, while he tried to maintain the evening's conversation. |
| C11.28 | The Rubaiyat Of A Scotch Highball | Someone threatens to strangle someone with a bottle, revealing she misunderstood his poetry, while someone overhears and speculates about their relationship. |
| C11.29 | The Buyer From Cactus City | Someone, unsure of someone’s identity, invites her to dinner, leading to a clandestine evening of drinks and questions about her true nature. |
| C11.30 | A Harlem Tragedy | Someone schemes to expose her husband's infidelity while someone hides the truth, causing a domestic conflict upstairs. |
| C11.31 | The Country Of Elusion | Minnie Brown, seeking validation for her trip, pressures the narrator into reading her a story to prevent her from returning home. |
### C12 — 27 scenes from 18 stories
Passed the gate: cohesion S1 0.605 (needs 0.604), Z1 6.7 (needs 5); largest story share 18%.
Most similar candidate: B03 (cosine 0.92 — a hint only).
| Scene | Story | Summary |
| --- | --- | --- |
| C12.01 | A Lickpenny Lover | Someone, a 19-year-old saleslady in men's gloves, learns much about customers and human nature in the Biggest Store, while keeping her own secrets. |
| C12.02 | The Fool-Killer | Someone, charming and at ease in a café, withheld crucial information from her companions, raising suspicions about her true intentions. |
| C12.03 | Transients In Arcadia | Someone, a high-status guest, monopolizes the hotel's services, making employees her slaves and guests her subjects. |
| C12.04 | Transients In Arcadia | Someone, a customer at the someone hotel, negotiates payment for a dress with someone, a hotel employee, while discussing a weekend trip to someone Island. |
| C12.05 | A Philistine In Bohemia | Someone, now coatless, served someone personally, while someone brought her courses, igniting her suspicions and admiration. |
| C12.06 | The Gold That Glittered | At someone, the someone chef serves a fish dish enhanced by someone methods, while the Society for someone detects an ethereal aura around the establishment, captivating diners with its unique flavors and mysterious aftertastes. |
| C12.07 | A Night In New Arabia | Someone, the grocer’s assistant, admires him while someone, the housemaid, resents his indifference to her advances. |
| C12.08 | The Girl And The Habit | Critics reject direct inspiration, forcing authors to rely on the unabridged dictionary for moral themes, while someone’s restaurant thrives with diverse clientele. |
| C12.09 | The Girl And The Habit | Someone, the cash register girl, held sway over patrons with her charm and wit, commanding respect and affection in equal measure. |
| C12.10 | The Girl And The Habit | Customers vie for service at a variety of establishments, each seeking to assert authority or avoid awkwardness. |
| C12.11 | A Cosmopolite In A Café | A lone diner at a secluded table entertains thoughts of cosmopolites amidst a lively café scene, patrons and staff mingling in a mix of elegance and casualness. |
| C12.12 | An Adjustment Of Nature | Someone, the charismatic waitress at someone’s, held sway over the chaotic dining room, revered by patrons as a living legend. |
| C12.13 | An Adjustment Of Nature | The Goddess of Grub, revered by someone, held ultimate power over her customers, yet her presence was suffused with a maternal warmth that made her seem almost human. |
| C12.14 | Memoirs Of A Yellow Dog | A pampered dog resents his overindulged human mistress and resentful servant. |
| C12.15 | Springtime À La Carte | Someone leveraged her deal with someone’s restaurant to secure a typewritten menu for her room, securing both meals and a daily forecast of her patrons' meals. |
| C12.16 | From The Cabby’S Seat | Princes and queens, envying someone’s simple meal, watched as she boarded a cab, only to be met with a demand for payment. |
| C12.17 | Lost On Dress Parade | Someone, seeking to impress the demurely grateful girl, suggests they dine together, recognizing her as a lady despite her plain attire. |
| C12.18 | The Brief Début Of Tildy | Someone, the elegant waitress, serves meals to the bourgeois families on Eighth Avenue, while someone, the gruff owner, handles their payments. |
| C12.19 | The Brief Début Of Tildy | Someone, the other waitress, piqued someone’s jealousy by her superior service and attractiveness at someone’s restaurant. |
| C12.20 | The Brief Début Of Tildy | Rivalry among regulars for someone’s attention threatened to overshadow her, as she received multiple invitations and gifts, while someone, her friend, remained unremarked upon. |
| C12.21 | The Brief Début Of Tildy | Men at someone’s tables flatter someone, while someone, loyal to her, accepts their attentions without reciprocating. |
| C12.22 | The Brief Début Of Tildy | Someone, seeking to boost her wages, exaggerated a minor flirtation with a customer, leading to increased attention from male customers at her restaurant job. |
| C12.23 | The Trimmed Lamp | The squire, someone, and someone, the department store employee, observe and mimic the refined behaviors of their social superiors, seeking to embody the high social refinement that surrounds them. |
| C12.24 | The Trimmed Lamp | Someone, aspiring shop assistant, uses her position to cultivate social connections and discerns wealthy patrons, while her female coworkers monitor her progress and social standing. |
| C12.25 | A Harlem Tragedy | Someone, the café owner's daughter, orders drinks and demands information about her fiancé's infidelity, showing her power and control over the waiter. |
| C12.26 | A Midsummer Knight’S Dream | A summer hotel's diverse crowd, from young artists and naval officers to fashionable young ladies and a famous milliner, eagerly sought someone’s attention, each hoping to secure her favor or arrange her departure. |
| C12.27 | The Country Of Elusion | Someone and someone sit at someone’s table with someone and someone, while someone and someone observe, with someone’s reputation as a someone princess at stake. |
## Near misses — optional
These failed the gate narrowly. Leave them as `"skip"` unless one clearly shows a situation.
### B01 — 17 scenes from 12 stories
Missed the gate: cohesion S1 0.603, needs 0.604.
Most similar candidate: B03 (cosine 0.92 — a hint only).
| Scene | Story | Summary |
| --- | --- | --- |
| B01.01 | Transients In Arcadia | Guests at the hidden someone hotel seek seclusion, while a chef prepares gourmet meals, fearful of discovery by summer resort seekers. |
| B01.02 | The Girl And The Graft | Someone, a conscientious grafter, seeks rest in New someone, his hall bedroom on Eighteenth Street the center of his activities, while a chambermaid watches in awe. |
| B01.03 | A Ramble In Aphasia | Someone checked into a New someone hotel, feeling invigorated and eager to start a new life as a someone delegate to the someone Convention. |
| B01.04 | A Ramble In Aphasia | A pompous hotel clerk mistakes the narrator's identity, leading to confrontations and a change in lodgings. |
| B01.05 | A Municipal Report | A weary traveler haggles with a cab driver over fare, then seeks solace in a ritzy yet overpriced hotel, only to be disappointed by its slow service and overpriced food. |
| B01.06 | A Municipal Report | Major someone, newly arrived, confronted General someone’s forces in a fierce battle while someone admired newly installed, untouched brass urinals in the lobby. |
| B01.07 | A Municipal Report | Major someone prowled the hotel lobby like a rabid dog, his smooth-shaven face aglow with a predatory hunger, while the narrator, a someone, watched warily from a safe distance. |
| B01.08 | A Bird Of Bagdad | Someone, the modest restaurateur, seeks adventure at night under the pseudonym of the someone, while his restaurant remains a quiet establishment during the day. |
| B01.09 | Past One At Rooney’S | Frank pulled down green shades, someone stood guard, and Cork and the bookbindery girl feigned casual conversation as the night's illicit activities escalated. |
| B01.10 | The Venturers | Someone proposes a lavish dinner at a hotel, betting on who can withstand the establishment's displeasure, while someone eagerly accepts the challenge. |
| B01.11 | The Venturers | Someone demands payment from someone, who reveals he owns the hotel and offers to make his rooms ready, complicating the dinner party arrangement. |
| B01.12 | Tobin’S Palm | Someone prowls the deck, suspicious of passengers, while someone observes, hinting at a potential encounter with a mysterious crooked-nosed man. |
| B01.13 | The Furnished Room | The guest lies motionless, as the chaotic room attempts to communicate its occupants to him. |
| B01.14 | A Madison Square Arabian Night | Someone, a servant, nervously awaits someone choice of a dubious guest for dinner. |
| B01.15 | A Madison Square Arabian Night | Someone, the host, attempts to placate the aggressive someone, the guest, while someone, the dinner host, tries to initiate a seating arrangement. |
| B01.16 | The Pendulum | Someone awaited someone at the door with a kiss, while he read the evening paper of foreign atrocities, and planned their lavish dinner and evening activities. |
| B01.17 | The Country Of Elusion | Someone waits as someone manipulates his guests, including a mysterious eye and a radiant someone, in his opulent yet cluttered apartment. |
### B02 — 15 scenes from 11 stories
Missed the gate: cohesion S1 0.603, needs 0.604.
Most similar candidate: B06 (cosine 0.87 — a hint only).
| Scene | Story | Summary |
| --- | --- | --- |
| B02.01 | The Girl And The Habit | Young men at someone’s diner exchanged witty banter for cash, with older men offering more personal favors to curry favor. |
| B02.02 | The Girl And The Habit | A wealthy eccentric banker struck down by fortune in someone’s restaurant is tended by a beautiful cashier who wins over his elderly, childless wife. |
| B02.03 | An Adjustment Of Nature | The someone, hungry and boastful, demands food from the campers, who are initially wary but eventually welcome him, revealing someone’s wealth and beauty. |
| B02.04 | Memoirs Of A Yellow Dog | The old man and the narrator engage in a playful yet contentious relationship over lunch, with the old man holding power and threatening to end their arrangement. |
| B02.05 | The Green Door | Someone, the suitor, pressures and then coddles someone, the hungry woman, during their meal. |
| B02.06 | The Caliph, Cupid And The Clock | Prince someone, hereditary ruler of someone, offers a young man wealth and a palace on the condition he never has a clock in his possession. |
| B02.07 | After Twenty Years | The old friends, now in their seventies, meet at the same restaurant to rekindle their twenty-year-old promise. |
| B02.08 | The Rubaiyat Of A Scotch Highball | Someone and someone dined at tables d'hôte, befriended a couple, and spent evenings dancing, with someone learning to drink and someone to drink more, all while living in a run-down someone. |
| B02.09 | The Pendulum | Someone, alone in his home, prepares a meal and contemplates his loneliness, remembering someone’s presence and realizing her importance to his happiness. |
| B02.10 | Two Thanksgiving Day Gentlemen | Every someone Day for nine years, the Old Gentleman found someone on his bench and took him to a restaurant for a big dinner. |
| B02.11 | Two Thanksgiving Day Gentlemen | The Old Gentleman coerces someone into a someone dinner, hinting someone lacks a male heir to carry on the tradition. |
| B02.12 | Two Thanksgiving Day Gentlemen | The Old Gentleman, living alone, feeds someone, a servant, who sees their relationship as someone’s entitlement to the Old Gentleman's someone feast. |
| B02.13 | Two Thanksgiving Day Gentlemen | The Old Gentleman hosts an annual someone feast for his protégé someone, a tradition recognized by staff. |
| B02.14 | The Assessor Of Success | The old man seeks his son someone, believing him to be a heavy-set man in his late twenties, while someone, annoyed, tries to redirect him to the Bishop of Long Island's dinner. |
| B02.15 | A Midsummer Knight’S Dream | A man, forty and harassed, boasts about New someone’s comforts to a fat companion seeking outdoor adventures. |
### B03 — 23 scenes from 16 stories
Missed the gate: cohesion S1 0.601, needs 0.604.
Most similar candidate: C12 (cosine 0.92 — a hint only).
| Scene | Story | Summary |
| --- | --- | --- |
| B03.01 | Extradited From Bohemia | Someone sat entranced by music and conversation, while someone’s influence remained distant, and her friends reveled in someone revelry. |
| B03.02 | A Philistine In Bohemia | Someone’s crowded dining room hosts a mixed crowd of someone, opportunists, and arrivistes, all clamoring for his culinary and social cachet. |
| B03.03 | Strictly Business | Someone, an actor, attends a matinee to watch his less talented colleagues perform, feeling increasingly isolated and frustrated. |
| B03.04 | Strictly Business | Someone, manager of a New someone house, praises someone and Cherry as reliable, gentlemanly performers, yet someone secretly plans to leave the circuit for a more prestigious career. |
| B03.05 | The Gold That Glittered | The General commands a column while someone, visibly uncomfortable, feigns interest in the General's political musings and culinary inquiries. |
| B03.06 | The Call Of The Tame | Someone skillfully steered someone’s lunch choices while someone expressed discontent over his lack of western experiences. |
| B03.07 | A Ramble In Aphasia | Someone revels in unrestrained freedom, only to discover convention holds the true key to liberty. |
| B03.08 | Compliments Of The Season | Black someone temporized as someone, intoxicated with performing for a local literary group, proposed a night off from his usual gig at someone’s theater. |
| B03.09 | Past One At Rooney’S | Someone, the bar owner, wields power over his guests, manipulating them with charm and authority. |
| B03.10 | The Coming-Out Of Maggie | Someone, leader of the association, held power over its members, who feared him but also admired his athletic prowess and social connections. |
| B03.11 | The Caliph, Cupid And The Clock | Prince someone sat on a bench, envying the wealth and power he could wield but choosing instead to mingle with the poor and grant them unexpected largesse. |
| B03.12 | The Romance Of A Busy Broker | Someone juggled urgent business calls and frantic office tasks while Pitcher waited for promised samples, each hoping their day wouldn’t be as chaotic as the broker’s. |
| B03.13 | Lost On Dress Parade | Someone watches as society buds and bon vivants admire his company, while he eagerly anticipates his return to his usual upscale dining. |
| B03.14 | Two Thanksgiving Day Gentlemen | Someone, waiting for the annual someone proclamation, monopolizes a seat in Union Square, expecting good fortune. |
| B03.15 | Two Thanksgiving Day Gentlemen | Someone, despite being visibly ill from overeating, sat contemptuously observing others at a gathering. |
| B03.16 | The Social Triangle | Someone, with his wealth and charisma, commands the someone as he greets his lieutenants, who are intoxicated by his false camaraderie, while someone, now delirious, pledges his loyalty with a drunken gesture. |
| B03.17 | The Social Triangle | Someone, the political mogul, welcomed patrons but was distracted by someone’s fix, while someone, his subordinate, reveled in a minor setback. |
| B03.18 | The Social Triangle | Someone and Van someone sat at separate tables in a luxurious dining room, each aware of the other's power and influence, while someone’s discontent mirrored the social hierarchy's rigid structure. |
| B03.19 | The Social Triangle | Someone, now the center of attention, commands wine for his table and others, flaunting his newfound power. |
| B03.20 | The Lost Blend | Con someone works the bar while Con dances for the elect, a saloon where teetotalers seek refuge in a slot restaurant. |
| B03.21 | The Country Of Elusion | André, once a someone waiter, transformed his restaurant into a bizarre spectacle, attracting someone who flocked to see him as the Grand someone of someone, until he reinvented his establishment as a high-end dining experience for wealthy patrons. |
| B03.22 | The Country Of Elusion | Someone holds power over someone, who seeks a new cover for the table, while someone maintains a tense demeanor under scrutiny. |
| B03.23 | The Country Of Elusion | Someone, the painter, cut up the room with a waiter, while others held power over their respective domains. |
### B04 — 13 scenes from 11 stories
Missed the gate: cohesion against same-size random sets Z1 4.6, needs 5.
Most similar candidate: C11 (cosine 0.90 — a hint only).
| Scene | Story | Summary |
| --- | --- | --- |
| B04.01 | The Defeat Of The City | Someone ascended to her room, passing someone who was performing a trick, unaware of her presence, and he was unprepared for her judgment. |
| B04.02 | The Rathskeller And The Rose | Someone maneuvers someone to a secluded table, while her audience reacts with varying degrees of amusement and skepticism. |
| B04.03 | The Memento | Someone ignored someone, preferring the stifling dressing room and audience roar to the tumult below. |
| B04.04 | The Memento | You saw someone Ray's aerial garter flight during her vaudeville act, as patrons desperately tried to catch it, while she announced her retirement to her friend. |
| B04.05 | The Memento | Someone Ray barged into someone’s home, seeking information about her whereabouts and eager to catch up, despite their professional separation. |
| B04.06 | Strictly Business | Someone Cherry, nervous about her performance, accidentally killed someone during a gunshot, leading to a comedic and chaotic aftermath. |
| B04.07 | The Unknown Quantity | Frank, wounded and enraged, violently rejects someone, who flees the scene, leaving the audience to ponder their own fates. |
| B04.08 | The Skylight Room | Roomers jeered at someone, while someone and someone sat aloof, someone’s popularity dependent on their reactions. |
| B04.09 | The Coming-Out Of Maggie | Someone charged into the room of single combat, seizing someone’s stiletto as he lunged, while the Board stood frozen, unsure of what to do. |
| B04.10 | Springtime À La Carte | The man upstairs played music to mask the couple's quarrel, while someone prepared to read, unaware her landlady had already answered the unexpected visitor. |
| B04.11 | The Furnished Room | He searched the room for her, finding only objects, while she remained invisible, tantalizing him with scent. |
| B04.12 | The Pendulum | Someone, distraught, tidied someone’s room, feeling a profound sense of loss as if she had truly vanished. |
| B04.13 | The Country Of Elusion | Someone slapped someone, shocking the room as Conscience's ax echoed, and someone fled, robbed of his climax by someone’s swift hand. |
### B05 — 21 scenes from 8 stories
Missed the gate: cohesion S1 0.600, needs 0.604.
Most similar candidate: C01 (cosine 0.86 — a hint only).
| Scene | Story | Summary |
| --- | --- | --- |
| B05.01 | The Plutonian Fire | Editors decide fate of manuscripts based on stamps, with some deemed true and others discarded, reflecting disdain for factual accuracy in fiction. |
| B05.02 | The Plutonian Fire | Someone seeks publication for his manuscripts while facing financial struggles. |
| B05.03 | The Plutonian Fire | Someone, a writer, submits love stories to editors who want them, leading to his frustration as he finds his stories rejected despite their quality. |
| B05.04 | The Plutonian Fire | Someone seeks to write a love story about a New someone girl, but his own internal conflicts and doubts make his attempts fall flat. |
| B05.05 | The Plutonian Fire | Old Hoss smiled confidently, ordering his younger brother to write the winning story, while secretly reading and dismissing his brother's efforts as worthless. |
| B05.06 | The Plutonian Fire | Someone, seeking to recover his writing skills, manipulates a young admirer to provide material for his stories, leading to a complex romantic entanglement. |
| B05.07 | The Plutonian Fire | Old someone, the storyteller, outdid his rival Hoss by combining another woman's heart into an artful love story, securing a lucrative contract and Hoss's enmity. |
| B05.08 | The Rathskeller And The Rose | Someone pressures his protégé to secure the role of someone" by convincing someone, who insists on the authenticity of the part, despite his suggestions being rejected. |
| B05.09 | Strictly Business | Someone presents his vaudeville sketch to someone Cherry, who critiques and improves it, leading to mutual trust and investment in its success. |
| B05.10 | Strictly Business | Someone pressures someone Cherry to invest in improving her stage sketch, promising it will triple their earnings, while secretly manipulating its development. |
| B05.11 | The Poet And The Peasant | Someone’s poem, a pastiche of pastoral clichés, was rejected, angering the poet who submitted a more authentic nature poem, leading to a confrontation with the editor. |
| B05.12 | The Poet And The Peasant | The editor, holding power over someone, praised his poem while someone tactfully accepts a check for his work. |
| B05.13 | A Ramble In Aphasia | Someone, now someone, pressures someone into accepting his help to cure his aphasia, hinting at a covert treatment. |
| B05.14 | A Municipal Report | Someone, a refined Southern essayist, sought financial support from the narrator, who was torn between his professional duties and his admiration for her literary work. |
| B05.15 | A Municipal Report | Someone, now a patient, signed a contract for ghostwriting while slipping, prompting her lawyer to summon a doctor and a team of helpers. |
| B05.16 | Proof Of The Pudding | Spring waggled her eyes at Editor someone, sidetracking him with her charms and leading him away from his work. |
| B05.17 | Proof Of The Pudding | Editor someone basked in the success of his magazine while someone, ragged and unassuming, sought his help. |
| B05.18 | Proof Of The Pudding | Someone, seeking renewed publication, confronts Editor someone, now living in a squalid apartment, with his failed attempts to sell fiction. |
| B05.19 | Proof Of The Pudding | Someone, the editor, demands someone, the writer, explain his tardiness and threatens to alter his work if he does not improve. |
| B05.20 | Proof Of The Pudding | Editor someone attempts to silence contributor someone, asserting art mirrors life's emotions, while someone challenges this notion provocatively. |
| B05.21 | Memoirs Of A Yellow Dog | A struggling writer argues with his publisher over the inclusion of an animal's perspective story, insisting it should be authentic and relatable rather than literary. |
### B06 — 22 scenes from 13 stories
Missed the gate: cohesion S1 0.598, needs 0.604.
Most similar candidate: C06 (cosine 0.90 — a hint only).
| Scene | Story | Summary |
| --- | --- | --- |
| B06.01 | The Shocks Of Doom | Someone, worried about money and health, persuades someone to sleep near him in the Square, while someone offers to help secure a job reference for someone. |
| B06.02 | The Fool-Killer | Someone, a cigaretteur and friend to the narrator, envies the narrator's young, melancholic friend who works in a factory for low wages. |
| B06.03 | The Fifth Wheel | Someone, a former coachman, offers a captured tire to a sealskinned gentleman who questions his identity and family, inviting him to a ride in a motor car. |
| B06.04 | The Fifth Wheel | Someone, seeking revenge, confides in someone about a drunken dream involving a mysterious automobile ride, while someone dismisses the tale as nonsense. |
| B06.05 | The Unknown Quantity | Someone, now a wealthy bachelor, revisits his old friend someone, a watchmaker turned outdoorsman, finding them as different as ever. |
| B06.06 | The Venturers | The narrator observes two men, the VENTURER and the ADVENTURE, contemplating the uncertain future of fortune, chance, and discovery on a train journey. |
| B06.07 | The Venturers | Billinger tells a someone story to someone, who leaves the someone Club in his favorite mood of wanting to follow Chance. |
| B06.08 | The Venturers | Someone, a lifelong seeker of unpredictable adventures, eagerly anticipates a bottle of someone with someone, who shares his adventurous spirit. |
| B06.09 | Tobin’S Palm | Someone and his friend seek distraction from his broken heart over lost love by visiting carnival attractions in someone, hoping for signs or luck. |
| B06.10 | Tobin’S Palm | Someone seeks a fortune teller, someone, to uncover the truth about his love interest someone, while revealing his own misfortunes and impending troubles. |
| B06.11 | Tobin’S Palm | The man seeks someone’s advice on fortune-telling, believing him to be a source of good luck, while I, a friend of someone, tries to convince him otherwise. |
| B06.12 | Tobin’S Palm | The man of destiny seeks companionship, offering someone a drink in a saloon to discuss his literary pursuits and the unavailability of a book for him. |
| B06.13 | Man About Town | My friend invites me to a restaurant, hinting at a Man About Town, while I seek out my own social circle instead. |
| B06.14 | From The Cabby’S Seat | Someone, a cabbie, lures a fare into his cab with promises of a leisurely ride, leading her through the city and into his cabaret-like journey. |
| B06.15 | From The Cabby’S Seat | The fare and someone, the cabdriver, negotiate a ride to the Casino where the fare experiences a night of entertainment and revelry. |
| B06.16 | An Unfinished Story | Someone, seeking to add joy to her life, hesitates while her friend someone pressures her to go to someone Island, a decision someone doubts she can make. |
| B06.17 | Brickdust Row | Someone, seeking amusement, pretends to be a common passenger while actually attending a rendezvous with a strikingly beautiful woman at someone Island. |
| B06.18 | Brickdust Row | Someone, now seeing a group of idealists, joins them as they plan to transform mundane tales into enchanted adventures, humbled by their vision. |
| B06.19 | A Midsummer Knight’S Dream | The fat man scoffs at the fisherman's efforts, while the businessman eagerly awaits his catch, each confident in their superior methods. |
| B06.20 | The Count And The Wedding Guest | Someone, alone in New someone, seeks solace from someone’s company in the park, while he reveals he has a long-lost friend named Count someone whom he hopes to introduce to her. |
| B06.21 | The Ferry Of Unfulfilment | The Man from someone, flush with cash, pursues the Girl from someone’s, a beauty on Sixth Avenue, driven by desire and the urgency of his impending return to the North. |
| B06.22 | The Ferry Of Unfulfilment | The Man from someone tries to win over someone, a fellow passenger on a train, with promises of shared gambling and reminiscing about mining, while she remains skeptical and distracted by her own thoughts. |
### B07 — 13 scenes from 10 stories
Missed the gate: cohesion S1 0.602, needs 0.604; cohesion against same-size random sets Z1 4.5, needs 5.
Most similar candidate: C11 (cosine 0.87 — a hint only).
| Scene | Story | Summary |
| --- | --- | --- |
| B07.01 | Roses, Ruses And Romance | Someone, the artist, dismissively lists the contents of a magazine he considers dead, infuriating his clerk friend someone Brown. |
| B07.02 | The Gold That Glittered | Someone. |
| B07.03 | The Girl And The Graft | Someone, a graft worker, candidly discussed his profession with curiosity-driven someone, revealing the gendered dynamics of their relationship. |
| B07.04 | The Unknown Quantity | Someone, a mysterious artist, confesses his love to someone, a receptionist, in her office, revealing his identity and passion, while she feels a sudden surge of emotion. |
| B07.05 | The Skylight Room | Someone, the maid, threatens to blow a goodbye kiss to someone from her sickbed, while someone tries to convince the ambulance doctor about the strange case of someone. |
| B07.06 | Springtime À La Carte | Someone agonized over the menu changes, her tears reflecting the loss of someone, as dandelions, his favorite flower, appeared. |
| B07.07 | The Romance Of A Busy Broker | Pitcher, confidential clerk in someone’s office, shows mild interest and surprise as someone’s young lady stenographer arrives with a question about future employment. |
| B07.08 | The Last Leaf | Someone urges someone to sleep while she calls him to model for her old hermit miner, a failed painter who drinks heavily and fears his own mortality. |
| B07.09 | The Last Leaf | Someone demands a modeling session for a sick someone, while someone tries to manage the situation and hide her discomfort. |
| B07.10 | The Last Leaf | Someone, ill and dying, fantasizes about painting while her nurse someone nurses her, unaware of the doctor's grim prognosis for another patient. |
| B07.11 | The Last Leaf | Someone tells her daughter about someone’s death, revealing he had been painting a last ivy leaf before his fatal illness. |
| B07.12 | The Count And The Wedding Guest | Someone reveals a portrait of someone to someone, who agrees to accompany her to someone next someone to help her cope with her grief. |
| B07.13 | The Country Of Elusion | Someone, sub-editor of Doc’s Magazine, leaves work to seek distraction from his day's frustrations by calling his girlfriend, someone. |
### B08 — 7 scenes from 7 stories
Missed the gate: cohesion against same-size random sets Z1 3.8, needs 5.
Most similar candidate: C05 (cosine 0.90 — a hint only).
| Scene | Story | Summary |
| --- | --- | --- |
| B08.01 | From Each According To His Ability | Someone, a Wall Street speculator, seeks an unconventional meeting with a shady Wall Street "crook" for a private conversation. |
| B08.02 | The Fifth Wheel | Someone approaches an abandoned tire on Fifth Avenue, hoping to exploit a wealthy motorist's need for it, while others jeer at the speeding car. |
| B08.03 | The Girl And The Graft | Fifth Avenue millionaire someone accuses his wife someone of "graft" for accepting a valuable diamond brooch from a business associate, while someone himself is revealed to be a front man for a sidewalk merchant someone. |
| B08.04 | A Night In New Arabia | Detectives cornered someone, coerced a confession implicating someone, and arranged a meeting with someone to return a twenty-five-thousand-dollar inheritance. |
| B08.05 | The Venturers | Someone recounts how he met someone, a journalist, at a someone garden party hosted by a grand vizier, where they engaged in a clandestine conversation. |
| B08.06 | The Assessor Of Success | Someone, armed with cash, negotiates with a disreputable former associate, someone, who resorts to violence, then charms the someone guard to enter a private residence. |
| B08.07 | The Tale Of A Tainted Tenner | The twenty-year-old gambler seeks information from Old someone, the proprietor, only to be met with condescending explanations and eventually surrounded by various social climbers. |
File diff suppressed because it is too large Load Diff
@@ -1,247 +0,0 @@
{
"schema_version": 1,
"run": "k60-s24",
"instructions": "Read REVIEW.md in this directory. Fill in each entry below, then run: python3 apply_review.py review/k60-s24",
"entries": [
{
"id": "C01",
"kind": "accepted",
"decision": null,
"situation": "",
"actor": "",
"counterpart": "",
"stakes": "",
"exclude": [],
"merge_into": null,
"notes": ""
},
{
"id": "C02",
"kind": "accepted",
"decision": null,
"situation": "",
"actor": "",
"counterpart": "",
"stakes": "",
"exclude": [],
"merge_into": null,
"notes": ""
},
{
"id": "C03",
"kind": "accepted",
"decision": null,
"situation": "",
"actor": "",
"counterpart": "",
"stakes": "",
"exclude": [],
"merge_into": null,
"notes": ""
},
{
"id": "C04",
"kind": "accepted",
"decision": null,
"situation": "",
"actor": "",
"counterpart": "",
"stakes": "",
"exclude": [],
"merge_into": null,
"notes": ""
},
{
"id": "C05",
"kind": "accepted",
"decision": null,
"situation": "",
"actor": "",
"counterpart": "",
"stakes": "",
"exclude": [],
"merge_into": null,
"notes": ""
},
{
"id": "C06",
"kind": "accepted",
"decision": null,
"situation": "",
"actor": "",
"counterpart": "",
"stakes": "",
"exclude": [],
"merge_into": null,
"notes": ""
},
{
"id": "C07",
"kind": "accepted",
"decision": null,
"situation": "",
"actor": "",
"counterpart": "",
"stakes": "",
"exclude": [],
"merge_into": null,
"notes": ""
},
{
"id": "C08",
"kind": "accepted",
"decision": null,
"situation": "",
"actor": "",
"counterpart": "",
"stakes": "",
"exclude": [],
"merge_into": null,
"notes": ""
},
{
"id": "C09",
"kind": "accepted",
"decision": null,
"situation": "",
"actor": "",
"counterpart": "",
"stakes": "",
"exclude": [],
"merge_into": null,
"notes": ""
},
{
"id": "C10",
"kind": "accepted",
"decision": null,
"situation": "",
"actor": "",
"counterpart": "",
"stakes": "",
"exclude": [],
"merge_into": null,
"notes": ""
},
{
"id": "C11",
"kind": "accepted",
"decision": null,
"situation": "",
"actor": "",
"counterpart": "",
"stakes": "",
"exclude": [],
"merge_into": null,
"notes": ""
},
{
"id": "C12",
"kind": "accepted",
"decision": null,
"situation": "",
"actor": "",
"counterpart": "",
"stakes": "",
"exclude": [],
"merge_into": null,
"notes": ""
},
{
"id": "B01",
"kind": "borderline",
"decision": "skip",
"situation": "",
"actor": "",
"counterpart": "",
"stakes": "",
"exclude": [],
"merge_into": null,
"notes": ""
},
{
"id": "B02",
"kind": "borderline",
"decision": "skip",
"situation": "",
"actor": "",
"counterpart": "",
"stakes": "",
"exclude": [],
"merge_into": null,
"notes": ""
},
{
"id": "B03",
"kind": "borderline",
"decision": "skip",
"situation": "",
"actor": "",
"counterpart": "",
"stakes": "",
"exclude": [],
"merge_into": null,
"notes": ""
},
{
"id": "B04",
"kind": "borderline",
"decision": "skip",
"situation": "",
"actor": "",
"counterpart": "",
"stakes": "",
"exclude": [],
"merge_into": null,
"notes": ""
},
{
"id": "B05",
"kind": "borderline",
"decision": "skip",
"situation": "",
"actor": "",
"counterpart": "",
"stakes": "",
"exclude": [],
"merge_into": null,
"notes": ""
},
{
"id": "B06",
"kind": "borderline",
"decision": "skip",
"situation": "",
"actor": "",
"counterpart": "",
"stakes": "",
"exclude": [],
"merge_into": null,
"notes": ""
},
{
"id": "B07",
"kind": "borderline",
"decision": "skip",
"situation": "",
"actor": "",
"counterpart": "",
"stakes": "",
"exclude": [],
"merge_into": null,
"notes": ""
},
{
"id": "B08",
"kind": "borderline",
"decision": "skip",
"situation": "",
"actor": "",
"counterpart": "",
"stakes": "",
"exclude": [],
"merge_into": null,
"notes": ""
}
]
}
+91 -105
View File
@@ -1,51 +1,46 @@
"""The human review form: its schema, member ids, checks, and conversion to situations.json.
"""The saved review: its format, its checks, and conversion to situations.json.
Kept free of clustering code so apply_review.py and the tests load instantly.
Kept free of clustering and page code so apply_review.py and the tests load instantly.
A review run has three files in one directory:
candidates.json written by review.py: what the program found (read-only)
review.json written blank by review.py, filled in by the reviewer
situations.json written by apply_review.py once review.json passes every check
A review run directory holds:
candidates.json written by review.py: the groups the program found (read-only)
REVIEW.html written by review.py: the page the reviewer works in
review-<run>.json saved from that page, usually into Downloads
situations.json written by apply_review.py once the review passes every check
The page (review_page_logic.cjs) applies the same rules as it goes, so a reviewer sees a
problem where it happens. This module is still the authority: apply_review.py checks the
saved file again before anything downstream reads it.
"""
import collections
SCHEMA_VERSION = 1
SCHEMA_VERSION = 2
MIN_MEMBERS, MIN_STORIES, MAX_DOMINANT = 5, 4, 0.40
MAX_SITUATION_CHARS = 200
MAX_FIELD_CHARS = 80
DECISIONS = {
'accepted': ('accept', 'reject', 'merge'), # passed the gate: the reviewer must decide
'borderline': ('skip', 'accept', 'merge'), # narrowly failed: optional, "skip" by default
'accepted': ('keep', 'drop', 'same'), # passed the gate: a decision is required
'borderline': ('skip', 'keep', 'same'), # nearly passed: optional, left out by default
}
RULES = {'minMembers': MIN_MEMBERS, 'minStories': MIN_STORIES, 'maxDominant': MAX_DOMINANT,
'maxFieldChars': MAX_FIELD_CHARS}
def member_id(cid, n):
"""C04.07 — the 7th scene of candidate C04."""
"""C04.07 — the 7th scene of group C04."""
return f'{cid}.{n:02d}'
def blank_entry(cid, kind):
return {
'id': cid,
'kind': kind,
'decision': None if kind == 'accepted' else 'skip',
'situation': '',
'actor': '',
'counterpart': '',
'stakes': '',
'exclude': [],
'merge_into': None,
'notes': '',
}
return {'id': cid, 'decision': None if kind == 'accepted' else 'skip', 'same_as': None,
'actor': '', 'wants': '', 'counterpart': '', 'excluded': []}
def blank_form(candidates):
return {
'schema_version': SCHEMA_VERSION,
'run': candidates['run']['id'],
'instructions': 'Read REVIEW.md in this directory. Fill in each entry below, then run: '
f'python3 apply_review.py review/{candidates["run"]["id"]}',
'entries': [blank_entry(cid, c['kind']) for cid, c in candidates['candidates'].items()],
}
def display_name(candidates, cid):
"""What the page calls a group: "Group 3", or "Extra group 2" for a near miss."""
kind = candidates['candidates'][cid]['kind']
same_kind = [c for c, v in candidates['candidates'].items() if v['kind'] == kind]
n = same_kind.index(cid) + 1
return f'Group {n}' if kind == 'accepted' else f'Extra group {n}'
def shape(members):
@@ -54,6 +49,10 @@ def shape(members):
return len(members), len(counts), (max(counts.values()) / len(members) if members else 0.0)
def sentence(entry):
return f'A {entry["actor"].strip()} wants {entry["wants"].strip()} from {entry["counterpart"].strip()}.'
def _text(value):
return value.strip() if isinstance(value, str) else ''
@@ -61,104 +60,93 @@ def _text(value):
def validate(candidates, form):
"""Return (errors, warnings, situations). situations is None whenever there is any error.
Every problem is collected, so the reviewer can fix them all in one pass.
Every problem is collected, so the reviewer can fix them all in one pass. Messages name
groups the way the page does, and say what to do there.
"""
errors, warnings = [], []
cands = candidates['candidates']
run = candidates['run']
name = lambda cid: display_name(candidates, cid)
if form.get('schema_version') != SCHEMA_VERSION:
errors.append(f'"schema_version" is {form.get("schema_version")!r}; this checker reads {SCHEMA_VERSION}.')
if form.get('run') != candidates['run']['id']:
errors.append(f'This form is for run {form.get("run")!r}, but candidates.json is run '
f'{candidates["run"]["id"]!r}. Use the review.json from the same directory.')
errors.append(f'This review file was made by a different version of the review tool '
f'(format {form.get("schema_version")!r}; this checker reads {SCHEMA_VERSION}). '
f'Regenerate the page with review.py and review in that.')
return errors, warnings, None
if form.get('run') != run['id']:
errors.append(f'This review file is for run {form.get("run")!r}, but this directory is run '
f'{run["id"]!r}. Use the file saved from this run\'s REVIEW.html.')
if run.get('fingerprint') and form.get('fingerprint') and form['fingerprint'] != run['fingerprint']:
errors.append('This review file was made for a different set of groups that used the same run '
'name. Review again in the current REVIEW.html.')
entries = form.get('entries')
if not isinstance(entries, list):
errors.append('"entries" must be a list of candidate entries.')
errors.append('The review file has no list of groups in it. Save it again from REVIEW.html.')
return errors, warnings, None
by_id = {}
for e in entries:
cid = e.get('id') if isinstance(e, dict) else None
if cid not in cands:
errors.append(f'An entry has id {cid!r}, which is not a candidate in this run.')
elif cid in by_id:
errors.append(f'{cid}: appears more than once; keep one entry.')
else:
errors.append(f'The review file mentions a group {cid!r} that is not in this run.')
elif cid not in by_id:
by_id[cid] = e
for cid in cands:
if cid not in by_id:
errors.append(f'{cid}: its entry is missing from the form. Restore it (the blank entry is '
f'{{"id": "{cid}", ...}}) and set "decision".')
errors.append(f'{name(cid)} is missing from the review file. Save it again from REVIEW.html.')
for cid, e in by_id.items():
kind = cands[cid]['kind']
allowed = DECISIONS[kind]
decision = e.get('decision')
if decision is None:
errors.append(f'{cid}: no decision yet. Set "decision" to one of: {", ".join(allowed)}.')
errors.append(f'{name(cid)}: not decided yet. Open it in REVIEW.html and choose keep, drop, '
f'or same as another group.')
continue
if decision not in allowed:
errors.append(f'{cid}: "decision" is {decision!r}; for a {kind} candidate use one of: '
f'{", ".join(allowed)}.')
if decision not in DECISIONS[kind]:
errors.append(f'{name(cid)}: the decision {decision!r} is not one this group can have.')
continue
members = cands[cid]['members']
valid = {m['member'] for m in members}
exclude = e.get('exclude', [])
if not isinstance(exclude, list):
errors.append(f'{cid}: "exclude" must be a list of member ids, like ["{cid}.03"].')
exclude = []
unknown = [x for x in exclude if x not in valid]
if unknown:
errors.append(f'{cid}: "exclude" lists {", ".join(map(str, unknown))}, which are not scenes of '
f'{cid}; its scenes are {member_id(cid, 1)} to {member_id(cid, len(members))}.')
excluded = e.get('excluded', [])
if not isinstance(excluded, list) or any(x not in valid for x in excluded):
errors.append(f'{name(cid)}: the unticked scenes do not match this group. Save the review '
f'again from REVIEW.html.')
if decision == 'accept':
for field in ('situation', 'actor', 'counterpart'):
if not _text(e.get(field)):
errors.append(f'{cid}: accepted, so "{field}" must be filled in.')
situation = _text(e.get('situation'))
if len(situation) > MAX_SITUATION_CHARS:
errors.append(f'{cid}: "situation" is {len(situation)} characters; keep it to one sentence '
f'of at most {MAX_SITUATION_CHARS}.')
if situation and 'want' not in situation.lower():
warnings.append(f'{cid}: "situation" does not say who wants what ("… wants … from …"). '
f'Accepted as written.')
if not _text(e.get('stakes')):
warnings.append(f'{cid}: "stakes" is empty.')
if decision == 'keep':
missing = [label for key, label in (('actor', 'who wants something'), ('wants', 'what they want'),
('counterpart', 'who they want it from')) if not _text(e.get(key))]
if missing:
errors.append(f'{name(cid)}: kept, but its name is not finished. Fill in '
f'{", ".join(missing)} in "A ___ wants ___ from ___".')
for key in ('actor', 'wants', 'counterpart'):
if len(_text(e.get(key))) > MAX_FIELD_CHARS:
errors.append(f'{name(cid)}: "{key}" is longer than {MAX_FIELD_CHARS} characters.')
if isinstance(excluded, list) and len(excluded) > len(members) / 2:
warnings.append(f'{name(cid)}: more than half its scenes are unticked. Check the name '
f'describes what the group is mostly about.')
if decision == 'merge':
target = e.get('merge_into')
if target == cid:
errors.append(f'{cid}: cannot merge into itself.')
elif target not in by_id:
errors.append(f'{cid}: "merge_into" is {target!r}, which is not a candidate id in this form.')
elif by_id[target].get('decision') != 'accept':
errors.append(f'{cid}: merges into {target}, but {target} has decision '
f'{by_id[target].get("decision")!r}. Merge only into an accepted candidate, '
f'or accept {cid} instead.')
elif e.get('merge_into') not in (None, ''):
warnings.append(f'{cid}: "merge_into" is set but the decision is {decision!r}; it is ignored.')
if decision in ('reject', 'skip') and exclude:
warnings.append(f'{cid}: "exclude" is ignored because the decision is {decision!r}.')
if decision in ('accept', 'merge') and len(exclude) > len(members) / 2:
warnings.append(f'{cid}: more than half of its scenes are excluded. Check that the situation '
f'named is what this candidate is mostly about.')
if decision == 'same':
target = e.get('same_as')
if target == cid or target not in by_id:
errors.append(f'{name(cid)}: marked "same as" a group that is not in this run.')
elif by_id[target].get('decision') != 'keep':
errors.append(f'{name(cid)}: marked the same as {name(target)}, but {name(target)} is not '
f'kept. Keep {name(target)}, or choose differently for {name(cid)}.')
if errors:
return errors, warnings, None
groups = collections.OrderedDict((cid, [cid]) for cid, e in by_id.items() if e['decision'] == 'accept')
groups = collections.OrderedDict((cid, [cid]) for cid, e in by_id.items() if e['decision'] == 'keep')
for cid, e in by_id.items():
if e['decision'] == 'merge':
groups[e['merge_into']].append(cid)
if e['decision'] == 'same':
groups[e['same_as']].append(cid)
situations = []
for cid, sources in groups.items():
members, seen = [], set()
for src in sources:
excluded = set(by_id[src].get('exclude', []))
excluded = set(by_id[src].get('excluded', []))
for m in cands[src]['members']:
if m['member'] in excluded or m['chunk'] in seen:
continue
@@ -166,22 +154,20 @@ def validate(candidates, form):
members.append(m)
size, stories, dominant = shape(members)
if size < MIN_MEMBERS or stories < MIN_STORIES or dominant > MAX_DOMINANT:
merged = f' (with {", ".join(sources[1:])} merged in)' if len(sources) > 1 else ''
errors.append(f'{cid}{merged}: after exclusions {size} scenes remain from {stories} stories, the '
f'largest story holding {dominant:.0%}. A situation needs at least {MIN_MEMBERS} '
f'scenes from at least {MIN_STORIES} stories, with no story above '
f'{MAX_DOMINANT:.0%}. Exclude fewer scenes, merge another candidate into it, '
f'or reject it.')
merged = f' (with {", ".join(name(s) for s in sources[1:])} merged in)' if len(sources) > 1 else ''
errors.append(f'{name(cid)}{merged}: {size} ticked scenes from {stories} stories, the largest '
f'story holding {dominant:.0%}. A situation needs at least {MIN_MEMBERS} scenes '
f'from at least {MIN_STORIES} stories, with no story above {MAX_DOMINANT:.0%}. '
f'Tick more scenes, mark another group the same as it, or drop it.')
continue
e = by_id[cid]
situations.append({
'id': f'S{len(situations) + 1:02d}',
'from': sources,
'situation': _text(e['situation']),
'situation': sentence(e),
'actor': _text(e['actor']),
'wants': _text(e['wants']),
'counterpart': _text(e['counterpart']),
'stakes': _text(e.get('stakes')),
'notes': [_text(by_id[s].get('notes')) for s in sources if _text(by_id[s].get('notes'))],
'size': size,
'stories': stories,
'members': [{k: m[k] for k in ('member', 'chunk', 'story', 'title', 'summary')} for m in members],
@@ -192,11 +178,11 @@ def validate(candidates, form):
decided = collections.Counter(e['decision'] for e in by_id.values())
result = {
'schema_version': SCHEMA_VERSION,
'run': candidates['run'],
'counts': {'candidates': len(cands), 'situations': len(situations), 'accepted': decided['accept'],
'merged': decided['merge'], 'rejected': decided['reject'], 'skipped': decided['skip']},
'run': run,
'counts': {'groups': len(cands), 'situations': len(situations), 'kept': decided['keep'],
'same': decided['same'], 'dropped': decided['drop'], 'left_out': decided['skip']},
'situations': situations,
'rejected': [cid for cid, e in by_id.items() if e['decision'] == 'reject'],
'skipped': [cid for cid, e in by_id.items() if e['decision'] == 'skip'],
'dropped': [cid for cid, e in by_id.items() if e['decision'] == 'drop'],
'left_out': [cid for cid, e in by_id.items() if e['decision'] == 'skip'],
}
return errors, warnings, result
+442
View File
@@ -0,0 +1,442 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Situation review · __RUN_ID__</title>
<style>
:root {
--bg: #f7f6f2; --card: #ffffff; --ink: #1d1d1b; --muted: #66655f; --line: #dedcd4;
--accent: #2f5d8a; --accent-ink: #ffffff; --good: #2e7d4f; --warn: #9a5a00; --bad: #b3261e;
--chip: #e9eef5; --struck: #9a9890;
}
@media (prefers-color-scheme: dark) {
:root {
--bg: #161614; --card: #211f1c; --ink: #ecebe6; --muted: #a6a49c; --line: #3a3934;
--accent: #86b4e2; --accent-ink: #0d1b28; --good: #74cf99; --warn: #f0b64d; --bad: #f28b82;
--chip: #2a3440; --struck: #77756e;
}
}
* { box-sizing: border-box; }
body { margin: 0; background: var(--bg); color: var(--ink);
font: 16px/1.55 system-ui, -apple-system, "Segoe UI", Roboto, sans-serif; }
header.top { position: sticky; top: 0; z-index: 2; background: var(--card);
border-bottom: 1px solid var(--line); padding: 10px 16px; }
.wrap { max-width: 900px; margin: 0 auto; padding: 16px; }
.row { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }
.spacer { flex: 1; }
h1 { font-size: 1.05rem; margin: 0; }
h2 { font-size: 1.35rem; margin: 0; }
.muted { color: var(--muted); }
.pills { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 8px; align-items: center; }
.pill { border: 1px solid var(--line); background: var(--card); color: var(--ink); border-radius: 999px;
padding: 1px 10px; font: inherit; font-size: .85rem; cursor: pointer; min-width: 2.2em; }
.pill.current { outline: 2px solid var(--accent); outline-offset: 1px; }
.pill.done { background: var(--good); border-color: var(--good); color: var(--card); }
.pill.problem { background: var(--warn); border-color: var(--warn); color: var(--card); }
.pill.skipped { color: var(--muted); }
.card { background: var(--card); border: 1px solid var(--line); border-radius: 10px; padding: 16px 18px; margin: 14px 0; }
.btn { font: inherit; border: 1px solid var(--line); background: var(--card); color: var(--ink);
border-radius: 8px; padding: 7px 14px; cursor: pointer; }
.btn.primary { background: var(--accent); border-color: var(--accent); color: var(--accent-ink); }
.btn.on { background: var(--accent); border-color: var(--accent); color: var(--accent-ink); }
.btn:disabled { opacity: .45; cursor: not-allowed; }
.q { font-weight: 650; margin: 0 0 10px; }
.tip { font-size: .92rem; color: var(--muted); margin: 8px 0 0; }
.status { font-weight: 600; }
.status.problem { color: var(--bad); }
.status.done { color: var(--good); }
ul.scenes { list-style: none; margin: 0; padding: 0; border-top: 1px solid var(--line); }
ul.scenes li { display: flex; gap: 12px; padding: 8px 2px; border-bottom: 1px solid var(--line); }
ul.scenes li.out .text { text-decoration: line-through; color: var(--struck); }
ul.scenes input { width: 20px; height: 20px; margin-top: 3px; flex: none; cursor: pointer; }
.story { display: block; font-size: .8rem; color: var(--muted); }
.shape { margin: 10px 0 0; font-weight: 600; }
.shape.ok { color: var(--good); }
.shape.bad { color: var(--bad); }
.name { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; font-size: 1.05rem; }
.name input { font: inherit; padding: 6px 8px; border: 1px solid var(--line); border-radius: 6px;
background: var(--bg); color: var(--ink); width: 15em; max-width: 100%; }
.chips { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 10px; align-items: center; }
.chip { font: inherit; border: none; background: var(--chip); color: var(--ink); border-radius: 6px;
padding: 2px 9px; cursor: pointer; font-size: .9rem; }
.preview { margin: 12px 0 0; font-size: 1.05rem; }
select { font: inherit; padding: 6px; border-radius: 6px; border: 1px solid var(--line);
background: var(--bg); color: var(--ink); max-width: 100%; }
.example { border-left: 3px solid var(--line); padding: 2px 14px; margin: 12px 0; }
.example ul { margin: 4px 0; }
table.summary { width: 100%; border-collapse: collapse; }
table.summary td { border-bottom: 1px solid var(--line); padding: 6px 4px; vertical-align: top; }
pre { background: var(--bg); border: 1px solid var(--line); border-radius: 6px; padding: 8px 10px; overflow-x: auto; }
.saved { font-size: .85rem; color: var(--muted); }
kbd { border: 1px solid var(--line); border-radius: 4px; padding: 0 5px; font-size: .85rem; }
</style>
</head>
<body>
<header class="top">
<div class="row" id="topbar"></div>
<div id="pills"></div>
</header>
<main class="wrap" id="app"></main>
<noscript><p class="wrap">This review page needs JavaScript turned on.</p></noscript>
<script>
/*__LOGIC__*/
</script>
<script>
const DOC = /*__DATA__*/null;
(() => {
const L = ReviewLogic;
const run = DOC.run;
const order = L.orderedIds(DOC);
const KEY = `stp-review:${run.id}`;
let saveNote = '';
let lastRoleField = null;
let state = load() || { entries: L.initialEntries(DOC), view: 'intro', current: 0 };
// ---- saving -------------------------------------------------------------------------
function load() {
try {
const raw = localStorage.getItem(KEY);
if (!raw) return null;
const saved = JSON.parse(raw);
const restored = L.fromReviewFile(DOC, saved.file);
if (restored.error) return null;
saveNote = 'Picked up where you left off.';
const view = ['intro', 'candidate', 'finish'].includes(saved.view) ? saved.view : 'candidate';
const current = Math.min(Math.max(0, Number(saved.current) || 0), order.length - 1);
return { entries: restored.entries, view, current };
} catch (_) {
return null;
}
}
function persist() {
try {
const file = L.toReviewFile(DOC, state.entries, new Date().toISOString());
localStorage.setItem(KEY, JSON.stringify({ file, view: state.view, current: state.current }));
saveNote = 'Progress saved in this browser.';
} catch (_) {
saveNote = 'This browser is not keeping progress: use “Save review file” before closing.';
}
}
function update(change, { top = false } = {}) {
change();
persist();
render();
if (top) window.scrollTo(0, 0);
}
function download() {
const file = L.toReviewFile(DOC, state.entries, new Date().toISOString());
const blob = new Blob([JSON.stringify(file, null, 1)], { type: 'application/json' });
const link = document.createElement('a');
link.href = URL.createObjectURL(blob);
link.download = `review-${run.id}.json`;
document.body.appendChild(link);
link.click();
link.remove();
setTimeout(() => URL.revokeObjectURL(link.href), 2000);
saveNote = `Saved review-${run.id}.json.`;
renderTop();
}
function upload(event) {
const chosen = event.target.files && event.target.files[0];
if (!chosen) return;
const reader = new FileReader();
reader.onload = () => {
let data;
try { data = JSON.parse(reader.result); } catch (_) { alert('That file is not a review file.'); return; }
const restored = L.fromReviewFile(DOC, data);
if (restored.error) { alert(restored.error); return; }
if (!confirm('Replace what is on this page with the review in that file?')) return;
update(() => { state.entries = restored.entries; state.view = 'finish'; });
};
reader.readAsText(chosen);
}
// ---- building the page ----------------------------------------------------------------
function el(tag, attrs, ...children) {
const node = document.createElement(tag);
for (const [key, value] of Object.entries(attrs || {})) {
if (value === null || value === undefined || value === false) continue;
if (key === 'class') node.className = value;
else if (key.startsWith('on')) node.addEventListener(key.slice(2), value);
else if (key === 'value') node.value = value;
else if (key === 'checked') node.checked = !!value;
else node.setAttribute(key, value === true ? '' : value);
}
for (const child of children.flat()) {
if (child === null || child === undefined || child === false) continue;
node.append(child instanceof Node ? child : document.createTextNode(String(child)));
}
return node;
}
const entryOf = (id) => state.entries.find((e) => e.id === id);
const go = (index) => update(() => { state.view = 'candidate'; state.current = index; }, { top: true });
function render() {
renderTop();
const app = document.getElementById('app');
if (state.view === 'intro') app.replaceChildren(intro());
else if (state.view === 'finish') app.replaceChildren(finish());
else app.replaceChildren(candidateView(order[state.current]));
}
function renderTop() {
const p = L.progress(DOC, state.entries);
document.getElementById('topbar').replaceChildren(
el('h1', {}, `Situation review · ${run.id}`),
el('span', { class: 'muted' },
`${p.decided} of ${p.total} groups decided${p.problems ? ` · ${p.problems} need attention` : ''}`),
el('span', { class: 'spacer' }),
el('span', { class: 'saved' }, saveNote),
el('button', { class: 'btn', onclick: () => update(() => { state.view = 'intro'; }, { top: true }) }, 'How this works'),
el('button', { class: 'btn primary', onclick: () => update(() => { state.view = 'finish'; }, { top: true }) }, 'Finish & save'),
);
const pill = (id) => {
const index = order.indexOf(id);
const s = L.status(DOC, state.entries, id);
const current = state.view === 'candidate' && state.current === index;
return el('button', {
class: `pill ${s.state}${current ? ' current' : ''}`,
title: `${L.displayName(DOC, id)}: ${s.message}`,
onclick: () => go(index),
}, L.shortName(DOC, id));
};
const accepted = order.filter((id) => DOC.candidates[id].kind === 'accepted');
const extras = order.filter((id) => DOC.candidates[id].kind === 'borderline');
document.getElementById('pills').replaceChildren(el('div', { class: 'pills' },
el('span', { class: 'muted' }, 'Groups:'),
accepted.map(pill),
extras.length ? el('span', { class: 'muted' }, ' Optional extras:') : null,
extras.map(pill),
));
}
function example(verdict, lines, note) {
return el('div', { class: 'example' },
el('strong', {}, verdict),
el('ul', {}, lines.map((line) => el('li', {}, line))),
el('div', { class: 'muted' }, note));
}
function intro() {
const p = L.progress(DOC, state.entries);
return el('div', {},
el('div', { class: 'card' },
el('h2', {}, 'What you are doing'),
el('p', {},
`The program read ${run.scenes} scenes from ${run.stories} stories, summarised each in a sentence, ` +
`and grouped scenes that seem alike. ${p.total} groups might each be one recurring situation: ` +
'something that could come up again and again in the game, with different people. ' +
'Your job is to check each group.'),
el('p', {}, 'Each group asks you three things, one at a time:'),
el('ol', {},
el('li', {}, el('strong', {}, 'Is it one situation? '), 'Keep it, drop it, or mark it the same as a group you already kept.'),
el('li', {}, el('strong', {}, 'Which scenes don’t fit? '), 'Untick them. Every scene stays in unless you untick it.'),
el('li', {}, el('strong', {}, 'What is it? '), 'Fill in one short sentence: “A ___ wants ___ from ___.”')),
el('p', {},
'Expect to drop roughly a quarter of the groups. Allow about a minute each. ' +
'Everything saves in this browser as you go, so you can stop and come back. ' +
'At the end, “Finish & save” saves a review file for the next step.'),
),
el('div', { class: 'card' },
el('h2', {}, 'What counts as a situation'),
el('p', {}, 'One person wanting something specific from another person — the kind of moment that could come round again with different people in it.'),
example('Keep', [
'A lodger begs the landlady for one more week.',
'A tenant hides on the stairs on rent day.',
'A landlady tells a family they are out on Monday.',
], 'Name it: “A lodger wants more time to pay from a landlady.”'),
example('Drop: a shared place, not a situation', [
'Two diners argue about politics.',
'A waiter carries six plates at once.',
'A cook burns the soup.',
], 'They all happen in a restaurant, but nobody wants the same kind of thing from anybody.'),
example('Drop: too vague to name', [
'Someone is tense with someone.',
'A conflict over a personal matter.',
'Power shifts between two people.',
], 'If the best you can say is “conflict” or “people want things”, drop it.'),
example('Same as another group', [
'Group 2 is suitors pressing women to marry them.',
'Group 7 is a wealthy man proposing and being turned down.',
], 'Keep Group 2. On Group 7, choose “Same situation as… Group 2”. Its scenes join Group 2, and it needs no name of its own.'),
el('p', { class: 'tip' }, 'These examples are made up, to show the idea.'),
),
el('div', { class: 'row' },
el('button', { class: 'btn primary', onclick: () => update(() => { state.view = 'candidate'; }, { top: true }) },
p.decided ? 'Carry on reviewing' : 'Start with Group 1'),
el('span', { class: 'muted' }, 'Shortcuts while reviewing: ', el('kbd', {}, 'K'), ' keep · ', el('kbd', {}, 'D'), ' drop · ',
el('kbd', {}, '→'), ' next · ', el('kbd', {}, '←'), ' back')),
);
}
function roleField(entry, key, placeholder) {
return el('input', {
value: entry[key], placeholder, maxlength: DOC.rules.maxFieldChars, 'aria-label': placeholder,
onfocus: () => { if (key !== 'wants') lastRoleField = key; },
oninput: (event) => {
entry[key] = event.target.value;
persist();
renderTop();
const preview = document.getElementById('preview');
if (preview) preview.textContent = L.sentence(entry);
},
});
}
function fillRole(entry, role) {
const target = lastRoleField && !entry[lastRoleField].trim()
? lastRoleField
: (!entry.actor.trim() ? 'actor' : (!entry.counterpart.trim() ? 'counterpart' : (lastRoleField || 'actor')));
update(() => {
entry[target] = target === 'counterpart' ? `a ${role}` : role;
lastRoleField = target === 'actor' ? 'counterpart' : 'actor';
});
}
function candidateView(id) {
const c = DOC.candidates[id];
const e = entryOf(id);
const index = order.indexOf(id);
const s = L.status(DOC, state.entries, id);
const set = (patch) => update(() => Object.assign(e, patch));
const inGroup = e.decision === 'keep' || e.decision === 'same';
const targets = L.keptTargets(DOC, state.entries, id);
const excluded = new Set(e.excluded);
const shape = L.shapeCheck(L.groupMembers(DOC, state.entries, e.decision === 'same' && e.same_as ? e.same_as : id), DOC.rules);
const decisions = el('div', { class: 'row' },
el('button', { class: `btn${e.decision === 'keep' ? ' on' : ''}`, onclick: () => set({ decision: 'keep', same_as: null }) },
'Yes, keep it'),
c.kind === 'accepted'
? el('button', { class: `btn${e.decision === 'drop' ? ' on' : ''}`, onclick: () => set({ decision: 'drop', same_as: null }) }, 'No, drop it')
: el('button', { class: `btn${e.decision === 'skip' ? ' on' : ''}`, onclick: () => set({ decision: 'skip', same_as: null }) }, 'Leave it out'),
el('span', { class: 'muted' }, 'or'),
el('select', {
disabled: targets.length === 0 && e.decision !== 'same',
onchange: (event) => set(event.target.value
? { decision: 'same', same_as: event.target.value }
: { decision: c.kind === 'accepted' ? null : 'skip', same_as: null }),
},
el('option', { value: '' }, targets.length ? 'Same situation as…' : 'Same situation as… (keep a group first)'),
targets.map((t) => el('option', { value: t, selected: e.decision === 'same' && e.same_as === t },
`${L.displayName(DOC, t)}: ${L.sentence(entryOf(t))}`))),
);
const scenes = el('ul', { class: 'scenes' }, c.members.map((m) => {
const out = excluded.has(m.member);
return el('li', { class: out ? 'out' : '' },
el('input', {
type: 'checkbox', checked: !out, disabled: !inGroup, 'aria-label': 'This scene fits',
onchange: (event) => set({
excluded: event.target.checked ? e.excluded.filter((x) => x !== m.member) : [...e.excluded, m.member],
}),
}),
el('div', { class: 'text' }, m.summary, el('span', { class: 'story' }, m.title)));
}));
let third = null;
if (e.decision === 'keep') {
third = el('div', { class: 'card' },
el('p', { class: 'q' }, '3. What is it?'),
el('div', { class: 'name' },
'A', roleField(e, 'actor', 'who wants something'),
'wants', roleField(e, 'wants', 'what they want'),
'from', roleField(e, 'counterpart', 'whom'), '.'),
c.role_hints && c.role_hints.length
? el('div', { class: 'chips' }, el('span', { class: 'muted' }, 'People in these scenes (click to use):'),
c.role_hints.map((role) => el('button', { class: 'chip', onclick: () => fillRole(e, role) }, role)))
: null,
el('p', { class: 'preview', id: 'preview' }, L.sentence(e)),
el('p', { class: 'tip' },
'Use roles, not names: “a lodger”, “her husband”, “a wealthy suitor”. ' +
'If you can’t say what they want, that usually means the group should be dropped.'));
} else if (e.decision === 'same' && e.same_as) {
third = el('div', { class: 'card' },
el('p', {}, `Merged into ${L.displayName(DOC, e.same_as)}: “${L.sentence(entryOf(e.same_as))}”`),
el('p', { class: 'tip' }, 'Its ticked scenes join that group, so it needs no name of its own.'));
}
return el('div', {},
el('div', { class: 'row' },
el('h2', {}, L.displayName(DOC, id)),
el('span', { class: 'muted' }, `${c.members.length} scenes from ${c.stats.stories} stories`),
el('span', { class: 'spacer' }),
el('span', { class: `status ${s.state}` }, s.message)),
c.kind === 'borderline'
? el('p', { class: 'tip' }, 'Optional extra. The program nearly left this group out, so leave it out unless it clearly shows one situation.')
: null,
el('div', { class: 'card' },
el('p', { class: 'q' }, '1. Do most of these scenes show one situation: one person wanting something specific from another?'),
decisions,
el('p', { class: 'tip' }, 'Read the scenes below first. A shared place, job, mood or word is not enough.')),
el('div', { class: 'card' },
el('p', { class: 'q' }, inGroup ? '2. Untick any scene that doesn’t show it.' : 'The scenes'),
scenes,
inGroup ? el('p', { class: `shape ${shape.ok ? 'ok' : 'bad'}` }, shape.text) : null),
third,
el('div', { class: 'row' },
el('button', { class: 'btn', disabled: index === 0, onclick: () => go(index - 1) }, '← Back'),
el('span', { class: 'spacer' }),
index < order.length - 1
? el('button', { class: 'btn primary', onclick: () => go(index + 1) }, 'Next →')
: el('button', { class: 'btn primary', onclick: () => update(() => { state.view = 'finish'; }, { top: true }) }, 'Finish & save')),
);
}
function finish() {
const p = L.progress(DOC, state.entries);
const ready = p.decided === p.total && p.problems === 0;
const rows = order.map((id) => {
const s = L.status(DOC, state.entries, id);
return el('tr', {},
el('td', {}, el('button', { class: `pill ${s.state}`, onclick: () => go(order.indexOf(id)) }, L.displayName(DOC, id))),
el('td', {}, s.message));
});
return el('div', {},
el('div', { class: 'card' },
el('h2', {}, ready ? 'Ready to save' : 'Not finished yet'),
el('p', {}, ready
? 'Every group is decided and nothing needs attention.'
: `${p.total - p.decided} groups not decided${p.problems ? `, ${p.problems} need attention` : ''}. ` +
'You can still save now: the file keeps your progress, and the next step lists what is missing.'),
el('div', { class: 'row' },
el('button', { class: 'btn primary', onclick: download }, 'Save review file'),
el('label', { class: 'btn' }, 'Load a review file',
el('input', { type: 'file', accept: '.json,application/json', style: 'display:none', onchange: upload }))),
el('p', { class: 'tip' },
`The browser saves review-${run.id}.json, usually into Downloads. Then, in the story-to-pack probe folder, run:`),
el('pre', {}, `python3 apply_review.py review/${run.id}`),
el('p', { class: 'tip' }, 'It finds the file in Downloads by itself, checks it, and writes situations.json.')),
el('div', { class: 'card' }, el('table', { class: 'summary' }, rows)),
);
}
document.addEventListener('keydown', (event) => {
if (state.view !== 'candidate' || event.ctrlKey || event.metaKey || event.altKey) return;
// Never while typing a name or choosing from the list.
const tag = (event.target.tagName || '').toLowerCase();
if (['input', 'select', 'textarea'].includes(tag)) return;
const id = order[state.current];
const e = entryOf(id);
const kind = DOC.candidates[id].kind;
if (event.key === 'k' || event.key === 'K') update(() => { e.decision = 'keep'; e.same_as = null; });
else if (event.key === 'd' || event.key === 'D') update(() => { e.decision = kind === 'accepted' ? 'drop' : 'skip'; e.same_as = null; });
else if (event.key === 'ArrowRight' && state.current < order.length - 1) go(state.current + 1);
else if (event.key === 'ArrowLeft' && state.current > 0) go(state.current - 1);
});
render();
})();
</script>
</body>
</html>
+58
View File
@@ -0,0 +1,58 @@
"""Render REVIEW.html, the page a reviewer works in, and pick out role words for each group.
No clustering code, so the tests load it instantly. The page is one self-contained file:
the template (review_page.html) with the rules (review_page_logic.cjs) and the run's data
inlined, so it opens by double-clicking with no server and nothing installed.
"""
import collections, html, json, pathlib, re
import review_format as rf
HERE = pathlib.Path(__file__).resolve().parent
# People the summaries mention by role. Offered as click-to-fill words on the page, because
# naming the two people in a situation was the hardest part of the first review. A fixed list
# rather than anything clever: it only has to suggest, and the reviewer can type anything.
ROLE_WORDS = set("""
wife husband daughter son father mother uncle aunt nephew niece brother sister cousin friend
suitor fiance fiancee bride groom lover admirer rival sweetheart widow widower
boss employer employee clerk typist stenographer secretary partner manager foreman
cop policeman officer captain detective marshal judge lawyer
landlady landlord tenant lodger boarder roomer housekeeper
waiter waitress cook chef bartender proprietor owner shopkeeper storekeeper merchant salesman
saleslady shopgirl customer patron guest host servant maid butler chambermaid
driver cabby cabman coachman chauffeur
artist painter poet writer author editor reporter journalist actor actress singer dancer model
doctor nurse patient preacher teacher student professor
stranger neighbour neighbor visitor newcomer millionaire banker broker gambler thief crook
burglar tramp beggar vagrant panhandler worker girl woman man boy child
""".split())
def role_hints(members, limit=8):
"""The role words that turn up most in a group's summaries."""
counts = collections.Counter()
for m in members:
for word in re.findall(r"[a-z]+", m['summary'].lower()):
if word in ROLE_WORDS:
counts[word] += 1
return [word for word, _ in counts.most_common(limit)]
def page_data(document):
return {'run': document['run'], 'rules': rf.RULES, 'candidates': document['candidates']}
def render_page(document):
template = (HERE / 'review_page.html').read_text(encoding='utf-8')
logic = (HERE / 'review_page_logic.cjs').read_text(encoding='utf-8')
for marker in ('/*__LOGIC__*/', '/*__DATA__*/null', '__RUN_ID__'):
if marker not in template:
raise ValueError(f'review_page.html is missing the {marker} marker')
# Data inside a <script> must not be able to close it: a summary containing "</script>"
# would end the script early. Escaping "</" is enough and is still valid JSON.
data = json.dumps(page_data(document), ensure_ascii=False).replace('</', '<\\/')
logic = logic.replace('</script', '<\\/script')
return (template
.replace('/*__LOGIC__*/', logic)
.replace('/*__DATA__*/null', data)
.replace('__RUN_ID__', html.escape(document['run']['id'])))
@@ -0,0 +1,164 @@
// The rules behind REVIEW.html, with no page code in them.
//
// review_page.py inlines this file into the page; test_review_page.mjs loads it under Node.
// It mirrors review_format.py, which stays the authority: apply_review.py checks the saved
// file again. The page applies the rules as the reviewer goes, so a problem shows where it
// happens instead of as an error message at the end.
const ReviewLogic = (() => {
const SCHEMA_VERSION = 2;
const ALLOWED = {
accepted: ['keep', 'drop', 'same'],
borderline: ['skip', 'keep', 'same'],
};
const orderedIds = (doc) => Object.keys(doc.candidates);
const idsOfKind = (doc, kind) => orderedIds(doc).filter((id) => doc.candidates[id].kind === kind);
const allowedDecisions = (kind) => ALLOWED[kind] ?? [];
function displayName(doc, id) {
const kind = doc.candidates[id].kind;
const n = idsOfKind(doc, kind).indexOf(id) + 1;
return kind === 'accepted' ? `Group ${n}` : `Extra group ${n}`;
}
function shortName(doc, id) {
const kind = doc.candidates[id].kind;
const n = idsOfKind(doc, kind).indexOf(id) + 1;
return kind === 'accepted' ? String(n) : `+${n}`;
}
function blankEntry(id, kind) {
return {
id, decision: kind === 'accepted' ? null : 'skip', same_as: null,
actor: '', wants: '', counterpart: '', excluded: [],
};
}
const initialEntries = (doc) => orderedIds(doc).map((id) => blankEntry(id, doc.candidates[id].kind));
const entryOf = (entries, id) => entries.find((e) => e.id === id);
/** Groups this one could be marked the same as: every other group currently kept. */
const keptTargets = (doc, entries, id) =>
orderedIds(doc).filter((other) => other !== id && entryOf(entries, other)?.decision === 'keep');
/** The ticked scenes of a group, plus the ticked scenes of every group marked the same as it. */
function groupMembers(doc, entries, id) {
const sources = [id, ...entries.filter((e) => e.decision === 'same' && e.same_as === id).map((e) => e.id)];
const seen = new Set();
const members = [];
for (const source of sources) {
const entry = entryOf(entries, source);
const excluded = new Set(entry ? entry.excluded : []);
for (const m of doc.candidates[source].members) {
if (excluded.has(m.member) || seen.has(m.chunk)) continue;
seen.add(m.chunk);
members.push(m);
}
}
return members;
}
function shapeCheck(members, rules) {
const counts = new Map();
for (const m of members) counts.set(m.story, (counts.get(m.story) ?? 0) + 1);
const size = members.length;
const stories = counts.size;
const dominant = size ? Math.max(...counts.values()) / size : 0;
const pct = (x) => Math.round(x * 100);
const ok = size >= rules.minMembers && stories >= rules.minStories && dominant <= rules.maxDominant;
const text = ok
? `${size} scenes from ${stories} stories: enough for a situation.`
: `${size} scenes from ${stories} stories${dominant > rules.maxDominant ? `, ${pct(dominant)}% from one story` : ''}. ` +
`A situation needs at least ${rules.minMembers} scenes from at least ${rules.minStories} stories, ` +
`with no story over ${pct(rules.maxDominant)}%.`;
return { size, stories, dominant, ok, text };
}
const blank = (s) => (typeof s === 'string' && s.trim() ? s.trim() : '___');
const sentence = (entry) => `A ${blank(entry.actor)} wants ${blank(entry.wants)} from ${blank(entry.counterpart)}.`;
const named = (entry) => ['actor', 'wants', 'counterpart'].every((k) => typeof entry[k] === 'string' && entry[k].trim());
/** Where a group stands: todo, done, skipped or problem, with a sentence saying why. */
function status(doc, entries, id) {
const c = doc.candidates[id];
const e = entryOf(entries, id);
if (!e || e.decision === null) return { state: 'todo', message: 'Not decided yet.' };
if (e.decision === 'skip') return { state: 'skipped', message: 'Optional: left out.' };
if (e.decision === 'drop') return { state: 'done', message: 'Dropped.' };
if (e.decision === 'same') {
const target = entryOf(entries, e.same_as);
if (!target || target.decision !== 'keep') {
return { state: 'problem', message: `Marked the same as ${e.same_as ? displayName(doc, e.same_as) : 'another group'}, which is not kept.` };
}
return { state: 'done', message: `Same as ${displayName(doc, e.same_as)}.` };
}
if (e.decision === 'keep') {
if (!named(e)) return { state: 'problem', message: 'Kept, but the name is not finished.' };
const shape = shapeCheck(groupMembers(doc, entries, id), doc.rules);
if (!shape.ok) return { state: 'problem', message: shape.text };
return { state: 'done', message: `Kept: ${sentence(e)}` };
}
return { state: 'problem', message: `Unknown decision for a ${c.kind} group.` };
}
function progress(doc, entries) {
const accepted = idsOfKind(doc, 'accepted');
return {
total: accepted.length,
decided: accepted.filter((id) => entryOf(entries, id)?.decision !== null).length,
problems: orderedIds(doc).filter((id) => status(doc, entries, id).state === 'problem').length,
};
}
function toReviewFile(doc, entries, savedAt) {
return {
schema_version: SCHEMA_VERSION,
run: doc.run.id,
fingerprint: doc.run.fingerprint ?? null,
saved_at: savedAt,
entries: entries.map((e) => ({ ...e, excluded: [...e.excluded] })),
};
}
/** Read a saved review back, repairing anything that does not fit this run rather than failing. */
function fromReviewFile(doc, data) {
if (!data || typeof data !== 'object') return { error: 'That is not a review file.' };
if (data.schema_version !== SCHEMA_VERSION) {
return { error: 'That review file was made by a different version of the review tool.' };
}
if (data.run !== doc.run.id) return { error: `That review file is for run ${data.run}, not ${doc.run.id}.` };
if (doc.run.fingerprint && data.fingerprint && data.fingerprint !== doc.run.fingerprint) {
return { error: 'That review file was made for a different set of groups with the same run name.' };
}
const stored = new Map((Array.isArray(data.entries) ? data.entries : [])
.filter((x) => x && typeof x === 'object').map((x) => [x.id, x]));
const max = doc.rules.maxFieldChars;
const text = (v) => (typeof v === 'string' ? v.slice(0, max) : '');
const entries = orderedIds(doc).map((id) => {
const kind = doc.candidates[id].kind;
const base = blankEntry(id, kind);
const s = stored.get(id);
if (!s) return base;
const valid = new Set(doc.candidates[id].members.map((m) => m.member));
const decisionOk = allowedDecisions(kind).includes(s.decision) || (kind === 'accepted' && s.decision === null);
return {
id,
decision: decisionOk ? s.decision : base.decision,
same_as: typeof s.same_as === 'string' && s.same_as in doc.candidates && s.same_as !== id ? s.same_as : null,
actor: text(s.actor),
wants: text(s.wants),
counterpart: text(s.counterpart),
excluded: [...new Set(Array.isArray(s.excluded) ? s.excluded.filter((x) => valid.has(x)) : [])],
};
});
return { entries };
}
return {
SCHEMA_VERSION, orderedIds, allowedDecisions, displayName, shortName, blankEntry, initialEntries,
keptTargets, groupMembers, shapeCheck, sentence, status, progress, toReviewFile, fromReviewFile,
};
})();
if (typeof module !== 'undefined') module.exports = ReviewLogic;
+11 -2
View File
@@ -7,7 +7,15 @@ involved -- this is the segmentation step we get for free.
import re, json, sys, pathlib
ROMAN = re.compile(r'^\s*[IVXLC]+\.\s+')
CAPS = re.compile(r'^[ \t]*([A-Z0-9][A-Z0-9 ,.;:\'\"\-’‘“”!?&()À-ÖØ-Þ]{3,70})[ \t]*$')
CAPS = re.compile(r'^[ \t]*([A-Z0-9"“‘][A-Z0-9 ,.;:\'\"\-—’‘“”!?&()À-ÖØ-Þ]{3,70})[ \t]*$')
# A title may be quoted ("LITTLE SPECK IN GARNERED FRUIT"), and a contents entry may carry a subtitle
# after a dash that the heading does not (“THE GUILTY PARTY”—AN EAST SIDE TRAGEDY). v1 handled
# neither and silently merged three stories into the story before them. The title is what comes
# before the dash, without quotes.
QUOTES = '"“”‘’\''
def title_of(line):
return CAPS.match(line).group(1).split('—')[0].strip().strip(QUOTES).strip()
def strip_boilerplate(text):
i = text.find('*** START')
@@ -25,7 +33,8 @@ def split_volume(path):
# Two volumes number their contents (" I. THE VOICE OF THE CITY") while the
# body heading is the bare title, so strip the numeral before matching.
lines = [ROMAN.sub('', l) for l in lines]
caps_idx = [(n, CAPS.match(l).group(1).strip()) for n, l in enumerate(lines) if CAPS.match(l)]
caps_idx = [(n, title_of(l)) for n, l in enumerate(lines) if CAPS.match(l)]
caps_idx = [(n, t) for n, t in caps_idx if len(t) >= 4]
if not caps_idx:
return volume, []
+26 -1
View File
@@ -31,11 +31,36 @@ for c in chunks:
NAMES = {w for w, n in cap.items() if n >= 2 and low[w.lower()] <= n * 0.1 and w != 'I'}
def is_name(base, first):
if not base or not base[0].isupper() or base == 'I': return False
if not base or not base[0].isupper() or base == 'I' or base in NOT_NAMES: return False
if base in NAMES: return True
return not first and low[base.lower()] == 0
# Every story is set in New York, and its places are capitalised and never lower-case, so the
# lexicon took them for people ("New someone"). They become "the city" before names are looked for.
PLACES = re.compile(r"\b(the )?(?:New York(?: City)?|Manhattan|Broadway|Brooklyn|Harlem|Bowery|"
r"Coney Island|New Jersey|Jersey City|Madison Square(?: Garden)?|Union Square|"
r"Central Park|Fifth Avenue|Wall Street)(ers?)?(['’]s)?\b(?=\s+[\"“‘]?([a-z][a-z-]*))?")
# After a place, these words mean it was not used as an adjective ("to New York to find", "New York is").
NOT_ADJECTIVAL = set("""to and or but is was are were has had where with for in on at as by from of that which
who while after before when than the a an his her their again itself""".split())
def _place(m):
article, dweller, possessive, following = m.group(1), m.group(2), m.group(3), m.group(4)
if dweller: # "a New Yorker", "New Yorkers"
return (article or '') + ('city dwellers' if dweller == 'ers' else 'city dweller') + (possessive or '')
if possessive: # "New York's soul"
return "the city's"
if following and following not in NOT_ADJECTIVAL:
return (article or '') + 'city' # "a New York girl", "the hidden Broadway hotel"
return 'the city' # "to New York", "the Bowery"
# Capitalised, never lower-case, and not people.
NOT_NAMES = {'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday',
'Christmas', 'Thanksgiving', 'Easter'}
NAMES -= NOT_NAMES
def clean(summary):
summary = PLACES.sub(_place, summary)
out, removed, prev_name = [], [], False
for i, w in enumerate(summary.split()):
head = w[:len(w) - len(w.lstrip(LEAD))]
+124 -90
View File
@@ -1,138 +1,172 @@
"""Tests for the review form's checks and conversion.
"""Tests for the saved review's checks, the page renderer, and apply_review.py.
python3 -m unittest test_review
"""
import copy, json, pathlib, subprocess, sys, tempfile, unittest
import json, os, pathlib, subprocess, sys, tempfile, unittest
import review_format as rf
import review_page
HERE = pathlib.Path(__file__).resolve().parent
def candidate(cid, kind, stories):
"""A synthetic candidate whose n-th scene comes from stories[n]."""
return {'kind': kind, 'stats': {}, 'gate_failures': [], 'most_similar': {'id': None, 'cosine': 0.0},
'members': [{'member': rf.member_id(cid, n + 1), 'chunk': hash((cid, n)) % 100000, 'story': s,
'title': f'STORY {s}', 'summary': f'{cid} scene {n + 1}'} for n, s in enumerate(stories)]}
def group(cid, kind, stories):
"""A synthetic group whose n-th scene comes from stories[n]."""
return {'kind': kind, 'stats': {'stories': len(set(stories))}, 'gate_failures': [], 'role_hints': [],
'members': [{'member': rf.member_id(cid, n + 1), 'chunk': abs(hash((cid, n))) % 100000, 'story': s,
'title': f'Story {s}', 'summary': f'{cid} scene {n + 1}'} for n, s in enumerate(stories)]}
def fixture():
return {'schema_version': rf.SCHEMA_VERSION,
'run': {'id': 'k60-s99'},
'candidates': {'C01': candidate('C01', 'accepted', [1, 2, 3, 4, 5, 6, 7, 8]),
'C02': candidate('C02', 'accepted', [9, 10, 11, 12, 13, 14]),
'B01': candidate('B01', 'borderline', [1, 3, 5, 7, 9, 11, 13])}}
'run': {'id': 'k60-s99', 'fingerprint': 'abc123', 'scenes': 21, 'stories': 13},
'candidates': {'C01': group('C01', 'accepted', [1, 2, 3, 4, 5, 6, 7, 8]),
'C02': group('C02', 'accepted', [9, 10, 11, 12, 13, 14]),
'B01': group('B01', 'borderline', [1, 3, 5, 7, 9, 11, 13])}}
def filled(cands):
form = rf.blank_form(cands)
e = {x['id']: x for x in form['entries']}
e['C01'].update(decision='accept', situation='A lodger wants more time from a landlady who wants the rent.',
actor='a lodger', counterpart='a landlady', stakes='the room', exclude=['C01.02'])
e['C02'].update(decision='merge', merge_into='C01')
return form, e
def blank_review(cands):
return {'schema_version': rf.SCHEMA_VERSION, 'run': cands['run']['id'], 'fingerprint': cands['run']['fingerprint'],
'entries': [rf.blank_entry(cid, c['kind']) for cid, c in cands['candidates'].items()]}
class ReviewFormTests(unittest.TestCase):
def test_blank_form_requires_decisions_only_for_accepted(self):
def finished(cands):
review = blank_review(cands)
e = {x['id']: x for x in review['entries']}
e['C01'].update(decision='keep', actor='lodger', wants='more time to pay', counterpart='a landlady',
excluded=['C01.02'])
e['C02'].update(decision='same', same_as='C01')
return review, e
class ReviewChecks(unittest.TestCase):
def test_a_blank_review_asks_only_for_the_required_groups(self):
cands = fixture()
errors, _, result = rf.validate(cands, rf.blank_form(cands))
errors, _, result = rf.validate(cands, blank_review(cands))
self.assertIsNone(result)
self.assertTrue(any(err.startswith('C01: no decision') for err in errors))
self.assertTrue(any(err.startswith('C02: no decision') for err in errors))
self.assertFalse(any(err.startswith('B01') for err in errors))
self.assertTrue(any(err.startswith('Group 1: not decided yet') for err in errors), errors)
self.assertTrue(any(err.startswith('Group 2: not decided yet') for err in errors), errors)
self.assertFalse(any('Extra group' in err for err in errors))
def test_valid_form_merges_and_excludes(self):
def test_a_finished_review_merges_and_leaves_out_unticked_scenes(self):
cands = fixture()
form, _ = filled(cands)
errors, warnings, result = rf.validate(cands, form)
review, _ = finished(cands)
errors, _, result = rf.validate(cands, review)
self.assertEqual(errors, [])
self.assertEqual(len(result['situations']), 1)
s = result['situations'][0]
self.assertEqual(s['situation'], 'A lodger wants more time to pay from a landlady.')
self.assertEqual(s['from'], ['C01', 'C02'])
self.assertEqual(s['size'], 8 - 1 + 6)
self.assertNotIn('C01.02', [m['member'] for m in s['members']])
self.assertEqual(result['skipped'], ['B01'])
self.assertEqual(result['counts']['merged'], 1)
self.assertEqual(result['left_out'], ['B01'])
def test_accept_needs_situation_and_roles(self):
def test_a_kept_group_must_be_named(self):
cands = fixture()
form, e = filled(cands)
e['C01']['actor'] = ' '
errors, _, result = rf.validate(cands, form)
review, e = finished(cands)
e['C01']['wants'] = ' '
errors, _, _ = rf.validate(cands, review)
self.assertTrue(any('Group 1: kept, but its name is not finished' in err and 'what they want' in err
for err in errors), errors)
def test_same_as_a_group_that_is_not_kept(self):
cands = fixture()
review, e = finished(cands)
e['C01']['decision'] = 'drop'
errors, _, _ = rf.validate(cands, review)
self.assertTrue(any(err.startswith('Group 2: marked the same as Group 1, but Group 1 is not kept')
for err in errors), errors)
def test_too_few_ticked_scenes_are_refused_with_what_to_do(self):
cands = fixture()
review, e = finished(cands)
e['C02'].update(decision='keep', same_as=None, actor='clerk', wants='a raise', counterpart='an employer',
excluded=['C02.01', 'C02.02', 'C02.03'])
errors, _, result = rf.validate(cands, review)
self.assertIsNone(result)
self.assertIn('C01: accepted, so "actor" must be filled in.', errors)
self.assertTrue(any(err.startswith('Group 2: 3 ticked scenes from 3 stories') and 'Tick more scenes' in err
for err in errors), errors)
def test_unknown_excluded_scene_is_named(self):
def test_an_older_review_file_is_explained(self):
cands = fixture()
form, e = filled(cands)
e['C01']['exclude'] = ['C01.02', 'C02.01', 'C01.99']
errors, _, _ = rf.validate(cands, form)
self.assertTrue(any('C02.01, C01.99' in err and 'C01.01 to C01.08' in err for err in errors), errors)
review, _ = finished(cands)
review['schema_version'] = 1
errors, _, _ = rf.validate(cands, review)
self.assertEqual(len(errors), 1)
self.assertIn('different version of the review tool', errors[0])
def test_merge_target_must_be_accepted(self):
def test_a_review_for_different_groups_is_refused(self):
cands = fixture()
form, e = filled(cands)
e['C01']['decision'] = 'reject'
errors, _, _ = rf.validate(cands, form)
self.assertTrue(any(err.startswith('C02: merges into C01') for err in errors), errors)
review, _ = finished(cands)
review['fingerprint'] = 'zzz999'
errors, _, _ = rf.validate(cands, review)
self.assertTrue(any('different set of groups' in err for err in errors), errors)
def test_exclusions_that_leave_too_few_stories_are_refused(self):
def test_an_extra_group_cannot_be_dropped_only_left_out(self):
cands = fixture()
form, e = filled(cands)
e['C02'].update(decision='accept', merge_into=None, situation='A clerk wants a raise.',
actor='a clerk', counterpart='an employer',
exclude=['C02.01', 'C02.02', 'C02.03'])
errors, _, result = rf.validate(cands, form)
self.assertIsNone(result)
self.assertTrue(any(err.startswith('C02: after exclusions 3 scenes remain from 3 stories') for err in errors), errors)
review, e = finished(cands)
e['B01']['decision'] = 'drop'
errors, _, _ = rf.validate(cands, review)
self.assertTrue(any(err.startswith('Extra group 1') for err in errors), errors)
def test_borderline_cannot_be_rejected_explicitly(self):
class PageRendering(unittest.TestCase):
def test_the_page_embeds_everything_and_nothing_can_close_its_scripts_early(self):
cands = fixture()
form, e = filled(cands)
e['B01']['decision'] = 'reject'
errors, _, _ = rf.validate(cands, form)
self.assertTrue(any(err.startswith('B01: "decision" is \'reject\'') for err in errors), errors)
cands['candidates']['C01']['members'][0]['summary'] = 'A trap </script><b>bold</b>'
page = review_page.render_page(cands)
self.assertNotIn('/*__DATA__*/', page)
self.assertNotIn('/*__LOGIC__*/', page)
self.assertNotIn('__RUN_ID__', page)
self.assertEqual(page.count('</script>'), 2, 'only the two real script tags may close')
self.assertIn('Situation review · k60-s99', page)
def test_form_from_another_run_is_refused(self):
cands = fixture()
form, _ = filled(cands)
form['run'] = 'k60-s24'
errors, _, _ = rf.validate(cands, form)
self.assertTrue(any('This form is for run' in err for err in errors))
def test_role_words_are_suggested_from_the_scenes(self):
members = [{'summary': 'A lodger begs the landlady for time.'},
{'summary': 'The landlady turns a lodger out.'},
{'summary': 'Someone hides from the landlady.'}]
self.assertEqual(review_page.role_hints(members)[:2], ['landlady', 'lodger'])
def test_every_problem_is_reported_at_once(self):
cands = fixture()
form, e = filled(cands)
e['C01']['situation'] = ''
e['C02']['merge_into'] = 'C77'
errors, _, _ = rf.validate(cands, form)
self.assertEqual(len(errors), 2, errors)
def test_apply_review_writes_nothing_until_the_form_passes(self):
class ApplyReview(unittest.TestCase):
def run_apply(self, run_dir, *extra, downloads):
env = dict(os.environ, STP_DOWNLOADS=str(downloads))
return subprocess.run([sys.executable, 'apply_review.py', str(run_dir), *extra], cwd=HERE,
capture_output=True, text=True, env=env)
def test_it_finds_the_saved_review_in_downloads_and_writes_nothing_until_it_passes(self):
cands = fixture()
with tempfile.TemporaryDirectory() as tmp:
run = pathlib.Path(tmp)
(run / 'candidates.json').write_text(json.dumps(cands))
(run / 'review.json').write_text(json.dumps(rf.blank_form(cands)))
here = pathlib.Path(__file__).resolve().parent
bad = subprocess.run([sys.executable, 'apply_review.py', str(run)], cwd=here, capture_output=True, text=True)
self.assertEqual(bad.returncode, 1)
self.assertFalse((run / 'situations.json').exists())
form, _ = filled(cands)
(run / 'review.json').write_text(json.dumps(form))
good = subprocess.run([sys.executable, 'apply_review.py', str(run)], cwd=here, capture_output=True, text=True)
self.assertEqual(good.returncode, 0, good.stdout + good.stderr)
written = json.loads((run / 'situations.json').read_text())
run_dir, downloads = pathlib.Path(tmp, 'run'), pathlib.Path(tmp, 'Downloads')
run_dir.mkdir(); downloads.mkdir()
(run_dir / 'candidates.json').write_text(json.dumps(cands))
nothing = self.run_apply(run_dir, downloads=downloads)
self.assertEqual(nothing.returncode, 1)
self.assertIn('No saved review found', nothing.stdout)
(downloads / 'review-k60-s99.json').write_text(json.dumps(blank_review(cands)))
unfinished = self.run_apply(run_dir, downloads=downloads)
self.assertEqual(unfinished.returncode, 1)
self.assertIn('The review is not finished', unfinished.stdout)
self.assertFalse((run_dir / 'situations.json').exists())
review, _ = finished(cands)
(downloads / 'review-k60-s99 (1).json').write_text(json.dumps(review))
done = self.run_apply(run_dir, downloads=downloads)
self.assertEqual(done.returncode, 0, done.stdout + done.stderr)
self.assertIn('review-k60-s99 (1).json', done.stdout, 'the newest save is the one read')
written = json.loads((run_dir / 'situations.json').read_text())
self.assertEqual(written['situations'][0]['from'], ['C01', 'C02'])
def test_malformed_json_is_explained(self):
def test_a_damaged_file_is_explained(self):
cands = fixture()
with tempfile.TemporaryDirectory() as tmp:
run = pathlib.Path(tmp)
(run / 'candidates.json').write_text(json.dumps(cands))
(run / 'review.json').write_text('{"entries": [ {"id": "C01",} ]}')
here = pathlib.Path(__file__).resolve().parent
r = subprocess.run([sys.executable, 'apply_review.py', str(run)], cwd=here, capture_output=True, text=True)
run_dir = pathlib.Path(tmp)
(run_dir / 'candidates.json').write_text(json.dumps(cands))
(run_dir / 'review-k60-s99.json').write_text('{"entries": [ {"id": "C01",} ]}')
r = self.run_apply(run_dir, downloads=pathlib.Path(tmp, 'none'))
self.assertEqual(r.returncode, 1)
self.assertIn('is not valid JSON: line 1', r.stdout)
self.assertIn('damaged', r.stdout)
if __name__ == '__main__':
@@ -0,0 +1,132 @@
// Tests for the rules behind REVIEW.html.
//
// node --test test_review_page.mjs
//
// The page's drawing code needs a browser and is not tested here; these cover every decision
// the page makes about a group, and saving and loading a review file.
import { test } from 'node:test';
import assert from 'node:assert/strict';
import { createRequire } from 'node:module';
const require = createRequire(import.meta.url);
const L = require('./review_page_logic.cjs');
const RULES = { minMembers: 5, minStories: 4, maxDominant: 0.4, maxFieldChars: 80 };
function group(id, kind, stories) {
return {
kind, stats: { stories: new Set(stories).size }, gate_failures: [], role_hints: [],
members: stories.map((story, n) => ({
member: `${id}.${String(n + 1).padStart(2, '0')}`, chunk: `${id}-${n}`, story,
title: `Story ${story}`, summary: `${id} scene ${n + 1}`,
})),
};
}
function doc() {
return {
run: { id: 'k60-s99', fingerprint: 'abc123', scenes: 21, stories: 13 },
rules: RULES,
candidates: {
C01: group('C01', 'accepted', [1, 2, 3, 4, 5, 6, 7, 8]),
C02: group('C02', 'accepted', [9, 10, 11, 12, 13, 14]),
B01: group('B01', 'borderline', [1, 3, 5, 7, 9, 11, 13]),
},
};
}
const find = (entries, id) => entries.find((e) => e.id === id);
test('groups are named the way a reviewer reads them', () => {
const d = doc();
assert.equal(L.displayName(d, 'C02'), 'Group 2');
assert.equal(L.displayName(d, 'B01'), 'Extra group 1');
assert.equal(L.shortName(d, 'B01'), '+1');
});
test('a group goes from not decided, to kept but unnamed, to done', () => {
const d = doc();
const entries = L.initialEntries(d);
assert.equal(L.status(d, entries, 'C01').state, 'todo');
assert.equal(L.status(d, entries, 'B01').state, 'skipped', 'extras start left out');
find(entries, 'C01').decision = 'keep';
assert.equal(L.status(d, entries, 'C01').state, 'problem');
assert.match(L.status(d, entries, 'C01').message, /name is not finished/);
Object.assign(find(entries, 'C01'), { actor: 'lodger', wants: 'more time', counterpart: 'a landlady' });
assert.equal(L.status(d, entries, 'C01').state, 'done');
assert.equal(L.sentence(find(entries, 'C01')), 'A lodger wants more time from a landlady.');
});
test('unticking too much is flagged as it happens, with what a situation needs', () => {
const d = doc();
const entries = L.initialEntries(d);
Object.assign(find(entries, 'C02'), {
decision: 'keep', actor: 'clerk', wants: 'a raise', counterpart: 'an employer',
excluded: ['C02.01'],
});
assert.equal(L.status(d, entries, 'C02').state, 'done', 'five scenes from five stories is enough');
find(entries, 'C02').excluded.push('C02.02', 'C02.03');
const s = L.status(d, entries, 'C02');
assert.equal(s.state, 'problem');
assert.match(s.message, /3 scenes from 3 stories\. A situation needs at least 5 scenes/);
});
test('same-as offers only kept groups, merges scenes, and breaks if the target is dropped', () => {
const d = doc();
const entries = L.initialEntries(d);
assert.deepEqual(L.keptTargets(d, entries, 'C02'), [], 'nothing to merge into yet');
Object.assign(find(entries, 'C01'), { decision: 'keep', actor: 'lodger', wants: 'time', counterpart: 'a landlady' });
assert.deepEqual(L.keptTargets(d, entries, 'C02'), ['C01']);
assert.deepEqual(L.keptTargets(d, entries, 'C01'), [], 'never itself');
Object.assign(find(entries, 'C02'), { decision: 'same', same_as: 'C01' });
assert.equal(L.groupMembers(d, entries, 'C01').length, 14);
assert.equal(L.status(d, entries, 'C02').state, 'done');
find(entries, 'C01').decision = 'drop';
assert.equal(L.status(d, entries, 'C02').state, 'problem');
});
test('progress counts required groups only', () => {
const d = doc();
const entries = L.initialEntries(d);
find(entries, 'C01').decision = 'drop';
assert.deepEqual(L.progress(d, entries), { total: 2, decided: 1, problems: 0 });
});
test('a saved review loads back exactly', () => {
const d = doc();
const entries = L.initialEntries(d);
Object.assign(find(entries, 'C01'), { decision: 'keep', actor: 'lodger', wants: 'time', counterpart: 'a landlady', excluded: ['C01.03'] });
const file = JSON.parse(JSON.stringify(L.toReviewFile(d, entries, '2026-09-15T12:00:00Z')));
assert.equal(file.schema_version, 2);
assert.equal(file.fingerprint, 'abc123');
assert.deepEqual(L.fromReviewFile(d, file).entries, entries);
});
test('loading repairs what does not fit, and refuses the wrong run', () => {
const d = doc();
const repaired = L.fromReviewFile(d, {
schema_version: 2, run: 'k60-s99', fingerprint: 'abc123',
entries: [
{ id: 'C01', decision: 'maybe', excluded: ['C01.02', 'C99.01', 'C01.02'], actor: 'x'.repeat(200) },
{ id: 'B01', decision: 'drop' },
{ id: 'ZZZ', decision: 'keep' },
],
});
const c01 = find(repaired.entries, 'C01');
assert.equal(c01.decision, null, 'an unknown decision becomes undecided');
assert.deepEqual(c01.excluded, ['C01.02'], 'unknown and repeated scenes are dropped');
assert.equal(c01.actor.length, 80);
assert.equal(find(repaired.entries, 'B01').decision, 'skip', 'an extra cannot be dropped');
assert.equal(repaired.entries.length, 3);
assert.match(L.fromReviewFile(d, { schema_version: 2, run: 'k60-s24', entries: [] }).error, /for run k60-s24/);
assert.match(L.fromReviewFile(d, { schema_version: 1, run: 'k60-s99' }).error, /different version/);
assert.match(L.fromReviewFile(d, { schema_version: 2, run: 'k60-s99', fingerprint: 'nope', entries: [] }).error,
/different set of groups/);
});
@@ -0,0 +1,6 @@
seed 11: 40 candidate groups, median top topic-word share 16%
seed 12: 41 candidate groups, median top topic-word share 20%
seed 13: 42 candidate groups, median top topic-word share 22%
summary_embeddings.json: median over seeds 20%, candidate groups 41
most topic-bound groups at seed 11: wife 47% of 15, dinner 47% of 15, policeman 40% of 15, policeman 38% of 16, brother 38% of 8, artist 36% of 11, dinner 33% of 15, dinner 32% of 22
+47
View File
@@ -0,0 +1,47 @@
"""How much groups are held together by a topic word rather than a predicament.
python3 topic_share.py summary_embeddings.json # baseline: groups of scene summaries
python3 topic_share.py predicament_embeddings.json # groups of re-described predicaments
Clusters the given embeddings at k = 60 (seeds 11, 12, 13). For each candidate group (at least 5
scenes, at least 4 stories, no story over 40%), finds the job, relationship or place word most
common in the group's ORIGINAL scene summaries, and the share of its scenes that contain it. The
first human review read groups that were artists, police, courtship and hotels: that is this
number being high. Reported as the median over groups, then the median over seeds.
No inference.
"""
import collections, json, pathlib, re, statistics, sys
from topic_words import TOPIC_WORDS
path = sys.argv[1] if len(sys.argv) > 1 else 'summary_embeddings.json'
sys.argv = ['measure.py', path]
exec(pathlib.Path(__file__).with_name('measure.py').read_text(encoding='utf-8').split("print(f'{path.name}")[0])
# now defined: chunks, V, n, story, kmeans, describe, MIN_SIZE, MIN_STORIES, MAX_DOMINANT
original = {x['chunk']: x['summary'] for x in
json.loads(pathlib.Path('summaries_clean.json').read_text(encoding='utf-8'))['summaries']}
words = {i: set(re.findall(r"[a-zé]+", original.get(i, '').lower())) & TOPIC_WORDS for i in range(n)}
K, SEEDS = 60, (11, 12, 13)
per_seed, examples = [], []
for seed in SEEDS:
shares = []
for group in kmeans(K, seed):
size, nst, dom, _ = describe(group)
if size < MIN_SIZE or nst < MIN_STORIES or dom > MAX_DOMINANT:
continue
counts = collections.Counter(w for i in group for w in words[i])
if counts:
word, hits = counts.most_common(1)[0]
else:
word, hits = '-', 0
shares.append(hits / size)
if seed == SEEDS[0]:
examples.append((hits / size, word, size))
per_seed.append((len(shares), statistics.median(shares) if shares else 0.0))
print(f'seed {seed}: {len(shares)} candidate groups, median top topic-word share {per_seed[-1][1]:.0%}', flush=True)
print(f'\n{pathlib.Path(path).name}: median over seeds {statistics.median(s for _, s in per_seed):.0%}, '
f'candidate groups {statistics.median(c for c, _ in per_seed):.0f}')
print('most topic-bound groups at seed 11:', ', '.join(f'{w} {s:.0%} of {z}' for s, w, z in sorted(examples, reverse=True)[:8]))
+21
View File
@@ -0,0 +1,21 @@
"""Words that tie a scene to a topic: who is in it and where it happens.
The first human review found the summary groups were topics (artists, police, courtship,
hotels) rather than situations. These words are how that is measured, and how leakage into
re-described predicaments is caught. A fixed list: it only has to catch the common cases.
"""
from review_page import ROLE_WORDS
PLACE_WORDS = set("""
hotel restaurant cafe café saloon bar store shop office park street square church theatre theater
stage farm ranch camp mine court courtroom jail cell station train boat ship ferry house room flat
apartment tenement boardinghouse mansion factory laundry bakery kitchen table dinner lunch breakfast
party wedding ball club casino studio gallery magazine newspaper bank
""".split())
# Words for a person with no role at all. "A man" is not a topic; the first baseline had a group
# scored 90% topic-bound for saying "man", so these are left out of the measure (still offered as
# role hints on the review page). Fixed before any predicament was generated.
GENERIC_PEOPLE = {'man', 'woman', 'girl', 'boy', 'child', 'worker', 'stranger', 'friend'}
TOPIC_WORDS = (ROLE_WORDS - GENERIC_PEOPLE) | PLACE_WORDS
File diff suppressed because one or more lines are too long
@@ -0,0 +1,189 @@
"""Claude's hand grouping: each scene gets at most one situation code (primary reading).
Written by reading all 839 predicaments/summaries in order; no embeddings, no clustering."""
A = 'pose'; B = 'station'; C = 'sacrifice'; D = 'benefactor'; E = 'easy_money'; F = 'taken_for_granted'
G = 'appearances'; H = 'strings'; I = 'price'; J = 'rival'; K = 'newcomer'; L = 'homecoming'
M = 'sign'; N = 'loyalty'; O = 'despised'; P = 'honest_work'; Q = 'habit'; R = 'unspoken'
U = 'overlooked'; V = 'patron'
ASSIGN = {
# 1 John Hopkins
9: F,
# 2 Lickpenny Lover
16: B, 17: B, 18: B, 19: B, 20: B, 21: B, 22: B,
# 3 Dougherty
24: F, 25: F, 26: F, 27: F, 28: F, 29: F,
# 5 Harbinger
42: F, 43: F,
# 6 While the Auto Waits
45: A, 46: A, 47: A, 48: A, 49: A, 50: A,
# 7 Comedy in Rubber
57: Q,
# 8 One Thousand Dollars
58: H, 62: C, 63: C, 64: H,
# 9 Defeat of the City
65: K, 66: B, 67: B, 68: B, 69: B, 70: B, 71: B, 72: B, 73: B,
# 10 Shocks of Doom
74: H, 80: H, 81: H,
# 11 Plutonian Fire
82: P, 83: K, 85: P, 86: P, 87: P, 88: P, 89: P,
# 13 Squaring the Circle
97: K, 100: K, 101: K, 102: K,
# 14 Roses, Ruses
107: M, 108: M, 109: M,
# 15 City of Dreadful Night
110: D, 111: D, 112: D, 113: D, 116: D,
# 16 Easter of the Soul
121: R, 122: R,
# 17 Fool-Killer
125: H, 126: H, 127: H, 128: H, 129: H, 131: H, 132: H, 133: H,
# 18 Transients in Arcadia
135: A, 136: A, 137: A, 138: A, 139: A, 140: A,
# 19 Rathskeller and the Rose
142: A, 143: A, 144: L, 145: L, 146: L, 147: L,
# 20 Clarion Call
148: N, 149: N, 150: N, 151: N, 152: N, 156: N,
# 21 Extradited from Bohemia
157: K, 158: K, 160: K, 161: K, 164: L,
# 22 Philistine in Bohemia
166: B, 167: B, 168: B, 169: B, 170: B, 171: B,
# 23 From Each According
176: O, 177: V, 178: O,
# 24 Memento
182: I, 184: I, 185: I, 186: A, 187: A, 188: A, 189: A, 190: A,
# 25 Strictly Business
196: R, 197: R, 202: R, 205: R, 206: R,
# 26 Gold that Glittered
210: E, 211: E, 212: E, 213: E, 214: E, 215: E, 216: E,
# 27 Babes in the Jungle
219: E, 220: E, 221: E, 222: E, 223: E, 224: E, 225: E,
# 28 Day Resurgent
227: F, 228: F, 232: F, 233: F,
# 29 Fifth Wheel
234: D, 242: E, 243: E, 244: G, 245: L, 246: O, 247: L,
# 30 Poet and Peasant
249: P, 250: G, 251: G, 252: G, 253: G, 254: G, 255: E, 256: P,
# 32 Girl and the Graft
266: E, 267: E, 268: E, 269: E, 270: E,
# 33 Call of the Tame
271: K, 272: L, 273: K, 274: K, 275: K, 276: K, 277: K,
# 34a Unknown Quantity
280: D, 281: D, 283: D, 284: B,
# 34b The Thing's the Play (merged into story 34 by the splitter)
287: G, 288: G, 292: J, 293: J,
# 35 Ramble in Aphasia
301: A, 305: A, 307: A,
# 36 Municipal Report
318: C, 319: I, 324: C, 326: I, 327: C, 329: N,
# 37 Psyche and the Pskyscraper
331: J, 332: J, 333: J, 334: J, 335: J, 336: J, 337: J,
# 38 Bird of Bagdad
339: D, 340: D, 341: D, 342: D, 345: D, 346: D,
# 39 Compliments of the Season
350: O, 351: E, 352: O, 353: E, 354: O, 356: O, 357: O, 358: O,
# 40 Night in New Arabia
359: D, 361: D, 362: D, 363: D, 364: D, 365: D, 366: B, 367: B, 368: B, 369: B, 370: B,
371: D, 372: D, 373: B, 374: B,
# 41 Girl and the Habit
381: B, 382: B, 383: Q,
# 42 Proof of the Pudding
386: P, 387: P, 388: P, 389: P, 390: P, 391: P,
# 43 Past One at Rooney's
402: A, 403: A, 404: A, 406: A, 410: A, 411: A, 412: A,
# 45 The Duel
429: K, 430: K, 431: K, 432: K, 433: K, 434: K, 435: K,
# 46 What You Want
436: D, 437: D, 440: D, 441: D,
# 47 Tobin's Palm
444: M, 445: M, 446: M, 447: M, 449: M, 453: M,
# 48 Gift of the Magi
454: C, 455: C, 456: C, 457: C, 458: C, 460: C, 461: C,
# 49 Cosmopolite in a Cafe
466: K, 467: K, 468: K, 469: K,
# 50 Between Rounds
470: F, 471: F, 475: F, 476: F, 477: F,
# 51 Skylight Room
479: I, 483: I,
# 52 Service of Love
488: C, 489: C, 490: C, 491: C, 492: C,
# 53 Coming-out of Maggie
493: U, 494: A, 495: A, 496: J, 497: J, 498: J, 501: A,
# 55 Cop and the Anthem
509: D,
# 56 Adjustment of Nature
519: J, 520: J, 521: J, 522: J, 523: J,
# 57 Yellow Dog
525: F, 526: F, 527: F, 528: F, 529: F, 530: F,
# 58 Love-Philtre
532: J, 533: J, 534: J, 535: J, 536: J,
# 59 Mammon and the Archer
540: R, 542: R, 543: R, 544: D,
# 60 Springtime a la Carte
546: I,
# 61 Green Door
556: M, 557: M, 558: M, 559: I, 560: I, 562: M,
# 63 Unfinished Story
570: I, 571: I, 572: I, 573: I, 574: I, 575: I, 576: I,
# 64 Caliph, Cupid and the Clock
578: D, 579: D, 580: D, 582: M, 583: O, 584: M,
# 65 Sisters of the Golden Circle
590: G, 591: G,
# 66 Busy Broker
593: F, 597: F,
# 67 After Twenty Years
598: N, 599: N, 600: N, 601: N, 602: N,
# 68 Lost on Dress Parade
603: A, 604: A, 605: A, 606: A, 607: A, 608: A, 609: A, 610: A,
# 69 By Courier
612: G, 614: G, 615: G, 616: G,
# 71 Tildy
627: U, 628: U, 629: U, 630: U, 631: U, 632: U,
# 72 Trimmed Lamp
635: B, 637: A, 640: B, 641: B, 643: B, 646: B, 647: B,
# 73 Madison Square Arabian Night
648: G, 649: D, 650: D, 651: D, 652: D, 653: P, 654: G, 655: G, 656: G,
# 74 Rubaiyat
657: Q, 658: Q, 661: F, 662: F, 663: F, 664: F,
# 75 Pendulum
665: F, 666: F, 667: F, 668: F, 669: F, 670: F, 671: F,
# 76 Two Thanksgiving Day Gentlemen
675: D, 676: D, 677: C, 678: C, 679: C,
# 77 Assessor of Success
681: E, 682: E, 683: E, 684: E, 685: E, 686: E,
# 78 Buyer from Cactus City
689: V, 691: I, 692: B, 693: B, 694: I, 695: B,
# 79 Badge of O'Roon
698: N, 699: N, 701: N, 702: N,
# 80 Brickdust Row
704: D, 705: B, 706: B, 707: B, 708: B, 710: I, 711: I, 712: D,
# 81 Making of a New Yorker
715: K, 716: K, 717: K, 718: K, 719: K,
# 82 Vanity and Some Sables
722: A, 723: A, 725: G, 726: A, 727: A,
# 83 Social Triangle
729: V, 730: V, 731: V, 732: V, 733: D, 734: D,
# 84 Purple Dress
735: U, 737: U, 738: C, 740: O,
# 85 Company 99
745: O, 746: O, 747: O, 748: O, 749: O,
# 86 Lost Blend
750: R, 751: R, 756: R,
# 87 Harlem Tragedy
757: F, 759: F, 761: F, 762: F, 763: F, 764: F,
# 88 Guilty Party
765: F, 766: F, 767: F, 772: F,
# 89 According to Their Lights
776: N, 777: N, 778: N, 779: H, 780: H,
# 90 Midsummer Knight's Dream
782: C, 784: J, 785: J, 787: C,
# 91 Last Leaf
790: M, 793: C, 794: M, 796: C,
# 92 Count and the Wedding Guest
798: A, 799: A, 800: A, 801: A, 802: V, 803: V, 804: A,
# 93 Country of Elusion
810: A, 811: A,
# 94 Ferry of Unfulfilment
818: B, 819: B, 820: B,
# 95 Tainted Tenner
825: O, 826: O, 827: O, 828: O,
# 96 Elsie in New York
831: D, 832: D, 833: D, 834: D, 835: D, 836: I, 837: I, 838: D,
}
@@ -0,0 +1,46 @@
[
{"chunk":0,"story":0,"summary":"A writer on assignment casts about for someone who can tell him what the city means, and starts with the woman he courts.","predicament":"A man needs an answer only other people can give him, and does not know whom to ask first."},
{"chunk":1,"story":0,"summary":"A man presses the woman he courts for an answer she turns aside with jokes; he insists, and she only smiles.","predicament":"Someone presses another for an answer they keep deflecting, and must decide whether to keep pushing."},
{"chunk":2,"story":0,"summary":"A man questions a bartender about the city's meaning; the bartender is pulled away by a neighbour's errand and talks about his family instead.","predicament":"Someone seeks an answer from a busy person whose own small duties keep crowding out the question."},
{"chunk":3,"story":0,"summary":"A man asks a policeman what the city says; the policeman says he only takes orders, then talks about his new wife.","predicament":"Someone asks an official a large question and gets only the official's private life in reply."},
{"chunk":4,"story":0,"summary":"A man asks a poet for a grand utterance summing up the whole city, laying out at length what the answer should contain.","predicament":"Someone asks an expert for a sweeping answer, and specifies it so tightly that no answer can fit."},
{"chunk":5,"story":0,"summary":"A poet ignores the question to talk about a girl, and a news-seller wants only his money; the questioner leaves with nothing.","predicament":"Everyone someone asks is absorbed in their own affairs, leaving the question unanswered and the asker alone."},
{"chunk":6,"story":0,"summary":"A man returns to the woman he courts and sits silent beside her; she notes he has not spoken, and that is his answer.","predicament":"Someone comes back to the person who matters, and finds silence says what all the asking could not."},
{"chunk":7,"story":1,"summary":"A low-paid clerk and his wife live an ordinary flat-bound life, with neither poverty, love nor war to mark it.","predicament":"Someone's life is comfortable, small and unmarked, and they want something to happen in it."},
{"chunk":8,"story":1,"summary":"A housewife's days are made of bargains, window-sills and small superiorities over a neighbour, in a city where large things happen suddenly.","predicament":"Someone fills empty days with small rivalries while chance waits to overturn everything without warning."},
{"chunk":9,"story":1,"summary":"A clerk tries to make conversation with his wife about his workplace, fails, and goes out for a cigar instead.","predicament":"Someone tries to make talk with the person nearest them, gets nothing back, and steps outside."},
{"chunk":10,"story":1,"summary":"A customer finds himself penniless and offers to pay tomorrow; the shopkeeper attacks him and the two fight into the street.","predicament":"Someone asks for a moment's trust over a trifle and is answered with violence."},
{"chunk":11,"story":1,"summary":"A fleeing man strikes the officer who intervenes, runs, and is picked up by a stranger's car that carries him to a mansion.","predicament":"Someone in flight from a trivial quarrel is swept into a stranger's plans without being asked."},
{"chunk":12,"story":1,"summary":"A wealthy young woman, mistaking a stranger for a champion, asks him to confront a man who has insulted her.","predicament":"Someone is mistaken for the person another needs, and is asked to fight a stranger's battle."},
{"chunk":13,"story":1,"summary":"A man takes a woman's flower and confronts her enemy on her behalf; the young man puts him out the door effortlessly.","predicament":"Someone accepts a favour, acts as a champion, and is removed without effort by the one they challenged."},
{"chunk":14,"story":1,"summary":"The quarrel proves a lovers' game between a couple; the outsider walks home and resumes the dull talk he left.","predicament":"Someone discovers the drama they were pulled into was never theirs, and returns to an unchanged life."},
{"chunk":15,"story":2,"summary":"A young shop assistant behind a counter is beautiful and shrewd, schooled by the other girls in how to handle men who buy.","predicament":"A young person with looks and little money learns to guard themselves among strangers who want their attention."},
{"chunk":16,"story":2,"summary":"A rich young man wanders into a store where the counter girls flirt with cheap admirers, and the shop assistant meets his eye.","predicament":"Someone of high standing strays into a place where their advantages mean nothing, and hesitates."},
{"chunk":17,"story":2,"summary":"A rich man realises he stands among ordinary suitors, resolves to win the shop assistant anyway, and leaves his card on the counter.","predicament":"Someone wants a person far outside their circle, and has no proper way to approach them."},
{"chunk":18,"story":2,"summary":"A rich man asks permission to call; the shop assistant refuses her crowded home and names a street corner instead.","predicament":"Someone accepts a suitor's approach but cannot let them see how they live."},
{"chunk":19,"story":2,"summary":"A workmate teases the shop assistant about her rich admirer, while he worries that her easy consent means she is common.","predicament":"Someone's suitor takes their ease of manner for cheapness, and neither can read the other's world."},
{"chunk":20,"story":2,"summary":"A rich man proposes marriage; the shop assistant disbelieves his station and takes his declarations for the usual flattery.","predicament":"Someone offers everything they have and is not believed by the person they offer it to."},
{"chunk":21,"story":2,"summary":"A suitor paints a life of foreign travel and palaces; the shop assistant recognises the picture and stands up.","predicament":"Someone describes the future they are offering, and the other hears something entirely different in it."},
{"chunk":22,"story":2,"summary":"The shop assistant ends it and tells a workmate that the rich man only wanted a cheap wedding trip.","predicament":"Someone rejects the best offer they will ever get, having misread it completely."},
{"chunk":23,"story":3,"summary":"A man belongs to a clannish set who live in hotel lobbies and keep their home lives out of sight.","predicament":"Someone's standing among their own set depends on keeping their private life invisible."},
{"chunk":24,"story":3,"summary":"A man treats his wife as a fixture at home, dining out nightly with his set and barely hearing her talk.","predicament":"Someone has stopped noticing the person they live with, and does not know what they are missing."},
{"chunk":25,"story":3,"summary":"A wife asks her husband to take her out after three years indoors; he agrees, and she comes down transformed.","predicament":"Someone finally asks for what they have gone without for years, and is answered."},
{"chunk":26,"story":3,"summary":"A husband, surprised by his wife's appearance, changes his plan and resolves to show her to his friends rather than hide her.","predicament":"Someone realises what they kept hidden is worth showing, and reverses course to display it."},
{"chunk":27,"story":3,"summary":"A man's friends stare as he passes with his wife; at dinner she blooms, and shame reaches him for the years she spent shut in.","predicament":"Someone sees what their neglect cost another, and feels it in front of witnesses."},
{"chunk":28,"story":3,"summary":"An influential friend joins their table and the wife charms him and a crowd of men, while her husband sits without words.","predicament":"Someone watches the person they took for granted admired by everyone but themselves."},
{"chunk":29,"story":3,"summary":"The husband takes his wife's cloak before his friend can, walks her home, and refuses to return to his set.","predicament":"Someone, made jealous of what they neglected, chooses to keep it rather than hand it round."},
{"chunk":30,"story":4,"summary":"Three weeks married, a bride idly asks her husband for out-of-season fruit, and he leaves at once to get it.","predicament":"Someone newly devoted takes a passing whim as a command and sets out to satisfy it."},
{"chunk":31,"story":4,"summary":"A husband tries a street vendor and a friend's establishment; both say the fruit is out of season and offer a substitute.","predicament":"Someone hunting one particular thing is repeatedly offered a substitute they refuse to take."},
{"chunk":32,"story":4,"summary":"Finding every shop shut, a husband goes to a police captain and offers to lead a raid on a gambling house.","predicament":"Someone, blocked at every ordinary door, offers an official information to get inside a closed place."},
{"chunk":33,"story":4,"summary":"A man guides a dozen officers to a gambling room, the door is broken in, and most of the players escape.","predicament":"Someone sets a large action in motion for a reason nobody around them suspects."},
{"chunk":34,"story":4,"summary":"The gambling house's owner attacks the guide; after beating him, the guide hunts the supper room and questions a servant about fruit.","predicament":"Someone fights through real danger for a trifle that only matters to one person."},
{"chunk":35,"story":4,"summary":"One piece of fruit survives the supper table; the man pockets it and has a druggist check the rib he hurt falling downstairs.","predicament":"Someone gets the thing they went out for, at a cost nobody will ever weigh."},
{"chunk":36,"story":4,"summary":"The husband lays the fruit in his wife's hand; she says she would rather have had the other kind after all.","predicament":"Someone delivers what was asked and learns the asker has already changed their mind."},
{"chunk":37,"story":5,"summary":"Spring is announced in the city by newspaper items, but the true sign is when one person goes seeking another.","predicament":"Someone waits for a sign of change and finds it only when feeling moves them."},
{"chunk":38,"story":5,"summary":"Three idlers on a bench plot how to get the one dollar a married man's wife earned by washing.","predicament":"Idle companions plan how to take the only money earned by someone who works for it."},
{"chunk":39,"story":5,"summary":"The husband boasts he can choke the money out of his wife, then goes home to a woman who despises him.","predicament":"Someone boasts of a cruelty to companions, then faces alone the person they must get it from."},
{"chunk":40,"story":5,"summary":"The husband claims a new position and asks for the money; his wife calls him a liar and refuses.","predicament":"Someone invents a respectable reason for needing money and is seen through at once."},
{"chunk":41,"story":5,"summary":"The husband tries self-pity; his wife mocks it, and he decides to try the tenderness he abandoned years ago.","predicament":"Someone runs out of excuses and considers using affection they no longer feel."},
{"chunk":42,"story":5,"summary":"The husband puts his arm around his wife and calls her old endearments; she breaks down, holds him, and hurries out.","predicament":"Someone performs an affection they do not mean, and the other believes it entirely."},
{"chunk":43,"story":5,"summary":"The wife returns having spent the dollar on a tonic for her husband, and sits on his lap; his friends still wait.","predicament":"Someone's pretence is repaid with a kindness that costs them exactly what they were after."}
]
@@ -0,0 +1,48 @@
[
{"chunk":44,"story":6,"summary":"A young man contrives to speak to a well-dressed young woman on a park bench; she invites him to sit and talk.","predicament":"Someone engineers a meeting with a stranger they have watched, and is unexpectedly welcomed."},
{"chunk":45,"story":6,"summary":"A young woman rebukes a stranger's familiar flirtation, then asks him about the passing crowd and hints she is above them.","predicament":"Someone misjudges a stranger's station, is corrected, and must start the acquaintance again."},
{"chunk":46,"story":6,"summary":"A young woman claims a famous name and weariness of wealth; the stranger, curious, catches an inconsistency in her account.","predicament":"Someone builds an impressive story about themselves and a listener notices a detail that does not fit."},
{"chunk":47,"story":6,"summary":"The woman explains away her slip as a fashion, says she could love a lowly worker, and asks the stranger's occupation.","predicament":"Someone repairs their story, then invites the other to declare what they are."},
{"chunk":48,"story":6,"summary":"The man says he is a cashier across the street; the woman hurries away, telling him her car waits at the corner.","predicament":"Each claims a position that suits the other's expectation, and the meeting is broken off."},
{"chunk":49,"story":6,"summary":"Told to wait, the man follows the woman instead, and watches her take her place at the cashier's desk she described.","predicament":"Someone disobeys an instruction and discovers the other's grand account was invented."},
{"chunk":50,"story":6,"summary":"The man drops the woman's book on the grass, steps into the waiting automobile and orders his chauffeur to his club.","predicament":"Someone learns another's pretence and quietly withdraws, their own greater one never discovered."},
{"chunk":51,"story":7,"summary":"A city breeds a tribe of onlookers who gather in a ring around any accident or oddity, however trivial.","predicament":"People crowd to watch other people's misfortunes, making a pastime of them."},
{"chunk":52,"story":7,"summary":"Two devoted onlookers meet across the body of an injured man, and one falls in love as the other shoves through the crowd.","predicament":"Two people recognise each other by a shared appetite that everyone else finds distasteful."},
{"chunk":53,"story":7,"summary":"The two onlookers remain after the crowd goes, staring frankly at each other's physical defects without speaking.","predicament":"Two people court each other by the only manners they know, which others would find rude."},
{"chunk":54,"story":7,"summary":"On a dull day the two fight into a crowd watching a sign-painter, and the man offers to show her a rarer sight.","predicament":"Someone courts another by offering the one thing they both value, however small."},
{"chunk":55,"story":7,"summary":"The pair share an injury, a stakeout and three days on a plank, and pledge themselves as a policeman drives them away.","predicament":"Two people build a shared life entirely out of a habit that others move them along for."},
{"chunk":56,"story":7,"summary":"A wedding is set, the church filled, and outside the crowd of onlookers presses and fights to see the couple arrive.","predicament":"Someone's private occasion becomes the spectacle that a crowd has come to feed on."},
{"chunk":57,"story":7,"summary":"The couple never arrive; they are dragged from the crowd, trampled, having joined it to watch themselves be married.","predicament":"Someone's lifelong habit makes them miss the one occasion that was theirs."},
{"chunk":58,"story":8,"summary":"A lawyer hands a young heir a thousand dollars and tells him he must render a full account of how he spends it.","predicament":"Someone receives an awkward sum on condition they explain exactly what they did with it."},
{"chunk":59,"story":8,"summary":"The heir tells a club acquaintance that the whole fortune went elsewhere, and mentions a quiet ward left only a ring.","predicament":"Someone passed over by a will laughs it off, and notices another was treated worse."},
{"chunk":60,"story":8,"summary":"The acquaintance lists worthy uses for the money, then says the heir will only buy a dancer a jewel.","predicament":"Someone asks advice and is told, insultingly, exactly what they are expected to do."},
{"chunk":61,"story":8,"summary":"The heir offers a dancer a jewel and she barely attends; he then asks a driver and a street seller what they would do.","predicament":"Someone tests a cheap intention against the people around them, and finds nobody impressed."},
{"chunk":62,"story":8,"summary":"Learning the ward received nothing, the heir gives her the thousand dollars, saying a late amendment to the will provided it.","predicament":"Someone gives away their whole share disguised as another's due, so that it cannot be refused."},
{"chunk":63,"story":8,"summary":"The heir tells the ward he loves her, is refused, and writes an account naming the money as a debt of happiness.","predicament":"Someone who has just given everything away is turned down, and says nothing of what they did."},
{"chunk":64,"story":8,"summary":"A codicil promises fifty thousand if the money was spent unselfishly; the heir tears up the account that would prove it.","predicament":"Someone can claim a fortune only by revealing a kindness, and destroys the proof instead."},
{"chunk":65,"story":9,"summary":"A farmer's son becomes a celebrated city lawyer, remade by the city into an impeccable and narrow gentleman.","predicament":"Someone who climbed out of a humble start is reshaped by the place that rewarded them."},
{"chunk":66,"story":9,"summary":"The lawyer crowns his rise by marrying a woman of the oldest family, cold and high above every other climber.","predicament":"Someone's greatest success is a marriage they must keep proving themselves worthy of."},
{"chunk":67,"story":9,"summary":"The wife finds a letter from her husband's farming mother and announces they will visit, asking whether the farm entertains.","predicament":"Someone's hidden origins are discovered by the person they most feared would see them."},
{"chunk":68,"story":9,"summary":"They arrive at the country station, where the husband's brother jeers cheerfully and is silenced by the wife's appearance.","predicament":"Someone brings a grand partner home, where the old familiarity and the new grandeur cannot mix."},
{"chunk":69,"story":9,"summary":"The old countryside takes hold of the husband, and his wife beside him begins to seem remote and unreal.","predicament":"Someone returning to where they came from feels the person beside them turn into a stranger."},
{"chunk":70,"story":9,"summary":"On the porch the husband throws off his manners, pulls off his father's boots and challenges his brother to wrestle.","predicament":"Someone sheds the manner they built, in front of the one person it was built for."},
{"chunk":71,"story":9,"summary":"The husband wrestles, chases his sister with an insect, dances and clowns, while his wife sits silent and unreadable.","predicament":"Someone lets themselves go completely, watched in silence by the person who can ruin them."},
{"chunk":72,"story":9,"summary":"The wife retires; her husband follows, expecting condemnation, and she begins by saying she thought she married a gentleman.","predicament":"Someone waits for the judgement they are sure they have earned."},
{"chunk":73,"story":9,"summary":"The sentence ends differently: the wife says she finds she married something better, and asks her husband to kiss her.","predicament":"Someone braced for rejection is accepted for exactly what they were ashamed of."},
{"chunk":74,"story":10,"summary":"A young man disinherited for disobeying his uncle spends his last coin and takes a park bench with nothing left.","predicament":"Someone loses everything for refusing to obey, and has nowhere to go."},
{"chunk":75,"story":10,"summary":"On the bench a ragged stranger tells the ruined man that tomorrow he inherits millions, and that he is afraid.","predicament":"Someone at their lowest meets a stranger terrified by the good fortune about to arrive."},
{"chunk":76,"story":10,"summary":"The stranger explains he is a cast-off nephew summoned back to be heir, and begs the price of a drink.","predicament":"Someone recounts their fall to a stranger and asks them for money they do not have."},
{"chunk":77,"story":10,"summary":"The stranger panics, terrified that some accident will kill him in the hours before he can claim the fortune.","predicament":"Someone about to receive everything is paralysed by fear of losing it in the meantime."},
{"chunk":78,"story":10,"summary":"The ruined man calms the stranger, uses his standing at a hotel bar to get him food, and eats none himself.","predicament":"Someone spends the last of their credit on a stranger rather than on themselves."},
{"chunk":79,"story":10,"summary":"They take neighbouring benches; the stranger promises to get the ruined man a job once his fortune arrives.","predicament":"Someone is promised help by a person whose fortune has not yet arrived."},
{"chunk":80,"story":10,"summary":"At the lawyer's office next morning the stranger is told his uncle has reconsidered and will not take him back.","predicament":"Someone arrives to claim what they were promised and is told it has been withdrawn."},
{"chunk":81,"story":10,"summary":"The stranger walks out steadily cursing his uncle; the lawyer then tells the ruined man his own uncle relents, and he faints.","predicament":"Someone stood firm through ruin and collapses at the news that it is over."},
{"chunk":82,"story":11,"summary":"A writer explains that editors discard manuscripts claiming to be true, and that fiction is held in more esteem than fact.","predicament":"Someone works in a trade where the truth is the least welcome thing they can offer."},
{"chunk":83,"story":11,"summary":"A storekeeper's son comes to the city to write, carrying two grand historical manuscripts and a small local reputation.","predicament":"Someone arrives in a larger place with work that impressed the small one they left."},
{"chunk":84,"story":11,"summary":"The older writer lodges the newcomer, tests him with an assignment he refuses, and the two live cheaply and happily.","predicament":"Someone takes a newcomer in hand and is pleased when they refuse the obvious advice."},
{"chunk":85,"story":11,"summary":"The newcomer's love stories come back rejected; the older writer finds them well made but empty of living substance.","predicament":"Someone's work is correct in every part and lifeless, and they cannot see why."},
{"chunk":86,"story":11,"summary":"Told he must fall in love before he can write it, the newcomer does, and is wrecked by a careless young woman.","predicament":"Someone takes advice to feel a thing for themselves, and it costs them more than expected."},
{"chunk":87,"story":11,"summary":"The newcomer writes the story while the feeling is on him; it is sentimental drivel, and all his craft has vanished.","predicament":"Someone writes straight from feeling and produces the worst work they have ever done."},
{"chunk":88,"story":11,"summary":"After recovering, the newcomer is worshipped by another woman he only mildly likes, and sits down to write again.","predicament":"Someone is loved fiercely by a person they do not love, and uses it."},
{"chunk":89,"story":11,"summary":"The new story is brilliant; the newcomer says an artist must be a cad, tears it up and goes home to his father's store.","predicament":"Someone finds they can only succeed by using another's feeling, and refuses the success."}
]
@@ -0,0 +1,266 @@
[
{
"chunk": 90,
"story": 12,
"summary": "A young woman about to sail receives the suitor who wronged her coldly, and produces a keepsake motto as evidence against him.",
"predicament": "Someone facing the person who wronged them keeps the proof of the promise that was broken."
},
{
"chunk": 91,
"story": 12,
"summary": "The suitor draws a second motto counselling forgiveness and pleads to be taken back, renouncing the woman who lured him away.",
"predicament": "Someone begs forgiveness for a betrayal, using whatever chance puts in their hand."
},
{
"chunk": 92,
"story": 12,
"summary": "A street seller rests his cart nightly under the window where a celebrated dancer sits while her maids dress her hair.",
"predicament": "A working person and an admired one share a place daily without either being anything to the other."
},
{
"chunk": 93,
"story": 12,
"summary": "The dancer asks the street seller whether she is beautiful; he refuses to flatter her and talks about the weather.",
"predicament": "Someone used to admiration meets a person who will not give it, and keeps asking."
},
{
"chunk": 94,
"story": 12,
"summary": "The street seller mocks the dancer's fishing for compliments, says his plain evening contents him, and goes in to read.",
"predicament": "Someone declines another's power over them and states plainly what they would rather have."
},
{
"chunk": 95,
"story": 12,
"summary": "Piqued, the dancer works daily on the seller until she makes him look into her eyes; next evening he comes dressed up.",
"predicament": "Someone pursues another only to prove that they can, and succeeds."
},
{
"chunk": 96,
"story": 12,
"summary": "Bored the moment he is won, the dancer laughs at the seller's offer of his savings until he leaves; then she screams.",
"predicament": "Someone wins another's devotion, finds it worthless, and is undone by news of their own."
},
{
"chunk": 97,
"story": 13,
"summary": "Nature moves in circles and the city in straight lines, and the city remakes whatever comes into it to its angles.",
"predicament": "A place remakes everyone who enters it into its own shape."
},
{
"chunk": 98,
"story": 13,
"summary": "Two mountain families kill each other over forty years until one man of each remains, and one of them disappears.",
"predicament": "An inherited quarrel consumes everyone until only its two last holders are left."
},
{
"chunk": 99,
"story": 13,
"summary": "The last survivor of one family learns his enemy lives in the city, packs a revolver and a knife, and follows him.",
"predicament": "Someone carries an old obligation of vengeance into a place where it has no standing."
},
{
"chunk": 100,
"story": 13,
"summary": "Hunting his enemy along the crowded avenues, the mountain man finds a world of straight lines and rushing strangers.",
"predicament": "Someone arrives to do what they came for and finds the place itself defeats them."
},
{
"chunk": 101,
"story": 13,
"summary": "Unseen by thousands of passing faces, the stranger fails even to open a door and is moved along by a policeman.",
"predicament": "Someone surrounded by people is more alone than they have ever been, and unwanted."
},
{
"chunk": 102,
"story": 13,
"summary": "Jostled and abused by traffic and passers-by, the stranger meets his hereditary enemy at last and shakes his hand gladly.",
"predicament": "Someone meets the enemy they came to destroy and finds them the only familiar face."
},
{
"chunk": 103,
"story": 14,
"summary": "A poet throws down a magazine and declares romance dead, cataloguing its contents to a cheerful clerk who disagrees by existing.",
"predicament": "Someone declares the thing they live for extinct, to a listener who does not care."
},
{
"chunk": 104,
"story": 14,
"summary": "A plain-dressed clerk sits at the poet's window above an old garden, where an old gentleman refuses to sell his house.",
"predicament": "Someone holds out against every offer to give up what they love."
},
{
"chunk": 105,
"story": 14,
"summary": "The clerk visits often as a useful foil, and the poet reads him his printed verses about four roses.",
"predicament": "Someone keeps a companion around chiefly to feel superior to them."
},
{
"chunk": 106,
"story": 14,
"summary": "The clerk cuts the reading short and leaves; next day the poet sees a beautiful young woman at the opposite window.",
"predicament": "Someone whose work goes unheard is consoled by a stranger glimpsed at a distance."
},
{
"chunk": 107,
"story": 14,
"summary": "Four roses appear in the young woman's window and the poet reads them as her answer to his published verses.",
"predicament": "Someone reads a message meant for another as a sign addressed to themselves."
},
{
"chunk": 108,
"story": 14,
"summary": "A flower book tells the poet a meeting is expected; the clerk arrives, checks his watch and hurries off to an appointment.",
"predicament": "Someone assembles proof of their good fortune while the truth walks in and out of the room."
},
{
"chunk": 109,
"story": 14,
"summary": "The clerk explains that the roses are his fiancee's signal of the hour, and that the flowerpot means half-past.",
"predicament": "Someone's private sign is explained away by the ordinary arrangement of two other people."
},
{
"chunk": 110,
"story": 15,
"summary": "Officials proclaim that during the heat the people may sleep in the parks, and whole neighbourhoods move out into one.",
"predicament": "An order given for people's good turns them out of their homes."
},
{
"chunk": 111,
"story": 15,
"summary": "Tenants pack bedding and household goods, protesting to the janitor, while an officer orders everyone out to the park.",
"predicament": "Someone is told by an official to leave a comfortable home and has no appeal."
},
{
"chunk": 112,
"story": 15,
"summary": "The narrator praises the mixed and companionable life of the tenement on hot nights, then describes being herded into the dark park.",
"predicament": "Someone is rescued from a life they were content with, by people who never asked."
},
{
"chunk": 113,
"story": 15,
"summary": "The officer threatens imprisonment for refusal, and the tenants pass the night in the dark judging strangers by feel.",
"predicament": "People forced together in the dark can tell friend from stranger only by touch."
},
{
"chunk": 114,
"story": 15,
"summary": "Two tenants complain that the rent runs on while they lie in the grass, and joke that this is the city's charity.",
"predicament": "Someone pays for a home they are not allowed to sleep in."
},
{
"chunk": 115,
"story": 15,
"summary": "In the dark the social distinctions of the building collapse into a heap, and by morning five engagements have been announced.",
"predicament": "Forced together, people who despised each other by daylight find they can pair off."
},
{
"chunk": 116,
"story": 15,
"summary": "A well-dressed man stops his car to ask why the people lie in the grass, and takes the answer down in a book.",
"predicament": "Someone comfortable asks why others are suffering, and promises to see to it."
},
{
"chunk": 117,
"story": 16,
"summary": "A big idle striker wakes restless and unaccountably disturbed, knocks his brothers aside, and cannot say what ails him.",
"predicament": "Someone is unsettled by a feeling they cannot name and will not admit."
},
{
"chunk": 118,
"story": 16,
"summary": "His mother says the season is in his bones; he denies every sign of spring and goes to his usual idle corner.",
"predicament": "Someone denies a change that everyone around them can feel."
},
{
"chunk": 119,
"story": 16,
"summary": "He looks for signs of the season, orders a drink and leaves it untasted, and snaps at the bartender who mocks him.",
"predicament": "Someone's usual pleasures stop satisfying them, and they take it out on bystanders."
},
{
"chunk": 120,
"story": 16,
"summary": "A friendly barber insists the season is coming; the restless man denies it, then fights a standing enemy in the street.",
"predicament": "Someone denies what is happening to them and picks a fight instead."
},
{
"chunk": 121,
"story": 16,
"summary": "He hunts a sentimental song under a pretext, then knocks at the young woman's door and asks her opinion of the weather.",
"predicament": "Someone approaches the person they want with a pretext instead of a reason."
},
{
"chunk": 122,
"story": 16,
"summary": "He names the feeling as her, says he starts work Monday, and she accepts; snow falls and he calls it springtime anyway.",
"predicament": "Someone finally names what they want, and the weather no longer decides anything."
},
{
"chunk": 123,
"story": 17,
"summary": "A southern saying summons an imaginary old man who kills fools, invoked in every household with a smile or a tear.",
"predicament": "People invoke an imagined punisher for the foolishness they see in each other."
},
{
"chunk": 124,
"story": 17,
"summary": "A writer explains how an illustrator wrecks a story with details he never wrote, and how far an artist stands from an author.",
"predicament": "Someone's work is handed to another who remakes it wrongly and publicly."
},
{
"chunk": 125,
"story": 17,
"summary": "The writer befriends a cheerfully melancholy artist who is engaged to a factory worker earning eight dollars a week.",
"predicament": "Someone loves a person far below their family's expectations, and does not hide it."
},
{
"chunk": 126,
"story": 17,
"summary": "The artist's rich father objects to the match, so the artist gives up the inheritance and lives on credit and sausages.",
"predicament": "Someone gives up a fortune rather than give up the person they intend to marry."
},
{
"chunk": 127,
"story": 17,
"summary": "The young woman proves natural and unpretending at a cheap cafe, and the writer still tells the artist he is a fool.",
"predicament": "Someone judges another's choice foolish even after meeting what they chose."
},
{
"chunk": 128,
"story": 17,
"summary": "The artist plans to marry within the week on the price of one picture, while the writer drinks and repeats his verdict.",
"predicament": "Someone commits to a plan they cannot afford, and is told so by a friend."
},
{
"chunk": 129,
"story": 17,
"summary": "A grey old man appears and orders the artist to give up the young woman and come home; the artist seems not to hear.",
"predicament": "Someone is given a last ultimatum by an authority whose threat no longer reaches them."
},
{
"chunk": 130,
"story": 17,
"summary": "The artist insists nobody spoke to him; the writer, believing he alone can see the visitor, follows the old man out.",
"predicament": "Someone believes they alone can see a danger and rushes to avert it."
},
{
"chunk": 131,
"story": 17,
"summary": "The writer accuses the old man of destroying youth and talent for old standards, and calls the artist the wisest man he knows.",
"predicament": "Someone confronts the old power that punishes the young for choosing differently."
},
{
"chunk": 132,
"story": 17,
"summary": "The old man asks about the young woman, hears her defended, and asks to have the artist brought out to him.",
"predicament": "Someone asks about the person they objected to, and begins to reconsider."
},
{
"chunk": 133,
"story": 17,
"summary": "The old man gives in and asks the artist to bring her home; he is the father, unspoken to for a year.",
"predicament": "An estranged parent yields, and the quarrel that cost a fortune ends with a handshake."
}
]
@@ -0,0 +1,48 @@
[
{"chunk":134,"story":18,"summary":"A quiet hotel offers a few guests the pleasures of a mountain resort, and they hide there fearing discovery by other pleasure-seekers.","predicament":"People guard a comfortable refuge and fear the crowd that would spoil it."},
{"chunk":135,"story":18,"summary":"A gracious lady arrives and is treated by staff and guests as the perfect ornament of their exclusive retreat.","predicament":"Someone's bearing alone persuades everyone around them of a station they never state."},
{"chunk":136,"story":18,"summary":"Rumours make the lady a cosmopolitan; a well-dressed young man arrives, asks about sailings and settles in for a few days.","predicament":"Two strangers each arrive carrying an account of themselves that the place is eager to believe."},
{"chunk":137,"story":18,"summary":"A dropped handkerchief introduces them, and the two agree that the old resorts are ruined by the crowds who follow them.","predicament":"Two people flatter each other with a shared complaint neither has the standing to make."},
{"chunk":138,"story":18,"summary":"Each says they leave on Monday, she for a chateau abroad, and they spend a last evening together on the balcony.","predicament":"Two people approach the end of a pretence that neither wants to be the first to break."},
{"chunk":139,"story":18,"summary":"The lady confesses she sells hosiery for eight dollars a week and saved a year to live like a lady once.","predicament":"Someone confesses the truth about themselves rather than leave the other deceived."},
{"chunk":140,"story":18,"summary":"He writes her a receipt: he collects instalments on that very dress, saved as she did, and they plan an outing together.","predicament":"Someone answers another's confession with the same one, and the pretence becomes a shared joke."},
{"chunk":141,"story":19,"summary":"A village-born actress has risen to stardom, and a young character actor seeks the rustic part in her next play.","predicament":"Someone who left a small place is now the judge of who may imitate it."},
{"chunk":142,"story":19,"summary":"Told the star rejects every imitation of a country dweller, the actor spends three days gathering the facts of her home village.","predicament":"Someone studies another's origins in order to pass a test only that person can set."},
{"chunk":143,"story":19,"summary":"At the star's late supper table an awkward country youth enters, and the whole room turns to look at him.","predicament":"Someone enters a room where they plainly do not belong, and is watched by everyone."},
{"chunk":144,"story":19,"summary":"The youth greets the star as a neighbour and retails the village news until she draws him to a private table.","predicament":"News of the place someone escaped pulls their attention away from all their present company."},
{"chunk":145,"story":19,"summary":"She cannot recall him but asks after her family, and he answers with the changes at her parents' house.","predicament":"Someone asks a stranger for news of the family they have not visited."},
{"chunk":146,"story":19,"summary":"He describes her mother watching the road daily for her return, and gives her a rose from the home doorstep.","predicament":"Someone is shown how long they have been waited for by the people they left."},
{"chunk":147,"story":19,"summary":"She laughs the village off and goes; when the actor calls next day her maid says she has returned there to live.","predicament":"Someone laughs off what moved them, then abandons everything to go back."},
{"chunk":148,"story":20,"summary":"A detective meets an old friend on the street, takes him aside and asks straight out why he killed the murdered man.","predicament":"Someone must act against a person they owe a debt of friendship to."},
{"chunk":149,"story":20,"summary":"The detective produces the gold pencil he once gave his friend, found at the scene, and warns him he must do his duty.","predicament":"Someone's own gift becomes the evidence that convicts the person they gave it to."},
{"chunk":150,"story":20,"summary":"The killer explains the shooting and the theft, then says the detective owes him a thousand dollars and cannot touch him.","predicament":"Someone escapes justice by holding an old favour over the person who must judge them."},
{"chunk":151,"story":20,"summary":"The detective concedes that the debt binds him, and says nothing else could have bought the man out of his hands.","predicament":"Someone is stopped from doing their duty by a debt they never repaid."},
{"chunk":152,"story":20,"summary":"The detective says he will resign, and the killer's boasting of past crimes turns his old gratitude into cold disgust.","predicament":"Someone repaying an old kindness discovers the person they are protecting deserves nothing."},
{"chunk":153,"story":20,"summary":"Enraged at the mention of newspapers, the killer goes to a telephone to prove to an editor what he thinks of them.","predicament":"Someone's vanity drives them to taunt the one power they have not accounted for."},
{"chunk":154,"story":20,"summary":"On the telephone he confesses the murder to the editor and proves it with a detail only the killer could know.","predicament":"Someone proves their boast by handing over the one fact that can convict them."},
{"chunk":155,"story":20,"summary":"He hangs up gloating and spends the night at shows and suppers, while the detective broods and then begins to wonder.","predicament":"Someone celebrates their safety while the person beside them looks for a way out."},
{"chunk":156,"story":20,"summary":"At dawn the newsboys cry the papers; the detective buys one, looks at the front page and begins writing with the pencil.","predicament":"Someone finds a way to do their duty and clear their debt at the same time."},
{"chunk":157,"story":21,"summary":"A village woman comes to the city with an easel to study art; at home she was reckless, here she looks a spinster.","predicament":"Someone leaves a small place for a bold life and arrives as nobody in particular."},
{"chunk":158,"story":21,"summary":"She takes a cheap room and lessons from a fraudulent teacher, one of the hopeless army of the mediocre.","predicament":"Someone pays for training from a teacher who has nothing to teach them."},
{"chunk":159,"story":21,"summary":"After a day of small defeats she accepts a dinner invitation from the boarding-house's showy man of the world.","predicament":"Someone worn down by failures accepts an invitation they would otherwise refuse."},
{"chunk":160,"story":21,"summary":"He takes her to a fashionable resort of artists, where a young man at a table hails him and invites them to join.","predicament":"Someone is taken into a world they have only read about, on another's introduction."},
{"chunk":161,"story":21,"summary":"Dazzled by the music and company, she drinks what is poured for her and speaks fondly of the farm she came from.","predicament":"Someone out of their depth speaks of home and is heard as a curiosity."},
{"chunk":162,"story":21,"summary":"Home in her room, conscience overwhelms her, and at midnight she writes to her sweetheart renouncing him as one lost forever.","predicament":"Someone judges one evening as the ruin of their whole character, and gives up their future."},
{"chunk":163,"story":21,"summary":"She resolves that no return is possible and models herself on famous fallen women, keeping her room for two days.","predicament":"Someone commits to a grand ruin that nobody else has noticed happening."},
{"chunk":164,"story":21,"summary":"Her sweetheart arrives, tells her to wipe off the paint and pack, mentions the trees at home, and she goes.","predicament":"Someone's grand renunciation is ended by the plain arrival of the person renounced."},
{"chunk":165,"story":22,"summary":"A quarter of the city shelters exiles of many nations, who pass through its cafes and lodging houses and vanish into service.","predicament":"People arriving with nothing find shelter among others like them and are quickly replaced."},
{"chunk":166,"story":22,"summary":"In a struggling rooming house the daughter keeps the rooms, and the best lodger is a splendid, prompt-paying foreigner.","predicament":"Someone working in a poor household is courted by the one person there who pays."},
{"chunk":167,"story":22,"summary":"The lodger courts the daughter; she likes him but suspects he is one more penniless foreign gentleman with a story.","predicament":"Someone doubts a suitor's fine manners, fearing they mean debts rather than fortune."},
{"chunk":168,"story":22,"summary":"He invites her to dine and takes her through a dark door into a hidden restaurant's crowded back yard.","predicament":"Someone is taken somewhere impressive by a suitor whose means they cannot account for."},
{"chunk":169,"story":22,"summary":"He excuses himself, and the whole company applauds and calls his name while she sits dazzled among the fine guests.","predicament":"Someone sees their companion greeted as a great person by a room full of strangers."},
{"chunk":170,"story":22,"summary":"He returns in shirtsleeves to season the dishes at every table; her fear of a penniless nobleman rises fourfold first.","predicament":"Someone's fear of a suitor's grand pretensions peaks just before the truth arrives."},
{"chunk":171,"story":22,"summary":"He tells her he is the restaurant's famous owner and cook and asks her to marry him; she accepts with relief.","predicament":"Someone learns their suitor is a worker, not a gentleman, and is glad of it."},
{"chunk":172,"story":23,"summary":"A clubman is bored by his companions' repeated stories and has been refused for the fifth time by the woman he courts.","predicament":"Someone's days are identical and the one thing they want keeps being refused."},
{"chunk":173,"story":23,"summary":"Strolling out, the clubman is accosted by a man from the loafing corner of thieves, and gladly goes aside to talk.","predicament":"Someone starved of novelty welcomes an approach that anyone else would avoid."},
{"chunk":174,"story":23,"summary":"The stranger announces himself a burglar and confidence man, and asks the clubman what is wrong with the way he dresses.","predicament":"Someone asks a stranger for the one expertise they lack, offering candour in exchange."},
{"chunk":175,"story":23,"summary":"The clubman itemises every fault of the burglar's expensive outfit, and the burglar demands more of the criticism.","predicament":"Someone hears their own faults catalogued and asks for the rest of the list."},
{"chunk":176,"story":23,"summary":"Offered his host's tailor, the burglar boasts of a robbery and lays the clubman's own watch and pocketbook on the table.","predicament":"Someone proves their trust by returning what they had already taken from the person trusting them."},
{"chunk":177,"story":23,"summary":"Introduced at the club as a burglar and disbelieved, the stranger holds the whole table with an account of the West.","predicament":"Someone brings an outsider among their set and the outsider outshines all of them."},
{"chunk":178,"story":23,"summary":"Before leaving, the stranger tells the clubman he is the real thing and promises to return the favour some day.","predicament":"Someone's help is repaid with an offer they may never be able to use."},
{"chunk":179,"story":23,"summary":"At lunch the clubman talks only of ranches and says he is going West; the woman who refused him says she will come.","predicament":"Someone stops asking for what they wanted, and is given it at once."}
]
@@ -0,0 +1,48 @@
[
{"chunk":180,"story":24,"summary":"An out-of-work actress darns stockings in a cheap hotel above the theatre district, wanting only to be back on a stage.","predicament":"Someone out of work waits in cheap lodgings for the only work they want."},
{"chunk":181,"story":24,"summary":"The hotel is full of resting players besieging managers for next season, and she wonders aloud where her old friend is.","predicament":"Someone among many in the same trade waits, with all of them chasing the same few places."},
{"chunk":182,"story":24,"summary":"Her friend's act was throwing a garter to the audience nightly; after two years she quit for a village on the shore.","predicament":"Someone abandons a profitable performance because of what it required them to be."},
{"chunk":183,"story":24,"summary":"The friend arrives travel-stained and agitated, drops her bag, and says she has come straight up to talk.","predicament":"Someone returns abruptly from the life they left, upset and not yet saying why."},
{"chunk":184,"story":24,"summary":"She says she left the stage sick of the life, and above all of the men the work forced her to meet.","predicament":"Someone leaves good work because of what they must endure from the people around it."},
{"chunk":185,"story":24,"summary":"She describes the suppers, the leering men and the middling actress who hangs on for the chance that never comes.","predicament":"Someone knows they will never rise, and keeps at it anyway for want of a better hope."},
{"chunk":186,"story":24,"summary":"She took a room by the sea, met a young clergyman lodging there, and within a month they were engaged.","predicament":"Someone starting a new life quickly finds the respectable future they thought impossible."},
{"chunk":187,"story":24,"summary":"She hides her stage past; the landlady tells her he treasures a keepsake of an unhappy love in a locked box.","predicament":"Someone hiding their own past learns the person they love keeps a locked one."},
{"chunk":188,"story":24,"summary":"Questioned, he says his earlier love was ideal: a woman he never met, seen from a distance, far above him.","predicament":"Someone questions a partner about an old attachment and is given an answer too good to doubt."},
{"chunk":189,"story":24,"summary":"His answer raises him in her eyes; then, left alone with his forgotten keys, she opens the drawer out of curiosity.","predicament":"Someone's admiration for another leads them to look at the one thing kept from them."},
{"chunk":190,"story":24,"summary":"One look inside the box sends her packing; she pays the landlady, declares all men alike, and takes the next train.","predicament":"Someone discovers the truth in a keepsake and ends everything without saying what they saw."},
{"chunk":191,"story":25,"summary":"Outsiders hold cheap and lurid ideas about stage people, while privately practising gestures in front of their own mirrors.","predicament":"People look down on a trade they secretly wish they were fit for."},
{"chunk":192,"story":25,"summary":"A performer has toured four years with a mixed act, working to the approval of the musicians below the stage.","predicament":"Someone works a trade for years, competent and unremarkable, waiting for the thing that lifts them."},
{"chunk":193,"story":25,"summary":"Bored by the whole bill, the performer sits up when a young woman does character songs and impersonations.","predicament":"Someone weary of their own trade is stopped short by one person doing it well."},
{"chunk":194,"story":25,"summary":"She exactly fits the part in the sketch he has kept hidden in his trunk, so he calls at her lodgings next day.","predicament":"Someone finds the one person who fits the plan they have kept to themselves for years."},
{"chunk":195,"story":25,"summary":"He reads her the sketch; she names its weak points and he accepts every change without argument.","predicament":"Someone offers their guarded work and finds it improved by the person they offered it to."},
{"chunk":196,"story":25,"summary":"She asks his salary, names her lower one, and says she works for money and means to save for a country home.","predicament":"Someone states plainly that they are in this for money, before agreeing to anything."},
{"chunk":197,"story":25,"summary":"She insists the partnership be strictly business with no nonsense; he agrees and describes his own dream of a quiet house.","predicament":"Two people agree to work together on the condition that nothing personal enters it."},
{"chunk":198,"story":25,"summary":"The pair cut, rewrite and rehearse the sketch through every known improvement until it is ready.","predicament":"Two people grind a shared piece of work into shape over many months."},
{"chunk":199,"story":25,"summary":"The act uses a real revolver and a live cartridge in a melodrama of a ranch, a theft and a jealous woman.","predicament":"Two people build their living on a performance that requires one of them to shoot accurately."},
{"chunk":200,"story":25,"summary":"In the story the ranch owner dies, a fortune vanishes, and the woman is convinced her lover is the thief.","predicament":"Someone concludes the person they love has robbed them, on the evidence of who was there."},
{"chunk":201,"story":25,"summary":"At the climax she fires through a rival's photograph; the bullet strikes a hidden spring and the missing fortune appears.","predicament":"Someone aims a shot to prove mercy, and hits the thing that clears the accused."},
{"chunk":202,"story":25,"summary":"The act triumphs and books at five hundred a week; she asks him inside to hear a proposal that will cut their expenses.","predicament":"Someone proposes an arrangement to another on the grounds that it will save them both money."},
{"chunk":203,"story":25,"summary":"For two years the act tours to full houses, the pair known everywhere as quiet, hard workers who go straight home.","predicament":"Two people build savings and a spotless name by never once being seen to enjoy themselves."},
{"chunk":204,"story":25,"summary":"Nervous at a first night, she fires wide and the bullet enters her partner's neck; the audience applauds the supposed comedy.","predicament":"Someone's nerve fails once at the exact thing they have done perfectly a thousand times."},
{"chunk":205,"story":25,"summary":"A fellow performer tells the wounded man that his partner is frantic with love for him; he calls it impossible.","predicament":"Someone is told that the person nearest them loves them, and cannot believe it."},
{"chunk":206,"story":25,"summary":"He insists it is too late, and reveals that the two of them have been quietly married for two years.","predicament":"Someone hears that love has arrived and answers that the arrangement was settled long ago."},
{"chunk":207,"story":26,"summary":"A quarter of the city gathers exiles from the south, who plot, raise funds and buy arms from a favourite cafe.","predicament":"Exiles gather in one place to plan a return that most of them will never make."},
{"chunk":208,"story":26,"summary":"A general arrives by liner from the south, short, grand and important, and makes for the quarter where his countrymen gather.","predicament":"Someone arrives in a strange city on an errand for their country, conspicuous in every way."},
{"chunk":209,"story":26,"summary":"He takes rooms at a hotel whose blond landlady charms him, and reminds himself that his country claims his devotion.","predicament":"Someone on an errand is distracted at once by what they find where they lodge."},
{"chunk":210,"story":26,"summary":"Bewildered by traffic, the general is marked by two street predators, and the smoother of them rescues him and gains his trust.","predicament":"Someone helpless in a strange place is helped by the person planning to rob them."},
{"chunk":211,"story":26,"summary":"Over bottles the general loudly confides that he carries drafts for twenty-five thousand to buy rifles for a revolution.","predicament":"Someone announces a secret errand and its funds to a stranger at the top of their voice."},
{"chunk":212,"story":26,"summary":"The stranger promises to introduce him to the Secretary of War, and tells him to keep the drafts in his pocket.","predicament":"Someone is promised access to a great official by the one person who has befriended them."},
{"chunk":213,"story":26,"summary":"The stranger telephones a confidence man and casts him as the Secretary of War for the following afternoon.","predicament":"Someone arranges for an accomplice to impersonate the authority their mark is expecting."},
{"chunk":214,"story":26,"summary":"On the way out the stranger insults the landlady with a joke she overhears; the false official then plays his part.","predicament":"Someone insults, in passing, the one person able to ruin their scheme."},
{"chunk":215,"story":26,"summary":"Cases are filled with bricks for the sale, and the landlady takes the general aside to ask about his new friend.","predicament":"Someone about to be cheated is taken aside by the person who sees through it."},
{"chunk":216,"story":26,"summary":"The general buys the hotel's furnishings and lease with the money and proposes to the landlady; the swindler chokes with rage.","predicament":"Someone abandons the cause they were entrusted with for a comfortable life and a marriage."},
{"chunk":217,"story":26,"summary":"The general calls it politics, says war is not nice, and asks whether the swindler has tasted the landlady's cooking.","predicament":"Someone explains away a betrayal as good sense, and recommends the life they chose."},
{"chunk":218,"story":27,"summary":"A confidence man follows an old partner's advice and comes to the city, meeting him again on the street.","predicament":"Someone past their best moves to richer ground on a colleague's advice."},
{"chunk":219,"story":27,"summary":"The partner insists the city's people beg to be robbed, and proposes they work the town together as in old times.","predicament":"Someone is urged into a scheme by a partner who insists it cannot fail."},
{"chunk":220,"story":27,"summary":"He recounts schemes abandoned for being too easy; the newcomer says the people here do not look easy to him.","predicament":"Someone doubts a partner's confidence about a place they do not yet know."},
{"chunk":221,"story":27,"summary":"The partner mocks the newcomer's caution, who says he wishes he had stayed with the small sure business at home.","predicament":"Someone doubts the large opportunity and misses the modest certainty they left."},
{"chunk":222,"story":27,"summary":"They pool their money, and an acquaintance brings a famous financier to their room to meet men from the West.","predicament":"Two people pool everything they have and are promptly introduced to a great man."},
{"chunk":223,"story":27,"summary":"The financier rages that a painting cannot be found and would pay seventy-five thousand; afterwards they stroll past a pawnshop.","predicament":"Someone hears what a rich person desperately wants, moments before appearing to find it."},
{"chunk":224,"story":27,"summary":"The partner has seen that very picture in the pawnshop, and next morning they go in to bargain for it.","predicament":"Someone spots the chance that has been placed in front of them and hurries to take it."},
{"chunk":225,"story":27,"summary":"They pay two thousand for the picture; the financier has been abroad a month, and the same print sells everywhere for dollars.","predicament":"Two people spend everything on a certainty and find they were the marks all along."}
]
@@ -0,0 +1,47 @@
[
{"chunk":226,"story":28,"summary":"An artist has only four stock pictures for the spring festival, which shows how vague the occasion is in everyone's mind.","predicament":"People keep an occasion whose meaning none of them can say."},
{"chunk":227,"story":28,"summary":"A young carter rises late on the holiday; his blind father sits by the window with a pipe, saying it is fine spring weather.","predicament":"Someone's day of freedom is watched wistfully by a person who cannot leave the room."},
{"chunk":228,"story":28,"summary":"The son snaps that he earns the rent and may go out; his mother says the blind man rambles about a hippopotamus.","predicament":"Someone answers a mild wish with anger, and is told the old one is wandering in mind."},
{"chunk":229,"story":28,"summary":"He asks the janitor and a policeman what the festival is for and whether anyone has spoken of a hippopotamus.","predicament":"Someone goes about asking others to explain a thing nobody around them understands."},
{"chunk":230,"story":28,"summary":"He asks a waiter why the festival exists, gets a joke, and meets the young woman he courts going to church.","predicament":"Someone taking a holiday they do not enjoy looks for a reason in every face they pass."},
{"chunk":231,"story":28,"summary":"At church the preacher's theme is new life arising from the old; afterwards he leaves the young woman piqued on a corner.","predicament":"Someone hears the thing they needed said, without knowing they have heard it."},
{"chunk":232,"story":28,"summary":"Two blocks on, something stirs in him: the old man meant an ancient war, not an animal, and he takes a car home.","predicament":"Someone suddenly understands what a neglected person had been asking them for."},
{"chunk":233,"story":28,"summary":"He takes down the dusty history, roars the question, and reads for an hour while the blind man weeps with joy.","predicament":"Someone resumes a small duty they had dropped, and finds it was everything to another."},
{"chunk":234,"story":29,"summary":"On a cold night a preacher on a box pays for beds, fifteen cents a man, for whoever gathers in the line.","predicament":"People with nowhere to sleep line up nightly for a stranger's charity."},
{"chunk":235,"story":29,"summary":"Among the bedless stands a discharged coachman, sacked for drunkenness a month before and now in the line with the rest.","predicament":"Someone dismissed for their own fault has fallen further than they can climb back."},
{"chunk":236,"story":29,"summary":"A month of whisky has him seeing things; he speaks to the shabby young man beside him about how each came there.","predicament":"Someone at the bottom looks for company and asks a neighbour how they fell."},
{"chunk":237,"story":29,"summary":"The other married against his family, lost work and health, and sent his wife away; then a tire falls from a passing car.","predicament":"Someone cut off by their family for a marriage has nothing left and no way to work."},
{"chunk":238,"story":29,"summary":"The coachman runs the tire down expecting a coin; the owner asks if he knows a certain family and tells him to get in.","predicament":"Someone hoping for a small tip is instead taken up by a stranger for unexplained reasons."},
{"chunk":239,"story":29,"summary":"He is left alone in a gorgeous dark room, where a stuffed owl suddenly raises its wings and shines light from its eyes.","predicament":"Someone brought into a stranger's house is left alone among things they cannot explain."},
{"chunk":240,"story":29,"summary":"He hurls a statuette at the owl; the grand host appears, excuses the toy, and returns to the question of the family.","predicament":"Someone's fright breaks their host's property just as the real business begins."},
{"chunk":241,"story":29,"summary":"The host promises good fortune; the coachman, hoping for reinstatement, offers to give up drink if taken back.","predicament":"Someone is promised good fortune and asks only for their old place back."},
{"chunk":242,"story":29,"summary":"Two women arrive; the elder says she has lost faith in the professor's art and came only because her sister insisted.","predicament":"Someone who has paid for years for hope is close to giving it up."},
{"chunk":243,"story":29,"summary":"The professor reveals the oracle about the fifth wheel, promises proof, and asks the coachman if he would go back home.","predicament":"Someone stakes their credibility on producing the person another is desperate to see."},
{"chunk":244,"story":29,"summary":"Asked his name, he answers plainly; the professor drags him to the door and kicks him down the steps without explanation.","predicament":"Someone is thrown out the moment they turn out not to be who was wanted."},
{"chunk":245,"story":29,"summary":"He walks back to the line; then the maid he courted comes running to him, weeping, saying she came to find him.","predicament":"Someone back at the bottom is found by the person who never stopped looking."},
{"chunk":246,"story":29,"summary":"She says the household will take him back, credits the professor, and he asks her for money for the sick man beside him.","predicament":"Someone newly rescued asks for money for the stranger who is worse off."},
{"chunk":247,"story":29,"summary":"The sick man proves to be the household's lost son, hunted for three years, and he agrees to go home.","predicament":"Someone missing for years is found beside the person who was being searched for."},
{"chunk":248,"story":29,"summary":"On the car home the coachman half-remembers the house of owls and lights, and says he would punch that man's nose.","predicament":"Someone who was thrown out never learns they were the reason everything came right."},
{"chunk":249,"story":30,"summary":"A genuine country poem is rejected as artificial, so a city writer composes a false one and they send it to the same editor.","predicament":"The real thing is rejected as a fake, so someone submits a fake instead."},
{"chunk":250,"story":30,"summary":"A countryman steps off the ferry with hay in his hair; the crowds glance once, decide he is overdone, and ignore him.","predicament":"Someone genuinely out of place is taken for a bad imitation of themselves."},
{"chunk":251,"story":30,"summary":"A confidence man advises him his rustic get-up is overdone, refuses a card game, and buys him a drink instead.","predicament":"Someone honest is warned by a cheat that their appearance is unconvincing."},
{"chunk":252,"story":30,"summary":"He produces nine hundred and fifty dollars; the cheat admires the roll but still says the clothes will never work.","predicament":"Someone shows real money and is complimented on a good prop."},
{"chunk":253,"story":30,"summary":"A bartender scoffs at his valise of money, and a news-seller refuses to change his note, calling it stage money.","predicament":"Someone cannot get anyone to take their money, because nobody believes it is theirs."},
{"chunk":254,"story":30,"summary":"A gambling tout waves him off as a decoy, and he concludes his clothes are what keep the city from noticing him.","predicament":"Someone is refused everywhere and decides the problem is how they are dressed."},
{"chunk":255,"story":30,"summary":"He outfits himself in the latest fashion, steps out at nine, and by half-past eleven has been robbed of everything.","predicament":"Someone made themselves look worth robbing, and immediately was."},
{"chunk":256,"story":30,"summary":"The editor praises the city writer's poem as the work of one raised close to nature, and pays for it as usual.","predicament":"A judge praises the imitation for the very quality the real thing was denied."},
{"chunk":257,"story":31,"summary":"A man admired as the best-dressed in the city keeps a servant pressing trousers and never wears a pair three hours.","predicament":"Someone's whole standing rests on an appearance that takes constant work to keep."},
{"chunk":258,"story":31,"summary":"He vanishes without motive, debt, enemy or woman; two friends travelling abroad hear of a remote mountain monastery.","predicament":"Someone disappears completely, leaving those who knew them no reason at all."},
{"chunk":259,"story":31,"summary":"At the monastery they watch the brothers file past and recognise their vanished friend among them.","predicament":"Someone is found living a life nobody who knew them would have predicted."},
{"chunk":260,"story":31,"summary":"They confirm it is he, sitting among the shabby brothers, never looking up, eating broth from a coarse bowl.","predicament":"Someone who lived for elegance is seen content among the plainest of things."},
{"chunk":261,"story":31,"summary":"He comes serene and happy in a rough robe, greets them easily, and asks whether that waistcoat is the new fashion.","predicament":"Someone found in a new life shows no embarrassment and asks after the old one's fashions."},
{"chunk":262,"story":31,"summary":"They beg him to come back; he says he has reached his goal, having found at last a garment that never bags.","predicament":"Someone explains a life-changing choice by a reason nobody else can take seriously."},
{"chunk":263,"story":32,"summary":"A travelling swindler takes his holidays in the city, practising a tune in a hall bedroom beside a pistol and a roll of notes.","predicament":"Someone whose trade is deception rests where nobody knows them."},
{"chunk":264,"story":32,"summary":"He says women do not specialise in his trade because they are already fully occupied extracting money from men.","predicament":"Someone explains that one group must bargain constantly for what the other simply holds."},
{"chunk":265,"story":32,"summary":"He calls a wife's kiss for a jewel the same trade, then tells of a striking country woman and a rich man he met.","predicament":"Someone argues that every exchange of affection for money is the same transaction."},
{"chunk":266,"story":32,"summary":"The rich man's one ambition is to be noticed; he has tried gifts, accidents and paying reporters, and got nothing.","predicament":"Someone with money enough to live on cannot buy the one thing they want: notice."},
{"chunk":267,"story":32,"summary":"The swindler offers to put him in every paper for a week, and names ten thousand dollars as the price.","predicament":"Someone offers to sell another the attention they have failed to buy honestly."},
{"chunk":268,"story":32,"summary":"The plan: a month of showy courtship and terrible love letters, then a desertion and a huge breach of promise suit.","predicament":"Three people contract to stage a betrayal for the publicity the trial will bring."},
{"chunk":269,"story":32,"summary":"She coaches him into writing worse love letters, and in a crowded restaurant a process-server hands him the papers publicly.","predicament":"Someone stages their own humiliation in public and is proud of how it looks."},
{"chunk":270,"story":32,"summary":"Two hours later the pair return married, leaving behind a railway ticket and two pairs of the rich man's old trousers.","predicament":"Two people hired to stage a courtship carry it through for real and pay nothing."}
]
@@ -0,0 +1,61 @@
[
{"chunk":271,"story":33,"summary":"Western visitors mope in hotel lobbies; one of them is swept from his companions by the rush hour and backs into a doorway.","predicament":"Someone from far away is separated from their companions and swamped by a crowd."},
{"chunk":272,"story":33,"summary":"Everything about him marks where he came from; he suddenly hauls a passing man out of the crowd and strikes him affectionately.","predicament":"Someone greets an old friend in the manner of home, which here looks like assault."},
{"chunk":273,"story":33,"summary":"The friend is now a polished city businessman; the visitor accuses him of becoming tame and orders whiskey against his cocktail.","predicament":"Someone finds an old friend remade by the place they settled in, and says so."},
{"chunk":274,"story":33,"summary":"At lunch the friend orders delicate dishes and defends the city as comfortable, saying he cannot make himself go back.","predicament":"Someone defends the soft life they chose to a person who knew them hard."},
{"chunk":275,"story":33,"summary":"The visitor denounces him as a renegade softened by small drinks; the friend half agrees and repeats that the city is comfortable.","predicament":"Someone is told they have been ruined by comfort and can only agree."},
{"chunk":276,"story":33,"summary":"At an elegant dinner the visitor keeps scorning each refinement while quietly watching the room and its diners.","predicament":"Someone mocking a way of life keeps looking at it more closely than they admit."},
{"chunk":277,"story":33,"summary":"He admires a woman across the room, muses about selling his ranch, orders two cocktails and says they are on him.","predicament":"Someone who came to scorn a place starts pricing what it would cost to stay."},
{"chunk":278,"story":34,"summary":"A speculator corners the flour market, adding two cents to every loaf, and retires with two million dollars.","predicament":"Someone grows rich by taking a little from everyone who cannot avoid buying."},
{"chunk":279,"story":34,"summary":"The speculator's easy-tempered son and his intense socialist friend meet again after college, when the son has inherited everything.","predicament":"Someone inherits a fortune and returns to the friend who despises how it was made."},
{"chunk":280,"story":34,"summary":"The heir says he wants to pay back the people overcharged for bread; his friend tells him it cannot be done.","predicament":"Someone wanting to undo an inherited wrong is told restitution is impossible."},
{"chunk":281,"story":34,"summary":"The heir presses for a way; his friend argues that each penny taken from the poor multiplied a thousandfold in harm.","predicament":"Someone offers money to repair harm and is told money cannot reach it."},
{"chunk":282,"story":34,"summary":"As an instance, a small baker was ruined by the price rise, went mad, burned a building and died in an asylum.","predicament":"One person's profit destroyed a small tradesman and everyone who depended on him."},
{"chunk":283,"story":34,"summary":"The last item of the instance is the baker's daughter sewing shirts for four dollars a week; she orders the heir out.","predicament":"Someone meets the person their family ruined and is refused even a hearing."},
{"chunk":284,"story":34,"summary":"Two months later the watchmaker meets her in furs, haggling over the price of bread: she has married the heir.","predicament":"Someone shut out by an injured person returns and marries them instead."},
{"chunk":285,"story":34,"summary":"A reporter says he could not make a funny column of a violinist's story, and hands the details to his writer friend.","predicament":"Someone cannot make the expected joke of a story and gives it to another."},
{"chunk":286,"story":34,"summary":"At a wedding twenty years ago the best man climbs the fire escape and begs the bride to run away with him.","predicament":"Someone who lost a rivalry makes a last desperate appeal on the day it is settled."},
{"chunk":287,"story":34,"summary":"She scorns him, and as he kisses her hand in farewell the bridegroom walks in on the two of them.","predicament":"Someone refuses an advance and is seen at the worst possible instant."},
{"chunk":288,"story":34,"summary":"The bridegroom throws her down and leaves forever; twenty years pass and she keeps the shop and loves him still.","predicament":"Someone is cast off over an innocent moment and waits decades without explanation."},
{"chunk":289,"story":34,"summary":"She refuses a suitor because she is still married, lets rooms, and a grey-haired violinist takes the front one.","predicament":"Someone refuses every new offer out of loyalty to a person long vanished."},
{"chunk":290,"story":34,"summary":"A second lodger with haunting eyes charms her, and she concludes he is her returned husband, but gives no sign.","predicament":"Someone believes a stranger is the person who left them, and waits to be told."},
{"chunk":291,"story":34,"summary":"The violinist declares his love and admits he knows neither his name nor anything before waking in a hospital.","predicament":"Someone offers marriage while admitting they do not know who they are."},
{"chunk":292,"story":34,"summary":"She tells him she is married; an hour later the other lodger begs her to forgive the wrong of twenty years.","predicament":"Someone bound by an old vow is asked by two people to choose between them."},
{"chunk":293,"story":34,"summary":"He confesses that he struck her husband down that night; she cries out, breaks away and runs upstairs toward the music.","predicament":"Someone learns their long loyalty was to the wrong person, and runs to the right one."},
{"chunk":294,"story":35,"summary":"An overworked lawyer parts from his wife in the usual way, recalling his doctor's warning that his brain may give way.","predicament":"Someone worn down by years of work ignores a warning that they will break."},
{"chunk":295,"story":35,"summary":"He wakes on a day coach with no memory of who he is, no papers, and three thousand dollars in his pocket.","predicament":"Someone comes to themselves among strangers with money and no idea who they are."},
{"chunk":296,"story":35,"summary":"Put on the spot by a friendly traveller, he invents a name and a trade on the strength of the man's own talk.","predicament":"Someone with no identity invents one from whatever is nearest to hand."},
{"chunk":297,"story":35,"summary":"The traveller presses his shelf-bottle reform, and hands him a newspaper item about a supposed case of lost memory.","predicament":"Someone hears their own condition dismissed as a fraud by a stranger."},
{"chunk":298,"story":35,"summary":"The item describes a prominent lawyer missing from home, who drew money from his bank and is feared broken by overwork.","predicament":"Someone reads a description of a missing person and defends them without recognising themselves."},
{"chunk":299,"story":35,"summary":"He registers under the invented name and feels a wild sense of freedom, as if just born into the world.","predicament":"Someone cut loose from every obligation finds the feeling exhilarating rather than frightening."},
{"chunk":300,"story":35,"summary":"Days of theatres, cabarets and crowds teach him that the city's freedom is held inside unwritten rules.","predicament":"Someone tasting complete liberty discovers it is bounded by rules nobody states."},
{"chunk":301,"story":35,"summary":"A man greets him by his real name; he denies it coldly, calls the man a confidence trickster and moves hotels.","predicament":"Someone recognised by a stranger denies their own name and moves on."},
{"chunk":302,"story":35,"summary":"A handsome woman stops him in a restaurant, sure of him after fifteen years, and he tells her he has forgotten everything.","predicament":"Someone is claimed by a person from a past they cannot remember."},
{"chunk":303,"story":35,"summary":"She asks whether he has ever dared look at white roses since that night, and tells him blissfully that he lies.","predicament":"Someone denying their past is told, happily, by another that the denial is false."},
{"chunk":304,"story":35,"summary":"He repeats the invented name until she goes; that night a quiet man leads him to his wife and his physician.","predicament":"Someone holding to an invention is brought face to face with the people they left."},
{"chunk":305,"story":35,"summary":"The wife throws herself on him and begs him to say her name; he unwinds her arms and the doctor leads her out.","predicament":"Someone refuses to acknowledge the person who has been searching for them."},
{"chunk":306,"story":35,"summary":"The doctor explains his name, his profession and his illness; he answers coolly and admires his wife's hair.","predicament":"Someone is told who they are and treats it as a conversation about a stranger."},
{"chunk":307,"story":35,"summary":"He engages the doctor in confidence, throws the white roses out of the window, and says the cure may happen now.","predicament":"Someone ends a holiday from themselves deliberately, having never lost anything at all."},
{"chunk":308,"story":36,"summary":"The narrator disputes the claim that only certain cities can hold a story, and arrives in a quiet southern capital.","predicament":"Someone insists that the dull place everyone dismisses can hold anything."},
{"chunk":309,"story":36,"summary":"He arrives in the drizzle, is driven to a renovated hotel by an ancient vehicle, and finds the service slow and courteous.","predicament":"Someone arrives somewhere expecting nothing and finds nothing to contradict them."},
{"chunk":310,"story":36,"summary":"A waiter tells him nothing happens after sundown; he walks the streets and finds quiet houses and little else.","predicament":"Someone looks for life in a strange town and is told there is none."},
{"chunk":311,"story":36,"summary":"In the lobby he meets a red, pulpy loafer with a blabbing lip whom he recognises at once as a type he detests.","predicament":"Someone instantly dislikes a stranger who is determined to be their friend."},
{"chunk":312,"story":36,"summary":"The loafer apologises for spitting near him, and within four minutes has made a friend of him and dragged him to the bar.","predicament":"Someone is annexed as a friend by a person they cannot easily shake off."},
{"chunk":313,"story":36,"summary":"The loafer boasts of ancestry and of his wife's income, shows a handful of silver, and the clerk offers to eject him.","predicament":"Someone lives on money that plainly is not theirs, and boasts about it."},
{"chunk":314,"story":36,"summary":"He declines to complain, asks what the town offers a stranger, and explains his errand to sign a local contributor.","predicament":"Someone tolerates a nuisance rather than take a hand in getting rid of them."},
{"chunk":315,"story":36,"summary":"Next morning he meets an ancient hack driver in a remarkable old military coat, patched with twine where its braid had been.","predicament":"Someone keeps the ruins of a fine thing repaired with whatever comes to hand."},
{"chunk":316,"story":36,"summary":"The coat keeps one yellow horn button and is tied shut with string; the carriage is as old as the coat.","predicament":"Someone's whole means of earning is held together by makeshift repairs."},
{"chunk":317,"story":36,"summary":"He names the address; the driver first bars his way with suspicion, then presses him eagerly into the carriage.","predicament":"Someone asking to visit a household is questioned closely by the person guarding it."},
{"chunk":318,"story":36,"summary":"At the house the driver demands two dollars instead of fifty cents, insisting not that it is right but that he needs it.","predicament":"Someone overcharges a stranger and admits it, saying only that they must have the money."},
{"chunk":319,"story":36,"summary":"He pays with a torn and patched dollar, and is received in a bare, decayed mansion by a frail, white-haired lady.","predicament":"Someone of old family receives a visitor with dignity in a house stripped of everything."},
{"chunk":320,"story":36,"summary":"Charmed by her talk and seeing her poverty, he cannot speak of rates, and sets the business for the next afternoon.","predicament":"Someone sent to strike a hard bargain finds they cannot raise the subject."},
{"chunk":321,"story":36,"summary":"She answers his platitude about dull towns by saying it is in the still places that things happen.","predicament":"Someone quietly contradicts a visitor's certainty that nothing happens where they live."},
{"chunk":322,"story":36,"summary":"She lists cruelties she has seen near and far, then answers a knock at the back and returns brighter, offering tea.","predicament":"Someone shows that the quiet place is as cruel as anywhere, then goes to answer a knock."},
{"chunk":323,"story":36,"summary":"She sends a small servant out with that same torn dollar; a man's voice and a scuffle follow, and the tea is withdrawn.","predicament":"Someone's small store of money is taken from them by force in the next room."},
{"chunk":324,"story":36,"summary":"The driver says she will not starve, that she has resources; the visitor wires his magazine a lie to raise her rate.","predicament":"Someone lies to their employer to get a poor person paid more than they asked."},
{"chunk":325,"story":36,"summary":"That evening the loafer slaps down the same torn and patched dollar at the bar, and the visitor recognises it.","predicament":"Someone sees the money they gave away turn up in the hands of a wastrel."},
{"chunk":326,"story":36,"summary":"She faints after signing the contract; the doctor calls it starvation, and names her as the loafer's wife.","predicament":"Someone is starving inside a marriage that everyone around them can see."},
{"chunk":327,"story":36,"summary":"The doctor says the husband takes even what her old servant gives her; the visitor advances her fifty dollars anyway.","predicament":"Someone gives money to a person they know will be robbed of it."},
{"chunk":328,"story":36,"summary":"The driver's last horn button is gone; two hours later the loafer is found dead in a street after a violent struggle.","predicament":"A person everyone despised is found dead, and nobody can find a good word."},
{"chunk":329,"story":36,"summary":"The dead hand drops a yellow horn button; the visitor pockets it and, leaving town, throws it into the river.","predicament":"Someone finds proof of who killed a hated man and quietly destroys it."}
]
@@ -0,0 +1,49 @@
[
{"chunk":330,"story":37,"summary":"From a rooftop the people below look like insects, and the watcher's mind expands to the immensity of the universe.","predicament":"Someone high above others finds it easy to think them insignificant."},
{"chunk":331,"story":37,"summary":"A candy-store clerk earning six dollars a week is courted by the man who keeps the smallest store in the city.","predicament":"Someone with nothing is courted by another with almost as little."},
{"chunk":332,"story":37,"summary":"She teases him daily about the size of his store, and lives herself in a room barely wider than her arms.","predicament":"Someone mocks another's smallness while living no larger themselves."},
{"chunk":333,"story":37,"summary":"A second suitor arrives at her boarding house, stuffed with facts and figures which he uses to dominate any table.","predicament":"Someone courts another by displaying knowledge instead of affection."},
{"chunk":334,"story":37,"summary":"The pair stop at the little store for chewing gum before going up to see the view, and she teases him again.","predicament":"Someone is shown their rival in front of them, and makes a joke of it."},
{"chunk":335,"story":37,"summary":"On the roof the philosopher calls the people below crawling insects; she says they are folks and asks to go down.","predicament":"Someone is shown a grand view and finds the people in it more real than the view."},
{"chunk":336,"story":37,"summary":"He presses on about the smallness of human affairs and the distance of the stars; she says she is afraid up here.","predicament":"Someone tries to impress another by making everything they care about seem small."},
{"chunk":337,"story":37,"summary":"A meteor blazes over the roof; she screams, demands to be taken down, and vanishes outside the door below.","predicament":"Someone's display of grandeur frightens off the person it was meant to win."},
{"chunk":338,"story":38,"summary":"A street runs north through grandeur and antique shops into a mediaeval gloom before diving into a tunnel.","predicament":"A place holds the leavings of grander lives and is passed through by everyone."},
{"chunk":339,"story":38,"summary":"A restaurant keeper of half-noble descent works by day and walks the city by night in search of mysteries.","predicament":"Someone of small means gives themselves the role of a great benefactor."},
{"chunk":340,"story":38,"summary":"He carries cards good for meals at his own place, and finds a melancholy young man flinging silver into the street.","predicament":"Someone whose only wealth is what they can give away goes looking for someone to help."},
{"chunk":341,"story":38,"summary":"He takes the young man's arm and leads him to a park bench to learn what drives him to such waste.","predicament":"Someone sees another destroying what they have and stops them to ask why."},
{"chunk":342,"story":38,"summary":"He explains that he studies people and seeks to relieve distress in city streets, and invites the young man's confidence.","predicament":"Someone offers help in grand terms to a stranger who has not asked for it."},
{"chunk":343,"story":38,"summary":"The young man works in a harness shop; the owner's daughter will go to whichever man answers his riddle first.","predicament":"Someone's chance at marriage is made to depend on a foolish test set by another."},
{"chunk":344,"story":38,"summary":"The riddle is what kind of hen lays the longest, and the young man asks the would-be benefactor to answer it.","predicament":"Someone's whole future turns on a trivial question they cannot answer."},
{"chunk":345,"story":38,"summary":"The benefactor cannot solve it and, humiliated, presses one of his meal cards on the young man as they part.","predicament":"Someone who promised to help anyone finds they cannot, and gives what they have."},
{"chunk":346,"story":38,"summary":"Next morning the rival fails; reading the card in his pocket, the young man answers a dead one and wins the party.","predicament":"Someone's answer comes by accident from the help that seemed to be worthless."},
{"chunk":347,"story":39,"summary":"A rich child of five loses the cheap rag-doll she loves, and the whole household cannot find it.","predicament":"Someone grieves for a worthless thing that all their family's money cannot replace."},
{"chunk":348,"story":39,"summary":"Expensive toys and doctors fail to console her; parents and servants are helpless as the season comes on.","predicament":"Someone's money buys every substitute and none of them is the thing wanted."},
{"chunk":349,"story":39,"summary":"The terrier had buried the doll in a corner of the lawn; meanwhile a decently drunk tramp walks the neighbouring street.","predicament":"The thing everyone is hunting lies in plain reach of a passing stranger."},
{"chunk":350,"story":39,"summary":"The tramp digs out the doll, takes it into a saloon and earns drinks by addressing it as his lady friend.","predicament":"Someone with nothing finds a prop that earns them attention and drink."},
{"chunk":351,"story":39,"summary":"Three local toughs read of a hundred-dollar reward for the doll, and one offers the tramp fifty cents for it.","predicament":"Someone holding something valuable is offered a pittance by people who know its worth."},
{"chunk":352,"story":39,"summary":"The tramp laughs and refuses, saying money cannot buy her; he is drunk on his first success as a performer.","predicament":"Someone refuses a good price because what they hold has given them something better."},
{"chunk":353,"story":39,"summary":"The toughs show him the advertisement; he agrees to claim the reward, and they follow him armed to the gate.","predicament":"Someone is helped toward a prize by people who mean to take it from them."},
{"chunk":354,"story":39,"summary":"He rings, the doll is restored, and the child screams hatred at the ragged man who brought her treasure back.","predicament":"Someone's one good act is received with disgust by the person it was for."},
{"chunk":355,"story":39,"summary":"A secretary counts him a hundred dollars and has him shown out, while the three wait beyond the gate.","predicament":"Someone receives what they came for and is walked toward the people waiting to take it."},
{"chunk":356,"story":39,"summary":"At the door the holly and the harp music stir old memories, and he insists on paying his compliments to the lady.","predicament":"Someone far fallen is reminded of the manners of the life they came from."},
{"chunk":357,"story":39,"summary":"The lady receives him, wine is brought, and he begins the old family salutation before his memory fails.","predicament":"Someone tries to perform a courtesy from a past they can no longer fully recall."},
{"chunk":358,"story":39,"summary":"As he is shown out she orders the motor car brought round to take him wherever he wishes to go.","predicament":"Someone is saved from waiting danger by a kindness that was never meant as rescue."},
{"chunk":359,"story":40,"summary":"The city swarms with rich men in search of people to relieve, and the poor hide from their attentions.","predicament":"People with more than they need hunt for someone to receive their generosity."},
{"chunk":360,"story":40,"summary":"A retired magnate declares that squaring one old ten thousand dollars would do the trick; he rose from a breaker boy.","predicament":"Someone rich decides one specific old debt is what stands between them and peace."},
{"chunk":361,"story":40,"summary":"Rich beyond counting, he builds a palace and begins to worry about his soul's salvation.","predicament":"Someone with more money than they can use starts worrying about how they got it."},
{"chunk":362,"story":40,"summary":"His million to a charity is misreported and his laboratory gift is built as a lavatory, and he is given a degree.","predicament":"Someone's large gifts go astray and bring them no credit at all."},
{"chunk":363,"story":40,"summary":"Overhearing professors mock him, he wearies of giving on a large scale and decides to see gratitude himself.","predicament":"Someone giving generously overhears what the receivers really think of them."},
{"chunk":364,"story":40,"summary":"A district boss corners him and says the poor there belong to him, and warns him to keep to his own part of town.","predicament":"Someone offering charity is told the people they meant to help are already spoken for."},
{"chunk":365,"story":40,"summary":"He doubles his donations, buys a young woman a stage part, and still finds no relief; his sister and daughter keep his house.","predicament":"Someone tries every way of giving money away and none of it eases them."},
{"chunk":366,"story":40,"summary":"The daughter, plain, loud and healthy, looks out of a window and gives her heart to the grocer's young man.","predicament":"Someone with every advantage falls for a person who has not noticed them."},
{"chunk":367,"story":40,"summary":"She watches the confident young driver three days running and then consults the housemaid who is her friend.","predicament":"Someone plans an approach to a person they have only watched from a window."},
{"chunk":368,"story":40,"summary":"She borrows a cap and apron, passes as a maid, and he stops for her whistling and gives his name.","predicament":"Someone conceals their wealth to be liked for something other than money."},
{"chunk":369,"story":40,"summary":"They whistle duets and he talks of sixteen dollars a week and flats, while she never counts on her father's money.","predicament":"Two people plan a life on wages one of them could cover in an afternoon."},
{"chunk":370,"story":40,"summary":"Raised to eighteen a week, he tells her to untie the apron strings, and they count up what she can do.","predicament":"Two people persuade themselves that a small wage is enough to marry on."},
{"chunk":371,"story":40,"summary":"The old debt was a hillside bought for a trifle from a miner and sold a month later for ten thousand.","predicament":"Someone's fortune began with a bargain that ruined the person who sold it."},
{"chunk":372,"story":40,"summary":"Detectives trace the heir to the grocer's man; the magnate pays him the ten thousand as another man's agent.","predicament":"Someone makes restitution while hiding that they were the one who took it."},
{"chunk":373,"story":40,"summary":"Invited to call and meet the daughter, the young man says he is engaged to a parlour maid and must deliver his goods.","predicament":"Someone refuses an opening into a higher life because they are already promised."},
{"chunk":374,"story":40,"summary":"She confesses she is the heiress; he says her father will refuse, and she says she will marry him tonight.","predicament":"Someone confesses the fortune they hid, and proposes to act before it can matter."},
{"chunk":375,"story":40,"summary":"The father's car runs the cab down; two years later he refuses every charity and cuts salaries to save money.","predicament":"Someone who gave money away freely stops the moment they have an heir."},
{"chunk":376,"story":40,"summary":"He shows the mark his grandson's new tooth made, and raises the price of vinegar three cents instead of two.","predicament":"Someone's new devotion to one person makes them harder on everyone else."}
]
@@ -0,0 +1,54 @@
[
{"chunk":377,"story":41,"summary":"A young woman works the cashier's cage at a crowded downtown restaurant, taking money through an arch in a brass screen.","predicament":"Someone works where everyone must pass them and pay."},
{"chunk":378,"story":41,"summary":"She counts change, deflects proposals and rates every customer at once, and every man who pays adores her.","predicament":"Someone's position makes them the object of everyone's flattery all day long."},
{"chunk":379,"story":41,"summary":"The young men trade compliments and hints of presents, and one broker proposes to her more often than he eats.","predicament":"Someone receives offers so constantly that none of them can be taken seriously."},
{"chunk":380,"story":41,"summary":"Her talk runs on in one stream of sums, refusals, appointments and rebukes as the queue pays and passes.","predicament":"Someone handles money and flattery in the same breath, all day, by pure habit."},
{"chunk":381,"story":41,"summary":"An old banker collapses outside, is carried in, and he and his wife take to the beautiful cashier who tended him.","predicament":"Someone's kindness in an emergency wins them the notice of people far above them."},
{"chunk":382,"story":41,"summary":"She resigns to be adopted, saying she will miss the cage, and money is poured out to polish her.","predicament":"Someone leaves the only work they know for a life that must be taught to them."},
{"chunk":383,"story":41,"summary":"At a charity bazaar an earl approaches her booth's brass wicket; she answers him as a cashier would, and faints.","predicament":"Someone's old habit answers for them at the moment their new life is decided."},
{"chunk":384,"story":42,"summary":"A magazine editor, content with his life, wanders into a small park on a spring afternoon.","predicament":"Someone comfortable and well pleased with themselves takes a walk."},
{"chunk":385,"story":42,"summary":"Pleased by his sales, his salary and his wife's new devotion to singing, he is caught by the sleeve by a shabby acquaintance.","predicament":"Someone at their most satisfied is stopped in the street by a friend who has failed."},
{"chunk":386,"story":42,"summary":"The shabby man is a fiction writer ruined by a loss, whose stories the editor returns with careful letters of explanation.","predicament":"Someone poor keeps submitting work to a prosperous friend who keeps refusing it."},
{"chunk":387,"story":42,"summary":"On a park bench the writer calls it his office and insists he will force the magazines to admit his work is good.","predicament":"Someone with nothing left insists that the people rejecting them are wrong."},
{"chunk":388,"story":42,"summary":"The editor praises the plot and style, then says he spoils every climax with flat and drab strokes.","predicament":"Someone is told the exact thing they believe in is what ruins their work."},
{"chunk":389,"story":42,"summary":"They argue whether a mother whose child is taken speaks in grand words or in her ordinary muddled ones.","predicament":"Two people argue about how a person really behaves at the worst moment of their life."},
{"chunk":390,"story":42,"summary":"The editor holds that deep emotion calls out a fitting and elevated expression, learned from the stage and from life.","predicament":"Someone defends a theory about others' feelings that neither of them has tested."},
{"chunk":391,"story":42,"summary":"The writer quotes his own banal lines, and asks whether the editor would buy the story if it were proved true to life.","predicament":"Someone asks whether proof would change the mind that has judged them."},
{"chunk":392,"story":42,"summary":"The writer proposes to prove it from life with his own wife, saying he is down to his last dollar.","predicament":"Someone desperate offers to test a theory on the person closest to them."},
{"chunk":393,"story":42,"summary":"The scheme is a false note saying he has run off; the editor calls it cruel and the writer presses him.","predicament":"Someone proposes to wound another to win an argument, and calls it harmless."},
{"chunk":394,"story":42,"summary":"They climb to the bare flat, where he finds a note his wife left that morning and reads it aloud.","predicament":"Someone setting a trap finds the real thing has already been sprung on them."},
{"chunk":395,"story":42,"summary":"The wives have gone on the road together; the writer declaims in grand style and the editor blurts out slang.","predicament":"Two people are struck by the same blow and each answers it in the other's manner."},
{"chunk":396,"story":43,"summary":"Two rival gangs observe strict politeness in a saloon while each watches the other in the mirror.","predicament":"People bound by a feud share a room and keep their manners until they cannot."},
{"chunk":397,"story":43,"summary":"The etiquette breaks, one man is knifed in the dark, and the wounded man refuses to name who did it.","predicament":"Someone injured refuses to name their attacker, meaning to settle it themselves."},
{"chunk":398,"story":43,"summary":"The saloon keeper has told the police, so the knifer must stay hidden until the fixer returns from abroad.","predicament":"Someone must stay out of sight until the one person who can protect them returns."},
{"chunk":399,"story":43,"summary":"A week of hiding becomes unbearable and he goes to an unfamiliar late resort where nobody knows him.","predicament":"Someone in hiding risks one night out where they hope not to be recognised."},
{"chunk":400,"story":43,"summary":"The resort's distinction is that women may smoke there, which makes its proprietor twenty years ahead of his time.","predicament":"A place draws people by permitting what everywhere else forbids."},
{"chunk":401,"story":43,"summary":"A girl comes in alone, sits opposite him, lights a cigarette and smiles at him, and both are done for.","predicament":"Two strangers decide about each other in the space of a single look."},
{"chunk":402,"story":43,"summary":"Each at once begins to pretend; she explains her cigarette by an aunt, and he tells her to stop it.","predicament":"Two people who have just met begin immediately to improve their own histories."},
{"chunk":403,"story":43,"summary":"She gives a fine name, says she binds books and works overtime, and only came in for a smoke.","predicament":"Someone explains their presence somewhere improper as innocently as they can."},
{"chunk":404,"story":43,"summary":"He offers to walk her home and invents a rich father and a seat on the exchange to recommend himself.","predicament":"Someone invents a grand family to make themselves acceptable to a person they like."},
{"chunk":405,"story":43,"summary":"At one the doors are locked and the drinks become illegal, which sweetens everything in the room.","predicament":"People value an ordinary pleasure more once it is forbidden."},
{"chunk":406,"story":43,"summary":"He asks whether her story was true, believes her, and asks her to be his steady girl.","predicament":"Someone asks the person they want for a plain account of who they are."},
{"chunk":407,"story":43,"summary":"They arrange a visit on Thursday; then blows fall on the street door and the lights go out.","predicament":"Two people making plans are interrupted by the thing one of them was hiding from."},
{"chunk":408,"story":43,"summary":"The guests escape by a ladder; she stops to ask again whether he really likes her, and they are left behind.","predicament":"Someone loses their chance to escape by stopping to ask for reassurance."},
{"chunk":409,"story":43,"summary":"A policeman finds the two, takes off his hat, names him as the man who knifed another, and orders him along.","predicament":"Someone in hiding is recognised by an officer who means to take them in."},
{"chunk":410,"story":43,"summary":"She hurls herself at the officer, claims the man as hers, throws money on the table and names the bribe he takes.","predicament":"Someone saves another by revealing exactly what they are and what the officer is."},
{"chunk":411,"story":43,"summary":"Outside he hands the money back; she says he will not want to see her, and tells him what she had hoped to be.","predicament":"Someone gives up the person they wanted rather than be taken for what they are."},
{"chunk":412,"story":43,"summary":"He confesses his own lies, takes her two blocks to a clergyman's door and rings the bell.","predicament":"Someone answers another's confession by marrying them on the spot."},
{"chunk":413,"story":44,"summary":"The essay distinguishes fortune, adventure and chance, and names the venturer as one who watches the roadside.","predicament":"Someone travelling toward a goal cares more for what lies beside the road."},
{"chunk":414,"story":44,"summary":"A clubman walks out on a familiar story, craving a turn of events whose ending he cannot already foresee.","predicament":"Someone knows the end of every road available to them and wants one they do not."},
{"chunk":415,"story":44,"summary":"He wanders an hour, declines his favourite hotel as no venture, and decides to dine somewhere doubtful instead.","predicament":"Someone deliberately chooses discomfort in the hope of being surprised."},
{"chunk":416,"story":44,"summary":"He finds not a penny in thirteen pockets, and a stranger nearby admits he has just done the same.","predicament":"Someone with money in the bank and none in their pocket meets another in the same case."},
{"chunk":417,"story":44,"summary":"The stranger proposes they dine expensively and match his two pennies to see who faces the bill.","predicament":"Two strangers agree to run a risk together for the sake of the outcome."},
{"chunk":418,"story":44,"summary":"The stranger explains he seeks adventures whose conclusion he cannot predict, and would bet without seeing his hand.","predicament":"Someone wants to act without being able to guess what will follow."},
{"chunk":419,"story":44,"summary":"He says civilisation has posted signboards on every path, and that even ruin now has a known address.","predicament":"Someone complains that every risk available to them has a predictable end."},
{"chunk":420,"story":44,"summary":"His most promising premise, a veiled lady's note in a bazaar, ended with a journalist wanting newspaper work.","predicament":"Someone's most mysterious opening turned out to have an ordinary explanation."},
{"chunk":421,"story":44,"summary":"Rapids, cards and strange doorbells all end conventionally; the only certain thing is that nothing is uncertain.","predicament":"Someone has tried every risk they can think of and found each one predictable."},
{"chunk":422,"story":44,"summary":"The clubman loses the toss and proposes the other slip away while he holds the check and faces the outcome.","predicament":"Someone loses a wager and arranges for the winner to escape the consequence."},
{"chunk":423,"story":44,"summary":"He signs the check, confessing he dines there weekly; the other confesses he owns the hotel.","predicament":"Two people risking everything discover neither was risking anything at all."},
{"chunk":424,"story":44,"summary":"The clubman says he is engaged, loves the lady, and dreads the certainty of everything that will follow.","predicament":"Someone loves a person and fears the life with them for being entirely foreseeable."},
{"chunk":425,"story":44,"summary":"The hotel owner calls at an unchanging old house and is met warmly by a young woman he has known for years.","predicament":"Someone returns after years to a person and a house that have not changed at all."},
{"chunk":426,"story":44,"summary":"She recalls that he never would play a game with rules, and tells him plainly he could have had her.","predicament":"Someone is told by another that the thing they wanted was always available."},
{"chunk":427,"story":44,"summary":"He reflects that she and the house offer no surprises; she says she is going to be married soon.","predicament":"Someone left a person for being predictable and finds they are about to be lost."},
{"chunk":428,"story":44,"summary":"The clubman sails to escape certainty; the other says he has found the real hazard, having married her yesterday.","predicament":"Someone finds the greatest uncertainty in the very commitment another is fleeing."}
]
@@ -0,0 +1,43 @@
[
{"chunk":429,"story":45,"summary":"Everyone arriving in the city must fight it at once, with no rounds and no rest, until one of them wins.","predicament":"Everyone who arrives in a new place must contend with it from the first day."},
{"chunk":430,"story":45,"summary":"The newcomer must become part of the place or its enemy; two friends from the West arrive together to make their fortunes.","predicament":"Two friends arrive somewhere new, each meaning not to be changed by it."},
{"chunk":431,"story":45,"summary":"Four years on, the businessman bustles in to lunch and the artist tells him the city has swallowed and stamped him.","predicament":"Someone tells an old friend that the place has remade them into everyone else."},
{"chunk":432,"story":45,"summary":"The businessman shrugs it off, says the place is good enough for him and that it is giving him his share.","predicament":"Someone accused of being changed answers that the change has paid them well."},
{"chunk":433,"story":45,"summary":"He lists his eight thousand a year, his introductions, his motor rides and his shows, and asks what the objection is.","predicament":"Someone measures their life by what it buys and cannot see what is meant."},
{"chunk":434,"story":45,"summary":"The artist calls the place a leech and a monster, swears it will never take him, and longs for the country he left.","predicament":"Someone declares they will never be changed by what has already changed their friend."},
{"chunk":435,"story":45,"summary":"At midnight the artist looks out at the lights, and answers a telegram offering him what he wanted with a refusal.","predicament":"Someone who swore they were unconquered refuses the chance to leave."},
{"chunk":436,"story":46,"summary":"A very rich old man, tired of everything money buys, decides to go about the city looking for something new.","predicament":"Someone who can buy anything wants something they cannot pay for."},
{"chunk":437,"story":46,"summary":"He dresses plainly and sets out to find someone in trouble to help; across town a young workman leaves his job.","predicament":"Someone sets out to do good to a stranger they have not yet chosen."},
{"chunk":438,"story":46,"summary":"A hat cleaner stands at a machine all day for twelve dollars a week, his feet burning and smarting.","predicament":"Someone works long hours in pain for wages that only just keep them."},
{"chunk":439,"story":46,"summary":"His happiness is cool metal against his burning feet and a sea story; he stops at a second-hand bookstall.","predicament":"Someone has found exactly the small comfort that makes their day bearable."},
{"chunk":440,"story":46,"summary":"The rich man offers to pay for his education, his travels abroad and a business of his own choosing.","predicament":"Someone is offered everything they never asked for by a stranger in the street."},
{"chunk":441,"story":46,"summary":"The young man takes him for a swindler and tells him to be off before something happens to him.","predicament":"Someone offered an impossible gift assumes a trick and refuses it rudely."},
{"chunk":442,"story":46,"summary":"They fight, are jailed, and in his cell the young man puts his feet on the cold bars and finds a sea story.","predicament":"Someone locked up finds by accident the exact comfort they most wanted."},
{"chunk":443,"story":47,"summary":"A man whose sweetheart vanished on her way from Ireland is taken to the seaside, and stops at a palmist's stall.","predicament":"Someone whose promised person has vanished looks for an answer anywhere."},
{"chunk":444,"story":47,"summary":"The palmist foretells trouble from a dark man and a fair woman, a voyage, a loss, and luck from a crooked-nosed man.","predicament":"Someone in trouble is given a list of signs to watch for and believes it."},
{"chunk":445,"story":47,"summary":"Leaving, he is burned by a stranger's cigar, loses his change in the scuffle, and his hat blows overboard.","predicament":"Someone's run of small disasters begins as soon as they are warned of it."},
{"chunk":446,"story":47,"summary":"He counts each mishap as a prophecy fulfilled and insists the reading is coming true before their eyes.","predicament":"Someone fits every ordinary misfortune to the prediction they were given."},
{"chunk":447,"story":47,"summary":"They find a long man with a twice-twisted nose and demand his name, testing it against the letters foretold.","predicament":"Someone stops a stranger in the street because they match a promised description."},
{"chunk":448,"story":47,"summary":"The stranger asks their excuse for being at large, is given it, and tries to walk away from the pair.","predicament":"Someone tries to escape two strangers who believe they owe them a fortune."},
{"chunk":449,"story":47,"summary":"One of them declares he will sit at the stranger's door till morning, since all their luck depends on him.","predicament":"Someone attaches themselves to a stranger they have decided their fortune rests on."},
{"chunk":450,"story":47,"summary":"The friend explains the palmist's reading and says it strains friendship to stand by a born fool.","predicament":"Someone stays loyal to a friend whose belief they think is nonsense."},
{"chunk":451,"story":47,"summary":"The stranger laughs, takes them for drinks, and explains he walks at night collecting oddities for a book.","predicament":"Someone who collects other people's strangeness is delighted to be taken for a sign."},
{"chunk":452,"story":47,"summary":"The believer grows angry that the promised luck has produced nothing but talk, and drinks with red in his eye.","predicament":"Someone's promised good fortune produces only conversation, and they resent it."},
{"chunk":453,"story":47,"summary":"He invites them down to his basement for cold fowl, and mentions the green girl in his kitchen by name.","predicament":"Someone hears, in passing, the name of the person they had given up for lost."},
{"chunk":454,"story":48,"summary":"A wife has one dollar and eighty-seven cents saved for a Christmas present, in a flat whose rent eats the wages.","predicament":"Someone has saved for months and still cannot afford the gift they intend."},
{"chunk":455,"story":48,"summary":"She cries, then stands before the glass, lets her hair fall its full length, and her face goes pale.","predicament":"Someone out of money considers the one thing of value they still own."},
{"chunk":456,"story":48,"summary":"The household's two treasures are his inherited watch and her hair; she sells the hair for twenty dollars.","predicament":"Someone sells the one thing they were proud of to buy another a gift."},
{"chunk":457,"story":48,"summary":"She buys a plain chain worthy of the watch, curls what is left of her hair, and waits for him.","predicament":"Someone spends everything on a gift and then fears how they will be seen."},
{"chunk":458,"story":48,"summary":"He stops inside the door with an unreadable look; she begs him not to mind and explains what she did.","predicament":"Someone confesses a sacrifice and cannot read the face of the person it was for."},
{"chunk":459,"story":48,"summary":"He wakes from his trance, holds her, and tells her to unwrap the package to see what startled him.","predicament":"Someone reassures another and then hands over the gift that will explain everything."},
{"chunk":460,"story":48,"summary":"The gift is the set of combs she longed for; then he says he sold the watch to buy them.","predicament":"Two people each sold their treasure to buy the other what now cannot be used."},
{"chunk":461,"story":48,"summary":"Of all who give gifts, the narrator says, these two who sacrificed their greatest treasures were the wisest.","predicament":"Two people give away what they cannot spare and are counted wise for it."},
{"chunk":462,"story":49,"summary":"At midnight in a crowded cafe a stranger takes the vacant chair, and the narrator hopes for a true citizen of the world.","predicament":"Someone hoping to find a rare kind of person sits waiting to be joined."},
{"chunk":463,"story":49,"summary":"The stranger talks of every country as familiarly as a garden, impartial to cities, continents and zones alike.","predicament":"Someone claims every place as home and none as theirs in particular."},
{"chunk":464,"story":49,"summary":"Against the poet's claim that men cling to their birthplace, this man seems free of it; then the band plays a southern air.","predicament":"Someone appears to have escaped the loyalty that everyone else is bound by."},
{"chunk":465,"story":49,"summary":"A young man leaps up cheering the tune and joins the table; the narrator starts to ask where he is from.","predicament":"Someone tests a theory by asking a stranger where they come from."},
{"chunk":466,"story":49,"summary":"The traveller bangs the table: a man should not be judged by his post-office address, nor labelled by a section.","predicament":"Someone insists it should not matter where anybody comes from."},
{"chunk":467,"story":49,"summary":"He lists rooms and slippers waiting in a dozen countries, and calls pride in one's birthplace a relic.","predicament":"Someone argues that attachment to a birthplace is a weakness to be outgrown."},
{"chunk":468,"story":49,"summary":"He denies having any spot he thinks of, calls himself a citizen of the sphere, and goes off through the crowd.","predicament":"Someone denies having any attachment at all, and takes their leave."},
{"chunk":469,"story":49,"summary":"A brawl breaks out: the man is fighting someone who slighted the sidewalks of the small town he came from.","predicament":"Someone who denied caring where they came from fights the first person to insult it."}
]
@@ -0,0 +1,49 @@
[
{"chunk":470,"story":50,"summary":"A wife waits with cooling supper, and greets her husband with a complaint that he apologises to strangers but never to her.","predicament":"Someone waiting at home resents the courtesy another spends on everyone else."},
{"chunk":471,"story":50,"summary":"He answers with an insult, and she hurls the supper at him; the two throw the dishes course by course.","predicament":"Two people settle a grievance by throwing what they have at each other."},
{"chunk":472,"story":50,"summary":"The duel escalates to the wash basin, and a scream downstairs halts them; the policeman outside decides not to interfere.","predicament":"Two people's regular quarrel is left alone by everyone who hears it."},
{"chunk":473,"story":50,"summary":"The landlady's small boy is lost; the boarders exclaim, pair off, and one sets out to scour the city for him.","predicament":"A child's disappearance gives everyone around a reason to act on their own account."},
{"chunk":474,"story":50,"summary":"She cannot say when she last saw him; the news of a straying child moves everyone who hears it.","predicament":"Someone raises an alarm without being able to say when the trouble began."},
{"chunk":475,"story":50,"summary":"At the window the couple speak of the son they never had, quarrel gently over his name, and she apologises.","predicament":"Two people at war soften when another's loss makes them imagine their own."},
{"chunk":476,"story":50,"summary":"They sit arm in arm watching the search, until word comes that the boy was asleep under a bed all along.","predicament":"Two people are brought together by an emergency that turns out to be nothing."},
{"chunk":477,"story":50,"summary":"He mocks the name she chose, the crockery flies again, and the policeman times the quarrel by his watch.","predicament":"Two people's peace lasts only until one of them makes a joke of it."},
{"chunk":478,"story":51,"summary":"A landlady shows each room in descending order of price, scorning anyone who confesses they need something cheaper.","predicament":"Someone looking for lodging is judged by how little they can pay."},
{"chunk":479,"story":51,"summary":"The cheapest room is a coffin-sized space with a skylight; a very small young woman comes hunting a room.","predicament":"Someone can afford only a space barely big enough to lie down in."},
{"chunk":480,"story":51,"summary":"She takes it at two dollars, copies papers at night, and is gay-hearted enough to hear out a lodger's play.","predicament":"Someone living in the poorest room keeps everyone around them cheerful."},
{"chunk":481,"story":51,"summary":"The men gather round her on the stoop while two other women sniff; three of them privately court her.","predicament":"Someone popular with everyone is resented by those who are not."},
{"chunk":482,"story":51,"summary":"She points out the steady blue star she can see through her skylight and says she has named it herself.","predicament":"Someone shut in a dark place gives a private name to the one thing they can see."},
{"chunk":483,"story":51,"summary":"Work fails; she goes hungry from office to office, refuses a proposal in the hall, and crawls up to her room.","predicament":"Someone out of work refuses the offer that would feed them and climbs the stairs alone."},
{"chunk":484,"story":51,"summary":"She blows a kiss to the star and says goodbye; next morning the door is forced and an ambulance is called.","predicament":"Someone at the end of their strength says farewell to the only thing that kept them company."},
{"chunk":485,"story":51,"summary":"The doctor carries her out like his own dead; the paper names him William Jackson, and says she will recover.","predicament":"Someone is carried out by a stranger who bears the name they invented in the dark."},
{"chunk":486,"story":52,"summary":"Two art students from small towns meet, marry, and set up in a small flat with their studies and each other.","predicament":"Two people with talent and little money marry and live on their studies."},
{"chunk":487,"story":52,"summary":"They are happy while the money lasts, each studying under an expensive master toward a clear ambition.","predicament":"Two people spend what they have on training toward futures they cannot yet reach."},
{"chunk":488,"story":52,"summary":"When the money fails she says she has found a pupil in a splendid house at five dollars a lesson.","predicament":"Someone announces they have found work so that the other need not stop studying."},
{"chunk":489,"story":52,"summary":"He protests at her working while he studies; she insists, and from then on both leave the house early.","predicament":"Someone lets another carry the household so that their own work can continue."},
{"chunk":490,"story":52,"summary":"She brings home fifteen dollars with stories of the household; he lays down eighteen from a sketch sold to a stranger.","predicament":"Two people each produce money and an account of where it came from."},
{"chunk":491,"story":52,"summary":"She comes home with a bandaged hand and a story about spilled rarebit; he asks quietly what time it happened.","predicament":"Someone hides an injury behind a story and is asked one question too many."},
{"chunk":492,"story":52,"summary":"She confesses she has been ironing in a laundry; he confesses he has been firing its engine for two weeks.","predicament":"Two people each hid the same humble work from the other to protect them."},
{"chunk":493,"story":53,"summary":"At a weekly club dance, a plain young woman always goes escorted by her friend and her friend's fellow.","predicament":"Someone without a partner attends only on the charity of a friend."},
{"chunk":494,"story":53,"summary":"She tells her friend not to call for her: she has a gentleman friend of her own coming to escort her.","predicament":"Someone who has always been pitied announces they no longer need the favour."},
{"chunk":495,"story":53,"summary":"The escort proves tall, dark-curled and graceful, quite unlike the club's muscular young men, and she leads him round proudly.","predicament":"Someone arrives with a companion who plainly outshines everyone in the room."},
{"chunk":496,"story":53,"summary":"Her evening is a triumph, but he takes the honours, and waltzes twice with the leader's own partner.","predicament":"Someone's guest wins the room and then offends the one person who matters."},
{"chunk":497,"story":53,"summary":"The club's leader, told the visitor is unknown to the district's chief, stops him on the floor and asks where he lives.","predicament":"Someone in charge questions a stranger nobody can vouch for."},
{"chunk":498,"story":53,"summary":"Neither will yield; the leader demands proof of the visitor's name and then insults him outright.","predicament":"Two people who cannot share a room force the question of who belongs."},
{"chunk":499,"story":53,"summary":"The board conducts the visitor to the back room where quarrels are settled, and word reaches her of it.","predicament":"Someone's companion is quietly taken away to be dealt with by the others."},
{"chunk":500,"story":53,"summary":"She bursts in and snatches the long knife from her escort's raised arm before it can be used.","predicament":"Someone stops the person they brought from doing what cannot be forgiven."},
{"chunk":501,"story":53,"summary":"She confesses she dressed him in a false name to have an escort at last; the leader offers to take her next week.","predicament":"Someone confesses the pretence that got them noticed, and is taken seriously at last."},
{"chunk":502,"story":54,"summary":"A man in search of answers sets out to learn what exactly is meant by the type called a man about town.","predicament":"Someone will not let a vague description rest until they can picture it."},
{"chunk":503,"story":54,"summary":"A reporter gives a loose account of the type, and the seeker walks the bright street ignoring everyone else.","predicament":"Someone looking for one particular kind of person passes all the others by."},
{"chunk":504,"story":54,"summary":"He asks a barman, who answers in slang, then stops a collector on the sidewalk with the same question.","predicament":"Someone asks everyone they meet the same question and gets a different answer."},
{"chunk":505,"story":54,"summary":"A critic defines the type as a man sick with wanting to see and know, who pokes into every new place.","predicament":"Someone hears their quarry described as pure curiosity and impudence."},
{"chunk":506,"story":54,"summary":"The critic warms to his portrait; the seeker begs to be shown a real specimen rather than a description.","predicament":"Someone given a perfect description insists on meeting the thing itself."},
{"chunk":507,"story":54,"summary":"He refuses dinner to keep hunting, is knocked down crossing the street, and the paper calls him a typical specimen.","predicament":"Someone searching everywhere for a type is finally identified as one themselves."},
{"chunk":508,"story":55,"summary":"Winter is coming and the park sleeper decides his plan: three months of board and lodging on the island prison.","predicament":"Someone with nowhere to go for the winter decides prison is the best available."},
{"chunk":509,"story":55,"summary":"He prefers the law to charity, which exacts humiliation, and resolves to dine well and then declare he cannot pay.","predicament":"Someone refuses charity because of what it costs them, and plans a crime instead."},
{"chunk":510,"story":55,"summary":"At the glittering restaurant door the head waiter sees his shoes and trousers and he is turned out at once.","predicament":"Someone is refused entry before they can commit the offence they came to commit."},
{"chunk":511,"story":55,"summary":"He breaks a window and waits, but the officer will not believe him; he then eats where the food is cheap.","predicament":"Someone confesses to an act and is not believed because nobody behaves that way."},
{"chunk":512,"story":55,"summary":"The waiters pitch him onto the pavement; he next tries insulting a young woman in front of a policeman.","predicament":"Someone tries a worse offence after the first attempt fails to get attention."},
{"chunk":513,"story":55,"summary":"The young woman takes his arm gladly; he shakes her off, then howls and dances and is excused as a student.","predicament":"Someone behaves as badly as they can and every attempt is taken kindly."},
{"chunk":514,"story":55,"summary":"He takes another man's umbrella openly, and the owner apologises and gives it up rather than call the officer.","predicament":"Someone steals in plain sight and the person robbed gives way to them."},
{"chunk":515,"story":55,"summary":"At an old church the organ anthem holds him, and he sees with horror what his days have become.","predicament":"Someone hears music from an earlier life and sees clearly what they have become."},
{"chunk":516,"story":55,"summary":"He resolves to find work and be somebody; a hand falls on his arm, and the magistrate gives him three months.","predicament":"Someone decides to change their life and is punished the instant they do."}
]
@@ -0,0 +1,48 @@
[
{"chunk":517,"story":56,"summary":"Three penniless friends eat on credit at a cheap restaurant whose owner lets them pay or not as they can.","predicament":"People with no money eat where the owner tolerates their unpaid scores."},
{"chunk":518,"story":56,"summary":"The restaurant's waitress is a magnificent figure who seems to belong entirely to the place she serves in.","predicament":"Someone fits their place so perfectly that others cannot imagine them elsewhere."},
{"chunk":519,"story":56,"summary":"She mothers and overfeeds them for nothing; one of them says a fate hangs over her that would take her away.","predicament":"People fear that the person who feeds them will be taken away by better fortune."},
{"chunk":520,"story":56,"summary":"The prediction is a rich timberman who will marry her and remove her from the place where she belongs.","predicament":"People dread the good fortune that would take a friend out of their reach."},
{"chunk":521,"story":56,"summary":"A bearded miner arrives boasting of two millions, and is struck dumb the moment the waitress looms up with his order.","predicament":"A newly rich stranger is instantly taken with the person others depend on."},
{"chunk":522,"story":56,"summary":"The three rush him out to drink, goad him into paying for everything, and have him carted to a distant hotel.","predicament":"People remove a rival by spending his own money until he is helpless."},
{"chunk":523,"story":56,"summary":"Three years later the painter's picture of her sells for five thousand, and he admits his motive was not only theory.","predicament":"Someone's high-minded reason for driving off a rival turns out to be self-interest."},
{"chunk":524,"story":57,"summary":"A mongrel pup is sold as a rare breed to a large woman and becomes her petted darling in a cheap flat.","predicament":"Someone is bought under a false description and doted on by the buyer."},
{"chunk":525,"story":57,"summary":"The flat holds the usual furniture and a small henpecked husband who wipes dishes and walks the dog each evening.","predicament":"Someone in a household does every chore and is respected by nobody in it."},
{"chunk":526,"story":57,"summary":"The wife idles all day and tidies up ten minutes before he returns; dog and husband keep to shabby streets.","predicament":"Two members of a household share the same daily humiliation without speaking of it."},
{"chunk":527,"story":57,"summary":"The dog urges him to cheer up, and learns from a neighbouring terrier why its owner comes home whistling.","predicament":"Someone wonders how a neighbour endures the same life so cheerfully."},
{"chunk":528,"story":57,"summary":"The remedy is drink; on the next walk the dog drags his man toward the doors of a saloon.","predicament":"Someone quietly steers another toward the escape that will free them both."},
{"chunk":529,"story":57,"summary":"After an hour of drinks the man throws away the collar and tells the dog to go; the dog refuses to leave.","predicament":"Someone sets another free and finds they will not go without them."},
{"chunk":530,"story":57,"summary":"The two set out together for the West, and the man gives the dog a plain new name of his own choosing.","predicament":"Two who were owned by the same household leave it together and start again."},
{"chunk":531,"story":58,"summary":"The night clerk of an old-fashioned drug store is counsellor and confessor to the whole neighbourhood.","predicament":"Someone's counter makes them the confidant of everyone around them."},
{"chunk":532,"story":58,"summary":"He loves his landlady's daughter but is too timid; his rival, bolder and friendly, drops in to ask for drugs.","predicament":"Someone too timid to speak watches a bolder rival court the same person."},
{"chunk":533,"story":58,"summary":"The rival says they are to run away and marry that night, if the young woman does not change her mind again.","predicament":"Someone hears from a rival the plan that will settle the matter tonight."},
{"chunk":534,"story":58,"summary":"The rival asks whether there is a powder that will make a girl like you better if it is given to her.","predicament":"Someone asks another for a means of making a person want them."},
{"chunk":535,"story":58,"summary":"The clerk makes up a sleeping powder, hands it over, and then sends word of the elopement to the girl's father.","predicament":"Someone hands a rival a trap and then warns the one person who can stop them."},
{"chunk":536,"story":58,"summary":"Next morning the rival appears married and happy: he would not drug her, so he put the powder in her father's coffee.","predicament":"Someone's double trap fails because the rival refused to use it as intended."},
{"chunk":537,"story":59,"summary":"A retired soap manufacturer, despised by his aristocratic neighbours, calls his son in and asks what he pays for soap.","predicament":"Someone who made their money in trade is looked down on by their neighbours."},
{"chunk":538,"story":59,"summary":"The father insists money buys anything; the son answers that it will not buy entry into exclusive society.","predicament":"Two people disagree about whether money can obtain what one of them wants."},
{"chunk":539,"story":59,"summary":"Pressed, the son admits a woman is the trouble, and the father tells him to make his chance and ask her.","predicament":"Someone in love is told to act by a person who cannot see the obstacle."},
{"chunk":540,"story":59,"summary":"She sails in two days, and all he will have is eight minutes in a cab between a train and a theatre.","predicament":"Someone has one small window of time in which to say the thing that matters."},
{"chunk":541,"story":59,"summary":"His aunt gives him his mother's ring for luck; he meets the young woman at the station and they drive off.","predicament":"Someone sets out for their one chance carrying a keepsake meant to bring luck."},
{"chunk":542,"story":59,"summary":"He stops the cab to recover the dropped ring, and in that minute the traffic locks solid all around them.","predicament":"Someone's brief delay traps them for hours exactly where they wanted to be."},
{"chunk":543,"story":59,"summary":"Two hours in the blockade wins him her promise, and his aunt declares that love, not money, did it.","predicament":"Someone credits the outcome to sentiment rather than to anything that was arranged."},
{"chunk":544,"story":59,"summary":"Next day a man calls for payment: he hired the wagons, cabs and police who made the blockade to order.","predicament":"Someone's miracle was bought and paid for by a person who denies nothing."},
{"chunk":545,"story":60,"summary":"A freelance typist weeps over a menu card; she has no shorthand and lives by odd jobs of copying.","predicament":"Someone scraping a living by odd work is reduced to tears by something small."},
{"chunk":546,"story":60,"summary":"She bargains with a restaurant to typewrite its daily bills of fare in exchange for three meals a day.","predicament":"Someone trades the one skill they have for food through a cold winter."},
{"chunk":547,"story":60,"summary":"In a cold false spring she sits at her window looking past a brick wall to the lane where she was courted.","predicament":"Someone shut in a cold room sees only the place where they were happy."},
{"chunk":548,"story":60,"summary":"The farmer crowned her with flowers and they were to marry at the first sign of spring; then she returned to work.","predicament":"Someone returns to work with a promise of marriage to be kept when the season turns."},
{"chunk":549,"story":60,"summary":"Typing the spring menu she reaches the flower's name, has had no letter for two weeks, and breaks down.","predicament":"Someone at ordinary work meets the one word that undoes them."},
{"chunk":550,"story":60,"summary":"She forces back the tears, finishes the cards, and at dinner sets that one dish aside untouched.","predicament":"Someone finishes their work and cannot bring themselves to eat what it named."},
{"chunk":551,"story":60,"summary":"That evening the bell rings and her farmer comes up the stairs three at a time to find her.","predicament":"Someone given up for lost arrives without warning at the door."},
{"chunk":552,"story":60,"summary":"He found her by the bill of fare, where her fingers had typed his name in place of the plant.","predicament":"Someone is found through a mistake their grief made in their ordinary work."},
{"chunk":553,"story":61,"summary":"A true adventurer goes out aimless to meet whatever fate offers, unlike those with a prize in view.","predicament":"Someone follows chance for its own sake rather than toward any goal."},
{"chunk":554,"story":61,"summary":"The city offers clues of adventure at every corner, and almost everyone passes them by out of convention.","predicament":"People are handed chances daily and let each one go by."},
{"chunk":555,"story":61,"summary":"A piano salesman who takes up every chance passes a dentist's card-giver outside a building one evening.","predicament":"Someone who accepts every invitation from chance is handed another."},
{"chunk":556,"story":61,"summary":"His card reads The Green Door in ink; the ones others drop are plain advertisements, and a second card says the same.","predicament":"Someone receives a message that nobody else appears to be given."},
{"chunk":557,"story":61,"summary":"On a third pass he is given no card and reads contempt in the man's face for his hesitation.","predicament":"Someone hesitating over a summons is made to feel they have been found wanting."},
{"chunk":558,"story":61,"summary":"He climbs the stairs, knocks at the green door, and a white-faced girl opens it and collapses into his arms.","predicament":"Someone answering a mysterious summons finds a person at the end of their strength."},
{"chunk":559,"story":61,"summary":"She has not eaten in three days; he runs out and comes back loaded with food from the shops.","predicament":"Someone finds a stranger starving and goes at once for food."},
{"chunk":560,"story":61,"summary":"Over supper she tells the common story of small wages, fines, illness, lost work and lost hope.","predicament":"Someone tells a stranger the ordinary story of how they came to be starving."},
{"chunk":561,"story":61,"summary":"He promises to come back tomorrow, and tells her he knocked by mistake rather than reveal the cards.","predicament":"Someone hides what they know so the other need never feel exposed."},
{"chunk":562,"story":61,"summary":"Every door in the house is green and the cards advertised a play; he decides Fate arranged it regardless.","predicament":"Someone learns their sign meant nothing and keeps believing it was meant for them."}
]
@@ -0,0 +1,42 @@
[
{"chunk":563,"story":62,"summary":"From his high seat a cab driver sees every passenger as mere goods in transit, to be despised at the reckoning.","predicament":"Someone who carries others for pay sees them only as fares."},
{"chunk":564,"story":62,"summary":"A wedding is celebrated noisily in a tenement, and a cab driver stands by his fine hansom, plainly drunk.","predicament":"Someone at a celebration has drunk too much to know what they are doing."},
{"chunk":565,"story":62,"summary":"A young woman steps into his cab and says to drive anywhere; he takes her through the park, singing.","predicament":"Someone accepts a passenger without noticing who they are."},
{"chunk":566,"story":62,"summary":"He stops at a garden restaurant; she is swept inside, orders one beer with her coins, and watches entranced.","predicament":"Someone with a few coins is set down among luxury and simply enjoys it."},
{"chunk":567,"story":62,"summary":"Hours later he demands four dollars before going further; she laughs that she has only a few pennies.","predicament":"Someone demands payment from a passenger who never had the money."},
{"chunk":568,"story":62,"summary":"He drags her to the police station to complain, sobers, and introduces her to the sergeant as the bride he married tonight.","predicament":"Someone about to accuse a stranger recognises the person they married that evening."},
{"chunk":569,"story":63,"summary":"The narrator dreams of the day of judgment, where an angel policeman asks if he belongs with a prosperous-looking group.","predicament":"Someone at a final reckoning is asked which group of the accused they belong to."},
{"chunk":570,"story":63,"summary":"A shop girl on six dollars a week tells her friend she has accepted a dinner invitation from a known spender.","predicament":"Someone living on almost nothing accepts an invitation that may cost them more than money."},
{"chunk":571,"story":63,"summary":"She spends the fifty cents meant for three meals on an imitation lace collar, and goes up to her furnished room.","predicament":"Someone spends their food money on looking fit for an occasion."},
{"chunk":572,"story":63,"summary":"Her room holds a few treasures and portraits; her weekly budget for rent and food leaves nothing for clothes.","predicament":"Someone's wage exactly covers survival and nothing else."},
{"chunk":573,"story":63,"summary":"Her pleasures are counted by summers; the man calling for her is a well-dressed connoisseur of hungry shop girls.","predicament":"Someone starved of pleasure is about to be preyed on by a person who knows it."},
{"chunk":574,"story":63,"summary":"Dressed and happy, she turns for her handkerchief, meets a hero's portrait's stern eyes, and sends word she cannot go.","predicament":"Someone about to accept a dangerous invitation turns it down at the last moment."},
{"chunk":575,"story":63,"summary":"She cries, changes back into her old gown, and dines on crackers and jam, offering some to the portrait.","predicament":"Someone who refused a temptation consoles themselves alone with what little they have."},
{"chunk":576,"story":63,"summary":"She scolds the portrait; the story stops, and the dream's prosperous group proves to be employers who paid girls six dollars a week.","predicament":"Someone holds out tonight, knowing they may not the next time loneliness wins."},
{"chunk":577,"story":64,"summary":"A ragged man on a park bench believes himself a prince in disguise, far richer than the owners of the mansions opposite.","predicament":"Someone with nothing imagines that they have chosen to have nothing."},
{"chunk":578,"story":64,"summary":"He tells himself he has renounced wealth to study humanity and delights in bestowing gifts on the deserving.","predicament":"Someone powerless sustains themselves with the belief that they help others."},
{"chunk":579,"story":64,"summary":"A young man in evening clothes watches the clock tower in distress; the ragged prince approaches and offers his help.","predicament":"Someone anxiously waiting is offered help by a stranger who plainly has none to give."},
{"chunk":580,"story":64,"summary":"The prince denounces clocks as tyrants; the young man keeps glancing from the clock to a lit house opposite.","predicament":"Someone counting down to a verdict is lectured by a stranger about time."},
{"chunk":581,"story":64,"summary":"At ten to nine the young man nearly leaves, then explains he wronged his fiancee and awaits her decision.","predicament":"Someone who wronged the person they love waits for a sign of forgiveness."},
{"chunk":582,"story":64,"summary":"She promised a white scarf in the window at half past eight if she forgave him; the hour has passed and he despairs.","predicament":"Someone believes the deadline for forgiveness has passed without a sign."},
{"chunk":583,"story":64,"summary":"The prince promises a fortune on his wedding day and falls asleep; the young man covers him kindly, then the clock strikes.","predicament":"Someone despairing is kind to a poorer stranger just before their luck turns."},
{"chunk":584,"story":64,"summary":"The scarf appears: the clock was half an hour fast; next morning police find the sleeping vagrant clutching a fifty-dollar bill.","predicament":"Someone despairs over a deadline that was never real, and a kindness is quietly repaid."},
{"chunk":585,"story":65,"summary":"A sightseeing coach sets out, and on its highest back seat sit a young man from a small town and his bride.","predicament":"Two people newly married see the great city together for the first time."},
{"chunk":586,"story":65,"summary":"The guide bellows mistaken sights at passengers who gape at whatever he names, the bride among them.","predicament":"People new to a place believe whatever the guide tells them."},
{"chunk":587,"story":65,"summary":"The bride's face shows she thinks her husband right and the world excellent; he is twenty-four and rising.","predicament":"Two people newly married are completely content with each other and the world."},
{"chunk":588,"story":65,"summary":"In front of them sits a girl in a flowered hat beside a sharp-eyed young man who belongs to hard streets.","predicament":"Two couples share a seat; one of them has something to hide."},
{"chunk":589,"story":65,"summary":"The two women exchange a look and a whisper; the girl's companion slips over the side just as officers stop the coach.","predicament":"Two strangers understand each other at a glance, and one acts to help the other."},
{"chunk":590,"story":65,"summary":"The officers take the bridegroom for a wanted burglar; he goes down amused, expecting to explain.","predicament":"Someone is mistaken for a wanted person and expects the mistake to clear itself."},
{"chunk":591,"story":65,"summary":"His bride tells him to go quietly as the burglar, so he fights the police in fury until her uncle clears him.","predicament":"Someone is betrayed in front of the police by the person they trust most."},
{"chunk":592,"story":65,"summary":"She explains that the other pair had married that morning, and she could not refuse another bride her happiness.","predicament":"Someone sacrifices their partner's peace to protect a stranger in the same happy state."},
{"chunk":593,"story":66,"summary":"A broker arrives with his stenographer and plunges into work; she lingers, then asks whether he ordered a replacement.","predicament":"Someone expected to be noticed today is treated as part of the furniture."},
{"chunk":594,"story":66,"summary":"The clerk says the broker ordered one; she says she will work until someone comes, and the day's frenzy begins.","predicament":"Someone learns they are being replaced and quietly carries on working."},
{"chunk":595,"story":66,"summary":"An applicant arrives; the broker denies ordering any replacement and says the place is hers as long as she likes.","predicament":"Someone's employer forgets a decision made the day before."},
{"chunk":596,"story":66,"summary":"In a lull the scent of lilac reminds him of her, and he rushes to her desk to propose at once.","predicament":"Someone overwhelmed by work suddenly remembers the one thing that matters to them."},
{"chunk":597,"story":66,"summary":"He proposes in a hurry, papers in hand; she weeps, then reminds him they were married the evening before.","predicament":"Someone is so consumed by work they forget the most important thing already happened."},
{"chunk":598,"story":67,"summary":"A patrolman on his beat finds a man in a dark doorway who says he is keeping an appointment made twenty years ago.","predicament":"Someone keeps a promise to meet an old friend after twenty years apart."},
{"chunk":599,"story":67,"summary":"He tells of parting from his best friend twenty years ago, each to make a fortune, and shows a diamond watch.","predicament":"Someone who prospered far away returns trusting a friend to keep their old word."},
{"chunk":600,"story":67,"summary":"The patrolman moves on; twenty minutes later a tall man hurries across the street and greets him as his old friend.","predicament":"Someone waiting in the rain is greeted by the person they have waited for."},
{"chunk":601,"story":67,"summary":"They walk arm in arm until, under a bright light, he sees the stranger is not his friend at all.","predicament":"Someone realises the person they trusted on sight is not who they claimed."},
{"chunk":602,"story":67,"summary":"The stranger arrests him and hands him a note: his friend was the patrolman, and could not make the arrest himself.","predicament":"Someone must choose between their friend and their duty, and sends another to act."}
]
@@ -0,0 +1,47 @@
[
{"chunk":603,"story":68,"summary":"A draughtsman on eighteen dollars a week saves a dollar weekly to spend one evening in ten dressed and dining as a rich idler.","predicament":"Someone of modest means saves for months to pass one evening as rich."},
{"chunk":604,"story":68,"summary":"Parading the bright street in borrowed grandeur, he stops at a corner as a girl slips on ice and falls.","predicament":"Someone enjoying their rare evening of show stops to help a stranger who falls."},
{"chunk":605,"story":68,"summary":"He helps her up; she seems a refined working girl in a plain dress, and he decides to invite her to dine.","predicament":"Someone playing a part decides to share their one evening with a stranger."},
{"chunk":606,"story":68,"summary":"He invites her to dinner to rest her ankle; she hesitates over her plain clothes, and he insists they suit her.","predicament":"Someone extends an invitation across what they believe is a gap in station."},
{"chunk":607,"story":68,"summary":"She accepts and gives only her first name; at a good restaurant each looks at the other with growing admiration.","predicament":"Two strangers enjoy each other's company without knowing the truth about either."},
{"chunk":608,"story":68,"summary":"Carried away, he boasts of clubs, yachts and idleness; she asks whether he has no work that would interest him more.","predicament":"Someone lies about their standing to impress a person who would have preferred the truth."},
{"chunk":609,"story":68,"summary":"They part; he wishes he had told the truth; she hurries to a grand mansion where her sister has been anxious.","predicament":"Someone regrets the lie they told, while the other returns to a life they also hid."},
{"chunk":610,"story":68,"summary":"She tells her sister she could love a poor man with an ambition, but never an idler between clubs and society.","predicament":"Someone describes exactly the person they would love, and it is who the liar really was."},
{"chunk":611,"story":69,"summary":"A young man passing a young woman on a park bench stops further on, and sends a boy with a message to her.","predicament":"Someone forbidden to speak to a person they love sends word through a stranger."},
{"chunk":612,"story":69,"summary":"The message says he is leaving the country and asks her, for old times' sake, why she discarded him without explanation.","predicament":"Someone dismissed without explanation makes one last appeal for a reason."},
{"chunk":613,"story":69,"summary":"The boy delivers it in street slang; she answers with cool irony that she knew the gentleman and will hear it.","predicament":"Someone receives an appeal from a person they have cut off, and listens coldly."},
{"chunk":614,"story":69,"summary":"She says she saw him in the conservatory embracing another woman, and so gave up both her rose and her ideal.","predicament":"Someone judged by what they appeared to be doing was never asked to explain it."},
{"chunk":615,"story":69,"summary":"He sends back a letter, saying a little trust would have spared much heartache, and the boy vouches for him.","predicament":"Someone wrongly condemned produces the proof they were never given a chance to show."},
{"chunk":616,"story":69,"summary":"The letter thanks him, a doctor, for catching the other woman when she fainted; the young woman sends back that she wants him.","predicament":"Someone learns that what they condemned was a kindness, and takes the person back."},
{"chunk":617,"story":70,"summary":"In a district of transient lodgers, a young man rings a dozen bells and is shown a room by a sinister housekeeper.","predicament":"Someone searching for a place to stay tries door after door in a shifting neighbourhood."},
{"chunk":618,"story":70,"summary":"She praises the room and its last tenants, a stage couple; many of her lodgers work in the theatres and move on.","predicament":"Someone is shown a room by a landlady eager to describe everyone but the truth."},
{"chunk":619,"story":70,"summary":"He takes the room and asks, as he has a thousand times, after a young singer; the answer, as always, is no.","predicament":"Someone has searched for months for a lost person and hears the same answer again."},
{"chunk":620,"story":70,"summary":"Alone in the shabby room, he takes in the pictures and castoffs that pursue the homeless from house to house.","predicament":"Someone alone in a strange room reads the traces of everyone who stayed there before."},
{"chunk":621,"story":70,"summary":"The room's damage speaks of the rage of past tenants against a place that pretended to be a home.","predicament":"Someone sees in a room's scars how others resented a home that was never theirs."},
{"chunk":622,"story":70,"summary":"Suddenly the room fills with the scent the lost girl loved, and he cries out that she has been here.","predicament":"Someone senses the presence of the person they seek, but cannot find any proof."},
{"chunk":623,"story":70,"summary":"He ransacks drawers and corners for any trace of her and finds only the anonymous leavings of strangers.","predicament":"Someone searches everywhere for one sign they are right, and finds nothing."},
{"chunk":624,"story":70,"summary":"The housekeeper lists the room's previous tenants, none like her; he returns and the scent has gone.","predicament":"Someone asks directly and is told a lie that ends their last hope."},
{"chunk":625,"story":70,"summary":"He seals the room and turns on the gas; below, the housekeeper admits a young girl killed herself in that bed a week ago.","predicament":"Someone gives up just as the truth is being concealed a floor below them."},
{"chunk":626,"story":71,"summary":"A cheap chop house is kept by a sour owner at the cash desk, and served by two waitresses, one of them beautiful.","predicament":"Two people do the same work where only one of them is noticed."},
{"chunk":627,"story":71,"summary":"The other waitress is plain and too anxious to please; every customer is enslaved by her beautiful partner.","predicament":"Someone plain works beside someone admired and receives none of the attention."},
{"chunk":628,"story":71,"summary":"The beautiful one is courted and given presents by regulars; the plain one has never had a single admirer.","predicament":"Someone who has never been wanted watches another be wanted daily."},
{"chunk":629,"story":71,"summary":"The plain one is loyal and content to be overlooked, and listens enviously to her friend's tale of being followed and struck.","predicament":"Someone envies even the troubles that come to people others find desirable."},
{"chunk":630,"story":71,"summary":"A shy customer, drunk, kisses the plain waitress and leaves; her friend teases her as a rival, and she feels transformed.","predicament":"Someone overlooked all their life is suddenly singled out, and becomes someone new."},
{"chunk":631,"story":71,"summary":"She tells the owner and every customer she was insulted; she gets a raise, ribbons and new attention.","predicament":"Someone makes the most of the single sign that they were desired."},
{"chunk":632,"story":71,"summary":"The man returns to apologise, saying he was drunk and would never have done it sober; she sobs among the cups.","predicament":"Someone learns the one sign of being wanted was an accident the other regrets."},
{"chunk":633,"story":72,"summary":"Two country girls come to the city for work; one irons in a laundry and dresses loudly on good wages.","predicament":"Someone takes the best-paying work available and spends it on show."},
{"chunk":634,"story":72,"summary":"The other sells in a department store at eight dollars a week, dressed plainly but in the manner of the rich.","predicament":"Someone chooses lower pay to stay close to the people they hope to join."},
{"chunk":635,"story":72,"summary":"The store girl says she means to catch a rich husband; the laundress met her steady young man over her ironing board.","predicament":"Two friends argue whether to aim high and hungry or stay content with what comes."},
{"chunk":636,"story":72,"summary":"The laundress's steady electrician arrives and proposes the theatre, and the two women trade teasing about manners.","predicament":"Someone steady and plain is overlooked by the people he takes out."},
{"chunk":637,"story":72,"summary":"In the store the girl copies the gestures, voice and walk of her richest customers and absorbs their manners.","predicament":"Someone learns the manners of a class above them by watching it closely."},
{"chunk":638,"story":72,"summary":"The store girls pool their stratagems for fending off men, and she learns the art of defence.","predicament":"People in the same position share their methods for dealing with those who pursue them."},
{"chunk":639,"story":72,"summary":"Men linger at her counter; she learns to tell the real rich from the imitators by the cars waiting outside.","predicament":"Someone hunting a prize learns to tell the genuine article from the imitation."},
{"chunk":640,"story":72,"summary":"A genuinely rich young man proposes to her over the counter, and she declines him to her colleague's horror.","predicament":"Someone turns down the prize they were seeking because of what they saw in the person."},
{"chunk":641,"story":72,"summary":"She explains that he was caught in a lie and that she wants someone who is more than a moneybag.","predicament":"Someone holds out for character in a partner even at the price of a fortune."},
{"chunk":642,"story":72,"summary":"She keeps hunting on eight dollars a week, while the laundress spends her wages on ever showier clothes.","predicament":"Two friends pursue their different ideas of success and slowly drift from the same person."},
{"chunk":643,"story":72,"summary":"The laundress refuses to marry her steady man and keep house, and offers to find her friend better-paid work.","predicament":"Someone keeps a faithful suitor waiting because their independence pleases them more."},
{"chunk":644,"story":72,"summary":"The store girl says she is still looking the rich over; her friend mocks her plain jacket and bets she will catch one first.","predicament":"Two friends compete over who will marry better, each sure of her own method."},
{"chunk":645,"story":72,"summary":"Surrounded by luxury, her standard of value slowly shifts from money toward truth, honour and kindness.","predicament":"Someone pursuing wealth finds they have begun to value something else."},
{"chunk":646,"story":72,"summary":"The steady man says the laundress has vanished, seen riding with a rich man; the store girl goes to the show with him.","predicament":"Someone abandoned by the person they waited for is comforted by the friend left behind."},
{"chunk":647,"story":72,"summary":"Months later the laundress, dressed in furs and jewels, learns her friend is marrying the man she left, and sobs against a fence.","predicament":"Someone who took the glittering offer sees the one they rejected make another happy."}
]
@@ -0,0 +1,42 @@
[
{"chunk":648,"story":73,"summary":"A wealthy man receives his wife's photograph and a letter hinting ill of her, tears it up, and asks about the homeless men outside.","predicament":"Someone far from their partner is sent poison about them and cannot check it."},
{"chunk":649,"story":73,"summary":"He orders his servant to fetch one of the homeless men at random to dine with him, to lift his mood.","predicament":"Someone troubled seeks distraction by inviting a stranger from the street."},
{"chunk":650,"story":73,"summary":"The guest arrives washed but wrecked, defiant and unembarrassed, and announces his own name before his host's.","predicament":"Someone brought in from the street keeps their pride at a rich person's table."},
{"chunk":651,"story":73,"summary":"The guest mocks the city's would-be benefactors, who all pay for a meal by extracting the recipient's life story.","predicament":"Someone who lives on charity knows the price is always their story."},
{"chunk":652,"story":73,"summary":"The host asks for no story; the guest offers the truth instead: he was once a fashionable portrait painter.","predicament":"Someone offered kindness without conditions responds by telling the truth."},
{"chunk":653,"story":73,"summary":"His portraits revealed each sitter's hidden character, and one after another his patrons were exposed and turned on him.","predicament":"Someone's gift for showing the truth about people costs them every client."},
{"chunk":654,"story":73,"summary":"Unable to work anywhere, he took to drink; the host has him draw a sketch from the photograph of his wife.","predicament":"Someone tormented by doubt asks for a test that could confirm their worst fear."},
{"chunk":655,"story":73,"summary":"The painter leaves with money; the host cannot bring himself to look, and sends for a young artist to judge the sketch.","predicament":"Someone holds the answer to their doubt and is afraid to look at it."},
{"chunk":656,"story":73,"summary":"The young artist calls the drawing a master's and the face an angel's; the host cries that she is his wife.","predicament":"Someone's fear about the person they love is answered in that person's favour."},
{"chunk":657,"story":74,"summary":"A man stopping at his usual bar after work overhears a friend saying he was very drunk there last night.","predicament":"Someone overhears how others really see a habit they thought harmless."},
{"chunk":658,"story":74,"summary":"Shaken, he orders seltzer and leaves; the story recalls his summer courtship of his wife and their shared love of a poem.","predicament":"Someone confronted with the truth about themselves resolves to change at once."},
{"chunk":659,"story":74,"summary":"They married, came to the city, and as his salary rose they took up the showy, drinking life of the cafes.","predicament":"Two people drift gradually into habits neither of them chose deliberately."},
{"chunk":660,"story":74,"summary":"Their home life becomes cocktails and late parties, and he comes home merry each evening to wild greetings.","predicament":"Two people mistake shared excess for shared happiness."},
{"chunk":661,"story":74,"summary":"He comes home sober, kisses her quietly, and when she asks what is wrong, he answers that nothing is.","predicament":"Someone changes suddenly and will not explain why to the person who notices."},
{"chunk":662,"story":74,"summary":"He declines the whisky at dinner and says he has stopped; she answers coldly, and the evening dies in silence.","predicament":"Someone's reform is felt by their partner as a rebuke they were not consulted about."},
{"chunk":663,"story":74,"summary":"She sets out the bottle defiantly; he recites their old verse to her, then goes and pours himself a drink.","predicament":"Someone about to relapse reminds the other, unintentionally, of who they both used to be."},
{"chunk":664,"story":74,"summary":"She sweeps the bottle and glasses to the floor, embraces him, and asks for the verse about remoulding things nearer the heart's desire.","predicament":"Two people see what their life has become and choose together to break it."},
{"chunk":665,"story":75,"summary":"A man two years married walks home from the train knowing exactly how the whole evening will go.","predicament":"Someone's home life has become so routine that nothing in it can surprise them."},
{"chunk":666,"story":75,"summary":"He knows the dinner, the noises of the flats, and that at a quarter past eight he will leave to play pool.","predicament":"Someone escapes a dull household every evening and has stopped noticing it."},
{"chunk":667,"story":75,"summary":"Tonight she is gone, her things scattered in haste, with a note that her mother is ill and she has taken the train.","predicament":"Someone comes home to find the person they took for granted suddenly absent."},
{"chunk":668,"story":75,"summary":"Alone for the first time in two years of marriage, he tidies her things with a feeling close to terror.","predicament":"Someone realises how much they depended on a person only when that person is gone."},
{"chunk":669,"story":75,"summary":"He eats cold mutton alone; the whole night is free for pleasure, and he discovers he does not want it.","predicament":"Someone given the freedom they wanted finds it worthless without the person they escaped."},
{"chunk":670,"story":75,"summary":"He calls himself a brute for neglecting her, resolves to take her out and give up his cronies, and she walks in.","predicament":"Someone resolves to change just as the need for change disappears."},
{"chunk":671,"story":75,"summary":"Her mother was hardly ill and she came straight back; at a quarter past eight he reaches for his hat as always.","predicament":"Someone's resolution vanishes the moment the thing they missed is restored."},
{"chunk":672,"story":76,"summary":"On the national holiday a vagrant takes the same bench he has taken at the same hour for nine years.","predicament":"Someone keeps an annual appointment that has become an institution."},
{"chunk":673,"story":76,"summary":"This year he arrives already gorged, having just eaten an enormous unexpected dinner, and can barely breathe.","predicament":"Someone arrives for a ritual meal having already eaten beyond their limit."},
{"chunk":674,"story":76,"summary":"Two old ladies' custom of feeding the first hungry passer-by caught him; now he sees his yearly benefactor approaching.","predicament":"Someone sees their benefactor coming and cannot possibly accept what is offered."},
{"chunk":675,"story":76,"summary":"For nine years an old gentleman has fed this same man a holiday dinner, hoping to found an American tradition.","predicament":"Someone lonely has built their only ritual around a stranger's hunger."},
{"chunk":676,"story":76,"summary":"He makes his usual speech of invitation, a little sadly, wishing he had a son to carry on the custom after him.","predicament":"Someone with no heirs wants a small kindness to outlive them."},
{"chunk":677,"story":76,"summary":"The old man lives alone in rented rooms; seeing his joy, the gorged vagrant accepts in the usual words out of duty.","predicament":"Someone accepts a kindness they cannot use so as not to disappoint the giver."},
{"chunk":678,"story":76,"summary":"At the restaurant he eats a second vast dinner rather than dim the old man's happiness, then collapses around the corner.","predicament":"Someone suffers greatly to preserve another person's pleasure in giving."},
{"chunk":679,"story":76,"summary":"Both men land in the hospital, where a doctor mentions the old gentleman is starving: he had not eaten for three days.","predicament":"Someone gives their last to keep a tradition and has kept nothing for themselves."},
{"chunk":680,"story":77,"summary":"A well-dressed man without a cent walks through a park pitying the idle poor, sure he will be rich again by morning.","predicament":"Someone penniless looks down on others, confident their wits will provide."},
{"chunk":681,"story":77,"summary":"He gets five dollars from a clergyman with a forged letter, then placates a creditor in the street with drinks.","predicament":"Someone lives by lies and turns every creditor into a friend for the evening."},
{"chunk":682,"story":77,"summary":"He loses most of it at roulette, then cheats a small child of the change from his mother's medicine money.","predicament":"Someone with nothing left preys even on a child running an errand."},
{"chunk":683,"story":77,"summary":"He saves the child from two street cars, sends him off swindled and happy, and dines laughing at how easily everyone is taken in.","predicament":"Someone who cheats everyone also acts on reflex to save a life."},
{"chunk":684,"story":77,"summary":"Old friends try to sweep him off to a dinner party; he declines with a grand lie, delighted at how front works.","predicament":"Someone lies even when the truth would serve, for the pleasure of being believed."},
{"chunk":685,"story":77,"summary":"An old countryman asks for his son's address; the swindler first refuses, then claims to live next door to the son.","predicament":"Someone lost in a strange city asks help of exactly the wrong person."},
{"chunk":686,"story":77,"summary":"An hour later, with a hundred and forty dollars, he tosses a beggar a dollar and tells him work is for fools.","predicament":"Someone who takes from everyone gives a little and preaches contempt for honest work."},
{"chunk":687,"story":77,"summary":"Crossing to his hotel he sees a pure-faced girl he sat beside at school, and hides his burning face against a lamp-post.","predicament":"Someone who despises everyone is undone by the sight of their own innocent past."}
]
@@ -0,0 +1,42 @@
[
{"chunk":688,"story":78,"summary":"The senior partner of a great western dry-goods store sends his junior east to buy the season's stock this year.","predicament":"Someone is sent in another's place on an errand far from home."},
{"chunk":689,"story":78,"summary":"The wholesaler greets the buyer, predicts his order from the rainfall, and tells his son to show him the town.","predicament":"Someone new to a place is entertained by people who want their business."},
{"chunk":690,"story":78,"summary":"Unimpressed by the city's lights, the buyer is struck motionless when the firm's best model comes to show the gowns.","predicament":"Someone indifferent to everything around them is stopped dead by one person."},
{"chunk":691,"story":78,"summary":"She models gown after gown with a tired contempt, and the wholesaler offers her as company for dinner.","predicament":"Someone's employer offers their time to a customer as part of the sale."},
{"chunk":692,"story":78,"summary":"She agrees coolly; at dinner he takes away her cocktail and asks her first name, which she gives freezingly.","predicament":"Someone treated as a customer's entertainment meets one who treats them as a person."},
{"chunk":693,"story":78,"summary":"He tells her she will go home with him and offers a diamond; she flicks it back, sure he is like all buyers.","predicament":"Someone used to buyers' advances cannot tell a sincere proposal from the usual ones."},
{"chunk":694,"story":78,"summary":"She explains she must dine with buyers or lose her place; he says she will drink no more wine, and she weeps.","predicament":"Someone's livelihood requires accepting attentions they despise."},
{"chunk":695,"story":78,"summary":"She slaps him; a wedding ring falls from his pocket, and that night she wakes her roommate to ask where his town is.","predicament":"Someone realises the offer they rejected as insult was honest, and accepts it."},
{"chunk":696,"story":79,"summary":"A rich man's war comrade turns up penniless at his club and asks for help finding a job.","predicament":"Someone asks a richer friend from shared hardship for a start."},
{"chunk":697,"story":79,"summary":"The rich man gets him the post he asks for, a mounted policeman in the park, and soon after glimpses a beautiful woman.","predicament":"Someone helps a friend into work and then falls for a stranger."},
{"chunk":698,"story":79,"summary":"He falls in love with a young woman in a passing motor car; later, at a reunion, the policeman gets too drunk to ride.","predicament":"Someone's friend is about to lose their post through one night's excess."},
{"chunk":699,"story":79,"summary":"To save his friend's badge, the rich man puts on the uniform and rides the patrol in his place.","predicament":"Someone takes a friend's place to protect their job and good name."},
{"chunk":700,"story":79,"summary":"In the park he meets the woman he loves in a carriage; the horses bolt and he rides them down.","predicament":"Someone in a borrowed identity performs a rescue for the person they love."},
{"chunk":701,"story":79,"summary":"Thanked and asked his name, he realises giving it would disgrace his friend, and answers that it is only his duty.","predicament":"Someone must forgo the credit they want most to protect a friend's position."},
{"chunk":702,"story":79,"summary":"His friend reveals he is an earl's son whose family has found him, and that the woman, his sister, wants to meet the rescuer.","predicament":"Someone's sacrifice for a friend is repaid with the very thing they gave up."},
{"chunk":703,"story":80,"summary":"A rich heir, annoyed at being kept in town to sign papers, grumbles at the family lawyer.","predicament":"Someone who owns much is bored by the duties that come with it."},
{"chunk":704,"story":80,"summary":"The lawyer tries to raise a matter of right concerning his properties; he brushes it off and finds his club empty.","predicament":"Someone avoids hearing about the consequences of what they own."},
{"chunk":705,"story":80,"summary":"On a whim he takes a crowded boat to the amusement beach and falls into talk with a frank, pretty girl.","predicament":"Someone of standing slips among ordinary people and is charmed by one of them."},
{"chunk":706,"story":80,"summary":"She teases him, lets him join her, and tells him she trims hats and lives in a furnished room with a friend.","predicament":"Someone poor explains their plain life to a stranger without embarrassment."},
{"chunk":707,"story":80,"summary":"The crowd's vulgarity repels him until he looks at her happy face and suddenly sees the place as she does.","predicament":"Someone despising other people's pleasures sees them differently through one person's eyes."},
{"chunk":708,"story":80,"summary":"He throws himself into the amusements with her, and on the boat home he forgets his cares and repeats her name.","predicament":"Someone set apart by wealth enjoys themselves plainly for the first time."},
{"chunk":709,"story":80,"summary":"A steamer rams their boat; the life preservers prove rotten, and she laughs and holds his hand calmly.","predicament":"Someone in danger finds the safeguards meant to protect them are fraudulent."},
{"chunk":710,"story":80,"summary":"He declares his love; she says that is what they all say, and explains she meets men on boats and in the street.","predicament":"Someone learns the person they love must meet strangers in public for want of a place."},
{"chunk":711,"story":80,"summary":"She explains that where she lives there is no parlour and no room to receive anyone, so a girl must meet men outside.","predicament":"Someone's living conditions force them into risks that others judge them for."},
{"chunk":712,"story":80,"summary":"Next day he learns the houses without parlours are his own; he tells the lawyer to change them, crying it is too late.","predicament":"Someone discovers they caused the harm they deplore, too late to undo it."},
{"chunk":713,"story":81,"summary":"A wandering tramp studies each city as a poet would, finding its soul and then moving restlessly to another.","predicament":"Someone moves from place to place, understanding each and belonging to none."},
{"chunk":714,"story":81,"summary":"He has personal fancies for each city he has known: one hearty, one aloof, one chilling, each with its own figure.","predicament":"Someone judges every place by how it treated them as a stranger."},
{"chunk":715,"story":81,"summary":"He arrives in the greatest city meaning to read it like the others, and by afternoon is defeated and frightened.","predicament":"Someone confident of reading any place meets one that gives them nothing."},
{"chunk":716,"story":81,"summary":"No one looks at him or speaks to him; he longs for even the kicks and stares of the rougher cities.","predicament":"Someone would rather be mistreated than ignored."},
{"chunk":717,"story":81,"summary":"The people seem cold, conceited idols; he singles out three types: a rich old man, a cold beauty, and a jowled tough.","predicament":"Someone surrounded by strangers finds them all cold and self-absorbed."},
{"chunk":718,"story":81,"summary":"Refused alms, he is struck by a car, and opens his eyes to find those same three strangers tending him with care.","predicament":"Someone who thought a place heartless is cared for by it at their worst moment."},
{"chunk":719,"story":81,"summary":"A kindly crowd gathers and he says he feels fine; three days later he fights a patient for running down his city.","predicament":"Someone who found the heart of a place defends it against the next stranger."},
{"chunk":720,"story":82,"summary":"The vainest and cleverest member of a street gang of well-dressed robbers withdraws from it because the girl he loves asks him to.","predicament":"Someone gives up profitable wrongdoing because the person they love asks."},
{"chunk":721,"story":82,"summary":"He promises to work honestly and marry within a year, though he looks mournfully at his fine clothes.","predicament":"Someone commits to an honest life knowing it will cost them their pride."},
{"chunk":722,"story":82,"summary":"He returns to plumbing as an assistant for eight months, his clothes wearing thin, then brings her a mysterious parcel.","predicament":"Someone going straight grows shabby and wants to show they still have style."},
{"chunk":723,"story":82,"summary":"The parcel holds costly-looking sables; she is overjoyed, then looks at him steadily, doubting how he paid.","predicament":"Someone receives a gift too fine for the giver's wages and wonders where it came from."},
{"chunk":724,"story":82,"summary":"She parades them through the neighbourhood as a queen; a fair-minded detective hears of the fabulous furs and follows.","predicament":"Someone's display of a gift draws the attention of the person investigating a theft."},
{"chunk":725,"story":82,"summary":"The detective says a lady's sables vanished from a house the man worked at yesterday, and offers to check his story.","predicament":"Someone who reformed is suspected at once when something goes missing."},
{"chunk":726,"story":82,"summary":"He admits theft rather than say where he bought them; a policeman who sold furs prices them at twenty-one dollars.","predicament":"Someone would rather be thought a thief than be seen to have bought cheap."},
{"chunk":727,"story":82,"summary":"She cries that she wants only him, not furs; the real sables were found at home, and the officers let them go.","predicament":"Someone's vanity nearly ruins them, and the person they tried to impress forgives it."}
]
@@ -0,0 +1,47 @@
[
{"chunk":728,"story":83,"summary":"A tailor's apprentice with his week's twelve dollars goes to the cafe where the district's political leader is celebrating victory.","predicament":"Someone at the bottom worships the powerful person at the top of their small world."},
{"chunk":729,"story":83,"summary":"Emboldened, he shakes the great man's hand and spends his whole week's wages buying wine for him and his lieutenants.","predicament":"Someone spends everything they have for a moment's acknowledgement from a superior."},
{"chunk":730,"story":83,"summary":"His family shrieks and strikes at him over the lost wages, but he is ecstatic; the leader himself cannot enter the best houses.","predicament":"Someone considers a public humiliation worth it for the honour they gained."},
{"chunk":731,"story":83,"summary":"At a fashionable restaurant the political leader dines gloomily, ignored; across the room sits a millionaire of the oldest society.","predicament":"Someone powerful in their own world is nobody in the world they want to enter."},
{"chunk":732,"story":83,"summary":"The leader walks over and offers help with the aristocrat's reforms; the handshake raises him in every eye, and he orders wine for all.","predicament":"Someone gains standing by offering service to the person whose acceptance they crave."},
{"chunk":733,"story":83,"summary":"The aristocrat drives his fiancee through the slums, pointing out where he will build kitchens and replace the old death-traps.","predicament":"Someone at the very top seeks meaning by helping those at the very bottom."},
{"chunk":734,"story":83,"summary":"On impulse he grasps the hand of a squalid young man coming out of a tenement, and feels almost happy: it is the apprentice.","predicament":"Each person in the chain seeks the approval of the one above and gives it below."},
{"chunk":735,"story":84,"summary":"Two shop girls plan new dresses for the store's holiday dinner, one purple, one red, each hoping to charm the head clerk.","predicament":"Two coworkers compete quietly for the notice of the same person."},
{"chunk":736,"story":84,"summary":"She has saved eighteen dollars over eight months and needs four more to collect the dress the day before the holiday.","predicament":"Someone has saved for months toward a single occasion and is nearly there."},
{"chunk":737,"story":84,"summary":"The head clerk is a gentleman and a health crank, and every girl in the store dreams of becoming his wife.","predicament":"Everyone in a workplace hopes to win the same well-placed person."},
{"chunk":738,"story":84,"summary":"The night before, her rival is locked out over four dollars of rent; she gives her the four dollars meant for the dress.","predicament":"Someone gives a rival the money they needed to reach their own goal."},
{"chunk":739,"story":84,"summary":"Her rival goes to the dinner in red; she stays home by the window, then tells the tailor she cannot pay.","predicament":"Someone misses the occasion they saved for, having given their chance away."},
{"chunk":740,"story":84,"summary":"The tailor, who has watched her pass for two years, gives her the dress to pay later; she walks out happy into the rain.","predicament":"Someone is trusted on credit by a stranger who has quietly observed their character."},
{"chunk":741,"story":84,"summary":"The head clerk meets her walking bareheaded in the rain, praises her dress and her good sense, and asks to walk with her.","predicament":"Someone who gave up their chance is noticed anyway, by accident, by the person they hoped for."},
{"chunk":742,"story":85,"summary":"A fire company's cart driver follows a foreign war obsessively on a pinned map, cheering one side and cursing the other.","predicament":"Someone takes fierce sides in a distant quarrel that has nothing to do with them."},
{"chunk":743,"story":85,"summary":"The firemen live by an unwritten code; meanwhile a grinning, bewildered immigrant is put ashore and wanders into the city.","predicament":"Someone arrives in a strange country with nothing and understands nothing around them."},
{"chunk":744,"story":85,"summary":"The immigrant steps in front of the racing hose cart; the driver swerves into a pillar, breaking his shoulder and the horse's leg.","predicament":"Someone's duty to spare a stranger costs them dearly and ruins something they love."},
{"chunk":745,"story":85,"summary":"The beloved horse is shot; the firemen drag the immigrant back to the station and abuse him as worthless foreign rubbish.","predicament":"Someone grieving blames the helpless stranger who caused the loss."},
{"chunk":746,"story":85,"summary":"A shopkeeper who claims many languages cannot place him and calls him a fool; the firemen kick him into the street.","predicament":"Someone nobody can understand is judged worthless and thrown out."},
{"chunk":747,"story":85,"summary":"The stranger keeps returning to apologise and is kicked out daily, until the driver's small son befriends him.","predicament":"Someone despised keeps coming back to make amends until one person accepts them."},
{"chunk":748,"story":85,"summary":"The boy sets a motor car running away; the stranger leaps on the remaining horse bareback and snatches him from it.","predicament":"Someone despised saves the life of a child belonging to those who scorned them."},
{"chunk":749,"story":85,"summary":"The driver grips his hand; told the stranger is a Cossack, a kind of Russian, he promptly changes sides in the war.","predicament":"Someone's gratitude to one person changes their opinion of that person's whole people."},
{"chunk":750,"story":86,"summary":"A sober, capable bartender loves his employer's daughter but cannot say a word to her.","predicament":"Someone competent at everything else is helpless before the person they love."},
{"chunk":751,"story":86,"summary":"Speechless before her, he talks only of rain; two men in the back room spend their days mixing and discarding drinks.","predicament":"Someone shy manages only small talk with the person they hope to marry."},
{"chunk":752,"story":86,"summary":"The men explain that to dodge a heavy duty abroad they dumped all their bottles into two barrels, one vile, one sublime.","predicament":"Two people stumbled once on a success they cannot reproduce."},
{"chunk":753,"story":86,"summary":"The second barrel gave courage, ambition and nerve; they sold it by the glass until a whole country nearly declared war.","predicament":"Someone had one extraordinary success and has spent everything since trying to repeat it."},
{"chunk":754,"story":86,"summary":"For ten months they have mixed every liquor they own trying to find it again, pouring each failure away.","predicament":"Someone keeps searching for the one missing ingredient they cannot identify."},
{"chunk":755,"story":86,"summary":"The bartender repeats the daughter's remark about water; they realise the missing element and are soon arrested for fighting and singing.","predicament":"Someone's casual remark gives others the answer they could not find."},
{"chunk":756,"story":86,"summary":"He drinks the last two spoonfuls of the golden blend, lifts the daughter off her feet, and announces they are to be married.","predicament":"Someone suddenly finds the nerve they lacked and says the one thing they wanted to."},
{"chunk":757,"story":87,"summary":"A young wife proudly shows her friend the bruises her husband gives her, saying a man who does not beat you does not care.","predicament":"Someone mistakes cruelty followed by gifts for proof of love."},
{"chunk":758,"story":87,"summary":"The friend asks whether it hurts and why he does it; she laughs that it earns her theatre tickets and silk.","predicament":"Someone asks another to explain a way of life they cannot understand."},
{"chunk":759,"story":87,"summary":"She says he beats her when drunk; the friend confesses her own husband never strikes her and never takes her anywhere either.","predicament":"Someone compares their dull marriage with a violent one and starts to envy it."},
{"chunk":760,"story":87,"summary":"The husband bursts in with bundles, theatre tickets and the promised silk waist, and the envious friend goes upstairs.","predicament":"Someone watches another receive the reward they believe is missing from their own life."},
{"chunk":761,"story":87,"summary":"The friend cries without reason; her husband comes home, grunts at supper, and reads in his stocking feet.","predicament":"Someone feels neglected by a partner who is steady, dull and silent."},
{"chunk":762,"story":87,"summary":"On the holiday her friend is merry in new silk; seized by jealousy, she resolves to provoke her own husband into striking her.","predicament":"Someone decides to provoke the reaction they think proves they are cared for."},
{"chunk":763,"story":87,"summary":"She rails at him and strikes him twice in the face, closing her eyes and waiting for the blow she longs for.","predicament":"Someone deliberately picks a fight to make a quiet partner show feeling."},
{"chunk":764,"story":87,"summary":"Her friend runs up to see; she sobs that he never touched her, and has instead begun washing the clothes.","predicament":"Someone's provocation is answered with a kindness that feels like a humiliation."},
{"chunk":765,"story":88,"summary":"A tired father reading by the window refuses to play with his young daughter and sends her out to play in the street.","predicament":"Someone too tired to give attention sends a child out to find it elsewhere."},
{"chunk":766,"story":88,"summary":"Years on, a gang leader bets he will take another girl to the dance, and his friend warns him not to cross his fiancee.","predicament":"Someone risks the loyal person who loves them to prove a point about who owns whom."},
{"chunk":767,"story":88,"summary":"He wants to teach his fiancee a lesson for her jealousy and drinking; his friend recalls he gave her her first drink.","predicament":"Someone blames another for faults they themselves introduced."},
{"chunk":768,"story":88,"summary":"She drinks whisky in a cafe and tells the waiter that if he takes the other girl to the dance she will kill him.","predicament":"Someone betrayed by the person they depend on vows revenge over drink."},
{"chunk":769,"story":88,"summary":"She recalls sitting on doorsteps as a child with nothing at home, then sits and teaches a small girl a string game.","predicament":"Someone who had nothing as a child sees their own beginning in another child."},
{"chunk":770,"story":88,"summary":"At the dance she steps out and stabs him, then runs, pursued down the street by a howling crowd.","predicament":"Someone driven past bearing turns on the person who shaped and then betrayed them."},
{"chunk":771,"story":88,"summary":"She throws herself into the river; the narrator dreams of a heavenly court where she is brought up for judgment.","predicament":"Someone destroyed by circumstances is judged as though they alone were responsible."},
{"chunk":772,"story":88,"summary":"The court discharges her and sends the officer after the guilty party: the father who sat reading while his children played in the street.","predicament":"Someone who neglected a child years ago is named as the true cause of their ruin."}
]
@@ -0,0 +1,45 @@
[
{"chunk":773,"story":89,"summary":"A police captain dismissed in a reform scandal has fallen to begging, and befriends another man as low as himself.","predicament":"Someone thrown out of a powerful post has sunk to the bottom with nothing left."},
{"chunk":774,"story":89,"summary":"His companion was thrown out of a rich uncle's house; the two sit on a park bench, one cursing, one silent.","predicament":"Two people fallen from very different heights share the same bench and the same hunger."},
{"chunk":775,"story":89,"summary":"Starving after a failed attempt at a free lunch, the former captain goes off to try one more scheme for food.","predicament":"Someone desperate for food goes out to try one last plan."},
{"chunk":776,"story":89,"summary":"Left alone, the young man goes to the police to ask whether there is a reward for his friend; the sergeant throws him out.","predicament":"Someone starving tries to sell out the friend who shares their bench."},
{"chunk":777,"story":89,"summary":"The captain returns splattered, having proposed to a fruit seller for her business; he would do anything, he says, except betray a friend.","predicament":"Someone willing to stoop to anything draws the line at betraying a friend."},
{"chunk":778,"story":89,"summary":"A political agent offers the captain five hundred dollars to testify against his old superior; he refuses and drives the man off.","predicament":"Someone starving refuses a fortune for betraying a person who was once their friend."},
{"chunk":779,"story":89,"summary":"The young man calls him a fool; then an agent tells the young man his uncle will restore him if he marries an heiress.","predicament":"Someone is offered their old life back on condition of a marriage they do not want."},
{"chunk":780,"story":89,"summary":"The young man refuses the heiress and her fortune, and the two join the midnight bread line together.","predicament":"Someone who would sell a friend refuses to sell themselves, and stays poor."},
{"chunk":781,"story":90,"summary":"The city swelters through a summer so hot that everyone talks of heat, baths and cool diets.","predicament":"People stuck in a hot city pretend they prefer it to the places they cannot afford."},
{"chunk":782,"story":90,"summary":"A harassed man insists loudly that the city is the finest summer resort, and refuses a friend's invitation to go fishing.","predicament":"Someone loudly praises the place they are stuck in to hide that they cannot leave."},
{"chunk":783,"story":90,"summary":"Alone at his desk he wonders about his friend's trout, and drifts into memory of a mountain summer long ago.","predicament":"Someone who denies wanting a thing can think of nothing else when alone."},
{"chunk":784,"story":90,"summary":"At a mountain hotel, two young men, one rich and one not, compete for the same beautiful young woman.","predicament":"Someone with little money competes against a rich rival for the same person."},
{"chunk":785,"story":90,"summary":"At a mock tournament she climbs a rock; he races his rich rival up the face and reaches her first to crown her.","predicament":"Someone outpaces a richer rival by effort and nerve for the person they love."},
{"chunk":786,"story":90,"summary":"His clerk wakes him at his desk; he insists again that the city beats the country, and turns to the letters.","predicament":"Someone wakes from a memory of what they gave up and repeats the story they tell."},
{"chunk":787,"story":90,"summary":"A letter from his wife reveals he stays in the hot city working so she and the sick children can stay in the mountains.","predicament":"Someone pretends to prefer hardship so the people they love will accept their sacrifice."},
{"chunk":788,"story":91,"summary":"Two young women share a cheap studio in an artists' quarter; in November pneumonia strikes one of them down.","predicament":"Someone far from home falls gravely ill with only a friend to care for them."},
{"chunk":789,"story":91,"summary":"The doctor says she has one chance in ten, and only if she wants to live; she has made up her mind to die.","predicament":"Someone gravely ill has given up, and their friend must find a reason for them to live."},
{"chunk":790,"story":91,"summary":"The sick girl lies counting the leaves falling from an old vine on the wall outside, and says she will die with the last.","predicament":"Someone fixes on a sign and ties their own survival to it."},
{"chunk":791,"story":91,"summary":"Her friend scolds her for the fancy and asks her to close her eyes; she says she is tired and wants to let go.","predicament":"Someone tries to talk another out of despair and cannot reach them."},
{"chunk":792,"story":91,"summary":"The friend goes down to an old drunken painter who has always promised a masterpiece, to ask him to pose.","predicament":"Someone asks help of a failure who has talked for decades of one great work."},
{"chunk":793,"story":91,"summary":"The old man scorns the fancy but agrees to pose; the two look fearfully at the vine as cold rain and snow begin.","predicament":"Someone gruff about another's weakness quietly resolves to help them."},
{"chunk":794,"story":91,"summary":"Next morning one leaf still clings to the wall; it survives another stormy night, and the girl watches it.","predicament":"Someone who expected the sign to fail watches it hold against all likelihood."},
{"chunk":795,"story":91,"summary":"She says it was wicked to want to die and asks for broth; the doctor mentions the old painter downstairs has pneumonia too.","predicament":"Someone recovers their will to live, not knowing the cost to another."},
{"chunk":796,"story":91,"summary":"Her friend tells her the old painter has died of pneumonia: he painted that last leaf on the wall the night the real one fell.","predicament":"Someone who never achieved their great work gives their life to make one small act of hope."},
{"chunk":797,"story":92,"summary":"A rising young man ignores a plain new boarder, until he sees her one evening dressed in deep mourning, beautiful and sad.","predicament":"Someone overlooked becomes interesting to another the moment they appear to be grieving."},
{"chunk":798,"story":92,"summary":"He speaks to her on the steps; she hints that death has claimed not a relative but someone closer, and he sympathises.","predicament":"Someone uses grief, real or not, to be noticed by a person they want."},
{"chunk":799,"story":92,"summary":"In the park she tells him her fiance was a real count with a castle, and that her father kept them apart.","predicament":"Someone tells an impressive story about a past love to someone they want to impress."},
{"chunk":800,"story":92,"summary":"The count, she says, was killed abroad and her heart lies in his grave; he resolves to be her friend and more.","predicament":"Someone claims a dead love to make themselves more desirable to a living one."},
{"chunk":801,"story":92,"summary":"She shows him the count's photograph in her locket and a larger one framed; he studies it with inscrutable eyes.","predicament":"Someone shows proof of a story to a person who recognises the proof."},
{"chunk":802,"story":92,"summary":"Engaged a month later, he turns gloomy and explains that a great political boss has promised to come to the wedding.","predicament":"Someone wants a powerful patron at their wedding but has a secret reason to keep them away."},
{"chunk":803,"story":92,"summary":"He says the patron must not come, for reasons he will not give, and asks whether she loves him as she loved the count.","predicament":"Someone asks their partner to choose them over a rival who may never have existed."},
{"chunk":804,"story":92,"summary":"She confesses she invented the count to wear becoming black; he forgives her, since the photograph was the political boss himself.","predicament":"Someone confesses a lie the other had already seen through and forgiven."},
{"chunk":805,"story":93,"summary":"A weary magazine sub-editor seeks relief in the artists' world of the city, and calls for a woman who belongs to it.","predicament":"Someone tired of their work seeks escape in a looser crowd."},
{"chunk":806,"story":93,"summary":"Her flat is strewn with the wreckage of last night's party; she appears radiant and they go to a famous bohemian restaurant.","predicament":"Someone lives in the careless disorder that their circle calls freedom."},
{"chunk":807,"story":93,"summary":"The restaurant's owner rose from a cheap eating-house by staging eccentricities that fashionable diners took for authentic bohemia.","predicament":"Someone grows rich by selling others an imitation of the freedom they crave."},
{"chunk":808,"story":93,"summary":"At the round table sit painters, poets and a mourning widow; the woman is one of the acknowledged princesses of their circle.","predicament":"Someone holds a high place in a circle whose rules demand constant performance."},
{"chunk":809,"story":93,"summary":"Dinner proceeds by courses of humour, wit, repartee and brag, each guest ready with their prepared performance.","predicament":"Someone must keep up with a crowd where every remark is a test."},
{"chunk":810,"story":93,"summary":"The strain of seeming at ease shows between her brows; freedom there is a tyrant that forbids anyone to object.","predicament":"Someone exhausts themselves keeping up the appearance of being free and easy."},
{"chunk":811,"story":93,"summary":"After the party she takes a midnight train to her parents' bare country cottage, and greets her stern father at sunrise.","predicament":"Someone leads a double life, escaping their free circle for a strict and silent home."},
{"chunk":812,"story":93,"summary":"She peels potatoes, lies about her work, and sits two hours on a hard chair hearing theology read aloud, blissfully happy.","predicament":"Someone finds rest in the rules and hardships that others would flee."},
{"chunk":813,"story":93,"summary":"The sermon damns her and she rejoices; that evening at dinner she tells her friends she has been away in bohemia.","predicament":"Someone escapes from freedom into strictness and calls that their holiday."},
{"chunk":814,"story":93,"summary":"When a painter tries to kiss her she slaps him hard, breaking the one law of their circle, and the party breaks up.","predicament":"Someone refreshed by strict rules breaks the unwritten rule of a permissive crowd."},
{"chunk":815,"story":93,"summary":"A village girl in the city, hearing the story, says that had the woman stayed home a week the painter would have got his kiss.","predicament":"Someone points out that the cure for one excess is simply too much of the other."}
]
@@ -0,0 +1,25 @@
[
{"chunk":816,"story":94,"summary":"A miner back from the far north with a fortune sees a young woman in the homeward crowd and resolves at once to follow her.","predicament":"Someone with money and little time decides instantly on a stranger they have glimpsed."},
{"chunk":817,"story":94,"summary":"She catches her ferry, exhausted after a late dance and a trying day, and he gains the deck beside her.","predicament":"Someone tired and discouraged is approached at their weakest moment."},
{"chunk":818,"story":94,"summary":"He speaks; she takes him for a masher, then, seeing his sincerity, lets him sit and teases him about his name.","predicament":"Someone used to unwanted advances cautiously allows a sincere one."},
{"chunk":819,"story":94,"summary":"He earnestly describes the gold dust he has brought south; she mistakes his meaning, grows bored, and falls asleep on his shoulder.","predicament":"Someone pours out their heart to a person who cannot stay awake to hear it."},
{"chunk":820,"story":94,"summary":"He asks whether she would rather a husband had money or love; she cries 'Cash!' in her sleep, and wakes to find him gone.","predicament":"Someone loses a sincere suitor through a word spoken without meaning it."},
{"chunk":821,"story":95,"summary":"A ten-dollar note tells its own history, noting that the cultured seldom hold it long enough to learn its manners.","predicament":"Something passed from hand to hand has seen every kind of owner."},
{"chunk":822,"story":95,"summary":"In a butcher's purse it meets a limp five-dollar note that spent the day in a shop girl's stocking in the heat.","predicament":"Money earned by hard work arrives worn, while other money never touches it."},
{"chunk":823,"story":95,"summary":"It circulates fast through bars, a peddler's roll, a policeman's pocket and a gambling back room, and delights in it.","predicament":"Someone's fortune passes through every sort of hand, clean and dirty alike."},
{"chunk":824,"story":95,"summary":"A gambling-house owner rolls it into a wad for a night on the town, and a gold note says he will spend lavishly.","predicament":"Someone about to spend money freely has been refused the one use they wanted for it."},
{"chunk":825,"story":95,"summary":"The gambler offered a church fifty thousand and was refused as tainted, and now half the town follows him to drink it.","predicament":"Someone's offered gift is refused as dirty, and others gladly take it instead."},
{"chunk":826,"story":95,"summary":"At a cafe he asks whether the refused money will buy drink; at one o'clock a ragged woman comes in and stares at it.","predicament":"Someone desperate appears silently before a person who has money to spare."},
{"chunk":827,"story":95,"summary":"He bows and hands her the note; once a Treasury clerk who counted such notes, she thanks him and runs to a bakery.","predicament":"Someone who fell from a respectable post accepts help from a person society scorns."},
{"chunk":828,"story":95,"summary":"A dollar from her change reports she fed a sick, half-starved child and prayed; the ten says there is no such thing as tainted money.","predicament":"Someone's help does its good regardless of where the means came from."},
{"chunk":829,"story":96,"summary":"A young woman's father, an old cutter, dies after an accident, leaving her a dollar and his employer's letter offering help.","predicament":"Someone left alone with almost nothing holds a promise of help from a powerful stranger."},
{"chunk":830,"story":96,"summary":"Evicted, she rides downtown with her dollar and the letter to seek the firm, which has moved to an address she lacks.","predicament":"Someone sets out alone to find the one person who promised help."},
{"chunk":831,"story":96,"summary":"A kindly western rancher looking for a wife approaches her honestly; a policeman seizes him as a masher and drags him away.","predicament":"Someone is shielded from a genuine chance by a guardian who assumes the worst."},
{"chunk":832,"story":96,"summary":"Preferring to support herself, she is offered a companion's post by a kind lady, until an association agent forbids her to accept.","predicament":"Someone wanting to earn their own living is stopped by people claiming to protect them."},
{"chunk":833,"story":96,"summary":"She takes a cashier's place in a candy store, and a temperance crusader warns her that the sweets contain brandy.","predicament":"Someone takes honest work and is told it will damn others."},
{"chunk":834,"story":96,"summary":"She gives up the job at the crusader's urging, who drives off in her carriage; next she tries sewing theatrical costumes.","predicament":"Someone gives up work at a reformer's word and is left with nothing."},
{"chunk":835,"story":96,"summary":"A clergyman forbids her to sew costumes for the stage and promises only that the Lord will provide.","predicament":"Someone in need is advised by a moralist who offers nothing practical."},
{"chunk":836,"story":96,"summary":"Striking girls warn her off a factory job; at last she finds her father's employer, who welcomes her warmly and offers a place.","predicament":"Someone blocked from every honest job at last reaches the one person who promised help."},
{"chunk":837,"story":96,"summary":"He has her try on furs and a fine hat as a model, then telephones to reserve his usual private table for a new companion.","predicament":"Someone driven by every protector to the promised benefactor finds a predator waiting."},
{"chunk":838,"story":96,"summary":"The narrator blames the reformers and associations, compassionate in heart but reverent of money, for losing such girls every day.","predicament":"Someone well-meaning closes every honest door and leaves the poor only the dangerous one."}
]
File diff suppressed because one or more lines are too long
@@ -0,0 +1,80 @@
== 2. Claude hand situations vs 14B k-means groups (k = 60) ==
Claude assigned 475 of 839 scenes to 20 situations; the rest carry no recurring situation.
seed 24: ARI on assigned scenes +0.049; 52 candidate groups: median share of a group that is its commonest Claude situation 17%, median share with no situation 43%
how each Claude situation is scattered across the 14B groups at seed 24:
pose 52 scenes over 24 groups; largest single group holds 15%
benefactor 48 scenes over 24 groups; largest single group holds 19%
station 47 scenes over 22 groups; largest single group holds 23%
taken_for_granted 47 scenes over 29 groups; largest single group holds 11%
newcomer 32 scenes over 15 groups; largest single group holds 19%
easy_money 30 scenes over 21 groups; largest single group holds 13%
sacrifice 25 scenes over 16 groups; largest single group holds 12%
rival 24 scenes over 15 groups; largest single group holds 21%
price 23 scenes over 15 groups; largest single group holds 22%
despised 20 scenes over 14 groups; largest single group holds 20%
appearances 19 scenes over 13 groups; largest single group holds 21%
loyalty 19 scenes over 10 groups; largest single group holds 26%
sign 17 scenes over 9 groups; largest single group holds 35%
honest_work 15 scenes over 10 groups; largest single group holds 20%
strings 15 scenes over 14 groups; largest single group holds 13%
unspoken 13 scenes over 11 groups; largest single group holds 15%
overlooked 9 scenes over 7 groups; largest single group holds 33%
homecoming 8 scenes over 6 groups; largest single group holds 38%
patron 8 scenes over 7 groups; largest single group holds 25%
habit 4 scenes over 3 groups; largest single group holds 50%
the 14B candidate groups, purest first (share = scenes carrying the commonest Claude situation):
65% of 17 station also unspoken 2, pose 1, strings 1
62% of 13 pose also appearances 1, easy_money 1
60% of 10 sign also taken_for_granted 1, overlooked 1
56% of 9 price also benefactor 1
45% of 11 rival also station 1, patron 1, overlooked 1
43% of 14 newcomer also taken_for_granted 3, honest_work 1, habit 1
43% of 7 loyalty also taken_for_granted 1
41% of 22 benefactor also despised 4, sacrifice 2, station 1
37% of 19 pose also taken_for_granted 2, easy_money 1, station 1
33% of 6 loyalty also rival 1
27% of 11 price also newcomer 1
27% of 15 rival also easy_money 2, pose 1, appearances 1
25% of 8 unspoken also taken_for_granted 1
25% of 8 station also taken_for_granted 2
25% of 8 sacrifice also strings 1, pose 1, benefactor 1
24% of 21 loyalty also benefactor 3, sacrifice 3, honest_work 1
21% of 19 station also benefactor 3, sacrifice 2, despised 2
20% of 25 newcomer also station 2, benefactor 2, homecoming 1
20% of 15 loyalty also benefactor 2, despised 2, strings 1
20% of 10 easy_money also sacrifice 2, strings 1, benefactor 1
20% of 5 sacrifice
20% of 5 appearances also easy_money 1, benefactor 1
19% of 21 easy_money also station 3, pose 2, appearances 2
19% of 27 taken_for_granted also pose 3, station 2, easy_money 2
18% of 11 strings also sacrifice 2, unspoken 1, appearances 1
18% of 11 benefactor also easy_money 1, despised 1, station 1
17% of 6 rival also price 1, station 1, loyalty 1
16% of 19 taken_for_granted also newcomer 2, station 1, easy_money 1
16% of 19 pose also newcomer 1, benefactor 1, sign 1
15% of 13 habit also taken_for_granted 2, sacrifice 1
15% of 13 easy_money also honest_work 2, strings 1, sign 1
14% of 14 station also benefactor 2, taken_for_granted 1, unspoken 1
14% of 14 price also benefactor 2, honest_work 1, newcomer 1
14% of 14 benefactor also pose 2, loyalty 1, sacrifice 1
13% of 15 taken_for_granted also pose 2, patron 2, easy_money 1
13% of 23 easy_money also benefactor 3, despised 2, homecoming 1
12% of 16 rival also strings 1, unspoken 1, station 1
12% of 17 sacrifice also unspoken 1, easy_money 1, rival 1
11% of 27 pose also benefactor 2, rival 2, appearances 2
11% of 18 station also benefactor 2, sacrifice 2, taken_for_granted 1
11% of 18 sign also benefactor 2, rival 1, easy_money 1
11% of 18 price also taken_for_granted 2, station 1, strings 1
11% of 9 strings also taken_for_granted 1, despised 1
11% of 9 price also pose 1, patron 1
11% of 37 station also newcomer 4, pose 4, overlooked 3
11% of 19 honest_work also appearances 2, newcomer 2, unspoken 1
10% of 20 newcomer also strings 1, benefactor 1, sign 1
10% of 42 appearances also station 3, homecoming 3, sign 3
10% of 21 pose also benefactor 2, newcomer 2, strings 1
9% of 11 honest_work also price 1, easy_money 1, loyalty 1
7% of 14 homecoming
0% of 5 -
seed 11: ARI on assigned scenes +0.051; 55 candidate groups: median share of a group that is its commonest Claude situation 20%, median share with no situation 42%
seed 12: ARI on assigned scenes +0.046; 52 candidate groups: median share of a group that is its commonest Claude situation 20%, median share with no situation 42%
seed 13: ARI on assigned scenes +0.049; 51 candidate groups: median share of a group that is its commonest Claude situation 17%, median share with no situation 42%
@@ -0,0 +1,76 @@
== 1. Predicament text (839 scenes each) ==
claude median words 14 over 20 words 0 with a topic word 8.3% with a place word 3.6% capitalised mid-sentence 0 starts "Someone" 88%
commonest topic words: room 13, rival 11, partner 10, suitor 5, street 5, judge 4, station 3, house 3, employer 3, court 2, neighbour 2, stage 2
qwen3:14b raw median words 24 over 20 words 709 with a topic word 23.0% with a place word 10.1% capitalised mid-sentence 110 starts "Someone" 0%
commonest topic words: wife 16, lover 10, husband 9, street 9, restaurant 9, room 8, writer 7, stage 6, dinner 6, cop 5, park 5, hotel 5
qwen3:14b after strip_names median words 24 over 20 words 707 with a topic word 23.0% with a place word 10.1% capitalised mid-sentence 35 starts "Someone" 20%
commonest topic words: wife 16, lover 10, husband 9, street 9, restaurant 9, room 8, writer 7, stage 6, dinner 6, cop 5, park 5, hotel 5
== 2. Claude hand situations vs 14B k-means groups (k = 60) ==
Claude assigned 475 of 839 scenes to 20 situations; the rest carry no recurring situation.
seed 24: ARI on assigned scenes +0.075; 40 candidate groups: median share of a group that is its commonest Claude situation 20%, median share with no situation 41%
how each Claude situation is scattered across the 14B groups at seed 24:
pose 52 scenes over 23 groups; largest single group holds 15%
benefactor 48 scenes over 21 groups; largest single group holds 17%
station 47 scenes over 19 groups; largest single group holds 30%
taken_for_granted 47 scenes over 25 groups; largest single group holds 30%
newcomer 32 scenes over 16 groups; largest single group holds 38%
easy_money 30 scenes over 15 groups; largest single group holds 17%
sacrifice 25 scenes over 16 groups; largest single group holds 24%
rival 24 scenes over 12 groups; largest single group holds 33%
price 23 scenes over 10 groups; largest single group holds 22%
despised 20 scenes over 18 groups; largest single group holds 10%
appearances 19 scenes over 10 groups; largest single group holds 21%
loyalty 19 scenes over 9 groups; largest single group holds 32%
sign 17 scenes over 9 groups; largest single group holds 24%
honest_work 15 scenes over 8 groups; largest single group holds 40%
strings 15 scenes over 11 groups; largest single group holds 13%
unspoken 13 scenes over 11 groups; largest single group holds 15%
overlooked 9 scenes over 8 groups; largest single group holds 22%
homecoming 8 scenes over 6 groups; largest single group holds 38%
patron 8 scenes over 7 groups; largest single group holds 25%
habit 4 scenes over 4 groups; largest single group holds 25%
the 14B candidate groups, purest first (share = scenes carrying the commonest Claude situation):
61% of 23 taken_for_granted also unspoken 1, sacrifice 1
50% of 6 price also station 1
40% of 15 honest_work also sacrifice 2, easy_money 1, unspoken 1
38% of 32 newcomer also benefactor 2, pose 1, homecoming 1
33% of 15 easy_money also benefactor 4, despised 1
33% of 12 appearances also easy_money 2, newcomer 1, pose 1
33% of 9 easy_money also appearances 2, newcomer 1, honest_work 1
27% of 15 easy_money also loyalty 1, despised 1, station 1
25% of 16 pose also price 1, station 1, taken_for_granted 1
23% of 60 station also pose 8, rival 8, sacrifice 2
23% of 13 station also benefactor 2, homecoming 1, newcomer 1
22% of 9 pose also taken_for_granted 1
22% of 9 overlooked also patron 2, honest_work 1, rival 1
21% of 28 loyalty also pose 3, homecoming 3, station 2
21% of 19 pose also strings 2, station 2, easy_money 2
21% of 29 benefactor also strings 2, loyalty 2, sacrifice 1
20% of 35 pose also price 4, appearances 3, despised 2
20% of 25 easy_money also loyalty 3, newcomer 2, strings 1
20% of 5 overlooked also rival 1
20% of 5 overlooked also taken_for_granted 1, station 1, patron 1
20% of 5 benefactor also newcomer 1, despised 1
19% of 42 benefactor also station 3, sign 3, pose 3
18% of 22 sign also station 3, price 2, habit 1
18% of 17 appearances also rival 2, strings 1, pose 1
17% of 6 pose also overlooked 1
16% of 19 pose also station 1, strings 1, taken_for_granted 1
16% of 32 benefactor also strings 2, loyalty 2, appearances 1
15% of 13 taken_for_granted also station 2, newcomer 2, benefactor 1
15% of 34 price also station 4, pose 3, rival 3
14% of 7 taken_for_granted
13% of 15 strings also benefactor 2, unspoken 1, easy_money 1
13% of 15 rival also despised 2, sign 1, pose 1
12% of 8 strings also taken_for_granted 1, benefactor 1, patron 1
12% of 25 sacrifice also price 3, newcomer 2, station 2
12% of 34 benefactor also taken_for_granted 3, newcomer 3, honest_work 2
11% of 9 despised also benefactor 1, newcomer 1, price 1
10% of 21 loyalty also benefactor 1, easy_money 1, honest_work 1
9% of 11 sign also easy_money 1
8% of 13 patron also easy_money 1, appearances 1, pose 1
6% of 31 station also sign 2, honest_work 1, appearances 1
seed 11: ARI on assigned scenes +0.061; 42 candidate groups: median share of a group that is its commonest Claude situation 20%, median share with no situation 41%
seed 12: ARI on assigned scenes +0.071; 45 candidate groups: median share of a group that is its commonest Claude situation 20%, median share with no situation 41%
seed 13: ARI on assigned scenes +0.060; 42 candidate groups: median share of a group that is its commonest Claude situation 19%, median share with no situation 40%
@@ -0,0 +1,87 @@
"""Compare Claude's hand pass with the local pipeline, on files already on disk. No inference.
cd probe/v2 && python3 claude/compare.py > claude/compare.log
1. Text: leakage of topic words (jobs, relationships, places) and capitalised names into the
one-sentence predicaments, Claude vs qwen3:14b (same prompt rules).
2. Grouping: Claude's hand situations vs the k-means groups on the 14B predicament embeddings
(k = 60; seed 24 is the review seed, 11-13 the measurement seeds).
"""
import collections, json, math, pathlib, re, statistics, sys
HERE = pathlib.Path(__file__).resolve().parent
sys.path.insert(0, str(HERE)); sys.path.insert(0, str(HERE.parent.parent))
from assign import ASSIGN
from topic_words import TOPIC_WORDS, PLACE_WORDS
chunks = json.load(open('chunks.json'))
n = len(chunks)
mine = {x['chunk']: x['summary'] for x in json.load(open(HERE / 'predicaments-claude.json'))['summaries']}
q14 = {x['chunk']: x['summary'] for x in json.load(open('predicaments_clean.json'))['summaries']}
q14raw = {x['chunk']: x.get('raw', x['summary']) for x in json.load(open('predicaments.json'))['summaries']}
def words(s): return re.findall(r"[a-zé']+", s.lower())
def caps_mid(s):
toks = re.findall(r"[A-Za-z']+", s)
return [t for t in toks[1:] if t[0].isupper() and t not in ('I',)]
print('== 1. Predicament text (839 scenes each) ==')
for name, d in (('claude', mine), ('qwen3:14b raw', q14raw), ('qwen3:14b after strip_names', q14)):
tw = [set(words(d[i])) & TOPIC_WORDS for i in range(n)]
pw = [set(words(d[i])) & PLACE_WORDS for i in range(n)]
cm = [caps_mid(d[i]) for i in range(n)]
lens = [len(d[i].split()) for i in range(n)]
some = sum(1 for i in range(n) if d[i].lower().startswith('someone'))
print(f'{name:30s} median words {statistics.median(lens):>4} over 20 words {sum(l > 20 for l in lens):>3} '
f'with a topic word {sum(bool(x) for x in tw)/n:5.1%} with a place word {sum(bool(x) for x in pw)/n:5.1%} '
f'capitalised mid-sentence {sum(bool(x) for x in cm):>3} starts "Someone" {some/n:5.0%}')
top = collections.Counter(w for x in tw for w in x).most_common(12)
print(' ' * 32 + 'commonest topic words: ' + ', '.join(f'{w} {c}' for w, c in top))
# ---- 2. grouping agreement --------------------------------------------------------------
import os; EMB_FILE = os.environ.get('EMB_FILE', 'predicament_embeddings.json'); print('embeddings:', EMB_FILE); sys.argv = ['measure.py', EMB_FILE]
src = (HERE.parent.parent / 'measure.py').read_text(encoding='utf-8').split("print(f'{path.name}")[0]
exec(src) # defines V, story, kmeans, describe, MIN_SIZE, MIN_STORIES, MAX_DOMINANT
def ari(labels_a, labels_b):
pairs = collections.Counter(zip(labels_a, labels_b))
a = collections.Counter(labels_a); b = collections.Counter(labels_b)
c2 = lambda x: x * (x - 1) / 2
idx = sum(c2(v) for v in pairs.values()); sa = sum(c2(v) for v in a.values()); sb = sum(c2(v) for v in b.values())
exp = sa * sb / c2(len(labels_a)); mx = (sa + sb) / 2
return (idx - exp) / (mx - exp) if mx != exp else 0.0
print('\n== 2. Claude hand situations vs 14B k-means groups (k = 60) ==')
print(f'Claude assigned {len(ASSIGN)} of {n} scenes to {len(set(ASSIGN.values()))} situations; the rest carry no recurring situation.')
for seed in (24, 11, 12, 13):
groups = kmeans(60, seed)
lab = {}
for gi, g in enumerate(groups):
for i in g: lab[i] = gi
assigned = sorted(ASSIGN)
a = ari([ASSIGN[i] for i in assigned], [lab[i] for i in assigned])
cand = [g for g in groups if (lambda s: s[0] >= MIN_SIZE and s[1] >= MIN_STORIES and s[2] <= MAX_DOMINANT)(describe(g))]
purities, unassigned = [], []
for g in cand:
sits = collections.Counter(ASSIGN[i] for i in g if i in ASSIGN)
purities.append(sits.most_common(1)[0][1] / len(g) if sits else 0.0)
unassigned.append(sum(1 for i in g if i not in ASSIGN) / len(g))
print(f'seed {seed:>2}: ARI on assigned scenes {a:+.3f}; {len(cand)} candidate groups: median share of a group that is its '
f'commonest Claude situation {statistics.median(purities):.0%}, median share with no situation {statistics.median(unassigned):.0%}')
if seed == 24:
spread = {}
for s in sorted(set(ASSIGN.values())):
mem = [i for i in ASSIGN if ASSIGN[i] == s]
cl = collections.Counter(lab[i] for i in mem)
spread[s] = (len(mem), len(cl), cl.most_common(1)[0][1] / len(mem))
print(' how each Claude situation is scattered across the 14B groups at seed 24:')
for s, (m, k, top) in sorted(spread.items(), key=lambda kv: -kv[1][0]):
print(f' {s:18s} {m:3d} scenes over {k:2d} groups; largest single group holds {top:4.0%}')
rows = []
for g in cand:
sits = collections.Counter(ASSIGN[i] for i in g if i in ASSIGN)
top = sits.most_common(1)[0] if sits else ('-', 0)
rows.append((top[1] / len(g), len(g), top[0], sits))
print(' the 14B candidate groups, purest first (share = scenes carrying the commonest Claude situation):')
for share, size, s, sits in sorted(rows, reverse=True):
other = ', '.join(f'{k} {v}' for k, v in sits.most_common()[1:4])
print(f' {share:4.0%} of {size:2d} {s:18s} {("also " + other) if other else ""}')
@@ -0,0 +1,13 @@
#!/usr/bin/env python3
"""Print a range of scenes for reading. Usage: dump.py <first_chunk> <last_chunk>"""
import json, sys
chunks = json.load(open(__file__.rsplit('/',2)[0] + '/chunks.json'))
a, b = int(sys.argv[1]), int(sys.argv[2])
cur = None
for i in range(a, min(b + 1, len(chunks))):
c = chunks[i]
if c['story'] != cur:
cur = c['story']
print(f"\n########## STORY {cur}: {c['title']} ##########")
print(f"\n----- scene {i} (story {cur}) -----")
print(c['text'].strip())
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,70 @@
"""Build claude-reference.html from the Claude pass and the pipeline's files. No inference.
cd probe/v2 && python3 claude/report_page.py
"""
import json, pathlib, re, statistics, collections, sys
HERE = pathlib.Path(__file__).resolve().parent
sys.path.insert(0, str(HERE)); sys.path.insert(0, str(HERE.parent.parent))
from assign import ASSIGN
from topic_words import TOPIC_WORDS, PLACE_WORDS
chunks = json.load(open('chunks.json'))
n = len(chunks)
cp = {x['chunk']: x['summary'] for x in json.load(open(HERE / 'predicaments-claude.json'))['summaries']}
cs = {x['chunk']: x['summary'] for x in json.load(open(HERE / 'summaries-claude.json'))['summaries']}
qp = {x['chunk']: x['summary'] for x in json.load(open('predicaments_clean.json'))['summaries']}
qpraw = {x['chunk']: x.get('raw', x['summary']) for x in json.load(open('predicaments.json'))['summaries']}
qs = {x['chunk']: x['summary'] for x in json.load(open('summaries_clean.json'))['summaries']}
sit = json.load(open(HERE / 'situations-claude.json'))
def w(s): return re.findall(r"[a-zé']+", s.lower())
def caps(s): return [t for t in re.findall(r"[A-Za-z']+", s)[1:] if t[0].isupper() and t != 'I']
text = []
for name, d in (('Claude (claude-opus-5)', cp), ('qwen3:14b, as generated', qpraw), ('qwen3:14b after strip_names.py', qp)):
tw = [set(w(d[i])) & TOPIC_WORDS for i in range(n)]
text.append(dict(name=name, median=statistics.median(len(d[i].split()) for i in range(n)),
over=sum(len(d[i].split()) > 20 for i in range(n)), topic=sum(bool(x) for x in tw) / n,
place=sum(bool(set(w(d[i])) & PLACE_WORDS) for i in range(n)) / n, caps=sum(bool(caps(d[i])) for i in range(n)),
top=', '.join(f'{k} {v}' for k, v in collections.Counter(x for s in tw for x in s).most_common(8))))
# grouping numbers come from compare.log so the page never disagrees with the log
log = (HERE / 'compare.log').read_text()
ari = [dict(seed=int(m[0]), ari=float(m[1]), groups=int(m[2]), purity=int(m[3]), none=int(m[4])) for m in
re.findall(r"seed\s+(\d+): ARI on assigned scenes ([+-][\d.]+); (\d+) candidate groups: median share of a group that is its commonest Claude situation (\d+)%, median share with no situation (\d+)%", log)]
spread = [(m[0], int(m[1]), int(m[2]), int(m[3])) for m in re.findall(r"^\s+(\w+)\s+(\d+) scenes over\s+(\d+) groups; largest single group holds\s+(\d+)%", log, re.M)]
assert len(ari) == 4 and len(spread) == 20, (len(ari), len(spread))
scenes = [dict(chunk=i, title=chunks[i]['title'], cp=cp[i], cs=cs[i], qp=qp[i], qs=qs[i], sit=ASSIGN.get(i, '')) for i in range(n)]
n_sit = len(sit['situations']); passing = sum(s['passes_pipeline_candidate_rule'] for s in sit['situations'])
events = sum(len(s['events']) for s in sit['situations']); opts = sum(len(e['options']) for s in sit['situations'] for e in s['events'])
facts = [(f'{n}', 'scenes described, 97 stories'), (f'{len(ASSIGN)}', f'scenes carrying a recurring situation ({len(ASSIGN)/n:.0%})'),
(f'{passing} of {n_sit}', 'situations pass the pipeline’s candidate rule'), (f'{events} · {opts}', 'draft events · options'),
(f"{ari[0]['ari']:.2f}", 'agreement with the 14B groups (ARI, seed 24)')]
caveat = ("<p><b>What this does and does not show.</b> The hand grouping is one careful reader’s judgment, not ground truth. "
"It is, however, the kind of reading the pipeline is trying to automate, and the 14B groups barely track it: a median 14B candidate group is "
f"{ari[0]['purity']}% one hand situation and {ari[0]['none']}% scenes with no recurring situation at all. This comparison cannot say whether the fault is the "
"14B predicament text or the embed-and-cluster step. The way to separate them is to embed <i>these</i> 839 predicaments with nomic-embed-text and run the same "
"k-means. That needs the inference host, so it has not been run.</p>"
"<p><b>A caveat on my own text:</b> 88% of my predicaments begin “Someone”. That shared opener is harmless to a reader, but "
"DESIGN.md already flags “someone” as a token that could pull embeddings together, so it may make my file look more alike to an embedder than it reads.</p>")
method = ("<p><b>Scenes.</b> <code>probe/v2/chunks.json</code>, 839 scenes from 97 stories, read in order, one story at a time, in 19 batches. Each scene got a "
"summary under the qwen2.5:3b summary prompt (one sentence, at most 25 words, roles not names, no places) and a predicament under the qwen3:14b redescribe "
"prompt (one sentence, at most 20 words, no names, jobs, places, businesses or story-specific objects). I kept names out as I wrote; nothing was "
"stripped afterwards. Every record was checked for length and story id.</p>"
"<p><b>Grouping.</b> By hand, from the predicaments and summaries together (<code>claude/assign.py</code>). Each scene gets at most one situation. "
"364 scenes carry none: essays, set-ups and one-off turns. No embeddings and no clustering were used.</p>"
"<p><b>Events.</b> One event per situation, with the benefactor split in two, because the side you stand on changes every option. The options are "
"tagged <code>scene</code> (taken from a named scene), <code>archetype</code> (the fixed moves DESIGN.md calls for, such as “say nothing”) or "
"<code>gap</code> (written to fill a hole). Descriptions are generic second person, with the scenes they came from. Sizes are advisory priors for the "
"numeric search. <code>claude/situations_src.py</code> checks option counts, paths, capitalised names and duplicate effect sets.</p>"
"<p><b>Comparison.</b> <code>claude/compare.py</code> uses only files already on disk. No model was called for any of it.</p>"
"<p><b>Files</b>, all in <code>probe/v2/claude/</code>: <code>summaries-claude.json</code> and <code>predicaments-claude.json</code> "
"(same shape as the pipeline's), <code>assign.py</code>, <code>situations-claude.json</code>, <code>compare.log</code>, this page.</p>")
foot = "Corpus: O. Henry, The Four Million cycle (Project Gutenberg, public domain). Built by <code>claude/report_page.py</code>."
data = dict(facts=facts, situations=sit, text=text, ari=ari, spread=spread, caveat=caveat, scenes=scenes, method=method, foot=foot)
blob = json.dumps(data, ensure_ascii=False).replace('</', '<\\/')
html = (HERE / 'report_template.html').read_text().replace('__DATA__', blob)
(HERE / 'claude-reference.html').write_text(html, encoding='utf-8')
print('wrote claude/claude-reference.html', len(html) // 1024, 'KB')
@@ -0,0 +1,257 @@
<title>O. Henry Reference Pass</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Old+Standard+TT:ital,wght@0,400;0,700;1,400&family=IBM+Plex+Sans:ital,wght@0,400;0,500;0,600;1,400&family=IBM+Plex+Mono:wght@400;500&display=swap">
<style>
:root{
--ground:#F3F5F2; --surface:#FFFFFF; --sunk:#E9EDE9; --ink:#1B2320; --muted:#56615C; --faint:#8A948F;
--rule:#D5DCD7; --accent:#1F6F5C; --accent-soft:#DCEDE6; --brass:#8C6C22; --brass-soft:#F2E8CF;
--up:#2E7A48; --down:#A5432D; --chip:#EEF2EF;
--display:"Old Standard TT", "Iowan Old Style", Georgia, serif;
--body:"IBM Plex Sans", system-ui, -apple-system, "Segoe UI", sans-serif;
--mono:"IBM Plex Mono", ui-monospace, "SFMono-Regular", Menlo, monospace;
}
@media (prefers-color-scheme: dark){
:root:not([data-theme="light"]){
--ground:#111614; --surface:#18201C; --sunk:#1F2924; --ink:#E3E9E5; --muted:#A5B1AB; --faint:#78847E;
--rule:#2C3833; --accent:#62C2A6; --accent-soft:#1D3A31; --brass:#D5B561; --brass-soft:#3A3120;
--up:#6CC48C; --down:#E08A74; --chip:#223029;
}
}
:root[data-theme="dark"]{
--ground:#111614; --surface:#18201C; --sunk:#1F2924; --ink:#E3E9E5; --muted:#A5B1AB; --faint:#78847E;
--rule:#2C3833; --accent:#62C2A6; --accent-soft:#1D3A31; --brass:#D5B561; --brass-soft:#3A3120;
--up:#6CC48C; --down:#E08A74; --chip:#223029;
}
*{box-sizing:border-box}
body{background:var(--ground); color:var(--ink); font:15px/1.55 var(--body); padding-inline:16px; padding-block:0 64px}
.wrap{max-width:1040px; margin:0 auto}
header.top{padding-block:40px 20px; border-bottom:1px solid var(--rule)}
.eyebrow{font:500 11px/1 var(--mono); letter-spacing:.12em; text-transform:uppercase; color:var(--accent)}
h1{font:400 clamp(30px,5vw,44px)/1.1 var(--display); margin:.35em 0 .3em; text-wrap:balance}
h2{font:400 28px/1.2 var(--display); margin:0 0 .4em; text-wrap:balance}
h3{font:600 17px/1.3 var(--body); margin:0; text-wrap:balance}
p{max-width:68ch; margin:.5em 0}
.lede{font-size:16.5px; color:var(--muted); max-width:70ch}
nav.jump{position:sticky; top:env(safe-area-inset-top,0px); z-index:5; background:var(--ground); border-bottom:1px solid var(--rule);
display:flex; gap:4px; flex-wrap:wrap; padding-block:8px}
nav.jump a{font:500 13px/1 var(--body); color:var(--muted); text-decoration:none; padding:8px 12px; border-radius:6px}
nav.jump a:hover,nav.jump a:focus-visible{color:var(--ink); background:var(--sunk); outline:none}
section{padding-block:36px 8px}
.facts{display:grid; grid-template-columns:repeat(auto-fit,minmax(190px,1fr)); gap:12px; margin-top:18px}
.fact{background:var(--surface); border:1px solid var(--rule); border-radius:8px; padding:14px 16px}
.fact b{display:block; font:400 28px/1.1 var(--display); font-variant-numeric:tabular-nums}
.fact span{color:var(--muted); font-size:13px}
.note{background:var(--brass-soft); border-left:3px solid var(--brass); padding:12px 16px; border-radius:0 6px 6px 0; margin:16px 0; max-width:none}
.note p{margin:.3em 0}
code,.mono{font-family:var(--mono); font-size:12.5px}
.tablewrap{overflow-x:auto; border:1px solid var(--rule); border-radius:8px; background:var(--surface); margin:12px 0}
table{border-collapse:collapse; width:100%; font-size:13.5px}
th,td{text-align:left; padding:8px 12px; border-bottom:1px solid var(--rule); vertical-align:top}
th{font:600 11px/1.3 var(--mono); letter-spacing:.06em; text-transform:uppercase; color:var(--muted); background:var(--sunk)}
td.num,th.num{text-align:right; font-variant-numeric:tabular-nums}
tr:last-child td{border-bottom:none}
/* situations */
.sitlist{display:flex; flex-direction:column; gap:14px; margin-top:16px}
details.sit{background:var(--surface); border:1px solid var(--rule); border-radius:10px}
details.sit>summary{list-style:none; cursor:pointer; padding:16px 18px; display:grid; grid-template-columns:1fr auto; gap:6px 16px; align-items:start}
details.sit>summary::-webkit-details-marker{display:none}
details.sit>summary:focus-visible{outline:2px solid var(--accent); outline-offset:2px; border-radius:10px}
.sit .sentence{grid-column:1/-1; color:var(--muted); font-size:14.5px; margin:0}
.sit .meta{display:flex; gap:6px; flex-wrap:wrap; justify-content:flex-end}
.pill{font:500 11px/1 var(--mono); padding:5px 8px; border-radius:999px; background:var(--chip); color:var(--muted); white-space:nowrap}
.pill.ok{background:var(--accent-soft); color:var(--accent)}
.pill.below{background:var(--brass-soft); color:var(--brass)}
.sitbody{padding:0 18px 18px; border-top:1px solid var(--rule)}
.stories{font-size:13px; color:var(--muted); margin:12px 0 4px}
.stories i{font-style:normal; font-variant:small-caps; letter-spacing:.02em; color:var(--ink)}
.event{margin-top:18px}
.event h4{font:400 20px/1.25 var(--display); margin:0 0 4px}
.event .ev-meta{font-size:12.5px; color:var(--muted)}
.descs{display:flex; flex-direction:column; gap:8px; margin:10px 0 14px; padding:0; list-style:none}
.descs li{background:var(--sunk); border-radius:6px; padding:10px 14px; font-style:italic}
.descs li .src{font-style:normal; display:block; margin-top:4px}
.src{font:400 11.5px/1.3 var(--mono); color:var(--faint)}
.opts{display:grid; grid-template-columns:1fr; gap:10px}
.opt{border:1px solid var(--rule); border-radius:8px; padding:10px 14px; display:grid; gap:6px}
.opt .label{font-weight:600}
.opt .result{color:var(--muted)}
.effects{display:flex; flex-wrap:wrap; gap:6px}
.eff{font:500 11.5px/1 var(--mono); padding:5px 8px; border-radius:5px; background:var(--chip); white-space:nowrap}
.eff.up{color:var(--up)} .eff.down{color:var(--down)}
.eff.flag{color:var(--accent)} .eff.note{color:var(--brass); white-space:normal}
.kind{font:500 10.5px/1 var(--mono); letter-spacing:.06em; text-transform:uppercase; color:var(--faint)}
/* scenes */
.controls{display:flex; flex-wrap:wrap; gap:10px; align-items:end; margin:14px 0}
.controls label{display:flex; flex-direction:column; gap:4px; font:500 11px/1 var(--mono); letter-spacing:.06em; text-transform:uppercase; color:var(--muted)}
select,input[type=search]{font:14px var(--body); color:var(--ink); background:var(--surface); border:1px solid var(--rule); border-radius:6px; padding:7px 10px; min-width:0; max-width:100%}
input[type=search]{width:min(320px,100%)}
select:focus-visible,input:focus-visible,button:focus-visible{outline:2px solid var(--accent); outline-offset:1px}
.scenes{display:flex; flex-direction:column; gap:10px}
.scene{background:var(--surface); border:1px solid var(--rule); border-radius:8px; padding:12px 14px}
.scene .head{display:flex; flex-wrap:wrap; gap:6px 10px; align-items:baseline; margin-bottom:8px}
.scene .head .n{font:500 12px/1 var(--mono); color:var(--faint)}
.scene .head .t{font-variant:small-caps; letter-spacing:.02em}
.pair{display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:10px}
.pair>div{border-radius:6px; padding:8px 10px; background:var(--sunk)}
.pair .who{font:500 10.5px/1 var(--mono); letter-spacing:.06em; text-transform:uppercase; color:var(--muted); display:block; margin-bottom:5px}
.pair .claude{background:var(--accent-soft)}
.pair .over{color:var(--down); font:500 10.5px var(--mono)}
@media (max-width:640px){ .pair{grid-template-columns:1fr} details.sit>summary{grid-template-columns:1fr} .sit .meta{justify-content:flex-start} }
button.more{font:500 14px var(--body); color:var(--accent); background:var(--surface); border:1px solid var(--rule); border-radius:6px; padding:9px 16px; cursor:pointer; margin-top:12px}
.count{font:500 12px var(--mono); color:var(--muted)}
footer{margin-top:40px; padding-top:16px; border-top:1px solid var(--rule); color:var(--faint); font-size:12.5px}
@media (prefers-reduced-motion: reduce){ *{scroll-behavior:auto!important} }
</style>
<div class="wrap">
<header class="top">
<div class="eyebrow">story-to-pack · reference pass · 2026-09-17</div>
<h1>The Four Million, read by hand</h1>
<p class="lede">Every one of the 839 scenes in the v2 O. Henry corpus, described by Claude under the same rules the local models were given, then grouped into recurring situations and turned into draft events with options. It is a yardstick for the pipeline and for qwen3:14b, not a pack.</p>
<div class="facts" id="facts"></div>
</header>
<nav class="jump" aria-label="Sections">
<a href="#situations">Situations &amp; options</a>
<a href="#compare">Against the local pipeline</a>
<a href="#scenes">All 839 scenes</a>
<a href="#method">How this was made</a>
</nav>
<section id="situations">
<h2>Situations the corpus keeps returning to</h2>
<p>Twenty groups. Sixteen pass the pipeline's own candidate rule: at least five scenes, at least four stories, and no story over 40%. The other four are real but narrow, and are marked. Each group becomes one event (two for the benefactor, one per side) with three to five options. Effects name a state path, a direction and a rough size, never a number, as DESIGN.md requires.</p>
<div class="note" id="spine"></div>
<div class="sitlist" id="sitlist"></div>
</section>
<section id="compare">
<h2>Against the local pipeline</h2>
<h3 style="margin-top:8px">One-sentence predicaments, same rules, 839 scenes each</h3>
<p>The prompt asked for at most 20 words and no names, jobs, professions, places or businesses. Topic words are the pipeline's own <code>topic_words.py</code> list, which also counts relationship words.</p>
<div class="tablewrap"><table id="texttable"></table></div>
<h3 style="margin-top:22px">Do the 14B groups find these situations?</h3>
<p>These are the k-means groups on the qwen3:14b predicament embeddings at k = 60, compared with the hand grouping over the 475 scenes that carry a situation. An adjusted Rand index of 0 means chance agreement and 1 means identical groups.</p>
<div class="tablewrap"><table id="aritable"></table></div>
<p>At the review seed (24), each hand situation is spread across many 14B groups:</p>
<div class="tablewrap"><table id="spreadtable"></table></div>
<div class="note" id="caveat"></div>
</section>
<section id="scenes">
<h2>All 839 scenes, side by side</h2>
<p>Claude's summary and predicament next to the pipeline's (qwen2.5:3b summary, qwen3:14b predicament). Filter by situation or story, or search any of the four texts.</p>
<div class="controls">
<label for="f-sit">Situation<select id="f-sit"></select></label>
<label for="f-story">Story<select id="f-story"></select></label>
<label for="f-q">Search<input type="search" id="f-q" placeholder="word in any text"></label>
<span class="count" id="f-count"></span>
</div>
<div class="scenes" id="scenelist"></div>
<button class="more" id="more" type="button">Show 40 more</button>
</section>
<section id="method">
<h2>How this was made</h2>
<div id="methodbody"></div>
</section>
<footer id="foot"></footer>
</div>
<script id="data" type="application/json">__DATA__</script>
<script>
(function(){
const D = JSON.parse(document.getElementById('data').textContent);
const $ = s => document.querySelector(s);
const esc = s => String(s).replace(/[&<>"]/g, c => ({'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;'}[c]));
const title = s => s.toLowerCase().replace(/\b\w/g, c => c.toUpperCase());
// facts
const F = D.facts;
$('#facts').innerHTML = F.map(f => `<div class="fact"><b>${esc(f[0])}</b><span>${esc(f[1])}</span></div>`).join('');
// spine
const S = D.situations;
$('#spine').innerHTML = `<p><b>Player role (assumed for the draft):</b> ${esc(S.player_role)}. <b>Stages:</b> ${Object.entries(S.stages).map(([k,v])=>`<code>${k}</code> ${esc(v)}`).join(' · ')}</p>
<p><b>Cast (roles, not people):</b> ${Object.entries(S.cast).map(([k,v])=>`<code>${k}</code> ${esc(v)}`).join(' · ')}. <b>Skills:</b> ${Object.entries(S.skills).map(([k,v])=>`<code>${k}</code> ${esc(v)}`).join(' · ')}. Relationship stats: ${S.relationship_stats.map(x=>`<code>${x}</code>`).join(' ')}.</p>`;
function effChip(e){
if (e.push) return `<span class="eff note">notable: “${esc(e.push)}”</span>`;
if (e.set) return `<span class="eff flag">${esc(e.path)} = true</span>`;
const up = e.dir === '+';
return `<span class="eff ${up?'up':'down'}">${esc(e.path)} ${up?'▲':'▼'} ${e.size[0].toUpperCase()}</span>`;
}
const sceneRef = cs => cs.length ? `scenes ${cs.join(', ')}` : '';
$('#sitlist').innerHTML = S.situations.map((s,i) => {
const ev0 = s.events[0];
const st = {}; s.members.forEach(m => { st[m.title] = (st[m.title]||0)+1; });
const storyList = Object.entries(st).sort((a,b)=>b[1]-a[1]).map(([t,n])=>`<i>${esc(t)}</i> ${n}`).join(' · ');
const gate = s.passes_pipeline_candidate_rule ? `<span class="pill ok">passes candidate rule</span>` :
`<span class="pill below">below the bar${s.stories<4?' · '+s.stories+' stories':''}${s.dominant_story_share>0.4?' · one story '+Math.round(s.dominant_story_share*100)+'%':''}</span>`;
const events = s.events.map(ev => `
<div class="event">
<h4>${esc(ev.title)}</h4>
<div class="ev-meta">Stages: ${ev.stages.map(x=>`<code>${x}</code>`).join(' ')} · Roles: ${ev.roles.map(x=>`<code>${x}</code>`).join(' ')}</div>
<p style="margin-top:6px">${esc(ev.sentence)}</p>
<ul class="descs">${ev.descriptions.map(d=>`<li>${esc(d.text)}<span class="src">from ${sceneRef(d.sources)}</span></li>`).join('')}</ul>
<div class="opts">${ev.options.map(o=>`
<div class="opt">
<div><span class="label">${esc(o.label)}</span> <span class="kind">${o.source.kind}${o.source.chunks.length?' · '+sceneRef(o.source.chunks):''}</span></div>
<div class="result">${esc(o.result)}</div>
<div class="effects">${o.effects.length? o.effects.map(effChip).join('') : '<span class="eff">no effect</span>'}</div>
</div>`).join('')}</div>
</div>`).join('');
return `<details class="sit" ${i<2?'open':''}>
<summary><h3>${esc(ev0.title)} <span class="src">${esc(s.id)}</span></h3>
<div class="meta"><span class="pill">${s.scenes} scenes</span><span class="pill">${s.stories} stories</span>${gate}</div>
<p class="sentence">${esc(ev0.sentence)}</p></summary>
<div class="sitbody"><p class="stories">${storyList}</p>${events}</div></details>`;
}).join('');
// comparison tables
const T = D.text;
$('#texttable').innerHTML = `<thead><tr><th>Source</th><th class="num">Median words</th><th class="num">Over 20 words</th><th class="num">With a topic word</th><th class="num">With a place word</th><th class="num">Capitalised mid-sentence</th><th>Commonest topic words</th></tr></thead><tbody>` +
T.map(r=>`<tr><td>${esc(r.name)}</td><td class="num">${r.median}</td><td class="num">${r.over}</td><td class="num">${(r.topic*100).toFixed(1)}%</td><td class="num">${(r.place*100).toFixed(1)}%</td><td class="num">${r.caps}</td><td>${esc(r.top)}</td></tr>`).join('') + `</tbody>`;
const A = D.ari;
$('#aritable').innerHTML = `<thead><tr><th>Seed</th><th class="num">ARI</th><th class="num">Candidate groups</th><th class="num">Median share: commonest situation</th><th class="num">Median share: no situation</th></tr></thead><tbody>` +
A.map(r=>`<tr><td>${r.seed}${r.seed===24?' (review)':''}</td><td class="num">${r.ari.toFixed(3)}</td><td class="num">${r.groups}</td><td class="num">${r.purity}%</td><td class="num">${r.none}%</td></tr>`).join('') + `</tbody>`;
$('#spreadtable').innerHTML = `<thead><tr><th>Situation</th><th class="num">Scenes</th><th class="num">14B groups it spans</th><th class="num">Largest share in one group</th></tr></thead><tbody>` +
D.spread.map(r=>`<tr><td><code>${esc(r[0])}</code></td><td class="num">${r[1]}</td><td class="num">${r[2]}</td><td class="num">${r[3]}%</td></tr>`).join('') + `</tbody>`;
$('#caveat').innerHTML = D.caveat;
// scenes
const SC = D.scenes, SITS = [...new Set(SC.map(s=>s.sit).filter(Boolean))].sort();
$('#f-sit').innerHTML = `<option value="">All</option><option value="-">No situation</option>` + SITS.map(s=>`<option>${esc(s)}</option>`).join('');
const titles = []; SC.forEach(s => { if (!titles.includes(s.title)) titles.push(s.title); });
$('#f-story').innerHTML = `<option value="">All ${titles.length} stories</option>` + titles.map(t=>`<option value="${esc(t)}">${esc(title(t))}</option>`).join('');
let shown = 40, rows = SC;
function words(s){ return s.split(/\s+/).filter(Boolean).length; }
function render(){
const list = rows.slice(0, shown);
$('#scenelist').innerHTML = list.map(s => `
<article class="scene">
<div class="head"><span class="n">scene ${s.chunk}</span><span class="t">${esc(title(s.title))}</span>${s.sit?`<span class="pill ok">${esc(s.sit)}</span>`:'<span class="pill">no situation</span>'}</div>
<div class="pair">
<div class="claude"><span class="who">Claude · predicament</span>${esc(s.cp)}</div>
<div><span class="who">qwen3:14b · predicament ${words(s.qp)>20?`<span class="over">${words(s.qp)} words</span>`:''}</span>${esc(s.qp)}</div>
<div class="claude"><span class="who">Claude · summary</span>${esc(s.cs)}</div>
<div><span class="who">qwen2.5:3b · summary</span>${esc(s.qs)}</div>
</div>
</article>`).join('');
$('#f-count').textContent = `${Math.min(shown, rows.length)} of ${rows.length} scenes`;
$('#more').hidden = shown >= rows.length;
}
function apply(){
const sit = $('#f-sit').value, st = $('#f-story').value, q = $('#f-q').value.trim().toLowerCase();
rows = SC.filter(s => (!sit || (sit==='-' ? !s.sit : s.sit===sit)) && (!st || s.title===st) &&
(!q || (s.cp+' '+s.cs+' '+s.qp+' '+s.qs).toLowerCase().includes(q)));
shown = 40; render();
}
['#f-sit','#f-story'].forEach(id => $(id).addEventListener('change', apply));
$('#f-q').addEventListener('input', apply);
$('#more').addEventListener('click', () => { shown += 40; render(); });
render();
$('#methodbody').innerHTML = D.method;
$('#foot').innerHTML = D.foot;
})();
</script>
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,482 @@
"""Claude's situations and options for the O. Henry corpus, as data. Run to validate and write situations-claude.json.
Written by hand in-session (claude-opus-5), 2026-09-17. Per DESIGN.md the numbers are left to the search: each
effect names a path, a direction and a rough size (small / medium / large), never a value.
"""
import json, re, sys, pathlib, collections
HERE = pathlib.Path(__file__).resolve().parent
sys.path.insert(0, str(HERE))
from assign import ASSIGN
PLAYER_ROLE = "a young clerk newly arrived in the big city, on eighteen dollars a week"
STAGES = {
"rooming_house": "No standing yet: a hall bedroom, a counter job, the park bench is never far off.",
"counter": "A steady place: a raise, a regular table, people who know your name.",
"swell": "Money and a place among the well-dressed; what the city charges for staying there.",
}
CAST = {
"sweetheart": "the one you court",
"partner": "the one you married, or live with",
"rival": "whoever wants what you want",
"employer": "the boss, the firm",
"patron": "someone powerful above you: the district leader, the rich benefactor",
"pal": "a friend from your own level",
"landlady": "the house you lodge in",
"officer": "the law, on the beat",
"stranger": "the plausible stranger: swell, sharper or tramp",
}
REL_STATS = {"trusts_you", "likes_you", "wary_of_you", "owes_you"}
SKILLS = {"skills.front": "bluff, manners, looking the part (the corpus's own word: 'front does it')",
"skills.nerve": "daring, the stomach to act"}
def e(path, d, size): return {"path": path, "dir": d, "size": size}
def note(text): return {"path": "notable", "push": text}
def flag(name): return {"path": "flags." + name, "set": True}
EVENTS = [
# ---------------------------------------------------------------------------------------------
dict(id="pose", situation="pose", title="Passing for more than you are",
sentence="A young person of small means wants to be taken for someone grander by a stranger they want to impress.",
roles=["you", "sweetheart"], stages=["rooming_house", "counter", "swell"],
descriptions=[
dict(text="Ten weeks of putting a dollar aside have bought one evening in good clothes. At the corner a young woman slips on the ice, and when you help her up she takes you, plainly, for what the clothes say you are.", sources=[603, 604, 605, 606]),
dict(text="The stranger across the table has just told you something about themselves that is a little too good to be true. You have one ready that is better.", sources=[46, 402, 404, 799]),
dict(text="The present you can afford and the present you want to be seen giving are two different things, and there is a shop two streets over that sells a very good copy of the second.", sources=[722, 723, 726]),
],
options=[
dict(label="Tell them what you really are.", result="The evening is smaller than you planned. It is also the only part of it you get to keep.",
effects=[e("relationships.sweetheart.trusts_you", "+", "medium"), e("skills.front", "-", "small"), note("Told the truth on the one evening it cost something.")], source=dict(kind="scene", chunks=[139, 140, 610])),
dict(label="Play the part the clothes promise.", result="Clubs, a yacht you have never seen, a friend with a famous name. It goes over well. Once, you catch a look of disappointment.",
effects=[e("skills.front", "+", "medium"), e("relationships.sweetheart.likes_you", "+", "small"), e("relationships.sweetheart.trusts_you", "-", "medium"), flag("passed_for_a_swell")], source=dict(kind="scene", chunks=[404, 608, 800])),
dict(label="Spend what the part would really cost.", result="It is real money, and for one evening it buys the real thing.",
effects=[e("money", "-", "large"), e("standing", "+", "small"), e("relationships.sweetheart.likes_you", "+", "medium")], source=dict(kind="scene", chunks=[135, 139, 723])),
dict(label="Say little and let them decide.", result="You neither claim nor deny. What they make of you is theirs to be wrong about.",
effects=[e("skills.front", "+", "small")], source=dict(kind="archetype", chunks=[])),
]),
# ---------------------------------------------------------------------------------------------
dict(id="benefactor_offered", situation="benefactor", title="Help with a sermon attached",
sentence="A well-off benefactor wants to do good to you on their own terms, and help comes with a price in pride.",
roles=["you", "patron"], stages=["rooming_house"],
descriptions=[
dict(text="There is a free bed tonight, fifteen cents' worth, if you stand in the line and hear the man on the box out. It is cold enough that the man on the box knows it.", sources=[234, 509]),
dict(text="You had the job, or nearly. Then a lady from an association explained why you must not take it, and drove away in her carriage.", sources=[832, 833, 834, 835]),
dict(text="A well-dressed stranger has asked you to dine. You know the price of dinner by now: your story, from the beginning, told the way he wants it.", sources=[649, 651, 440]),
],
options=[
dict(label="Take it, and pay in the coin they ask.", result="You tell them what they came to hear. The meal is excellent, and afterwards you feel you have sold something.",
effects=[e("money", "+", "small"), e("skills.front", "+", "small"), e("standing", "-", "small")], source=dict(kind="scene", chunks=[651, 652])),
dict(label="Refuse it.", result="Pride is warm for about an hour.",
effects=[e("money", "-", "small"), e("skills.nerve", "+", "small"), e("relationships.patron.wary_of_you", "+", "small")], source=dict(kind="scene", chunks=[441, 509])),
dict(label="Take the help, and tell them the plain truth instead.", result="It is not the story they wanted. It is the one they remember.",
effects=[e("relationships.patron.trusts_you", "+", "medium"), e("money", "+", "small"), note("Told a benefactor the truth over dinner.")], source=dict(kind="scene", chunks=[652, 653])),
dict(label="Find your own way round it.", result="It takes longer and costs more, and nobody lectures you.",
effects=[e("money", "-", "small"), e("skills.nerve", "+", "small"), e("standing", "+", "small")], source=dict(kind="gap", chunks=[])),
]),
dict(id="benefactor_playing", situation="benefactor", title="Playing the benefactor",
sentence="You, with money to spare, want to do good to someone below you, and want to see it done.",
roles=["you", "stranger", "patron"], stages=["swell"],
descriptions=[
dict(text="Money is coming in faster than you can find uses for it. Your last gift to an institution came back as three lines in the evening paper with your name misspelled. You want, this once, to see somebody's face.", sources=[361, 362, 363]),
dict(text="Down past the shopping district you own a row of houses you have never been inside. Somebody has finally told you what it is like to live in one.", sources=[704, 710, 711, 712]),
dict(text="A young man is throwing silver into the street for a crowd to scramble after, with a face like a funeral. You could ask him why.", sources=[340, 341, 342]),
],
options=[
dict(label="Write a cheque to an institution and be done.", result="It is received, acknowledged and misprinted.",
effects=[e("money", "-", "medium"), e("standing", "+", "small")], source=dict(kind="scene", chunks=[362])),
dict(label="Go down and hand it out yourself.", result="Somebody already owns the gratitude in that neighbourhood, and explains this to you between a barber's pole and the ash cans.",
effects=[e("money", "-", "small"), e("relationships.patron.wary_of_you", "+", "medium"), e("skills.nerve", "+", "small")], source=dict(kind="scene", chunks=[363, 364])),
dict(label="Fix the thing you own.", result="It costs a year of what the houses bring in. Nobody thanks you. The girls on the ground floor have a parlour.",
effects=[e("money", "-", "large"), e("standing", "+", "small"), flag("fixed_the_row"), note("Gave the tenants their parlours back.")], source=dict(kind="scene", chunks=[712])),
dict(label="Ask what they want before you give anything.", result="The answer is small, specific and cheap, and nothing like what you had in mind.",
effects=[e("money", "-", "small"), e("relationships.stranger.trusts_you", "+", "medium")], source=dict(kind="gap", chunks=[439, 442])),
]),
# ---------------------------------------------------------------------------------------------
dict(id="taken_for_granted", situation="taken_for_granted", title="The one you stopped noticing",
sentence="A partner at home wants to be noticed by the person who has stopped seeing them.",
roles=["you", "partner", "pal"], stages=["counter", "swell"],
descriptions=[
dict(text="You know how tonight will go: the supper, the paper, and at a quarter past eight you reach for your hat. Tonight there is a note pinned to the gas jet instead.", sources=[665, 666, 667]),
dict(text="Three years, and this morning the one you married asked you, quite calmly, to take them out to dinner.", sources=[24, 25]),
dict(text="Upstairs they fight on Saturdays and make it up with presents. Downstairs you read the paper in your stocking feet, and the one you married has begun to look at you as though that were worse.", sources=[759, 761, 762]),
],
options=[
dict(label="Go out as usual.", result="Nothing is said. Nothing needs to be; it has all been said before.",
effects=[e("relationships.partner.likes_you", "-", "medium"), e("relationships.pal.likes_you", "+", "small"), e("money", "-", "small")], source=dict(kind="scene", chunks=[666, 671])),
dict(label="Take them somewhere good.", result="You watch a room turn toward them, and you sit there with nothing to say, ashamed of three years.",
effects=[e("money", "-", "medium"), e("relationships.partner.likes_you", "+", "large"), e("standing", "+", "small")], source=dict(kind="scene", chunks=[26, 27, 28])),
dict(label="Promise to do better.", result="You mean it at eight. By a quarter past you are less sure.",
effects=[e("relationships.partner.trusts_you", "+", "small")], source=dict(kind="scene", chunks=[670, 671])),
dict(label="Do the job nobody asked you to.", result="It is not what was wanted, and it is noticed.",
effects=[e("relationships.partner.likes_you", "+", "small"), e("skills.nerve", "-", "small")], source=dict(kind="scene", chunks=[764])),
]),
# ---------------------------------------------------------------------------------------------
dict(id="station", situation="station", title="Across the gap in station",
sentence="Someone above or below you in station wants you, and each of you must decide how much to show of where you really stand.",
roles=["you", "sweetheart"], stages=["rooming_house", "counter", "swell"],
descriptions=[
dict(text="The one you want is far outside your circle and there is no proper way to be introduced. There is a counter, and a card, and a street corner at half past seven.", sources=[17, 18]),
dict(text="You met on an excursion boat. They take you for exactly what you appear to be, and you have not corrected them.", sources=[366, 368, 705, 706]),
dict(text="Your partner, born to everything, has found a letter from your people and announced that the two of you will go and visit them.", sources=[67, 68]),
],
options=[
dict(label="Show them where you live.", result="The shabby thing turns out to be the thing they wanted to see.",
effects=[e("relationships.sweetheart.trusts_you", "+", "medium"), e("skills.front", "-", "small")], source=dict(kind="scene", chunks=[70, 71, 73])),
dict(label="Keep to neutral ground.", result="Street corners and park benches. It works, and goes on working, until somebody asks why.",
effects=[e("relationships.sweetheart.likes_you", "+", "small"), flag("courting_on_street_corners")], source=dict(kind="scene", chunks=[18, 711])),
dict(label="Describe the life you are offering.", result="You paint it with care. They hear something else entirely.",
effects=[e("skills.front", "+", "small"), e("relationships.sweetheart.trusts_you", "-", "small")], source=dict(kind="scene", chunks=[20, 21, 22])),
dict(label="Tell them the gap plainly and let them choose.", result="They take longer to answer than you would like.",
effects=[e("relationships.sweetheart.trusts_you", "+", "small"), e("skills.nerve", "+", "small")], source=dict(kind="scene", chunks=[374])),
]),
# ---------------------------------------------------------------------------------------------
dict(id="newcomer", situation="newcomer", title="The city that does not notice you",
sentence="A newcomer wants a foothold in a place that neither sees them nor lets them stay as they were.",
roles=["you", "pal", "stranger"], stages=["rooming_house", "counter"],
descriptions=[
dict(text="All afternoon nobody has looked at you. Not one face in ten thousand. You would take a kick, by now, for the company.", sources=[715, 716, 101]),
dict(text="An old friend from home has done well here, and orders for both of you in a language you do not speak. He says the place is comfortable. He says it as though apologising.", sources=[273, 274, 275, 431]),
dict(text="What impressed them back home is in a trunk under the bed. Here it has not impressed anybody.", sources=[83, 157, 158]),
],
options=[
dict(label="Do as the place does.", result="It pays. Some weeks later you notice you order the small drink too.",
effects=[e("money", "+", "small"), e("standing", "+", "small"), e("skills.front", "+", "small"), e("skills.nerve", "-", "small")], source=dict(kind="scene", chunks=[432, 433])),
dict(label="Refuse to be made over.", result="You say so, loudly and often. At midnight you sit at the window a long time.",
effects=[e("skills.nerve", "+", "small"), e("standing", "-", "small"), note("Swore the city would never change you.")], source=dict(kind="scene", chunks=[434, 435])),
dict(label="Stop a stranger and ask.", result="It fails twice, and then it does not.",
effects=[e("relationships.stranger.likes_you", "+", "small"), e("skills.nerve", "+", "small")], source=dict(kind="scene", chunks=[718, 719])),
dict(label="Go home.", result="It is still there, and smaller than you remember.",
effects=[e("standing", "-", "medium"), e("money", "+", "small"), flag("went_home")], source=dict(kind="archetype", chunks=[89, 147, 164])),
]),
# ---------------------------------------------------------------------------------------------
dict(id="easy_money", situation="easy_money", title="The sure thing",
sentence="A plausible stranger wants your money, and offers a sure thing to get it.",
roles=["you", "stranger", "landlady", "pal"], stages=["rooming_house", "counter", "swell"],
descriptions=[
dict(text="A great man wants a painting he cannot find and would pay anything for it. Walking home after, you pass a pawnshop, and there it is in the window.", sources=[222, 223, 224]),
dict(text="The man who pulled you out of the traffic and dusted your hat has a friend in the government who can arrange everything. Keep the drafts in your inside pocket, he says, till tomorrow.", sources=[210, 211, 212]),
dict(text="Somebody you hardly know has a scheme that pays ten thousand and needs only a little nerve and a little of your money to start.", sources=[267, 268]),
],
options=[
dict(label="Put your money in.", result="It was a sure thing. It was sure for somebody.",
effects=[e("money", "-", "large"), e("skills.nerve", "+", "small"), note("Bought the sure thing.")], source=dict(kind="scene", chunks=[224, 225])),
dict(label="Say you will look again tomorrow, in daylight.", result="By morning the great man is abroad, and so is the chance.",
effects=[e("skills.front", "+", "small")], source=dict(kind="archetype", chunks=[])),
dict(label="Ask somebody with no stake in it.", result="The person you ask has watched a great many sure things walk out of the front door.",
effects=[e("relationships.landlady.trusts_you", "+", "small"), e("relationships.stranger.wary_of_you", "+", "medium")], source=dict(kind="scene", chunks=[215])),
dict(label="Run the game yourself.", result="It works, and pays, and afterwards there is a kind of face you cannot quite look at.",
effects=[e("money", "+", "medium"), e("skills.front", "+", "medium"), e("standing", "-", "small"), flag("ran_a_game")], source=dict(kind="scene", chunks=[681, 682, 686])),
]),
# ---------------------------------------------------------------------------------------------
dict(id="sacrifice", situation="sacrifice", title="What you would give up for them",
sentence="Someone you love needs something you can only get by giving up what you value most, and they must not know.",
roles=["you", "partner", "rival"], stages=["rooming_house", "counter"],
descriptions=[
dict(text="A dollar and eighty-seven cents, and tomorrow is the holiday. There is one thing in the flat worth anything, and it is yours to sell.", sources=[454, 455, 456]),
dict(text="The money for lessons has run out. One of you will have to take work well beneath what you came here for, and the other will have to not know about it.", sources=[488, 489, 492]),
dict(text="You have four dollars put by for the thing you have waited all year for. Your rival at work has been locked out of her room for exactly four dollars.", sources=[738]),
],
options=[
dict(label="Sell it, and say nothing.", result="They find out, of course. It is the only thing about the day either of you remembers.",
effects=[e("relationships.partner.likes_you", "+", "large"), e("skills.front", "-", "small"), note("Sold the thing that mattered, for a present.")], source=dict(kind="scene", chunks=[456, 460, 461])),
dict(label="Keep it.", result="The holiday comes. It is a perfectly good holiday.",
effects=[e("relationships.partner.likes_you", "-", "small")], source=dict(kind="archetype", chunks=[])),
dict(label="Take the humble work in secret.", result="Your hands give you away within a fortnight.",
effects=[e("money", "+", "medium"), e("standing", "-", "small"), e("relationships.partner.trusts_you", "+", "medium")], source=dict(kind="scene", chunks=[491, 492])),
dict(label="Give it to the one who needs it and ask for nothing.", result="She promises a dollar a week back. You go without the thing you waited for.",
effects=[e("money", "-", "small"), e("relationships.rival.owes_you", "+", "medium"), e("relationships.rival.likes_you", "+", "small")], source=dict(kind="scene", chunks=[738, 739])),
]),
# ---------------------------------------------------------------------------------------------
dict(id="rival", situation="rival", title="Someone else wants them too",
sentence="A rival wants the same person you do, and has something you have not.",
roles=["you", "rival", "sweetheart"], stages=["rooming_house", "counter", "swell"],
descriptions=[
dict(text="The other suitor has learning, a silk hat, and an invitation to take her up to the roof to see the view. You have a very small shop and a joke about its size.", sources=[333, 334, 335]),
dict(text="Your rival has come to you, of all people, for help: they mean to run away with the one you both want, tonight at nine.", sources=[532, 533, 534]),
dict(text="A rich newcomer has walked in, looked once at the one you have all admired for a year, and put down his fork.", sources=[519, 520, 521]),
],
options=[
dict(label="Let the rival show off.", result="The display does your work for you.",
effects=[e("relationships.sweetheart.likes_you", "+", "small"), e("relationships.rival.wary_of_you", "+", "small")], source=dict(kind="scene", chunks=[336, 337])),
dict(label="Help the rival, and quietly warn the family.", result="It is clever. Your rival is honest, which you had not allowed for.",
effects=[e("relationships.rival.wary_of_you", "+", "medium"), e("relationships.sweetheart.trusts_you", "-", "small"), e("skills.front", "+", "small")], source=dict(kind="scene", chunks=[535, 536])),
dict(label="Get the rival out of the way.", result="It takes a night and every dollar you have.",
effects=[e("money", "-", "medium"), e("relationships.rival.wary_of_you", "+", "medium"), flag("saw_off_a_rival")], source=dict(kind="scene", chunks=[522, 523])),
dict(label="Say what you want, plainly, before they do.", result="Nobody has said it to them that way before.",
effects=[e("relationships.sweetheart.likes_you", "+", "medium"), e("skills.nerve", "+", "medium")], source=dict(kind="gap", chunks=[122, 785])),
]),
# ---------------------------------------------------------------------------------------------
dict(id="price", situation="price", title="The offer that would feed you",
sentence="Someone with money wants something from you that you would rather not give, and you are hungry.",
roles=["you", "stranger", "employer"], stages=["rooming_house"],
descriptions=[
dict(text="You spent your supper money on a collar because a man known for spending has asked you to dinner. He is downstairs now.", sources=[570, 571, 573, 574]),
dict(text="Your employer has told the customer you would be glad to dine with him this evening. That is part of the work now.", sources=[691, 694]),
dict(text="Two days without dinner, and a prosperous lodger has stopped you in the hall to propose.", sources=[483]),
],
options=[
dict(label="Go.", result="The dinner is very good.",
effects=[e("money", "+", "small"), e("relationships.stranger.likes_you", "+", "small"), flag("went_to_dinner")], source=dict(kind="archetype", chunks=[])),
dict(label="Send word that you are ill.", result="Crackers and jam, and a good feeling that lasts until you have to do it again.",
effects=[e("money", "-", "small"), e("skills.nerve", "+", "small"), note("Sent word of being ill.")], source=dict(kind="scene", chunks=[574, 575, 576])),
dict(label="Go, and draw the line at the door.", result="They take it in a way you did not expect.",
effects=[e("money", "+", "small"), e("skills.front", "+", "small"), e("relationships.employer.wary_of_you", "+", "small")], source=dict(kind="scene", chunks=[693, 694, 695])),
dict(label="Ask for work instead of dinner.", result="Nobody has asked them that before, and they are not sure what to say.",
effects=[e("relationships.employer.trusts_you", "+", "small"), e("money", "+", "small")], source=dict(kind="gap", chunks=[])),
]),
# ---------------------------------------------------------------------------------------------
dict(id="despised", situation="despised", title="The one nobody thinks much of",
sentence="Someone everybody around you looks down on wants a chance, and may be the only one who can help.",
roles=["you", "stranger", "pal"], stages=["rooming_house", "counter", "swell"],
descriptions=[
dict(text="The man who caused the accident keeps coming back, grinning, to apologise. Everybody you work with throws him out. Your boy has started to like him.", sources=[745, 746, 747]),
dict(text="A tramp has turned up at the door with the very thing the household has been advertising a reward for, and he is plainly drunk.", sources=[350, 354]),
dict(text="Your new friend is, by his own account, a burglar. He is also the best company you have had in a year.", sources=[174, 176, 177]),
],
options=[
dict(label="Throw them out.", result="Your people approve. The door does not stay shut long.",
effects=[e("relationships.pal.likes_you", "+", "small"), e("relationships.stranger.wary_of_you", "+", "medium")], source=dict(kind="scene", chunks=[746])),
dict(label="Let them in and hear them out.", result="It turns out they can do the one thing nobody else in the room can.",
effects=[e("relationships.stranger.trusts_you", "+", "medium"), e("relationships.pal.wary_of_you", "+", "small"), flag("took_in_an_outsider")], source=dict(kind="scene", chunks=[747, 748, 749])),
dict(label="Pay them and be done.", result="Money settles it, as far as money goes.",
effects=[e("money", "-", "small"), e("relationships.stranger.likes_you", "+", "small")], source=dict(kind="scene", chunks=[355])),
dict(label="Bring them among your own people.", result="They outshine the whole table, and nobody believes a word of how you met.",
effects=[e("skills.nerve", "+", "small"), e("standing", "+", "small"), note("Brought a burglar to dinner.")], source=dict(kind="scene", chunks=[177])),
]),
# ---------------------------------------------------------------------------------------------
dict(id="loyalty", situation="loyalty", title="Turn in a friend",
sentence="Someone with power wants you to turn on a friend you owe, and will pay or punish accordingly.",
roles=["you", "pal", "officer", "patron"], stages=["counter", "swell"],
descriptions=[
dict(text="The man who lent you a thousand dollars when your furniture was on the sidewalk is sitting across from you, and you are fairly sure what he did last week.", sources=[148, 149, 150, 151]),
dict(text="A man from the organisation has five hundred dollars and a request: stand up in court and say what you know about the man who used to be over you.", sources=[778]),
dict(text="An old friend has come a thousand miles to keep an appointment, and his face matches a description on your desk.", sources=[598, 599, 601]),
],
options=[
dict(label="Do your duty.", result="It is the right thing, and you will be reminded of it at every reunion for the rest of your life.",
effects=[e("standing", "+", "medium"), e("relationships.pal.trusts_you", "-", "large"), flag("turned_in_a_friend")], source=dict(kind="archetype", chunks=[])),
dict(label="Refuse, and take what comes.", result="You are down and out, and nobody's traitor.",
effects=[e("money", "-", "small"), e("standing", "-", "medium"), e("relationships.pal.trusts_you", "+", "large"), e("relationships.patron.wary_of_you", "+", "medium")], source=dict(kind="scene", chunks=[151, 778])),
dict(label="Send someone else to do it.", result="You leave a note. You could not do it yourself.",
effects=[e("standing", "+", "small"), e("relationships.pal.trusts_you", "-", "small"), note("Could not make the arrest in person.")], source=dict(kind="scene", chunks=[602])),
dict(label="Let them convict themselves.", result="Vanity does the rest; you only had to hand them the telephone.",
effects=[e("skills.front", "+", "medium"), e("standing", "+", "small"), e("relationships.pal.wary_of_you", "+", "small")], source=dict(kind="scene", chunks=[153, 154, 156])),
]),
# ---------------------------------------------------------------------------------------------
dict(id="appearances", situation="appearances", title="What it looked like",
sentence="Someone whose opinion matters has judged you by what it looked like, and will not hear an explanation.",
roles=["you", "sweetheart", "officer"], stages=["rooming_house", "counter", "swell"],
descriptions=[
dict(text="You were turning them down, as it happens. What the one you love saw, walking in, was a kiss on the hand.", sources=[287, 288]),
dict(text="Something went missing from a house you worked in yesterday, and you have been seen in public with something very like it.", sources=[725]),
dict(text="You are exactly what you look like, and that is the difficulty: nobody here believes anybody is.", sources=[250, 251, 253, 254]),
],
options=[
dict(label="Explain.", result="They listen to the first sentence.",
effects=[e("relationships.sweetheart.trusts_you", "+", "small"), e("skills.nerve", "+", "small")], source=dict(kind="archetype", chunks=[])),
dict(label="Say nothing and let them think it.", result="Pride settles it. Pride has a long memory.",
effects=[e("relationships.sweetheart.trusts_you", "-", "large"), flag("left_it_unexplained")], source=dict(kind="scene", chunks=[288, 614])),
dict(label="Send the proof, and leave it with them.", result="A letter, from somebody with nothing to gain. It says everything you would have.",
effects=[e("relationships.sweetheart.trusts_you", "+", "medium"), e("skills.front", "+", "small")], source=dict(kind="scene", chunks=[615, 616])),
dict(label="Change how you look.", result="Now you look worth robbing.",
effects=[e("money", "-", "medium"), e("skills.front", "+", "medium"), e("relationships.stranger.likes_you", "+", "small")], source=dict(kind="scene", chunks=[254, 255])),
]),
# ---------------------------------------------------------------------------------------------
dict(id="sign", situation="sign", title="A sign",
sentence="Someone in a bad way wants a sign to tell them what to do, and one has turned up.",
roles=["you", "stranger", "pal"], stages=["rooming_house", "counter"],
descriptions=[
dict(text="The fortune-teller said a dark man, a fair woman, a voyage and a loss, then luck from a man with a crooked nose. It has been a very accurate afternoon.", sources=[444, 445, 446]),
dict(text="The man handing out cards gave you one with three words written on it in ink, and nobody else. He did it again when you went back round.", sources=[556, 557]),
dict(text="Four roses have appeared in the window across the garden, and you are sure they are meant for you.", sources=[107, 108]),
],
options=[
dict(label="Follow it.", result="It leads somewhere. Not where it said, but somewhere.",
effects=[e("skills.nerve", "+", "small"), e("relationships.stranger.likes_you", "+", "small"), flag("followed_a_sign")], source=dict(kind="scene", chunks=[447, 558])),
dict(label="Ignore it.", result="Nothing happens, which is what you expected, mostly.",
effects=[], source=dict(kind="archetype", chunks=[])),
dict(label="Ask around first.", result="It turns out to mean something perfectly ordinary, to somebody else.",
effects=[e("skills.front", "+", "small"), note("Found out what the roses meant.")], source=dict(kind="scene", chunks=[109, 562])),
dict(label="Make the sign yourself, for someone who needs one.", result="It holds through two nights of weather. It costs more than you told anyone.",
effects=[e("relationships.pal.likes_you", "+", "large"), e("money", "-", "small"), e("standing", "-", "small")], source=dict(kind="scene", chunks=[793, 796])),
]),
# ---------------------------------------------------------------------------------------------
dict(id="honest_work", situation="honest_work", title="They want the flattering version",
sentence="A client or editor wants your work made false in the way they like, and will not pay for the true version.",
roles=["you", "employer", "partner"], stages=["counter", "swell"],
descriptions=[
dict(text="The editor likes everything about your work except the part you believe is true.", sources=[388, 389, 390, 391]),
dict(text="Your portraits keep showing what the sitters would rather not have seen, and the sitters have stopped coming.", sources=[653, 654]),
dict(text="Your genuine article came back marked 'too artificial'. A friend who has never left the city wrote the same thing badly, and it sold.", sources=[249, 256]),
],
options=[
dict(label="Give them what they want.", result="The cheque comes round on Thursday, as usual.",
effects=[e("money", "+", "medium"), e("skills.front", "+", "small"), e("standing", "+", "small")], source=dict(kind="scene", chunks=[256])),
dict(label="Keep doing it your way.", result="The envelopes keep coming back. The work is good.",
effects=[e("money", "-", "medium"), e("skills.nerve", "+", "small")], source=dict(kind="scene", chunks=[387])),
dict(label="Try to prove you are right.", result="Life supplies the proof, and it is not the proof you wanted.",
effects=[e("skills.nerve", "+", "small"), e("relationships.partner.trusts_you", "-", "medium"), note("Proved the point, and lost by it.")], source=dict(kind="scene", chunks=[392, 393, 394, 395])),
dict(label="Quit the trade.", result="You would rather sell ploughs for your father.",
effects=[e("standing", "-", "medium"), e("money", "+", "small"), flag("quit_the_trade")], source=dict(kind="scene", chunks=[89])),
]),
# ---------------------------------------------------------------------------------------------
dict(id="unspoken", situation="unspoken", title="You cannot say it",
sentence="Someone you want is waiting for you to say it, and you cannot find the words or the moment.",
roles=["you", "sweetheart", "patron"], stages=["rooming_house", "counter", "swell"],
descriptions=[
dict(text="You can handle any customer in the place. When the owner's daughter comes down the stairs you tell her it looks like rain.", sources=[750, 751]),
dict(text="You will have eight minutes alone with them in a cab, between the train and the theatre, and then they sail for two years.", sources=[540]),
dict(text="The partnership is strictly business. That was your own condition. It was a very good condition, two years ago.", sources=[196, 197, 202]),
],
options=[
dict(label="Say it now.", result="It comes out wrong, and it comes out.",
effects=[e("skills.nerve", "+", "medium"), e("relationships.sweetheart.likes_you", "+", "small")], source=dict(kind="archetype", chunks=[])),
dict(label="Find the nerve in a glass.", result="Two spoonfuls of something golden, and you lift them clean off the floor.",
effects=[e("skills.nerve", "+", "small"), e("money", "-", "small"), e("relationships.sweetheart.likes_you", "+", "medium")], source=dict(kind="scene", chunks=[756])),
dict(label="Buy the moment.", result="Somebody arranges a very large traffic jam. It is expensive. It works.",
effects=[e("money", "-", "large"), e("relationships.sweetheart.likes_you", "+", "medium"), e("relationships.patron.owes_you", "-", "small")], source=dict(kind="scene", chunks=[542, 543, 544])),
dict(label="Wait for a better time.", result="There is always a better time.",
effects=[e("relationships.sweetheart.likes_you", "-", "small")], source=dict(kind="archetype", chunks=[])),
]),
# ---------------------------------------------------------------------------------------------
dict(id="strings", situation="strings", title="Money with conditions",
sentence="Family with money wants to decide how you live, and will pay you to let them.",
roles=["you", "patron", "sweetheart"], stages=["counter", "swell"],
descriptions=[
dict(text="Your people have money, and they have made it plain you can have it back the day you give up the person you mean to marry.", sources=[126, 129]),
dict(text="The inheritance is a thousand dollars and a single condition: a full account of exactly how you spend it.", sources=[58]),
dict(text="The family will take you back, every cent of it, if you marry the heiress they have chosen for you.", sources=[779]),
],
options=[
dict(label="Do as they ask.", result="The allowance arrives on the first of the month. So does the heiress.",
effects=[e("money", "+", "large"), e("relationships.sweetheart.trusts_you", "-", "large"), e("relationships.patron.likes_you", "+", "medium")], source=dict(kind="archetype", chunks=[])),
dict(label="Refuse, and live on what you earn.", result="Sausages for breakfast, credit at the corner restaurant, and the person you chose.",
effects=[e("money", "-", "medium"), e("relationships.sweetheart.likes_you", "+", "large"), flag("cut_off")], source=dict(kind="scene", chunks=[126, 780])),
dict(label="Take the money and give it away where it is owed.", result="The account you write is one line long. You tear it up before they can read it.",
effects=[e("money", "-", "small"), e("relationships.sweetheart.trusts_you", "+", "medium"), note("Gave the legacy to the ward.")], source=dict(kind="scene", chunks=[62, 63, 64])),
dict(label="Bring them to meet the person you chose.", result="It takes a year of not speaking and one evening in a restaurant.",
effects=[e("relationships.patron.trusts_you", "+", "medium"), e("skills.nerve", "+", "small")], source=dict(kind="scene", chunks=[132, 133])),
]),
# ---------------------------------------------------------------------------------------------
dict(id="overlooked", situation="overlooked", title="Beside the admired one",
sentence="The plain one working beside the admired one wants, once, to be noticed.",
roles=["you", "pal", "employer"], stages=["rooming_house", "counter"],
descriptions=[
dict(text="At the next table they court your partner six at a time. At yours they read you the bill of fare.", sources=[627, 628, 629]),
dict(text="For two years you have gone to the dance on your best friend's arm and her young man's charity.", sources=[493]),
],
options=[
dict(label="Make the most of the first sign of notice.", result="It was nothing, it turns out. For two days it was everything.",
effects=[e("standing", "+", "small"), e("money", "+", "small"), note("Was, for two days, somebody worth insulting.")], source=dict(kind="scene", chunks=[630, 631, 632])),
dict(label="Bring an escort of your own, whoever he is.", result="He is splendid and he is not who he says, and for one evening nobody cares.",
effects=[e("skills.front", "+", "small"), e("standing", "+", "small"), flag("brought_a_borrowed_escort")], source=dict(kind="scene", chunks=[494, 495, 496])),
dict(label="Stay content in the other's shadow.", result="You are glad for them. Mostly you are.",
effects=[e("relationships.pal.likes_you", "+", "medium")], source=dict(kind="scene", chunks=[629])),
dict(label="Save for one thing to wear.", result="Eight months of it. It had better be purple.",
effects=[e("money", "-", "medium"), e("standing", "+", "small")], source=dict(kind="scene", chunks=[735, 736])),
]),
dict(id="homecoming", situation="homecoming", title="Word from home",
sentence="The people you left want you back, and someone has brought word of them.",
roles=["you", "stranger", "partner"], stages=["counter", "swell"],
descriptions=[
dict(text="A stranger from your village has brought news of your mother, who keeps your chair where it was, and a rose from the front step.", sources=[144, 145, 146]),
],
options=[
dict(label="Laugh it off.", result="You laugh it off. You keep the rose.",
effects=[e("skills.front", "+", "small")], source=dict(kind="scene", chunks=[147])),
dict(label="Go back.", result="Your engagements are cancelled by the next morning.",
effects=[e("standing", "-", "large"), flag("went_home"), note("Went home.")], source=dict(kind="scene", chunks=[147])),
dict(label="Send money instead.", result="It is gratefully received. It is not what was asked for.",
effects=[e("money", "-", "medium")], source=dict(kind="gap", chunks=[])),
]),
dict(id="patron", situation="patron", title="A handshake from the top",
sentence="Someone powerful could be seen with you, and being seen with them will cost you.",
roles=["you", "patron", "partner"], stages=["rooming_house", "counter", "swell"],
descriptions=[
dict(text="The district's great man is celebrating across the room. You could walk over, put out your hand, and stand the whole party a round with a week's wages.", sources=[728, 729]),
dict(text="The most powerful man you know has promised to come to your wedding, and there is a reason he must not.", sources=[802, 803]),
],
options=[
dict(label="Walk over and stand the round.", result="He shakes your hand. At home there is shrieking about the wages, which you hardly hear.",
effects=[e("money", "-", "large"), e("relationships.patron.likes_you", "+", "small"), e("relationships.partner.likes_you", "-", "medium"), note("Shook the great man's hand.")], source=dict(kind="scene", chunks=[729, 730])),
dict(label="Offer him something he needs.", result="He takes your hand in front of the whole room, and the room remembers your name.",
effects=[e("standing", "+", "medium"), e("relationships.patron.owes_you", "+", "small")], source=dict(kind="scene", chunks=[732])),
dict(label="Nod from where you are.", result="He nods back. That is the whole of it.",
effects=[e("relationships.patron.likes_you", "+", "small")], source=dict(kind="archetype", chunks=[])),
]),
dict(id="habit", situation="habit", title="The old habit",
sentence="An old habit wants out at exactly the moment you need to be someone new.",
roles=["you", "sweetheart"], stages=["counter", "swell"],
descriptions=[
dict(text="A year of being polished, and the gentleman approaches your stall at the charity bazaar through a brass wicket exactly like the one at your old cash desk.", sources=[383]),
],
options=[
dict(label="Answer the way you always did.", result="Your check, please.",
effects=[e("standing", "-", "medium"), e("skills.front", "-", "small")], source=dict(kind="scene", chunks=[383])),
dict(label="Catch yourself.", result="Only you noticed the pause.",
effects=[e("skills.front", "+", "medium")], source=dict(kind="gap", chunks=[])),
dict(label="Own it, out loud.", result="Some of them are charmed. The ones that matter are not sure.",
effects=[e("skills.nerve", "+", "small"), e("relationships.sweetheart.likes_you", "+", "small"), e("standing", "-", "small")], source=dict(kind="gap", chunks=[])),
]),
]
# --- validate -----------------------------------------------------------------------------------
chunks = json.load(open(HERE.parent / 'chunks.json'))
stories = json.load(open(HERE.parent / 'stories.json'))
sit_members = collections.defaultdict(list)
for c, s in ASSIGN.items(): sit_members[s].append(c)
problems = []
for ev in EVENTS:
if not 3 <= len(ev['options']) <= 5: problems.append(f"{ev['id']}: {len(ev['options'])} options")
for d in ev['descriptions'] + ev['options']:
for fld in ('text', 'label', 'result'):
s = d.get(fld, '')
OK = {'I', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Saturdays', 'Sunday', 'Sundays'}
caps = [t for sent in re.split(r"[.!?:;]\s+", s) for t in re.findall(r"[A-Za-z']+", sent)[1:]
if t[0].isupper() and t not in OK]
if caps: problems.append(f"{ev['id']}: capitalised word(s) {caps} in {fld}")
for d in ev['descriptions']:
for c in d['sources']:
if c not in sit_members[ev['situation']] and c not in range(len(chunks)): problems.append(f"{ev['id']}: bad source {c}")
for o in ev['options']:
for ef in o['effects']:
p = ef['path']
ok = p in ('money', 'debt', 'standing', 'notable') or p in SKILLS or p.startswith('flags.') or \
(p.startswith('relationships.') and p.split('.')[1] in CAST and p.split('.')[2] in REL_STATS)
if not ok: problems.append(f"{ev['id']}: bad path {p}")
if 'dir' in ef and ef['dir'] not in '+-': problems.append(f"{ev['id']}: bad dir")
if 'size' in ef and ef['size'] not in ('small', 'medium', 'large'): problems.append(f"{ev['id']}: bad size")
sigs = [json.dumps(sorted(json.dumps(x, sort_keys=True) for x in o['effects'])) for o in ev['options']]
if len(set(sigs)) != len(sigs): problems.append(f"{ev['id']}: two options with identical effects")
if problems:
print('\n'.join(problems)); sys.exit(1)
def member_rows(s):
rows = []
for c in sorted(sit_members[s]):
rows.append({'chunk': c, 'story': chunks[c]['story'], 'title': chunks[c]['title'].title()})
return rows
out = {
'made_by': 'claude-opus-5, in-session by hand, 2026-09-17',
'player_role': PLAYER_ROLE, 'stages': STAGES, 'cast': CAST, 'skills': SKILLS,
'relationship_stats': sorted(REL_STATS),
'effects_note': 'Directions and rough sizes only; values are for the numeric search (DESIGN.md: the model never chooses a number).',
'situations': [],
}
for s in sorted(sit_members, key=lambda s: -len(sit_members[s])):
mem = member_rows(s)
st = collections.Counter(r['story'] for r in mem)
dom = max(st.values()) / len(mem)
out['situations'].append({
'id': s, 'scenes': len(mem), 'stories': len(st), 'dominant_story_share': round(dom, 2),
'passes_pipeline_candidate_rule': len(mem) >= 5 and len(st) >= 4 and dom <= 0.40,
'members': mem,
'events': [ev for ev in EVENTS if ev['situation'] == s],
})
missing = [s for s in sit_members if not any(ev['situation'] == s for ev in EVENTS)]
if missing: print('situations without an event:', missing); sys.exit(1)
(HERE / 'situations-claude.json').write_text(json.dumps(out, indent=1, ensure_ascii=False), encoding='utf-8')
print(f"ok: {len(out['situations'])} situations, {len(EVENTS)} events, "
f"{sum(len(ev['options']) for ev in EVENTS)} options, {sum(len(ev['descriptions']) for ev in EVENTS)} descriptions")
kinds = collections.Counter(o['source']['kind'] for ev in EVENTS for o in ev['options'])
print('option sources:', dict(kinds))
File diff suppressed because it is too large Load Diff
+1
View File
@@ -0,0 +1 @@
../corpus
@@ -0,0 +1,111 @@
18:34:43
== carry v1 summaries, summarise new scenes (qwen2.5:3b-instruct)
new scene 29 (DOUGHERTY'S EYE-OPENER): Patrick, the Honorable, attempts to seduce Mrs. Dougherty but is thwarted by Jimmy, who responds aggressively.
new scene 30 (LITTLE SPECK IN GARNERED FRUIT): The newlyweds, newly arrived in their lavish flat, debate their honeymoon plans while the groom prepares to leave for a boxing match.
new scene 31 (LITTLE SPECK IN GARNERED FRUIT): The Kid, seeking a peach for the bride's favor, confronts multiple fruit vendors and a reluctant Justus O'Callahan, each unwilling to part with the desired fruit before its season.
new scene 32 (LITTLE SPECK IN GARNERED FRUIT): The Kid, seeking peaches, confronts a fruiterer who refuses to sell them, leading to a series of encounters with a detective and a failed attempt to join a closed boxing club.
new scene 33 (LITTLE SPECK IN GARNERED FRUIT): The Kid seeks to expose gambling operations, challenging the captain to a risky raid on Rafferty's establishment.
new scene 34 (LITTLE SPECK IN GARNERED FRUIT): Denver Dick challenged the Kid personally, who outmaneuvered him in a game of wits and physical skill, then discovered a gambling setup gone awry.
new scene 35 (LITTLE SPECK IN GARNERED FRUIT): The Kid commands a nighttime raid on Denver Dick's restaurant, securing a peach for his bride, while the officers transport the prisoners.
new scene 36 (LITTLE SPECK IN GARNERED FRUIT): The bride desires her groom to perform a task, granting him power over her, while he fulfills her whims, including giving her a peach instead of an orange.
new scene 436 (WHAT YOU WANT): Old Tom Crowley, now a caliph with $42 million, seeks excitement beyond his wealth in a reimagined Baghdad-on-the-Subway.
new scene 764 (A HARLEM TRAGEDY): Mrs. Cassidy schemes to intervene in her neighbors' domestic conflict, while Mrs. Fink denies any physical assault by her husband.
839 summaries: 829 carried from ../summaries.json, 10 new, 12s
853 names in the corpus lexicon; 730 of 839 summaries changed
wrote summaries_clean.json
== embed summaries
done: 839 vectors, 40s this session
18:35:36
== predicaments (qwen3:14b), all scenes
839 scenes, resuming at 0, model qwen3:14b
10/839 30s
20/839 59s
30/839 85s
40/839 118s
50/839 152s
60/839 176s
70/839 205s
80/839 232s
90/839 257s
100/839 284s
110/839 310s
120/839 336s
130/839 362s
140/839 389s
150/839 415s
160/839 441s
170/839 467s
180/839 493s
190/839 521s
200/839 546s
210/839 570s
220/839 597s
230/839 623s
240/839 649s
250/839 675s
260/839 701s
270/839 727s
280/839 753s
290/839 780s
300/839 806s
310/839 834s
320/839 860s
330/839 886s
340/839 913s
350/839 941s
360/839 968s
370/839 995s
380/839 1020s
390/839 1048s
400/839 1075s
410/839 1102s
420/839 1127s
430/839 1153s
440/839 1180s
450/839 1207s
460/839 1233s
470/839 1259s
480/839 1285s
490/839 1311s
500/839 1337s
510/839 1362s
520/839 1387s
530/839 1414s
540/839 1440s
550/839 1467s
560/839 1492s
570/839 1518s
580/839 1545s
590/839 1570s
600/839 1596s
610/839 1622s
620/839 1648s
630/839 1674s
640/839 1701s
650/839 1727s
660/839 1751s
670/839 1776s
680/839 1800s
690/839 1826s
700/839 1852s
710/839 1878s
720/839 1905s
730/839 1931s
740/839 1958s
750/839 1984s
760/839 2010s
770/839 2037s
780/839 2063s
790/839 2087s
800/839 2113s
810/839 2140s
820/839 2167s
830/839 2191s
839/839 2215s
done: 839 predicaments, 2215s this session; 219 still mention a job, relationship or place word
853 names in the corpus lexicon; 187 of 839 summaries changed
wrote predicaments_clean.json
== embed predicaments
done: 839 vectors, 39s this session
19:13:11
PIPELINE DONE

Some files were not shown because too many files have changed in this diff Show More