Developer Page Specifications
QC Checklist
Per-page gates for all 6 routes. Arabic bidirectional, sanitised body, JSON-LD validation, translation hreflang, /editorial/{slug} → /insights/{slug-id} redirect.
Complete
Per-page acceptance gates for all 5 routes. Severity per §11.1.
Listing page
- ED-LIST-001 · blocker · /en/editorial + /ar/editorial return 200.
- ED-LIST-002 · blocker · Featured spotlight renders 1 large + 2 supporting. Fallback to 3 latest IsActive when fewer IsFeatured exist.
- ED-LIST-003 · critical · Latest feed renders 12 cards excluding featured, infinite-scroll triggers correctly.
- ED-LIST-004 · critical · Categories grid shows IsActive categories with correct article counts.
- ED-LIST-005 · critical · Most-read sidebar top 5 by ViewCount.
- ED-LIST-006 · major · Newsletter form validation + POST + success state.
- ED-LIST-007 · blocker · Mobile + RTL parity.
Category + topic pages
- ED-CAT-001 · blocker · /en/editorial/categories/{slug} + AR return 200. Unknown slug → 404 (no fallback to listing).
- ED-TOP-001 · blocker · /en/editorial/topics/{slug} + AR return 200. Unknown slug → 404.
- ED-TOP-002 · critical · Connected ecosystem signals surfaces Opportunities/Files/Startups with same topic. Each sub-rail hides on 0.
Article details page
- ED-ART-001 · blocker · /en/editorial/{slug} + AR return 200 for every published article. Unknown slug → 404.
- ED-ART-002 · blocker · Header shows type chip, category badge, topic badges, H1 title (only H1), dek, byline row.
- ED-ART-003 · critical · Featured image 16:9 desktop / 4:3 mobile. SVG fallback when CoverImageUrl null.
- ED-ART-004 · critical · Body sanitised HTML — only whitelisted tags. No XSS.
- ED-ART-005 · critical · Body typography: max-width 720px desktop, font 18px LTR/RTL, line-height 1.7 LTR / 1.85 RTL.
- ED-ART-006 · critical · Arabic body wraps English brand names in <span dir="ltr">. Bidirectional rendering correct.
- ED-ART-007 · critical · Author card renders avatar + name + role + bio + social + "View all articles" CTA.
- ED-ART-008 · critical · Connected signals rail caps at 8. isPractical=true SUPPRESSES Files sub-rail.
- ED-ART-009 · critical · Related articles — manual first, auto-fill second, cap 6. Hides on 0.
- ED-ART-010 · critical · Share works via navigator.share / copy-link / Twitter / LinkedIn.
- ED-ART-011 · blocker · JSON-LD validates against Google Rich Results Test for Article/NewsArticle/BlogPosting per type.
- ED-ART-012 · critical · IsTranslated=true emits hreflang alternates pointing to CanonicalArticleId’s slug in other locale.
- ED-ART-013 · blocker · Mobile + RTL parity. Sticky share/save bar appears after 25% scroll on mobile.
Author page
- ED-AUT-001 · blocker · /en/editorial/authors/{slug} + AR return 200. Unknown slug → 404.
- ED-AUT-002 · critical · ProfilePage + Person JSON-LD validates. sameAs[] includes all social URLs.
- ED-AUT-003 · critical · Stats strip counts match database.
Integration
- ED-INT-001 · critical · Every cross-module mention resolves. Integrity sweep reports 0 broken.
- ED-INT-002 · major · sitemap.xml contains every IsActive published article URL in both locales.
- ED-INT-003 · major · Scheduled articles flip to Published at ScheduledFor exactly. Drift = critical.
- ED-INT-004 · major · ViewCount denormalisation reconciles nightly with analytics.
