Developer Page Specifications
QC Checklist
Per-page gates + 4 legal-critical lead-capture integrity tests (consent enforcement, never hard-delete).
Complete
Per-page acceptance gates. Severity per §11.1.
Listing
- FF-LIST-001 · blocker · /en/founder-files + /ar/founder-files return 200. Category-scoped + topic-scoped variants also return 200.
- FF-LIST-002 · blocker · Cards preserve 3:4 aspect ratio at every breakpoint. No CSS height drift.
- FF-LIST-003 · critical · Featured banner (B) renders only when ≥1 IsFeatured=true file with full required fields.
- FF-LIST-004 · critical · Category tabs (C) + topic chips (D) filter correctly. Combined filters update URL.
- FF-LIST-005 · critical · Sponsor mini-row appears ONLY when SponsorId !== null AND ContractExpiry > NOW(). Expired sponsorships hidden automatically.
- FF-LIST-006 · blocker · Mobile / RTL parity.
Details + Reader
- FF-DTL-001 · blocker · /en/founder-files/{slug} returns 200 for every IsActive=true file. Unknown slug → 404.
- FF-DTL-002 · blocker · Hero cover renders 3:4 portrait. SVG fallback when CoverImageUrl is null — file number + generative pattern.
- FF-DTL-003 · critical · Best For block (C) + Learning Points (E) + What you’ll get (F) render their lists in displayOrder ASC.
- FF-DTL-004 · blocker · Download CTA (H) opens consent modal. Submit disabled until email valid + consentPlatform checked. Submit POSTs to /api/founder-files/{id}/leads.
- FF-DTL-005 · critical · Successful download → modal success state + queued email + DownloadCount incremented.
- FF-DTL-006 · blocker · Reader page /read renders ReaderBodyHtml correctly. TOC auto-generated from <h2>. Reading progress bar updates on scroll.
- FF-DTL-007 · critical · First-time reader access (session-scoped) prompts consent modal with source='reader'. Same lead capture as Download.
- FF-DTL-008 · blocker · Reader page canonical points BACK to /details (not /read). Avoids duplicate-content split.
- FF-DTL-009 · blocker · Mobile / RTL parity.
Lead capture integrity (legal-critical)
- FF-LEAD-001 · blocker · consentPlatform=false REJECTS the submit at server. No row in FounderFileLead.
- FF-LEAD-002 · blocker · Every lead row has IP + UserAgent + CreatedAt captured.
- FF-LEAD-003 · blocker · consentPartners=true triggers sponsor-CRM webhook ONLY when SponsorId !== null AND Sponsor.ConsentPartnersWebhookUrl !== null.
- FF-LEAD-004 · blocker · No hard-delete on FounderFileLead. Admin "Delete user" UI must NEVER cascade to this table.
