Agents
The mandatory skill, the performance rules that are not optional, and why a mobile change cannot be visually verified from this box.
Load before you write
| Doing | Load |
|---|---|
| Anything at all in this app | react-native-best-practices — mandatory, not advisory |
| Any screen, list or scroll handler | ★ native-performance, then reanimated |
| Adding a screen or component | ★ pitsi-ui-component, expo-design-system |
| Animation, gestures, sheets, haptics | ★ animate-expo |
| Fetching or caching | ★ react-query |
| Client state | ★ zustand |
| Preparing a submission | app-store-review |
| Comparing against the website | ★ audit-statshub-parity |
react-native-best-practices is mandatory because this app is on the New
Architecture and most React Native material predates it. Loading it after
getting stuck is loading it too late.
The rules a gate will not catch
- A scroll-linked header that reads a shared value on the JS thread. It is
the single most common way a screen here starts dropping frames, and it looks
fine in review. ★
native-performancecovers it. - A long board without FlashList.
- A modal that is not a route. It cannot be linked to, cannot be restored, and does not survive the back gesture.
- A layout that assumes the window never changes size. iPad multitasking, Stage Manager and rotation all resize a mounted screen; see Resizing.
- Two copies of the same server data, one in a query and one in a store. Data has the split.
You cannot see this app from the dev box
No simulator, no display, no way to render an Expo screen here. That is the one place the repo's "open it in a browser" rule does not apply, and the honest substitute is:
bun run typecheck
bunx expo export --platform iosThen say what you built and what remains unchecked, and leave the looking to a real device. Claiming a screen was verified from this machine is not a small overstatement — it is not possible.
Where the work usually is
src/lib/ is 1,100 imports deep and is where the logic lives — one folder per
concern, with tests beside the files. src/components/features/ is the second.
src/app/ is mostly thin: a screen file that is doing real work probably wants
a src/lib module and a defineQuery instead.