@supersuit/hyperspec 0.6.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/CHANGELOG.md +91 -0
  2. package/README.md +37 -0
  3. package/SPEC.md +2 -2
  4. package/WRITING.md +542 -10
  5. package/bin/hyperspec.mjs +183 -0
  6. package/examples/writing/essay/judge/doctor.packet.json +108 -0
  7. package/examples/writing/essay/judge/lineup.packet.json +64 -0
  8. package/examples/writing/essay/judge/persona.packet.json +73 -0
  9. package/examples/writing/essay/judge/reader.packet.json +93 -0
  10. package/examples/writing/essay/learn/first-draft.md +84 -0
  11. package/examples/writing/essay/learn/learn.packet.json +106 -0
  12. package/examples/writing/essay/sample-verdicts/doctor.verdict.json +43 -0
  13. package/examples/writing/essay/sample-verdicts/learn.verdict.json +30 -0
  14. package/examples/writing/essay/sample-verdicts/lineup.verdict.json +6 -0
  15. package/examples/writing/essay/sample-verdicts/persona.verdict.json +4 -0
  16. package/examples/writing/essay/sample-verdicts/reader.verdict.json +7 -0
  17. package/examples/writing/essay.hyperspec.md +6 -1
  18. package/examples/writing/story/judge/attribution.packet.json +194 -0
  19. package/examples/writing/story/judge/doctor.packet.json +108 -0
  20. package/examples/writing/story/judge/knowledge.packet.json +77 -0
  21. package/examples/writing/story/judge/persona.packet.json +73 -0
  22. package/examples/writing/story/judge/reader.packet.json +94 -0
  23. package/examples/writing/story/sample-verdicts/attribution.verdict.json +81 -0
  24. package/examples/writing/story/sample-verdicts/doctor.verdict.json +43 -0
  25. package/examples/writing/story/sample-verdicts/knowledge.verdict.json +4 -0
  26. package/examples/writing/story/sample-verdicts/persona.verdict.json +20 -0
  27. package/examples/writing/story/sample-verdicts/reader.verdict.json +16 -0
  28. package/examples/writing/story.hyperspec.md +7 -3
  29. package/package.json +1 -1
  30. package/src/check.mjs +75 -129
  31. package/src/draft.mjs +26 -0
  32. package/src/judge.mjs +386 -0
  33. package/src/judges/attribution.mjs +360 -0
  34. package/src/judges/doctor.mjs +126 -0
  35. package/src/judges/index.mjs +31 -0
  36. package/src/judges/knowledge.mjs +111 -0
  37. package/src/judges/lineup.mjs +272 -0
  38. package/src/judges/persona.mjs +137 -0
  39. package/src/judges/reader.mjs +111 -0
  40. package/src/learn.mjs +422 -0
  41. package/src/ledger.mjs +108 -0
  42. package/src/sentences.mjs +81 -0
  43. package/src/stations/claims.mjs +44 -39
  44. package/src/stations/quotes.mjs +6 -4
  45. package/src/writing.mjs +1 -1
