Re-run of the 2026-05-16 audit after the #605 convergence umbrella closed. Track what shipped: 13 sub-issues across Tranches I–III merged on 2026-05-17. KEEP list landed in docs/05-design/screen-architecture.md via #606 ahead of this work, codifying the divergences that should not be scored against Stitch (Auth two-page split, Profile/popover, Communications hub→detail, Occupy data cards, Dashboard summary cards, Search Insights Soon badges, Move In/Out copy).
The #605 convergence umbrella moved eight screens up the severity ladder. The three previously-divergent screens (3b Property Report, 9 Documents) and most of the previously-partial schema-blocked screens (8 References, 11 Communications, 12 Key Contacts, 13 Advice, 14 App Feedback, 15 Profile) now reflect Stitch's intent. The remaining gaps are all product-decision deferrals tracked under Tranches IV (long pole) and V (parked) of #605, plus the standing KEEP-list divergences from #606. Occupy is the sole remaining divergent screen — and it's a deliberate KEEP item, not an audit gap.
| # | Screen | Severity | Built path | One-liner |
|---|---|---|---|---|
| 0 | Splash Screen | match | src/components/Splash.tsx | Transient render-state; tagline dropped (#610), swipe-up affordance added on coarse-pointer devices (#587 / #591). KEEP-listed. |
| 1 | Authentication | partial | src/pages/SignInPage.tsx + RegisterPage.tsx | Two-page split is KEEP-listed; minor “Contact Support” footer link still absent. |
| 2 | Dashboard Updated | match | src/pages/DashboardPage.tsx | Deposit tile restored in bento (#596) with real protected-status caption; Repairs moved to a summary card below. |
| 3a | Search Insights Updated | match | src/pages/SearchInsightsPage.tsx | Stitch's 6-tile preview kept, plus the legacy HomePage substance (recent reports, aggregate-action vote). |
| 3b | Property Report | match | src/pages/ReportPage.tsx | Cosmetic re-port to v2.1 tokens (#597) + 6-tile signals grid with verdict badges (#599). Narrative + paywall remain post-MVP. |
| 4 | Tenancy hub | n/a | src/pages/TenancyHubPage.tsx | No Stitch source. Built as a row-list directory mirroring Profile's hub pattern (per #558). |
| 4a | Start Tenancy | partial | src/pages/StartTenancyPage.tsx | Manual form replaces Stitch's upload-the-agreement / AI-extracts flow. Tranche IV of #605. |
| 4b | Move In Review Updated | partial | src/pages/MoveInPage.tsx | Keys + Issues-Log tiles swapped for Tenancy Agreement + Compliance Documents; exit_captures-class items deferred to Tranche IV. |
| 5 | Occupancy | divergent | src/pages/OccupyPage.tsx | KEEP-listed: 7 data-bearing summary cards in place of Stitch's 6-tile nav pad. Revisit when per-pack screens land. |
| 6 | Move Out Review Updated | partial | src/pages/MoveOutPage.tsx | Keys/Meters/Issues/Comparison live in exit_captures JSON; flagged via HelpInfoCard until the capture flow lands (Tranche IV). |
| 7 | Deposit Management Updated | partial | src/pages/DepositManagementPage.tsx | Generate-PDF preserved as disabled “Soon” — export pipeline parked (Tranche V). |
| 8 | References | match | src/pages/ReferencesPage.tsx | Structured Reference Profile stats panel landed (#598) with sample-size-aware empty states. |
| 9 | Documents | match | src/pages/DocumentsPage.tsx | ACTIVE / PRE-TENANCY / ARCHIVED filter pills shipped (#593); URL-roundtripped ?stage= filter. |
| 10 | Tenancy Timeline Updated | match | src/pages/TimelinePage.tsx | Vertical-rail timeline matches. Stitch's “Rent Due in 3 days” upcoming card not surfaced (feed is historical). |
| 11 | Communications & Maintenance | match | src/pages/MessagesPage.tsx | Multipart attachments shipped (#604); hub→detail layout is KEEP-listed. |
| 12 | Key Contacts | match | src/pages/KeyContactsPage.tsx | Phone/email rows + freeholder + management_company party types (#592). “Draft a Letter” CTA wired to letter templates (#602). |
| 13 | Guidance Library / Advice | match | src/pages/AdvicePage.tsx + ArticlePage.tsx | Per-stage ContextBanner (#601), Letter Templates rail (#602), External Support rail (#603). |
| 14 | App Feedback | match | src/pages/FeedbackPage.tsx | Screenshot upload zone + thumbnail preview shipped (#595) with multipart submission path. |
| 15 | Profile | match | src/pages/ProfilePage.tsx | Avatar + member-since (#594), Notifications + Biometric Login toggles (#600). Tenancy switcher stays in toolbar popover (KEEP-listed). |
07f66b97fa1641028bcc02f47ca0b073 · Built tenantmate-app/src/components/Splash.tsxuseCurrentPrincipal() is in flight) and dismissible (lingers on coarse-pointer devices until the user swipes up). Desktop / fine-pointer never sees the splash at all (#609).Both: centered brand glyph + “TenantMate” wordmark. Built drops the tagline and the spinner (#610). In dismissible mode (#587 / #591) a swipe-up chevron + “SWIPE UP TO CONTINUE” affordance pins to the bottom; a focus-visible “Continue to sign in” button gives keyboard / AT users the same exit. Stitch's “Get started” CTA and “VERSION 2.4.0” footer remain intentionally omitted.
Built leans atmospheric: full-bleed bg-primary canvas, text-on-primary, two blurred glow blobs, 80px home-outline icon in a glowing 128px disc with shadow ring. Swipe-up affordance uses animate-bounce chevron + font-label-caps tracking-wider strapline.
Wordmark “TenantMate” identical. Stitch tagline “Transparent insights for the modern tenant” dropped in #610. “SWIPE UP TO CONTINUE” / “Continue to sign in” (keyboard fallback) are built additions for dismissible mode. aria-label “Loading TenantMate” preserved for AT in presentational mode.
Splash.tsx documents both the CTA omission and the dismissible-mode rationale.1285890783c3405c805e1570fd2c58ee · Built tenantmate-app/src/pages/SignInPage.tsx + RegisterPage.tsxonWantRegister / onWantSignIn callbacks. The two-page split is KEEP-listed.Stitch: one screen, tab-toggle between modes, email + password, “Forgot password?”, terms checkbox, password-strength affordance, “Contact Support” footer. Built: two separate AuthShell+AuthCard pages. SignInPage has Forgot link, resend-verify-email, error switching across rate-limit / lockout / account-state. RegisterPage has terms checkbox + post-submit “Check your email” success state.
Stitch Material card, deep-teal primary, Manrope/Inter, uppercase labels. Built matches well: bg-primary, Material symbols (mail/lock/visibility/arrow_forward), font-label-caps via tokens, surface-container-low inputs, primary CTA with shadow and scale-on-press. Density + hierarchy close.
Stitch labels “EMAIL ADDRESS”, “PASSWORD”, “Forgot password?”, “I agree to the Terms of Service and Privacy Policy.” — preserved verbatim. Built adds “Welcome back” / “Create your account”, inline hint “Minimum 8 characters. We block passwords from known-breach lists.”, resend-link copy.
04f38c5267e646c6b8d1e3f22ff2c8ad · Built tenantmate-app/src/pages/DashboardPage.tsxStitch: “Start new tenancy” hero + “Overview / LIVE TRACKING” header + bento grid of 4 tiles (Search / Tenancy / Deposit / Advice) + 4-item bottom nav. Built mirrors with Search / Tenancy / Deposit / Advice (Deposit tile back in after #596 wired deposit_summary), then 5 summary cards (Tenancy / Deposit / Repairs / Notices / Recent Activity). Real badge counts from /api/v1/dashboard. Repairs is no longer in the bento — it surfaces as a card below per the Stitch shape.
Stitch Material bento with rounded-2xl tiles, primary teal accents. Built mirrors: aspect-square bento tiles with primary-container/20 bg, label-caps, error-red badge bubble for counts, primary CTA hero with shadow-lg. Deposit tile icon switches to shield-checkmark when protected, otherwise wallet. Card pattern (rounded-xl + outline-variant + shadow-sm) consistent throughout.
Stitch verbatim: “Start new tenancy”, “Overview”, “LIVE TRACKING”, tile labels “SEARCH/TENANCY/DEPOSIT/ADVICE”. Deposit tile caption is real-data-driven: “Protected” / “Returned” / “Disputed” / “Deducted” / “Not protected” / “Not recorded”. DepositSummaryCard renders amount + scheme + reference + protected-on.
deposit_summary). No remaining gap.d9be8aef1e654df1a53afe9bd30e1346 · Built tenantmate-app/src/pages/SearchInsightsPage.tsxStitch: header + Search input + 6-tile signals bento (EPC / Broadband / Council Tax / Crime / Schools / Flood Risk) + bottom nav. Built: account/tenancy banner → “Search a property” → SignalsBento (same 6 tiles, with Live/Soon badges) → PendingAggregateActions → form (postcode + optional line-1) → “Recent reports” list with cache fallback. Order + tile set match Stitch; built adds the actual report-creation interaction.
Stitch card grid, teal icons in circular wells. Built mirrors: 2-col grid, 40px primary-container/30 icon discs, label-caps tile titles, body-sm captions, “Soon” chip on Broadband + Schools. Recent-reports list uses surface-container-lowest divided list with chevron-forward.
Stitch “Enter a postcode or street name to reveal property data.” → built “Enter a postcode (and optional flat / house number) to reveal property data from official sources.”. Tile labels match. Built adds Live/Soon badges, captions like “Energy rating + cost band” and the honest “Soon” on Broadband (Ofcom #264) and Schools. Form CTA “Generate report”.
feedback_dont_overstate_progress + Ofcom #26419ee49bf48b044b1928d33439f262ea2 · Built tenantmate-app/src/pages/ReportPage.tsxStitch: hero with address + narrative summary (“A well-maintained urban flat with excellent connectivity…”) + 6 metric cards (EPC C, Flood Risk Medium, Crime Mixed, Broadband 900 Mbps, Council Tax Band B, Deposit £1,440) with verdict badges (“GOOD/WATCH/NEUTRAL”), plus “Want the full picture?” paywall CTA. Built: pending/failed/cached banners → resolved address heading + timestamp → 6-tile SignalsGrid (EPC / Flood / Crime / Broadband / Council Tax / Deposit) with VerdictBadge + VerdictLegend → flat per-source detail sections beneath. Broadband renders “Coming soon” with missing verdict (Ofcom #264); Deposit renders “Not configured” (no deposit_summary on a property report yet).
Stitch M3-style cards with bold accent badges. Built now mirrors: rounded-2xl tile containers per-verdict-toned (good/neutral/watch/missing map to surface/icon/text colour-tokens), 40px verdict-toned icon discs, font-status-badge pills, font-label-caps tile labels, font-h3 value text. VerdictLegend documents the four verdict values inline below the grid. Per-source detail sections below the grid remain plain IonList stacks for now.
Verdict labels are server-derived (verdict_label on each source payload, computed by PropertyDueDiligence::Verdict.derive): EPC “Good” for A–C, “Watch” for D, “Bad” for E–G; Flood inversion of the Environment Agency severity; Crime against a lazy-cached 90-day national baseline. Built drops Stitch's narrative summary and the paywall CTA — both remain post-MVP.
feedback_dont_overstate_progress)tenantmate-app/src/pages/TenancyHubPage.tsxTenancy summary card at top (address / postcode / role / status / type / start / end / rent) for the active membership, with a “Tenancy withdrawn” banner when applicable. Below: “Tenancy Lifecycle” row-list of 8 entries — Start Tenancy, Key Contacts, Documents, Move In, Occupy, Move Out, Deposit Management, References — each with icon + label + description + chevron-forward when routed, “Soon” chip when not. All 8 rows live as of #576.
Uses bg-white rounded-xl cards, outline-variant borders, primary teal icons, font-label-caps uppercase section labels — fully on the v2.1 design tokens. Hover/disabled states styled. Withdrawn banner uses error-container token. Consistent with the rest of the design system.
Section headers “Tenancy Lifecycle”. Empty state: “No active tenancy” with “Once you start a tenancy, the address, key dates, and lifecycle steps will live here. Start by running a property report and promoting it into a tenancy.”. Withdrawn copy: “Tenancy withdrawn” / “You no longer have an active role on this tenancy. Records remain visible for audit.”.
8e02dd6f705949ed9b7ebb402ec93b8d · Built tenantmate-app/src/pages/StartTenancyPage.tsxPOST /property_reports/:id/tenancy because no upload pipeline or extraction service exists. Tracked as Tranche IV (long-pole) of #605.Stitch top-to-bottom: hero “GETTING STARTED / Upload your tenancy agreement.” + upload affordance + “ENCRYPTED UPLOAD” reassurance + 3-tile feature trio (Smart Extract / Risk Analysis / Secure Vault). Built: hero “GETTING STARTED / Record your tenancy.” → manual form (Property report picker, Tenancy type, Start/End dates, Monthly rent, Deposit scheme reference) → reassurance block → upload affordance kept as “Coming soon” teaser → feature trio reframed as “On the roadmap”.
Built matches Stitch's visual language well — bg-secondary-container/20 reassurance block with border-l-4 border-secondary, surface-container-lowest cards, primary CTA with arrow-forward, font-h1/h2 from design tokens. Inputs match Auth pattern. Aspirational sections visually de-emphasised, distinct from active form area.
Stitch verbatim: “GETTING STARTED”, “Upload your tenancy agreement.”, “Your documents are processed securely and never shared with third parties without your consent.”, “Smart Extract / Risk Analysis / Secure Vault”. Built rewrites hero to “Record your tenancy.” Adds “Coming soon” badge on upload, “On the roadmap” section header. CTA “Start tenancy”.
61ca24b1d3e949658a5e177a3c9afa9f · Built tenantmate-app/src/pages/MoveInPage.tsxdraft/in_progress/completed/sealed) that Stitch implies but doesn't surface. The intent-driven copy + per-tile primary buttons are KEEP-listed.Stitch is a 4-tile RAG grid (Inventory / Keys / Meters / Issues Log) with per-tile CTAs. Built keeps a 4-tile grid but swaps Keys+Issues for Tenancy Agreement + Compliance documents (the packs that actually exist), then adds Start/Seal walkthrough sections, an inline inventory list+form, meter readings list+form, agreement detail, and a 6-row compliance table — far more granular than the Stitch tiles.
Stitch uses Material chips with bold status pills and right-aligned chevron CTAs per tile. Built uses Ionic shell with v2.1 teal tokens; tiles get coloured left-borders (border-l-primary/tertiary/error) plus icon-bg pills, and the page expands into form-driven sections beneath the grid rather than chevron-deeplinks.
Stitch microcopy is concrete demo strings (“12 of 15 tasks completed”, “DISPUTE CHARGES”). Built copy is intent-driven: “Record the property as you receive it.”, “Start your move-in walkthrough”, “Seal the walkthrough”, “Inventory is signed and locked for audit.”
f8d89bd1aa5441958739552393c7535b · Built tenantmate-app/src/pages/OccupyPage.tsxStitch: tenancy summary header → Rent Tracking card (next-due + annual progress) → 6-tile lifecycle shortcut pad (Legal / Move In / Comms & Maint / Move Out / Timeline / Requests). Built: PageIntro + tenancy summary → RentTrackingCard (next-due, outstanding banner, 3 most-recent payments) → Repairs + Inspections row → Notices & legal → Concerns + Bills row → “Deeper screens on the way” RoadmapHint. Stitch's 6-tile pad is dropped entirely.
Stitch's tile pad is a clean grid of equal icon-tiles. Built reuses the v2.1 teal Ionic shell with surface-container-lowest cards, primary left-border accents on the summary, and count badges on each card header — denser, more information-per-tile than Stitch's nav-style pad.
Stitch labels are navigation nouns (“Legal”, “Move In”, “Move Out”, “Timeline”, “Comms & Maint”, “Requests”). Built uses descriptive section names: “Daily life”, “During your tenancy”, “Rent tracking”, “Open repairs”, “Inspections”, “Notices & legal”, “Concerns log”, “Bills”.
feedback_dont_overstate_progress + KEEP list: the page deliberately doesn't render dead nav links; the 6 tiles will return when each pack gets its own screen. Tranche V of #605 (parked) tracks when per-pack screens land.6204830209287829414 · Built tenantmate-app/src/pages/MoveOutPage.tsxexit_captures JSON rather than as separate entities — a Tranche IV item of #605.Stitch: 6 RAG tiles (Checklist / Check Out Report / Keys / Meters / Issues Log / Comparison) + “Ready to finalize?” + “Submit Review” CTA. Built: 4 RAG tiles (Checklist / Check-out report / Forwarding address / Re-letting watch) + FinalizeBanner (“Ready to finalise?” / “Submit move-out review”) + HelpInfoCard explaining the missing Stitch tiles.
Stitch shows simple status pills (“Action Required”, “Verified”, “Pending”, “3 Issues”, “Watch”) with chevron CTAs. Built uses the same border-l accent + icon-bg + status-badge pattern as Move In, plus per-tile primary buttons (“Start walkthrough”, “Log report received”, “Start 60-day watch”, “Mark given to landlord”) — heavier action density per tile. KEEP-listed.
Stitch microcopy concrete demo state (“12 of 15 tasks completed”, “DISPUTE CHARGES”, “OPEN VIEWER”). Built intent-driven: “Submit your check-out walkthrough for landlord confirmation”, “Start a window where we'll log any listing-data observations”, “Where should post arrive after you move out?”. HelpInfoCard explicitly says: “Keys, meters and disputes ship next”.
MoveOutWalkthrough#exit_captures JSON; intentionally surfaced via HelpInfoCard until the capture flow lands. Tranche IV of #605.7117159aab1840adbaf20b5dfa916f20 · Built tenantmate-app/src/pages/DepositManagementPage.tsxdeposit_dispute pack actually owns.Stitch: “Deposit Protection Summary” + amount tile (“£425.00”, warning) + 5 info tiles (Proposed Deductions / Legal / Communications / Timeline / Evidence Pack) + “Generate Dispute PDF” CTA. Built: header + DepositSummaryCard (amount + scheme + reference + protected_on + PI served + claimed-against + remaining) + Proposed deductions list+form + Dispute case panel + Dispute costs list+form + disabled “Generate dispute PDF (Soon)”. Adds empty-state NoDeposit flow with “Record deposit” modal.
Stitch shows uniform info tiles with badge counts (“05 DOCS”, “142 MSG”, “28 FILES”). Built uses v2.1 teal tokens — DepositSummaryCard is a 2-column dl with wallet icon and protected-status pill; deduction rows are border-l-tertiary cards with challengeability badges; dispute card has hammer iconography and a state-advance button. Stitch CTA preserved as a disabled “Soon” button rather than removed.
Stitch microcopy: “Reviewing 3 separate claim items”, “Verified by TDS & MyDeposits”, “Chronological audit trail”. Built: “Record the protection certificate, track the landlord's proposed deductions, and build your dispute file in one place.” Deduction challengeability labels — “Hard to challenge” / “Worth challenging” / “Very challengeable” — replace Stitch's generic “warning” pills.
970dcee5f9fd483db131174fff408df4 · Built tenantmate-app/src/pages/ReferencesPage.tsxStitch: “Structured Reference Profile” stats panel (Payment History 100% EXCELLENT / Property Care TOP TIER / Deposit Outcome Full SETTLED) + “Share Reference Link” + Outbound Requests list + “Build Your Tenant Identity” card + “How it works”. Built: header + StructuredReferenceProfile (3 stat tiles backed by GET /api/v1/reference_stats; each tile honours its own sufficient_sample flag and renders “Not enough data yet” with the sample-size threshold beneath when false) + Outbound requests grid + Closed grid + “Request new reference” CTA + “Build your tenant identity” info card.
Stat tiles use big-number typography (percentage + uppercase descriptor) on a surface-container-lowest rounded-2xl card with category iconography. When sample is insufficient the tile dims to surface-container and shows the threshold copy. Request grid uses standard surface-container-lowest card with avatar circle (mail/business/person icon heuristic), border-l accent by status, and uniform reference cards.
Backend-driven labels: “EXCELLENT” / “GOOD” / “FAIR” on payment history percentage; “TOP TIER” / “MID TIER” / “NEEDS WORK” on property care; “FULL” / “PARTIAL” / “FORFEITED” on deposit outcome. Insufficient-sample copy: “Not enough data yet” + sample-size threshold (e.g. “Need 3 closed rent periods”). “Build your tenant identity”, “Each successful tenancy adds to the references you can share with your next prospective landlord”, “Request first reference”.
0dc7375fc3ad48a09a82caadd8fb8c06 · Built tenantmate-app/src/pages/DocumentsPage.tsxEvidenceItem model is free-text); this is the smaller residual divergence covered inline by an explanatory help card.Stitch: subtitle + search bar + filter pills (“ACTIVE” / “PRE-TENANCY” / “ARCHIVED”) + 4 fixed compliance cards (Tenancy Agreement / EPC / EICR / Inventory) + upload button. Built: heading + SearchInput + cache banner + StageFilterPills (Active / Pre-tenancy / Archived / All) wired to ?stage= URL search-param + dynamic issue_type groups (with “Other documents” catch-all) + DocumentCard list rows + floating FAB + HelpInfoCard.
Filter pills are rounded-full bg-primary text-on-primary when active, bg-surface-container-low with outline-variant border otherwise — mirrors Stitch's pill treatment. Single-column DocumentCards with primary left-border accent, document-text icon tile, filename + captured/size strapline, and capture_method badge. FAB sits fixed bottom-right.
Stitch quotes “Secure vault for all your tenancy records”, filter pills “ACTIVE” / “PRE-TENANCY” / “ARCHIVED” preserved verbatim. Stage-scoped empty state: “No documents in this view” / “Nothing in this tenancy stage yet. Try a different filter, or upload a new document.” — distinguished from the truly-empty “No documents yet”.
issue_type with an “Other documents” bucket — flat EvidenceItem model, no fixed-slot schemaEvidenceItem or a separate RequiredDocument model); not currently in scope.ad0f747c7e854430ac6791eac3e43d5c · Built tenantmate-app/src/pages/TimelinePage.tsxBuilt reproduces the Stitch vertical-rail timeline (icon disc + card per event) and day grouping. Adds explicit day headers (“Today”/“Yesterday”/dd mmm yyyy), a “Why a timeline?” help-info card at the foot, and three robust states (no tenancy / loading / empty / error). Stitch's single “Rent Due in 3 days” upcoming/notification card is omitted — built is strictly historical (audits-driven).
Stitch uses Material vibes with five hard-coded category colours; built maps the same vocabulary (Legal/Move In/Maintenance/Requests/Finance/Disputes/Household) to v2.1 tokens (bg-primary/secondary/tertiary). Density and card prominence match. Bottom-nav stripped (owned by AuthenticatedShell).
Category labels align (“Legal”, “Move In”, “Maintenance”, “Requests”); Stitch's “Timeline” category becomes built's “Tenancy” bucket. Per-event copy is dynamic (audit summaries) vs Stitch's curated strings like “Tenancy Agreement Signed” / “Boiler Service Scheduled”. Built adds “by {actor_email}” attribution Stitch lacks.
AuditTrail::Summary mappingAuditTrail::Summary covers Legal/Move In/Move Out/Maintenance/Requests/Finance/Disputes/Household — coverage looks complete; “Upcoming” (rent-due nudge) is the unmapped Stitch concept.f4fd57e11d7e444ead84b8e41d1a75b4 · Built tenantmate-app/src/pages/MessagesPage.tsxStitch shows a single open thread with property header, participants row, mixed-channel bubbles (WhatsApp/SMS/App/Portal), composer with paperclip + camera affordances, and inline image evidence. Built is a list→detail hub: ThreadList of cards → ThreadDetail (back link, participants row, bubbles, composer with paperclip + thumbnail-preview attachment row) → NewThreadModal (subject/channel/participants). CommunicationEntry now has_many_attached :attachments (#604); composer accepts JPEG/PNG/PDF, 10 MB per file, 5 files max per entry. Bubbles render inline images (click-to-fullscreen) and PDFs as inline filename + download link.
Both use Material/teal vibes; built uses v2.1 tokens. Bubble treatment matches Stitch (rounded, asymmetric corners, ownSide right-align, internal-note style). Image attachments render as 12rem rounded thumbnails that open into a fullscreen lightbox; PDF attachments render as a chip with file icon + filename. Composer paperclip slides up an attachment tray with per-file thumbnail + remove button.
Built page header is “Messages” not Stitch's “Flat 14, Ashfield Court”. Composer label “New message”. Attachment errors: “Up to {ATTACHMENT_MAX_COUNT} attachments per message.” / “Each attachment must be 10 MB or smaller.” / unsupported type message.
3989c30407514d82a9742567b3f64777 · Built tenantmate-app/src/pages/KeyContactsPage.tsxStitch lists four party types (Landlord, Letting Agent, Management Company, Freeholder) with phone, address, badges, and Call/Email/Portal/Raise-Maintenance/Copy-Address actions, plus “Draft a Letter” CTA. Built renders a unified active grid + Archived sub-grid (cards across landlord/agent/contractor/freeholder/management_company/guarantor/deposit_scheme), shows party_type + role + service_address + legal_capacity + phone (tel:) + email (mailto:) + effective dates, and an Add/Edit/Archive modal. The Draft-a-Letter CTA section pulls from useLetterTemplates() and routes to /letters/:slug on pick.
Both use Material card grid with left-accent colour bar mapped per party type. Built badges show legal_capacity (“Primary owner”, “Sole trader”) where Stitch shows “Primary Owner” / “In Contract” / “ARLA Reg: M0023941”. Phone/email rows render as tel: / mailto: action buttons with phone-portrait / mail iconography. Stitch's portal CTA absent (no per-contact portal_url field — minor residual gap).
Built party labels now include “Freeholder” and “Management Company” as first-class party types. Built CTA “Add a contact”; the Draft-a-Letter section reads “Start a formal letter against your active tenancy. Choose a template…”. The bottom card no longer apologises for missing phone/email columns — they ship.
portal_url field on TenancyContact yet — minor residual)c8e6a7fc40bb4e168894169696c4bf5a · Built tenantmate-app/src/pages/AdvicePage.tsx + ArticlePage.tsxStitch ships: “Context-Aware Insights” banner (“You are currently in the Final Month of your agreement”), search, four guidance cards, “Letter Templates” rail (Formal Repair Request / Challenge Rent Increase / Notice of Intent to Move / Deposit Dispute Submission) and “External Support” (Citizens Advice / Shelter / Generation Rent). Built ships: heading + intro + ContextBanner (six tenancy_stage variants — none/pre_tenancy/first_month/occupy/final_month/post_tenancy — each with stage-specific heading + body + priority topics) + SearchInput + topic-grouped article grid (priority topics first per stage, but no topics hidden) + LetterTemplatesRail (live useLetterTemplates() query, routes to /letters/:slug on pick) + ExternalSupportRail (live useExternalSupports() query, grouped by ExternalSupport::CATEGORIES) + HelpInfoCard footer.
Both use Material/teal card grid with left-accent colour per topic. ContextBanner renders a stage-icon disc + stage-specific heading + body in a surface-container-low rounded-2xl card. LetterTemplatesRail and ExternalSupportRail are sectioned border-l-{topic} card grids matching the existing topic palette. Built topic palette is richer than Stitch's three-bucket FINANCE/MAINTENANCE/LEGAL scheme; the priority ordering is the soft signal, not topic hiding.
Stitch's “Final Month” copy is one of six stages in built: “You're in the final month of your tenancy” → “We've prioritised the deposit-return and move-out guidance so you can plan the end-of-tenancy walkthrough, evidence the property's condition, and protect your deposit from unfair deductions.” The four seeded letter templates match Stitch's four titles (Formal Repair Request / Challenge Rent Increase / Notice of Intent to Move / Deposit Dispute Submission). External Support directory carries 10 verified-URL seeded entries (Citizens Advice, Shelter, Generation Rent, Crisis, TPO, TDS, DPS, mydeposits, Rent Smart Wales, Scottish Letting Agent Register).
comm_generation pack) + #603 / PR #626 (External Support rail + reference_data pack). Welsh/Scottish/NI letter templates are jurisdiction work, not audit gaps.f49c83b025ce41fcac86b8e669d7c9c2 · Built tenantmate-app/src/pages/FeedbackPage.tsxStitch: heading, textarea (“What's on your mind?”), screenshot upload zone (“Tap to upload or drag image here”), auto-attached context block (Build/Route/User/Active Tenancy), Submit Feedback button, footer policy line. Built: heading, textarea with character counter (0 / 10,000), screenshot upload zone + thumbnail preview (JPEG/PNG ≤5 MB; multipart POST /api/v1/feedback), auto-attached context dl, Submit Feedback button, footer policy line, success state with “Thanks for the feedback” + “Send another”. Serializer exposes has_screenshot boolean only (no URL leak).
Stitch uses Material vibes with a dark inverse-surface metadata block — built mirrors this with bg-inverse-surface text-inverse-on-surface font-mono dl. Upload zone uses a label-wrapped hidden input with a thumbnail when a file is selected (URL.createObjectURL + revoked on cleanup). v2.1 token usage throughout.
Built heading “Help us improve TenantMate” matches Stitch exactly. Textarea label “What's on your mind?” with descriptive placeholder. Submit label “Submit Feedback” identical. Error copy on unsupported MIME / oversized file. Built still omits the “Thursday-cadence” review info box (avoids overstating SLA — per feedback_dont_overstate_progress).
has_one_attached :screenshot + multipart submission + magic-byte sniff + thumbnail preview shipped. Cadence claims remain off the page by choice.a17d45e881da4751ab1babb7c1dd25de · Built tenantmate-app/src/pages/ProfilePage.tsxaccount_preferences JSONB) shipped in #600. Tenancy switcher + sign-out remain in the AppToolbar popover — KEEP-listed.Built top-to-bottom: Avatar circle (click-to-upload, JPEG/PNG ≤5 MB via PUT/DELETE /api/v1/me/avatar) + email + “Member since {Month YYYY}” + account status + tenancy badge → Preferences section (Notifications toggle + Biometric Login toggle, both backed by the JSONB account_preferences column with per-key audit expansion via PATCH /api/v1/me/preferences) → “Security & Login” section (Change email / Change password rows) → “Account Actions” (Close account) + build SHA.
Avatar is a 24x24 rounded-full bg-surface-container button with hover-opacity; renders img when avatar_url is present, otherwise a camera-outline icon. Preferences card is a bg-white rounded-xl border border-outline-variant two-row block with PreferenceToggleRow components (icon + heading + sub + Switch). Security / danger rows use the v2.1 token pattern (bg-error/border-error/20 on close-account hover).
Avatar aria-label “Change profile photo” / “Add profile photo”. Member-since renders as “Member since {Month YYYY}” from account.created_at. Notifications sub: “Send me push and email updates about my tenancy.” Biometric Login sub: “Use Face ID, Touch ID or device biometrics to sign in. Saved preference; native enablement coming soon.” (intent-only at the schema layer; native enablement parked). Close-account warning: “Permanently close your TenantMate account. Saved records remain for audit; you won't be able to sign back in with this email.”
account_preferences, but the native enablement hook isn't wired yetThe #605 convergence umbrella moved eight screens up the severity ladder; one screen (Splash) saw structural-but-deliberate change unrelated to #605 (#587 / #591 / #609 / #610) and is unchanged in severity.
| # | Screen | Was | Now | Closing PR | Note |
|---|---|---|---|---|---|
| 3b | Property Report | divergent | match | #597 / #611, #599 / #619 | Cosmetic re-port to v2.1 tokens + 6-tile signals grid + per-source verdict rule engine. Narrative + paywall remain out-of-scope marketing/monetisation, not audit gaps. |
| 9 | Documents | divergent | match | #593 / #615 | ACTIVE / PRE-TENANCY / ARCHIVED filter pills shipped with URL-roundtrip ?stage=. Dynamic issue_type grouping retained (4-fixed-slot model would need separate schema work). |
| 8 | References | partial | match | #598 / #620 | Structured Reference Profile stats panel landed with per-metric sufficient_sample flag + sample-size empty states. |
| 11 | Communications | partial | match | #604 / #625 | Multipart attachments (JPEG/PNG/PDF, 10 MB × 5 max) + composer paperclip + inline image / PDF rendering. Hub→detail is KEEP-listed. |
| 12 | Key Contacts | partial | match | #592 / #616, #602 / #627 | Phone/email columns + freeholder + management_company party types + DELETE endpoint + Draft-a-Letter CTA wired to letter templates. |
| 13 | Advice | partial | match | #601 / #624, #602 / #627, #603 / #626 | Per-stage ContextBanner (6 stages) + Letter Templates rail (4 seeded England templates) + External Support rail (10 seeded entries). |
| 14 | App Feedback | partial | match | #595 / #613 | Screenshot upload + thumbnail preview + multipart submit; serializer exposes has_screenshot bool only (no URL leak). |
| 15 | Profile | partial | match | #594 / #617, #600 / #622 | Avatar + member-since + Notifications + Biometric Login toggles. Tenancy switcher + sign-out stay in the toolbar popover (KEEP-listed). |
| 0 | Splash | match | match | #587 / #591, #609, #610 | No severity change. Tagline dropped + swipe-up affordance added + desktop now skips splash entirely. KEEP-list rationale unchanged. |
| 2 | Dashboard | match | match | #596 / #612 | No severity change but the bento is now honest: Deposit tile back in (was Repairs in the prior audit because no deposit_summary); real protected/disputed/returned status caption. |
Four screens remain partial and one divergent. None are convergence gaps closeable inside the #605 umbrella; all trace to product-decision deferrals (Tranches IV / V of #605) or KEEP-list standing decisions.
| # | Screen | Severity | Reason it's not match |
|---|---|---|---|
| 1 | Authentication | partial | Two-page split is KEEP-listed; minor Contact Support footer link still absent. Not in scope of #605. |
| 4a | Start Tenancy | partial | Upload-the-agreement + AI-extract pipeline is the long-pole; Tranche IV of #605 (needs ActiveStorage on tenancies + a doc-AI extraction service). |
| 4b | Move In | partial | Keys + Issues-Log tiles depend on packs that don't exist yet. Substitution is intent-driven copy (KEEP-listed) until those packs land — Tranche IV of #605. |
| 5 | Occupy | divergent | 6-tile lifecycle nav pad replaced by 7 data-bearing summary cards because per-pack screens don't exist yet. KEEP-listed; revisit when per-pack screens land (Tranche V parked). |
| 6 | Move Out | partial | Keys/Meters/Issues/Comparison live in MoveOutWalkthrough#exit_captures JSON; flagged via HelpInfoCard until the capture flow ships — Tranche IV of #605. |
| 7 | Deposit Management | partial | “Generate Dispute PDF” preserved as disabled “Soon” — export pipeline parked (Tranche V of #605). |
This page is a one-shot snapshot of where the shipped PWA stands against Stitch v2.1 as of 2026-05-17, after the #605 convergence umbrella. The intended uses: