{
  "generated": "2026-09-22",
  "summary": {
    "qaVerdicts": 920,
    "ok": 907,
    "defectsFlagged": 14,
    "fixed": 11,
    "adjudicatedParity": 2,
    "captureArtifact": 1,
    "unresolved": 0
  },
  "defects": [
    {
      "route": "/admin/active-members/[id]/edit",
      "panel": "admin",
      "issue": "Member summary card: email value overflowed and overlapped the Location label; label/value pairs desynced in the auto-fit grid",
      "rootCause": "DetailItem rendered bare dt/dd pairs as independent grid cells; dd lacked min-width/overflow-wrap so a long email bled into the next cell",
      "fix": "sales-rebuild AdminMemberActivityPages.tsx \u2014 wrapped each pair in styles.detailItem (stacked label-over-value block); added min-width/overflow-wrap rules to .memberEditFacts dt/dd in SalesClusterGPages.module.css",
      "verify": "verify/reshots/fix-memberedit2-rebuild.png \u2014 facts render as clean stacked pairs",
      "status": "fixed-verified"
    },
    {
      "route": "/admin/fit-tracker-musics",
      "panel": "admin",
      "issue": "Access column rendered raw legacy HTML source (<span class=label label-primary>Unlock with Ads</span>) as literal text",
      "rootCause": "API payload contains legacy HTML badges; rebuild printed the markup verbatim",
      "fix": "sales-rebuild adminAudioMusic.ts \u2014 stripLegacyHtmlLabel() normalizes access_type before the badge renderer",
      "verify": "verify/reshots/fix-musics-rebuild.png \u2014 Access column shows styled badges (Unlock with Ads / Free / Premium)",
      "status": "fixed-verified"
    },
    {
      "route": "/admin/food",
      "panel": "admin",
      "issue": "Mobile (390px): 9-column nutrition table squeezed into viewport, headers overlapping/unreadable",
      "rootCause": ".foodTable used fixed layout with min-width 0 on mobile \u2014 no horizontal scroll",
      "fix": "AdminFoodSectionPages.module.css \u2014 @media (max-width:720px) .foodTable { min-width:860px !important; table-layout:auto } restoring horizontal scroll inside .mfs-compact-table-wrap",
      "verify": "verify/reshots/fix-food-m-rebuild.png \u2014 clean columns with scroll",
      "status": "fixed-verified"
    },
    {
      "route": "/auth/login/[id]",
      "panel": "member",
      "issue": "Authenticated users hitting a purchase whose package bootstrap fails got bounced login\u2192purchase\u2192login in an infinite loop",
      "rootCause": "purchases/[id] redirected authed bootstrap failures to /auth/login/<id>?state=register, which redirected back to purchases",
      "fix": "mfs-web-original-upgrade src/app/payment/purchases/[id]/page.tsx \u2014 authed failure/no-product now redirects to /plan-pricing",
      "verify": "verify/reshots/fix-purchases-rebuild.png \u2014 /payment/purchases/6564 authed renders plan pricing grid",
      "status": "fixed-verified"
    },
    {
      "route": "/auth/registration-success/access-program",
      "panel": "member",
      "issue": "Embedded YouTube 'How to start your program' iframe rendered blank (ERR_BLOCKED_BY_RESPONSE)",
      "rootCause": "Site-wide cross-origin-embedder-policy: credentialless blocked third-party iframes lacking the credentialless attribute",
      "fix": "proxy.ts \u2014 dropped COEP from LEGACY_EDGE_SECURITY_HEADERS (legacy sends no cross-origin headers; COEP also broke Cleeng + all YouTube embeds)",
      "verify": "verify/reshots/fix-accessprog-rebuild.png \u2014 YouTube thumbnail + play button render",
      "status": "fixed-verified"
    },
    {
      "route": "/cooking-videos/detail/[id]",
      "panel": "member",
      "issue": "YouTube iframe blank card (same COEP root cause)",
      "fix": "Same proxy.ts COEP removal",
      "verify": "verify/reshots/fix-cookvid-rebuild.png \u2014 video embed renders with thumbnail",
      "status": "fixed-verified"
    },
    {
      "route": "/payment/cleeng/[id]",
      "panel": "member",
      "issue": "Cleeng secure-checkout widget never painted (stuck)",
      "fix": "Same proxy.ts COEP removal \u2014 third-party Cleeng JS/iframe now loads",
      "verify": "verify/reshots/fix-cleeng2-rebuild.png \u2014 full Cleeng 'Secure checkout' sign-in widget renders",
      "status": "fixed-verified"
    },
    {
      "route": "/payment/purchases/[id]",
      "panel": "member",
      "issue": "Same auth redirect loop as /auth/login/[id] (shared root cause)",
      "fix": "purchases/[id]/page.tsx authed-failure \u2192 /plan-pricing",
      "verify": "verify/reshots/fix-purchases-rebuild.png",
      "status": "fixed-verified"
    },
    {
      "route": "/sales/badge-endpoint-challenge/skill/[id]/detail",
      "panel": "sales",
      "issue": "Fetch error banner 'We couldn't load these challenges right now' for id 962871",
      "rootCause": "id 962871 is a FORMAT_SPECIAL_BADGE row, not a skill challenge; legacy ignores {id} and always renders the skill index",
      "fix": "Backend BadgeEndpointChallengeController skillDetail/skillEdit now call real id-aware detailPayload/editPayload (findChallengeRow filters skill format \u2192 404 for non-skill); frontend BadgeEndpointChallengePages falls back to BadgeChallengeIndexPage initialFormat=skill on query error \u2014 matches legacy",
      "verify": "verify/reshots/fix-skilldetail-rebuild.png + fix-skilledit-rebuild.png \u2014 Skill index renders (empty list, Skill tab active)",
      "status": "fixed-verified"
    },
    {
      "route": "/sales/badge-endpoint-challenge/skill/[id]/edit",
      "panel": "sales",
      "issue": "Same as detail",
      "status": "fixed-verified"
    },
    {
      "route": "/auth/otp",
      "panel": "member",
      "issue": "QA flagged overlay rendering",
      "adjudication": "PARITY \u2014 rebuild deliberately reproduces live oracle (:3006) observable output; :3007 prod build differs but is not the canonical oracle for this surface",
      "status": "adjudicated-parity"
    },
    {
      "route": "/fitness-app",
      "panel": "member",
      "issue": "Body exposes raw ENOENT + absolute filesystem path; :3007 shows styled 404",
      "adjudication": "PARITY \u2014 documented in src/app/fitness-app/page.tsx: the LIVE legacy deployment (:3006) serves exactly this ENOENT Express error because routes/static/wp/index.html does not exist there. The standalone prod build (:3007) lacks the static mount so it 404s. Rebuild reproduces the canonical oracle verbatim.",
      "status": "adjudicated-parity"
    },
    {
      "route": "/profile/[username]",
      "panel": "member",
      "issue": "QA capture showed a stuck spinner (textLen=41)",
      "adjudication": "CAPTURE ARTIFACT \u2014 live probe confirmed /profile/<user> \u2192 client redirect \u2192 /app-download landing renders fully (title 'Download Myfitsociety\u2026'). The reshoot tool snapshots before the client-side navigation completes.",
      "status": "capture-artifact"
    },
    {
      "route": "/premium/questionnaire/summary + 15 v2 summary routes",
      "panel": "member",
      "issue": "Canonical post-questionnaire funnel dead-end: creating-plan redirects to v2 final-summary whose Get My Plan CTA does nothing (selection-only); user cannot reach checkout",
      "rootCause": "QuestionnaireV2FinalSummary.onSelectPlan never wired \u2014 server component cannot pass a function prop; no payment href existed",
      "fix": "questionnaire-v2/summary/page.tsx injects _payment_href (encrypted /payment/purchases/<id> via buildPackageHref + buildQuestionnairePaymentQuery) into every package server-side; final-summary CTA navigates via window.location.assign. Covers all 16 routes delegating to QuestionnaireV2SummaryRoute.",
      "verify": "verified: CTA navigates to /payment/purchases/<encrypted id> with full query (page_source, country, display_* metadata); checkout renders package + payment methods. Desktop + mobile reshot (flow-v2/cta-fix-*).",
      "status": "fixed"
    }
  ],
  "flowFindings": [
    {
      "route": "/auth/otp",
      "panel": "member",
      "note": "500 dev-error overlay w/ source frames (transaction.data.invoice_id undefined) \u2014 intentional verbatim reproduction of live oracle :3006 dev-mode page; flag for product owner: consider styled error in production",
      "status": "parity-documented"
    },
    {
      "route": "/auth/forgot-password",
      "panel": "member",
      "note": "POST /api/user/forgot-password \u2192 422 callback host not allowed (136.65.131.90:3121 not in backend allowlist) \u2014 deployment config, not UI defect; form+error banner render correctly",
      "status": "config-note"
    },
    {
      "route": "/payment/purchases",
      "panel": "member",
      "note": "?page_source on purchase URL routes bootstrap failure to /session-expire instead of /plan-pricing (page.tsx:672) \u2014 intentional per source",
      "status": "documented"
    },
    {
      "route": "/unsubscribe/[id]",
      "panel": "member",
      "note": "error string renders Indonesian on EN page \u2014 legacy parity (legacy shows same string)",
      "status": "parity-documented"
    },
    {
      "route": "/affiliate contact",
      "panel": "affiliate",
      "note": "submit \u2192 422 from downstream FE hop (account name >24 chars) \u2014 backend validation, not UI defect",
      "status": "documented"
    }
  ]
}