Skip to content

docs(timeseries): document lpirfs_cholesky in agent card + reference #2

docs(timeseries): document lpirfs_cholesky in agent card + reference

docs(timeseries): document lpirfs_cholesky in agent card + reference #2

Workflow file for this run

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