@@ -0,0 +1,106 @@
1
+ {
2
+ "hyperspec_learn": "0.1",
3
+ "spec": "essay.hyperspec.md",
4
+ "spec_sha256": "e03dfac6b445ae779000f7fc109a9d713df2e5cf8967faf8e808fe87d63e40e9",
5
+ "first": "essay/learn/first-draft.md",
6
+ "first_sha256": "08f039cd278093c81338f8880c4533ada741ecc33b0c6610ffbd98b8d31c0c62",
7
+ "approved": "essay/draft.md",
8
+ "approved_sha256": "aa4a1d99604f7b2b398b67305b368abbb72651356c38bfffad1452db6be62f65",
9
+ "blocks": [
10
+ "materials",
11
+ "dna",
12
+ "persona",
13
+ "audience",
14
+ "goal",
15
+ "form",
16
+ "spine",
17
+ "sources",
18
+ "none"
19
+ ],
20
+ "instructions": "Each hunk is one edit a person made between the first draft a factory produced (first) and the draft they approved (approved): deleted (only in first), inserted (only in approved) or replaced (first became approved). For every hunk, name the one block of the spec (read it at the spec path) that, had it said more or said it better, would have had the factory write the approved text in the first place: materials (the source material the text drew on), dna (the writer's voice: goldens and style rules), persona (who is speaking: stance, what they may assert, what they will not say), audience (the reader: what they know, the terms they use), goal (the change the draft must produce and its conditions), form (length and shape), spine (the claims and their order), sources (the claims ledger), characters (fiction: a character's speech or knowledge), or none when no block of the spec could have prevented it. A hunk never crosses a paragraph or a heading; its sentences field counts the sentences it touched. Name only a block listed in blocks. Answer only in the verdict shape given in verdict_schema: one entry per hunk id, each exactly once, with a why saying what the block should have said, or why no block could have.",
21
+ "hunks": [
22
+ {
23
+ "id": "E1",
24
+ "kind": "deleted",
25
+ "first": "Most new managers make the same mistake.",
26
+ "approved": null,
27
+ "sentences": 1
28
+ },
29
+ {
30
+ "id": "E2",
31
+ "kind": "replaced",
32
+ "first": "The survey show the cost from their side.",
33
+ "approved": "The survey shows the cost from their side.",
34
+ "sentences": 1
35
+ },
36
+ {
37
+ "id": "E3",
38
+ "kind": "deleted",
39
+ "first": "My second manager used to walk our one-on-ones outside, and I liked it. A walk takes the table\nout of the room.",
40
+ "approved": null,
41
+ "sentences": 2
42
+ },
43
+ {
44
+ "id": "E4",
45
+ "kind": "replaced",
46
+ "first": "It can be helpful to consider asking the questions in the same words each time. This may help\nyour report become familiar with them, and over time they might start to prepare their answers.",
47
+ "approved": "Ask them in the same words every time. Your report will learn them, and after a few weeks they\nwill walk in with answers already half formed. That is the point of fixing the words: the meeting\nstarts on their topic before you have said anything at all.",
48
+ "sentences": 3
49
+ },
50
+ {
51
+ "id": "E5",
52
+ "kind": "replaced",
53
+ "first": "You might want to avoid trying to fix everything in the room.",
54
+ "approved": "Do not try to fix everything in the room.",
55
+ "sentences": 1
56
+ }
57
+ ],
58
+ "verdict_schema": {
59
+ "type": "object",
60
+ "required": [
61
+ "edits"
62
+ ],
63
+ "properties": {
64
+ "edits": {
65
+ "type": "array",
66
+ "description": "one entry per hunk id, each exactly once",
67
+ "items": {
68
+ "type": "object",
69
+ "required": [
70
+ "id",
71
+ "block",
72
+ "why"
73
+ ],
74
+ "properties": {
75
+ "id": {
76
+ "enum": [
77
+ "E1",
78
+ "E2",
79
+ "E3",
80
+ "E4",
81
+ "E5"
82
+ ]
83
+ },
84
+ "block": {
85
+ "enum": [
86
+ "materials",
87
+ "dna",
88
+ "persona",
89
+ "audience",
90
+ "goal",
91
+ "form",
92
+ "spine",
93
+ "sources",
94
+ "none"
95
+ ]
96
+ },
97
+ "why": {
98
+ "type": "string",
99
+ "description": "what the block should have said to prevent this edit, or why no block could have"
100
+ }
101
+ }
102
+ }
103
+ }
104
+ }
105
+ }
106
+ }
@@ -0,0 +1,43 @@
1
+ {
2
+ "sample": "A sample judgment for the worked example, filled in by hand to show what a verdict looks like and what judge record does with it. It is one reading of the packet, not a model run, and another judge may answer differently. hyperspec ignores this field.",
3
+ "conditions": [
4
+ {
5
+ "id": "r1",
6
+ "pass": true,
7
+ "evidence": "Your first one-on-one with a new report is the only meeting on your calendar where they should set the agenda.",
8
+ "note": "the first sentence says the report sets the agenda"
9
+ },
10
+ {
11
+ "id": "r2",
12
+ "pass": true,
13
+ "evidence": "What should I stop doing, or start doing, that would make your week easier?",
14
+ "note": "all three numbered questions read word for word as the voice memo has them"
15
+ },
16
+ {
17
+ "id": "r3",
18
+ "pass": true,
19
+ "evidence": "11 of 41 said at least one of their one-on-ones in the last quarter was mostly project status.",
20
+ "note": "each survey figure (29 of 41, 11 of 41, 9 responses) has a ledger line pointing at the survey summary, and matches it"
21
+ },
22
+ {
23
+ "id": "r4",
24
+ "pass": true,
25
+ "evidence": "Three is enough to hand the meeting over.",
26
+ "note": "the sections carry c1, c2, c3 and c4 in that order; the paragraphs on writing the answers down and keeping urgent items out serve c1, that the meeting stays the report's"
27
+ },
28
+ {
29
+ "id": "r5",
30
+ "pass": true,
31
+ "evidence": "Wait after each question, longer than you want to.",
32
+ "note": "it says to wait after each question, and why the second answer is the one worth having"
33
+ },
34
+ {
35
+ "id": "r6",
36
+ "pass": true,
37
+ "evidence": "Open the invite and delete your list from it.",
38
+ "note": "about 830 words, inside 700 to 1,100"
39
+ }
40
+ ],
41
+ "would_take_next_step": true,
42
+ "evidence": "So write the three questions on a card."
43
+ }
@@ -0,0 +1,30 @@
1
+ {
2
+ "sample": "A sample judgment for the worked example, filled in by hand to show what a learn verdict looks like and what learn record does with it. It is one reading of the packet, not a model run, and another judge may answer differently. hyperspec ignores this field.",
3
+ "edits": [
4
+ {
5
+ "id": "E1",
6
+ "block": "persona",
7
+ "why": "persona.will_not_say already rules out a claim about what most managers do, and the factory still wrote one, so the rule needs saying more plainly"
8
+ },
9
+ {
10
+ "id": "E2",
11
+ "block": "none",
12
+ "why": "a typo; no block of the spec governs spelling"
13
+ },
14
+ {
15
+ "id": "E3",
16
+ "block": "materials",
17
+ "why": "the paragraph retells the voice memo segment marked aside, which no spine claim cites; the marking held it back and the factory used it anyway"
18
+ },
19
+ {
20
+ "id": "E4",
21
+ "block": "dna",
22
+ "why": "no golden and no style rule shows advice given flat, so the factory hedged it (can be helpful, may, might); a golden that states a habit as an instruction, or a rule against hedged advice, would have prevented it"
23
+ },
24
+ {
25
+ "id": "E5",
26
+ "block": "dna",
27
+ "why": "the same hedge in one sentence: this writer gives instructions, and nothing in the scope says so"
28
+ }
29
+ ]
30
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "sample": "A sample judgment for the worked example, filled in by hand to show what a verdict looks like and what judge record does with it. It is one reading of the packet, not a model run, and another judge may answer differently. hyperspec ignores this field.",
3
+ "pick": "D",
4
+ "confidence": 0.6,
5
+ "reason": "D is the only passage that rests on a survey figure, and it opens by pointing at something outside itself (the survey); A, B and C each turn one claim into an instruction in the second person, with no numbers."
6
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "sample": "A sample judgment for the worked example, filled in by hand to show what a verdict looks like and what judge record does with it. It is one reading of the packet, not a model run, and another judge may answer differently. hyperspec ignores this field.",
3
+ "breaks": []
4
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "sample": "A sample judgment for the worked example, filled in by hand to show what a verdict looks like and what judge record does with it. It is one reading of the packet, not a model run, and another judge may answer differently. hyperspec ignores this field.",
3
+ "lost_at": [],
4
+ "stopped_at": null,
5
+ "would_take_next_step": true,
6
+ "next_step": "take my own list out of the invite, write the three questions on a card, and ask the first one in this week's meeting"
7
+ }
@@ -163,7 +163,7 @@ writing:
163
163
  goal:
