N1 D2 asks that Platform administrator and Organization administrator be explained where the distinction is shown. The only place a person is shown their own is the Role cell on Profile — and ROLE_CATALOG.description, the catalog that exists to be the one source of role copy, had no renderer anywhere in the app. This PR renders it, and sharpens the two administrator lines so each says what the other is not.
16 Sept 2026 · branch terminology-surfaces-p2 · captured against propflow-stage · at 407b230e6a+local
Data note. Every name and balance below comes from propflow-stage, which is anonymized by construction (ADR-0097/0110 — phones in the impossible +1000 NPA, emails @example.test). The identical capture against prod would carry real tenants' names and balances and is not safe to attach anywhere, which is why the generator refuses to run against one.
The Role cell used to be a label and a Badge, full stop: a person holding Platform Admin was shown the words and nothing about what they mean. N1 D2 (R13, Gera 2026-09-16) rules that Platform administrator is the explicitly assigned platform exception; Organization administrator is an organization staff label, not platform access — and asks that the distinction be explained where it is shown.
The line under the badge is ROLE_CATALOG's own description. That field already existed as the single source of role copy and had no renderer anywhere in the app, so sharpening the string alone would have changed nothing anybody reads — which is the actual finding this PR turns on, and the reason it touches a component at all.
Asserted in the captured DOM — Role · PropFlow staff who can support any company, across the whole platform. · This is platform administration, not a role at a customer's company.. The whole sentence, in two halves: the retained clause the description always had, and the NEW clause that draws the D2 distinction. Asserting only the second would pass on a cell that lost the first.
The Role cell sits in a md:grid-cols-2 grid, so at phone width it is full-bleed and the description wraps freely. This is the width the round-1 review asked for explicitly: the copy is long enough that "does it still fit" is a real question rather than a formality.
The description block reserves the same height loading and loaded (three lines of text-xs, with a three-bar ghost rather than one), so the row does not grow as the data lands — the defect round 1 caught, in a file whose own docstring promises the ghost cannot drift from the page.
Asserted in the captured DOM — Role · This is platform administration, not a role at a customer's company.. Same sentence, narrow viewport — a wrap that clipped or truncated it would fail here and pass at desktop.
It settles that the sentence reaches a screen — the claim a drift test over component source cannot make, and the one the round-1 review held this PR for. It is captured from this branch's own dev server, not a preview deploy.
It does not show the Organization administrator half. The capture identity is the smoke user, which is platform_admin with no home organization, so this page renders the platform line; the org line is pinned instead by the jsdom cases in administrator-scope-explained.drift.test.ts, which render the real AccountSettingsShell for org_admin, platform_admin and property_manager and read the sentence off container.textContent. No gate was widened to manufacture a second identity.