diff --git a/.claude/rules/push-pipeline.md b/.claude/rules/push-pipeline.md index 83484d0..ee6f341 100644 --- a/.claude/rules/push-pipeline.md +++ b/.claude/rules/push-pipeline.md @@ -23,7 +23,8 @@ The push pipeline lives in `packages/shared/src/push/`. It is invoked by `apps/w ## Cron Entry (apps/web/app/api/cron/push/route.ts) -- `export const dynamic = 'force-dynamic'` + `export const maxDuration = 300` +- `export const maxDuration = 300` (Vercel function timeout) +- No `dynamic = 'force-dynamic'` — incompatible with `cacheComponents: true`; route handlers default to dynamic. - Auth: `Authorization: Bearer ${CRON_SECRET}` verified with `timingSafeEqual` (see `isValidCronSecret`) - 10-minute overlap guard: skips if another run completed in the last 10 minutes - Calls `buildPushJobs(supabase, channelRegistry, dispatchLimit)` and `recordPushRun` diff --git a/.claude/rules/web-patterns.md b/.claude/rules/web-patterns.md index 6739d2f..4173fc1 100644 --- a/.claude/rules/web-patterns.md +++ b/.claude/rules/web-patterns.md @@ -17,6 +17,16 @@ paths: - **x-user-profile header**: `proxy.ts` queries user profile once -> sets header -> `layout.tsx` reads it -> passes to `