Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
d62b759
feat(api): purpose-bound provider payloads refuse identity mappings
seonghobae Aug 13, 2026
dbafebe
test(api): reject impossible provider grant instants
seonghobae Aug 14, 2026
5ebcc36
fix(api): validate provider grants with temporal core
seonghobae Aug 14, 2026
39d547e
chore(ci): verify PR 46 provider time semantics
seonghobae Aug 14, 2026
71cc181
fix(ci): run PR 46 repair when review starts
seonghobae Aug 14, 2026
f86872b
test(api): cover impossible month lengths
seonghobae Aug 14, 2026
6a6a455
fix(ci): preserve PR 46 docs across main merge
seonghobae Aug 14, 2026
bcd4c47
style(api): format provider timestamp regression
seonghobae Aug 14, 2026
97417f3
fix(api): validate provider grant calendar semantics
github-actions[bot] Aug 14, 2026
c296fda
test(api): cover Gregorian century leap-year rules
seonghobae Aug 14, 2026
a0fe7f9
test(api): require append-only reidentification audit evidence
seonghobae Aug 14, 2026
b7aadfd
chore(ci): verify PR 46 reidentification audit repair
seonghobae Aug 14, 2026
f892288
fix(ci): move PR 46 audit repair into a testable script
seonghobae Aug 14, 2026
d5b9b0c
fix(ci): simplify PR 46 audit repair workflow
seonghobae Aug 14, 2026
875608f
test(api): cover reidentification audit outcome wire names
seonghobae Aug 14, 2026
db16da2
fix(ci): complete audited reidentification repair
seonghobae Aug 14, 2026
60c74e1
fix(ci): target constructed disclosure accessors precisely
seonghobae Aug 14, 2026
0256bf4
fix(ci): make repair post-processing indentation-safe
seonghobae Aug 14, 2026
4495835
fix(api): audit elevated reidentification decisions
github-actions[bot] Aug 14, 2026
f0df1cc
test(api): replay every audited reidentification denial
seonghobae Aug 14, 2026
2b9f316
test(api): stage internal reidentification audit digest repair
seonghobae Aug 14, 2026
007ed01
ci: verify PR 46 internal reidentification audit digest
seonghobae Aug 14, 2026
082c050
test(api): require internally bound reidentification audit digests
seonghobae Aug 14, 2026
d621511
fix(ci): normalize audit digest research document EOF
seonghobae Aug 15, 2026
61fe175
fix(api): bind reidentification audit digest internally
github-actions[bot] Aug 15, 2026
7b01546
test(api): bind audit digest to grant decision inputs
seonghobae Aug 15, 2026
3eb52a8
fix(api): pin temporal_core version and cover assert object-ref branch
seonghobae Aug 16, 2026
a543000
ci: re-trigger exact-head checks for PR #46 after thrash cancel
seonghobae Aug 16, 2026
4379a0a
ci: re-trigger exact-head checks for PR #46 after cancel thrash
seonghobae Aug 16, 2026
4368a7f
test(api): lock FIPS 180-4 reidentification digest vector
cursoragent Aug 16, 2026
8af5340
fix(api): clear rebase conflict markers after main restack
seonghobae Aug 16, 2026
cb68f22
test(api): cover provider-payload branch edges for 100% branch CI
seonghobae Aug 16, 2026
7bfc63f
fix(api): cover minimize denial and RFC3339 false edges for branch CI
seonghobae Aug 16, 2026
30a9581
fix(api): simplify RFC3339 UTC gate to close remaining branch gap
seonghobae Aug 16, 2026
09df307
fix(api): drop unreachable audit-digest length Err arm
seonghobae Aug 16, 2026
51b15b6
test(api): cover open-ended grant and reidentify-false branch arms
seonghobae Aug 16, 2026
835922c
fix(api): split oversized disclose fail-closed test for clippy
seonghobae Aug 17, 2026
20b654d
ci: re-queue exact-head review for PR #46 after OpenCode REQUEST_CHANGES
seonghobae Aug 17, 2026
226d362
ci: re-queue exact-head OpenCode after sticky REQUEST_CHANGES
seonghobae Aug 17, 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
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ All notable changes to TEPP are documented here. The format follows Keep a Chang

### Added

