Settings ghosts — one shell per level
Rendered evidence for propflowai #7326: the loading states, which are the whole point of the PR. The four levels' loaded states are unchanged from #7324's evidence.
Organization Settings ghost — /settings under All Properties, every data read held open
The shell with no view. Captured on the branch's own dev server (propflow-stage, anonymized by construction) with the page's data reads held open by Playwright route interception, so this is the state a person sees until the first byte lands — and, since #7326, what a FAILED read no longer leaves on screen (a failed read settles and renders Upgrade / Connect).
Asserted in the ghost DOM (all present; aria-busy regions: 1, live-region status nodes: 1):
Organization SettingsCompanyCompany NameBillingIntegrationsAppFolioFollow-ups
Property Settings ghost — /settings with a property picked, reads held open
The shell with no view. Captured on the branch's own dev server (propflow-stage, anonymized by construction) with the page's data reads held open by Playwright route interception, so this is the state a person sees until the first byte lands — and, since #7326, what a FAILED read no longer leaves on screen (a failed read settles and renders Upgrade / Connect).
Asserted in the ghost DOM (all present; aria-busy regions: 1, live-region status nodes: 1):
Property SettingsCamellia ApartmentsIntegrationsOutlook CalendarOutlook EmailCallsOffice PhoneLeasing & toursEmails & remindersMaintenance AutomationFollow-ups
User Settings ghost — /settings/account, reads held open
The shell with no view. Captured on the branch's own dev server (propflow-stage, anonymized by construction) with the page's data reads held open by Playwright route interception, so this is the state a person sees until the first byte lands — and, since #7326, what a FAILED read no longer leaves on screen (a failed read settles and renders Upgrade / Connect).
Asserted in the ghost DOM (all present; aria-busy regions: 1, live-region status nodes: 1):
User SettingsProfileNameEmailPhoneTime zone
Why the ghost is the thing to look at
Each level used to render two trees — the page's JSX and a hand-mirrored ghost — free to drift, and already drifting (a Team card an org_admin never sees; Follow-ups missing). Now the ghost IS the page's shell with no view: every heading, label, helper sentence and connection name above is the same node the loaded page renders. The parity test asserts h3 + label equality between the two states.