Record previews (#91): user page, developer guide, and the one-ticket rule
Record-Previews.md - where the ⓘ appears, what each of the seven cards shows,
why it is read-only, and what "that record cannot be shown here" means. That
last one matters: a missing record and a forbidden one get the same sentence on
purpose, so the page says so rather than leaving somebody to file a bug.
Record-Previews-Developer-Guide.md - the deep one, with real code:
- the two gates, and why the module gate lives in recordPreview() while the
record gate lives in each type function
- adding a new type end to end, worked through with a supplier
- the WRONG/RIGHT pair for activeTenantFilter() vs analystCanAccessX(), which is
the mistake that actually shipped (#1345) and what it looked like
- wiring a badge into a pill, a table actions column and a CSS grid row, each
with the trap that goes with it - invalid button-inside-anchor, conditional
icons shifting a row, and a heading row needing a matching spacer
- why the 2px nudge is optical rather than geometric, and where it is reset
- changing what a card shows, including why rpField() drops empties, how to
keep a deliberate zero, the colour filter, and columns that only exist after
Database Verification
- the three test layers, and the five harness traps that each produced a
confident wrong answer during development
Tasks.md gains a "One ticket, one change" section - the single-column design,
and the fact that both ends of the relationship now confirm before replacing.
Cross-links from Tickets, Linking-Equipment-to-Contracts and the sidebar.