## Hot Text (Selectable Text) Question Evaluation

This item is a HOT TEXT (selectable text) question. The student reads a passage rendered as an
ordered run of tokens and selects one or more SELECTABLE ("hot") spans directly within that passage.
The content carries:
- `question`: the instruction — what to select and how many
- `tokens`: the ordered passage; each token is `{ id, text, selectable }`. Tokens with
  `selectable: true` are the clickable spans the student chooses among; non-selectable tokens are the
  surrounding context shown between them.
- `answer`: the ids of the correct selectable token(s). Scored all-or-nothing — the student must
  select every keyed span and no others.
- optional `min_selections` / `max_selections`: bounds on how many spans the student may select.

A hot text item is a selected-response item whose choices appear IN THE CONTEXT of the surrounding
passage. Treat the SELECTABLE tokens as the answer choices, the keyed ones as the correct answers,
and the non-keyed selectable tokens as the distractors. Apply the following type-specific rules in
addition to the general evaluation procedure above.

NOTE: A hot text item may legitimately key one span or several. When the stem asks for evidence,
the central idea, a theme statement, or an error within the passage, the answer being located in the
text is the assessed reading skill (Reading Anchor Standard 1 — cite textual evidence). Do NOT treat
that text-grounding as an answer leak. See the base-prompt carve-out for "explicit assessment-of-reading
items".

---

## STEP 2.7: HOT-TEXT STRUCTURAL AUDITS (MANDATORY — run before Step 3 scoring)

Each audit is a copy task: fill the fields by copying exact text from the content, then apply the
failure condition with no room for reinterpretation. Emit the named block verbatim inside the cited
metric's `internal_reasoning`. **Not emitting an audit when its trigger fires is itself a score-0.0
failure for that metric.** These audits override the base-prompt default-PASS stance.

### AUDIT HT-1 — Unique Correct Selection → factual_accuracy

**Trigger:** Always fires for hot text.

**Emit `ht1_unique_selection` in `factual_accuracy.internal_reasoning`:**
```
ht1_unique_selection:
  instruction: [copy the stem instruction verbatim]
  for each KEYED selectable token (id in answer):
    id: [token id]
    text: [copy token text verbatim]
    satisfies_instruction: [YES / NO]
  for each SELECTABLE token NOT in answer:
    id: [token id]
    text: [copy token text verbatim]
    also_satisfies_instruction: [YES / NO]
```
**MUST-FAIL** (`factual_accuracy = 0.0`) if EITHER:
- any KEYED span has `satisfies_instruction: NO` (the key includes a span that does not actually
  answer the stem), OR
- any non-keyed selectable span has `also_satisfies_instruction: YES` (a span outside the key is
  equally defensible, so the keyed set is not the unique correct answer).

A hot text item must have exactly the keyed set as its defensible answer. "It is the best span" does
NOT rescue the item when another selectable span also satisfies the literal instruction — ambiguous
keys mismeasure students.

### AUDIT HT-2 — Selection-Count Coherence → clarity_precision

**Trigger:** Always fires.

**Emit `ht2_selection_count` in `clarity_precision.internal_reasoning`:**
```
ht2_selection_count:
  count_stated_in_stem: [copy the number the stem tells the student to select (e.g. "two"), or NONE]
  stem_frames_select_all: [YES / NO — does the stem ask the student to select ALL spans meeting a criterion, e.g. "select all the sentences that…"?]
  number_of_keyed_answers: [count of ids in answer]
  min_selections: [value or NONE]
  max_selections: [value or NONE]
  student_can_determine_how_many_to_select: [YES / NO]
```
Set `student_can_determine_how_many_to_select: YES` if ANY of these hold: the stem states a count;
the stem frames an unbounded "select all that [criterion]" task; OR `min_selections` /
`max_selections` are present and pin the number to select (e.g. `min_selections == max_selections`,
or `max_selections == number_of_keyed_answers` — meaning the student must pick exactly that many).
A `max_selections` that merely provides an upper bound without equalling the keyed count does NOT
pin the selection count; set `student_can_determine_how_many_to_select: NO` in that case. Otherwise NO.

**MUST-FAIL** (`clarity_precision = 0.0`) if EITHER:
- the key has more than one span AND `student_can_determine_how_many_to_select: NO` (the student is
  left guessing how many spans to pick); OR
- a stated count, `min_selections`, or `max_selections` disagrees with `number_of_keyed_answers`
  (e.g. stem says "select two" but three ids are keyed, or `max_selections` is below the keyed count).

A single-keyed item with a singular stem ("Select the sentence that…"), a "select all that
[criterion]" stem, and an item carrying coherent `min_selections` / `max_selections` bounds all PASS
this audit even when no explicit number word appears in the stem.

### AUDIT HT-3 — Distractor-Span Plausibility → distractor_quality

**Trigger:** Fires when at least one selectable token is NOT in the answer key.

**Emit `ht3_distractor_spans` in `distractor_quality.internal_reasoning`:**
```
ht3_distractor_spans:
  for each non-keyed SELECTABLE token:
    id: [token id]
    text: [copy verbatim]
    plausible_misreading: [one phrase naming the partial-understanding/misreading a student who picked this span would hold, or NONE]
```
**MUST-FAIL** (`distractor_quality = 0.0`) if a non-keyed selectable span is eliminable WITHOUT
reading and understanding the passage — i.e. it is off-topic filler or obviously unrelated to the
instruction (`plausible_misreading: NONE` for a span any test-wise student skips on sight). Strong
distractor spans reflect genuine misreadings: a true-but-irrelevant detail, a span that matches the
surface wording of the stem but not its meaning, or a span that answers a related-but-different
question.

### AUDIT HT-4 — Clean Span Boundaries → clarity_precision

**Trigger:** Always fires.

**Emit `ht4_span_boundaries` in `clarity_precision.internal_reasoning`:**
```
ht4_span_boundaries:
  for each SELECTABLE token:
    id: [token id]
    is_coherent_unit: [YES / NO — is the span a whole word, phrase, clause, or sentence rather than a mid-word fragment or an arbitrary cut that distorts meaning?]
```
**MUST-FAIL** (`clarity_precision = 0.0`) if any selectable span has `is_coherent_unit: NO` (e.g. a
span begins or ends mid-word, or slices a phrase so the selectable text reads as a fragment that a
student cannot evaluate on its own).

---

## Type-Specific Metric Notes

- **passage_reference**: The token passage IS the material the student reads; the keyed spans must be
  locatable within it. Pass when the spans are coherent in-context units that the instruction points
  to. Fail if the instruction references passage content that is not present in `tokens` (e.g. asks
  about a paragraph or line that the token run does not contain).

- **stimulus_quality**: For hot text the passage formed by `tokens` is the stimulus. Evaluate it for
  harm/coherence per the base rules. An item whose token run is too short or incoherent to support
  the selection task (no meaningful passage to select from) fails.

- **mastery_learning_alignment**: Passes when choosing the correct span(s) requires comprehension or
  analysis of the passage — locating textual evidence, identifying the central idea/theme,
  recognizing figurative language, or finding a conventions error. Fails when the selection reduces
  to surface string-matching the stem against one span with no comprehension required.

- **educational_accuracy**: Apply the base ELA answer-leak rules. A hot text item leaks when the
  correct span is identifiable from the stem ALONE without reading the passage — for example, the
  stem paraphrases the keyed sentence so closely that picking it is pure surface matching rather than
  comprehension. The text-evidence carve-out (RL/RI.1) still applies: when the standard itself names a
  cite-evidence / locate-in-text skill, grounding the answer in the passage is the intended task, not a
  leak.
