Skip to content
Merged
Show file tree
Hide file tree
Changes from 28 commits
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
1495618
feat(persistence): retention deletion legal-hold SQL contracts (0007)…
seonghobae Aug 16, 2026
7aaf3ba
feat(psychometric): recover multilevel event-time structure with Rubi…
seonghobae Aug 17, 2026
14a28f0
feat(psychometric): map irregular already-centered residuals without …
seonghobae Aug 17, 2026
32aa936
feat(api): purpose-bound provider payloads refuse identity mappings (…
seonghobae Aug 17, 2026
1aae1e4
test(psychometric): close CWC-lag and Newton coverage gaps
seonghobae Aug 17, 2026
08a75d8
feat(psychometric): recover CWC contextual effect as between minus wi…
seonghobae Aug 17, 2026
6f74e46
test(psychometric): close residual-overflow and Pearson branch gaps
seonghobae Aug 17, 2026
67d32bb
feat(psychometric): remap discrete lags across unequal event intervals
seonghobae Aug 17, 2026
63a7a48
feat(psychometric): refuse binary64 underflow of the scalar forward map
seonghobae Aug 17, 2026
d247d7d
feat(psychometric): recover Voelkle Eq. 12 discrete constant-predicto…
seonghobae Aug 17, 2026
1fdcd23
feat(psychometric): evaluate Voelkle Eq. 12 without premature quotien…
seonghobae Aug 17, 2026
7c29e7c
feat(api): adaptive orchestration router selects modes under budget (…
seonghobae Aug 17, 2026
7ffb65b
feat(psychometric): evaluate Voelkle Eq. 12 without premature product…
seonghobae Aug 17, 2026
0d8ae63
feat(psychometric): evaluate Voelkle Eq. 12 without negative incremen…
seonghobae Aug 17, 2026
b696387
feat(psychometric): evaluate Voelkle Eq. 12 without expm1 overflow
seonghobae Aug 17, 2026
8a41203
feat(psychometric): recover Voelkle Eq. 14 time-varying predictor effect
seonghobae Aug 17, 2026
9546127
feat(psychometric): recover Driver Eq. 3 discrete process noise
seonghobae Aug 17, 2026
797282e
feat(psychometric): evaluate Driver Eq. 3 without twice-rate overflow
seonghobae Aug 17, 2026
6c13dfb
feat(psychometric): refuse overflowing Driver Eq. 3 rewrite scale
seonghobae Aug 18, 2026
6f24124
test(psychometric): close remaining event-time branch coverage
seonghobae Aug 18, 2026
321568a
feat(psychometric): recover Driver Eq. 3-4 lagged covariance and vari…
seonghobae Aug 18, 2026
9439b43
test(psychometric): refuse zero-diffusion Driver Eq. 3-4 overflow
seonghobae Aug 18, 2026
105e1e4
feat(psychometric): recover Driver Eq. 4 stationary within-subject va…
seonghobae Aug 18, 2026
556e23d
feat(psychometric): recover Driver §4.3 trait-plus-state variance
seonghobae Aug 18, 2026
17fe4f7
feat(psychometric): form Driver Eq. 4 stationary ratio first
seonghobae Aug 19, 2026
75ecdd3
feat(psychometric): recover Driver Eq. 1 observed-indicator variance
seonghobae Aug 19, 2026
2b834ff
feat(psychometric): divide Driver Eq. 4 by the finite Kronecker sum
seonghobae Aug 19, 2026
056abc3
feat(psychometric): recover Driver Eq. 5 MANIFESTTRAITVAR observed va…
seonghobae Aug 19, 2026
7c09788
feat(psychometric): recover Driver Eq. 5 lagged observed covariance
seonghobae Aug 19, 2026
5a8416f
feat(psychometric): recover Driver Eq. 5 observed-indicator mean
seonghobae Aug 19, 2026
b0b288b
feat(psychometric): recover Driver Eq. 3 expected-value latent mean
seonghobae Aug 19, 2026
7f29e39
feat(psychometric): recover Driver Eq. 5 of the Eq. 3 evolved mean
seonghobae Aug 19, 2026
2fcb9e5
feat(psychometric): cap two-observation residual invariance at strong
seonghobae Aug 19, 2026
b519fe4
feat(psychometric): recover Driver Eq. 3 TDPREDEFFECT impulse
seonghobae Aug 19, 2026
f11ab00
feat(psychometric): recover Driver Eq. 3 TIPREDEFFECT discrete map
seonghobae Aug 20, 2026
410a40c
feat(psychometric): recover Driver Eq. 1-2 TDPRED impulse carry
seonghobae Aug 20, 2026
b1628ca
feat(psychometric): recover Driver Eq. 5 of the Eq. 1-2 impulse carry
seonghobae Aug 20, 2026
ccf4ceb
test(psychometric): close multilevel recovery review gaps
seonghobae Aug 20, 2026
75b2e98
feat(psychometric): recover Driver Eq. 5 of the contemporaneous impulse
seonghobae Aug 20, 2026
980b62b
test: exercise valid pooled event-time comparison
seonghobae Aug 20, 2026
789d4d1
chore: probe GitHub write access (will revert)
seonghobae Aug 20, 2026
c074718
chore: revert GitHub write-access probe
seonghobae Aug 20, 2026
d125515
feat(psychometric): recover Driver Eq. 5 of the TIPREDEFFECT mean
seonghobae Aug 20, 2026
2f0b5f7
feat(psychometric): recover Driver Table 3 T0TIPREDEFFECT
seonghobae Aug 20, 2026
0e21bce
feat(psychometric): recover Driver Eq. 5 of T0TIPREDEFFECT
seonghobae Aug 20, 2026
0bce1ea
feat(psychometric): recover Driver Table 3 T0TDPREDEFFECT
seonghobae Aug 20, 2026
4a693f9
Merge remote-tracking branch 'origin/main' into review/pr144-current
seonghobae Aug 20, 2026
3df5d16
feat(psychometric): recover Driver Eq. 5 of T0TDPREDEFFECT
seonghobae Aug 20, 2026
7a1a25b
feat(psychometric): recover Driver §7.2 level-change CINT
seonghobae Aug 20, 2026
1101cfb
feat(psychometric): recover Driver Eq. 3 of §7.2 CINT
seonghobae Aug 20, 2026
5b18ea7
test(psychometric): require executable pooled rate evidence
seonghobae Aug 20, 2026
d1f14c8
Merge remote-tracking branch 'origin/agent/psychometric-multilevel-ev…
seonghobae Aug 20, 2026
27506ad
docs(research): record accessed invariance sources
seonghobae Aug 20, 2026
402aba4
docs(psychometric): refresh evidence review dates
seonghobae Aug 20, 2026
e0e568d
feat(psychometric): recover Driver §7.2 extra-process map
seonghobae Aug 20, 2026
45ba702
feat(psychometric): recover Driver Eq. 5 of §7.2 extra process
seonghobae Aug 21, 2026
56b507a
feat(psychometric): recover Driver §7.2 extra process after t0
seonghobae Aug 21, 2026
66d15e4
feat(psychometric): recover Driver §7.2 asymTIPREDEFFECT
seonghobae Aug 21, 2026
d88a3a5
feat(psychometric): recover Driver §7.2 addedTIPREDVAR
seonghobae Aug 21, 2026
5f5cacb
feat(psychometric): recover Driver Table 2 asymCINT
seonghobae Aug 21, 2026
3ad37fc
feat(psychometric): recover Driver p.16 stationary T0MEANS
seonghobae Aug 21, 2026
274556d
feat(psychometric): recover Driver §4.3 Eq. 5 of stationary T0MEANS
seonghobae Aug 21, 2026
06bffc5
feat(psychometric): recover Driver §4.3 / p.16 stationary T0VAR
seonghobae Aug 22, 2026
9fe82a9
feat(psychometric): recover Driver Eq. 5 of stationary T0VAR
seonghobae Aug 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion ARCHITECTURE.md
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ boundaries above remain the target modular MSA architecture.
| `tepp_simulation` | known-truth temporal/event data generation |
| `validation_core` | RMSE, bias, coverage, graph, and Monte Carlo metrics |
| `tepp_api` | versioned DTO, schema, and export contracts |
| `psychometric_core` | posterior-aware structural input gates and CPU `f64` loading point-estimate recovery |
| `psychometric_core` | posterior-aware structural input gates, CWC within/between OLS plus the contextual effect, event-time log-rate, unequal-interval discrete-lag remapping, constant-predictor discrete effect, time-varying-predictor discrete effect (Eq. 14), exact scalar discrete process noise (Driver et al., 2017, Eq. 3), lagged latent covariance and unconditional latent variance (Driver et al., 2017, Eq. 3–4), stationary within-subject variance (Driver et al., 2017, Eq. 4 as `Δt → ∞`; `asymDIFFUSION`), trait-plus-state variance (Driver et al., 2017, §4.3 `TRAITVAR`; not process noise), observed-indicator variance and lagged observed covariance (Driver et al., 2017, Eq. 5; Table 2 `MANIFESTVAR` is `Θ`, not `Var(y)`; `MANIFESTTRAITVAR` is not `MANIFESTVAR`; `Θ` does not enter lagged observed covariance; observed-indicator mean is `τ + λ μ`; `MANIFESTMEANS` is not `E(y)`; `CINT` is not `MANIFESTMEANS`; discrete latent mean is `exp(a Δt) μ_0 + (exp(a Δt) − 1)/a κ`; `T0MEANS` is not `μ_t`; `CINT` is not the discrete increment), irregular already-centered residual lag, Rubin `T` on OLS loadings, and strong-gated latent means |

No crate exposes placeholder production behavior in Task 1. This prevents an
empty façade from becoming a de facto public API before its invariants and tests
Expand Down
26 changes: 24 additions & 2 deletions CHANGELOG.md

Large diffs are not rendered by default.

4 changes: 4 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@ Read and follow `AGENTS.md` before changing this repository. The repository-wide
- Do not convert association, temporal precedence, or document links into causal language without identification evidence.
- Do not remove repeated report language with global stopword lists or use TF-IDF/BM25 as inferential weights. Model template, section, copied-text, style, modality, and corpus-background sources explicitly.
- Do not treat raw topic proportions as ordinary Euclidean indicators. Use logistic-normal coordinates or valid log-ratio coordinates and propagate posterior uncertainty into ESEM/DSEM.
- Do not treat metric/weak invariance as a latent-mean license. Strong (equal loading and intercept) or strict is required; `#84` `metric` licenses shared metric meaning only.
- Do not use the difference quotient as a continuous-time rate. The scalar map is `a = ln(φ) / Δt` on event time. Discrete lags from unequal event intervals are not one coefficient; remap them through that log-rate. Binary64 `exp(a Δt) = 0` is not a discrete lag. A constant predictor's discrete effect is Voelkle et al. (2012, Eq. 12), evaluated as `a_yx (expm1(z) / a_xx)` with `z = a_xx Δt` so a finite result is not lost when `z` overflows to `-∞` or when `a_yx Δt` overflows. When `expm1(z)` overflows at a finite `z`, rewrite in log space; a zero continuous effect is exactly zero; an overflowing `a_yx/a_xx` rewrite term fails closed. The first-order product is the underflow limit of that equation, not the general constant-predictor discrete effect. A time-varying predictor whose sampling interval equals its constancy interval uses Voelkle et al. (2012, Eq. 14): `b* = a_yx Δt`. Unmatched intervals fail closed (Oud & Jansen, 2000, unread). Discrete process noise is Driver et al. (2017, Eq. 3): `Q_Δt = 0.5 q (expm1(z) / a)` with `z = 2 (a Δt)` and `q = G G⊤ ≥ 0`; do not form `2 a` first; `a = 0` and `z → 0` recover `q Δt`; a zero diffusion is exactly zero; an overflowing rewrite scale `0.5 q / a` fails closed; this is not a Kalman filter. `Q_Δt` is `cov(η_t | η_{t-1})`, not `Var(η_t)`. The lagged covariance is `exp(a Δt) p` and the unconditional variance is `exp(2 a Δt) p + Q_Δt` (Driver et al., 2017, Eq. 3–4, pp. 4–5; JSS has no numbered §2.2). A zero diffusion whose `2 (a Δt)` overflows to `+∞` is not a finite `Var(η_t)`. The stationary within-subject variance is the `Δt → ∞` limit of Eq. 4: `-q / (2 a)` for stable `a < 0` (JSS p. 16 `asymDIFFUSION`; §4.3). When `2 a` is finite, form `q / -(2 a)` so `q / a` overflow does not lose a finite result (`q = MAX`, `a = -0.75` → `MAX / 1.5`). When `2 a` overflows, form `(q / a) * -0.5`. Do not form `0.5 q` first (`q = from_bits(1)` underflows). `a ≥ 0` has no finite stationary variance. Finite-interval `Q_Δt` is not that limit. Trait-plus-state variance is `trait + state` and lagged covariance is `trait + exp(a Δt) p` (Driver et al., 2017, §4.3, p. 9). Trait variance is not process noise and not `asymDIFFUSION`. Evolving the summed variance as if it were all state is not that map. This is not RI-CLPM. Observed-indicator variance is `λ² Var(η) + θ` when `MANIFESTTRAITVAR` is zero and `λ² Var(η) + θ + ψ` otherwise (Driver et al., 2017, Eq. 5, p. 5; Table 2, p. 12). Lagged observed covariance is `λ² cov(η_t, η_{t-1}) + ψ`; `MANIFESTVAR` does not enter. Observed-indicator mean is `τ + λ μ` (Driver et al., 2017, Eq. 5; Table 2, p. 12). `MANIFESTMEANS` is `τ`, not `E(y)`. `E(η)` is not `E(y)`. `CINT` is not `MANIFESTMEANS`. `T0MEANS` is not `E(y)`. The discrete latent mean is `μ_t = exp(a Δt) μ_0 + (exp(a Δt) − 1)/a κ` (Driver et al., 2017, Eq. 3, p. 4; Table 2, p. 12). `T0MEANS` is not `μ_t`. `CINT` is not that discrete increment. A zero drift is `κ Δt`. Underflow of `exp(a Δt)` to `+0` drops the carried `T0MEANS` and keeps `−κ / a`. Equation 1 is the latent SDE, not the measurement model. Form `(λ p) λ` then add `θ`, then add `ψ`. `MANIFESTVAR` is `Θ`, not `Var(y)`. `MANIFESTTRAITVAR` is `Ψ_τ`, not `Θ`. `TRAITVAR` is latent and scaled by `λ²`. `Var(η)` is not `Var(y)`.
- Separate cluster means before within-unit lag. CWC plus an event-time lag is not DSEM. Subtracting the person-specific mean from a raw autoregressive series does not isolate the lagged within-person effect (Curran & Bauer, 2011, pp. 607–608); already-centered residuals with irregular event intervals use the exact scalar map.
- Do not treat the CWC cluster-mean coefficient as the between-cluster effect. It is the contextual effect `between − within` (Enders & Tofighi, 2007, Table 2, pp. 124–127).
- Never use future-available evidence in historical model fits.
- Do not blanket-mask PII when identity/role/linkage is scientifically required. Follow the purpose-bound separation, opaque-ID, encryption, retention, and audit contract in `docs/PRIVACY_DATA_GOVERNANCE.md`.
- Treat documents and LLM outputs as untrusted. Model routing/orchestration may vary reasoning effort, decomposition, recursion and roles, but deterministic/statistical gates remain authoritative.
Expand Down
3 changes: 3 additions & 0 deletions DOCUMENTATION.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,9 @@ TEPP's approved PRD v0.4 and implementation plan are the primary product baselin
| Actions workflow fleet audit | [`docs/operations/ACTIONS_WORKFLOW_FLEET.md`](docs/operations/ACTIONS_WORKFLOW_FLEET.md) |
| Actions fleet research doctoring | [`docs/research/actions-workflow-fleet.md`](docs/research/actions-workflow-fleet.md) |
| Posterior ESEM/DSEM input-gate doctoring | [`docs/research/posterior-esem-input-gates.md`](docs/research/posterior-esem-input-gates.md) |
| Multilevel/event-time recovery doctoring | [`docs/research/multilevel-event-time-recovery.md`](docs/research/multilevel-event-time-recovery.md) |
| Rubin total-variance doctoring | [`docs/research/rubin-total-variance.md`](docs/research/rubin-total-variance.md) |
| Strong-invariance latent-mean doctoring | [`docs/research/strong-invariance-latent-means.md`](docs/research/strong-invariance-latent-means.md) |
| Hourly NIM OpenCode doctoring | [`docs/doctoring/hourly-nim-opencode-development.md`](docs/doctoring/hourly-nim-opencode-development.md) |
| Change history | [`CHANGELOG.md`](CHANGELOG.md) |

Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ crates/corpus_split
crates/tepp_simulation
crates/validation_core
crates/tepp_api
crates/psychometric_core # construct/input gates; not a full ESEM/DSEM estimator
crates/psychometric_core # input gates, CWC/event-time/contextual, irregular residual lag, Rubin T, strong means; not a full ESEM/DSEM estimator
```

## Local verification
Expand Down
2 changes: 1 addition & 1 deletion crates/psychometric_core/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "psychometric_core"
description = "Posterior-aware ESEM/DSEM input gates and CPU f64 loading recovery."
description = "Posterior-aware ESEM/DSEM input gates, multilevel/event-time recovery, CWC contextual effect, Voelkle Eqs. 12 and 14, Rubin T, and strong-invariance latent means."
version.workspace = true
edition.workspace = true
rust-version.workspace = true
Expand Down
Loading
Loading