core/docs/adr/ADR-0189a-day-enum-activity-first-flip.md
Shay 54e6bfc0d0
docs: reorganize docs landscape
Implements the 4-phase documentation reorganization master plan.

- Consolidation: Merged brief/, handoff/, planning/, and decisions/ into briefs/, handoffs/, plans/, and adr/ respectively (101 ADRs relocated)
- Root Cleanup: Relocated HANDOFF-gpt55-*.md and key top-level docs (runtime_contracts.md, etc.) to canonical folders. Added superseded alerts.
- Indices & Navigation: Created docs/README.md navigation document, docs/sessions/README.md index, docs/adr/README.md index
- Note: Also includes prior commit adding ADR-0200+ corpus hygiene governance (ADR-0225, dependency map, backfilled cross-references)
2026-06-30 16:59:36 -07:00

88 lines
4.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ADR-0189a — First metric move: 3/47/0 → 4/46/0 (case 0024, comprehension-composed)
**Status:** Accepted (implemented). Builds on
[ADR-0189](./ADR-0189-comparative-verb-unit-widening.md) (comparative reading).
Serving-path capability, landed because **wrong=0 is proven across every lane**.
> **One line.** The official GSM8K `train_sample` metric moves for the first time
> this arc: **3/47/0 → 4/46/0**. Case 0024 now solves by *composing three general
> comprehension capabilities* — day-of-week count enumeration (`Sidney =
> 20+36+40+50 = 146`), comparative reading (`Brooke = 3 × Sidney`, ADR-0189), and
> an activity question (`How many … did Brooke do?`) — feeding the unchanged
> ADR-0123 solver. No new arithmetic, no per-case hack, wrong=0 held everywhere.
---
## 1. What moved and why it's legitimate
`train_sample`: **3/47/0 → 4/46/0**. New correct: **0024** (answer 438).
Correct set is now `{0014, 0018, 0024, 0042}`.
This is the "serving if wrong=0 proven" path (operator-approved): a *complete*,
wrong=0-proven capability lands directly in serving and the committed
`report.json` + `CLAIMS.md` are re-baselined to the new metric. It is **not** a
sealed gain — it solves a real case through comprehension, with the wrong=0
firewall intact.
## 2. The three composed capabilities (each general, each wrong=0-safe)
0024: *"Sidney does 20 jumping jacks on Monday, 36 on Tuesday, 40 on Wednesday,
and 50 on Thursday. Brooke does three times as many jumping jacks as Sidney. How
many jumping jacks did Brooke do?"*
1. **Day-of-week count enumeration** (`_day_enumeration_candidates`): `"<Actor>
does N1 <noun> on <Day1>, N2 on <Day2>, …"` → one summed `CandidateInitial`
(`Sidney = 146 jumping jacks`). Closed to the seven day names so the
`<count> on <Day>` list cannot be confused with other comma lists. The derived
sum is not literal in source, so provenance anchors on the first count token
(which grounds) — the exact pattern `_embedded_quantifier_candidates` already
uses for `N × M`.
2. **Comparative reading** (ADR-0189): `Brooke = 3 × Sidney` via the existing
`compare_multiplicative` solver. Required the ADR-0189 verb-widening (`does`)
and multi-word unit (`jumping jacks`).
3. **Activity question** (`_Q_DID_RE`): `"How many <unit> did <Entity> <verb>?"`
`Unknown(entity, unit)`, with a 12-word unit slot.
Plus the `CandidateInitial` anchor whitelist gains `do`/`does`/`did`
(production-possession: "does N jumping jacks" = holds a count of N), admitted
only via the closed day-enumeration shape.
## 3. wrong=0 evidence (the load-bearing gate)
- **All 8 capability-axis lanes: wrong=0** — G1 (20/0), G2_comparatives (29/29),
G3_numerics (20/0), G4 (32/32), G5 (20/20), S1 (20/20), S3 (24/24), S4 (20/20).
- **train_sample 4/46/0, wrong=0**; the wrong bucket is empty.
- **Serving-frozen gate green**: `verify_lane_shas.py` exit 0 (no pinned lane —
reviewer_registry / math_teaching_corpus / … — changed), `generate_claims.py
--check` OK after re-baseline.
- **872 tests pass.** New tests are failing-under-violation, incl. wrong=0 guards:
a non-day comma list must NOT be summed (`test_non_day_comma_list_does_not_enumerate`);
polarity-inverting comparative verbs stay refused (ADR-0189).
- Re-baselined `report.json` + `train_sample_coverage_report.json` (the latter
also clears pre-existing refusal-reason drift). The only remaining pre-existing
failures (`G3_numerics::test_committed_report_matches_fresh_run`, a telemetry
round-trip test) are unrelated and fail on pristine `origin/main`.
## 4. Why this obeys the standing principles
- **Decode, don't guess.** 0024 is solved by *reading* its structure (an
enumeration is a sum; "three times as many" is a multiplicative comparison) and
composing the existing solver — not by storing an answer or adding arithmetic.
- **General, not overfit.** Each piece is a recurring construction (day-of-week
enumeration, comparative, activity question), not a 0024-specific regex; the
day-enum is closed to day names and guarded against non-day lists.
- **Eliminate-first, then solve.** The microscope mapped all 47 refusals, proved
no single-capability win exists, and identified 0024 as the cleanest *composing*
target; the flip required exactly the three pieces the dissection predicted.
- **wrong=0 > coverage.** Landed only after wrong=0 was proven on every lane; the
round-trip firewall and the solver are unchanged.
- **No contradiction** with in-use ADRs: extends the ADR-0131 extractors and the
ADR-0189 comparative reading; feeds the ADR-0123 solver unchanged.
## 5. The path this opens
0024 proves the composition approach end-to-end. The same three components recur
across the remaining 46; the next flips come from the companion capabilities the
dissection mapped (multi-value/non-day aggregation, division questions, percentage,
currency-rate via ADR-0187/0188), each landed the same way: general, wrong=0-proven,
re-baselined in serving.