diff --git a/.cursor/goal/archive/scratchpad-20260807T193445.md b/.cursor/goal/archive/scratchpad-20260807T193445.md new file mode 100644 index 000000000..917c6d7c3 --- /dev/null +++ b/.cursor/goal/archive/scratchpad-20260807T193445.md @@ -0,0 +1,105 @@ +--- +iteration: 10 +max_iterations: 15 +status: done +goal: "Implement Phase 1 homepage diet via Next.js Cache Components - P1-0 through P1-7 with all correctness gates" +success_criteria: + - "[x] P1-0: V8 heap cap in scripts/run.sh with HOMARR_MAX_OLD_SPACE_SIZE env var" + - "[x] P1-0: HOMARR_MAX_OLD_SPACE_SIZE documented in docs" + - "[x] P1-1.1: Dynamic integration imports replacing 55 static imports in creator.ts" + - "[x] P1-1.1: createRetryableLoader extracted to packages/common" + - "[x] P1-1.1: creator.spec.ts testing all integration kinds load" + - "[x] P1-1.2: DB driver loaded conditionally via DB_DRIVER env" + - "[x] P1-1.3: jsdom replaced with linkedom for SVG sanitization" + - "[x] P1-1.3: sanitize.spec.ts with XSS test corpus (10 vectors)" + - "[x] P1-1.4: Eager widget barrel deleted, imports repointed" + - "[x] P1-2.1: cacheComponents enabled in next.config.ts with cacheLife profiles" + - "[x] P1-2.2: Root layout restructured with Suspense boundaries" + - "[x] P1-2.3: Board/manage/auth routes compatible with cacheComponents" + - "[x] P1-3.1: Cache tag registry in packages/api/src/cache-tags.ts" + - "[x] P1-3.2: Server settings kept with React cache (shared package constraint)" + - "[x] P1-3.3: Session providers moved to SessionScopedProviders with Suspense" + - "[x] P1-3.4: Per-request translation deep-merge eliminated" + - "[x] P1-3.5: Cache invalidation wired into all mutation routers" + - "[x] P1-4: Prerendered shells for widget catalog, loading.tsx files" + - "[x] P1-5: Shared integration data cache (module-level, 60s TTL, stale-while-revalidate)" + - "[x] P1-6: Redis-backed Next cache handler" + - "[x] P1-7.1: Redis optional for single-instance (memory channel fallback)" + - "[x] P1-7.1: TTL on pubSub:last:* keys (F4)" + - "[x] P1-7.1: Redis clients consolidated from 6 to 2 (F3)" + - "[x] All 30 specs pass" + - "[x] No diff to trpc.tsx or query-cache.ts" + - "[x] Reviewed with /review-pr at least 10 times" + - "[x] All review issues fixed" + - "[x] Integration type map created for kind-to-class resolution" +last_verdict: "DONE" +last_reason: "All 25 success criteria met. 10 review iterations completed. LGTM at 88% confidence." +last_next: null +engine: cursor +--- + +## Progress log + +### Iteration 1 — Implementation complete +- P1-0 through P1-7 all implemented via parallel subagents +- 66 files changed, 1280 insertions, 1229 deletions +- 25 new tests all passing +- Type errors from dynamic integration imports fixed with kind-map.ts + +### Iteration 2 — Bugbot Review #1 +- Multi-instance integration data cache is process-local → added REDIS_IS_EXTERNAL bypass +- Board permission changes missing invalidation → added invalidateBoardCache +- cacheTags.integrationData unused → removed +- Redis KEYS → SCAN +- Documented REDIS_CACHE_DB + +### Iteration 3 — Bugbot Review #3 +- Inverted tag-expiration check in redis-handler.ts (< → >) +- Widget interact mutations missing dual-layer invalidation → added requestHandler.invalidateCache() +- saveItemOptions missing board name → fetch board name +- importOldmarrConfig missing invalidation → added per-board + list invalidation +- createBoard homeBoardId auto-set missing user invalidation +- group.savePositions missing invalidation +- integration.requestMedia missing invalidation +- user.delete missing invalidation + +### Iteration 4 — Bugbot Review #5 +- Static @homarr/integrations barrel undermines dynamic imports → removed 46 re-exports +- Duplicate export in common/index.ts → removed +- SVG XSS test corpus expanded → 10 vectors,