fix(trash): close active-query invariant leaks (review T5 important #1+#2)
T5 reviewer identified 2 reads outside NoteRepository that were missing the 'WHERE deleted_at IS NULL' filter, breaking the silent invariant beyond the 3 originally-listed methods. - ContinuityService.get() now excludes trashed notes from streak / weekCount / lastNoteAt / recovery-toast math. A trashed note no longer counts toward weekly streak (regression: streak felt fake after trash). - NoteRepository.getPendingCount() now excludes trashed-but-still-pending notes. trash() removes the pending_jobs row but leaves notes.ai_status='pending'; the count would have drifted upward as users trashed pending notes. - MediaGc.run() gets an inline comment documenting why it intentionally does NOT filter — trashed notes still own their media until permanentDelete / emptyTrash. Removing here would defeat restore. Also: migrations.due_date.test.ts had 2 brittle assertions (latestVersion()===2, user_version===2) that broke with v3. Migration-system version assertions belong in migrations.test.ts (already covered there); m002-specific test keeps the due_date column assertion which is version-stable. Tests: 245 → 265 (+20). typecheck 0 errors. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -403,4 +403,14 @@ describe('Active queries exclude deleted notes', () => {
|
||||
expect(note).not.toBeNull();
|
||||
expect(note!.deletedAt).toBe('2026-05-01T00:00:00.000Z');
|
||||
});
|
||||
|
||||
it('getPendingCount() excludes trashed pending notes (drift guard)', () => {
|
||||
const a = repo.create({ rawText: 'a' }).id; // ai_status=pending
|
||||
repo.create({ rawText: 'b' }); // ai_status=pending
|
||||
expect(repo.getPendingCount()).toBe(2);
|
||||
// trash() 가 pending_jobs row 는 정리하지만 notes.ai_status 는 'pending' 그대로.
|
||||
// getPendingCount 가 deleted_at IS NOT NULL 노트 포함하면 영구 over-count.
|
||||
repo.trash(a, '2026-05-01T00:00:00.000Z');
|
||||
expect(repo.getPendingCount()).toBe(1);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user