fix(release,dif): resync changelog and harden logistic controls - #998
Conversation
PRs merged after the v0.8.0 release-cut PR (#966) added new docs/changelog.d fragments without re-running the renderer, and the already-released release-0.8.0-cut.md fragment was left in place, duplicating the 0.8.0 section under Unreleased. Delete the stale fragment and re-render so render_changelog_fragments.py --check passes again, unblocking the v0.8.0 release-tag dispatch.
Ten more PRs merged into main after this fix's original commit, each adding docs/changelog.d fragments without re-running the renderer. Re-run render_changelog_fragments.py --update so --check passes again and the v0.8.0 release-tag dispatch is no longer blocked.
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (2)
💤 Files with no reviewable changes (1)
Included review availability: Your plan provides up to 1 included review per hour; 0 remain after this review. 📝 WalkthroughWalkthroughThe changelog now documents new validation and safety behavior for item banks, equating, workflows, metadata, scoring, agreement statistics, and parallel analysis. It also removes the former unreleased 0.8.0 release-cut notes. ChangesChangelog updates
Estimated code review effort: 1 (Trivial) | ~5 minutes Merge Risk: ⚪ Minimal · up to This PR only removes a stale changelog fragment and regenerates CHANGELOG.md without changing product or runtime behavior; no actionable merge-blocking risk remains beyond normal checks. Possibly related PRs
Suggested reviewers: 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
@opencode-agent Please review exact current head |
|
@cwl-noema-review Please independently review exact current head |
There was a problem hiding this comment.
Pull request overview
OpenCode cannot approve yet because required coverage evidence did not pass.
Review outcome
1. HIGH .github/workflows/opencode-review.yml:1 - Coverage evidence did not prove required test/docstring evidence
-
Problem: The required coverage-evidence job result was
failure, so OpenCode cannot establish approval sufficiency for this head. -
Root cause: Automated approval is only valid when the same-head coverage-evidence job proves supported repository test suites passed and configured docstring gates passed or were advisory, or reports not applicable because no supported source files or package manifests exist. Missing, failed, skipped, unavailable, or unsupported-tooling test evidence is a blocker.
-
Fix: Install or configure the repository test/docstring evidence tooling when source files or package manifests exist, rerun the current-head coverage-evidence job, and approve only after it reports
successwith required evidence or explicit no-source not-applicable evidence. -
Regression test: Keep the approval branch checking
needs.coverage-evidence.result == successbefore posting APPROVE, and publish REQUEST_CHANGES when coverage-evidence blocker states such as cancelled, skipped, failed, unsupported-tooling, or below-100 evidence are present. -
Result: REQUEST_CHANGES
-
Reason: coverage-evidence result was
failure, so required test/docstring evidence was not proven for current head40b8aa8fff661647d3de8ed2de9def03f680ec89. -
Head SHA:
40b8aa8fff661647d3de8ed2de9def03f680ec89 -
Workflow run: 32213311198
-
Workflow attempt: 1
Coverage evidence
Coverage evidence job did not run or did not publish coverage evidence.
Changed-File Evidence Map
flowchart LR
PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
Evidence --> S1["Changed file: CHANGELOG.md"]
S1 --> I1["repository behavior"]
I1 --> R1["Review risk: Changed file: CHANGELOG.md"]
R1 --> V1["required checks"]
Evidence --> S2["Docs: release-0.8.0-cut.md"]
S2 --> I2["operator or user guidance"]
I2 --> R2["Review risk: Docs: release-0.8.0-cut.md"]
R2 --> V2["docs review"]
OpenCode Review Overview
Pull request overviewOpenCode cannot approve yet because required coverage evidence did not pass. Review outcome1. HIGH .github/workflows/opencode-review.yml:1 - Coverage evidence did not prove required test/docstring evidence
Coverage evidenceCoverage evidence job did not run or did not publish coverage evidence. Changed-File Evidence Mapflowchart LR
PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
Evidence --> S1["Changed file: CHANGELOG.md"]
S1 --> I1["repository behavior"]
I1 --> R1["Review risk: Changed file: CHANGELOG.md"]
R1 --> V1["required checks"]
Evidence --> S2["Docs: release-0.8.0-cut.md"]
S2 --> I2["operator or user guidance"]
I2 --> R2["Review risk: Docs: release-0.8.0-cut.md"]
R2 --> V2["docs review"]
|
|
@opencode-agent review Fresh re-review request: ContextualWisdomLab/.github#1136 has merged, fixing the central Generated by Claude Code |
|
@opencode-agent Please re-review unchanged exact head |
|
@opencode-agent Please re-review unchanged exact head |
|
@opencode-agent review Re-dispatch unchanged exact head |
|
@opencode-agent review Re-review exact current head |
* test(dif): expose executable logistic controls * fix(dif): normalize controls before data and Rust * fix(dif): install hardened public DIF adapters * docs(changelog): record logistic DIF control boundary * docs(doctoring): trace logistic DIF control trust boundary * fix(changelog): classify logistic DIF control boundary --------- Co-authored-by: Claude <noreply@anthropic.com>
|
@opencode-agent review Re-review updated exact current head |
…rrent-review-971 Pulls in #1324 (grm-recovery toolchain pin + metadata scalar test realignment), now merged to main, resolving the two pre-existing CI regressions this branch had been carrying independently of its own diff. Regenerated CHANGELOG.md via scripts/render_changelog_fragments.py --update to resolve the conflict from the merged fragment set.
|
Scheduled review-feedback autofix for this PR head.
|
# Conflicts: # python/fast_mlsirm/__init__.py
|
@coderabbitai review |
|
Pin the baseline to protected main@9c12eab1 (v0.9.0). The open-PR queue collapsed from 74 to 6 since the previous snapshot; replace the stale PR table with the current six lanes (#1363, #1345, #1279, #1029, #1005, #998) including their merge-forward state. Update gap-matrix evidence columns for landed work: automatic Rust backend (#951/#1070), crossed multiple-membership (#1014), the Figma design-boundary ADR now at docs/adr/0016 via merged #1130, and cross-engine conformance (#1082) after #1077 closed as completed. No production code, formula, estimator, or release surface changed.
|
Merge-forward 2: combined this branch's DIF control-safety install with main's newly landed CAT administration (#1345) and fitstats S-X² (#1029) installs in |
* fix(release): resync CHANGELOG fragments after v0.8.0 cut PRs merged after the v0.8.0 release-cut PR (#966) added new docs/changelog.d fragments without re-running the renderer, and the already-released release-0.8.0-cut.md fragment was left in place, duplicating the 0.8.0 section under Unreleased. Delete the stale fragment and re-render so render_changelog_fragments.py --check passes again, unblocking the v0.8.0 release-tag dispatch. * fix(release): re-render CHANGELOG fragments for v0.8.0 aggregate Ten more PRs merged into main after this fix's original commit, each adding docs/changelog.d fragments without re-running the renderer. Re-run render_changelog_fragments.py --update so --check passes again and the v0.8.0 release-tag dispatch is no longer blocked. * fix(dif): harden logistic and purification controls (#959) * test(dif): expose executable logistic controls * fix(dif): normalize controls before data and Rust * fix(dif): install hardened public DIF adapters * docs(changelog): record logistic DIF control boundary * docs(doctoring): trace logistic DIF control trust boundary * fix(changelog): classify logistic DIF control boundary --------- Co-authored-by: Claude <noreply@anthropic.com> * test(dif): preserve native zero-iteration and NumPy bool domains * fix(dif): preserve native control compatibility * test(dif): align regressions with native control domains * test(dif): prove hardened package aliases on landing lane * fix(dif): reject max_iter=0 before native discovery in logistic DIF wrappers safe_logistic_dif and safe_logistic_dif_purified normalized max_iter with minimum=0, admitting zero at the Python boundary even though the native logistic_sweep (crates/mlsirm-core/src/dif.rs) rejects max_iter == 0 with "max_iter must be >= 1", and the module's own doctoring already documented max_iter as a positive usize control. A zero cap therefore cleared control validation, materialized caller response/group arrays, and dispatched to the compiled core before failing there instead of being rejected up front (Devin AI review finding on PR #998). Raise the minimum to 1 for both wrappers so the rejection happens before data materialization or core discovery, matching the documented and native domains. Updated the compatibility regressions accordingly: the former zero-iteration dispatch proofs now use the true minimum (1), and new regressions prove max_iter=0 is rejected before core discovery for both logistic_dif and logistic_dif_purified. * fix(release): resync changelog after current main * fix(dif): make control installer idempotent * feat(interaction-map): own residual factorization in Rust * test(interaction-map): seal evidence and resource admission * fix(interaction-map): seal evidence before Rust * test(interaction-map): bound native resource requests * fix(interaction-map): bound native workspaces * fix(interaction-map): reject oversized axis controls before data * test(interaction-map): reject maximal axis request before data * docs(interaction-map): record bounded evidence admission * test(interaction-map): require shape-consistent empty map * test(interaction-map): require coherent empty rectangle * fix(interaction-map): normalize empty complete-case rectangle * docs(interaction-map): record empty complete-case contract * feat(interaction-map): expose coverage and cell evidence * test(interaction-map): reject NaN model expectations * test(interaction-map): reject nonfinite expected evidence in Rust * fix(interaction-map): reject NaN model expectations * fix(interaction-map): require finite expected evidence * docs(changelog): record finite interaction-map expectations * test(interaction-map): preserve observed infinity rejection in Rust * fix(interaction-map): reject infinite observed evidence in Rust * docs(changelog): align interaction-map missingness parity * chore: normalize composed public exports --------- Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: opencode-agent[bot] <219766164+opencode-agent[bot]@users.noreply.github.com>
Closes #958.
Supersedes #971 and incorporates the former #959 logistic-DIF lane as one current-review landing unit.
Release-resync scope
docs/changelog.d/release-0.8.0-cut.md;CHANGELOG.mdso post-cut fragments appear once underUnreleased;## [0.8.0] - 2026-08-17section.Logistic-DIF control hardening
The inherited #959 slice established callback-free semantic-control admission before caller response/group materialization and before compiled-core discovery while keeping logistic-regression, Mantel-Haenszel, purification, BH, effect-size, convergence and result arithmetic Rust-owned.
A compatibility pass found an over-narrowed public/native domain in that inherited implementation: exact
numpy.bool_was rejected even though the historical public bool conversion accepted it.Test-first compatibility remediation
a8621145ddce90b3267b3e9a2a85ff7ee54a7b5e: prove exactnumpy.bool_control compatibility for unpurified and purified logistic DIF, with exact built-in primitives at the Rust boundary.da8cd3ef23a7b489d83e387473ee19000b2fbbe9: admit exact built-in/NumPy Boolean controls, keepmax_rounds >= 1, keepmin_anchor_items >= 0, and continue rejecting subclasses/protocol providers before callbacks.7bc9277249c575794404ad4d68ca79900d91dfb0: align inherited negative tests with the authoritative native domains and usenumpy.bool_in the supported-NumPy dispatch proof.09f6269fd6f6e8bdb80a37feaec994776ab3f7ea: verify the hardened package-level DIF aliases resolve to the same current implementations; this successor is test-only and does not change statistical behavior.50d7c9d820c25caf2fd5954c2ca5359f9b1cb3f3: merge currentmainto resolve the accumulated changelog-fragment (CHANGELOG.md, regenerated viascripts/render_changelog_fragments.py --updatefrom the mergeddocs/changelog.d/*.mdset) and package-init (python/fast_mlsirm/__init__.py, combining this branch's DIF control-safety install with main's independently landed exposure control-safety install) conflicts.f25c9a78eb6151342198942292972bc2d0873d11: a Devin AI review on this PR found that the wrappers admittedmax_iter=0at the Python boundary (minimum=0), even though the nativelogistic_sweep(crates/mlsirm-core/src/dif.rs) rejectsmax_iter == 0with"max_iter must be >= 1", and this module's own doctoring already documentedmax_iteras a positiveusizecontrol. A zero cap therefore cleared validation, materialized caller arrays, and only failed deep inside the compiled core. Raised the minimum to 1 for bothsafe_logistic_difandsafe_logistic_dif_purifiedso rejection happens before data materialization or core discovery, and updated/added regressions accordingly.a706bc96519659ca4643b84c0305fe1af4aa63d5: made_dif_control_safety.install()a no-op on repeated calls (marker-attribute guard on the wrapper functions, matching the established_icc_control_safety.pyprecedent) so re-importing or re-installing the package cannot stack another validation layer onto an already-hardeneddifmodule.b4cdb8799369cede50486123d8e11f5f13c0f1d0: merge currentmain(through PR fix(ci): pin grm-recovery rust toolchain and align metadata scalar test #1324's CI-contract-drift fixes — thegrm-recoveryRust toolchain pin and the metadata string-subclass normalization test) to keep this branch tracking the protected base with no further conflicts.666bd4c8f36ffb32a75b4fc497a37f3ac0815f68: merge currentmain(through the v0.9.0 release cut and subsequent independently-merged PRs) to keep this branch tracking the protected base with no further conflicts.6cb730cec8c10d35d8f9250574a16f23b5ada93c: merge currentmaincombining this branch's DIF control-safety install with main's newly landed CAT administration (fix(cat): seal administration evidence before NumPy protocols #1345) and fitstats S-X² (fix(fitstats): seal S-X² scalar control admission #1029) installs inpython/fast_mlsirm/__init__.py;CHANGELOG.mdregenerated from the merged fragment set.No statistical formula, estimand, BH behavior, purification arithmetic, or result schema changed.
Verification boundary
Protected base:
main@f5d6189227545b42d3f384b4728c8d6f611063c7.Exact current head:
6cb730cec8c10d35d8f9250574a16f23b5ada93c, open, non-Draft and mergeable pending review/checks.Every predecessor-head check/review is historical after each merge-forward. Evaluate exact-current-head repository CI/security/static analysis plus every protected central coverage/review/package/SBOM/provenance requirement before merge. No force-push, review dismissal, self-approval, or gate weakening is used.