@graffiticode/l0175 0.3.0 → 0.3.1

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 (48) hide show
  1. package/dist/compiler.d.ts.map +1 -1
  2. package/dist/compiler.js +44 -6
  3. package/dist/compiler.js.map +1 -1
  4. package/dist/embedding.d.ts.map +1 -1
  5. package/dist/embedding.js +73 -12
  6. package/dist/embedding.js.map +1 -1
  7. package/dist/lexicon.js +4 -4
  8. package/dist/lexicon.js.map +1 -1
  9. package/dist/static/examples.md +105 -0
  10. package/dist/static/instructions.md +238 -65
  11. package/dist/static/language-info.json +18 -3
  12. package/dist/static/lexicon.json +14 -0
  13. package/dist/static/scope.json +9 -8
  14. package/dist/static/spec.html +80 -15
  15. package/dist/static/stems.md +167 -5
  16. package/dist/static/targets.json +71 -1
  17. package/dist/static/usage-guide.md +29 -6
  18. package/dist/targets.d.ts +3 -1
  19. package/dist/targets.d.ts.map +1 -1
  20. package/dist/targets.js +87 -6
  21. package/dist/targets.js.map +1 -1
  22. package/package.json +2 -2
  23. package/spec/#template.gc# +20 -0
  24. package/spec/docs.md +49 -17
  25. package/spec/examples/c1-t1-tm1-multiplechoice.expect.json +1 -0
  26. package/spec/examples/c1-t1-tm1-multiplechoice.gc +27 -0
  27. package/spec/examples/c1-t1-tm2-multiselect.expect.json +1 -0
  28. package/spec/examples/c1-t1-tm2-multiselect.gc +27 -0
  29. package/spec/examples/c1-t1-tm3-hottext.expect.json +1 -0
  30. package/spec/examples/c1-t1-tm3-hottext.gc +27 -0
  31. package/spec/examples/c1-t2-tm1-multiplechoice.expect.json +1 -0
  32. package/spec/examples/c1-t2-tm1-multiplechoice.gc +29 -0
  33. package/spec/examples/c1-t2-tm2-multiselect.expect.json +1 -0
  34. package/spec/examples/c1-t2-tm2-multiselect.gc +28 -0
  35. package/spec/examples/c1-t2-tm3-ebsr.expect.json +1 -0
  36. package/spec/examples/c1-t2-tm3-ebsr.gc +29 -0
  37. package/spec/examples/c1-t2-tm4-hottext.expect.json +1 -0
  38. package/spec/examples/c1-t2-tm4-hottext.gc +19 -0
  39. package/spec/examples/c1-t2-tm5-shorttext.expect.json +1 -0
  40. package/spec/examples/c1-t2-tm5-shorttext.gc +20 -0
  41. package/spec/examples.md +100 -130
  42. package/spec/instructions.md +208 -62
  43. package/spec/language-info.json +17 -2
  44. package/spec/rag-examples-design.md +2 -2
  45. package/spec/scope.json +9 -8
  46. package/spec/spec.md +82 -15
  47. package/spec/stems.md +167 -5
  48. package/spec/usage-guide.md +29 -6
@@ -7,16 +7,22 @@ This is the core Graffiticode language — a functional language with prefix not
7
7
 
8
8
  ## Response Requirements
9
9
 
10
- - **IMPORTANT**: Whatever the user request is, the response should always be a complete Graffiticode program terminated with `..`.
11
- - Programs consist of zero or more `let` declarations followed by a single top-level expression, all terminated with `..`.
10
+ - **IMPORTANT**: Whatever the user request is, the response should always be a complete Graffiticode program ending with `..`.
11
+ - A program is zero or more `let` declarations followed by an **expression block**: one or more expressions evaluated in order. The value of the last expression is the program's result.
12
12
 
13
13
  ## Program Structure
14
14
 
15
15
  ```
16
16
  let name = value..
17
+ expression
17
18
  expression..
18
19
  ```
19
20
 
21
+ A program has exactly one `..` at the very end, plus one after each `let`
22
+ binding. **Everything after the program's final `..` is discarded — silently,
23
+ with no error.** Writing `..` after an expression that is not a `let` therefore
24
+ throws away the rest of the program.
25
+
20
26
  ### Minimal example
21
27
 
22
28
  ```
@@ -30,13 +36,34 @@ let double = <x: mul 2 x>..
30
36
  map (double) [1 2 3]..
31
37
  ```
32
38
 
39
+ ### An expression block
40
+
41
+ Expressions in a block are written one after another with **no separator
42
+ between them** — no `..`, no comma. An expression ends as soon as its arguments
43
+ are supplied, and the next expression simply follows:
44
+
45
+ ```
46
+ set-var "greeting" "hello"
47
+ print get-var "greeting"..
48
+ ```
49
+
50
+ That is two expressions: `set-var` takes 2 arguments and is complete after
51
+ `"hello"`, then `print …` follows as the next expression and its value is the
52
+ program's result. Writing `set-var "greeting" "hello"..` instead would end the
53
+ program at that point and discard the `print` line.
54
+
55
+ A complete expression is **not** a complete program. When a program needs
56
+ several steps — bind a variable, then build the result — write them as
57
+ consecutive expressions in one block and terminate only at the end.
58
+
33
59
  ## Syntax Rules
34
60
 
35
61
  - **Prefix notation**: Functions are applied by writing the function name followed by its arguments: `add 1 2`
36
62
  - **Fixed arity**: Every function has a known number of parameters, so applications parse unambiguously without grouping: `add 1 mul 2 3` parses as `add(1, mul(2, 3))`
37
63
  - **Parentheses defer application**: `map (double) [1 2 3]` passes `double` as a value rather than applying it
