@graffiticode/l0175 0.2.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 (96) hide show
  1. package/dist/compiler.d.ts.map +1 -1
  2. package/dist/compiler.js +94 -130
  3. package/dist/compiler.js.map +1 -1
  4. package/dist/embedding.d.ts +1 -0
  5. package/dist/embedding.d.ts.map +1 -1
  6. package/dist/embedding.js +105 -11
  7. package/dist/embedding.js.map +1 -1
  8. package/dist/index.d.ts +4 -0
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +2 -0
  11. package/dist/index.js.map +1 -1
  12. package/dist/lexicon.d.ts +7 -0
  13. package/dist/lexicon.d.ts.map +1 -1
  14. package/dist/lexicon.js +16 -8
  15. package/dist/lexicon.js.map +1 -1
  16. package/dist/static/examples.md +105 -0
  17. package/dist/static/instructions.md +397 -47
  18. package/dist/static/language-info.json +19 -4
  19. package/dist/static/lexicon.json +112 -0
  20. package/dist/static/scope.json +9 -8
  21. package/dist/static/spec.html +81 -15
  22. package/dist/static/stems.md +181 -5
  23. package/dist/static/targets.json +279 -0
  24. package/dist/static/template.gc +7 -67
  25. package/dist/static/unparse-hints.json +3 -0
  26. package/dist/static/usage-guide.md +48 -5
  27. package/dist/targets.d.ts +27 -0
  28. package/dist/targets.d.ts.map +1 -0
  29. package/dist/targets.js +250 -0
  30. package/dist/targets.js.map +1 -0
  31. package/dist/verify-example.d.ts +27 -0
  32. package/dist/verify-example.d.ts.map +1 -0
  33. package/dist/verify-example.js +82 -0
  34. package/dist/verify-example.js.map +1 -0
  35. package/package.json +2 -2
  36. package/spec/#template.gc# +20 -0
  37. package/spec/docs.md +51 -16
  38. package/spec/examples/c1-t1-tm1-multiplechoice.expect.json +1 -0
  39. package/spec/examples/c1-t1-tm1-multiplechoice.gc +27 -0
  40. package/spec/examples/c1-t1-tm2-multiselect.expect.json +1 -0
  41. package/spec/examples/c1-t1-tm2-multiselect.gc +27 -0
  42. package/spec/examples/c1-t1-tm3-hottext.expect.json +1 -0
  43. package/spec/examples/c1-t1-tm3-hottext.gc +27 -0
  44. package/spec/examples/c1-t10-tm1-multiplechoice.expect.json +1 -0
  45. package/spec/examples/c1-t10-tm1-multiplechoice.gc +15 -0
  46. package/spec/examples/c1-t10-tm2-multiselect.expect.json +1 -0
  47. package/spec/examples/c1-t10-tm2-multiselect.gc +15 -0
  48. package/spec/examples/c1-t10-tm3-hottext.expect.json +1 -0
  49. package/spec/examples/c1-t10-tm3-hottext.gc +13 -0
  50. package/spec/examples/c1-t11-tm1-ebsr.expect.json +4 -0
  51. package/spec/examples/c1-t11-tm1-ebsr.gc +30 -0
  52. package/spec/examples/c1-t11-tm2-hottext.expect.json +4 -0
  53. package/spec/examples/c1-t11-tm2-hottext.gc +30 -0
  54. package/spec/examples/c1-t11-tm3-shorttext.expect.json +4 -0
  55. package/spec/examples/c1-t11-tm3-shorttext.gc +30 -0
  56. package/spec/examples/c1-t2-tm1-multiplechoice.expect.json +1 -0
  57. package/spec/examples/c1-t2-tm1-multiplechoice.gc +29 -0
  58. package/spec/examples/c1-t2-tm2-multiselect.expect.json +1 -0
  59. package/spec/examples/c1-t2-tm2-multiselect.gc +28 -0
  60. package/spec/examples/c1-t2-tm3-ebsr.expect.json +1 -0
  61. package/spec/examples/c1-t2-tm3-ebsr.gc +29 -0
  62. package/spec/examples/c1-t2-tm4-hottext.expect.json +1 -0
  63. package/spec/examples/c1-t2-tm4-hottext.gc +19 -0
  64. package/spec/examples/c1-t2-tm5-shorttext.expect.json +1 -0
  65. package/spec/examples/c1-t2-tm5-shorttext.gc +20 -0
  66. package/spec/examples/c1-t4-tm1-ebsr.expect.json +4 -0
  67. package/spec/examples/c1-t4-tm1-ebsr.gc +30 -0
  68. package/spec/examples/c1-t4-tm2-hottext.expect.json +4 -0
  69. package/spec/examples/c1-t4-tm2-hottext.gc +30 -0
  70. package/spec/examples/c1-t4-tm3-shorttext.expect.json +4 -0
  71. package/spec/examples/c1-t4-tm3-shorttext.gc +30 -0
  72. package/spec/examples/c1-t8-tm1-multiplechoice.expect.json +1 -0
  73. package/spec/examples/c1-t8-tm1-multiplechoice.gc +25 -0
  74. package/spec/examples/c1-t8-tm2-multiselect.expect.json +1 -0
  75. package/spec/examples/c1-t8-tm2-multiselect.gc +25 -0
  76. package/spec/examples/c1-t8-tm3-hottext.expect.json +1 -0
  77. package/spec/examples/c1-t8-tm3-hottext.gc +25 -0
  78. package/spec/examples/c1-t9-tm1-multiplechoice.expect.json +1 -0
  79. package/spec/examples/c1-t9-tm1-multiplechoice.gc +23 -0
  80. package/spec/examples/c1-t9-tm2-multiselect.expect.json +1 -0
  81. package/spec/examples/c1-t9-tm2-multiselect.gc +24 -0
  82. package/spec/examples/c1-t9-tm3-ebsr.expect.json +10 -0
  83. package/spec/examples/c1-t9-tm3-ebsr.gc +30 -0
  84. package/spec/examples/c1-t9-tm4-hottext.expect.json +10 -0
  85. package/spec/examples/c1-t9-tm4-hottext.gc +20 -0
  86. package/spec/examples/c1-t9-tm5-shorttext.expect.json +10 -0
  87. package/spec/examples/c1-t9-tm5-shorttext.gc +20 -0
  88. package/spec/examples.md +100 -86
  89. package/spec/instructions.md +367 -44
  90. package/spec/language-info.json +18 -3
  91. package/spec/rag-examples-design.md +74 -0
  92. package/spec/scope.json +9 -8
  93. package/spec/spec.md +90 -15
  94. package/spec/stems.md +181 -5
  95. package/spec/template.gc +7 -67
  96. package/spec/usage-guide.md +48 -5
