A payments decision that was half-true
Expo Router makes any file under app/ reachable by path whether the UI links to it or not, so an 'unwired' payments screen was still deep-linkable.
It said it worked
Green, 200, saved, “already handled” — and wrong. No error anywhere to go on.
Re-verifying the payments unwiring, which had recorded "confirmed the other three apps never had a live entry point." Re-auditing properly, mobile's payments/[applicationId].tsx was still a live routable file. No button led to it, true, but Expo Router makes any file under app/ reachable by path whether the UI links to it or not, so it was still deep-linkable. A more complete duplicate already sat under _dormant/ from an earlier cleanup, and I'd evidently checked that one and concluded the feature was dormant without noticing the original was still in the live routing tree beside it.
Renamed the folder so Expo Router ignores it, contents untouched. Also went a layer deeper than the original decision and added a guard 404ing all four payment routes regardless of auth, which closes the the payment provider webhook — @Public() and reachable by the real provider the whole time.
"No button links to it" and "it's not reachable" are different claims in a file-based router. Worth re-checking a prior "confirmed unreachable" against the actual routing mechanism, especially months later when the original reasoning isn't in my head anymore.