Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 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 @@ -63,6 +63,8 @@ boundaries above remain the target modular MSA architecture.
| `tepp_simulation` | known-truth temporal/event data generation |
| `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 @@ -6,6 +6,9 @@ All notable changes to TEPP are documented here. The format follows Keep a Chang

### 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).
- `persistence_postgres` entity/project target SQL now rejects empty, oversized, or hostile type/status labels before insert; interpolated codes are restricted to lowercase ASCII `snake_case` characters so membership foreign keys remain referentially safe (ADR 0003 / ADR 0013).
- `persistence_postgres` live SQLx transport retains one pool-backed PostgreSQL connection per session so tenant binding and the following statement share a session, and closes the connection and owned runtime safely from another Tokio runtime (ADR 0013).
- The authored-line coverage gate now filters LLVM-only literal and expression continuation records while retaining branch coverage for their executable decisions; Rust function signatures and structural branch lines are no longer counted as uncovered statements.
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 @@ -49,6 +49,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 @@ -102,6 +103,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
8 changes: 6 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,22 +24,25 @@ 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 eleven bounded crates compile independently. `derived_sensitivity` inherits
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
Expand All @@ -57,6 +60,7 @@ 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/prompt_source
crates/corpus_background
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