v1.2.0 — outside-in HDI tower + mass-aware tip + fail-loud config
Resolves register C-44 (Tier 1) — a silent output-correctness bug in the v1.1 tower estimators. A minority duplicated draw (a couple of exact zeros, a lone pair, any repeated value) could hijack the degenerate ~2-sample 5% floor and collapse both tower_point and the nested hdi_tower bands — confirmed on real faoapi forecast cells. No change to the frozen estimators (map_estimate/hdi/quantiles, ADR-018); CONFORMANCE_FLOOR stays 1.0.0. pip install --upgrade views-frames.
Changed
- The canonical tower is now built outside-in (widest floor first; each narrower floor the shortest interval contained in its wider parent), instead of inside-out. Robust by construction — a lonely outlier is shed by the well-determined wide floors, and containment forbids a narrower floor from re-selecting it. Nesting + reproducibility laws unchanged.
tower_pointreads the configurabletip_massfloor (default0.5— the "shorth"), not the degenerate 5% floor: a mass-aware, duplicate-robust point.- The tower-family functions drop their tunable kwargs (
bins/prominence/min_mass/block_rows) — those now come from the config (below).massesstays a per-call argument.
Added
views_frames_summarize.config— a fail-loud config (TOWER_CONFIG,REQUIRED_KEYS,validate_config,get,canonical_floors) holding every tower-family tunable with no silent defaults: a missing key raisesValueErrornaming it (ADR-008/009).
Governance
- ADR-019 amended (inside-out → outside-in;
tip_mass; config). Register C-44 → Resolved; C-32/C-34 mitigation notes updated. The Summarize CIC records the new construction, thetip_masstip, and the nesting-tradeoff / robust-mode-vs-MAP caveats.
Full notes: CHANGELOG.md.