FM Stage III — Build Status

reskin scrub-run complete, prepping the Pravesh handoff · updated 2026-08-05

✅ Built on reskin, scrubbed and verified live — ready to port to dev

Schema + routing

Locale Routing — /es/courses style URL prefixes

languages.code/status columns, backfilled by name (never by ID — reskin/dev IDs don't match). Built on mcamara/laravel-localization (swapped from the originally-planned niels-numbers/laravel-localizer package same day, before any deploy — see .claude/change-ledger/locale-routing.md).

2026-08-05: full live QA pass found and fixed two real bugs — the manual language dropdown had been non-functional since this shipped (never updated for URL-prefix routing), and a corrupted Blade token had been live in that dropdown's markup since the repo's first commit. Both fixed, all four content types' detail→listing fallback reverified live.

Catalogs

Blog w/Locale · Locale Edit II · Sitemap (multilingual)

Course/Bootcamp/Ebook/Blog catalogs correctly hard-filter by active locale. One full sitemap set per active language (7 locales), no hreflang anywhere — confirmed architecture: each language's course/blog/bootcamp/ebook entry is its own standalone object, not a translation of a canonical page. hreflang was explicitly abandoned, not deferred.

Language Setup II

Auto Detect Language, Site Wide SEO Management, GDPR Cookie Consent

Auto-detect suggestion bar (with admin kill-switch + bilingual native/English text). /admin/seo_settings wired to get_phrase() per-locale, JSON-LD auto-generation, 9 new/wired SEO tabs (16 total, up from 7). GDPR consent-record capture + webhook dispatch on every consent-relevant event.

Registration & account

Registration Additions · Hide "Become an Instructor" · Legal Settings

Country/Preferred Language/Terms/Marketing fields on /register (ported country_options + profile fields from dev, adapted to resolve language by code — never a raw cross-host ID). Instructor signup path hidden. Legal pages (Terms/Privacy/Refund/ Cookie Policy) now their own per-language admin CMS with SEO fields.

Consolidation

Outbound Webhooks — ported from dev, GDPR webhook config retired

Reskin had built its own bespoke GDPR-only webhook settings, duplicating a generic named registry Pravesh already shipped on dev ("GHL SUBSCRIPTION GATE", 2026-07-25). Ported that registry to reskin verbatim, repointed DispatchGdprWebhook at it, retired the duplicate. One mechanism now, matching dev's shape exactly — this one should need no adaptation at merge time.

Infra / crawlability

Cloudflare X-Robots-Tag · environment-aware robots.txt

Both reskin and dev now genuinely blocked from indexing at the Cloudflare edge (root cause was both hosts being DNS-only, not a rule problem — fixed by flipping both to proxied, with the Object Translation Fargate callback pipeline reverified unaffected). robots.txt flips to permissive + a Sitemap: line automatically on any host that isn't reskin/dev — no manual step needed when this ships to production.

🕓 Still open

Never started, on purpose

Notifications & Messages

Unblocked (Pravesh's M3 endpoint confirmed live) but deliberately sequenced last — Abel's priority call from the start, not a dependency issue.

Not scrubbed this run

Language Audit 2 (docs)

Documentation task from the original plan — not touched by this scrub run.

Deferred, Abel's call

GDPR account-deletion live walkthrough

Mechanism exists; a real end-to-end walkthrough hasn't been run yet. Parked, not forgotten.

Separate ongoing track — not part of this scrub run

Own workstream

Public Front End Reskin (Lane A / Lane B)

Wiring the approved "Around" theme into real Blade files, page by page. Its own build queue and review process under handoffs/public-theme-reskin/ — tracked there, not in this scrub-run doc.

Two tracks never merge into the flow above — dev/Pravesh only, or the merge point itself:

Pravesh only · dev

GHL Subscription & AOV · Attribution

reskin has none of the underlying subscription/GHL schema. Not a priority choice — a missing foundation. (Outbound Webhook is no longer in this list — see "Consolidation" above; that piece is now built on reskin too, ported from dev's own version.)

Merge point — next up

Change-ledger → UPDATE-PACK → dev

Everything in the "Built on reskin" section above ports to dev as marked hunks only — never a wholesale merge (reskin is 39 migrations behind). Same pattern already proven with Object Translation, and the shape Pravesh already uses on his own side (custom_edits_readme/). Every feature above has its own .claude/change-ledger/*.md entry ready to generate an update pack from.

built & verified on reskin, ready to port still open separate ongoing track not buildable on reskin — dev/Pravesh only merge point