- `tepp_api` purpose-bound provider-payload minimization: time-bounded `PurposeGrant` evaluation, fail-closed expired/not-yet-valid/inverted/cross-tenant/impossible-calendar denial, semantic UTC calendar validation, refusal to copy identity mappings into model-provider payloads or ordinary logs, preservation of opaque analytical identifiers and membership roles (no blanket PII mask), a separately authorized scientific re-identification path, and an internally bound FIPS 180-4 SHA-256 audit digest appended through `ReidentificationAuditSink` before disclosure.
- `persistence_postgres` retention/deletion/legal-hold (migration `0007`): policy rows, legal holds that block completed deletion, evidence tombstones without raw-source restore, analysis exclusion only for `logical_revocation`/`identity_tombstone` (not `cache_export_removal`), and deletion requests bound to the cited retention policy's tenant/class/purpose.
- `persistence_postgres` backup/restore integrity: restored snapshots stay unusable until tenant, canonical `SHA-256`, knowledge-cutoff eligibility, temporal window order, and append-only triggers revalidate; SQL probes raise `restore integrity failed` (ADR 0013).
- `persistence_postgres` concurrent document-write stress: atomic revise `DO` block that requires exactly one open `system_to` close, SQLSTATE mapping onto `ConcurrentWriteConflict` / `DuplicateDocumentRecord`, and live multi-session insert/revise/append-only proofs. No new migration number.
Expand Down
2 changes: 2 additions & 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 @@ -34,6 +34,7 @@ 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) |
| Retention/deletion/legal-hold doctoring | [`docs/research/retention-deletion-legal-hold.md`](docs/research/retention-deletion-legal-hold.md) |
| Provider-payload minimization doctoring | [`docs/research/provider-payload-minimization.md`](docs/research/provider-payload-minimization.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
1 change: 1 addition & 0 deletions crates/persistence_postgres/src/artifact_sql.rs
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,7 @@ mod tests {
assert_source_artifact_matches_sql(&with_ref).expect("referenced assertion");
assert!(referenced_assertion.contains("s3://tepp/object"));
assert!(referenced_assertion.contains("IS NOT DISTINCT FROM 's3://tepp/object'"));
assert!(referenced_assertion.contains("protected_object_ref IS NOT DISTINCT FROM"));

assert_eq!(
insert_source_artifact_sql(&SourceArtifactRecord {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -177,4 +177,11 @@ fn assert_sql_requires_every_stored_field_to_match() {
assert!(sql.contains("protected_object_ref IS NOT DISTINCT FROM"));
assert!(sql.contains("system_time"));
assert!(sql.contains("available_time"));
assert!(sql.contains("NULL"));

let mut with_ref = artifact();
with_ref.protected_object_ref = Some("s3://tepp/evidence/object".into());
let referenced = assert_source_artifact_matches_sql(&with_ref).expect("assert-ref");
assert!(referenced.contains("s3://tepp/evidence/object"));
assert!(referenced.contains("protected_object_ref IS NOT DISTINCT FROM"));
}
2 changes: 2 additions & 0 deletions crates/tepp_api/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ publish = false
[dependencies]
serde = { workspace = true }
serde_json = { workspace = true }
sha2 = { workspace = true }
temporal_core = { path = "../temporal_core", version = "0.1.0" }

[lints]
workspace = true
23 changes: 23 additions & 0 deletions crates/tepp_api/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ mod envelope;
mod error;
mod export;
mod naruon_http;
mod provider_payload;
mod wire;

/// Analysis-run contract version constant.
Expand Down Expand Up @@ -66,3 +67,25 @@ pub use naruon_http::naruon_analysis_run_exchange_with_headers;
pub use naruon_http::naruon_export_exchange;
/// Refuse lexical heuristics as TEPP inference claims.
pub use naruon_http::naruon_may_claim_tepp_inference;
/// Elevated re-identification result.
pub use provider_payload::DisclosedIdentityMapping;
/// Separately protected identity mapping.
pub use provider_payload::IdentityMappingRecord;
/// Minimized provider payload without direct identity.
pub use provider_payload::MinimizedProviderPayload;
/// Log-safe provider disclosure record.
pub use provider_payload::ProviderDisclosureLog;
/// Evidence offered to a model provider.
pub use provider_payload::ProviderEvidenceOffer;
/// Time-bounded purpose grant.
pub use provider_payload::PurposeGrant;
/// Redacted re-identification decision outcome.
pub use provider_payload::ReidentificationAuditOutcome;
/// Redacted append-only re-identification audit record.
pub use provider_payload::ReidentificationAuditRecord;
/// Append-only persistence port for re-identification audit evidence.
pub use provider_payload::ReidentificationAuditSink;
/// Disclose a mapping on the elevated scientific path.
pub use provider_payload::disclose_identity_mapping;
/// Minimize evidence for a model provider.
pub use provider_payload::minimize_provider_payload;
Loading
Loading