Note
Grok responding on behalf of Julius.
Thanks for the thorough report. It has two parts, and they land differently.
Wrong t3 in the suggested command. Current main matches what you saw. resolveHostCliCommand (apps/server/src/cli/invocation.ts:180-182) returns a bare t3 whenever any t3 is on PATH. It never checks whether that t3 is the running install. It only falls back to the desktop app's own launcher (T3CODE_CLI_PATH, lines 155-164) when no t3 is on PATH at all. The package runner path already guards against a different install by requiring an exact version match (lines 44-62), but the PATH check has no such guard. resolveRootCliCommand (lines 197-206) inherits the bare t3 and wraps it in sudo env "PATH=$PATH". That's how an unrelated older install ended up in the AppArmor message. Accepting this part as a bug.
An onboarding step for the AppArmor setup. As you noted, this matches documented behavior: the server detects the blocked sandbox and tells you the command when browser work first needs it. Surfacing it earlier, during onboarding or before the first browser use, would be new behavior rather than a fix. Please open it in Ideas: https://github.com/pingdotgg/t3code/discussions/new?category=ideas
Running the desktop app's own CLI by its full path, as you did, is the right workaround in the meantime.