Confirmed the cause on macOS 27. TCC stores the grant for the launch agent's program by path: TCC.db shows client=~/.t3/runtime/versions/<version>/t3, client_type=1. Every update changes that path.
Only the launch agent's path matters. I ran a test launch agent at a fixed path and granted Full Disk Access to that path only. Children started from two other paths could both read ~/Library/Safari. Before the grant, both got errno=1.
Proposed fix: on macOS, t3 service install copies versions/<v>/ to runtime/launcher/, and the plist runs runtime/launcher/t3 __service-launcher. serve still runs from versions/<v>. Running in my fork since today: https://github.com/ziyadakl/t3code/pull/13. The grant on runtime/launcher/t3 covers serve from a fresh version folder.
Happy to open a PR against main if this direction works for you.