Repository navigation
v1.4.3: Validation hardening + Range.diff + docs refresh
v1.4.3 — Validation hardening + Range.diff + docs refresh (PATCH)
A bundled patch release combining an input-validation hardening pass on HUNLConfig, a small set-difference utility on Range, and a documentation refresh covering v1.4.x capabilities, CLI ergonomics gaps, and two-tier architecture honesty.
HUNLConfig input-validation hardening
HUNLConfig.__post_init__ now raises TypeError/ValueError early on malformed inputs (type-level guards on contribution tuple shape, scalar types for starting_stack/big_blind/small_blind/ante/initial_pot, bet-size-fraction containers, and bool rejected where int is expected). Loud failure at the Python/Rust boundary instead of silent corruption propagating to the Rust backend. Builds on v1.4.1's validation foundation (which caught negative and over-stack contributions). 28 new test cases in tests/test_hunl_config_validation.py cover the expanded guard surface.
Range.diff() set-difference utility
New Range.diff(other) method returns a new Range of combos in self not in other — directional, non-mutating set-difference. Equivalent to frequency-aware max(self.freq - other.freq, 0) under the current Range invariant (all stored frequencies are 1.0). Useful for computing range complements without rebuilding combo lists by hand. 8 new test cases in tests/test_range.py (22/22 passing) cover empty/self/superset/disjoint diffs, directionality, partial overlap, and non-mutation. Fractional-frequency exemplars remain pending the Range refactor.
USAGE.md + DEVELOPER.md refresh
USAGE.md updated for v1.4.x capabilities (node-locking, asymmetric contributions, the new Range.diff() utility), known CLI ergonomics gaps (pushfold subcommand, exploit-target positional convention, batch-solve CSV quoting), and observed performance cliffs (range-vs-range walk vs. Rust port). DEVELOPER.md adds two-tier (Python solve_hunl_postflop chance-enum-at-root vs. Rust solve_range_vs_range_rust vector-form CFR) honesty framing, action-abstraction notes (ActionAbstractionConfig defaults; library round-trip behavior including exploitability_history truncation), and operational guidance for contributors.
Honest framing
PATCH bump on the v1.4.x line: additive utility + input-validation hardening + docs refresh. No public API breakage, no behavior change to existing call sites, no Rust source changes. The v1.4.2 compiled binding is byte-identical for this release — users on v1.4.2 do not need to rebuild Rust to pick up v1.4.3. Smoke regression on test_range.py (22 tests) and test_hunl_config_validation.py (28 tests) all green. No new persona workflow structurally unblocked beyond v1.4.1; PR 27 enables the W2.2 categorical-leak-slice workflow at the set-membership level (utility-level convenience).