38
- - **Program terminator**: Every program ends with `..`
64
+ - **Program terminator**: A program ends with `..`, and `..` appears nowhere else except after `let` bindings. It terminates the whole program, not an expression — text following it is dropped without an error.
39
65
  - **Let terminator**: Every `let` binding ends with `..`
66
+ - **No expression separator**: Consecutive expressions in a block are juxtaposed. Argument boundaries come from arity alone, so `add 1 2 add 3 4` is two complete expressions, not one
40
67
  - **Comments**: Block comments are enclosed in `/* ... */`
41
68
 
42
69
  ## Data Types
@@ -189,10 +216,9 @@ map (double) map (inc) [1 2 3]..
189
216
 
190
217
 
191
218
  <!-- SPDX-License-Identifier: CC-BY-4.0 -->
192
- <!-- gc:model=opus -->
193
219
  # L0175 Dialect Extensions
194
220
 
195
- _Revised: 2026-06-19_
221
+ _Revised: 2026-08-28_
196
222
 
197
223
  L0175 composes 5th-grade ELA assessment items (Smarter Balanced · Grade 5 · Claim 1 ·
198
224
  Reasoning & Evidence) from an authored, inline superset of tagged content. One language serves
@@ -209,9 +235,28 @@ Always declare a top-level `target` (the SBAC learning target the program compos
209
235
  `topic` → `rl-2`** (the CCSS theme standard — **not** `rl-9`). `rl-1` (cite evidence) is always
210
236
  added. You normally **omit** `standard` and let the dimension pick its companion; the full
211
237
  Grade-5 **RL** strand (`rl-1`–`rl-7`, `rl-9`) is accepted if you author one explicitly.
238
+ **`theme` vs `topic`** (same `rl-2`, different dimensions): `topic` = what the text is *about*
239
+ (cued by "**mostly about**" / "what is the story about"); `theme` = the *lesson/message* (cued by
240
+ "the theme" / "the message" / "the lesson"). Tag a "mostly about" prompt `topic` and phrase its
241
+ correct answer as a subject statement, not a life lesson.
212
242
  - **`c1-t11`** — Target 11: Reasoning & Evidence over **informational** texts (RI standards).
213
243
  Dimensions: `relationships-interactions`, `author-use-of-information`, `point-of-view`,
214
244
  `purpose`, `authors-opinion`. Standards: `ri-1` (always) + `ri-3` / `ri-6` / `ri-7` / `ri-8` / `ri-9`.
245
+ **`purpose` vs `point-of-view`** (both read "author's …", different companions): `purpose` = *why
246
+ the author wrote it* (cued by "author's purpose") → `ri-8`; `point-of-view` = *the author's stance*
247
+ (cued by "author's point of view") → `ri-6`. Tag by the cue and prefer to **omit** `standard` so
248
+ the dimension infers the right companion.
249
+ - **`c1-t2`** — Target 2: **Central Ideas** over **literary** texts (RL standards). The **literary
250
+ twin of `c1-t9`** and, with it, the only target offering **all five** item types
251
+ (`multiple-choice`, `multi-select`, `ebsr`, `hot-text` single-part, `short-text`). Dimensions:
252
+ `theme`, `central-idea`, `key-detail`, `summary` — all four answer to `rl-2`, so `standards`
253
+ composes to `["rl-1", "rl-2"]`. **DOK 2** (3 for the written response). Same **significance**
254
+ distractor taxonomy as T9 (`too-narrow`, `too-broad`, `misreads-detail`, `insignificant`).
255
+ **Two T2-only rules:** (1) **theme leads** — for a story or poem prefer `theme` and phrase the
256
+ correct answer as a *lesson or message*, not a plot summary (`central-idea` is for a "main idea"
257
+ prompt); (2) **summary is scoped** — the guideline forbids asking students to summarize the
258
+ *entire* text, so every `summary` stem must point at a section or key event ("Summarize what
259
+ happens after…"). `key-detail` covers the guideline's "key events".
215
260
  - **`c1-t9`** — Target 9: **Central Ideas** over **informational** texts (RI standards). A
216
261
  DIFFERENT skill from Reasoning & Evidence — synthesize and condense: the main/central idea, the
217
262
  key details that build it, and summary (NOT inference + justification). Dimensions: `central-idea`,
@@ -221,6 +266,16 @@ Always declare a top-level `target` (the SBAC learning target the program compos
221
266
  the correct selection). Distractors use a **significance** taxonomy (`too-narrow`,
222
267
  `too-broad`, `misreads-detail`, `insignificant`) — usually true statements that just aren't the
223
268
  central idea.
269
+ - **`c1-t1`** — Target 1: **Key Details** over **literary** texts. The **literary twin of `c1-t8`**
270
+ and the same model: the inference/conclusion is **GIVEN in the stem**, and the student selects the
271
+ supporting **evidence**. Dimension: `supporting-evidence`. Standard: **`rl-1` and nothing else** —
272
+ the guideline names no companion, so a composed item's `standards` is exactly `["rl-1"]`; omit
273
+ `standard` on the outcome. **DOK 1–2**. Item types: `multiple-choice`, `multi-select`, `hot-text`
274
+ (single-part) — no EBSR, no short-text. **Author ONE supported `claim` = the given inference (its
275
+ `focus`), state it in the `stem`, and author `source`s as the options: `directly-supports` =
276
+ correct evidence (with a `quote`), `supports-wrong-claim`/`irrelevant` = distractor evidence. No
277
+ distractor claims.** Its stems offer `line` as a selectable unit and say `[author/narrator]`;
278
+ Multi-Select is exactly **two** correct.
224
279
  - **`c1-t8`** — Target 8: **Key Details** over **informational** texts (RI standards). A DIFFERENT
225
280
  model: the inference/conclusion is **GIVEN in the stem**, and the student selects the supporting
226
281
  **evidence** (the answer is evidence, not a chosen statement). Dimension: `supporting-evidence`.
@@ -240,22 +295,25 @@ Always declare a top-level `target` (the SBAC learning target the program compos
240
295
  (Multi-Select) `status correct` + `status distractor` meanings (each with a T10 `error-type`
241
296
  + `rationale`). The outcome's `focus` names the word; state the word + its context in the `stem`.**
242
297
 
243
- **Infer the target — the user need not state it.** Decide from the passage and the skill asked: a
244
- **literary** text (story/poem/narrative) `c1-t4`; an **informational** text an RI target. Among
245
- informational targets, choose by skill: **reasoning** — infer/conclude and justify with evidence
246
- (relationships between ideas, author's use of evidence, point of view/purpose/opinion) → `c1-t11`;
247
- **central ideas**the main idea, the key details that support it, or a summary `c1-t9`;
248
- **key details** — the request **states an inference/conclusion and asks which detail/sentence
249
- supports it** (the answer is evidence) `c1-t8`; **word meanings** — the request asks **what a
250
- word/phrase means in context** `c1-t10`. The skill also signals T4: character / theme /
251
- narrator's point of view. When the text type is genuinely ambiguous, prefer `c1-t4`; for an
252
- informational request, match the verbs: "infer/conclude/why" T11; "main idea/summarize/most
253
- about" → T9; "which detail/sentence supports [this stated idea]" → T8; "what does [word] mean" → T10.
254
- Write the choice as the first top-level form: `target c1-t11`. Use the dimensions, standards, and
255
- stem catalog (in `stems.md`) for that target; mixing targets' vocabularies is a compile error,
256
- and the passage `type` should match the target (literary for T4; informational for T11 and T9). If
257
- `target` is omitted entirely the compiler defaults to `c1-t4` and warns so always emit one
258
- explicitly rather than relying on the default.
298
+ **Infer the target — the user need not state it.** Pick on **two axes: the skill asked, and the
299
+ text type.** Most skills exist in both a literary and an informational target, so decide the skill
300
+ first, then the text type:
301
+
302
+ | Skillhow to recognize it | **Literary** (story / poem / narrative) | **Informational** (article / report) |
303
+ |---|---|---|
304
+ | **Reasoning & Evidence** infer/conclude AND justify ("infer/conclude/why") | `c1-t4` | `c1-t11` |
305
+ | **Central Ideas** theme, main idea, the key details that build it, or a summary ("theme/message/main idea/summarize") | `c1-t2` | `c1-t9` |
306
+ | **Key Details** the request **states an inference and asks which detail/sentence supports it** (the answer is evidence) | `c1-t1` | `c1-t8` |
307
+ | **Word Meanings** "what does [word] mean [in context]" | — | `c1-t10` |
308
+
309
+ The skill cues also point at a dimension: character / theme / narrator's point of view → the R&E
310
+ literary target. When the **text type** is genuinely ambiguous, prefer the literary target; when the
311
+ **skill** is ambiguous, match the verbs in the request. Write the choice as the first top-level
312
+ form: `target c1-t11`. Use the dimensions, standards, and stem catalog (in `stems.md`) for that
313
+ target; mixing targets' vocabularies is a compile error, and the passage `type` must match the
314
+ target (literary for T4/T2/T1; informational for T11/T9/T8/T10). If `target` is omitted entirely
315
+ the compiler defaults to `c1-t4` and warns — so always emit one explicitly rather than relying on
316
+ the default.
259
317
 
260
318
  ## Authoring contract
261
319
 
@@ -279,7 +337,7 @@ Quote free text (`text`, `rationale`, `subject`, passage heading) and id labels
279
337
 
280
338
  ## Forms and attributes
281
339
 
282
- - **target** `c1-t4` | `c1-t11` — top level; selects the learning-target profile (dimensions,
340
+ - **target** `c1-t4` | `c1-t11` | `c1-t2` | `c1-t9` | `c1-t1` | `c1-t8` | `c1-t10` — top level; selects the learning-target profile (dimensions,
283
341
  standards, stem catalog). Always author one; if omitted, the compiler defaults to `c1-t4`.
284
342
  - **grade** `<n>` — optional, top level (e.g. `grade 5`). The reading-level target the compiler
285
343
  checks the passage against. Defaults to the guideline/target's grade (5 for `c1-t4`/`c1-t11`);
@@ -349,13 +407,13 @@ each item, pick the one template that matches the item type and the task, and fi
349
407
  ⚠ **Task-model numbers are PER-TARGET and COLLIDE across targets.** The same number maps to a
350
408
  different item type depending on the `target`. Look at `tm3` alone:
351
409
 
352
- | Number | `c1-t4` / `c1-t11` | `c1-t9` | `c1-t8` / `c1-t10` |
353
- |--------|--------------------|---------|--------------------|
410
+ | Number | `c1-t4` / `c1-t11` | `c1-t2` / `c1-t9` | `c1-t1` / `c1-t8` / `c1-t10` |
411
+ |--------|--------------------|-------------------|------------------------------|
354
412
  | **tm3** | short-text | **ebsr (two-part)** | hot-text |
355
413
 
356
414
  So "task model 3" cannot be resolved without first knowing the target. **Do not assume the
357
- Reasoning & Evidence (T4/T11) numbering applies elsewhere** — under `c1-t9`, Task Model 3 is EBSR,
358
- Task Model 4 is Hot Text, Task Model 5 is Short Text.
415
+ Reasoning & Evidence (T4/T11) numbering applies elsewhere** — under the Central Ideas targets
416
+ (`c1-t2`, `c1-t9`), Task Model 3 is EBSR, Task Model 4 is Hot Text, Task Model 5 is Short Text.
359
417
 
360
418
  The full per-target task-model → item-type mapping (the compiler enforces exactly this):
361
419
 
@@ -364,7 +422,9 @@ The full per-target task-model → item-type mapping (the compiler enforces exac
364
422
  |--------|-----|-----|-----|-----|-----|
365
423
  | `c1-t4` — Grade 5 · Claim 1 · Target 4 (Reasoning & Evidence) | ebsr | hot-text | short-text | — | — |
366
424
  | `c1-t11` — Grade 5 · Claim 1 · Target 11 (Reasoning & Evidence) | ebsr | hot-text | short-text | — | — |
425
+ | `c1-t2` — Grade 5 · Claim 1 · Target 2 (Central Ideas) | multiple-choice | multi-select | ebsr | hot-text | short-text |
367
426
  | `c1-t9` — Grade 5 · Claim 1 · Target 9 (Central Ideas) | multiple-choice | multi-select | ebsr | hot-text | short-text |
427
+ | `c1-t1` — Grade 5 · Claim 1 · Target 1 (Key Details) | multiple-choice | multi-select | hot-text | — | — |
368
428
  | `c1-t8` — Grade 5 · Claim 1 · Target 8 (Key Details) | multiple-choice | multi-select | hot-text | — | — |
369
429
  | `c1-t10` — Grade 5 · Claim 1 · Target 10 (Word Meanings) | multiple-choice | multi-select | hot-text | — | — |
370
430
  <!-- GENERATED:task-models END -->
@@ -374,10 +434,14 @@ model 3"), **resolve it against the row for the program's `target`** in the tabl
374
434
  T4/T11 default. Before composing, echo the resolution, e.g. `target c1-t9, TM3 → ebsr`, and author
375
435
  that item type.
376
436
 
377
- **Belt-and-suspenders:** you may author the resolved number directly on the outcome as
378
- `task-model tm3`. The compiler resolves it against the target's table and **hard-errors on a
379
- mismatch** with `type` (or supplies `type` when you omit it) so `outcome … task-model tm3 type
380
- ebsr` on `c1-t9` is self-checking, and `task-model tm3 type short-text` is rejected.
437
+ **Author it whenever the request specifies a task model.** When the request names a task model —
438
+ by number ("TM3") or via an item type that implies one — author the resolved number directly on the
439
+ outcome as `task-model tm3` (alongside `type`). The compiler resolves it against the target's table
440
+ and **hard-errors on a mismatch** with `type` (or supplies `type` when you omit it) — so
441
+ `outcome … task-model tm3 type ebsr` on `c1-t9` is self-checking, and `task-model tm3 type
442
+ short-text` is rejected. It stays optional (the compiler emits a non-blocking warning when an
443
+ outcome omits it), but specifying it makes the task model explicit and verifiable — so include it
444
+ whenever it is known.
381
445
 
382
446
  The task-model mapping and Part-A choices below are the **Reasoning & Evidence (T4/T11)** catalog
383
447
  (EBSR → Task Model 1, Hot Text → Task Model 2, Short Text → Task Model 3; task = inference vs.
@@ -517,17 +581,17 @@ targets.
517
581
 
518
582
  ## Built-in enumerations
519
583
 
520
- - `target`: `c1-t4`, `c1-t11`, `c1-t9`, `c1-t8`, `c1-t10` (top level; always author one — defaults to `c1-t4` if omitted)
584
+ - `target`: `c1-t4`, `c1-t11`, `c1-t2`, `c1-t9`, `c1-t1`, `c1-t8`, `c1-t10` (top level; always author one — defaults to `c1-t4` if omitted)
521
585
  - `grade`: a number (top level, optional; defaults to the target's grade — 5 for all current targets)
522
586
  - item `type`: `ebsr`, `hot-text`, `short-text`, `multiple-choice`, `multi-select` · passage `type`: `literary`, `informational`
523
- (allowed per target — T4/T11: ebsr/hot-text/short-text · T9: multiple-choice/multi-select/ebsr/hot-text/short-text · T8: multiple-choice/multi-select/hot-text · T10: multiple-choice/multi-select/hot-text)
587
+ (allowed per target — T4/T11: ebsr/hot-text/short-text · T2/T9: all five · T1/T8/T10: multiple-choice/multi-select/hot-text)
524
588
  - `dimension` (**c1-t4**): `character`, `setting`, `event`, `point-of-view`, `theme`, `topic`, `narrators-feelings`, `character-relationship`
525
589
  - `dimension` (**c1-t11**): `relationships-interactions`, `author-use-of-information`, `point-of-view`, `purpose`, `authors-opinion`
526
- - `dimension` (**c1-t9**): `central-idea`, `key-detail`, `summary` · (**c1-t8**): `supporting-evidence` · (**c1-t10**): `word-meaning`
590
+ - `dimension` (**c1-t2**): `theme`, `central-idea`, `key-detail`, `summary` · (**c1-t9**): `central-idea`, `key-detail`, `summary` · (**c1-t1 / c1-t8**): `supporting-evidence` · (**c1-t10**): `word-meaning`
527
591
  - claim `status`: `supported`, `distractor` · source `status`: `directly-supports`, `supports-wrong-claim`, `irrelevant` · meaning `status` (c1-t10): `correct`, `distractor`
528
- - `error-type` (**c1-t4 / c1-t11**): `misreads-detail`, `erroneous-inference`, `faulty-reasoning` · (**c1-t9**): `too-narrow`, `too-broad`, `misreads-detail`, `insignificant` · (**c1-t8**): none — wrong answers are non-supporting `source`s · (**c1-t10**): `other-meaning`, `misinterprets`, `wrong-context`
529
- - `standard` — primary companions (normally inferred from the dimension; author one only to override): (**c1-t4**) `rl-1` + `rl-2` (theme/topic) / `rl-3` / `rl-6` · (**c1-t11**) `ri-1` + `ri-3` / `ri-6` / `ri-7` / `ri-8` · (**c1-t9**) `ri-1` + `ri-2` · (**c1-t8**) `ri-1` + `ri-7` · (**c1-t10**) `ri-4` + `l-4` / `l-4a` / `l-4b` / `l-4c` / `l-5c`. The **full CCSS Grade-5 strand for the target's text type is accepted**: any `rl-1`–`rl-7` / `rl-9` on a literary target (c1-t4), any `ri-1`–`ri-9` on an informational target (c1-t11/t9/t8/t10), plus the `l-4` / `l-5` families on c1-t10. (`rl-2` is the theme standard — valid; there is no `rl-8`.)
530
- - `dok`: `r-dok1`, `r-dok2`, `r-dok3` (R&E items are `r-dok3`; T9 selected-response is `r-dok2`, its written summary `r-dok3`; T8 & T10 are `r-dok2`)
592
+ - `error-type` (**c1-t4 / c1-t11**): `misreads-detail`, `erroneous-inference`, `faulty-reasoning` · (**c1-t2 / c1-t9**): `too-narrow`, `too-broad`, `misreads-detail`, `insignificant` · (**c1-t1 / c1-t8**): none — wrong answers are non-supporting `source`s · (**c1-t10**): `other-meaning`, `misinterprets`, `wrong-context`
593
+ - `standard` — primary companions (normally inferred from the dimension; author one only to override): (**c1-t4**) `rl-1` + `rl-2` (theme/topic) / `rl-3` / `rl-6` · (**c1-t11**) `ri-1` + `ri-3` / `ri-6` / `ri-7` / `ri-8` · (**c1-t2**) `rl-1` + `rl-2` (every dimension) · (**c1-t9**) `ri-1` + `ri-2` · (**c1-t1**) `rl-1` **alone** (no companion) · (**c1-t8**) `ri-1` + `ri-7` · (**c1-t10**) `ri-4` + `l-4` / `l-4a` / `l-4b` / `l-4c` / `l-5c`. The **full CCSS Grade-5 strand for the target's text type is accepted**: any `rl-1`–`rl-7` / `rl-9` on a literary target (c1-t4/c1-t2/c1-t1), any `ri-1`–`ri-9` on an informational target (c1-t11/t9/t8/t10), plus the `l-4` / `l-5` families on c1-t10. (`rl-2` is the theme standard — valid; there is no `rl-8`.)
594
+ - `dok`: `r-dok1`, `r-dok2`, `r-dok3` (R&E items are `r-dok3`; T2/T9 selected-response is `r-dok2`, the written response `r-dok3`; T1, T8 & T10 are `r-dok2`)
531
595
 
532
596
  ## What composition does
533
597
 
@@ -540,6 +604,10 @@ It never generates content or stems — author them.
540
604
 
541
605
  ## Example (Target 4, literary)
542
606
 
607
+ Balance the option lengths — a correct answer noticeably longer than the foils is findable without
608
+ reading (the compiler warns past 1.35×). For EBSR, author at least **5** non-supporting evidence
609
+ lines so Part B has real foils to choose from.
610
+
543
611
  ```
544
612
  target c1-t4
545
613
  passage "The Tide Pool"
@@ -547,37 +615,46 @@ type literary
547
615
  /* lines are PARAGRAPHS, auto-numbered 1..N; EBSR Part B sources `quote` the exact sentence */
548
616
  lines [
549
617
  "Mara crouched at the edge of the tide pool, ignoring the picnic behind her. Her brother called twice, but she did not turn around. A tiny crab scuttled under a rock, and Mara smiled for the first time all day."
550
- "She traced the cold water as if the pool were the only thing that mattered. Behind her, paper plates rustled and her mother laughed."
618
+ "She traced the cold water as if the pool were the only thing that mattered. Behind her, paper plates rustled and her mother laughed. Someone asked whether she wanted a sandwich, and she said nothing at all."
619
+ "Her brother stacked a small tower of stones near the blanket. The tide crept in and filled the pool to its rim. Only when her father folded the last chair did Mara stand up. She looked back at the water twice on the walk to the car."
551
620
  ]
552
621
  claims [
553
622
  claim id "c1" status supported dimension character subject "Mara"
554
- text "Mara is more interested in the tide pool than in her family's picnic."
555
- cites ["e1" "e3"] {}
623
+ text "Mara cares more about the tide pool than about the picnic."
624
+ cites ["e1" "e3" "e4"] {}
556
625
  /* at least 5 viable distractors targeting q1; the item draws 3 (one per error type) */
557
626
  claim id "c2" status distractor error-type misreads-detail plausibility 0.85 targets ["q1"]
558
- text "Mara is angry at her brother."
627
+ text "Mara is angry at her brother for calling her twice."
559
628
  rationale "Not turning around shows absorption, not anger." cites ["e2"] {}
560
629
  claim id "c3" status distractor error-type misreads-detail plausibility 0.6 targets ["q1"]
561
- text "Mara is bored and wants to leave."
630
+ text "Mara is bored by the pool and wants to go home."
562
631
  rationale "Her stillness is focus, not boredom (the crab makes her smile)." cites ["e2"] {}
563
632
  claim id "c4" status distractor error-type erroneous-inference plausibility 0.55 targets ["q1"]
564
- text "Mara dislikes being outdoors."
633
+ text "Mara would rather be indoors than out at the beach."
565
634
  rationale "Over-generalizes from her quiet to a dislike the text contradicts." cites ["e3"] {}
566
635
  claim id "c5" status distractor error-type erroneous-inference plausibility 0.5 targets ["q1"]
567
- text "Mara is waiting for her brother to join her."
636
+ text "Mara is waiting for her brother to come look with her."
568
637
  rationale "Invents a goal the passage never states." cites ["e2"] {}
569
638
  claim id "c6" status distractor error-type faulty-reasoning plausibility 0.45 targets ["q1"]
570
- text "Because Mara is quiet, she must be upset."
639
+ text "Mara is quiet, so something must have upset her."
571
640
  rationale "Treats quiet as upset without textual support." cites ["e2"] {}
572
641
  ]
573
642
  evidence [
574
643
  /* `line` = the paragraph; `quote` = the exact supporting sentence shown as the Part B option */
575
644
  source id "e1" line 1 quote "Mara crouched at the edge of the tide pool, ignoring the picnic behind her." status directly-supports supports ["c1"] {}
576
- source id "e2" line 1 quote "Her brother called twice, but she did not turn around." status supports-wrong-claim supports ["c1" "c2"] {}
577
645
  source id "e3" line 1 quote "A tiny crab scuttled under a rock, and Mara smiled for the first time all day." status directly-supports supports ["c1"] {}
646
+ source id "e4" line 2 quote "She traced the cold water as if the pool were the only thing that mattered." status directly-supports supports ["c1"] {}
647
+ source id "e8" line 3 quote "She looked back at the water twice on the walk to the car." status directly-supports supports ["c1"] {}
648
+ /* NO-GIVEAWAY: at least one supports-wrong-claim line lists BOTH the correct claim and a
649
+ distractor, so Part B does not telegraph Part A */
650
+ source id "e2" line 1 quote "Her brother called twice, but she did not turn around." status supports-wrong-claim supports ["c1" "c2"] {}
651
+ source id "e5" line 2 quote "Someone asked whether she wanted a sandwich, and she said nothing at all." status supports-wrong-claim supports ["c1" "c6"] {}
652
+ source id "e6" line 2 quote "Behind her, paper plates rustled and her mother laughed." status irrelevant supports [] {}
653
+ source id "e7" line 3 quote "Her brother stacked a small tower of stones near the blanket." status irrelevant supports [] {}
654
+ source id "e9" line 3 quote "The tide crept in and filled the pool to its rim." status irrelevant supports [] {}
578
655
  ]
579
656
  outcomes [
580
- outcome id "q1" type ebsr dimension character subject "Mara" standard rl-1 focus "c1"
657
+ outcome id "q1" type ebsr task-model tm1 dimension character subject "Mara" standard rl-1 focus "c1"
581
658
  stem "Which of these inferences about Mara is supported by the passage?"
582
659
  stem-b "Which sentence(s) from the passage best support your answer in Part A?" {}
583
660
  ]
@@ -588,12 +665,67 @@ outcomes [
588
665
  `type informational`, an RI dimension like `relationships-interactions`, `standard ri-1` + `ri-3`,
589
666
  and the T11 stems from `stems.md`.)
590
667
 
668
+ ## Example (Target 2 — Central Ideas, **literary**, theme)
669
+
670
+ Same shape as Target 9 over a story. The T2 differences: **`theme`** is the dimension of choice and
671
+ the correct answer reads as a *lesson*, not a plot event; every dimension answers to `rl-2`, so
672
+ `standards` composes to `["rl-1", "rl-2"]`. A `summary` item on T2 must be scoped to a section or
673
+ key event — never the whole text. Keep the four options about the same length.
674
+
675
+ ```
676
+ target c1-t2
677
+ passage "The Blue Ribbon"
678
+ type literary
679
+ lines [
680
+ "Every spring, Tessa entered her drawing in the county fair."
681
+ "This year she almost did not enter at all."
682
+ "Tessa drew the same barn eleven times before she kept one."
683
+ "At the fair, the blue ribbon went to somebody else."
684
+ "Then a teacher asked to hang Tessa's drawing in the hall."
685
+ ]
686
+ claims [
687
+ claim id "c1" status supported dimension theme subject "Tessa"
688
+ text "Keeping at something can matter more than winning."
689
+ cites ["e3" "e5"] {}
690
+ /* T2 distractors are the SIGNIFICANCE taxonomy — usually true, just not the theme.
691
+ Keep `insignificant` foils plausible: too trivial and no student would pick them. */
692
+ claim id "d1" status distractor error-type too-narrow targets ["q1"]
693
+ text "Tessa entered the county fair every single spring."
694
+ rationale "A true detail from the opening, not the story's theme." cites ["e1"] {}
695
+ claim id "d2" status distractor error-type too-broad targets ["q1"]
696
+ text "Hard work always makes a person famous someday."
697
+ rationale "Overgeneralizes far past what the story shows." cites ["e5"] {}
698
+ claim id "d3" status distractor error-type misreads-detail targets ["q1"]
699
+ text "Tessa gave up drawing after she lost again."
700
+ rationale "Misreads the ending; she keeps drawing and is lifted by it." cites ["e2"] {}
701
+ claim id "d4" status distractor error-type insignificant targets ["q1"]
702
+ text "Tessa's grandmother owned more than one pencil."
703
+ rationale "True but far too minor to be the theme." cites ["e1"] {}
704
+ claim id "d5" status distractor error-type too-narrow targets ["q1"]
705
+ text "Tessa drew a barn instead of drawing a house."
706
+ rationale "A single detail of the drawing, not what the story means." cites ["e3"] {}
707
+ ]
708
+ evidence [
709
+ source id "e3" line 3 status directly-supports supports ["c1"] quote "Tessa drew the same barn eleven times before she kept one." {}
710
+ source id "e5" line 5 status directly-supports supports ["c1"] quote "Then a teacher asked to hang Tessa's drawing in the hall." {}
711
+ source id "e1" line 1 status supports-wrong-claim supports ["c1" "d1"] quote "Every spring, Tessa entered her drawing in the county fair." {}
712
+ source id "e2" line 2 status supports-wrong-claim supports ["c1" "d3"] quote "This year she almost did not enter at all." {}
713
+ source id "e4" line 4 status irrelevant supports [] quote "At the fair, the blue ribbon went to somebody else." {}
714
+ ]
715
+ outcomes [
716
+ outcome id "q1" type multiple-choice task-model tm1 dimension theme subject "Tessa" focus "c1"
717
+ stem "Which sentence best tells the theme of the passage?" {}
718
+ ]
719
+ {}..
720
+ ```
721
+
591
722
  ## Example (Target 9 — Central Ideas, multiple-choice)
592
723
 
593
724
  The OPTIONS are still `claim`s, but the skill is the **main idea** (not infer-and-justify) and the
594
725
  distractors are the **significance** taxonomy — usually true statements that just aren't central.
595
726
  DOK is `r-dok2`; the standards are `ri-1` + `ri-2`. (No EBSR Part B here; on T9 EBSR/Hot-Text the
596
727
  correct claim's `directly-supports` sources are the supporting selection.)
728
+ Keep the four options about the same length — a longer correct answer is a giveaway.
597
729
 
598
730
  ```
599
731
  target c1-t9
@@ -604,14 +736,14 @@ lines [
604
736
  ]
605
737
  claims [
606
738
  claim id "c1" status supported dimension central-idea subject "the colony" standard ri-2
607
- text "Honeybees survive by living and working together, each bee with its own job."
739
+ text "Honeybees survive because each bee does a job for the colony."
608
740
  cites ["e1"] {}
609
741
  /* T9 distractors are usually TRUE statements that simply aren't the central idea */
610
742
  claim id "d1" status distractor error-type too-narrow targets ["q1"]
611
- text "The queen bee lays all the eggs."
743
+ text "The queen bee lays all of the eggs for the colony."
612
744
  rationale "A true supporting detail, not the central idea." cites ["e1"] {}
613
745
  claim id "d2" status distractor error-type too-broad targets ["q1"]
614
- text "Insects are the most important animals on Earth."
746
+ text "Insects are the most important animals on the planet."
615
747
  rationale "An overgeneralization beyond the passage." cites ["e1"] {}
616
748
  claim id "d3" status distractor error-type misreads-detail targets ["q1"]
617
749
  text "Each bee in the colony does every job by itself."
@@ -619,41 +751,82 @@ claims [
619
751
  ]
620
752
  evidence [ source id "e1" line 1 status directly-supports supports ["c1"] {} ]
621
753
  outcomes [
622
- outcome id "q1" type multiple-choice dimension central-idea subject "the colony" standard ri-2 focus "c1"
754
+ outcome id "q1" type multiple-choice task-model tm1 dimension central-idea subject "the colony" standard ri-2 focus "c1"
623
755
  stem "Which sentence best shows the main idea of the passage?" {}
624
756
  ]
625
757
  {}..
626
758
  ```
627
759
 
760
+ ## Example (Target 1 — Key Details, **literary**, evidence selection)
761
+
762
+ Same model as Target 8 over a story: the inference is **GIVEN in the stem** and the OPTIONS are
763
+ passage `source`s. The T1 difference is the standard — **`rl-1` alone**, so omit `standard` and let
764
+ the dimension resolve it. DOK `r-dok2`.
765
+
766
+ ```
767
+ target c1-t1
768
+ passage "The Loose Board"
769
+ type literary
770
+ lines [
771
+ "Nina had walked past Mr. Ruiz's crooked porch a hundred times. The third board rocked under her feet every time she crossed it. On Saturday she stopped, because someone had left a hammer on the step. She looked up and down the empty street. Then she knelt down and set the first nail without anyone asking her to. Her arm ached by the fourth nail, but she did not quit. Mr. Ruiz never learned who had fixed his porch."
772
+ ]
773
+ claims [
774
+ claim id "c1" status supported dimension supporting-evidence subject "Nina"
775
+ text "Nina takes care of a problem on her own, without being told to." cites ["e1" "e2"] {}
776
+ ]
777
+ evidence [
778
+ source id "e1" line 1 quote "Then she knelt down and set the first nail without anyone asking her to." status directly-supports supports ["c1"] {}
779
+ source id "e2" line 1 quote "Mr. Ruiz never learned who had fixed his porch." status directly-supports supports ["c1"] {}
780
+ source id "e3" line 1 quote "The third board rocked under her feet every time she crossed it." status irrelevant supports [] rationale "Describes the problem, not Nina's choice to act." {}
781
+ source id "e4" line 1 quote "On Saturday she stopped, because someone had left a hammer on the step." status irrelevant supports [] rationale "Invites the erroneous inference that she helped only because a tool was there." {}
782
+ source id "e5" line 1 quote "Nina had walked past Mr. Ruiz's crooked porch a hundred times." status irrelevant supports [] rationale "Tells how often she passed, not that she acted on her own." {}
783
+ source id "e6" line 1 quote "She looked up and down the empty street." status irrelevant supports [] rationale "Sets the scene; shows no action Nina took." {}
784
+ source id "e7" line 1 quote "Her arm ached by the fourth nail, but she did not quit." status irrelevant supports [] rationale "Shows persistence once she had started, not that she started unasked." {}
785
+ ]
786
+ outcomes [
787
+ outcome id "q1" type multiple-choice task-model tm1 dimension supporting-evidence subject "Nina" focus "c1"
788
+ stem "The reader can conclude that Nina takes care of a problem on her own, without being told to. Which line from the passage best supports this conclusion?" {}
789
+ ]
790
+ {}..
791
+ ```
792
+
628
793
  ## Example (Target 8 — Key Details, evidence selection)
629
794
 
630
795
  The inference is **GIVEN in the stem**; the OPTIONS are passage `source`s, not claims. Author ONE
631
796
  supported `claim` (the given inference, named by `focus`), state it in the `stem`, and author the
632
797
  `source`s as the choices: `directly-supports` = correct evidence (give each a `quote`),
633
- `irrelevant`/`supports-wrong-claim` = foils. **No distractor claims.** Standards `ri-1` + `ri-7`,
634
- DOK `r-dok2`.
798
+ `irrelevant`/`supports-wrong-claim` = foils (give each a `rationale`). **No distractor claims.**
799
+ Standards `ri-1` + `ri-7`, DOK `r-dok2`.
800
+
801
+ **Keep the conclusion a real inference, not a paraphrase of one sentence.** The stem states the
802
+ conclusion and the key is the evidence for it, so if the conclusion just restates the correct
803
+ source, the option that echoes the stem gives itself away (the compiler warns). Pitch the claim one
804
+ step above the text — here, *careful planning*, which no single sentence says outright — and author
805
+ at least **5** non-supporting sources so the best foils can be chosen.
635
806
 
636
807
  ```
637
808
  target c1-t8
638
809
  passage "Aqueducts"
639
810
  type informational
640
811
  lines [
641
- "Roman aqueducts carried water across long distances. They used gentle slopes so water flowed by gravity. Arches held the channels high above valleys. Cities far from rivers could finally get fresh water."
812
+ "Rome needed more fresh water than its wells could give. Workers built long channels called aqueducts to carry water to the city. They tilted each channel down just a little, so the water moved on its own. Where the land dropped away, they raised the channel on tall stone arches. Some aqueducts started at springs sixty miles from the city. Crews walked the channels often and cleaned out leaves and mud. People in Rome filled their jugs at open fountains."
642
813
  ]
643
814
  claims [
644
815
  claim id "c1" status supported dimension supporting-evidence subject "the aqueducts"
645
- text "Roman aqueducts let cities far from rivers get fresh water." cites ["e1" "e2"] {}
816
+ text "Roman engineers planned the aqueducts carefully." cites ["e1" "e2"] {}
646
817
  ]
647
818
  evidence [
648
- source id "e1" line 1 quote "Cities far from rivers could finally get fresh water." status directly-supports supports ["c1"] {}
649
- source id "e2" line 1 quote "Roman aqueducts carried water across long distances." status directly-supports supports ["c1"] {}
650
- source id "e3" line 1 quote "They used gentle slopes so water flowed by gravity." status irrelevant supports [] {}
651
- source id "e4" line 1 quote "Arches held the channels high above valleys." status irrelevant supports [] {}
652
- source id "e5" line 1 quote "Roman builders also paved long, straight roads." status irrelevant supports [] {}
819
+ source id "e1" line 1 quote "They tilted each channel down just a little, so the water moved on its own." status directly-supports supports ["c1"] {}
820
+ source id "e2" line 1 quote "Where the land dropped away, they raised the channel on tall stone arches." status directly-supports supports ["c1"] {}
821
+ source id "e3" line 1 quote "Rome needed more fresh water than its wells could give." status irrelevant supports [] rationale "Gives the reason for building, not evidence that the building was planned with care." {}
822
+ source id "e4" line 1 quote "Workers built long channels called aqueducts to carry water to the city." status irrelevant supports [] rationale "Says what was built; a student may read any construction detail as proof of planning." {}
823
+ source id "e5" line 1 quote "Some aqueducts started at springs sixty miles from the city." status irrelevant supports [] rationale "A fact about scale — impressive, but it shows distance rather than design choices." {}
824
+ source id "e6" line 1 quote "Crews walked the channels often and cleaned out leaves and mud." status irrelevant supports [] rationale "Describes upkeep after the aqueducts were finished, not the planning behind them." {}
825
+ source id "e7" line 1 quote "People in Rome filled their jugs at open fountains." status irrelevant supports [] rationale "Describes how people used the water; unrelated to how the system was designed." {}
653
826
  ]
654
827
  outcomes [
655
- outcome id "q1" type multiple-choice dimension supporting-evidence subject "the aqueducts" standard ri-7 focus "c1"
656
- stem "Roman aqueducts let far-off cities get fresh water. Which detail from the passage best supports this conclusion?" {}
828
+ outcome id "q1" type multiple-choice task-model tm1 dimension supporting-evidence subject "the aqueducts" standard ri-7 focus "c1"
829
+ stem "The reader can conclude that Roman engineers planned the aqueducts carefully. Which detail from the passage best supports this conclusion?" {}
657
830
  ]
658
831
  {}..
659
832
  ```
@@ -675,17 +848,17 @@ lines [
675
848
  words [
676
849
  word id "w1" text "aqueduct" line 1 quote "The aqueduct carried water across long distances."
677
850
  meanings [
678
- meaning id "m1" status correct text "a channel built to carry water" {}
851
+ meaning id "m1" status correct text "a channel that carries water" {}
679
852
  meaning id "m2" status distractor error-type other-meaning text "a boat that carries cargo"
680
853
  rationale "Another meaning that ignores the context." {}
681
- meaning id "m3" status distractor error-type misinterprets text "a tall stone tower"
854
+ meaning id "m3" status distractor error-type misinterprets text "a tall tower made of stone"
682
855
  rationale "Misreads the sentence." {}
683
- meaning id "m4" status distractor error-type wrong-context text "a kind of road"
856
+ meaning id "m4" status distractor error-type wrong-context text "a road that crosses a valley"
684
857
  rationale "Uses the wrong context." {}
685
858
  ] {}
686
859
  ]
687
860
  outcomes [
688
- outcome id "q1" type multiple-choice dimension word-meaning subject "aqueduct" standard l-4a focus "w1"
861
+ outcome id "q1" type multiple-choice task-model tm1 dimension word-meaning subject "aqueduct" standard l-4a focus "w1"
689
862
  stem "Read the sentence: \"The aqueduct carried water across long distances.\" What does the word aqueduct most likely mean?" {}
690
863
  ]
691
864
  {}..