core/docs/decisions/ADR-0195-product-promotion-bridge.md
Shay 9df1e6522b
feat(adr-0195): GSM8K product promotion bridge — serving 4/46/0 → 6/44/0, wrong=0 (#500)
Narrow product promotion boundary (`generate/derivation/product_bridge.py`)
wired into `generate/math_candidate_graph.py`: only complete pure-product
derivations with a product-target question and no known hazard surface lift
from the sealed pooled derivation reader into serving.

- Serving train_sample: 4/46/0 → 6/44/0, wrong=0; case 0050 still refused.
- Renumbered from the collided ADR-0194 (labeled-container, #499) to ADR-0195
  and rebased onto current main.

CI: smoke + verify-pinned-lane-SHAs green on the merge commit.
2026-05-30 17:33:56 -07:00

1.5 KiB

ADR-0195 — Product Promotion Bridge

Status: Accepted / Implemented. Date: 2026-05-30.

Decision

Promote only a narrow subset of the pooled derivation reader into the serving candidate-graph path: complete pure-product readings whose question asks for an aggregate product target, and whose surface lacks known non-product hazards.

This is not a wholesale import of resolve_pooled. The pooled reader solves GSM8K train-sample 0003 and 0021, but still commits eight known wrong products on the same 50-case sample. The bridge therefore acts as a correction gate over the pooled reader.

Guard

generate.derivation.product_bridge.resolve_promotable_product() admits only when:

  • resolve_pooled() resolves uniquely;
  • the selected derivation is classified complete;
  • every step is multiply and no step is a comparative scalar;
  • the question target is revenue/money-made or total moved weight;
  • hazard surfaces such as rate questions, percentages, residual state, profit/equation targets, same-amount group totals, and comma-number extraction gaps are absent.

Evidence

The official train-sample lane moves from 4/46/0 to 6/44/0:

  • newly correct: gsm8k-train-sample-v1-0003, gsm8k-train-sample-v1-0021;
  • wrong remains 0;
  • case 0050 remains refused;
  • the eight known pooled-reader wrong commits remain unpromoted.

The ADR-0126 exit threshold remains unmet (correct >= 10), so the runner still exits nonzero even though the metric improves.