Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
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 ARCHITECTURE.md
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,8 @@ boundaries above remain the target modular MSA architecture.
| `location_membership` | location is not entity identity and not a language channel |
| `validation_core` | RMSE, bias, coverage, graph, Monte Carlo, and exact-head claim-promotion metrics |
| `tepp_api` | versioned DTO, schema, and export contracts |
| `episode_membership` | event-time episode membership containment gate |
| `location_membership` | location is not entity identity and not a language channel |
| `prompt_source` | prompt boilerplate is not unique latent content and not stopword deletion |
| `corpus_background` | corpus-background wording is not unique latent content and not stopword deletion |
| `modality_source` | non-lexical modality is not unique latent content and not stopword deletion |
Expand Down
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,9 @@ All notable changes to TEPP are documented here. The format follows Keep a Chang
- `psychometric_core` posterior-aware structural input gates: construct classification, refusal of raw-proportion Pearson/OLS, explicit ALR-versus-ILR geometry boundaries, CPU `f64` OLS recovery, posterior-draw loading point-estimate averaging without Rubin uncertainty claims, invariance-gated latent-mean comparison, and causal-heuristic refusal (ADR 0005 first production slice; no new migration).
### Added

- `episode_membership` identity gate: a document's episode membership cannot
start before or end after the episode event-time interval; recovered
containment flags are compared with known truth (ADR 0003).
- `tepp_simulation` cutoff eligibility: delayed-reporting documents are excluded when `available_time` exceeds the knowledge cutoff, with recovered eligible counts matching known truth.
- `topic_measurement` bounded deterministic CPU `f64` TRSL-TM reference estimator: canonical CSR/CSC inputs, cutoff-safe documents, standardized event time, weighted multiple memberships, prevalence covariates, explicit predecessor/successor regularization, multi-seed generalized EM, diagonal Laplace uncertainty, and fitted topic-lineage counts with known-truth RMSE plus exact line/branch coverage (ADR 0012; no persistence or accelerated-backend claim).
- `topic_measurement` logistic-normal additive log-ratio and sequential Egozcue isometric log-ratio coordinates: fail-closed simplex validation, max-shifted stable ALR/ILR inverses with true-parameter RMSE, pairwise CLR Aitchison distance recovered by ILR Euclidean isometry for valid composition pairs, and refusal of TF-IDF/BM25/keyword scores as inferential topic coordinates (ADR 0012 first production slice; no new migration).
Expand Down
99 changes: 50 additions & 49 deletions Cargo.lock

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

2 changes: 2 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ members = [
"crates/interpretation_gateway",
"crates/model_selection",
"crates/checkpoint_authority",
"crates/episode_membership",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 episode_membership listed twice in workspace manifest

crates/episode_membership is added to members while the same path already exists a couple lines below, and the same duplication is repeated in default-members. The crate is registered twice in both lists.

Suggested change
"crates/episode_membership",
"crates/compute_backend",
Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

"crates/compute_backend",
"crates/episode_membership",
"crates/membership_target",
Expand Down Expand Up @@ -107,6 +108,7 @@ default-members = [
"crates/interpretation_gateway",
"crates/model_selection",
"crates/checkpoint_authority",
"crates/episode_membership",
"crates/compute_backend",
"crates/episode_membership",
"crates/membership_target",
Expand Down
26 changes: 25 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,29 @@ evidence, six-clock temporal values, event mentions/instances, relations,
membership, persistence, splits, simulation, validation, API DTOs, and the
predicted-versus-observed promotion gate.
This branch establishes the Rust workspace, quality-gate foundation, and the
longitudinal within/between decomposition capability. The eleven bounded crates
longitudinal within/between decomposition capability. The workspace bounded crates
compile independently. `longitudinal_core` exposes within/between decomposition
and component RMSE APIs; the remaining crates expose no placeholder production
APIs, and domain behavior for them begins in Task 2 with immutable evidence
identifiers and source records.
This branch establishes the Task 1 Rust workspace and quality-gate foundation.
The workspace bounded crates compile independently but intentionally expose no
The workspace bounded crates compile independently; Task 1 includes the
The twelve bounded crates compile independently but intentionally expose no
The eleven bounded crates compile independently; Task 1 includes the
implemented `encrypted_mapping` crate with AES-256-GCM sealing and
purpose-bound opening, while the remaining domain behavior begins in Task 2
with immutable evidence identifiers and source records.
The workspace bounded crates compile independently. `derived_sensitivity` inherits
source Restricted/Internal classes onto topic, factor, and relation artifacts
and fails closed on unknown kinds; derivation and blanket PII masking are not
declassification. Other crates still begin domain behavior in Task 2 with
immutable evidence identifiers and source records.
The workspace bounded crates compile independently but intentionally expose no
Comment on lines +43 to +55

@devin-ai-integration devin-ai-integration Bot Aug 25, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📝 Info: Dangling duplicated README paragraphs

README.md gains several truncated, duplicated sentence fragments (e.g. "The workspace bounded crates compile independently but intentionally expose no") from the same merge that duplicated the crate registrations. Documentation cleanup, not a code bug.

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.


The eleven bounded crates compile independently but intentionally expose no
placeholder production APIs. Domain behavior begins in Task 2 with immutable
evidence identifiers and source records.
This branch establishes the Rust workspace and quality-gate foundation. The
bounded crates compile independently. Domain crates expose only validated
production APIs; placeholder surfaces are prohibited.
Expand Down Expand Up @@ -78,6 +96,12 @@ crates/operational_log
crates/outcome_order
crates/payload_bound
crates/persistence_postgres
crates/corpus_split
crates/tepp_simulation
crates/validation_core
crates/tepp_api
crates/episode_membership
Comment thread
coderabbitai[bot] marked this conversation as resolved.
crates/location_membership
crates/prediction_contradiction
crates/prompt_source
crates/provider_receipt
Expand Down
6 changes: 6 additions & 0 deletions crates/episode_membership/src/window.rs
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,12 @@ pub fn identity_recovery_rate(
if truth.is_empty() || truth.len() != decided.len() {
return Err(EpisodeMembershipError::InvalidEpisodePayload);
}
let matches = truth
.iter()
.zip(decided)
.filter(|(truth_flag, decided_flag)| truth_flag == decided_flag)
.count();
Ok(matches as f64 / truth.len() as f64)
let matches = count_matching_decisions(truth.iter().copied().zip(decided.iter().copied()));
Ok(recovery_rate_from_tally(matches, truth.len()))
Comment on lines +75 to 82

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔴 Duplicated body in recovery-rate function breaks the build

identity_recovery_rate computes and returns the rate inline, then a leftover second copy of the computation follows that return expression. The inline Ok(...) has no semicolon before the following let, so the crate fails to compile.

Suggested change
let matches = truth
.iter()
.zip(decided)
.filter(|(truth_flag, decided_flag)| truth_flag == decided_flag)
.count();
Ok(matches as f64 / truth.len() as f64)
let matches = count_matching_decisions(truth.iter().copied().zip(decided.iter().copied()));
Ok(recovery_rate_from_tally(matches, truth.len()))
let matches = count_matching_decisions(truth.iter().copied().zip(decided.iter().copied()));
Ok(recovery_rate_from_tally(matches, truth.len()))
Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

}
Expand Down
Loading
Loading