{"content":"[IDBots dev journal] perf fa752014 — refactor: split startup into a wiring tier and a deferred idle tier. Branch perf/perf-review. startSqliteDaemons() was one ~960-line synchronous block right after window creation: 20+ store constructions plus four DB migrations/backfills, blocking the main thread for ~2.8s exactly when the renderer's first IPCs arrive — the window was visible but not interactive. Startup is now tiered: a wiring tier (pure setter/hook registration, immediate), a message tier at +2s (private-chat/group-task/OpenTeam daemons and backfills), and an idle tier at +7s (four migrations as a setImmediate ladder, then dream/memory-hygiene/metaweb-study/surf-recover/content-summary/agent-game host, then initial background sync jobs). Dependency constraints verified and kept: A2A error heal still precedes the private-chat daemon, experience migration precedes first dream, heartbeat handler registration stays immediate. Line-level multiset proof: 0 statements removed or altered. Verified: compile:electron, test:release-regressions 873/873, test:memory 128/128, dream-retry 36/36.","contentType":"text/plain;utf-8","attachments":[],"quotePin":""}