diff --git a/docs/decisions/ADR-0194-labeled-container-subject.md b/docs/decisions/ADR-0194-labeled-container-subject.md new file mode 100644 index 00000000..1dc66eb8 --- /dev/null +++ b/docs/decisions/ADR-0194-labeled-container-subject.md @@ -0,0 +1,84 @@ +# ADR-0194 — Labeled-container subject entity shape + +**Status:** Proposed (implemented in this PR). +**Extends:** [ADR-0136.S.4](./ADR-0136.S.4-novel-initial-form.md) (sibling-pattern +localisation), [ADR-0123a](./ADR-0123a-inference-shape-synonym.md) (entity slot). +**Composes with:** [ADR-0193](./ADR-0193-aggregate-existential-question-frame.md) +(aggregate question frame). +**Substrate: 0 real-corpus metric flip by design; the value is the entity-shape +generalisation + proven composition with the aggregate question.** + +> **One line.** GSM8K labels containers/regions with a trailing single-letter +> or short-numeric label ("Jar A has 28 marbles", "Section G has 10 cars", +> "District 2 has 19 voters"). The initial-possession entity slot +> (`_ENTITY = (?:[A-Z]\w+|[Tt]he\s+\w+)`) captures only "Jar" and then expects +> the possession verb, so the label breaks the match and the statement parses +> to nothing. This adds a separate sibling pattern that REQUIRES a label. + +--- + +## 1. The gap + +Both reader paths reject the labeled subject: +- the candidate parser's `_INITIAL_HAS_RE` (`extract_initial_candidates` → 0 + candidates); +- the recognizer's discrete_count anchor (proper-noun single-token subject → + 0 anchors). + +"Jamie has 28 marbles" parses (1 candidate); "Jar A has 28 marbles" does not — +purely because of the trailing label. + +## 2. Decision + +Add `_INITIAL_HAS_LABELED_RE` in `generate/math_candidate_parser.py`, consumed +by a dedicated `_init_has_labeled_candidates` helper wired into +`extract_initial_candidates`: + +``` +^