Partly done — staying open for property tests and the remaining boundary cases.
Added three integration files, all of which fail against the pre-fix code:
tests/degenerate_inputs.rs…
iterate_to_convergence, a copy-pasted sweep, and #[allow(dead_code)] used as a mute button
Mostly done — staying open for the remainder.
Done:
iterate_to_convergencereadsself.convergenceinstead of its hard-coded epsilon and 20-iteration cap, and is#[cfg(test)]—…
predict_outcome panics and is 2-team-only, HistoryBuilder isn't exported, Rating/Index are write-only
Partly done — staying open for the items that are breaking or need a design call.
Done (all additive, no breakage):
- 2.
HistoryBuilderis exported. It waspubbut unreachable —…
converge() never returns Err, and MismatchedShape is misused for type errors
Partly done — staying open.
Done:
WrongOutcomeKind { context, expected, got }added and used at both sites, so the nonsense "expected length 0, got 0" message is goneInferenceError…
History ingestion path bypasses InferenceError entirely
Partly done — staying open.
Now enforced in release, returning InferenceError from the public API:
- ties with
p_draw == 0.0→TieWithoutDrawProbability, checked in `add_events_with_p…
cargo publish would fail: no description, license, or repository — and the crate has no top-level docs
Partly done in 9506fed — staying open for the licence, which is yours to choose.
Added: description, repository, readme, keywords, categories, exclude, and `rust-version =…
Done in 9e8515b.
CLAUDE.md's architecture section is rewritten against the current src/ layout — the data flow, the modules that replaced Batch/Agent/Player/message.rs, the…
Added in 9506fed: .gitea/workflows/ci.yml, covering the matrix above — default / approx / approx,rayon / --release, plus clippy with warnings denied, nightly fmt --check, doc tests,…
converged: false for trivially-converged graphs
Fixed in 6030dc7 — all three.
EpsilonOrMax::default()derives fromConvergenceOptions::default(), so there is one source of truth. Pinned bydefault_matches_convergence_options.- A…
learning_curves() is O(n²) because KeyTable::key is a linear scan
Fixed in c088214 and 9e8515b.
KeyTable now keeps a Vec<K> reverse map alongside the HashMap, so key() is an O(1) index rather than a scan over every entry — indices are dense and…
Fixed in 355cdb7 — all three items.
Add,Sub,excludeandforgetgo through newfrom_mv(mu, var)andvariance(), both pure divisions. No square roots remain in the variance…
-inf on large games
Fixed in 0f1a1b8. Game, OwnedGame and time_slice::Event carry log_evidence directly, summed over links rather than multiplied then logged.
The per-link value is also floored at `f64::MIN_P…
History::converge() panics on an empty history (usize underflow)
Fixed in f4e2922. History::iteration returns early when there are no slices, and converge() short-circuits to a zero-iteration converged: true report.
log_evidence(), learning_curves(),…
&mut SkillStore through a usize-laundered pointer (UB)
Fixed in 06b6a68 — by removing the unsafe rather than tightening it.
The safety argument was about disjoint elements, which was a hint that the operation is separable rather than merely…
quality() and predict_quality() panic for anything other than exactly 2 rating groups
Fixed in 0d32690.
All three defects addressed:
- The contrast-matrix column counter is gone — the negative block always starts immediately after the positive one, so the second counter was…
Fixed in c088214 — but my root-cause analysis above was wrong, and the real cause was a correctness bug, not just a slow path.
Making the coloring lazy changed nothing. Profiling showed 1.5…
p_draw = 0.0 silently produce NaN skills and report converged: true
Fixed in f4e2922 (merged to main).
Took option 1 — reject — since it implements the intent the debug_assert! already stated. Validation sits in add_events_with_prior, the chokepoint every…