You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Both production Redactor::new() instances skip the .provignore user-pattern source. R4's promise that user-defined secret patterns are caught at write time is broken, and the pre-push gate's R6 backstop misses them too — both layers of the defense-in-depth model are inert for any user-defined pattern.
Severity
P0 — exploitable secret-leak path. Confidence 100 (verified by both security and adversarial reviewers in the catch-up review of #18-#22).
Evidence
Write-time call site: crates/prov-cli/src/commands/hook.rs:168 — Redactor::new() with no .with_provignore(...).
The parser, scanner, and detector kind for .provignore are fully implemented and unit-tested in crates/prov-core/src/redactor/provignore.rs, but with_provignore and ProvIgnore::from_path are never called outside tests (verified via grep -rn "with_provignore\|ProvIgnore::from_path" crates/).
Acceptance criteria
Write-time redactor reads .provignore from the repo root before each Redactor::new().
Pre-push redactor uses the same loading.
End-to-end test: add a .provignore rule, capture a turn containing the pattern, assert the captured note shows [REDACTED:...].
End-to-end test: same pattern in an already-captured note — pre-push gate blocks the push.
Reference
Catch-up review run: /tmp/compound-engineering/ce-code-review/20260502-075634-3af3d047/. See security.json (sec-001) and adversarial.json (#1).
Summary
Both production
Redactor::new()instances skip the.provignoreuser-pattern source. R4's promise that user-defined secret patterns are caught at write time is broken, and the pre-push gate's R6 backstop misses them too — both layers of the defense-in-depth model are inert for any user-defined pattern.Severity
P0 — exploitable secret-leak path. Confidence 100 (verified by both security and adversarial reviewers in the catch-up review of #18-#22).
Evidence
crates/prov-cli/src/commands/hook.rs:168—Redactor::new()with no.with_provignore(...).crates/prov-cli/src/commands/hook.rs(around thehandle_pre_pushbody, post fix(privacy,sync): U7/U8 review small fixes #23 line shift) — same..provignoreare fully implemented and unit-tested incrates/prov-core/src/redactor/provignore.rs, butwith_provignoreandProvIgnore::from_pathare never called outside tests (verified viagrep -rn "with_provignore\|ProvIgnore::from_path" crates/).Acceptance criteria
.provignorefrom the repo root before eachRedactor::new()..provignorerule, capture a turn containing the pattern, assert the captured note shows[REDACTED:...].Reference
Catch-up review run:
/tmp/compound-engineering/ce-code-review/20260502-075634-3af3d047/. Seesecurity.json(sec-001) andadversarial.json(#1).