docs(timeseries): document lpirfs_cholesky in agent card + reference #2
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: R cross-language parity | |
| # Makes the JSS Section 8 claim "the R closed-form parity refreshes on | |
| # every push" literally true for the closed-form / MLE / matching core of | |
| # the Track A harness. It re-runs the canonical R reference for those | |
| # modules on the committed data/*.csv bytes and diffs every statistic | |
| # against the committed results/<module>_R.json golden value at a 1e-9 | |
| # reproducibility tolerance (tests/r_parity/verify_reproduce.py). A drift | |
| # fails the build. | |
| # | |
| # Heavy / slow-to-install reference packages (grf, did, gsynth, augsynth, | |
| # DoubleML+mlr3, lpirfs, ...) are deliberately NOT installed here: their | |
| # golden values stay as version-stamped frozen artefacts whose provenance | |
| # is pinned in tests/r_parity/renv.lock and the per-_R.json provenance | |
| # block, and whose bit-stability is verified locally by running | |
| # verify_reproduce.py with the full reference library (see R_ENVIRONMENT.md). | |
| # This separation keeps the gate fast and flake-free while still exercising | |
| # real R on every push. | |
| # | |
| # NOTE: this is a standalone workflow on purpose. The closed-form-core R | |
| # gate is independent of the Python reference_parity / registry / citation | |
| # gates in parity-guards.yml, so it surfaces as its own required check and | |
| # does not couple to the unrelated Python matrix. | |
| on: | |
| push: | |
| branches: [main] | |
| paths: | |
| - "tests/r_parity/**" | |
| - ".github/workflows/r-parity.yml" | |
| pull_request: | |
| branches: [main] | |
| paths: | |
| - "tests/r_parity/**" | |
| - ".github/workflows/r-parity.yml" | |
| workflow_dispatch: | |
| concurrency: | |
| group: r-parity-${{ github.ref }} | |
| cancel-in-progress: true | |
| jobs: | |
| r-closed-form-parity: | |
| name: R closed-form / MLE parity (reproduces golden JSON) | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 30 | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Set up Python | |
| uses: actions/setup-python@v5 | |
| with: | |
| python-version: "3.10" | |
| - name: Set up R | |
| uses: r-lib/actions/setup-r@v2 | |
| with: | |
| # Public RSPM serves precompiled Linux binaries, so the package | |
| # install below is seconds rather than a from-source compile. | |
| use-public-rspm: true | |
| - name: Install R reference packages (closed-form / MLE core) | |
| uses: r-lib/actions/setup-r-dependencies@v2 | |
| with: | |
| # Only the fast-installing reference packages that back the CI | |
| # module list below. jsonlite is the harness I/O dependency. | |
| packages: | | |
| any::jsonlite | |
| any::fixest | |
| any::sandwich | |
| any::lmtest | |
| any::AER | |
| any::survival | |
| any::MASS | |
| any::oaxaca | |
| any::MatchIt | |
| - name: Verify R closed-form parity reproduces committed golden JSON | |
| # verify_reproduce.py needs only R + the packages above + the Python | |
| # stdlib; it does NOT import statspai (it runs the R side and diffs | |
| # against the committed JSON). Exit code 2 on any drift fails the job. | |
| run: | | |
| python3 tests/r_parity/verify_reproduce.py \ | |
| 01_ols 02_iv 03_hdfe 05_sunab \ | |
| 14_ols_cluster 15_hdfe_cluster \ | |
| 11_psm 24_coxph 30_oaxaca \ | |
| 42_nbreg 48_probit 49_oprobit 51_newey \ | |
| --timeout 300 | |
| - name: Upload reproducibility report | |
| if: success() || failure() | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: r-parity-reproducibility-report | |
| path: tests/r_parity/results/REPRODUCIBILITY_REPORT.md | |
| if-no-files-found: ignore |