reskin scrub-run complete, prepping the Pravesh handoff · updated 2026-08-05
✅ Built on reskin, scrubbed and verified live — ready to port to dev
/es/courses style URL prefixeslanguages.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.
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.
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.
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.
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.
X-Robots-Tag · environment-aware robots.txtBoth 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
Unblocked (Pravesh's M3 endpoint confirmed live) but deliberately sequenced last — Abel's priority call from the start, not a dependency issue.
Documentation task from the original plan — not touched by this scrub run.
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
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.
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.)
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.