Skip to content
Draft
Show file tree
Hide file tree
Changes from 1 commit
Commits
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: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ All notable changes to TEPP are documented here. The format follows Keep a Chang

## [Unreleased]

- **Method-effects analysis-run profile**: `analysis_engine` binds existing `tepp_simulation::generate` and `refuse_unavailable_document` to cutoff-safe `method_effects_v1` (`tepp.method_effects.v1`) with inference status `simulation_method_effect_labels_not_estimator_model`. Not an estimator-side method model, not GPU, not MCMC, and not topic birth/split/merge.

- `event_core` adds bounded Allen interval-consistency classification, atomic path-consistency closure, contradiction/resource refusals, and an explicit dependency-error fallback without claiming unrestricted global satisfiability.

- `psychometric_core` recovers the Driver, Oud, and Voelkle (2017, Table 2, p. 12 `MANIFESTTRAITVAR`; §7.1, p. 19; p. 16 `MANIFESTTRAITVARstd`; footnote 4; 2017-era ctsem `summary.ctsemFit.R`; JSS PDF re-opened 2026-08-27T14:20Z from https://www.jstatsoft.org/index.php/jss/article/download/v077i05/1104) scalar standardised manifest-trait variance on current main after `0ce16e8` dropped the pre-consolidation code while research notes already named the map (register items 83–84). Table 2 names `MANIFESTTRAITVAR` `Ψ_τ` the additional time-invariant variance-covariance on the measurement level and sets it `NULL` when there is no manifest trait. Equation 5 writes `Γ ~ N(τ, Ψ)` and names that covariance the manifest traits. Section 7.1 names manifest traits stable individual differences in indicator levels, distinct from process-level `TRAITVAR` `φ_ξ`. Page 16 prints standardised matrices with the suffix `std` when appropriate. The printed example on p. 16 is `discreteDRIFTstd`, not `MANIFESTTRAITVARstd`. Footnote 4 standardises using only the relevant variance, not the total. The relevant variance for that named indicator-level correlation is `MANIFESTTRAITVAR`, not process-level `TRAITVAR` and not residual `MANIFESTVAR` `θ`. The 2017-era source forms `MANIFESTTRAITVARstd` only when `MANIFESTTRAITVAR != 0`, as `solve(sqrt(diag(MANIFESTTRAITVAR) + ridging)) %&% MANIFESTTRAITVAR` when `verbose = TRUE`. OpenMx `%&%` is `t(A) %*% B %*% A`. Unlike `TRAITVARstd`, that formation adds `diag(c(ridging), n.manifest)`. The default `ridging = FALSE` adds 0, not `0.0001`; that ridge is a numerical hack and is not this exact map. The scalar correlation is `ψ / ψ = 1` after strictly positive `MANIFESTTRAITVAR`. Form strictly positive `ψ` first, then `1 / √ψ`, then `(1 / √ψ) ψ (1 / √ψ)`. Unstandardised `MANIFESTTRAITVAR` is defined for a zero trait; standardised `MANIFESTTRAITVAR` is not. Zero `MANIFESTTRAITVAR` skips forming `MANIFESTTRAITVARstd` in the 2017-era source and fails closed here. Indicator-level trait variance is an event-time structural quantity, so a non-event clock fails closed. `MANIFESTTRAITVAR` does not require stable `a < 0`. Distinct positive `ψ` recover the same 1. `trait / trait = 1` is `TRAITVARstd` and recovers the same number and remains a distinct named quantity. `θ` is `MANIFESTVAR` and is measurement error, not this correlation. Meredith (1993) remains unread (web search 2026-08-27T14:20Z: Springer/Cambridge Core paywalled; Unpaywall historically `is_oa: false`; Springer `content/pdf` is an HTML stub). Mislevy (1991, *Psychometrika, 56*, 177–196) remains unread on the same terms (DOI `10.1007/bf02294457`). Still not a Kalman filter, not a matrix `expm`, not ESEM estimation, not DSEM, and not ctsem estimation.
Expand Down
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions DOCUMENTATION.md
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ TEPP's approved PRD v0.4 and implementation plan are the primary product baselin
| Hourly NIM OpenCode doctoring | [`docs/doctoring/hourly-nim-opencode-development.md`](docs/doctoring/hourly-nim-opencode-development.md) |
| Analysis engine v1 doctoring | [`docs/doctoring/analysis-engine-v1.md`](docs/doctoring/analysis-engine-v1.md) |
| Analysis engine gap-closure doctoring | [`docs/doctoring/analysis-engine-gap-closure.md`](docs/doctoring/analysis-engine-gap-closure.md) |
| Method-effects analysis-run doctoring | [`docs/doctoring/method-effects-analysis-run.md`](docs/doctoring/method-effects-analysis-run.md) |
| Corpus-split leakage-audit wire doctoring | [`docs/research/corpus-split-manifest-wire.md`](docs/research/corpus-split-manifest-wire.md) |
| Unicode canonical-identity doctoring | [`docs/research/unicode-canonical-identity.md`](docs/research/unicode-canonical-identity.md) |
| Change history | [`CHANGELOG.md`](CHANGELOG.md) |
Expand Down
2 changes: 2 additions & 0 deletions crates/analysis_engine/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,12 @@ serde_json = { workspace = true }
sha2 = { workspace = true }
tepp_api = { path = "../tepp_api", version = "0.2.0" }
temporal_core = { path = "../temporal_core", version = "0.2.0" }
tepp_simulation = { path = "../tepp_simulation", version = "0.2.0" }
topic_measurement = { path = "../topic_measurement", version = "0.2.0" }
uuid.workspace = true

[dev-dependencies]
tepp_simulation = { path = "../tepp_simulation", version = "0.2.0" }
Comment thread
devin-ai-integration[bot] marked this conversation as resolved.
Outdated
corpus_split = { path = "../corpus_split", version = "0.2.0" }
membership_core = { path = "../membership_core", version = "0.2.0" }
relation_graph = { path = "../relation_graph", version = "0.2.0" }
Expand Down
14 changes: 14 additions & 0 deletions crates/analysis_engine/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

mod case_deletion_refit;
mod lineage_criterion;
mod method_effects_artifact;
mod topic_context_posterior;
mod topic_lineage_artifact;

Expand Down Expand Up @@ -46,6 +47,12 @@ pub use lineage_criterion::{
LineageCriterionFit, LineageCriterionFitError, LineageCriterionObservation,
fit_lineage_criterion_posteriors,
};
/// Method-effect census artifact and execution contracts from this engine.
pub use method_effects_artifact::{
METHOD_EFFECTS_ARTIFACT_BYTE_LIMIT, METHOD_EFFECTS_ARTIFACT_SCHEMA_VERSION,
METHOD_EFFECTS_MODEL_CONTRACT_VERSION, METHOD_EFFECTS_OUTPUT_PROFILE, MethodEffectsArtifact,
MethodEffectsExecution, execute_method_effects_run,
};
/// Bounded posterior topic-context producer contract and record types.
pub use topic_context_posterior::{
TOPIC_CONTEXT_POSTERIOR_BYTE_LIMIT, TOPIC_CONTEXT_POSTERIOR_SCHEMA_VERSION,
Expand Down Expand Up @@ -248,6 +255,8 @@ pub enum AnalysisEngineError {
TopicMeasurement(TopicMeasurementError),
/// A topic-lineage artifact violated its bounded schema or count invariants.
InvalidTopicLineageArtifact,
/// A method-effects artifact violated its bounded schema or count invariants.
InvalidMethodEffectsArtifact,
}

impl fmt::Display for AnalysisEngineError {
Expand All @@ -262,6 +271,7 @@ impl fmt::Display for AnalysisEngineError {
Self::LimitExceeded => "analysis corpus exceeded its execution bound",
Self::TopicMeasurement(error) => return error.fmt(formatter),
Self::InvalidTopicLineageArtifact => "invalid topic lineage artifact",
Self::InvalidMethodEffectsArtifact => "invalid method-effects artifact",
};
formatter.write_str(message)
}
Expand Down Expand Up @@ -681,6 +691,10 @@ mod tests {
AnalysisEngineError::InvalidTopicLineageArtifact,
"invalid topic lineage artifact",
),
(
AnalysisEngineError::InvalidMethodEffectsArtifact,
"invalid method-effects artifact",
),
];
for (error, message) in messages {
assert_eq!(error.to_string(), message);
Expand Down
Loading
Loading