feat(adr-0174-phase4): in-loop contemplate + en_core_names_v1 pack
ADR-0174 Phase 4 — deterministic search adapter for evidence that
disambiguates surviving hypothesis sets. First load-bearing use case:
gendered-pronoun resolution via the en_core_names_v1 pack — turns
the Phase 3a multi-actor defense from refuse-on-ambiguity into
admit-via-evidence when an unambiguous gendered name binds the
pronoun to one antecedent.
generate/comprehension/contemplate.py (new, ~310 lines):
- Resolution dataclass (closed-set kind + source + evidence shape)
- VALID_RESOLUTION_KINDS = {eliminate, admit_unknown}
- VALID_RESOLUTION_SOURCES = {vault, pack, audit_history}
- contemplate() orchestrator — adapters consulted in precedence
order: vault > pack > audit_history (ADR-0174 §Open Q#3)
- _consult_packs() — gendered-pronoun resolution implementation
- _consult_vault() and _consult_audit_history() — stubs (Phase 4b)
- _PRONOUN_GENDER closed map (she/he gendered; they/them epicene)
- _load_names_pack() with @lru_cache; refusal-preferring on
absent pack
language_packs/data/en_core_names_v1/ (new pack):
- gender.jsonl — 59 unambiguously-gendered English first names
(30 female, 29 male), alphabetically sorted, JSONL with schema
{name: str, gender: 'female'|'male'}. Covers names appearing
in train_sample/v1 GSM8K problems (Alice, Bob, Daniel, Malcolm,
Erica, Jan, Tina, etc.). Deliberately excludes ambiguous-
gender names (Jordan, Alex, Casey, Pat, Taylor, Morgan, Sam,
Chris, Robin, Riley).
- manifest.json — pack metadata with sha256 checksum
(f65836e7a25a9db8aae984d259b60e161574ff3b4bb135a924aa767a794fbd21),
entry count, schema declaration, ambiguity discipline,
expansion pathway through HITL corridor, wrong=0 protection
contract.
generate/math_candidate_graph.py:
- Phase 4 wiring at the multi-actor defense site (was: refuse
on len(_distinct_priors) > 1; now: invoke contemplate first,
fall through to defense when contemplate returns None).
- On contemplate.kind='admit_unknown' from pack source: extract
chosen antecedent from evidence, override _antecedent, clear
_multi_actor_ambiguous, proceed to admit-via-PronounResolution.
- On contemplate=None: fire new 'ambiguous_unresolvable'
contemplate trace event AND original 'no_antecedent_ambiguous'
lookback event, drop candidates.
tests/test_adr_0174_phase4_contemplate.py (new):
27 acceptance tests covering: primitive contract (empty/single-
survivor noop), Resolution dataclass invariants (5 refusal
paths), names pack load + content spot-checks, pronoun gender
lookup (gendered + epicene), 6 gendered-pronoun resolution
cases (she/he success, same-gender refusal, unknown-name
refusal, epicene refusal, no-matching-gender refusal), end-to-
end wiring through parse_and_solve, determinism (two calls
byte-identical, evidence sorted), closed-set contracts,
wrong=0 + case-0050 canary.
tests/test_adr_0174_phase3_lookback.py + phase3b_compound_clause.py:
Updated the multi-actor defense tests to use SAME-GENDER
antecedents (Alice + Mary) so Phase 4 contemplate cannot
disambiguate via gender pack — the Phase 3a defense still
fires. (For mixed-gender antecedents the new behavior is
correct admit-via-evidence; that's tested in Phase 4 suite.)
End-to-end answer-correctness caveat (documented in test
docstrings):
Phase 4 trace events fire correctly when the recognizer-
injection path encounters multi-actor pronoun cases that the
pack disambiguates. However the regex parser ALSO produces
candidates for simpler pronoun-subject shapes (without
intervening prepositional phrases); those compete in the
Cartesian product and the contemplate-resolved binding may be
shadowed. This is the latent regex-path pronoun hazard tracked
in project-adr-0174-multi-actor-pronoun-hazard memory. Full
answer lift on train_sample requires regex-path defense (Phase 5
regex retirement work).
Acceptance:
- 285/285 ADR-0174 + math_problem_graph tests pass
- Smoke 67/67, packs 141/141
- train_sample 3/47/0 preserved (wrong=0 held)
- Phase 4 trace event fires end-to-end on multi-PP pronoun-subject
case: contemplate/resolved with chosen=Alice, evidence pack
Alice=female + Bob=male
References: ADR-0174 §In-loop contemplation, CLAUDE.md §Lookback
Review Discipline, docs/handoff/ADR-0174-PHASE-3B-4-COMBINED-SCOPE.md,
docs/handoff/phase-3b-4-skeleton/ (skeleton dispatch source),
project-adr-0174-multi-actor-pronoun-hazard memory.