# #521 R3 — bounded gap correction Open [preview.html](preview.html). Local design handoff only; application source, runtime, Git, data and providers were not changed. Prior outputs are preserved in `before-delta/`; original inputs and native receipt remain untouched. ## Exact delta for Cursor - `preview.js`, `card(c)`: for `trainer_led` only, move the existing single `actions(c)` from `.content` into `.people-summary`, after the organizer identity and before the disclosure. Keep date/time/title/venue/address/levels/full terms in `.content`. No copied or hidden game actions. - `design.css`: change the role summary grid to `minmax(0,1fr) minmax(0,1fr) auto auto`; the last two columns hold game actions and disclosure. Keep these game actions on one line. Remove the former training action top padding/auto margin and set only training terms' trailing margin to zero. The terms no longer precede an in-column footer. - This removes the 44px action row + 4px padding and 12px trailing terms margin from the right upper column. For normal DEMO it should now fit inside the existing square at 820/1280/1920, allowing the existing full-width people band to start immediately at the photo bottom. No image stretching, gap painting, hidden text, fixed card height, overflow clipping or new UI dependency. - Existing mobile single-column summary rules remain: identities, game actions, disclosure. Long titles, conditions and names wrap in document flow; unusually tall upper text can grow the row without overlapping or clipping the footer. The zero-gap target is the normal DEMO at the three desktop widths, not arbitrary unbounded text. Application pieces: `DiscoveryGameCard.tsx` — relocate its trainer-led `CardActions` once into the existing R3 people-summary; `discovery.css` — apply the scoped grid/actions/terms rules above; `RoleReputationPanel.tsx` — retain existing `RoleReputationCardActions(renderCompact)` wiring and `RoleReviewsDialog`, with no review API or policy change. Ordinary-card markup and its CSS rules remain unchanged. Do not copy fixture data, the local dialog stub or preview toolbar into the app. ## Review binding retained The separate training review button must call `view.trainingTrigger.onOpen` from `RoleReputationCardActions`, preserving its existing `trainerProfileId` dialog path, role handle, game ID and availability. Organization reviews use their own `view.organizationTrigger.onOpen`. Neither action depends on resolving a public-player profile. The accurately labelled “О тренере в игре” / “Об организаторе в игре” links remain separate game-detail actions; they do not replace reviews. No trainer-profile/user-ID comparison or name-based deduplication. Role label remains “Тренер”; API status, real counts and unavailable/zero distinctions are unchanged. The prototype's independent role buttons and native-dialog handlers are byte-for-byte unchanged. Disclosure remains collapsed by default; 44px targets, keyboard activation, modal Escape/close and exact-opener focus restoration are retained. Native preview dialogs illustrate the interaction, not application runtime acceptance. ## Evidence and handoff `preview.html` regenerated with existing `build_preview.py`. JS syntax check passed using the installed Node absolute path (plain `node` was absent from PATH). A bounded structural comparison passed: ordinary HTML identical in both disclosure states; exactly one relocated footer per trainer card; terms retained; identity/review rendering, interaction handlers and mobile rules unchanged. This is author self-check, not independent QA. The parent's 72 prior checks are reused for unchanged behavior; no exhaustive rerun. `assets/onest.ttf` and its existing @font-face are unchanged. Prior actual Onest loading is inherited evidence supplied by the parent; this delta does not claim a new browser/font check. Old generic font-status strings emitted by the unchanged builder are not a fresh finding that the local asset is absent. Current browser measurements: **NOT_TESTED**. Parent: normal DEMO and ordinary at 390/820/1280/1920; desktop `unusedUnderPhotoBeforePeople = 0`, photo aspect 1, ordinary baseline unchanged, no overflow/footer clipping; one keyboard trainer-review round trip. Inspect existing long scenario for wrapping if needed; no new scenario matrix. Expected geometry is not reported as measured evidence. DEV/QA/UAT acceptance is not claimed.