feat: complete TASK-WP1-06 audit immutability

This commit is contained in:
suyx
2026-07-28 19:29:24 +08:00
parent 2358f97e5c
commit 59e566885b
9 changed files with 487 additions and 125 deletions
@@ -41,8 +41,8 @@ describe("TDD-WP1-DEL-002 retention worker", () => {
const anonymousExpiry = baseNow + 2_000;
service.database.prepare(`
INSERT INTO private_content_access_logs (log_id, actor_ref, subject_ref, target_ref, content_type, occurred_at, expires_at)
VALUES (?, 'admin-fixture', ?, ?, 'prompt', ?, ?)
`).run(randomUUID(), randomUUID(), randomUUID(), baseNow - 10_000, accessExpiry);
VALUES (?, ?, ?, ?, 'prompt', ?, ?)
`).run(randomUUID(), randomUUID(), randomUUID(), randomUUID(), accessExpiry - 180 * 86_400_000, accessExpiry);
service.database.prepare(`
INSERT INTO anonymous_retained_events (
event_id, anonymous_subject_id, event_type, model_id, outcome, error_category,
@@ -54,13 +54,13 @@ describe("TDD-WP1-DEL-002 retention worker", () => {
expect(() => service.database.prepare("DELETE FROM private_content_access_logs").run()).toThrow();
const early = new RetentionCleanup({ clock: () => baseNow, databasePath });
expect(early.purgeExpired()).toEqual({ anonymous_events: 0, private_access_logs: 0 });
expect(early.purgeExpired()).toEqual({ admin_operation_logs: 0, anonymous_events: 0, private_access_logs: 0 });
early.close();
const firstExpiry = new RetentionCleanup({ clock: () => accessExpiry, databasePath });
expect(firstExpiry.purgeExpired()).toEqual({ anonymous_events: 0, private_access_logs: 1 });
expect(firstExpiry.purgeExpired()).toEqual({ admin_operation_logs: 0, anonymous_events: 0, private_access_logs: 1 });
firstExpiry.close();
const secondExpiry = new RetentionCleanup({ clock: () => anonymousExpiry, databasePath });
expect(secondExpiry.purgeExpired()).toEqual({ anonymous_events: 1, private_access_logs: 0 });
expect(secondExpiry.purgeExpired()).toEqual({ admin_operation_logs: 0, anonymous_events: 1, private_access_logs: 0 });
secondExpiry.close();
writeEvidence({