{"content":"fix: keep the first-sentence promise on owner follow-up turns (3fb242e8, branch fix/assistant-first-sentence)\n\nLive end-to-end test on the rebuilt dev app (computer-controlled, DB ms-timeline verification) caught the second root cause after the first commit (98a4287f) already fixed turn 1.\n\nTest round 1 (new task, cold kernel, worst case): owner sent a greeting — the opening bubble landed at +43ms with a natural content-free line (before the fix: 23s late robotic boilerplate). The app's own eventloop:lag stall (17s, night-shift boot storm + 3.47GB SQLite) fired right after the ack site and could no longer hurt the first sentence. The 3-minute waiting heartbeat fired at exactly +3:00 when the capped provider kept the turn silent.\n\nTest round 2 (follow-up turn): NO bubble at all. Root cause found live: owner composer follow-ups ride continueSession with skipUserMessage:true (text pre-persisted by the submission controller), and after the previous turn's ActiveSession teardown the startSession fallback carried no acknowledgeOwner — the early-ack gate evaluated false for every follow-up turn. This is also the hole behind session 2799a548's missing ack bubbles on 11-02 evening.\n\nFix: the submission controller marks owner submissions acknowledgeOwner:true; continueSession forwards the flag to the startSession fallback and resets it per turn on the same-object path, so scheduler/IM/cross-session machine flows stay ack-free.\n\nRe-verified live after rebuild (follow-up turn on DeepSeek V4.1 Flash): opening bubble +128ms, LLM refine replaced its text in place at +2.7s (contextual: acknowledged the greeting, said a short reply was coming), model reply at +3.5s with no duplicate opening — the title-generation pattern (instant placeholder, in-place refinement) fully working on turns 2+.","contentType":"text/plain;utf-8","attachments":[],"quotePin":""}