feat(longitudinal): replay Rust CT-AR Rasch on current review workflow - #1005
Conversation
Land a focused successor to #848 on live main: independent per-respondent OLS trends and caller-supplied discrete AR predictions, with honest estimand metadata, fail-closed worker joins, checked AR gaps, and scale-relative slope degeneracy. Number the decision ADR-0018 so it does not collide with main ADR-0015 or #948 ADRs 0016/0017. Co-authored-by: Seongho Bae <seonghobae@users.noreply.github.com>
Use two-token snake_case respondent IDs and cover NumPy scalar observation conversion on the public longitudinal boundary. Co-authored-by: Seongho Bae <seonghobae@users.noreply.github.com>
PR 948 already records Angoff delta-plot and Bradley-Terry MM. Carry those accepted ADRs in this branch so the index does not skip numbers and a later merge with the citation work does not drop them. Co-authored-by: Seongho Bae <seonghobae@users.noreply.github.com>
…safe" This reverts commit eafb302.
Close the leftover llvm-cov paths in the longitudinal state engine: skip an unused worker chunk, test first-to-last sequence-span underflow as a helper, and recover an AR series that starts after a leading missing occasion. Accept Python int and NumPy integer scalars at the public boundary. Co-authored-by: Seongho Bae <seonghobae@users.noreply.github.com>
The required default-setup Analyze (actions) job is still the 17:40 UTC init failure (feature-enablement HTTP 503). The repository CodeQL copy already passed on a later rerun. This integration cannot call `gh run rerun` (403, needs actions: write), so retrigger the stale org check without changing product code. Co-authored-by: Seongho Bae <seonghobae@users.noreply.github.com>
* Add joint MAP hierarchical continuous-time AR(1) Rasch slice. Introduce a Rust-owned jointly estimated longitudinal IRT kernel stacked on the #976 OLS/AR state layer: shared (mu, tau, lambda), elapsed-day OU transitions, measurement-information Wald state intervals, and honest estimand metadata. Multiple-membership u_h and GPU parity are excluded. Python remains marshalling-only. Co-authored-by: Seongho Bae <seonghobae@users.noreply.github.com> * Accept NumPy intercept vectors and hide test-only scale helpers. NumPy 2 no longer treats ndarray as a Sequence, so the hierarchical simulator now accepts both sequences and arrays. Empirical-scale helpers used only by unit tests are cfg(test) so the production lib stays clean. Co-authored-by: Seongho Bae <seonghobae@users.noreply.github.com> --------- Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: Seongho Bae <seonghobae@users.noreply.github.com>
|
Warning Review limit reachedNext included review available in 59 minutes. View limit detailsLimit details: You’ve used the included review currently available. You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. Review configuration: ⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (28)
📝 WalkthroughWalkthroughThe PR adds Rust longitudinal OLS/AR state estimation and joint MAP hierarchical continuous-time AR(1) Rasch estimation. It exposes fitting and simulation through PyO3 and Python APIs, adds validation and recovery tests, and updates architecture and verification documentation. ChangesLongitudinal estimation
Estimated code review effort: 5 (Critical) | ~120 minutes Merge Risk: 🟡 Moderate · up to This PR adds longitudinal CT-AR fitting and simulation, but the current implementation can produce inconsistent optimization gradients or misleading uncertainty intervals, accept invalid simulation parameters, allocate from oversized inputs before rejecting them, and fail when the documented backend options are unavailable. The PR is not merge-ready until these bounded correctness, resource-safety, and API-contract risks are fixed or explicitly accepted. Sequence Diagram(s)sequenceDiagram
participant PythonCaller
participant EstimationAPI
participant PyO3Extension
participant RustEstimator
PythonCaller->>EstimationAPI: submit design and longitudinal data
EstimationAPI->>PyO3Extension: marshal validated arrays
PyO3Extension->>RustEstimator: fit state or hierarchical CT-AR Rasch model
RustEstimator-->>PyO3Extension: return estimates, intervals, and diagnostics
PyO3Extension-->>EstimationAPI: return Python mapping
EstimationAPI-->>PythonCaller: return fitted result
sequenceDiagram
participant PythonCaller
participant EstimationAPI
participant RustSimulator
PythonCaller->>EstimationAPI: submit design, item intercepts, and seed
EstimationAPI->>RustSimulator: request hierarchical CT-AR Rasch simulation
RustSimulator-->>EstimationAPI: return states and responses
EstimationAPI-->>PythonCaller: return occasion-major simulation result
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches 💡 1📝 Generate docstrings 💡
🧪 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 @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 headed9868c1b3636d0470dc82367e80a43036483018. -
Head SHA:
ed9868c1b3636d0470dc82367e80a43036483018 -
Workflow run: 32213322481
-
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 (10 files)"]
S1 --> I1["repository behavior"]
I1 --> R1["Review risk: Changed file (10 files)"]
R1 --> V1["required checks"]
Evidence --> S2["Docs (14 files)"]
S2 --> I2["operator or user guidance"]
I2 --> R2["Review risk: Docs (14 files)"]
R2 --> V2["docs review"]
Evidence --> S3["Test (4 files)"]
S3 --> I3["regression suite"]
I3 --> R3["Review risk: Test (4 files)"]
R3 --> V3["targeted test run"]
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 (10 files)"]
S1 --> I1["repository behavior"]
I1 --> R1["Review risk: Changed file (10 files)"]
R1 --> V1["required checks"]
Evidence --> S2["Docs (14 files)"]
S2 --> I2["operator or user guidance"]
I2 --> R2["Review risk: Docs (14 files)"]
R2 --> V2["docs review"]
Evidence --> S3["Test (4 files)"]
S3 --> I3["regression suite"]
I3 --> R3["Review risk: Test (4 files)"]
R3 --> V3["targeted test run"]
|
|
@opencode-agent review Fresh re-review request: ContextualWisdomLab/.github#1136 has merged, fixing the central Generated by Claude Code |
|
@opencode-agent review Re-dispatch unchanged exact head |
|
Scheduled review-feedback autofix for this PR head.
|
|
Scheduled review-feedback autofix for this PR head.
|
Current-head review disposition (5f65f4d)
No valid unresolved source finding remains on the exact head. Hosted required checks and fresh reviewer verdicts remain authoritative. |
# Conflicts: # docs/adr/README.md
# Conflicts: # python/fast_mlsirm/multilevel/__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.
Supersedes #976 while preserving the corrected Rust-first scientific tree.
Exact current state
Protected base:
main@04d0bc21a2a20693bcf16108cd76d394fe844d23.Exact current head:
fd7b511e62c1f0a24190ef3fa65b06db50e6e32e, open, non-Draft and mergeable.Repository-local CI, Security Scan, CodeQL, SAST Semgrep and ClusterFuzzLite are terminal-success on this exact head. Predecessor-head checks and reviews remain historical.
Scientific ownership
Production longitudinal/IRT likelihood, continuous-time state transition, MAP optimization, hyperparameter/state uncertainty and recovery arithmetic remain Rust-owned. Python performs validation, bounded materialization and orchestration only.
The current CT-AR variance derivative path differentiates the active exact/series branch and returns zero variance derivatives when the transition-variance floor is active. The simulator validates
decay_ratebefore occasion traversal. Python/native boundaries enforce the current 100,000-occasion and 4,096-item resource ceilings before copying/materializing. Hyperparameter intervals are explicitly labeled conditional observed-information intervals with nuisance item/state blocks fixed; state intervals remain the documented measurement-observed-information approximation.Review reconciliation
Current-code verification resolved the already-addressed findings for:
decay_ratevalidation, including single-occasion respondents;The historical request to restore production NumPy fallbacks for the longitudinal estimators is not implemented: current canonical repository authority requires production psychometric arithmetic to remain Rust-first, with Python numerical formulas limited to explicit reference/test use. Informational observations about measurement-only state intervals, respondent-contiguous ordering, states-fixed hyperparameter Hessians, flat floor gradients, response/design canonical alignment and fully-missing-occasion interval identification remain visible rather than being represented as resolved source defects.
Acceptance boundary
The formal OpenCode
CHANGES_REQUESTEDreview is retained. It evaluated predecessor headed9868c1b3636d0470dc82367e80a43036483018and reports a centralcoverage-evidencefailure; it is not silently treated as current-head approval. Require fresh exact-head protected contexts and independent approval before merge. No review dismissal, gate weakening, force update or self-approval is used.