@@ -7,7 +7,16 @@ Agent-facing guide for authoring L0175 programs. Read this before composing a `c
7
7
 
8
8
  ## Overview
9
9
 
10
- L0175 is a content-composition language for 5th-grade English Language Arts assessment items (Smarter Balanced spec ELA · Grade 5 · Claim 1 · Reasoning & Evidence). One language serves **multiple learning targets**; **every program first declares a top-level `target`**: `c1-t4` (Target 4 — *literary* texts, RL standards, dimensions like character/theme/point-of-view) or `c1-t11` (Target 11 — *informational* texts, RI standards, dimensions like relationships-interactions/author-use-of-information/point-of-view/purpose). Choose the target from the request (literary vs. informational text and the skill assessed); the dimensions, standards, and stem catalog (`stems.md`) are then scoped to that target, and mixing targets' vocabularies is a compile error. It is **item-first**: after picking the target you compose the questions (`outcome`s) first — each with a unique `id`, a `focus` naming its correct claim, and an explicit `stem` (and `stem-b` on EBSR) instantiated from the guideline's Appropriate-Stem catalog (`stems.md`) — then author the supported `claim`s and a *superset* of distractor `claim`s, each tagging the question(s) it foils via `targets`, plus evidence `source`s. The compiler then *composes* each outcome deterministically: it takes the correct claim from `focus`, draws that question's foils ONLY from the distractors that `targets` it, uses the authored stem, and assembles a finished item in one of three task models: `ebsr` (two-part evidence-based selected response), `hot-text` (select-text), or `short-text` (constructed response). One passage + superset can yield several items, each with its own bound foil set. The compiler performs no generation and no stem synthesis — it selects, validates against the guideline, and warns when a question's pool falls short. Distractors are tagged by the SBAC error taxonomy (Part A: `misreads-detail`, `erroneous-inference`, `faulty-reasoning`; Part B: `supports-wrong-claim`, `irrelevant`), each carrying a rationale; composition picks foils for error-type coverage and couples Part B evidence to the claims it plausibly supports. **For each EBSR/Hot-Text question author at least 5 viable distractors that `targets` it (aim for 5–8, over-generating since some are filtered as near-duplicates or accidentally correct) — covering all three error types with ≥2 alternatives in at least two of them, and giving each a `plausibility` score (0–1). An item draws only 3 foils, so a richer targeted pool yields stronger items; fewer than 3 targeting a question is a hard error, fewer than 5 a warning. Likewise, for EBSR Part B author at least 5 non-supporting evidence lines (`supports-wrong-claim` + `irrelevant`) so the compiler can choose the most tempting 3 foil options. No-giveaway rule: at least one of those `supports-wrong-claim` lines must list BOTH the correct claim's id AND a distractor's id in its `supports` (a line that seems to support the right answer but actually backs a misreading) — otherwise the correct evidence line stands alone, Part B telegraphs Part A, and the compiler warns "possible A↔B giveaway." Do not make every wrong-claim line point only at distractors.**
10
+ L0175 is a content-composition language for 5th-grade English Language Arts assessment items (Smarter Balanced spec ELA · Grade 5 · Claim 1 · Reasoning & Evidence). One language serves **multiple learning targets**; **every program first declares a top-level `target`**: `c1-t4` (Target 4 — *literary* texts, RL standards, dimensions like character/theme/point-of-view) or `c1-t11` (Target 11 — *informational* texts, RI standards, dimensions like relationships-interactions/author-use-of-information/point-of-view/purpose). Choose the target from the request (literary vs. informational text and the skill assessed); the dimensions, standards, and stem catalog (`stems.md`) are then scoped to that target, and mixing targets' vocabularies is a compile error. It is **item-first**: after picking the target you compose the questions (`outcome`s) first — each with a unique `id`, a `focus` naming its correct claim, and an explicit `stem` (and `stem-b` on EBSR) instantiated from the guideline's Appropriate-Stem catalog (`stems.md`) — then author the supported `claim`s and a *superset* of distractor `claim`s, each tagging the question(s) it foils via `targets`, plus evidence `source`s. The compiler then *composes* each outcome deterministically: it takes the correct claim from `focus`, draws that question's foils ONLY from the distractors that `targets` it, uses the authored stem, and assembles a finished item in the task model named by its item type — for Reasoning & Evidence (T4/T11): `ebsr` (two-part evidence-based selected response), `hot-text` (select-text), or `short-text` (constructed response); other targets also offer `multiple-choice`/`multi-select` (the allowed set and the per-target task-model numbering are in *Vocabulary Cues*). One passage + superset can yield several items, each with its own bound foil set. The compiler performs no generation and no stem synthesis — it selects, validates against the guideline, and warns when a question's pool falls short. Distractors are tagged by the SBAC error taxonomy (Part A: `misreads-detail`, `erroneous-inference`, `faulty-reasoning`; Part B: `supports-wrong-claim`, `irrelevant`), each carrying a rationale; composition picks foils for error-type coverage and couples Part B evidence to the claims it plausibly supports. **For each EBSR/Hot-Text question author at least 5 viable distractors that `targets` it (aim for 5–8, over-generating since some are filtered as near-duplicates or accidentally correct) — covering all three error types with ≥2 alternatives in at least two of them, and giving each a `plausibility` score (0–1). An item draws only 3 foils, so a richer targeted pool yields stronger items; fewer than 3 targeting a question is a hard error, fewer than 5 a warning. Likewise, for EBSR Part B author at least 5 non-supporting evidence lines (`supports-wrong-claim` + `irrelevant`) so the compiler can choose the most tempting 3 foil options. No-giveaway rule: at least one of those `supports-wrong-claim` lines must list BOTH the correct claim's id AND a distractor's id in its `supports` (a line that seems to support the right answer but actually backs a misreading) — otherwise the correct evidence line stands alone, Part B telegraphs Part A, and the compiler warns "possible A↔B giveaway." Do not make every wrong-claim line point only at distractors.**
11
+
12
+ **Name the item type; task-model NUMBERS are per-target and collide.** Phrase a request by item
13
+ type (`ebsr` / `hot-text` / `short-text` / `multiple-choice` / `multi-select`) — that is unambiguous.
14
+ Task-model *numbers* (TM1…TM5) are numbered **per target**, so the same number means different things
15
+ in different targets: `tm3` is **short-text** in `c1-t4`/`c1-t11`, **`ebsr`** in `c1-t9`, and
16
+ **`hot-text`** in `c1-t1`/`c1-t8`/`c1-t10`. A bare "task model 3" is therefore meaningless without
17
+ its target — never assume the Reasoning & Evidence (T4/T11) numbering carries over to the others. When a
18
+ request names a task model by number, resolve it against the **program's target** (see the per-target
19
+ task-model table in *Vocabulary Cues*) and state the item type, e.g. for `c1-t9` "task model 3 → EBSR".
11
20
 
12
21
  **Targets are different skills — pick the one the request assesses.** Beyond the two Reasoning &
13
22
  Evidence targets above (`c1-t4` literary, `c1-t11` informational — infer/conclude and justify with
@@ -26,6 +35,16 @@ correct selection). Two new item types — `multiple-choice` (4 options, one cor
26
35
  `multi-select` (5–6 options, an exact correct set) — are single-part: author the `stem` and a
27
36
  `focus`, no Part B.
28
37
 
38
+ **`c1-t2` — Central Ideas over LITERARY texts** is T9's twin on a story, with the same five item
39
+ types, the same significance taxonomy, and standards `rl-1`+`rl-2`. Choose it over `c1-t9` by the
40
+ passage: story/poem → `c1-t2`, article → `c1-t9`. Two rules are T2's alone. **Theme leads**: its
41
+ dimensions are `theme`, `central-idea`, `key-detail`, `summary`, and for a story you normally want
42
+ `theme` with the correct answer phrased as a *lesson or message* ("Keeping at something can matter
43
+ more than winning"), not a plot event — reserve `central-idea` for a prompt that says "main idea".
44
+ **Summary is scoped**: the guideline forbids asking students to summarize the *entire* text, so a
45
+ T2 `summary` stem must name a section or key event ("Summarize what happens after…"). A plain
46
+ "summarize the passage" belongs to T9, not T2.
47
+
29
48
  L0175 also composes **`c1-t8` — Key Details** (informational): the inference/conclusion is **GIVEN
30
49
  in the stem** and the student selects the supporting **evidence** (the answer is *evidence*, not a
31
50
  chosen statement). Use `c1-t8` when the request **states an idea and asks which detail/sentence
@@ -35,6 +54,13 @@ supports it**; dimension `supporting-evidence`, standards `ri-1`+`ri-7`, DOK 1
35
54
  options: `directly-supports` = correct evidence (with a `quote`), `supports-wrong-claim`/`irrelevant`
36
55
  = distractor evidence. No distractor claims.
37
56
 
57
+ **`c1-t1` — Key Details over LITERARY texts** is the same model as `c1-t8` on a story rather than an
58
+ article: same dimension `supporting-evidence`, same item types, same DOK 1–2, same authoring recipe.
59
+ The one difference is the standard — the guideline names **`rl-1` and no companion**, so a composed
60
+ item's `standards` is exactly `["rl-1"]`; omit `standard` on the outcome. Choose between them by the
61
+ passage: story/poem/narrative → `c1-t1`, article/report → `c1-t8`. T1's stems offer `line` as a
62
+ selectable unit and say "[author/**narrator**]"; its Multi-Select is exactly two correct.
63
+
38
64
  L0175 also composes **`c1-t10` — Word Meanings** (informational): the question asks for the
39
65
  **meaning of a targeted word/phrase in context**, so the answer choices are **meanings**, authored
40
66
  as a dedicated `word`/`meaning` structure (not claims). Use `c1-t10` when the request asks **what a
@@ -71,7 +97,7 @@ Author the passage **and** every claim, option, and rationale to that grade (fig
71
97
 
72
98
  Say this to get that:
73
99
 
74
- - **Target** — `target c1-t4` (literary, Reasoning & Evidence), `target c1-t11` (informational, Reasoning & Evidence), `target c1-t9` (informational, Central Ideas), `target c1-t8` (informational, Key Details — given-inference → evidence), or `target c1-t10` (informational, Word Meanings — meaning of a targeted word); required, first top-level form. Selects the dimensions, standards, distractor taxonomy, DOK, item types, and stem catalog.
100
+ - **Target** — `target c1-t4` (literary, Reasoning & Evidence), `target c1-t11` (informational, Reasoning & Evidence), `target c1-t2` (**literary**, Central Ideas), `target c1-t9` (informational, Central Ideas), `target c1-t1` (**literary**, Key Details — given-inference → evidence), `target c1-t8` (informational, Key Details — same model), or `target c1-t10` (informational, Word Meanings — meaning of a targeted word); required, first top-level form. Selects the dimensions, standards, distractor taxonomy, DOK, item types, and stem catalog.
75
101
  - **Grade** — optional top-level `grade <n>` (e.g. `grade 5`). Defaults to the target/guideline's grade; author one only to override when the user asks for a different grade. Sets the reading-level target the compiler checks the passage against.
76
102
  - **Passage** — `passage "Title"` sets the heading; `type literary` (or `informational`, matching the target); `lines [ "..." "..." ]` are the passage **paragraphs** — one entry per paragraph, auto-numbered from 1. Always split by paragraph, including for Hot Text: the compiler segments each paragraph into sentences and exposes each sentence as a Part B selection, so the passage keeps its paragraph format. For EBSR Part B, evidence sources carry a `quote` with the exact supporting sentence so options stay sentence-tight while `line` points at the paragraph.
77
103
  - **Outcome** — the question, composed first. `outcome id "q1" type ebsr dimension character subject "Mara" focus "c1" stem "Which of these inferences about Mara is supported by the passage?" stem-b "Which sentence(s) from the passage best support your answer in Part A?" {}`. `id` is the handle distractors target; `focus` names the correct claim; `stem` (and `stem-b` on EBSR) come from `stems.md`. Vary `type` (`ebsr` / `hot-text` / `short-text`) for different task models. **Keep the Part A stem a neutral question** — fill the template's slot with the subject/skill only, and do **not** echo the correct option's wording (if the stem restates the answer, it gives it away). Paraphrase so stem and key share only the subject; the compiler warns when the stem reuses most of the correct option's words. Applies to every Hot Text and EBSR question, across all targets. **For Hot Text, Part A asks for the best STATEMENT** ("Click on the statement that best provides an inference about [X]…") whose options are inference claims — it is NOT a "click the sentences" instruction (that's Part B, fixed by the compiler). If a request says "select the sentences that show [X]", translate it: Part A is a statement prompt about [X], and the sentences that show [X] are `directly-supports` evidence (with exact `quote`s) that become Part B's answer. The compiler warns when a Hot Text Part A stem mentions sentences.
@@ -79,12 +105,26 @@ Say this to get that:
79
105
  - **Evidence source** — a passage line tagged by its support role. `source id "e1" line 1 status directly-supports supports ["c1"] {}`. Statuses: `directly-supports`, `supports-wrong-claim`, `irrelevant`. An optional `rationale` explains a foil. For **Hot Text**, give each `directly-supports` source a `quote` naming the exact supporting **sentence** so that sentence is marked correct in Part B; a `directly-supports` source with no `quote` marks every sentence of its `line` correct. Part B asks for an **exact number** of sentences (one less than the valid count, floored at 1, capped at 3) and **any selection of that many from the valid set is correct** (a superset) — so **author ≥3 directly-supporting sentences** so the asked count is ≥2 and students aren't forced to find every one.
80
106
  - **Dimensions (c1-t4)** — `character`, `setting`, `event`, `point-of-view`, `theme`, `topic`, `narrators-feelings`, `character-relationship`.
81
107
  - **Dimensions (c1-t11)** — `relationships-interactions`, `author-use-of-information`, `point-of-view`, `purpose`, `authors-opinion`.
108
+ - **Dimensions (c1-t2)** — `theme` (prefer it for a story: the lesson/message), `central-idea`, `key-detail` (covers key events), `summary` (scoped to a section or key event, never the whole text).
82
109
  - **Dimensions (c1-t9)** — `central-idea`, `key-detail`, `summary`.
83
- - **Dimensions (c1-t8)** — `supporting-evidence` (the answer is evidence; the inference is given in the stem).
110
+ - **Dimensions (c1-t1 / c1-t8)** — `supporting-evidence` (the answer is evidence; the inference is given in the stem). `c1-t1` is the literary target, `c1-t8` the informational one.
84
111
  - **Dimensions (c1-t10)** — `word-meaning` (the answer is a meaning; authored via `word`/`meaning`).
85
112
  - **Word / meaning (c1-t10)** — `words [ word id "w1" text "aqueduct" line 1 quote "…" meanings [ meaning id "m1" status correct text "a water channel" {} meaning id "m2" status distractor error-type other-meaning text "a boat" rationale "…" {} ] {} ]`; the outcome's `focus` names the word.
86
113
  - **Item types** — `ebsr` (two-part: statement → evidence), `hot-text` (R&E/Central-Ideas: click the supporting/main-idea sentences; Key Details: click the evidence sentences; Word Meanings: click the word matching a definition), `short-text` (constructed response), `multiple-choice` (one correct, single-part), `multi-select` (exact correct set, single-part). MC/Multi-Select have no Part B. The allowed set is per-target (the compiler rejects others).
87
- - **Central Ideas (c1-t9) distractor `error-type`** `too-narrow`, `too-broad`, `misreads-detail`, `insignificant` (true-but-not-central); R&E targets use `misreads-detail`/`erroneous-inference`/`faulty-reasoning`.
114
+ - **Task models are per-target — resolve a number against the target.** Task-model NUMBERS (TM1…TM5) are numbered per target and collide, so name the item type rather than a bare number; if a request says "task model N", map N to the item type for the program's target using the table below (e.g. `c1-t9` TM3 `ebsr`, TM4 `hot-text`). **Specify the task model on the outcome as `task-model tm3` whenever it is known** — the compiler resolves it against the target's table and **hard-errors if it disagrees with `type`** (or supplies `type` when omitted), so the intended task model is checked, not guessed. It stays optional, but the compiler emits a (non-blocking) warning when an outcome omits it, so include it whenever you know it.
115
+
116
+ <!-- GENERATED:task-models START (from targets.json — regenerated by tools/build-static.js; do not edit by hand) -->
117
+ | Target | tm1 | tm2 | tm3 | tm4 | tm5 |
118
+ |--------|-----|-----|-----|-----|-----|
119
+ | `c1-t4` — Grade 5 · Claim 1 · Target 4 (Reasoning & Evidence) | ebsr | hot-text | short-text | — | — |
120
+ | `c1-t11` — Grade 5 · Claim 1 · Target 11 (Reasoning & Evidence) | ebsr | hot-text | short-text | — | — |
121
+ | `c1-t2` — Grade 5 · Claim 1 · Target 2 (Central Ideas) | multiple-choice | multi-select | ebsr | hot-text | short-text |
122
+ | `c1-t9` — Grade 5 · Claim 1 · Target 9 (Central Ideas) | multiple-choice | multi-select | ebsr | hot-text | short-text |
123
+ | `c1-t1` — Grade 5 · Claim 1 · Target 1 (Key Details) | multiple-choice | multi-select | hot-text | — | — |
124
+ | `c1-t8` — Grade 5 · Claim 1 · Target 8 (Key Details) | multiple-choice | multi-select | hot-text | — | — |
125
+ | `c1-t10` — Grade 5 · Claim 1 · Target 10 (Word Meanings) | multiple-choice | multi-select | hot-text | — | — |
126
+ <!-- GENERATED:task-models END -->
127
+ - **Central Ideas (c1-t2 / c1-t9) distractor `error-type`** — `too-narrow`, `too-broad`, `misreads-detail`, `insignificant` (true-but-not-central); R&E targets use `misreads-detail`/`erroneous-inference`/`faulty-reasoning`. Keep an `insignificant` foil plausible — the guideline warns against details so trivial the option is implausible.
88
128
  - **Program terminator** — top-level forms chain with no `{}` between them; the program ends with a single `{}..`.
89
129
 
90
130
  ## Example Prompts
@@ -95,16 +135,19 @@ Say this to get that:
95
135
  - *"Make an EBSR item about how the author uses evidence to support a point in an informational article about bridges, standard ri-8."* → `target c1-t11`, `dimension author-use-of-information`
96
136
  - *"Write an item about the relationships between the events in a history passage."* → `target c1-t11`, `dimension relationships-interactions`
97
137
  - *"Which sentence best states the main idea of this article? (multiple choice)"* → `target c1-t9`, `type multiple-choice`, `dimension central-idea`
138
+ - *"What is the theme of this story? Make it a two-part item with the evidence in Part B."* → `target c1-t2`, `type ebsr` (tm3), `dimension theme`; the correct answer is a lesson, not a plot event
139
+ - *"Have students summarize what happens after the storm, using details from the story."* → `target c1-t2`, `type short-text` (tm5), `dimension summary` — scoped to a key event, which is the only kind of summary T2 allows
98
140
  - *"Make a multi-select asking for the two sentences that belong in a summary."* → `target c1-t9`, `type multi-select`, `dimension summary`, `focus` is a list of the two correct claims
99
141
  - *"The article says aqueducts brought water to distant cities — which detail best supports that? (multiple choice)"* → `target c1-t8`, `type multiple-choice`, `dimension supporting-evidence`; the inference goes in the `stem`, the options are `source`s
100
142
  - *"Make a click-the-sentence item where students select the evidence for a stated conclusion."* → `target c1-t8`, `type hot-text` (single-part), `dimension supporting-evidence`
143
+ - *"In this story, the reader can conclude the boy regrets what he said — which line best supports that?"* → `target c1-t1` (the literary Key Details target), `type multiple-choice`, `dimension supporting-evidence`; standards are `rl-1` alone
101
144
  - *"What does the word 'aqueduct' mean as used in this article? (multiple choice)"* → `target c1-t10`, `type multiple-choice`, `dimension word-meaning`; a `word` with candidate `meaning`s, `focus` names the word
102
145
  - *"Read the paragraph below. Click the word that means 'a channel that carries water'."* → `target c1-t10`, `type hot-text` (click-the-word); author the candidate `word`s (correct one is `focus` with its paragraph's `line`, plus a few distractor candidate words from the same paragraph); definition in the stem, passage NOT in the stem
103
146
  - *"Keep the passage at a 4th-grade reading level."* → top-level `grade 4`; author shorter sentences and simpler vocabulary (the default is the guideline's Grade 5)
104
147
 
105
148
  ## Out of Scope
106
149
 
107
- - **Other targets / grades / claims** — L0175 covers G5 · Claim 1 · Reasoning & Evidence, targets T4 (literary) and T11 (informational). Other targets belong in their own dialects.
150
+ - **Other targets / grades / claims** — L0175 covers G5 · Claim 1, targets T4 (Reasoning & Evidence, literary), T11 (Reasoning & Evidence, informational), T9 (Central Ideas), T8 (Key Details), and T10 (Word Meanings). Other claims, grades, or Claim-1 targets belong in their own dialects.
108
151
  - **Dual-text stimuli** — a single passage only in this version.
109
152
  - **Compile-time generation** — the compiler selects and validates authored content; it does not invent claims, distractors, or evidence.
110
153
  - **Auto-scoring** — short-text responses are hand-scored against the rubric; the compiler emits the rubric only.
@@ -0,0 +1,27 @@
1
+ export declare const TARGETS_REVISED = "2026-08-28";
2
+ export declare const STANDARD_FAMILIES: {
3
+ readonly RL_G5: readonly ["rl-1", "rl-2", "rl-3", "rl-4", "rl-5", "rl-6", "rl-7", "rl-9"];
4
+ readonly RI_G5: readonly ["ri-1", "ri-2", "ri-3", "ri-4", "ri-5", "ri-6", "ri-7", "ri-8", "ri-9"];
5
+ readonly L_G5: readonly ["l-4", "l-4a", "l-4b", "l-4c", "l-5", "l-5a", "l-5b", "l-5c"];
6
+ };
7
+ export type StandardFamily = keyof typeof STANDARD_FAMILIES;
8
+ export type TargetData = {
9
+ id: string;
10
+ label: string;
11
+ grade: number;
12
+ skill: "reasoning-evidence" | "central-ideas" | "key-details" | "word-meanings";
13
+ textType: "literary" | "informational";
14
+ baseStandard: string;
15
+ defaultDok: string;
16
+ answerKind: "statement" | "evidence" | "meaning";
17
+ singlePartHotText: boolean;
18
+ taskModels: Record<string, string>;
19
+ standards: StandardFamily[];
20
+ dimensions: string[];
21
+ errorTypes: string[];
22
+ dimStandard: Record<string, string>;
23
+ };
24
+ export declare function targetForSkill(skill: string, textType?: string): TargetData | undefined;
25
+ export declare function taskModelNumber(target: string, itemType: string): string | undefined;
26
+ export declare const TARGETS_DATA: Record<string, TargetData>;
27
+ //# sourceMappingURL=targets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"targets.d.ts","sourceRoot":"","sources":["../src/targets.ts"],"names":[],"mappings":"AAmBA,eAAO,MAAM,eAAe,eAAe,CAAC;AAM5C,eAAO,MAAM,iBAAiB;;;;CAIpB,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,iBAAiB,CAAC;AAI5D,MAAM,MAAM,UAAU,GAAG;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IAKd,KAAK,EAAE,oBAAoB,GAAG,eAAe,GAAG,aAAa,GAAG,eAAe,CAAC;IAChF,QAAQ,EAAE,UAAU,GAAG,eAAe,CAAC;IACvC,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IAInB,UAAU,EAAE,WAAW,GAAG,UAAU,GAAG,SAAS,CAAC;IAGjD,iBAAiB,EAAE,OAAO,CAAC;IAK3B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC,CAAC;AAMF,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAKvF;AAMD,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKpF;AAoBD,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAqLnD,CAAC"}
@@ -0,0 +1,250 @@
1
+ // SPDX-License-Identifier: MIT
2
+ /* Copyright (c) 2026, ARTCOMPILER INC */
3
+ //
4
+ // SINGLE SOURCE OF TRUTH for L0175's per-target structure.
5
+ //
6
+ // Everything the compiler enforces about a learning target lives here — and ONLY here.
7
+ // `compiler.ts` builds its runtime `TARGETS` profiles from this data; `tools/build-static.js`
8
+ // emits a served `targets.json` from it and GENERATES the per-target tables in the spec
9
+ // `.md` files (instructions.md, stems.md) from it. The `.md` files are the generator-facing
10
+ // flip side of this data: they carry MORE (narrative, stems, examples) but must EMPHASIZE
11
+ // everything here — nothing structural the compiler checks may be absent from what the
12
+ // generator reads. To add or change a target fact, edit this file; the compiler and the docs
13
+ // follow.
14
+ //
15
+ // This is plain data (no logic) so it round-trips to JSON. It is a typed `.ts` module rather
16
+ // than a raw `.json` import because core compiles to ESM under NodeNext, where JSON imports
17
+ // need version-fragile import attributes; build-static serializes it to `dist/static/targets.json`
18
+ // for non-TS consumers (the console RAG pipeline) and humans.
19
+ export const TARGETS_REVISED = "2026-08-28";
20
+ // CCSS Grade-5 reading-standard families. A target's `standards` is the full strand for its
21
+ // text type, so any plausible CCSS code for that text type validates (the `dimStandard` map
22
+ // still picks the right companion by default). RL.8 is "not applicable to literature";
23
+ // RL.10/RI.10 are range-of-reading bands, not discrete item standards.
24
+ export const STANDARD_FAMILIES = {
25
+ RL_G5: ["rl-1", "rl-2", "rl-3", "rl-4", "rl-5", "rl-6", "rl-7", "rl-9"],
26
+ RI_G5: ["ri-1", "ri-2", "ri-3", "ri-4", "ri-5", "ri-6", "ri-7", "ri-8", "ri-9"],
27
+ L_G5: ["l-4", "l-4a", "l-4b", "l-4c", "l-5", "l-5a", "l-5b", "l-5c"], // vocabulary (T10)
28
+ };
29
+ // Route a (skill, textType) pair to its target — the skill × text-type grid the docs present to
30
+ // the generator. `textType` may be omitted when a request names a skill but no genre; the literary
31
+ // target wins then, per the spec's "when the text type is ambiguous, prefer the literary target",
32
+ // falling back to the skill's only form (Word Meanings has no literary target).
33
+ export function targetForSkill(skill, textType) {
34
+ const all = Object.values(TARGETS_DATA).filter((d) => d.skill === skill);
35
+ if (!all.length)
36
+ return undefined;
37
+ if (textType)
38
+ return all.find((d) => d.textType === textType) ?? all[0];
39
+ return all.find((d) => d.textType === "literary") ?? all[0];
40
+ }
41
+ // Reverse lookup: the task-model NUMBER for a (target, item type) — e.g. ("c1-t9", "ebsr") → "3",
42
+ // ("c1-t4", "short-text") → "3". Item-type → task-model is per-target (the numbers collide), so the
43
+ // target is required. Returns undefined if the target doesn't offer that item type. Used by the RAG
44
+ // signature so a number-phrased query ("task model 3") can match a target's correct exemplar.
45
+ export function taskModelNumber(target, itemType) {
46
+ const tms = TARGETS_DATA[target]?.taskModels;
47
+ if (!tms)
48
+ return undefined;
49
+ const key = Object.keys(tms).find((k) => tms[k] === itemType);
50
+ return key ? key.replace(/^tm/, "") : undefined;
51
+ }
52
+ // Distractor error taxonomies reused across targets. Reasoning & Evidence (T4/T11) classifies
53
+ // foils by reasoning failure; Central Ideas (T9) by SIGNIFICANCE (a true statement that just
54
+ // isn't the central idea); Word Meanings (T10) by meaning error.
55
+ const RE_ERROR_TYPES = ["misreads-detail", "erroneous-inference", "faulty-reasoning"];
56
+ // Shared by BOTH Central Ideas targets (T9 informational, T2 literary): their guidelines describe
57
+ // the same two distractor failures — misinterpreting a detail, and misjudging the SIGNIFICANCE of
58
+ // ideas and details — which this taxonomy splits into a misread plus three significance errors.
59
+ const CENTRAL_IDEA_ERROR_TYPES = ["too-narrow", "too-broad", "misreads-detail", "insignificant"];
60
+ // R&E (T4/T11) and the single-select families share task-model layouts.
61
+ const RE_TASK_MODELS = { tm1: "ebsr", tm2: "hot-text", tm3: "short-text" };
62
+ const SELECT_TASK_MODELS = { tm1: "multiple-choice", tm2: "multi-select", tm3: "hot-text" };
63
+ // Central Ideas (T9/T2) is the only family that offers all five item types, so its numbering
64
+ // reaches tm5. NOTE tm3 is EBSR here but hot-text in the SELECT_TASK_MODELS targets.
65
+ const CENTRAL_IDEA_TASK_MODELS = {
66
+ tm1: "multiple-choice", tm2: "multi-select", tm3: "ebsr", tm4: "hot-text", tm5: "short-text",
67
+ };
68
+ export const TARGETS_DATA = {
69
+ // Claim 1 · Target 4 — Reasoning & Evidence, literary texts (RL standards). The original L0175.
70
+ "c1-t4": {
71
+ id: "c1-t4",
72
+ label: "Grade 5 · Claim 1 · Target 4 (Reasoning & Evidence)",
73
+ grade: 5,
74
+ skill: "reasoning-evidence",
75
+ textType: "literary",
76
+ baseStandard: "rl-1",
77
+ defaultDok: "r-dok3",
78
+ answerKind: "statement",
79
+ singlePartHotText: false,
80
+ taskModels: RE_TASK_MODELS,
81
+ standards: ["RL_G5"],
82
+ dimensions: [
83
+ "character", "setting", "event", "point-of-view",
84
+ "theme", "topic", "narrators-feelings", "character-relationship",
85
+ ],
86
+ errorTypes: RE_ERROR_TYPES,
87
+ dimStandard: {
88
+ "character": "rl-3", "character-relationship": "rl-3", "setting": "rl-3", "event": "rl-3",
89
+ "point-of-view": "rl-6", "narrators-feelings": "rl-6",
90
+ // theme/topic = determine-the-theme/summarize → RL.2 (the CCSS theme standard), not the
91
+ // cross-text-comparison RL.9.
92
+ "theme": "rl-2", "topic": "rl-2",
93
+ },
94
+ },
95
+ // Claim 1 · Target 11 — Reasoning & Evidence, informational texts (RI standards).
96
+ "c1-t11": {
97
+ id: "c1-t11",
98
+ label: "Grade 5 · Claim 1 · Target 11 (Reasoning & Evidence)",
99
+ grade: 5,
100
+ skill: "reasoning-evidence",
101
+ textType: "informational",
102
+ baseStandard: "ri-1",
103
+ defaultDok: "r-dok3",
104
+ answerKind: "statement",
105
+ singlePartHotText: false,
106
+ taskModels: RE_TASK_MODELS,
107
+ standards: ["RI_G5"],
108
+ dimensions: [
109
+ "relationships-interactions", "author-use-of-information",
110
+ "point-of-view", "purpose", "authors-opinion",
111
+ ],
112
+ errorTypes: RE_ERROR_TYPES,
113
+ dimStandard: {
114
+ "relationships-interactions": "ri-3",
115
+ "author-use-of-information": "ri-8",
116
+ "point-of-view": "ri-6",
117
+ "purpose": "ri-8",
118
+ "authors-opinion": "ri-8",
119
+ },
120
+ },
121
+ // Claim 1 · Target 2 — Central Ideas, LITERARY texts (RL-1 + RL-2). The literary twin of T9, and
122
+ // the only other target offering all five item types. Its own emphases, from the guideline:
123
+ // - THEME leads. RL-2 is "determine a theme of a story, drama, or poem from details in the
124
+ // text … summarize the text", so `theme` is a first-class dimension here, not a T4 borrowing.
125
+ // - SUMMARY IS SCOPED. "Items will not ask students to summarize the entire text; students will
126
+ // summarize a key event(s) or idea(s)." T9 has no such limit — this is the sharpest T2/T9
127
+ // difference and the docs must carry it.
128
+ // - `key-detail` covers the guideline's "key event(s) or idea(s)" — in a story the key details
129
+ // that build a theme are usually events, so they share one dimension rather than splitting a
130
+ // single skill across two tags the compiler treats identically.
131
+ // Every dimension answers to RL-2 (the theme/summarize standard); RL-1 is added as the base, so a
132
+ // composed item's standards is ["rl-1", "rl-2"] — exactly the guideline's pair.
133
+ "c1-t2": {
134
+ id: "c1-t2",
135
+ label: "Grade 5 · Claim 1 · Target 2 (Central Ideas)",
136
+ grade: 5,
137
+ skill: "central-ideas",
138
+ textType: "literary",
139
+ baseStandard: "rl-1",
140
+ defaultDok: "r-dok2", // tm5 short-text bumps to r-dok3 (dokFor), per the guideline
141
+ answerKind: "statement",
142
+ singlePartHotText: true, // T2 Hot Text (tm4): click the sentence(s) that show the theme
143
+ taskModels: CENTRAL_IDEA_TASK_MODELS,
144
+ standards: ["RL_G5"],
145
+ dimensions: ["theme", "central-idea", "key-detail", "summary"],
146
+ errorTypes: CENTRAL_IDEA_ERROR_TYPES,
147
+ dimStandard: {
148
+ "theme": "rl-2",
149
+ "central-idea": "rl-2",
150
+ "key-detail": "rl-2",
151
+ "summary": "rl-2",
152
+ },
153
+ },
154
+ // Claim 1 · Target 9 — Central Ideas, informational texts (RI-1 + RI-2). A DIFFERENT skill from
155
+ // Reasoning & Evidence: whole-text synthesis and significance (the main idea, the key details that
156
+ // build it, and summary), DOK 2 (3 only for the written summary). Distractors are a SIGNIFICANCE
157
+ // taxonomy — usually true statements that just aren't the central idea. The only non-R&E target
158
+ // that allows EBSR and short-text, so its task-model numbering reaches tm5.
159
+ "c1-t9": {
160
+ id: "c1-t9",
161
+ label: "Grade 5 · Claim 1 · Target 9 (Central Ideas)",
162
+ grade: 5,
163
+ skill: "central-ideas",
164
+ textType: "informational",
165
+ baseStandard: "ri-1",
166
+ defaultDok: "r-dok2",
167
+ answerKind: "statement",
168
+ singlePartHotText: true, // T9 Hot Text (tm4): click the sentence(s) that show the main idea
169
+ taskModels: CENTRAL_IDEA_TASK_MODELS,
170
+ standards: ["RI_G5"],
171
+ dimensions: ["central-idea", "key-detail", "summary"],
172
+ errorTypes: CENTRAL_IDEA_ERROR_TYPES,
173
+ dimStandard: {
174
+ "central-idea": "ri-2",
175
+ "key-detail": "ri-2",
176
+ "summary": "ri-2",
177
+ },
178
+ },
179
+ // Claim 1 · Target 1 — Key Details, LITERARY texts (RL-1 only). The literary mirror of T8: the
180
+ // inference/conclusion is GIVEN in the stem and the student selects the supporting EVIDENCE
181
+ // (answerKind "evidence"), same three task models. Unlike T8 the guideline lists NO companion
182
+ // standard — RL-1 (quote accurately / draw inferences) is the whole of it, so `dimStandard` maps
183
+ // back to the base and an item's `standards` is just ["rl-1"]. Its literary stems say
184
+ // "[author/narrator]" and add "line" as a selectable unit; Multi-Select is exactly TWO correct
185
+ // (T8 allows two or three). DOK 1–2 (default 2).
186
+ "c1-t1": {
187
+ id: "c1-t1",
188
+ label: "Grade 5 · Claim 1 · Target 1 (Key Details)",
189
+ grade: 5,
190
+ skill: "key-details",
191
+ textType: "literary",
192
+ baseStandard: "rl-1",
193
+ defaultDok: "r-dok2",
194
+ answerKind: "evidence",
195
+ singlePartHotText: true,
196
+ taskModels: SELECT_TASK_MODELS,
197
+ standards: ["RL_G5"],
198
+ dimensions: ["supporting-evidence"],
199
+ errorTypes: [], // like T8, wrong answers are non-supporting sources, not distractor claims
200
+ dimStandard: {
201
+ "supporting-evidence": "rl-1", // no companion in the guideline — RL-1 stands alone
202
+ },
203
+ },
204
+ // Claim 1 · Target 8 — Key Details, informational texts (RI-1 + RI-7). A DIFFERENT model: the
205
+ // inference/conclusion is GIVEN in the stem and the student selects the supporting EVIDENCE
206
+ // (answerKind "evidence"). Options are passage sources, not claims; no statement Part A, no
207
+ // EBSR/short-text. DOK 1–2 (default 2).
208
+ "c1-t8": {
209
+ id: "c1-t8",
210
+ label: "Grade 5 · Claim 1 · Target 8 (Key Details)",
211
+ grade: 5,
212
+ skill: "key-details",
213
+ textType: "informational",
214
+ baseStandard: "ri-1",
215
+ defaultDok: "r-dok2",
216
+ answerKind: "evidence",
217
+ singlePartHotText: true,
218
+ taskModels: SELECT_TASK_MODELS,
219
+ standards: ["RI_G5"],
220
+ dimensions: ["supporting-evidence"],
221
+ errorTypes: [], // T8 wrong answers are non-supporting sources, not distractor claims
222
+ dimStandard: {
223
+ "supporting-evidence": "ri-7",
224
+ },
225
+ },
226
+ // Claim 1 · Target 10 — Word Meanings, informational texts (RI-4 + the L-4 family). The most
227
+ // different model: the question asks for the MEANING of a targeted word/phrase in context, so the
228
+ // options are candidate MEANINGS (answerKind "meaning"), authored as `word`/`meaning`, not claims.
229
+ // DOK 1–2. The strategy (context / roots & affixes / word relationships / reference) is expressed
230
+ // via the authored standard (l-4a / l-4b / l-5c / l-4c).
231
+ "c1-t10": {
232
+ id: "c1-t10",
233
+ label: "Grade 5 · Claim 1 · Target 10 (Word Meanings)",
234
+ grade: 5,
235
+ skill: "word-meanings",
236
+ textType: "informational",
237
+ baseStandard: "ri-4",
238
+ defaultDok: "r-dok2",
239
+ answerKind: "meaning",
240
+ singlePartHotText: false, // T10 Hot Text is word-level (composeWordMeaning), not sentence-level
241
+ taskModels: SELECT_TASK_MODELS,
242
+ standards: ["RI_G5", "L_G5"],
243
+ dimensions: ["word-meaning"],
244
+ errorTypes: ["other-meaning", "misinterprets", "wrong-context"],
245
+ dimStandard: {
246
+ "word-meaning": "l-4",
247
+ },
248
+ },
249
+ };
250
+ //# sourceMappingURL=targets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"targets.js","sourceRoot":"","sources":["../src/targets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { type DesignFacets } from "./embedding.js";
2
+ export interface ExampleExpectation {
3
+ target: string;
4
+ taskModel?: string;
5
+ itemType?: string;
6
+ dimension?: string;
7
+ standard?: string;
8
+ }
9
+ export interface VerifyResult {
10
+ ok: boolean;
11
+ blocking: string[];
12
+ advisory: string[];
13
+ facets: DesignFacets;
14
+ }
15
+ /**
16
+ * Verify one example against its declared expectation. Pure: the caller supplies the compile result
17
+ * (`errors`, `data`) — parsing/compiling lives at the call site (the parser is not a core dep). Pass
18
+ * `data` (a composed program from `compiler.compile`) for the authoritative signature; `code` alone
19
+ * falls back to the source-derived signature.
20
+ */
21
+ export declare function verifyExample(input: {
22
+ errors: any[];
23
+ data?: any;
24
+ code?: string;
25
+ expect: ExampleExpectation;
26
+ }): VerifyResult;
27
+ //# sourceMappingURL=verify-example.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify-example.d.ts","sourceRoot":"","sources":["../src/verify-example.ts"],"names":[],"mappings":"AAeA,OAAO,EAAgD,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAGjG,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,YAAY,CAAC;CACtB;AAQD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE;IACnC,MAAM,EAAE,GAAG,EAAE,CAAC;IACd,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,kBAAkB,CAAC;CAC5B,GAAG,YAAY,CAyDf"}
@@ -0,0 +1,82 @@
1
+ // SPDX-License-Identifier: MIT
2
+ // A verification GATE for RAG example data. It does NOT map prompt→code (that stays with the
3
+ // generator + human refinement); it inspects whatever code an example already carries and checks
4
+ // only the machine-decidable properties, so it composes with a human-in-the-loop workflow.
5
+ //
6
+ // Two tiers:
7
+ // - BLOCKING — objective failures that must keep an example out of the corpus: it must compile
8
+ // clean, and its composed design signature (target / item type / task model /
9
+ // dimension / standard) must match the example's declared intent. Task-model checks
10
+ // read ./targets.ts (the single source of truth), NOT instructions.md — so the gate
11
+ // is independent of the docs a bootstrap run was seeded from.
12
+ // - ADVISORY — compiler warnings (thin distractor pool, A↔B giveaway, above-grade reading) that a
13
+ // human should judge, surfaced but not fatal.
14
+ //
15
+ // The gate guards BOTH sides of the human: run it after bootstrap AND after hand-refinement.
16
+ import { buildSignatureTags, buildSignatureFromSource } from "./embedding.js";
17
+ import { TARGETS_DATA, taskModelNumber } from "./targets.js";
18
+ // Accept "tm3" or "3"; return both the table key and the bare number.
19
+ function normalizeTaskModel(s) {
20
+ const num = String(s).toLowerCase().replace(/^tm/, "");
21
+ return { key: `tm${num}`, num };
22
+ }
23
+ /**
24
+ * Verify one example against its declared expectation. Pure: the caller supplies the compile result
25
+ * (`errors`, `data`) — parsing/compiling lives at the call site (the parser is not a core dep). Pass
26
+ * `data` (a composed program from `compiler.compile`) for the authoritative signature; `code` alone
27
+ * falls back to the source-derived signature.
28
+ */
29
+ export function verifyExample(input) {
30
+ const { errors, data, code, expect } = input;
31
+ const blocking = [];
32
+ const advisory = [];
33
+ // 1. Must compile clean — any hard error is blocking.
34
+ for (const e of errors || [])
35
+ blocking.push(`compile error: ${e?.message ?? String(e)}`);
36
+ // 2. Signature — prefer the composed data; fall back to source.
37
+ const sig = data != null ? buildSignatureTags(data) : buildSignatureFromSource(code || "");
38
+ const facets = sig.facets;
39
+ const target = expect.target;
40
+ const profile = TARGETS_DATA[target];
41
+ if (!profile) {
42
+ blocking.push(`unknown expected target '${target}'`);
43
+ return { ok: blocking.length === 0, blocking, advisory, facets };
44
+ }
45
+ // Resolve the expected item type / task-model number from whatever the expectation provided, and
46
+ // cross-check them when both are given.
47
+ const expTm = expect.taskModel ? normalizeTaskModel(expect.taskModel) : undefined;
48
+ let expItemType = expect.itemType;
49
+ if (!expItemType && expTm)
50
+ expItemType = profile.taskModels[expTm.key];
51
+ const expTmNum = expTm?.num ?? (expItemType ? taskModelNumber(target, expItemType) : undefined);
52
+ if (expect.itemType && expTm && profile.taskModels[expTm.key] !== expect.itemType) {
53
+ blocking.push(`expectation is inconsistent: ${expTm.key} is '${profile.taskModels[expTm.key] ?? "n/a"}' for ${target}, not '${expect.itemType}'`);
54
+ }
55
+ if (expTm && !profile.taskModels[expTm.key]) {
56
+ blocking.push(`task model '${expTm.key}' is not available for target ${target}`);
57
+ }
58
+ // 3. Composed signature must match the declared intent.
59
+ if (facets.target !== target) {
60
+ blocking.push(`target: expected ${target}, composed ${facets.target ?? "none"}`);
61
+ }
62
+ const gotTypes = facets.itemTypes || [];
63
+ if (expItemType && !(gotTypes.length === 1 && gotTypes[0] === expItemType)) {
64
+ blocking.push(`item type: expected exactly [${expItemType}], composed [${gotTypes.join(", ") || "none"}]`);
65
+ }
66
+ if (expTmNum && !(facets.taskModels || []).includes(expTmNum)) {
67
+ blocking.push(`task model: expected tm${expTmNum}, composed task-model(s) [${(facets.taskModels || []).join(", ") || "none"}]`);
68
+ }
69
+ if (expect.dimension && !(facets.dimensions || []).includes(expect.dimension)) {
70
+ blocking.push(`dimension: expected ${expect.dimension}, composed [${(facets.dimensions || []).join(", ") || "none"}]`);
71
+ }
72
+ if (expect.standard && !(facets.standards || []).includes(expect.standard)) {
73
+ blocking.push(`standard: expected ${expect.standard}, composed [${(facets.standards || []).join(", ") || "none"}]`);
74
+ }
75
+ // 4. Compiler warnings → advisory (a human decides). Warnings ride on each composed item.
76
+ const items = data == null ? [] : Array.isArray(data) ? data : data.kind === "items" ? data.items : [data];
77
+ for (const it of items)
78
+ for (const w of (it && it.warnings) || [])
79
+ advisory.push(w);
80
+ return { ok: blocking.length === 0, blocking, advisory, facets };
81
+ }
82
+ //# sourceMappingURL=verify-example.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify-example.js","sourceRoot":"","sources":["../src/verify-example.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "access": "public"
4
4
  },
5
5
  "name": "@graffiticode/l0175",
6
- "version": "0.2.0",
6
+ "version": "0.3.1",
7
7
  "description": "L0175 — a Graffiticode dialect (hello/image/theme/print) inheriting @graffiticode/l0000",
8
8
  "type": "module",
9
9
  "main": "./dist/index.js",
@@ -25,7 +25,7 @@
25
25
  "lint": "eslint src tools"
26
26
  },
27
27
  "dependencies": {
28
- "@graffiticode/l0000": "^0.1.2"
28
+ "@graffiticode/l0000": "^0.1.3"
29
29
  },
30
30
  "devDependencies": {
31
31
  "spec-md": "^3.1.0"
@@ -0,0 +1,20 @@
1
+ passage "Title"
2
+ type literary
3
+ lines [
4
+ "Line one."
5
+ ] claims []
6
+ evidence []
7
+ outcomes [] {}..
8
+ Read the sentence: "The aqueduct carried water across long distances using gentle slopes." What does the word aqueduct most likely mean?
9
+
10
+ A. a channel built to carry water ✓
11
+
12
+ B. a kind of paved road
13
+
14
+ C. a boat that carries cargo
15
+
16
+ D. a tall stone tower
17
+
18
+ Answer key: Answer — A
19
+
20
+ Correct inference: a channel built to carry water