Sheets Are the Only Part Anyone Sees
You will spend most of your time in prose and schemas. Your players will spend all of theirs looking at sheets. Worth remembering which of those is the product.
The house style
hero image, name over it
chips — the two or three facts you read without thinking
vital bars — tappable, saves on the tap
┌────────────────────────────┬──────────────┐
│ tabs, named for contents │ glance cards │
│ player content only │ identity, │
│ │ where, tags │
└────────────────────────────┴──────────────┘
▸ GM Only: Secrets & Metagame (closed)
Tabs are named for what is inside them. Who · Body · Capability · World, not Detail · State · Links · More. A tab called "State" has told the player nothing.
The GM drawer is never a tab. A tab advertises itself; a closed drawer under the whole sheet has to be gone looking for. Same information, completely different invitation.
Three ways a sheet lies to you
A binding to a field that does not exist renders blank. No error, no warning, and every automated check passes. Every Text component in this project once used the wrong prop name — all thirty-three of them rendered as empty space, for months, while the checks stayed green.
A prop the component does not declare is skipped silently. Not rejected. Skipped. Copy prop names off a component that already works rather than from memory.
A field with no control is only half wired. If a builder needs to change it, it needs a control in the layout — a schema entry alone means it exists and nobody can touch it.
The ten-second audit
Open one file of the type and look at it. Blank fields, empty tabs, tables of nothing. Faster than any amount of reasoning, and it catches almost everything.