164
164
  from: plans to run the first one-on-one from their own list
165
165
  to: hands the first one-on-one to the report and asks the three questions
166
- next_if_worked: copies the three questions into their calendar invite
166
+ next_if_worked: writes the three questions on a card before the meeting
167
167
  change:
168
168
  kind: action
169
169
  text: the reader asks the three questions in their next one-on-one and waits after each
@@ -233,6 +233,11 @@ npx @supersuit/hyperspec check essay.hyperspec.md --draft essay/draft.md
233
233
  The required parts are the draft's section headings, because the form station finds a required
234
234
  part by its heading.
235
235
 
236
+ The packets `hyperspec judge prepare` writes for this draft are in `essay/judge/`, and
237
+ `essay/sample-verdicts/` holds one sample verdict for each, filled in by hand to show the shape.
238
+ `essay/learn/` holds a first draft of this essay and the packet `hyperspec learn prepare` writes
239
+ comparing it with `essay/draft.md`, the draft a person approved.
240
+
236
241
  The writer's voice for this piece comes from a scope folder, `dna/essay-new-managers-teach/`:
237
242
  the goldens this writer approved for essays that teach new managers, and the features measured
238
243
  from them. Another essay by the same writer, for the same readers and the same purpose, would
@@ -0,0 +1,194 @@
1
+ {
2
+ "hyperspec_judge": "0.1",
3
+ "station": "attribution",
4
+ "spec": "story.hyperspec.md",
5
+ "spec_sha256": "8f417ebce7777cb4130afc8f0e2a1e4a483f1d4c7e7bcbadca202fda2208c6a9",
6
+ "draft": "story/draft.md",
7
+ "draft_sha256": "fdf8dd1ee311a376e45cca31b50f0b01f1157a889cb332620cbd178e9c510306",
8
+ "rubric": "blind attribution test, knowledge-leak check against the timeline, consistency against golden and rejected lines",
9
+ "instructions": "Each entry in inputs.lines is one line of dialogue from the draft, with its speaker and the narration around it removed. Using only how each character in inputs.characters speaks (their speech block, golden_lines and rejected_lines), name who says each line. Judge from the packet's inputs alone: do not open the spec, the draft or any other file the packet names. Answer in lines: one { id, speaker } per line id, each id exactly once, where speaker is a character id from inputs.characters. Answer only in the verdict shape given in verdict_schema.",
10
+ "inputs": {
11
+ "characters": [
12
+ {
13
+ "id": "ines",
14
+ "speech": {
15
+ "uses": [
16
+ "instructions in the imperative",
17
+ "numbers, weights and times",
18
+ "first names, for customers"
19
+ ],
20
+ "never": [
21
+ "an apology in words",
22
+ "a sentence about her own feelings",
23
+ "a question she does not need answered"
24
+ ],
25
+ "rhythm": "short, flat sentences, often without a subject; silence where another person would reassure"
26
+ },
27
+ "golden_lines": [
28
+ "Flour first. Then you can talk.",
29
+ "Left side runs hot. Turn them at eight minutes.",
30
+ "Sold means sold. Shape the rye."
31
+ ],
32
+ "rejected_lines": [
33
+ "I'm so sorry I didn't tell you sooner, Theo.",
34
+ "This place has been my whole life, you know?",
35
+ "Would you like to try the rye today?"
36
+ ]
37
+ },
38
+ {
39
+ "id": "theo",
40
+ "speech": {
41
+ "uses": [
42
+ "questions he already knows the answer to",
43
+ "hedges such as \"I mean\" and \"kind of\"",
44
+ "a joke when he is nervous"
45
+ ],
46
+ "never": [
47
+ "a flat instruction",
48
+ "a word of baking jargon he has not heard Ines use first"
49
+ ],
50
+ "rhythm": "long sentences that double back on themselves and end in a question"
51
+ },
52
+ "golden_lines": [
53
+ "Okay but like, if the oven's made that noise since March, is it a noise, or is that just how the oven talks now?",
54
+ "I can do the rye. I mean, I think I can do the rye. I did it Tuesday, kind of.",
55
+ "So is that a yes, or is that the face you make when it's a yes?"
56
+ ],
57
+ "rejected_lines": [
58
+ "Shape the rye.",
59
+ "I have been accepted to a culinary program and will be leaving in the autumn.",
60
+ "Left side runs hot, turn them early."
61
+ ]
62
+ }
63
+ ],
64
+ "lines": [
65
+ {
66
+ "id": "L1",
67
+ "text": "You're late,"
68
+ },
69
+ {
70
+ "id": "L2",
71
+ "text": "The bus,"
72
+ },
73
+ {
74
+ "id": "L3",
75
+ "text": "Water,"
76
+ },
77
+ {
78
+ "id": "L4",
79
+ "text": "Is the rye going in the big bowl?"
80
+ },
81
+ {
82
+ "id": "L5",
83
+ "text": "Big bowl,"
84
+ },
85
+ {
86
+ "id": "L6",
87
+ "text": "Scrape the bowl,"
88
+ },
89
+ {
90
+ "id": "L7",
91
+ "text": "It's sold,"
92
+ },
93
+ {
94
+ "id": "L8",
95
+ "text": "What's sold?"
96
+ },
97
+ {
98
+ "id": "L9",
99
+ "text": "Sold like, sold? Like someone else is going to be here? Like I come in on Monday and somebody else is at the mixer, is that what, is that the sold you mean?"
100
+ },
101
+ {
102
+ "id": "L10",
103
+ "text": "Not a bakery,"
104
+ },
105
+ {
106
+ "id": "L11",
107
+ "text": "Then what happens to the ovens?"
108
+ },
109
+ {
110
+ "id": "L12",
111
+ "text": "Is that why there's a ring round Friday?"
112
+ },
113
+ {
114
+ "id": "L13",
115
+ "text": "Rolls come out at sixteen,"
116
+ },
117
+ {
118
+ "id": "L14",
119
+ "text": "I got into a school,"
120
+ },
121
+ {
122
+ "id": "L15",
123
+ "text": "A baking school,"
124
+ },
125
+ {
126
+ "id": "L16",
127
+ "text": "Feed it at noon,"
128
+ },
129
+ {
130
+ "id": "L17",
131
+ "text": "Every day,"
132
+ },
133
+ {
134
+ "id": "L18",
135
+ "text": "Okay,"
136
+ },
137
+ {
138
+ "id": "L19",
139
+ "text": "Doors,"
140
+ }
141
+ ],
142
+ "excluded": 17
143
+ },
144
+ "verdict_schema": {
145
+ "type": "object",
146
+ "required": [
147
+ "lines"
148
+ ],
149
+ "properties": {
150
+ "lines": {
151
+ "type": "array",
152
+ "description": "one entry per line id, each exactly once",
153
+ "items": {
154
+ "type": "object",
155
+ "required": [
156
+ "id",
157
+ "speaker"
158
+ ],
159
+ "properties": {
160
+ "id": {
161
+ "enum": [
162
+ "L1",
163
+ "L2",
164
+ "L3",
165
+ "L4",
166
+ "L5",
167
+ "L6",
168
+ "L7",
169
+ "L8",
170
+ "L9",
171
+ "L10",
172
+ "L11",
173
+ "L12",
174
+ "L13",
175
+ "L14",
176
+ "L15",
177
+ "L16",
178
+ "L17",
179
+ "L18",
180
+ "L19"
181
+ ]
182
+ },
183
+ "speaker": {
184
+ "enum": [
185
+ "ines",
186
+ "theo"
187
+ ]
188
+ }
189
+ }
190
+ }
191
+ }
192
+ }
193
+ }
194
+ }
@@ -0,0 +1,108 @@
1
+ {
2
+ "hyperspec_judge": "0.1",
3
+ "station": "doctor",
4
+ "spec": "story.hyperspec.md",
5
+ "spec_sha256": "8f417ebce7777cb4130afc8f0e2a1e4a483f1d4c7e7bcbadca202fda2208c6a9",
6
+ "draft": "story/draft.md",
7
+ "draft_sha256": "fdf8dd1ee311a376e45cca31b50f0b01f1157a889cb332620cbd178e9c510306",
8
+ "rubric": "the doctor grades the draft against every condition; the simulated reader is asked what the starter jar meant and whether it would look for the author's next story",
9
+ "instructions": "Grade the draft (inputs.draft) against each condition in inputs.conditions: a condition passes unless the draft does what its fails_when describes. For every judgment, quote the draft as evidence: each evidence field is a span copied verbatim from inputs.draft. Then answer whether this reader, having read the draft, would take the next step (inputs.goal.next_if_worked) now, and quote the passage that decided it. Answer only in the verdict shape given in verdict_schema: one entry per condition id, each exactly once, with pass and would_take_next_step as true or false, and a note saying why for every condition that fails.",
10
+ "inputs": {
11
+ "goal": {
12
+ "from": "has never read the author",
13
+ "to": "finishes the story and remembers the starter jar",
14
+ "next_if_worked": "looks for the author's other stories",
15
+ "change": {
16
+ "kind": "feeling",
17
+ "text": "the reader feels the handover of the starter jar as the moment the two say what neither says aloud"
18
+ }
19
+ },
20
+ "conditions": [
21
+ {
22
+ "id": "r1",
23
+ "text": "the two voices cannot be confused",
24
+ "fails_when": "a judge shown ten lines of dialogue with the speaker hidden names the wrong speaker for more than one of them"
25
+ },
26
+ {
27
+ "id": "r2",
28
+ "text": "no one says what they could not know yet",
29
+ "fails_when": "Theo mentions the sale before scene-3, or Ines mentions the school before scene-4"
30
+ },
31
+ {
32
+ "id": "r3",
33
+ "text": "the bakery's process matches a real working morning",
34
+ "fails_when": "a proofing time, the tray turn, or the opening time differs from story/materials/bakery-visit.md"
35
+ },
36
+ {
37
+ "id": "r4",
38
+ "text": "the story is the four scenes of the scene list, in order",
39
+ "fails_when": "the draft has more or fewer than four scenes, or they run out of the scene list's order"
40
+ },
41
+ {
42
+ "id": "r5",
43
+ "text": "the last line is about bread",
44
+ "fails_when": "the final sentence names a feeling, or does not mention bread, dough, flour or the starter"
45
+ },
46
+ {
47
+ "id": "r6",
48
+ "text": "the story stays inside its length envelope",
49
+ "fails_when": "the word count is under 2,500 or over 4,000"
50
+ }
51
+ ],
52
+ "draft": "# The Rye\n\n## 3:40\n\nThe alarm at the bakery went at 3:20, but Ines was always there first, so in three years I never\nonce heard it. What I heard, coming in the back door at twenty to four with my hands in my\npockets, was the mixer. It had a knock in it, a slow one, like it was trying to remember\nsomething.\n\nShe was standing over the bowl with her sleeves pushed past the elbow and her glasses on top of\nher head, where they stayed until the till opened. She did not look round. She never did. The\nback door sticks in winter and you have to put your shoulder to it, so she always knew it was me\nbefore she could have seen me.\n\n\"You're late,\" she said.\n\nI wasn't. She knew I wasn't. The clock over the proving cabinet said 3:41, and it runs a minute\nfast, and she was the one who set it that way.\n\n\"The bus,\" I said anyway, because that is how we started.\n\n\"Flour first. Then you can talk.\"\n\nSo I did the flour. Flour is weighed at Ines's, never scooped. There is a scoop in the bin, a\nsteel one with a dent in the lip, and in three years I have only ever seen it used to push the\nflour level before the lid goes back on. I set the bowl on the scale and zeroed it and poured\nuntil the number stopped where she wanted it, and then I took out a handful and put back half\nof that, because the last few grams go in by hand, and she was watching the scale even though\nshe was not watching me.\n\nBehind us the deck oven was coming up to heat. The deck oven is three stone shelves stacked one\nover another inside a steel wall, each with its own door, and it takes the better part of an\nhour to get hot enough. Somewhere in that hour it starts to make the noise. It is not loud. It\nis a kind of tick, then a longer sound like somebody dragging a chair in the flat upstairs, then\nnothing for a while, then the tick again.\n\nIt made the noise while I was weighing the second batch. I looked at the oven and then at Ines,\nand she did not look at either of us.\n\n\"Okay but like,\" I said, \"if the oven's made that noise since March, is it a noise, or is that just\nhow the oven talks now?\"\n\n\"Water,\" she said.\n\nShe put the thermometer in the water herself, the way she did for every batch, and read it and\nsaid nothing, which meant it was right. The water temperature is checked every batch at Ines's,\neven when the water comes out of the same tap at the same time on the same morning as the day\nbefore. I have never asked her why. I check it too.\n\nWe worked. There is a radio on the shelf above the sink and nobody has turned it on since I have\nworked there. The mixer knocked. The oven ticked and dragged its chair. Outside it was still\ncompletely dark, and the street lamp at the corner made the frost on the window look like a\nthumbprint.\n\nThe letter from the school was in the inside pocket of my coat, which was on the hook by the back\ndoor. I had moved it there from my bag on the bus, and then back to my bag, and then back to the\ncoat, because the coat was closer. It was two pages. The first page said I had a place, and the\nsecond page said when term started, which was the autumn, in a city four hours away by train. I\nhad read both pages enough times that the fold had gone soft.\n\nI did not look at the coat. I looked at the dough.\n\nOn the calendar by the till, which I could see from the bench if I leaned, somebody had drawn a\nring round Friday in red pen. Ines does not use red pen. She uses a pencil she keeps behind her\near and sharpens with a knife. I leaned, and looked, and leaned back.\n\nThe starter was on the shelf above the mixer, where it always was. The starter is a wide glass\njar with a cloth over the top held on by a rubber band, and everything we make that is sour\ncomes out of it. It is the only thing in the bakery she has never let me touch. I have fed the\nmixer and cleaned the oven floor and scraped the bins and carried the flour sacks up from the\ncellar two at a time, and I have never once taken the cloth off that jar.\n\n\"Is the rye going in the big bowl?\" I asked, although it always went in the big bowl.\n\n\"Big bowl,\" she said.\n\n## 4:30\n\nInes does not talk while she shapes. Talking happens at the mixer and at the till, and the bench\nis for your hands. I learned that in my first week and I have never had to be told it twice. The\nsilence at the bench is the kind that makes you hear how loud your own questions are.\n\nSo at half past four we stood at the bench with the dough between us and did not talk.\n\nShe cut the white dough into pieces with the bench knife, and weighed each piece, and pushed each\none across to me, and I rounded them and set them seam up on the floured cloth in rows. Her\nknife was faster than my hands. It always was. She would cut the last piece and wipe the blade\nand wait, and I would still have six to go, and she would not help, and she would not watch me\neither. She would look at the window, where there was nothing yet to look at.\n\nWhen the white was done she went to the big bowl and turned the rye out onto the bench. Rye does\nnot behave like the white. It is heavy and it is wet and it sticks to everything, and it does not\nstretch so much as slump, and you have to shape it quickly with wet hands before it decides to\nbe the shape of the bench instead of the shape of the basket.\n\nShe cut it into four and weighed the four. Then she wiped the knife and put it down on my side of\nthe bench, and she went to the sink, and she wet her hands, and she dried them.\n\nI stood there. The rye sat there. The oven ticked.\n\n\"I can do the rye,\" I said, and then I remembered where we were and said the rest quietly. \"I\nmean, I think I can do the rye. I did it Tuesday, kind of.\"\n\nOn Tuesday I had held the basket while she shaped. That was what I meant by kind of.\n\nShe did not answer. That was allowed, at the bench. She took the cloth off the white rounds and\nchecked them with one finger, and put the cloth back, and then she went through to the front and\nstarted taking the chairs down off the tables, which was the job she always gave me.\n\nSo I did the rye.\n\nI wet my hands the way she did, up to the wrist. I took the first piece and folded it in on itself\nand turned it and folded it, and it stuck to my palm and I wet my hand again and it stuck again,\nand I could hear the chairs going down in the front, one leg and then the other three, and I did\nnot look up. The second piece was better. The third piece tore and I had to fold the torn side\nunder and hope. The fourth piece was the best one I have ever done, and there was nobody at the\nbench to see it, which I think was the point, or I think now was the point, and I did not think\neither of those things at the time. At the time I only thought about my hands.\n\nI put the four of them seam up in the baskets and dusted them and covered them. The baskets are\nold, and the rye has worn a pattern into the cane that is there even when they are empty.\n\nThe proof is the long wait after shaping, when the dough sits and rises before it goes in the\noven, and with rye you cannot hurry it. In winter the rye proofs about three hours at room\ntemperature. Ines will not put it in the proving cabinet. She says the cabinet is for the white.\nSo the four baskets went on the shelf by the window, and would sit there until well after the\ndoors opened, and nothing either of us did in the meantime would make them go any faster.\n\nShe came back from the front with flour on the knees of her trousers from the chairs. She looked\nat the four baskets on the shelf for about as long as it takes to read a price, and then she\nlooked at the bench, which I had scraped clean, and then she went to the mixer.\n\n\"Scrape the bowl,\" she said.\n\nI scraped the bowl.\n\n## 5:50\n\nBy ten to six the oven was full and the kitchen smelled the way it smells only for about an hour\na day, which is the hour I would pick if somebody made me pick one.\n\nThe back left of the deck oven runs hot, so every tray is turned halfway through the bake. Ines\nhas a timer on a string round her neck for it. She does not trust the ones on the oven. When it\ngoes she opens each door in turn and pulls each tray out with the peel, and spins it, and pushes\nit back, so that the side that was at the back is at the front, and nothing comes out darker on\none end than the other.\n\n\"Left side runs hot,\" she said, as the first tray went in, as if I had not been turning those\ntrays with her since I was sixteen. \"Turn them at eight minutes.\"\n\nI set my own timer, which I did not need to do, because hers would go at the same time.\n\nWe stood in front of the oven. There is nothing to do in that eight minutes except stand in front\nof the oven and not open it. The noise came and went. The street outside was starting to go from\nblack to the color of dishwater. A van went past without stopping.\n\nThe timer went. She opened the top door, and the heat came out, and she slid the peel under the\nfirst tray and drew it out onto the lip of the door and started to turn it.\n\n\"It's sold,\" she said.\n\nShe said it to the tray. She turned the tray, and pushed it back in, and pulled out the second.\n\nI did not say anything, because I did not know yet that she had said anything. It went past me\nthe way the van had gone past. Then it came back.\n\n\"What's sold?\" I said. I knew what was sold.\n\n\"The bakery. Friday.\" She turned the second tray and pushed it back and shut the top door and\nopened the middle one.\n\n\"Sold like,\" I said, \"sold? Like someone else is going to be here? Like I come in on Monday and\nsomebody else is at the mixer, is that what, is that the sold you mean?\"\n\n\"Not a bakery,\" she said. \"They want the room. Not the ovens.\"\n\nShe pulled out the third tray and turned it. She had not burnt herself on a tray in all the time\nI had known her, and she did not burn herself then. Her hands did exactly what they always did.\nI watched them because I did not know what else to watch.\n\n\"Then what happens to the ovens?\" I said. \"Then what happens to the mixer. Is somebody going to buy\nthe mixer? It knocks. Does the person who buys it know it knocks?\"\n\nShe shut the middle door and opened the bottom one.\n\n\"Is that why there's a ring round Friday?\" I said. \"Is that what the red pen is?\"\n\n\"Sold means sold,\" she said. \"Get the next tray.\"\n\nI got the next tray. It was the seeded rolls, which I had shaped at five, and I put them on the\npeel and she put them in, and I stood with the empty peel in my hands while she shut the door and\nthe heat stopped coming out.\n\nI wanted to ask how long she had known. I wanted to ask whether the new people had been in, and\nwhen, and whether they had stood in this kitchen while I was at home asleep, and whether they had\nlooked at the baskets on the shelf and thought they were just baskets. I did not ask any of it.\nI stood there with the peel and I thought about the letter in my coat, and I thought, she has\nknown this for days, maybe weeks, and every one of those mornings she came in before me and set\nthe clock a minute fast and told me I was late.\n\nThat was the only time all morning I nearly told her. The words got as far as the back of my\nteeth.\n\nThe timer on the string went. She turned the next tray.\n\n\"Rolls come out at sixteen,\" she said. \"Get the racks.\"\n\nI got the racks.\n\n## 6:55\n\nAt five to seven the front was ready. The chairs were down, the counter was wiped, the white was\nin the baskets behind the till and the rolls were on the racks, and the four rye loaves were still\non the shelf by the window under their cloths, still rising, a long way from done.\n\nThe doors open to customers at 7:00. The first person in is usually a regular. Through the glass\nI could see Walter already standing on the step with his collar up and his dog sitting on his\nfoot, which was what the dog did in winter. Ines keeps a biscuit in her apron for the dog and has\nnever once said so.\n\nShe was counting the float into the till. I stood behind the counter with my hands flat on it.\nThe letter was still in my coat. The coat was still on the hook by the back door, which was as\nfar from the counter as you can get in the bakery and still be inside it.\n\n\"I got into a school,\" I said.\n\nShe went on counting. She got to the end of the coins and closed the drawer.\n\n\"A baking school,\" I said. \"In the city. It's a proper one, it's the one with the, they do the whole\nyear on bread, and then pastry, and I applied in the spring and I didn't think, I mean I didn't\nthink I'd get in, and then I did. It starts in the autumn. I was going to tell you. I was going to\ntell you the day the letter came, and then I got here and you were at the mixer and it felt like,\nI don't know. It felt like the wrong time to say anything to anybody.\"\n\nShe looked at the four baskets on the shelf by the window.\n\nThen she walked past me into the back, and I heard her feet on the flour-dusty floor, and I heard\nher stop by the mixer, and I stood there with my hands on the counter and looked at Walter's dog.\n\nWhen she came back she had the starter.\n\nShe had the jar in both hands, the way you carry something you have filled too full. The cloth\nwas still on, and the rubber band, and the glass had a rim of dried flour at the top where it had\nrisen in the night and fallen back. She put it on the counter between us and took her hands away.\n\n\"Feed it at noon,\" she said. \"Equal weight flour and water. Weigh it.\"\n\nI looked at the jar. I did not pick it up. I have scraped the bins and carried the sacks and\ncleaned the oven floor, and I had never once taken the cloth off that jar, and now it was on the\ncounter in front of me with nobody's hands on it.\n\n\"Every day,\" she said. \"Not most days. Keep it out of the sun.\"\n\n\"Okay,\" I said. \"Okay. So is that a yes, or is that the face you make when it's a yes?\"\n\nShe took the glasses off the top of her head and put them on, which she only does for the till.\n\n\"Doors,\" she said.\n\nI picked up the jar. It was heavier than it looked, and it was warm on the side that had faced\nthe oven. I held it against my chest with one arm while she walked to the front and turned the\nsign and let Walter in, and Walter said good morning to her by name, and she said good morning to\nhim by his, and she bent down to the dog with her hand already in her apron.\n\nBehind me, on the shelf by the window, under their cloths, the four rye loaves I had shaped were\nstill rising, and the dough had lifted the cloth off the edge of the first basket by the width of\na finger.\n"
53
+ },
54
+ "verdict_schema": {
55
+ "type": "object",
56
+ "required": [
57
+ "conditions",
58
+ "would_take_next_step",
59
+ "evidence"
60
+ ],
61
+ "properties": {
62
+ "conditions": {
63
+ "type": "array",
64
+ "description": "one entry per condition id, each exactly once",
65
+ "items": {
66
+ "type": "object",
67
+ "required": [
68
+ "id",
69
+ "pass",
70
+ "evidence",
71
+ "note"
72
+ ],
73
+ "properties": {
74
+ "id": {
75
+ "enum": [
76
+ "r1",
77
+ "r2",
78
+ "r3",
79
+ "r4",
80
+ "r5",
81
+ "r6"
82
+ ]
83
+ },
84
+ "pass": {
85
+ "type": "boolean"
86
+ },
87
+ "evidence": {
88
+ "type": "string",
89
+ "description": "a span copied verbatim from the draft"
90
+ },
91
+ "note": {
92
+ "type": "string",
93
+ "description": "why; required when pass is false"
94
+ }
95
+ }
96
+ }
97
+ },
98
+ "would_take_next_step": {
99
+ "type": "boolean",
100
+ "description": "whether this reader would take inputs.goal.next_if_worked now"
101
+ },
102
+ "evidence": {
103
+ "type": "string",
104
+ "description": "a span copied verbatim from the draft that decided would_take_next_step"
105
+ }
106
+ }
107
+ }
108
+ }