Convex Retention
Overview
ClawHub retention is code-owned. Every current Convex table must be classified in
convex/lib/retentionPolicy.ts, and ephemeral tables need an indexed, bounded cleanup path unless
their lifecycle is handled by usage-time validation or a documented component.
Checklist
- Read
convex/_generated/ai/guidelines.mdand the Convex ops rules inAGENTS.mdfirst. - Add every new schema table to
RETENTION_POLICIES; theRecord<TableNames, RetentionPolicy>type is the enforcement gate. - For ephemeral tables, prefer an explicit expiration field plus index, then prune with
.withIndex()and.take(...). - For new generic TTL tables, prefer
expirationTimeto match Convex Auth. Keep existingexpiresAt,dayStart, andprocessedAtfields unless that table already needs a real migration. - Use
RETENTION_STANDARD_BATCH_SIZEfor ordinary retention jobs. Keep incident-tested special cases, such asskillStatEvents, on their documented caps. - Cron jobs should schedule bounded cleanup entrypoints only. Large one-off production migrations or
destructive backfills still start with
convex-migration-helper. - Do not bulk-clear active auth state. Expired
authSessionsandauthRefreshTokensare pruned byconvex/retention.ts.
Verification
- Add or update focused tests for policy classification and cleanup behavior.
- Run the focused Vitest slice for touched cleanup modules.
- Run
bunx convex codegenafter schema/API changes. - Run a real Convex runtime check such as
bunx convex dev --once --typecheck=disable.