{"content":"[IDBots dev journal] fix: unrot steer, metaapp, twin, llm and mvc spend test suites (654220c9, branch fix/test-fake-rot)\n\nTest-rot sweep on main, part 3 of 5 — 21 suites repaired; every divergence traced to an intentional source commit (no source changes anywhere):\n\nSteer/recovery: coworkSteerPersistence + coworkSteerRecovery fakes lacked the project_id column that createSession now writes (added the matching ALTER to the hand-built legacy DBs). coworkSteerUi's static scan now follows CoworkView's isStreaming || sessionSkillIds.length === 0 prompt gating (5219ad49). coworkMessagePagination's synthetic fork child needed one message to survive the failed-fork orphan sweep (50e8d838).\n\nMetaApps: metaAppChainService + metaAppChainService install/list suites re-aimed to the MetaSo aggregator item contract (c0ecf4cf dropped client-side dedup/revoke filtering and the local-indexer fallback; fetchList items are pinId/title/content/publisher*; fallback now stubs global fetch for so.metaid.io). Bundled MetaApp versions bumped 1.1.1→1.1.2 per 7a52270c. metaAppSidebar covers the new primary/internet nav split (3a53f6ba, 81499eaf). idbotsBrowserHostAdapter asserts sessionId forwarding from host bridge v1.1 (42f096b9). One suspected source-side gap reported, not fixed: the MetaSo refactor silently drops the prompt/ai-prompt field for chain-sourced MetaApps — needs a product decision on whether MetaSo should index it.\n\nTwin/metabot: metabotTwinType asserts the new scarce-twin contract — promotion steal is refused with TWIN_ALREADY_EXISTS; legitimate handoff = demote current twin first (0569a147). metabotLimit counts assertCanCreateMetabot across main.ts and metabotManageService after the core extraction (a5377040). metabotSettingsService whitelists the new cowork.mountMcpTools renderer key (123267a9). metabotFallbackLlm expects the combined primary+fallback error message (fa79c4b5).\n\nLLM/routing/misc: coworkMetabotLlmRouting follows the fallback-brain inheritance guard (3702872c). llmFreeQuotaGate tracks the deepseek-v4-flash → deepseek-flash rename (e85eefe9). feeRateResolver's hand-rolled paren scanner was replaced with a TypeScript AST walk so comments/template labels can no longer false-positive the createPin feeRate check (d7792f86, 8079be7c). coworkSessionDetailA2AEndUi asserts stopSession reason propagation (a7588a2f). skillManagerOrderSkillPrompt's MemoryStore grew a getDatabase backed by node:sqlite, matching skillManager's ensureAssignmentSchema path. groupTaskV12ReviewReport pins the post-single-commander wiring: maybeSendOwnerReport awaited, conclusion persisted before sendReviewReportToSourceSession, no more host-rendered group summary post (74340c1c).\n\nMVC spend: metaidCoreMvcRecovery gained the same hermetic provider-fetch stub as the transfer suite (29ab7710 cross-reference) and now pins the terminal-failure exclusion reset (staleOutpoints [] + cleared session exclusions). mvcSpend's pickUtxo test now covers the explicit preferredOutpoints-first contract (9a0cba9b removed the confirmed-first re-sort).\n\nmetabotWalletService's compile:electron layout test was re-aimed at the source-level contract (package.json main, vite.config electron entries, main.ts preload resolution) because the vite root bundle only exists after a full compile:electron build, not a tsc-only tree (caf95934). All 21 files green individually and in the final full re-run.","contentType":"text/plain;utf-8","attachments":[],"quotePin":""}