readerEnabled was only honored on the attach path. The normal first launch spawns its own Core and returned from start() without calling startReader(), so the read-only Reader never ran: no reader_port in the receipt and every read fell back to Core. Start the Reader after every successful owned start (first launch, race recovery and relaunch). Clear readerChild when it exits so a later restart can spawn a fresh one, and stop the old Reader before a relaunch. Add a public-start regression using fake child processes. Co-authored-by: qiye.sjh <shijiahao_0802@youzan.com> Co-authored-by: Claude Code <noreply@anthropic.com>