Jessar Website — Progress

RevShift Media × Jessar Industries · Shopify Migration & Brand Elevation
Last updated: 2026-07-03
Session: 40 (Session 27c) — ZERO-404 CLOSURE (Sean: "I do not want 404s and to be embarrassed at launch"): turned the redirect estate from "most things" into PROVABLY COMPLETE. Verification not vibes: validated every applied target resolves → found 1 broken (/faq → non-existent /pages/faq → fixed to /pages/become-a-dealer) of 2,498, rest clean. Then closed every gap: ① probed jessar.ca for NON-SITEMAP Woo surfaces — /shop/ · /my-account/ · /product-category/* · /contact-us/ · /catalog/ all 200 today (would 404 at cutover) → redirected (shop→home · my-account→WebCRM · contact-us→contact · catalog→dealer). ② caught a MALFORMED-SITEMAP trap: the product_cat sitemap emits /''/products/… (stray ''); confirmed the REAL category URLs are the clean /products/<dept>/ tree (200) which pass 2 already mapped right, /''/ phantoms covered as belt-and-suspenders. ③ ALL ~1,470 discontinued products → nearest topical collection (keyword ruleset + empirical SKU-prefix→dept map: 1→bulbs · 2/3→electrical · 4/5→lighting · 6→household · 7/8→kitchen) — 0 dumped to home; 77 fuzzy rows → collection (safe); junk (hello-world · /author/* · uncategorized) → home. ④ /product-category/<slug>/ for every slug+parents → collection. 1,776 closure redirects applied (0 err) + 2 brand pages. FINAL PROOF (re-runnable): fetched jessar.ca's full sitemap estate (1,944 URLs, all 6 sub-sitemaps) + diffed vs the now-4,277 live redirects → 0 UNCOVERED; re-validated all targets → 0 BROKEN. Honest caveat: no map enumerates the infinite non-sitemap tail (feeds · tag pages · query-strings) → those hit the BRANDED 404; safety net = post-cutover Shopify-404-report + GSC monitoring. Review rewritten as a coverage-PROOF: jessar.revshiftmedia.com/redirects_review_v1. COLLECTION-MAPPING QUALITY AUDIT (Sean: "are collections mapped properly?"): grouped all 497 category→collection redirects by destination + consistency scan → caught + fixed ~19 misfiles (vinyl-tape = Xtricity electrical tape was → Décor, now → Electrical Tape collection + its 12 product URLs → exact live products; vanity BULBS were → Wall&Vanity fixtures, now → Light Bulbs; stools → Décor; placemat → Serveware). Post-fix consistency scan = 0 flags across all 497. Non-redirect flag: the "Bedding & Linens" collection is MIS-STOCKED (its live products are over-the-door hangers/hooks + a bar stool, not bedding) — a product→collection membership/merchandising issue, not a redirect one. PRODUCT-REDIRECT QUALITY VALIDATION (Sean: "products as well to be validated"): validated all 2,162 product→product redirects — 1,729 SKU-VERIFIED (old URL's trailing SKU literally matches a variant SKU on the target — definitive, 0 mismatches; the false "mismatches" were my checker mis-reading spec numbers like e26-3000k / 1600l as SKUs) + 395 strong-title fuzzy (Jaccard≥0.5, no colour conflict — verbose renames like towel-rack→towel-rack-with-wood-bar). CAUGHT + FIXED 38 genuinely WRONG fuzzy matches the spec-strict numeric rule let through (colour/model aren't numeric): 5 distinct pendant models (bixham/declan/foster/portland/veronica) → one "majestic", led-par38-RED → a BLUE bulb, frosted A19 → a bug-light, beige mat → white, vanity-light-dawson → -fairview → ALL 38 re-routed to their correct collection (safe/relevant beats precise-but-wrong). Final scan = 0 colour conflicts, 0 SKU mismatches across 2,124 exact-product redirects; ~1,632 discontinued/renamed-uncertain → collection. PRIOR: 39 (Session 27b) — REDIRECT-COVERAGE AUDIT → THE LIVE WP SITEMAP DIDN'T MATCH THE EXPORT — SECOND PRODUCT PASS APPLIED: Sean asked "what is not redirected yet?" → sitemap-vs-applied diff surfaced a CRITICAL gap: today's live WP product slugs are SKU-suffixed (…-7-99372/) and largely DON'T match the old export the 1,216 product redirects came from (only ~1 of 1,591 live-sitemap product URLs was covered — export slugs drifted; the live sitemap is what Google actually indexes). SECOND PASS on the LIVE URL set (1,591 products + 186 pages): ① SKU extraction from slug tails (incl. -copy/-2 dedup suffixes) → 515 matched; ② token-fuzzy matcher with NUMERIC-SPEC-STRICT rule (digit tokens must all match — numbers are identity for electrical; killed a plausible-but-wrong 135W→223W high-bay match, accepted the extension-cord→ext- renames) → 426 auto (≥0.75); ③ 160+ WP pages mapped (the /products/* nav-tree via the category ruleset + brand pages: js-gourmet-*→their collections · beauty-cover→décor · wool/knitting→home-bath; utility: catalogs+register→become-a-dealer · customer-support→contact · led-101+smart+xtricity-bulbs→bulbs · logistics→about · log-in→WebCRM). ~1,113 NEW redirects applied. HELD for Sean: 77 fuzzy-review rows (0.55–0.75 — discontinued variants → nearest equivalent, e.g. bar-stool Fixer/Flex/Glamour → the similar live stool) + dead-ends: 222 SKU-dead + 350 no-match (live sitemap) alongside the 956 export dead-ends; junk deliberately left to 404 (hello-world · uncategorized · 6 author pages). PRIOR: 38 (Session 27, PM) — RUNWAY BATCH 2: GOLD SPECS · IMAGE ORDER · CATEGORY 301s · WHERE-TO-BUY PURGE + DEALER LOGIN — Sean's 4-item batch, all shipped. ① GOLD SPECS — validated BEFORE pushing (his hunch half right: a push HAD happened — weight ~59% + care already live). Per-SKU diff of extracted_content.json vs live (1,679 SKUs) → real gaps dims 436 / materials 507 / capacity 76 / weight 26. Pushed the CLEAN sets via new gated scripts/push_gold_specs.py (additive-only, resumable): dimensions 427 — incl. the ~200-SKU cohort where extraction mislabelled CM as MM ("L:22mm kettle" impossible; verified vs live sibling 7-99372 at 21.4 cm → reinterpreted) — + 388 computed imperial + materials 504 (split/cleaned lists) + care 34 = 786 products / 1,353 values / 0 errors. SKIPPED dirty tails (truth over speed): weight 26 ("evenly distributed.") + capacity 76 (lighting LUMENS misparsed as litres, "2400L"). Live-verified (7-99364 → "22 x 22 x 21 cm"). ② IMAGE SORT ORDER — 3,917 images / 1,681 products audited; classifier corrected for two traps ("3d" inside UUID hex · electrical products literally NAMED "Box"); 121 products had a _3d pack render ahead of product shots → productReorderMedia (product order preserved, boxes → gallery END; the rs-retail-ready band picks the box image BY ALT — no metafield exists — so the PDP box section still feeds; _3d render visually confirmed = box+product pack shot). 0 low-res filename dupes → nothing removed; AI heroes kept #1. ③ CATEGORY 301s — ALL 159 WP category URLs hand-mapped (keyword rules + domain knowledge: spiral-*/t-series/r14 = CFL bulb series → bulbs · sputnik → pendant · outlet-tap → cords · soap dispensers → bath · Beauty Cover liners → décor · L1-parent fallback) → 138 high / 21 judgment · 159/159 applied · 0 errors → 1,378 REDIRECTS NOW LIVE (inert until cutover). Review: jessar.revshiftmedia.com/redirects_review_v1 (all 159 rows w/ confidence + reasoning · product-map CSV · held-956 decision box). ④ WHERE-TO-BUY PURGED + DEALER LOGIN WIRED — footer-trade menu item removed; header-menu "Login → #" ⇒ "Dealer Login → crm.jessar.ca:6443/webcrm/" (menuUpdate; PAGE items need resourceId — gotcha logged); PDP CTA pair ⇒ "Become a Dealer" + "Contact us" (live template + snippet/schema defaults); PDP FAQ + contact route-card copy rewritten; templates pulled-live-first per the parallel-chat rule; changelogs appended. Scripts: push_gold_specs.py · reorder_media_boxes.py; logs: gold_specs_push_log.csv · image_reorder_log.csv · category_redirect_apply_log.csv. PRIOR: 37 (Session 26b, overnight) — MICHAEL'S B2B FEEDBACK DECODED → HOMEPAGE B2B RENDER + FULL-SITE PLAN (no site edits): Michael (post-sign-off, deeper review): homepage "too D2C — Jessar is exclusively B2B"; referenced corehome.com; unhappy the cut text from his doc was the B2B content. KEY DISCOVERY: his JESSAR INDUSTRIES docx IS Core Home's homepage rewritten for Jessar (mission line, icon values, Who-We-Are, the 19-category belt — 1:1 to Core Home sections). CUT-TEXT LEDGER: 3 of his 8 blocks fully cut, all three the B2B ones — ① Who We Are (team), ② the 19-category assortment list (compressed to 4 consumer cards → one-vendor-whole-aisle pitch lost), ③ WHAT WE DO BEST (global sourcing · quality elevation · design/packaging for perceived value · core volume programs · regular & opportunity buys · right price points · private label) — absent entirely. Plus 11 "Shop …" CTAs; retail proof buried at positions 18–21. BUILT OVERNIGHT: ① /homepage_b2b_v1 — render in the locked Soft Modern system (v4 CSS, zero new design language): B2B hero copy ("One supplier. The whole aisle." / "Programs that perform." / "Built to earn shelf space."), NEW stat strip (1996 · 4 brands · 1,700+ SKUs · EN·FR · coast-to-coast), RESTORED Who-We-Are + 19-chip category belt + 6-card What-We-Do-Best capabilities grid, retail proof promoted up, lifestyle trimmed 5→2, Dealer Login in header; per-section labels (restored/new/copy-only); implementation = native sections + copy + editor reorder, ZERO custom code, ~half day. ② /b2b_review_v1 — full-site B2B review & plan: ledger, Core Home→Jessar mapping, page-by-page audit (PDP & dealer already strong; collections need Shop-Now→View-the-range; PDP gains "Request price list for this product" via existing ?sku= prefill), keep-the-polish argument ("a buyer is a consumer with a purchase order"), 3-phase plan: A copy pass (~2-3 hrs, no gate) · B homepage build (render→Michael→build) · C B2B infrastructure backlog (case-pack/MOQ, line sheets, dealer hub, GA4 — Phase-6/billable candidates). 3 fast Michael questions flagged (private-label wording public? retailer-logo clearance? stat numbers). NO SITE EDITS. Both deployed — awaiting Sean's morning review. FOLLOW-UP (Sean: "the order is important — his writing or site-fit?"): v1 was a hybrid (top half his doc; Growth&Collab left at bottom; What-We-Do-Best mid-paged per Core Home) → built /homepage_b2b_v2_docorder — his 8 blocks in his EXACT sequence (mission → values → who-we-are → growth&collab at his #6 → better-living → what-we-do belt → what-we-do-best as HIS CLOSER), site sections (stats/ops/proof/brands/seasonal) slotted between without breaking it. RECOMMENDATION: put v2 in front of Michael; v1 = site-fit fallback. Plan doc updated with both links. FOLLOW-UP 2 (Sean: "consider richer Hyper sections — image-with-feature, layered-images-with-text, lookbook-slider, scrolling-banner"): all four verified native in Hyper → built /homepage_b2b_v3_editorial — v2's document order with editorial treatments per block: stat strip → SCROLLING-BANNER credential marquee (espresso band) · Who We Are → LAYERED-IMAGES-WITH-TEXT (stacked imagery + Since-1996 badge) · Better Living → LOOKBOOK-SLIDER (3 merchandised scenes, 9 hover product-pins, prev/next — replaces two static lifestyle bands; B2B read = "how the range merchandises") · the 19 categories → dual counter-scrolling SCROLLING-BANNER marquees (serif italic) · What We Do Best → IMAGE-WITH-FEATURE (warehouse image + 6 icon capabilities + celebrate-line caption — same section the PDP Retail-Ready block uses). All native, ZERO custom code. v3 = new recommended show-Michael candidate; v2 = plain fallback. DOM-verified (slider cycles, 0 broken images, order intact); deployed; plan doc buttons updated v3-first. PRIOR: 36 (Session 26) — LAUNCH-PREP EXECUTION (variant families live · SEO/OG · 301s · 5 decisions locked): shipped three unblocked runway items. ① VARIANT FAMILIES PUSHED (push_variant_families.py --apply): 208 of 211 metaobjects created + each member's jessar.variant_family metafield linked → the PDP "Also available in" swatch band + collection-card colour dots now render across the catalog. 1 skipped (2-Slice Retro Toaster demo, already linked); 2 errored — Beauty Cover vinyl liner (group 804) + group 1325 have >25 members, blowing Shopify's 25-metafields-per-call cap → flagged for a chunked re-run (metaobject exists, only member links failed). ② SEO + SOCIAL CARD — corrected to the NATIVE way (Sean's flag): first attempt hardcoded the homepage title/meta/og into theme.liquid + meta-tags.liquid; Sean flagged that this leaves the admin Online Store → Preferences (Social sharing image and SEO) panel EMPTY + uneditable by Jessar → REVERTED both files to stock native (meta-tags.liquid byte-identical to HEAD; title→page_title, desc→page_description, og:image→page_image, which on the homepage resolves to the Preferences social image). The 3 values now belong in PREFERENCES (client-editable): Home-page title · meta description · the purpose-built 1200×628 social card (rs-og-social.jpg, also deliverables/assets/og-jessar-1200x628 — warm kitchen scene + JESSAR wordmark + "Housewares worth carrying.", CDN-verified 200). TODO: paste the 3 Preferences values + upload the card via the admin (no Admin-API path for homepage SEO). ④ IMAGE-REQUEST DOC FOR JESSAR (jessar.revshiftmedia.com/jessar_image_request_v1): the 37 active products with ZERO images (verified against the live store — exact match to Sean's export), grouped into 8 families (S&P mills · die-cast cookware · kettles · thermoses · glasses · double-wall · LED lamps · 4 extension cords that also need real SKUs), print-first + per-row admin links — ready to send. ③ 301 REDIRECT MAP BUILT + APPLIED (work/redirect_map_FINAL.csv → apply_redirects.py via urlRedirectCreate): old WP product slugs validated against LIVE handles by SKU → 1,216 product URLs redirect to their new /products/<handle> (SEO-preserving) + 3 key pages. HELD: 956 discontinued products (no live match — mass-redirect-to-home is a soft-404 anti-pattern → nearest-collection pass or 404) + 154 WP category URLs (taxonomy restructured, need a hand-map). Redirects INERT until domain cutover. FIVE DECISIONS LOCKED (Sean): pricing NOT on PDP (also retires the MSRP ask) · dealer login = crm.jessar.ca:6443/webcrm/ · Privacy live / ToS sent-awaiting-revisions · Where-to-Buy dropped at launch · GSC being set up (Jessar has none yet). PRIOR: 35 (Session 25) — MICHAEL APPROVED THE SITE + TRACKER REALITY-CATCH-UP + LAUNCH RUNWAY: Michael reviewed the live site 2026-07-02 and LOVED it (banner + text notes to follow). Delivered the client site-review packet (jessar.revshiftmedia.com/jessar_review_packet_v1 — print-first per-page Keep/Change notes + live-store View-live buttons; he enters the emailed store password, no theme Share link exists). Built electrical category-tile options (2 Opus imagery agents → A1/A2/B1/B2, real Xtricity refs, ~24 cr) so the tile stops sharing the Xtricity brand-card image — awaiting Sean's pick. Header one-row design proven (jessar.revshiftmedia.com/header_redesign_v1; mega anchors to .header, not the nav row → safe) — staged for a duplicate-theme test, NOT deployed. RECONCILED THIS TRACKER to reality: Phases 0–2 done, Phase 3 done (color + type systems were locked-in-theme but showed unchecked — fixed; brand-landing parked), Phase 4 core templates live (hero-20 + system pages remain), Phase 5 build done (site live; open = msrp/pricing · 301s · GSC/GA4 · QA · train · launch). Created the master LAUNCH RUNWAY (jessar.revshiftmedia.com/launch_checklist — RevShift-internal, 50 items, localStorage) grouping do-now-ours · Phase-6 SOW · hero-20 · pending-Jessar · launch-ops. DIRECTIVE: prep everything not blocked by Jessar NOW — metafield audit + gold re-push, image sort-order, 301 map, nav/mega rebuild, header one-row test, Phase-6 assets. PRIOR: 34 (Session 24) — HOMEPAGE V4 LIVE ON THEME 190048960834 (Michael's copy + slideshow + AI imagery, pre-tour): all Hyper-native — hp_slideshow (native slideshow AFTER hp_hero, BOTH heroes enabled/stacked per Sean so he can toggle the options live for Michael in the editor; autoplay 5s, 3 slides, interim rs-slide-*.jpg imagery, captions in Michael's voice) · hp_mission (his mission quote) · hp_values (multicolumn-icon, lightning/tag/check @ #A65E45) · hp_lifestyle_head (chapter band) · hp_instores (scrolling-gallery-image, 5 tiles under the retailers row) · hp_doors = his corrected "high-performing" Growth&Collab copy · hp_close = "making every house feel like home" · hp_inside + partner-factories copy + button → NEW rs_production band on About ("Where our products are made", 3 factory columns) — link live, not dead. IMAGERY via two Opus subagents in Higgsfield (~52–64cr, balance ~328): 5 found-in-store recreations of Michael's phone photos (originals unusable — quality + bystanders incl. a minor; recreated people-free, JS Gourmet box art near-perfect) + 3 factory re-renders (partner facilities, no identifiable faces, 1 re-roll) → Files as rs-instore-1..5.jpg / rs-factory-1..3.jpg. GOTCHAS: image_picker wants shopify://shop_images/<name> (NOT shopify://shopify/files/ — push errors "must be a valid shopify url"); gpt_image_2 hard-fails refs containing real people — crop people from scene refs pre-upload. CSS parity in rs-soft-modern.css (RevShift - 2026-07-02 comments, scoped) + changelog created. Round-trip verified: 23/25 sections live. POST-QA FIX (Sean's live screenshots): ① v4 CSS had scoped #shopify-section-<name> but OS 2.0 JSON templates render shopify-section-template--<id>__<name> → ALL rules rescoped to the [id$="__name"] suffix pattern (mission/lifestyle measures + serif now apply); ② hp_inside's new paragraph had landed after the family sign-off and inherited the p:last-child accent-quote rule (orange text) → reordered before it; button anchor had the same template-- prefix problem → plain /pages/about; ③ "In the press" strip had no styling → serif pull-quote + accent text-link button, covering BOTH press variants (brand-logos section__description + native press swiper). Re-pushed + round-trip verified; Sean's in-editor press edits preserved (re-pulled before pushing). QA ROUNDS 2–3 (Sean's live screenshots): mission + close em → accent; lifestyle quote de-italicized to render spec; hp_inside CTA → btn--plain accent no-underline (real ancestor .rich-text__button a); press double-underline killed; values icons root-caused — theme.css [style*="--aspect-ratio"] > :first-child{position:absolute!important} pinned the svg to the coin corner → matched w/ !important override, centered; gallery: dropped img sizing overrides that fought the native absolute-fill aspect box (width-sized tiles, native 4:3), frameless render-parity, social/IG furniture hidden, 10-tile belt @ speed 0.5 (Hyper disables ALL marquees when OS Reduce Motion is on); hp_castiron padding_bottom 50→0 (cream strip at the flush seam). TOOLING PIVOT per Sean ("use the app not cli"): new scripts/app_asset.py (Admin REST Asset GET/PUT) is the standing write path; CLI auth also broke mid-session (theme-dev login attempts poisoned the session; auth logout fixed it). Sean disabled hp_hero — slideshow solo hero. Slideshow rotation visually confirmed via admin editor preview; storefront password stays Sean's to cross. PRIOR: 33 (Session 23) — MICHAEL'S INSPIRATION FOLDER DECODED → TOUR PLAN (michael_review_plan_v1, for the 07-02 3 PM website tour): 83 files Michael emailed (screenshots·banners·lifestyle·factory photos·2 videos·brand docx·cast-iron PDFs) reviewed in work/michael_review/ → 6 themes: ① rotating homepage hero (his "fade in fade out"/"animated banner" = auto-rotating slideshow, 4–5 category slides; refs C&B carousel/Williams Sonoma/AndMore) — Hyper native Slideshow covers it; ② per-category heroes/banners (C&B look; his category Excel arrives the weekend — wait); ③ retail-partner proof (Linen Chest/Simons/TJX; propose "Found in stores" band; rights caution on partner campaign creative); ④ factory/production credibility (~12 photos + 2 vertical videos → video-ready Inside Jessar + About); ⑤ About copy locked from his docx + exact "Growth & Collaboration" correction; Core Home = tone ref only (keep Soft Modern); ⑥ captions + tagged SKUs + AI bridge (double-wall lifestyle → 7-99177/78/369/370/665; serveware banner → 7-99387/7-99742; Michael himself plans AI lifestyle+video heroes — dovetails w/ the catalog-imagery program with his boss). Build-before-3PM shortlist awaiting Sean's go: hero slideshow · Inside Jessar video · About correction · double-wall gallery pushes. PRIOR: 32 (Session 22) — V3 CONTENT-REVIEW TOOL BUILT + DEPLOYED (jessar.revshiftmedia.com/product_content_v3_review, top card in /workspace): root-caused why the client copy-review tools showed stale data — product NAMES were canonicalized on the live store AFTER the June-3 v2 and never written back to product_content_v2.csv (the file those tools read); a June-17 bullet-shortening pass also sits unpushed. Descriptions + romance + bullets still match live; only NAMES drifted. INTAKE POLICY set for Jessar's returned edits: TAKE structured data + factual fixes (sub-brand · product line · dimensions/material/UPC/certs/specs · flags), IGNORE finalized names + stylistic copy. Built product_content_v3_review from the CURRENT live snapshot (1,679 active SKUs; live name/sub-brand/description/bullets via scripts/pull_live_v3.py → work/live_snapshot_v3.json; romance + specs from v2.csv, which live only locally) so client-visible == live. Fully editable (sub-brand · line · name · romance · description · features · specs · notes); autosave → jessar_content_edits_v3.json. v2 reviewer + copy Excel LEFT UNTOUCHED — v3 uses a separate localStorage key (jessar_pdp_edits_v3) so it cannot affect Chris's in-progress v2 data (deploys don't clear localStorage). Sean to tell Chris: export current work from v2, continue in v3. PRIOR: 31 (Session 21) — DATA PICTURE CORRECTED + CANONICAL /open_items REBUILT + DASHBOARD CELLS REFRESHED: corrected an overstatement — the live metafield audit reads the pushed layer (materials 30% etc.), but our rebuilt gold dataset holds far more (dims ~94%, weight ~60%, materials ~53%+ plus validated features) → most spec gaps are a re-push + validate on OUR side, not Jessar asks; genuine Jessar data gaps narrow to certifications + the Xtricity manuals (lighting/electrical, ~738 SKUs). Logos: we hold raw marks for 9 of 10 sub-brands — only Jessar Lighting missing. Added asks: what-NOT-to-show-on-PDP, sub-brand marketing-tier confirm, Jessar Lighting logo; Privacy/ToS = build from Sean's raw template. Made open_items.html the canonical living /open_items (was publishing dated files → /open_items had gone stale) + refreshed all status cells (Sean flagged the lag). Target go-live 2026-07-28. PRIOR: 30 (Session 20) — TARGET GO-LIVE SET: 2026-07-28. Added the launch/access asks we hadn't captured (the operational gate items): design sign-off (THE gate — polish + the 20 hero PDPs + launch all wait on it), Shopify plan + billing, domain/DNS access, old-site URL list for 301 redirects, brand-assets confirm (logo/favicon/sub-brand marks), email deliverability (DKIM/SPF + inquiry inbox), analytics + Search Console access, dealer-system URL, legal copy. Reverse schedule for July 28: data returns + 33 images + lifestyle + design sign-off by ~July 7; domain/DNS + Shopify plan + brand assets + analytics + redirects + QA by ~July 21; cutover July 28. Open-items brief updated with Section D. PRIOR: 29 (Session 19) — OPEN-ITEMS RECONCILED vs the data + call brief updated: verified the image gap = 33 Cook & Fresca specials (request issued); the '37 missing-image' total = 33 specials + 4 malformed Xtricity extension-cord SKUs (data-cleanup — need real SKU #s, not a clean image ask). Biggest outstanding request = jessar_data_request_2026-06-02.xlsx (1,667-row Data-Needed: case packs · carton dims · certifications · UPC · 'still needed') — confirm it reached Michael + chase the return. Per Sean: hero picks DONE, retailer list confirmed, press none, French deferred, inserts not needed → removed; added box-style-per-product, new-products+data, lifestyle images, sub-brand mapping confirmation. Brief: jessar.revshiftmedia.com/jessar_open_items_2026-06-29. PRIOR: 28 (Session 18) — BRAND-PAGE RENDERS + PARKED · CLIENT-CALL-PREP BRIEF: explored a single metaobject-driven brand landing template — v1 read too homepage-y (hero→category tiles→featured grid), re-cut as v2 (editorial brand-world: oversized cover hero, manifesto, signature products, lifestyle band, the-lines navigator, single catalogue funnel; line pages = same template, sub-sections fail-closed). Sean PARKED it (unsure of direction — no build). Generated a prioritized client-call-prep brief for the 2 PM Jessar call (jessar.revshiftmedia.com/jessar_open_items_2026-06-29): everything still needed FROM Jessar to finish — 33 specials' images, certs (~1,433), 2-SKU reconcile, tea-thermos names, casserole sizes, line-names-in-titles, hierarchy v4, arch-v3 sign-off, hero 20-of-50, About milestone years, authoritative retailer list, press coverage, FR scope, imagery add-on go/no-go, domain/DNS, inquiry routing, dealer-system URL, legal copy, go-live date. Also a project status recap (jessar.revshiftmedia.com/project_status_2026-06-29 — done/now/left). PRIOR: 27 (Session 17) — PAGE-SYSTEM NATIVE-VS-CUSTOM AUDIT + HOMEPAGE FINALIZATION (all live, theme 190048960834): 6 core templates LOCKED for client review (home·collection·product·about·dealer·contact). Homepage native build done — Inside Jessar → custom-content (video-ready); retailers row → brand-logos with 7 REAL logos sourced from the web (Wikimedia + Linen Chest official, rendered via @resvg/resvg-js, height-normalized). Contact validated + LOCKED on RS (native contact form is functional; the 3 Hyper demo sections Sean enabled were disabled). Dealer + About: native Hyper parallels built ALONGSIDE the RS versions for Sean's side-by-side review (dealer 4: hero/why/steps/partners; about 6: hero/film/timeline/work/partners/cta) — nothing removed; keep-custom = dealer form (multi-category checkboxes + ?sku= prefill) + About values/brands. 404 branded; /collections hidden (301); customer-care + find-a-store dropped; press built (needs content). Scope-gap pull: 1,705 products / 1,681 published, 29 collections, FR locale published — core migration essentially done; remaining = Where-to-Buy page, system pages, legal, FR content depth, out-of-scope Login removal. NEXT: brand pages + collection-landing template. PRIOR: 26 (Session 16) — COLLECTION-PAGE DESIGN PASS (live-verified, theme 190048960834): Option A product cards (flat, warm image well + white info portion, brand fonts, Hyper corners) · shop-by reverted to stock native card-collection · pills/buttons made dynamic from a NEW pinned metafield jessar.sub_collections_button (one-or-other per collection vs sub_collections) · SEO blurb now honours text_line_limit + read-more · facet headings → Inter · under-toolbar divider · active controls (checkbox + compare toggle) → terracotta. BASE TONE = OPEN (trialed scheme-15 #fcfbf7, reverted to white for A/B; global lever = scheme-1 first/default scheme). Renders: collection_cards_options_v1 / collection_product_card_options_v1 / collection_basetone_render_v1. Next = homepage. PRIOR: 25 (Session 15) — PDP "WRAP" POLISH, native-first, all live-verified on the storefront: ① Made-for → a 3-up feature section (multicolumn, rs_nav_anchor:"features") tied to the sticky nav; original rs-made-for left disabled (not deleted). ② Native subheading eyebrow made GLOBAL (.rich-text__subheading.text-subheading → Inter / accent-deep #A65E45 / 11px / .14em in rs-soft-modern.css) so every native section matches the rs- eyebrow. ③ Retail-Ready (image-with-feature): 4 Tabler icons (packages/box/world/barcode) recoloured accent-deep + thinned (root-caused: Hyper's .icon--thick path{stroke-width:.2rem}+non-scaling-stroke overrode the inline SVG → fixed at the CSS control surface) and wired to the sticky nav. ④ Dealer CTA redesigned ("B layout+heading, C paragraph"; partners row → partners_lead "In good company —"; spacing/sizes). ⑤ Image lightbox on the Retail-Ready box — first a custom overlay, then REBUILT to reuse Hyper's NATIVE PhotoSwipe per Sean (white bg, double-tap/pinch/scroll deep zoom to 4× + pan, native close button); gated enable_image_lightbox, scoped to this instance, no innerHTML. All pushed live (schema-first) to theme 190048960834 + browser-verified. Changelogs updated. PDP PAUSED here per Sean ("done for PDP for now"). PRIOR: 24 (Session 14) — PDP DESIGN POLISH + v2 CONTENT PUSHED LIVE + GALLERY-CAPTION BAND BUILT. CONFIRMED this round: ① v2 descriptions + feature bullets pushed to ALL 1,667 live products (EN) via scripts/push_v2_content.py (productUpdate descriptionHtml + metafieldsSet jessar.feature_bullets; resumable, log work/v2_push_log.csv) — Sean's call: ignore the cull, push to all (the "846 not in keep" was the stale inverted-reading removal list; those products are staying). FR stays in the Shopify translations layer (separate pass pending). ② PDP polish round, NATIVE-FIRST (Hyper sections + dynamic metafield bindings wherever possible; custom rs- only when native genuinely can't): breadcrumbs v4 (11px uppercase, muted links, current page darker ink, no accent — 4 iterations); section-nav shadow fix (shadow was leaking from a prior header-shadow test in section-rs-pdp.css → moved onto the nav element); header↔nav gap closed (-3px sticky offset; the old header shadow had been masking it); buy-area rhythm tightened (--product-blocks-gap 2.4→1.7rem); mobile swatch cut-off fixed; section-nav mobile active-follow scroll; romance bound to a Hyper rich-text block via product.metafields.jessar.romance (description back to top of buy-area; FAQ above related-products). DISPROVED the prior-session warning that dynamic-source bindings can't survive a CLI push — verified empirically. ③ A1 GALLERY-CAPTION BAND built — new gallery_caption metaobject (image·eyebrow·headline·body·position) + jessar.gallery_captions product metafield (ordered list); fail-closed render in product-thumbnail.liquid (no-caption products render byte-identically); matching switched image-file-reference → SLIDE-POSITION integer (editor sets "this caption = slide N"); band is a position:absolute frosted overlay at the bottom of the image frame (not a separate block below); proofed on the toaster (caption on slide 1). IN-FLIGHT, awaiting Sean: gallery-caption band needs a live visual verify on the toaster PDP (storefront gated from Claude); BULLET-SHORTENING REVIEW (1,125 bullets >100ch shortened to ~74ch mean by 12 parallel agents) at /bullet_shortening_review_v1 — NOTHING pushed until approved. Imagery/video program remains PARKED (air-fryer explainer blocked on Higgsfield credits; resume file docs/photo-video-status.md). PRIOR: 23 (13k) — ORANGE/PURPLE REMOVAL RUN EXECUTED (long-parked blocker CLOSED): new client file "Items-Jessar for Sean (Orange-Purple).xlsx" read by cell fill colour — 119 orange (FFC000) + 23 purple (accent5 #A02B93) = 142 discard, 853 keep (the yellow is a stock flag in the On-Hand-Reserved column only, not a discard signal). Cross-referenced vs the live store: only 26 were actually live; the old 7-98067 contradiction is resolved (it's now explicitly purple). Sean approved 24 (held 7-99020 + 7-99347 — both on Michael's imagery wishlist, conflict to reconcile). Archived (reversible, drops from storefront + search, data intact); 24/24 verified ARCHIVED + storefront 404. ACTIVE PRODUCTS NOW 1,681. Revert map saved. The 23 purple = the entire small pedal-bin / trash-bin range (a deliberate line cull). PRIOR: (13j) AI IMAGERY PUSHED TO DEV STORE (Sean-approved theme test): 40 media / 31 products / 0 errors — every pilot item's square AI hero now sits at gallery position 1 (originals retained = fully reversible; all AI media alt-tagged "RS-AI", revert map saved); toaster/kettle/casserole additionally carry product-shot + feature + lifestyle stills at positions 2–4. Verified end-to-end: admin media order + storefront og:image serving the AI hero through Shopify CDN. ALL VIDEO PARKED per Sean — not up to par (Kling orbit + 4 paid Marketing Studio takes unused). Imagery quote restructure agreed in principle: Phase 1 = ENTIRE catalog (kitchen/home get lifestyle heroes; lighting/electrical get clean elevated product shots — no lifestyle needed, just better than current); the original ~25 request items get the full monty; 360/influencer video = Phase 2 once baseline imagery ships. NEXT: revised product list (trim the counts) + Sean theme-tests the AI-dressed PDPs; verdicts still open: bright-hero scheme-15 · header shadow. (Ops: mid-push the Mac's system DNS died — pinned the Admin host via 1.1.1.1 in-process, no system changes, healed itself ~10 min.) PRIOR: (13i) FULL-TREATMENT PILOT LIVE: 3 items (touchscreen toaster · 3L stovetop kettle · cast iron casserole; board held back — flat geometry) × Michael's 5 deliverables at /treatment_pilot_v1. 9/9 stills FIRST TAKE (ivory-seamless product shot · true-wide lifestyle · feature macro; toaster touchscreen renders crisp at catalog angle — pilot garble was angle-specific). 360 = Kling 3.0 orbit 8s 1:1 at 10 cr, first take, embedded on page. Measured rates: still 2 cr · Kling orbit 10–12 cr · MS UGC 12s 9:16+audio 60 cr → full stack ≈ 76 cr (~$3.80 compute) per item. ⚠️ Incident: 4 Marketing Studio video calls errored AFTER charging + starting (215 cr) — those outputs (3 kettle orbits + 1 toaster influencer UGC) are PAID and waiting in Sean's Higgsfield → Marketing Studio tab (they never appear in the API feed); rule adopted: never retry MS video on error, check the transaction ledger first. Balance ~64 cr → finishing the matrix (2 orbits + 2 UGC) waits on monthly reset / top-up / Ultra upgrade. Sean confirmed the earlier unattributed gpt_image_2 jobs were his own UI testing. PRIOR: (13h) AI SQUARE-HERO PILOT GENERATED: 20 items / 31 images (8 colour families run through identical scenes — touch + 4-slice toasters, 3L + electric kettles, DW mugs, OF glasses, flasks, French presses, boards — plus 11 singles), all off Michael's hero request list, only SKUs we HOLD imagery for. 31/31 completed, zero failures, ~10 min, 62 credits (per-SKU real packshot reference, square 1:1, 1K validation res — keepers get upscale + 2-ref finishing). Review page LIVE: /ai_hero_pilot_v1 (current hero vs AI candidate per SKU, grouped by family) — awaiting Sean's keep/re-roll/reject pass; NOTHING pushed to Shopify. Glassware spot-check excellent; touch toaster shows the known soft-control garble (finishing-pass fix). ⚠️ Five unattributed gpt_image_2 "#E8DFC8 background remake" jobs on the Higgsfield account tonight (~40 cr) — Sean testing in the UI directly? Confirm for the credit ledger. PRIOR: 22 (13g pass 2 live) — PASS 2 OPEN (Sean-led PDP walkthrough): bright-hero scheme-15 trial LIVE (revert tag ready) · chip colour dots via shared rs-color-hex · breadcrumbs native scheme support · a:empty swatch bug fixed (band swatches visually verified for the first time) · custom mega menu REMOVED → stock Hyper restored · AI imagery test deployed (/toaster_ai_review_v1; Lifestyle B now the toaster featured image) · header shadow test live. Awaiting Sean's verdicts (hero pilot · bright-hero · header shadow) + next walkthrough instruction. PRIOR: 📄 FINAL REPORT: jessar.revshiftmedia.com/website_plan_v1_final_report · 22 (13f) — WEBSITE PLAN v1 COMPLETE (re-affirmed 2026-06-12 after revision pass 1 + the scheme-paint fix Sean caught: 49/49 acceptance probes across all 8 page types, 0 liquid/i18n errors, 0 rs lint offenses): all Phase-6 close-out gates done — FR locale pass (rs string group in en+fr, every hardcoded user-facing string now t:-keyed: spec labels, retail units, collection counts, form fields), fail-closed sweep on the sparsest live SKU (0 Liquid errors, 0 missing translations, hero sections correctly absent), changelog completeness audit 72/72 RevShift-marked files referenced. Lighthouse deferred as environment-gated (password page). Remaining items are external-only by definition: Sean's punch-list/sign-offs/font/orange-rule + client assets (images · film · press · hierarchy · milestones) — content phase, not build. SEAN'S FIVE NOTES SHIPPED: sticky-nav gap CLOSED (header hides via sticky -72px, size never changes — settle-loop tracker now hugs its true bottom; verified flush on live scroll) · The Line swapped to Hyper stock image-with-text (per "use built-ins"; rs-lineblock kept as opt-in) · specs certifications ALWAYS render with the render's italic pending chip when no marks on file · backgrounds validated + locked explicit per v6 rhythm (canvas / story+retail warm / specs ink / dealer accent — beige family is the locked palette; further de-beige = render decision) · editor hero-gap = editor artifact (live block 125px compact) · MOBILE LAYER (≤749px) shipped across every rs- stylesheet per the approved mobile renders (20px gutters, 2×2 beam, scroll-row tiles & lines, stacked CTAs, 2-col mobile grid) — ready for phone review + punch list. VISUAL QA ON LIVE THEME DONE: screenshot pass caught + fixed the raw demo FOOTER (Miami address/garacestore/10%-off newsletter!), demo announcement line, stock demo HERO slide → new rs-home-hero (scrim + two CTAs, v8-true), the all-caps/shrunken Line block (.rs-subbrand class collision with the title-split → renamed rs-lineblock), Inter card titles on related products (serif now global), internal KITCH codes on cards (hidden), exposed B2B price facet (suppressed), retail-ready box image (3d-alt aware), duplicate nav anchors. MOBILE RENDERS v1 DEPLOYED for approval: mobile_pdp · mobile_home · mobile_collection · mobile_dealer · mobile_about · mobile_press · mobile_contact (all _sm_v1, 430px spec) — approve → responsive theme pass. Press template confirmed live (pre-push cache on Sean's view). RENDER-PARITY PASS DONE (Sean's review → /goal): every page rebuilt to its locked render with specs extracted by analysis agents. PDP 24/24 (story centered · The Build · Why-it-earns · Signal/Fold feature_band metaobjects seeded on toaster · Made-for tiles · retail-ready grid · The Line sub_brand_profile · heritage · dealer+partners · STICKY NAV FIXED: wrapper-sticky + auto anchors + z under mega menu) · collection (split banner, tile restyle, sticky line pills, card CSS) · homepage 16/16 (markline, cat cards live counts, brands+THE LINES, film, press strip, Found At, doors) · dealer/about/press rebuilt + CONTACT CREATED (topic-routed form, ?sku= prefill). Announcement-bar demo line purged. 18 new rs- sections + rs-soft-modern foundation; theme check 0 rs-offenses; verified via password session + screenshots (scrollspy live). MORNING: Sean approved → taxonomy repair APPLIED (365/365 ok); bath + storage-household children live (home-bath = 4 tiles); variant-family DRAFT→ACTIVE fix (Liquid hides DRAFT metaobjects — band now renders, swatches verified white/black); storefront sweep with store password caught + purged B2B leaks (Hyper demo "10% OFF" newsletter popup was LIVE on homepage; header cart icon + drawer $0.00 markup → gated via new rs_hide_cart setting + cart_type→page + demo copy neutralized). Verified live end-to-end: PDP beam/benefits/family band · 6 kitchen shop-by tiles · mega menu 28 live-count tiles · homepage clean. OVERNIGHT PASS DONE: Sean's two fixes live (meta beam + benefits line now driven by single list metafields — `Label : Value` entries / curated phrases, per-item flexible, no more cut-off words); 22 v3 child collections created+published with images (kitchen ruled on live-verified taxonomy nodes, lighting/electrical/décor/bedding on TYPE); shop-by sub-collection tiles + nested mega menu fully data-fed (dept images set too). CAUGHT: taxonomy drift on ~365 live products (mapping ids vs live taxonomy: bath→"Dummy Surveillance Cameras", décor→"Flood/Fire/Gas Safety", electrical→"Fuel Containers & Tanks") — repair script staged + dry-run verified, BULK APPLY AWAITS SEAN'S GO; bath + storage-household children deferred until repaired. 211 variant families staged w/ distinct names (variant_families_proposed.csv; gated push script ready — run AFTER v2 title push). Storefront render self-checks blocked by dev-store password page (need store password). theme check: 0 rs-offenses. — PDP DESIGN LOCKED: hero_pdp_sm_v6 canonical + template_master_spec (ONE template, metafield-gated sections — paramount; 22 sections × 6 recipes). Variant families = metaobject-interlinked individual listings. Five recipe demos live (kettle · toaster · fixture w/ bulb-attach · bulb · electrical nameplate). Function extractions staged via subagents: appliances 64 · fixtures 402 (96%) · electrical 84. Heritage line → above dealer CTA; founded 1996 confirmed; tinted galleries tested+rejected. THEME v1 BUILT A→Z on working theme 190048960834 (PDP rs-blocks/sections · collection tiles+SEO+B2B cards · custom mega menu + 4 dept collections · homepage · dealer/about/press pages · changelogs complete · lint clean). All 1,705 products bulk-published to Online Store channel (were never on it). Earlier: HOMEPAGE LOCKED (home_sm_v8: v7-banner hero, cats prime, facility-film split section — filming next week, press strip honest slots, NO locator, What's-New+Dealer action cards; markline copy flagged for rework). Collection + PDP locked earlier. Next: secondary pages (about/contact/press/dealer/brand template). Earlier today — Cook & Fresca backfill LIVE + status consolidation → pivot to theme deployment. 36 special products pushed as individual listings (canonical variant-grouped titles, no brand-in-title, 13 metafields each; Cook & Fresca line now populated). Caught + fixed a silent Shopify API regression (variant sku → inventoryItem.sku; was nulling SKU+barcode). 33 of 36 need imagery — request sent to Jessar (deck images = competitor screenshots/composites, rejected). Site architecture v3 + title-canonicalization review with Sean. Removal run parked on client data contradiction (orange rule vs 7-98067). WP extras migration complete (2,062 imgs / 1,163 SKUs); 3D renders complete on drive (979 files), push resume-ready. Next: theme deployment.
Current phase
Build essentially COMPLETE — full site LIVE (1,705 products / 1,681 published · 29 collections · EN+FR). Homepage v4 live; Michael reviewed 2026-07-02 → loved it (banner + text notes to come). Now in launch-prep — staging every unblocked item. Runway: /launch_checklist. Target go-live 2026-07-28.
Today's focus
(2026-07-04, PM) Runway batch 2 — 4 for 4.Gold specs pushed (validated first — weight/care were already live; real gaps filled: dims 427 + imperial 388 + materials 504 + care 34 = 786 products, 0 errors; dirty tails skipped incl. lumens-as-litres). ② Image sort order — 3,917 images audited, 121 products reordered (product shots lead, pack renders → gallery end, box band feeds by alt); 0 dupes found. ③ Category 301s — all 159 mapped + applied → 1,378 redirects live; review: /redirects_review_v1. ④ Where-to-Buy purged everywhere + Dealer Login → WebCRM wired. Homepage/B2B renders parked for Michael (v3 · v2 · v1 + plan).
Active blockers
Michael's deeper review (07-03): homepage "not B2B enough" — design sign-off stands; he wants Core Home-style content structure + his cut B2B text restored. Response built overnight: /homepage_b2b_v3_editorial (doc order + editorial Hyper sections — recommended) + /homepage_b2b_v2_docorder (plain) + /homepage_b2b_v1 (site-fit) + /b2b_review_v1 plan — awaiting Sean's morning review. Also: hero 20-of-50 picks · certs + Xtricity manuals · Jessar Lighting logo · launch access (plan/DNS/email/analytics) · legal sign-off.
Waiting on Jessar (Michael)
Living list → /open_items. Headline: what-NOT-to-show-on-PDP · sub-line treatment TBD (Michael undecided — treat the 6 lines Beauty Cover/Veraroma/Inspiration Italia/Laguiole/iBake/Limpus as distinct, or fold under the vendor? jessar.product_line ready on 148 products, PDP display PARKED till he decides) · ToS revisions (template sent) · sub-brand mapping + marketing-tier confirm · certifications · Xtricity manuals · 33 Cook&Fresca images · Jessar Lighting logo · new products+data · box style · lifestyle images · 2-SKU reconcile · tea-thermos/casserole. (Resolved 07-03: pricing NOT on PDP → retires MSRP ask.)
Waiting on Sean (RevShift)
B2B renders verdict (v3/v2/v1 — parked for Michael) · 301 coverage sign-off (/redirects_review_v1 — 100% covered; optional: name high-traffic discontinued items to upgrade collection→product) · SEO Preferences 3 values (paste or authorize shared-Chrome) · electrical tile pick · header one-row go · imagery boss-decision · bullet-shortening approval · send /jessar_image_request_v1 to Michael. (Dead-end rule resolved: no 404s → all → nearest collection.)
Phase 0
Foundation
100% · 9 of 9
Phase 1
Data Foundation
100% · unified DB + rebuilt gold dataset
Phase 2
Brand & IA
100% · IA + sitemap + taxonomy locked
Phase 3
Design System
Soft Modern locked · live + client-approved · brand-landing parked
Phase 4
Page Templates
Core templates LIVE · hero-20 + system pages left
Phase 5
Shopify Build
Site LIVE (1,681) · 301s ✅ · pricing/msrp ✅ · open: GA4/GSC · QA · train · launch
Phase 6
Brand Pilot
Not started · prep-in-advance now (SOW)

Phase Checklists

Phase 0 — Foundation Complete 9 / 9
  • Read existing project brief and inventory
  • Confirm engagement approach (parallel tracks with gated renders)
  • Confirm tooling stack (Hyper, Shopify CLI, Python; migration tool TBD)
  • git init in project root
  • .gitignore for confidential + large files
  • Folder structure: /work/, /renders/, /decisions/, /raw/, /scripts/, /theme/
  • Write PROJECT.md
  • Initial commit + push to RevShiftMedia/jessar-website
  • Phase 1 kickoff confirmed
Sign-off gate met: Repo live, dashboard live, structure agreed.
Shopify Access Setup Complete 4 / 4
  • Custom app created in Shopify Partners (Sean)
  • Sean provided client_id + client_secret
  • Built install URL, completed OAuth flow, captured shpca_* access token
  • Token stored in .env (gitignored); ~70 admin scopes confirmed via API smoke test (see PROJECT.md decision log)
Cross-cutting setup met — Shopify Admin API ready for Phase 5 build.
Phase 1 — Data Foundation ✅ COMPLETE · rebuilt gold dataset 17 / 18
  • Profile Items-Jessar for Sean.xlsx/work/items_jessar_call_brief_2026-04-27.md
  • Confirm authoritative source (Items-Jessar + Electrical/Beauty Cover Inventory = primary)
  • Orange-fill detection (Items-Jessar On Hand, #FFC000) → 119 excluded, 876 active
  • Profile Electrical/Beauty Cover Inventory + red-font detection → 41 excluded, 828 active
  • WP export delivered: wc-product-export-27-4-2026-1777321473954.csv (2,196 products live)
  • Profile WP export → SKUs in Name field; 41 cols incl. categories, descriptions, images, stock
  • Reconcile WP vs masters → see /work/wp_reconciliation.md
  • Build PDF extractor (catalogs) — 11 PDFs, 451 pages, 1,767 SKU rows, full text in /work/catalog_text/
  • Profile Master SKU xlsm — 1 sheet, 2,402 rows, 32 cols (subset of On Hand pattern). Gap-fill reference.
  • Box-artwork PDF extractor POC against 7-99191, 7-99506 → bilingual feature copy extractable. Scales when SSD mounted.
  • Reconcile xlsx + WordPress + catalog → unified rows. See /work/unified_product_database.csv + .json (3,211 unique SKUs).
  • Tentative sub-brand tagging by prefix (final mapping for 6-, 3- pending Jessar)
  • Completeness score per SKU; 1,614 SKUs at score ≥60 ready for content gen
  • Generate unified_product_database.csv + .json
  • Generate data_gap_report.html (visual coverage report)
  • Generate third_party_needs.md (photography, copy, partner logos)
  • Render: phase1_data_state_one_pager.html for Sean → Jessar review
  • Sign-off gate: Sean reviews /work/phase1_data_state_one_pager.html and accepts unified DB as canonical
Sign-off gate: Unified database accepted as the single source of truth.
Phase 2 — Brand & IA ✅ Complete · IA + sitemap locked 0 / 9
  • Synthesize brand architecture from Phase 1 + Jessar input
  • Decide sub-brand treatment (nav level / sections / filters / hybrid)
  • Draft 3 candidate site maps
  • Render 3 navigation prototypes (HTML mockups)
  • Define URL pattern
  • Define taxonomy (collections, tags, metafields)
  • Define filter/facet strategy per collection type
  • Sean reviews → 1 IA wins
  • Document final IA in PROJECT.md §6
Sign-off gate: Final IA approved by Sean.
Phase 3 — Design System ✅ Complete · Soft Modern locked · live + client-approved · brand-landing parked 12 / 14
  • Validate Hyper theme against criteria — VALIDATED 2026-04-27
  • Pull Hyper code into /theme/ via Shopify CLI (blocked: license not yet purchased)
  • Audit Hyper component library — done via reference copy on disk
  • Design + present 2–3 brand guide options (Jessar parent + sub-brand treatment, color, type, logo usage). Render as comparison deck for Sean → Jessar.
  • Lock final brand guide based on Jessar selection — Direction B (Soft Modern), default palette. Locked 2026-05-05.
  • Define color system — formal token spec doc (Direction B tokens need standalone spec doc)
  • Define type system (EN+FR pairing, web-font fallbacks, licensing)
  • Render hero patterns (3 layout variants)
  • Render product card variants — done: collection_page_v1.html (2026-05-05)
  • Render standard PDP template (dual-audience) — done: standard_pdp_sm_v1.html (2026-05-06) — proper Soft Modern from Direction B first principles. 55/45 gallery split, features open, meta strip, accent restraint. Also: standard_pdp_v2 (2026-05-05), standard_pdp_v3 + standard_pdp_v0_1_b (explorations 2026-05-06).
  • Render hero PDP template (Caraway-tier) — done: hero_pdp_sm_v2.html (2026-05-06, canonical) — 4:5 warm panel, meta-row beam, 4-col hairline build grid, oversized Cormorant sub-brand mark, warm use-tiles, centered story, accent-light CTA. Sean: "excellent." Also: hero_pdp_sm_v1 (2026-05-06), hero_pdp_v2 (2026-05-05).
  • Render collection grid + filters — done: collection_page_v1.html (2026-05-05)
  • Render homepage (Jessar parent brand) — done: home_sm_v6.html (2026-05-07, canonical) — six iterations same session. v6 flips bg so brand portfolio cards POP on canvas (white-ish), adds "In focus this season" editorial triptych (tabletop/bedroom/lighting) at position 5, renames catalogue eyebrow to "Browse by category" (paired with brand portfolio's "Our brands"), and removes the wordmark from nav (real logo stands alone, propagated across v1–v5). v1–v5 retained as comparison.
  • Render brand landing page template (sub-brand landing — JS Gourmet / Xtricity / Jessar Lighting)
Sign-off gate: Design system approved by Sean; shown to Jessar for tone reaction.
Phase 4 — Page Templates Core templates LIVE · hero-20 + system pages left 0 / 10
  • Home page render
  • Brand landing page render (1 per brand)
  • Collection page render (variants)
  • Standard PDP render (5 real products)
  • Hero PDP render (1 fully built)
  • Find a Retailer render
  • Become a Dealer render
  • Dealer login / portal entry render
  • Search results render
  • 404 / error states render
Sign-off gate: All templates approved by Sean. Jessar shown for final go.
Phase 5 — Shopify Build Site LIVE (1,681) · launch-prep 1 / 19
  • Set up Shopify dev + production stores
  • Install Hyper theme
  • Decide migration mechanism (Matrixify vs. direct Admin API bulk push)
  • Customize theme to match approved templates
  • Generate import payload from unified database — primary tier only (secondary CSV stays queue-ready)
  • Import products in sub-brand priority order
  • Migrate images (SKU-name match)
  • Set up bilingual storefront (EN/FR) — Shopify Translate & Adapt fallback
  • Populate msrp metafield from Items-Jessar col AO ("Selling Price")
  • Build "Partners" section (Costco, Linen Chest, Staples, etc. — Sean procures)
  • Add link to existing dealer portal + simple "Become a Dealer" contact form
  • Build 301 redirect map from WP slugs → Shopify URLs (source: WP export Permalink column)
  • Set up Google Search Console (verify ownership, sitemap, reindex) — confirm if Jessar has existing account first
  • Set up Google Analytics 4 — confirm existing account or create fresh
  • Privacy Policy + ToS drafted (Shopify template), emailed Jessar for legal confirmation. Required under PIPEDA / Quebec Law 25 since the site collects data via contact forms + dealer applications + analytics. Refund / Shipping policies skipped — no transactions, so they don't apply.
  • Privacy + ToS translated to FR via Shopify Translate & Adapt (after EN is Jessar-confirmed)
  • Footer policy links wired in Hyper theme (Privacy + ToS only)
  • QA pass: links, images, mobile, accessibility, EN/FR parity, redirect coverage
  • Train Jessar team
  • Launch
Sign-off gate: Site live, Jessar trained, monitoring in place.
Phase 6 — Brand Elevation Pilot Month 0 / 7
  • 4–6 AI-generated product videos (5–10 sec)
  • 4–6 AI-generated lifestyle product images
  • 4–6 LinkedIn posts drafted + scheduled
  • 4–6 Instagram posts drafted + scheduled
  • 1–2 influencer introductions
  • 1 initial launch strategy doc
  • Retainer conversation with Jessar
Sign-off gate: Pilot complete. Retainer SOW negotiated separately.

Open Questions for Jessar (2 open · 15 resolved)

  • 1
    Sub-brand → prefix mapping — ✅ RESOLVED 2026-05-07. Jessar returned the completed mapping (work/sub_brand_mapping_RESOLVED_2026-05-07.csv, 154 groups, 2,560 SKUs, 100% assigned). Headline finding: at the data tier there are four sub-brands, not ten — JS Gourmet (7-, 1,264 SKUs), JS Maison (6-, 236), Jessar Lighting (5-, 358), Xtricity (1-+3-+4-, 702 combined). The other catalogue names (Beauty Cover, Cook & Fresca, IBake, Limpus, Pop Fluff, Veraroma) are marketing identities / product lines that roll up into the four data-tier brands. Action: Sean to review the implication for the homepage (home_sm_v6 currently shows 10-brand portfolio).
    Raised 2026-04-27 · Resolved 2026-05-07 by Jessar
  • 8
    Hero product narrowing — Michael picks 20 from 50. Sean delivered the curated list (50 unique product concepts / 88 SKUs); SOW caps full hero PDP treatment at 20. Action: Michael selects 20 at jessar-deliverables.vercel.app/hero_candidates_for_michael; output CSV drops at /work/hero_selections_michael.csv and the build pass flips them to tier=sow_hero. Also: confirm 4 hero SKUs missing from DB (7-99738, 7-98690, 7-99754, 7-99757).
    Raised 2026-04-27 · Intake closed 2026-04-28 · Awaiting Michael's narrowing

Resolved: Q2 eco-fees (orange = ignore) · Q3 discontinued (orange in Items-Jessar) · Q4 source-of-truth (Items-Jessar + Electrical/Beauty Cover Inventory) · Q5 On Hand gap (moot) · Q6 pricing (MSRP from Items-Jessar col AO "Selling Price" → metafield) · Q7 WP export (CSV delivered, REST API not needed) · Q9 tone POC (approved by Jessar) · Q10 FR review (we do the heavy lift; Shopify Translate & Adapt for fallback; cherry-pick human review) · Q11 store locator (replaced with Partners section) · Q12 dealer portal (out of scope, link to existing) · Q13 retailer application (out of scope) · Q14 Costco (live on site) · Q15 catalog versions (newer supersedes if same SKU) · Q16 SSD mount (completed — Seagate drive indexed 2026-05-03) · Q17 brand guidelines + partner logos (we design + procure ourselves).

Recent Decisions

  • Page-system native-vs-custom audit (2026-06-29). 6 core templates locked for client review. Contact kept RS (form functional). Dealer (4) + About (6) native Hyper parallels built alongside the RS versions for side-by-side review — nothing removed. Keep-custom: dealer form, About values + brands. Homepage finalized with real retailer logos. 404 branded; /collections hidden.
    2026-06-29 · Sean / RevShift
  • Master-carton correction — third source-reading fix (2026-06-03). Sean asked me to double-check that master carton was genuinely missing/unsourced. It was not. The On Hand sheet carries three (L)/(l)/(H) dimension blocks (unit · inner · master); the third (most-filled) block is the master-carton size — proven by the sheet's own per-unit-CBM formula (CBM ÷ Master). I had been counting only the 57 master cartons recovered from box-artwork OCR and missing the On Hand block entirely. build_product_data_supplement.py now picks the most-filled dimension triple and treats On Hand as the primary carton source. Master carton coverage 57 → 906 (54%); remaining genuine gap 1,610 → 761. Re-ran the full downstream chain (inject → aggregate → reviewer → content Excel → data-request) and redeployed both portals. Corrected live data-gap counts: inner 998 · master carton 761 · certs 1,373 (UPC 1,662 + master case 1,661 effectively complete). Third time Sean's instinct to re-check a "missing" claim was right — after the cert/UL-ETL sheet correction and the "~1,145 recoverable certs" overcount. Honest residual gap = inner-case (sparse at source) + certifications (their "To Check" column) + ~761 carton rows for catalog-only SKUs absent from On Hand. Shopify untouched.
    2026-06-03 · Session 21 · Sean / RevShift
  • Missing data surfaced + Jessar data-request built (2026-06-02). Client flagged inner case / master case / certifications / UPC as missing. Key correction: I'd been reading the wrong Items-Jessar sheet — the operational On Hand sheet holds UPC/Inner/Master + a UL/ETL cert column. Findings: UPC (1,662) + master case (1,661) we have → now surfaced into the v2 specs, the client reviewer, and a new packaging block in the content Excel. Inner case is genuinely sparse even in their source (669/1,667; many items have no inner pack). Certifications: the UL/ETL column exists but Jessar left it “🔴 To Check” for 812/876 — unfilled on their end; our honest extract is 294 (my earlier “~1,145 recoverable” was a bad estimate that matched the French word “ce”). Genuine gaps packaged into jessar_data_request_2026-06-02.xlsx (998 inner · 1,610 carton · 1,373 cert; amber = please fill, cream = we have, heaviest-gap first), linked from the client hub. New scripts: build_product_data_supplement, inject_supplement_to_v2, build_jessar_data_request_xlsx. Reframes the client conversation: the columns exist in their On Hand sheet — the cert one is still “To Check.”
    2026-06-02 · Session 20 · Sean / RevShift
  • Shopify metafield cleanup + content-push plan locked (2026-06-02). Audited the 48 live jessar.* metafield definitions + took a full rollback snapshot of all 1,668 live products. Deleted 10 internal/useless definitions (~6,177 stray values purged store-wide): migration_action, completeness_score, box_features (the noisy OCR field originally flagged — now gone from live), care_source, material_source, color_source, source_catalog, priority_tier, short_description, cord_length. Kept internal_clas_1/2 + future-use empties (certifications/upc/is_hero/catalog_pdf) + all customer-facing → 38 definitions remain. v2 content push plan (locked): wait for client edits → one clean push, EN+FR together, box_features already removed; scope set when edits return. Surfaced for later: store shows 1,668 products (one extra, likely test SKU — left for now) and product_line live 148 vs clean 149 (reconcile at push). Rollback: live snapshot + setup_shopify_phase5.py.
    2026-06-02 · Session 20 · Sean / RevShift
  • Client feedback channels for content review (2026-06-02). Two ways for Jessar to return copy changes, both batch-appliable: (1) inline editing in the v2 reviewer — a "✎ Suggest edit" control on every product opens editable fields (title/romance/description/features) + approve-as-is + notes, autosaves in-browser, and Export my changes downloads jessar_content_edits.json (built with safe DOM construction, no XSS). (2) A colour-coded Excel (jessar_content_review_2026-06-02.xlsx) mirroring the reviewer fields EN+FR — muted read-only source columns vs 3 green editable columns (Approve Y/N · Corrections · Revised copy), needs-verification rows amber + sorted to top, product-line tinted, README legend, frozen panes. Both linked from the client hub; client picks their preference, both return to us for batch apply.
    2026-06-02 · Session 20 · Sean / RevShift
  • Residual 16 majors cleared — 0 known factual errors (2026-06-02). Resolved the last 16 majors: 9 visible spec errors fixed against cited sources (7-99112 dropped an unsourced "13.7\" blade"; 7-99403 single→double-wall glass; 7-99696/697 wattage 1000→1500/1200W, honestly re-flagged for vendor confirmation; 7-99577/7-99687/1-60412 removed contradictory/unsupported claims) + 7 empty product_line fields populated from box/title (Veraroma, Beauty Cover, iBake), synced to the authoritative inferred_product_lines.csv. The fix→verify discipline paid off again: re-QA caught 2 self-inflicted mismatches (7-99851 left "Celebration Collection" in the description after the romance edit; 7-99913 set product_line=iBake but prose still said VerAroma) — both corrected and re-verified. Final independently-verified state: 0 major · 194 minor (11.6%) · 1,473 clean (88.4%); product_line clean across 6 lines; 0 integrity issues; 39 needs_human_review. Tone/descriptions/substance confirmed client-ready on a cross-tier read. Added a "Product Content — Review & Verify" card to the client hub. Both portals redeployed. Rollback 2026-06-02-pre-residualfix snapshot; Shopify untouched.
    2026-06-02 · Session 20 · Sean / RevShift
  • Fix + polish + verify — 694 flagged SKUs cleaned to top quality (2026-06-02). Fix workflow corrected every QA-flagged issue (120 major + 574 minor) with the locked brand voice applied (restrained/factual; banned-words list — no premium/curated/world-class/cutting-edge/discover). Root-cause rule: BOX/PRESENTATION authoritative over xlsx/catalog on physical specs. Wrote to a separate product_content_fixed/ namespace, then merged to v2. Independent re-QA verified the result — major 120→16 (7.2%→1.0%), minor 574→189 (34%→11%), clean 973→1,462 (58%→88%); ~99% publish-ready. Caught + fixed a fix-pass regression: agents had stuffed product_line with junk (model names Valerio/RIPPLE, a description string, VerAroma casing — 18 bad values) → re-asserted from the authoritative source to the clean 149 across 6 lines. Residual 16 majors are mostly product_line ATTRIBUTION edge cases (copy names a line but SKU not in canonical list; 7-99913 Veraroma-vs-AirPlus) + ~6 spec calls (7-99696/697 wattage, 7-99104 dims, 7-99112 blade) — the human/Jessar decision residue; 36 SKUs carry needs_human_review. Refreshed reports live: /jessar-qa-report + /jessar-pdp-v2-review. Rollback 2026-06-01-pre-fix intact; Shopify untouched.
    2026-06-02 · Session 19 · Sean / RevShift
  • Category mis-map fix — TAPS is electrical, not faucets (2026-06-02). 17 electrical outlet-tap/adapter SKUs (3-70611…3-70624, 3-70701/703/704) were mis-categorized "Kitchen — Faucets & Taps". Root cause: CATEGORY_MAP["TAPS"] in generate_product_content.py + fill_content_gaps.py mapped the electrical "TAPS" classification code to plumbing faucets, and also routed it to the kitchen writing voice. Fixed at source (4 spots, 2 scripts → "Electrical — Power" + electrical voice) and in derived data (product_content.csv, regen_input, content_batches). Verified: zero genuine faucet products exist in the catalog (nothing wrongly reclassified); v2 content was not voice-contaminated (gold-based regen produced correct electrical tone).
    2026-06-02 · Session 19 · Sean / RevShift
  • Adversarial QA of v2 PDP content — all 1,667 SKUs (2026-06-01). Independent QA workflow — 67 auditor agents that did NOT write the content (read-only, Max plan, zero API) — scrutinized every v2 block against its raw sources + old data, hunting source-priority violations, unverifiable claims, dropped features, spec conflicts, brand-line errors, FR quality. Survived a power-failure interruption (stalled at 318 → resumed via missing-only manifest + a durable scheduled task, now disabled). Result: 58.4% clean · 34.4% minor · 7.2% major (120 SKUs with customer-visible factual errors). Per-tier major rate: Jessar Lighting 13.0% (worst), JS Maison 11.1%, Xtricity 6.7%, JS Gourmet kitchen/home 6.0% (best substantive tier). Defect types: dropped_feature 367 · unverifiable_claim 253 · spec_conflict 161 · internal_inconsistency 124 · source_priority 74 · brand_line_error 31 · fr_quality 18. Systemic root cause for most majors: on lighting/bulbs the pipeline trusted xlsx/catalog over the BOX/PRESENTATION on physical specs (e.g. labeling a "DO NOT USE WITH DIMMER" bulb as dimmable; 1-year vs box's 3-year warranty). Self-grading had rated these needs_review=false, so the adversarial pass caught ~120 errors that would otherwise have shipped — vindicating the decision to QA rather than trust self-reports. Report (filterable major/minor, source-cited fixes) live at revshift-internal.vercel.app/jessar-qa-report. No content modified — verdicts in work/qa_findings/ only; rollback point pre-qa-2026-05-27 + data snapshot intact. New scripts: aggregate_qa.py, render_qa_report.py. Next: fix plan pending Sean's go.
    2026-06-01 · Session 18 · Sean / RevShift
  • v2 PDP content regeneration — all 1,667 SKUs (2026-05-27). Final assembly pass via background Workflow (56 + gap-fill batches, Max plan, zero API). For every SKU, regenerated the complete front-facing PDP block — title · romance EN/FR · description EN/FR · features EN/FR · specsFROM the validated gold as atomic source of truth. Old v1 romance/description used as tone inspiration only, never copied; the pre-validation errors gold caught (cast-iron mislabeled "ceramic," carton dims as product size) do not reappear — verified on 7-99512 (enameled cast iron, correct specs). Hard namespace separation: writes only to work/product_content_v2/product_content_v2.csv; old product_content.csv is read-only reference (powers the viewer's Compare-with-v1 toggle), never written. Normalized product_line casing (VerAroma→Veraroma, IBake→iBake) + cleared a model-name false-positive (RIPPLE). Final: 1,667/1,667, 0 integrity issues, 149 brand-line SKUs (Beauty Cover 74 · Veraroma 29 · Inspiration Italia 25 · Laguiole 8 · iBake 7 · Limpus 6), 53 needs client verification (each carries its flag note). New scripts: build_regen_input.py, aggregate_pdp_v2.py, render_pdp_v2_review.py. v2 review viewer (per-SKU verify banner + note + Compare-with-v1 toggle + brand-line/needs-verification filters) live at revshift-internal.vercel.app/jessar-pdp-v2-review. Push-time freeze+guard deferred to export build. Shopify untouched — pending Sean review → client verification of the 53 → sync.
    2026-05-27 · Session 17 · Sean / RevShift
  • Second pass — brand-line identity + manuals + electrical xlsx (2026-05-27). Pre-review diligence found brand-line identity was barely surfaced — only 9 of 148 line-branded SKUs (~6%); the Laguiole knives worked only because "Laguiole" was incidentally printed on the box. Root cause: product_line was never fed into the feature bundles and sub_brand was the stale generic. Fixed by enhancing the bundle builder with product_line (inferred_product_lines.csv), corrected sub_brand (4-brand prefix map), manual OCR text (work/manual_ocr — 629 manuals extracted 2026-05-13 but never used; 392 primary SKUs), and the Electrical/Beauty Cover Inventory xlsx (newly mined → 863 rows). Re-enriched 196 priority SKUs (148 product-line + 85 JS Gourmet/Maison-with-manuals). Brand-line coverage now 148/148 (100%) — every Veraroma/Beauty Cover/IBake/Inspiration Italia/Limpus/Laguiole SKU surfaces its line as a dedicated brand_line feature. Accuracy guard: dropped false protected-origin claims (Laguiole/Inspiration Italia = style/collection, all made-in-China per box — no false France/Italy claims). Final gold: 9,370 features, 172 brand_line, 4,715 junk dropped, 796 OCR repairs, 59 needs_human_review. Flagged a few product_line mislabels (Veraroma vs Inspiration Italia) for Sean. Shopify untouched.
    2026-05-27 · Session 16 (2nd pass) · Sean / RevShift
  • Full LLM feature validation + enrichment pass — all 1,667 SKUs (2026-05-27). Ran entirely on the Max plan via batched general-purpose subagents (zero API spend). Synthesized one authoritative, bilingual (EN + Quebec FR), front-facing feature set per SKU from ALL sources — presentations = primary source of truth, Items-Jessar xlsx = authoritative for spec/material verification, plus catalogs, WooCommerce, and deterministically-cleaned box OCR. New sources mined this pass: 1,957 SSD presentation PDFs (653 primary SKUs), "Presentations for Sean" deck, xlsx desc-an/fr/description columns. Result: 9,304 features (5.6/SKU, 94% high-confidence), 4,727 junk lines removed, 794 OCR misreads repaired, 43 SKUs flagged needs_human_review. Subagents caught substantive errors that would have shipped to live PDPs: cast-iron mislabeled "ceramic," carton dims passed off as product size, "grounded 3-conductor" copy on an ungrounded cord (safety), AI features describing a glass jar on a cutting board, fabricated rated-life/warranty figures, wrong-market voltage specs. Pipeline scripts: extract_presentations.py, build_xlsx_descriptions.py, clean_box_features.py, build_feature_input_bundles.py, aggregate_gold_features.py, render_gold_features_review.py. Output: work/features_gold/*.json + work/features_gold.csv. Shopify NOT touched — Sean reviews the gold set first at revshift-internal.vercel.app/jessar-gold-features-review.
    2026-05-27 · Session 16 · Sean / RevShift
  • Product-line cleanup pass (2026-05-15). Three targeted corrections on the live dev store (78 products, 0 errors, all verified live). (1) Cleared jessar.product_line on 12 false positives — 5 Mason/Dublin ("Mason" = generic jar type + a bath pillow; "Dublin" = a Jessar Lighting drum-fixture model name + a glass-cup style — neither a marketing brand) and 7 "Beauty Cover" that were actually electrical junction boxes/covers (Xtricity), mis-tagged by an unreliable 'BC' supplier-code rule. (2) Rerouted 65 genuine Beauty Cover SKUs (prefix 7-) from vendor JS Gourmet → JS Maison — Beauty Cover is home/bath/decor, not kitchen. (3) Promoted 1 USB-touch-lamp outlier (7-99858 "Wooden Tripod Nightstand Lamp") JS Gourmet → Jessar Lighting to match the other 37. Findings: the original "81 Beauty Cover / 5 false positives" framing was off — actual was 74 genuine (65 prefix-7 to reroute + 9 prefix-6 already JS Maison) + 7 electrical false positives; and Shopify Standard Taxonomy has no "Table Lamps" leaf — hg-13-5 "Lighting > Lamps" is the most specific node and the 38 USB lamps were already there + already Jessar Lighting (37/38), so that task was effectively pre-satisfied by the 2026-05-13 vendor fix. Hardened scripts/extract_product_lines.py (dropped Mason/Dublin from KNOWN_LINES; removed the supplier-code source wholesale — 7/7 false positives); inferred lines 160 → 148. New scripts: clear_false_product_lines.py, reroute_vendors_2026-05-15.py. Resume-safe logs: work/product_line_clear_log.csv, work/vendor_reroute_log.csv.
    2026-05-15 · Session 15 · Sean / RevShift
  • Product-line discovery + push (2026-05-14). Sean spotted that JS Gourmet has sub-brands / marketing lines (Laguiole knives, Beauty Cover bedding, Veraroma drinkware, IBake bakeware, etc.) that we were flattening to a single sub-brand vendor. Built scripts/extract_product_lines.py to mine these from existing data: box artwork OCR text (90 SKUs detected), WordPress titles in wp_name (63), and supplier code prefix in master xlsx code-pro-frn (7). Discovered 160 SKUs (10% of primary) with identifiable brand lines — Beauty Cover (81), Veraroma (35), Inspiration Italia (18), Laguiole (8), IBake (7), Limpus (6), Mason (3), Dublin (2). Created jessar.product_line metafield definition (48 jessar.* defs total) and pushed all 160 values via batched metafieldsSet (scripts/push_product_lines.py) — 160/160 OK in 7 seconds. Live verified: 7-99096 = vendor JS Gourmet + product_line Laguiole; 7-10001 = vendor JS Gourmet + product_line Beauty Cover. Also rebuilt the Jessar-facing review file as .xlsx instead of CSV (work/jessar_review_2026-05-14.xlsx, scripts/build_jessar_review_xlsx.py) — 3 sheets (README, Products, Certifications), value-inclusive cells (shows the actual extracted value, not just ✓), color-coded green/amber/red for source-of-truth, low-intensity instructions, frozen header. Added 4 new columns Sean requested: warranty_period, certifications, heat_resistance, needs_review_or_correction, general_notes_from_jessar. Heroes sorted first. Product-line column added between sub_brand and category.
    2026-05-14 · Session 14 · RevShift
  • Shopify migration push complete + post-push refinement (2026-05-13). Full first-pass migration to Shopify dev store: 1,667 primary SKUs live as ACTIVE products. End-to-end pipeline ran across 4 stages: bulk image upload (1,735 OK + 29 failed at 87.9 min), product create (1,667 OK at ~70 min), Shopify Standard Taxonomy category assignment (1,665 OK at ~22 min), variant SKU/barcode fix (1,667 OK at ~36 min). Found two notable bugs mid-run: Shopify GraphQL 2025-01 moved variant.skuinventoryItem.sku (the original push silently dropped SKUs — scripts/fix_variant_skus.py repaired all 1,667); and assign_product_categories.py needed resume-safe skip-done logic after parent-shell killed it at 941/1,667. Post-push refinement pass (per Sean): (a) Push errors validated — 0 real misses; the 6 "errors" were the same 3 SKUs from pre-fix API-version-discovery attempts that succeeded on retry. (b) 29 failed images recovered — failures were large Exif-laden JPEGs Shopify's image processor rejected; scripts/retry_failed_images.py re-encodes via sips (max 2048px, format=jpeg, options=85) before re-upload + attaches to products via productCreateMedia. 100% image coverage now. (c) Vendor fix (scripts/fix_vendor_to_subbrand.py) — replaced "Jessar Industries" parent vendor with actual sub-brand per SKU prefix (resolved 4-brand mapping from 2026-05-07): JS Gourmet (883), Xtricity (483), Jessar Lighting (254), JS Maison (18), Jessar Industries fallback for 2-prefix (29). Affects Shopify vendor filter, Search & Discovery facets, Google Merchant feed. (d) 20 metafields pinned at top of product editor (scripts/pin_metafields.py) — Shopify's hard 20-pin limit consumed by: sub_brand, msrp_cad, qty_per_package/container, dimensions (×2 unit systems), weight (×2 unit systems), capacity, set_count, master_carton_dimensions, materials, color_finish, lid_material, care_instructions, safety_claims, heat_resistance, warranty_period, certifications, feature_callouts. Lighting-specific fields (wattage/voltage/lumens/etc.) remain accessible under "View all metafields" but unpinned. (e) Taxonomy validated — distribution looks correct, 8 spot-flagged cases all checked out. Outputs: work/shopify_products_pushed.csv, work/category_assignment_log.csv, work/variant_fix_log.csv, work/vendor_fix_log.csv, work/sku_image_urls.csv, work/reencoded_images/. Commit da64e00 for the push, follow-ups in this session.
    2026-05-13 · Session 13 · RevShift
  • Apple Vision OCR pipeline + Jessar meeting brief (2026-05-12, overnight). Built and ran an OCR pipeline over 900 housewares-tier box-artwork PDFs that PyMuPDF couldn't fully read — rasterized/outlined text baked into artwork is invisible to text-layer extraction. Uses a tiny Swift CLI (scripts/ocr_image.swiftscripts/ocr_image) calling Apple Vision's VNRecognizeTextRequest with EN+FR language support — zero pip deps, on-device, no API tokens. Python orchestrator (scripts/ocr_box_artwork.py) renders each PDF page to 250 DPI PNG, batches through the Swift binary, filters print-production noise, saves to work/box_artwork/<sku>/<stem>.ocr.txt. Run completed in 57 min: 852/900 SKUs OCR'd, 940 PDFs, 31,883 lines recovered, zero errors. Pattern discovery on the full corpus surfaced missing patterns; added "Do not put in dishwasher or microwave", single-axis inline dims (w (width): 35 mm), master carton dims, standalone wattage. Re-extracted with --local --fresh. Housewares tier — the priority gap is now mostly closed: 7- JS Gourmet basic spec coverage (≥3 categories) jumped from 31% → 64% (+33pp); rich (≥5 categories) 9% → 24% (+15pp). 6- JS Maison basic 61% → 89%, rich 39% → 56%. Overall primary-tier: 1,667 SKUs, 1,489 (89%) with box-artwork features, 1,477 (89%) with any structured spec, 1,136 (68%) with usable spec table, 544 (33%) rich. made_in 36% → 59%, care (dishwasher/microwave/freezer) 14% → 21%, standalone width/height 6% → 30%+. Built scripts/render_jessar_meeting_brief.py — the Tuesday-call deliverable showing per-sub-brand coverage tables, per-spec-field × prefix heatmap, concrete ranked asks for Jessar (inserts/instructions, UPC list, certifications by family, spot-check on 900-row data request CSV, confirm 4 missing hero SKUs). Live at revshift-internal.vercel.app/jessar-meeting-brief. Companion work/jessar_data_request_2026-05-12.csv (900 rows of 6-/7-prefix housewares with we_have_X and NEED_X columns) attached to meeting prep. Retailer scraper stays parked — Linen Chest is JS-SPA, Amazon returns paid-placement noise; will rebuild as UPC-based once Jessar supplies UPC list.
    2026-05-12 · Session 12 · RevShift (overnight autonomous run)
  • Box artwork v2 extraction — structured spec coverage 34% → 96% (2026-05-11). Rebuilt the box-artwork spec extractor after surveying raw text dumps and confirming v1's KEY:VALUE regex was missing the bulk of real callouts. v1 required Material: / Voltage: / Wattage: prefixes but real artwork uses standalone callouts (2W, 120 VOLTS, 5000K, AMBER) plus multi-line dimension blocks (Beauty Cover layout where width: and 163.5 and cm end up on three separate lines after PyMuPDF text extraction). v2 adds a categorised rules table with 30+ patterns binned into 24 categories — wattage, voltage, color_temp, lumens, life_hours, beam_angle, base_type, bulb_shape, dimmable, dimensions, width/height/depth/length/diameter, weight_net/gross, capacity, set_count, made_in, color, care, usage_environment — plus a multi-line dimension recovery pass keyed on label lines (width: / largeur: etc.) that scans 4 lines ahead for numeric + unit. Added --local mode that re-extracts from the existing work/box_artwork/<sku>/*.txt dumps without needing the SSD remounted, and --fresh to truncate before writing (CSV schema changed: new structured_specs JSON column + structured_count). New CSV: 2,697 SKUs, 11,862 total structured values, 96% of SKUs have structured spec data (up from 34% KV-only). Top category coverage: dimensions 74.5%, made_in 65.3%, voltage 26.6%, base_type 26.5%, wattage/lumens/life_hours/color_temp each ~18–19% (lighting tier), capacity 14.5%, color 12.1%. render_product_content_review.py updated to render a structured spec table per card (two-column key/value grid in JetBrains Mono, ordered by spec category, deduped against the raw KV fallback). 87% of primary SKU cards now show structured specs in the dashboard. Live at revshift-internal.vercel.app/jessar-content-review. Practical implication: the PDP spec table on the new site can now be populated from box artwork for ~1,448 of 1,667 primary SKUs without retailer scraping — retailer scraper becomes a cross-validation source, not the primary source.
    2026-05-11 · Session 11 · RevShift
  • Sub-brand → prefix mapping RESOLVED by Jessar (2026-05-07). Jessar returned the completed mapping (work/sub_brand_mapping_RESOLVED_2026-05-07.csv): 154 groups across 2,560 SKUs, 100% assigned. Headline finding: at the data tier there are FOUR sub-brands, not ten. JS Gourmet (7-) = 1,264 SKUs; Jessar Lighting (5-) = 358; JS Maison (6-) = 236; Xtricity (combined 1- + 3- + 4-) = 702. The other catalogue names we'd been treating as sub-brands (Beauty Cover, Cook & Fresca, IBake, Limpus, Pop Fluff, Veraroma) do not have unique SKU prefixes — they are marketing identities / product lines that roll up into the four data-tier brands. Specifically: 6-CLEN-* groups (Limpus territory) all mapped to JS Maison, not Limpus. Implication for the homepage: home_sm_v6 currently frames the portfolio as "3 flagship + 7 specialty ribbon = 10 brands." This may need to be reframed as "4 house brands + product lines" to match data-tier reality — or kept as is if Sean decides the catalogue-tier identities (which appear on jessar.ca today) should remain as marketing labels. DECISION NEEDED from Sean. Sub-brand mapping was the single biggest unresolved data-foundation question; Phase 1 is now effectively unblocked.
    2026-05-07 · Session 10 · Jessar
  • home_sm_v6 deployed — homepage canonical (sixth iteration, same session). Four refinements vs v5 per Sean's review: (1) Background flip — brand portfolio now anchored on canvas (white-ish) so cards POP like in v3; markline flipped to canvas-warm to maintain alternating rhythm down the page. (2) "In focus this season" (NEW, position 5) — editorial seasonal moment extrapolated from the v4 spotlight idea, but spread across multiple brand domains rather than tied to a single product. 3-up triptych: tabletop (JS Gourmet) / bedroom (Beauty Cover) / living room (Jessar Lighting). Each tile is image placeholder + italic caption. Editorial breath between the two navigational moments (find by brand → editorial → find by category). Single CTA "See the seasonal feature" routes to a curated landing page. (3) Catalogue eyebrow renamed — "Browse by category" (was "Browse the catalogue") to make the by-category nav explicit. Pairs cleanly with the brand portfolio's "Our brands" eyebrow. (4) Wordmark text removed from the nav — real Jessar logo image stands alone. Cleanup propagated across all six versions: v1, v2, v3 had text-only wordmark replaced with logo image (CSS updated); v4, v5 had the wordmark span removed. Live at jessar.revshiftmedia.com/home_sm_v6.
    2026-05-07 · Session 10 (6th iteration) · RevShift
  • home_sm_v5 deployed — homepage (superseded by v6 same session). Three substantive changes vs v4 per Sean's review: (1) Flagship brand swap — Xtricity + Jessar Lighting moved to the specialty ribbon; JS Maison + Beauty Cover promoted to flagship. The homepage now leads with the consumer-housewares story (JS Gourmet kitchen / JS Maison home & furniture / Beauty Cover bedroom textiles). All three flagship cards now use real logos (Sean-supplied). (2) Featured product spotlight cut — Jessar isn't e-commerce. The website's job is to tell the brand story and route people into the catalogue, not to push individual products. (3) "Browse the catalogue" (NEW) at position 5 in the spotlight's place — five-tile category navigation moment. Top row: Kitchen + Home & Bath as 50/50 hero tiles (the consumer-everyday categories where the flagship brands live). Bottom row: Lighting + Electrical + Cleaning as third tiles. Each tile maps category → constituent brands so users route from category to brand seamlessly. Together with the brand portfolio above (find by brand), gives two clean entry paths into Jessar's offering. v1–v4 retained as comparison. Live at jessar.revshiftmedia.com/home_sm_v5.
    2026-05-07 · Session 10 (5th iteration) · RevShift
  • home_sm_v4 deployed — homepage (superseded by v5 same session). Corrects v3 across five axes: (1) magazine framing cut entirely — no Issue 01, no Spring '26 (this is a homepage, not a publication); (2) "in commission" copy stripped everywhere — clean Shopify-style image placeholder wireframes (line-art icon + dimension label only, no apologetic text); (3) real Jessar logo + Cormorant wordmark in nav; (4) real sub-brand logos for 5 of 10: JS Gourmet, Xtricity (flagship); JS Maison, Beauty Cover, Limpus (specialty). Clean placeholders for the remaining 5 (Jessar Lighting, Cook & Fresca, IBake, Pop Fluff, Veraroma) until logos supplied; (5) hero rebuilt as full-bleed image placeholder + overlay text — drops in any 1920×1080 lifestyle photo and the hero is finished. Structure rebuilt: markline moved from position 6 to position 3 (brand thesis primes the page); featured spotlight restored at position 5 (anchors the abstract "ten brands × ~2,000 SKUs" claim in one tangible product); banners moved from position 4 to position 8 (action surface comes after the page has earned attention); promise strip cut (redundant with credibility numbers); standalone lifestyle moment cut (its purpose absorbed into the image-led hero). Net: 11 sections + footer, down from 13. Narrative arc: Hook → Thesis → Show → Prove → Trust → Mood → Convert → Validate → Decide. Caraway-inspired bones; clean Shopify wireframe placeholders communicate intent without apologizing. Live at jessar.revshiftmedia.com/home_sm_v4.
    2026-05-07 · Session 10 (4th iteration) · RevShift
  • home_sm_v3 deployed — homepage (superseded by v4 same session). Corrects v2 across four axes per Sean's review: (1) width — bg full-bleed (canvas to screen edge), inner content max-width 1480px (v2's 1600px page-frame felt cramped); (2) brand count — TEN brands per PROJECT.md §6 architecture, not 3 (3 flagship cards: JS Gourmet sage / Xtricity dusty / Jessar Lighting terra, over a 7-card specialty ribbon: JS Maison · Beauty Cover · Limpus · Cook & Fresca · IBake · Pop Fluff · Veraroma); (3) hero — magazine-cover treatment, NOT PDP-shaped (full-bleed atmospheric bg with subtle texture grid, massive Cormorant headline "A Canadian story, in ten brands.", framing rules above and below carrying eyebrow + Issue tag and lede + CTA pair, source tag bottom-corner — totally different vocabulary from PDP); (4) banners — 3-up promotional row added per Month-2 SOW deliverable and client request (featured collection · accent-gradient dealer banner · dark-ink retailer banner). Plus: promise strip ribbon (mono-caps single-line credibility band below hero), 4-up reels grid (added Beauty Cover), approach narrative updated to ten-brand portfolio story. Bug fix: .footer class collision between page footer and brand-card footer resolved by renaming inner class to .brand-foot. Live at jessar.revshiftmedia.com/home_sm_v3.
    2026-05-07 · Session 10 (3rd iteration) · RevShift
  • home_sm_v2 deployed — homepage (superseded by v3). Corrects v1's positioning error: Jessar is a Canadian distributor, not a curator. All curation language stripped. New hero: "A Canadian story, in three brands." New markline: "Three brands. Thirty years. Ten provinces. One Canadian distributor — family-run since 1996, supplying retailers from coast to coast with housewares worth carrying." Net additions vs v1: width-contained 1600px page-frame (no sprawl on wide screens) · lifestyle photography moment (full-bleed, 21:9) · highlighted reels grid (3-up 9:16, in commission) · dedicated brands navigation (3 large interactive cards as primary nav moment, not just descriptive triptych links). PDP design vocabulary applied throughout: 4:5 warm panels with mix-blend-mode multiply, source tags, hairline meta-row beams, oversized Cormorant marks. Live at jessar.revshiftmedia.com/home_sm_v2.
    2026-05-07 · Session 10 cont'd · RevShift
  • home_sm_v1 deployed — Soft Modern homepage (superseded by v2). Editorial homepage in Direction B vocabulary, continuous with the PDP. Ten sections: nav · editorial hero ("Housewares, considered.") · 60-word manifesto · sub-brand triptych (JS Gourmet sage / Xtricity dusty / Jessar Lighting terra) · JS Gourmet spotlight · approach narrative ("Family-run. Canada-based. On a first-name basis…") · 4-cell hairline credibility row (3 brands · ~1,200 SKUs · 10 provinces · 30 yrs) · press placeholder (aspirational, dashed-border badge with pulsing dot) · two-paths CTA (Find a Retailer tagged "Decision Pending" per Sean) · footer. Strategy: brand elevation, not catalog port. Sub-brand portfolio treated as curated trio identity moments rather than 5–6 logo strip. Category tile section deliberately omitted (sub-brand triptych implies domain). Government sales section scrubbed (contamination from outdoors-gear reference). Live at jessar.revshiftmedia.com/home_sm_v1.
    2026-05-07 · Session 10 · RevShift
  • Migration scope confirmed: 1,667 SKUs (primary tier only). The 3,211 figure in reports is the full DB universe — not the migration scope. Rule: master files (Items-Jessar + Electrical/Beauty Cover) are source of truth. In masters → migrate. On site but not in masters (366 "investigate") → skip, low priority, already validated. Catalog/Master Sku xlsm only (1,018 secondary) → ignore for now. Eco-fees + discontinued (160 excluded) → never. Product content review showing 1,667 is correct.
    2026-05-07 · Sean
  • hero_pdp_sm_v2 approved — canonical Soft Modern hero render. Synthesizes Direction B palette/type with structural craft from v0_1_c (Direction C): 4:5 warm image panel (mix-blend-mode multiply), meta-row as hairline-bordered structural beam, 4-col hairline build grid with Cormorant Garamond values, oversized Cormorant sub-brand mark (clamp 54–84px), warm canvas-warm use-tiles, centered story (880px max-width), accent-light dealer CTA. "RECOVERY" annotation tag documents craft recovered from v0_1_c. Sean: "its excellent. Very happy. Ill be buying Hyper and we'll start diving in." Live at jessar.revshiftmedia.com/hero_pdp_sm_v2.
    2026-05-06 · Session 9 · Sean / RevShift
  • hero_pdp_sm_v1 deployed — hero PDP in proper Soft Modern. Extends standard_pdp_sm_v1 with 10 sections (vs standard's 7): hero split (romance lede + highlights strip), story (image + narrative, italic headline), pillars (3-col product truths, no italic), made for (full-bleed dark, italic on emotional line), specs (dark panel), full sub-brand block (image + narrative, italic on tagline), dealer CTA (dark panel, left CTA + right B2B data table), curated cross-sell ("Complete the set"). Section annotation drawer maps all metafield sources and hero-vs-standard delta. Live at jessar.revshiftmedia.com/hero_pdp_sm_v1.
    2026-05-06 · RevShift
  • standard_pdp_sm_v1 deployed — proper Soft Modern standard PDP. Built from Direction B design logic (not layout-adapted from prior explorations). 55/45 gallery-first hero grid (max-width 1340px), features shown openly (editorial clarity), accent (#C87A5E) limited to 5 places, meta strip understated at column bottom, gallery warm gradient. Italic rule applied throughout. Live at jessar.revshiftmedia.com/standard_pdp_sm_v1.
    2026-05-06 · RevShift
  • Italic rule formalized. Cormorant italic reserved for: section-level storytelling labels, brand names in prose paragraphs, and emotional lines within narrative sections (made-for, story, sub-brand tagline). Never on: product titles, navigational headings, pillar attribute names, spec data, or cross-sell headings. Applies across all sm_v1 renders and all future Soft Modern work.
    2026-05-06 · Sean / RevShift
  • Exploration renders produced (v3 + v0_1_b). standard_pdp_v3: merged v2 Direction B palette + v0.1a constrained grid, fixing screen-stretch (max-width: 1380px). standard_pdp_v0_1_b: v0.1a layout with Direction B colors replacing Fraunces/Warm Editorial treatment — confirmed doesn't work (palette mismatch; Cormorant Garamond doesn't do the tonal work Fraunces did). Conclusion: build Direction B from its own logic, not by translating from Direction A layouts.
    2026-05-06 · RevShift
  • revshift-internal.vercel.app established as RevShift agency-wide cross-client hub. Each client (Jessar, Corbeil, Decorolala, etc.) gets their own section. Future internal tools across all projects are centralised here, keeping client-facing deliverables sites (e.g., jessar-deliverables.vercel.app) clean. Index at /Users/macbookpro/Downloads/RevShift Media/revshift-internal/.
    2026-05-05 · Sean
  • Product content review added to deliverables hub. product_content_review.html (all 1,667 primary SKUs, searchable + filterable by category/status) live at jessar-deliverables.vercel.app/product_content_review. Internal RevShift tool — not Jessar-facing.
    2026-05-05 · RevShift
  • Direction B renders v2 deployed. Three full Direction B locked renders live at jessar-deliverables.vercel.app: hero_pdp_v2 (JS Gourmet steak knives — 11 sections: story, build, made-for, dark specs, sub-brand block, dealer CTA), standard_pdp_v2 (Xtricity LED — streamlined, 3 accordions, dusty-blue dot), collection_page_v1 (Kitchen & Dining — brand-pill filters, sticky toolbar, 3-col grid with 2-col hero card). RevShift Notes drawers document Hyper section mappings. Nothing touches Shopify until Sean approves.
    2026-05-05 · RevShift
  • Brand direction locked — Direction B (Soft Modern), default palette. Coral #C87A5E, off-white canvas #F8F5F0, Cormorant Garamond (display 300–500wt) + Inter (body 400/500) + Geist Mono (SKU/specs). Sub-brand dots: sage #7D9078 / dusty blue #7A8A9C / terracotta #B8755A. Italic-as-emphasis active. Unblocks hero PDP Liquid port, metaobject schema (sub_brand accent_color field), Phase 3 design system build. Walnut & Saffron ruled too close to Caraway; Stone & Plum too narrow for Jessar's product breadth. Decided by Jessar at 1pm meeting.
    2026-05-05 · Jessar
  • Certifications strategy pivoted. Vision extraction pass deprioritised. 234 SKUs already have cert data from text extraction. Remaining 1,433 active SKUs compiled into work/cert_request.csv (High/Med/Low priority by category) for Jessar to fill in directly. Faster and more reliable than image logo extraction. If Jessar cannot provide promptly, vision pass will run overnight.
    2026-05-05 · RevShift
  • Content generation complete. All 93 batches done. work/product_content.csv generated — 1,667 rows, 10 columns including certifications. 1,388 SKUs with AI-generated romance + description copy; 279 with extracted data only. Unblocks Phase 4 standard PDP population.
    2026-05-05 · RevShift
  • Content extraction pipeline complete. All 1,557 box artwork PDFs processed; 110 SKUs had no PDF (stubs written). 17 fields extracted per SKU from PDF text, WooCommerce spec tables, and name-embedded specs. Weight merged from Items-Jessar for Sean.xlsx (poid-stoc column): 2.2% → 60.3% coverage (969 fills). Dimensions: 75.9% → 94.2% (305 fills). Key output: work/extracted_content.json (1,667 records) + work/content_gaps.csv. Data gap report and phase1 one-pager updated. Certifications: logos are image-embedded in PDF artwork — 14% from text extraction; 1,343 SKUs queued for vision pass (scripts/extract_certifications_vision.py). Care instructions: not a universal gap — correctly null for lighting/electrical; real gap is KITCH category (32.9% coverage within 608 kitchen SKUs). Romance copy: 845 EN SKUs to generate using title + category + specs + POC voice rules.
    2026-05-03 · RevShift
  • SSD asset index complete. Seagate drive fully walked: 9,430 real files (5,740 box artwork PDFs, 3,679 studio photos from Quasimodo), covering 2,865 of 3,211 DB SKUs (89%). Primary-tier coverage: 99.8% (1,663 of 1,667 SKUs matched). Key gap confirmed: zero lifestyle photography exists for any hero candidate — needs commission or AI-generation decision before hero PDP build begins. 4 hero SKUs (7-99738, 7-98690, 7-99754, 7-99757) not in unified DB — Michael to confirm. 4 malformed primary SKUs (extension cords with product names in SKU field) flagged for manual cleanup. See ssd_asset_coverage.
    2026-05-03 · RevShift
  • Jessar-facing project hub shipped. Parallel landing page at jessar-deliverables.vercel.app/jessar_hub — only client-facing items, grouped by purpose: (1) Read first (Phase 1 one-pager), (2) Decision needed (customer-edition brand direction), (3) Tools for your team (Product DB Viewer + Data Gap Report), (4) Tasks for specific people (hero candidates for Michael + intern brief), (5) Coming with launch (draft management guide). Internal artifacts deliberately omitted: open items dashboard, project state snapshot, internal PDP renders with annotation drawers, site architecture, brand guide v0.x with internal pills, investigation reports, WP audit. Sean's existing internal index now carries a top-card link to the Jessar hub so he can find it. Audience-split is more reliable than relying on the client to ignore "For Sean" tags on a shared hub.
    2026-04-30 · Sean / RevShift
  • Standard PDP rendered alongside the 3 hero directions. Same product (7-99096) so the visual delta between hero and standard is unambiguous. Specs-forward, fast to scan, B2B-friendly — specs panel is the centerpiece (full B2B detail, dark inverse). No story / build / made-for sections (storytelling metafields skipped at render when jessar.is_hero is false). Sub-brand reduced to a single-line inline credit. Cross-sell uses Shopify auto-recs (vs hero's curated related_products). "Behind the page" drawer maps every section + flags hero-only metafields as "skipped" with explicit comparison notes vs the hero PDP. Direction-agnostic — B/C palette/typography swaps the same way the hero renders do. View →
    2026-04-30 · RevShift
  • Site architecture locked. PROJECT.md §6 placeholders (sitemap, URL/taxonomy, filter/facet strategy) all filled in. Working reference shipped at jessar-deliverables.vercel.app/site_architecture — 27 page specs, four fields each (Purpose · Sections · Data sources · Done criteria). Sitemap: home → 10 sub-brand pages → 5 cross-cutting category collections → product PDPs (hero + standard templates) → static (partners, about, become-a-dealer, contact) → policies → utility (search, 404). URL pattern: /brands/{handle}, /collections/{handle}, /products/{handle}, FR mirror via /fr/. Filter strategy: native Hyper UI, metafield-driven, no third-party app. Out of scope (locked): store locator, dealer portal, retailer application form, customer accounts, cart, blog, refund/shipping policy pages.
    2026-04-29 · RevShift
  • Hero PDP rendered in all 3 directions on real product 7-99096 (JS Gourmet steak knife set). Same EN+FR copy, same structure, same "Behind the page" metafield-map drawer; differs only in typography (Fraunces / Cormorant Garamond / Newsreader), palette (warm walnut / soft coral / acacia-sage), italic-emphasis treatment, and sub-brand expression (filled pill / 6px dot / bordered material card). Direction badge top-left for instant identification. A · B · C.
    2026-04-29 · RevShift
  • Shopify code commenting + change-log convention locked in. Every theme edit gets an inline RevShift - YYYY-MM-DD - What it is comment + a per-file change log at /docs/shopify_code_changes/<flattened-path>.md showing original + final only (no intermediates). Saved to memory so it persists across sessions. Required for client handoff: Jessar can grep "RevShift" to find every customization, and read a single change-log file per theme file to understand what we did.
    2026-04-29 · Sean
  • Client management how-to skeleton shipped at jessar-deliverables.vercel.app/management_guide_v0_1. Section-by-section reference mirroring the hero PDP exactly: what drives each section, where to edit in admin, bilingual flow, step-by-step. Skeleton level for now (screenshots get added once Hyper is live + metafields populated).
    2026-04-29 · RevShift
  • Asset indexer scaffolding ready (scripts/index_ssd_assets.py). Walks $JESSAR_ASSETS, extracts SKUs from filenames + parent folders, joins against unified DB + hero list, outputs per-SKU coverage report (HTML + CSV + JSON). Handles "volume not mounted" gracefully. The moment SSD finishes copying: one-command run produces a coverage report flagging which heroes need lifestyle imagery commissioned.
    2026-04-29 · RevShift
  • Hero candidates selection tool shipped to Vercel. jessar-deliverables.vercel.app/hero_candidates_for_michael — single self-contained HTML with all 50 unique product concepts as cards, grouped by category, live counter targeting 20. Output CSV drops at /work/hero_selections_michael.csv; the build pass flips Michael's picks to tier=sow_hero.
    2026-04-28 · RevShift
  • SOW hero cap = 20. 50 candidates from Sean's curated list are now scope-tiered: Michael picks 20 → tier=sow_hero (full Caraway-style PDP). Remaining 30 stay tier=candidate and either bump to featured_extra if effort allows once brand direction locks, or defer to retainer. Curating 50 ≠ committing 50; protecting the 20-cap protects margin and timeline. Selection tool also hands Michael the call on which 20 — he knows which sell, we don't.
    2026-04-28 · Sean
  • Master corrections pipeline live. work/master_corrections.csv is the canonical override list, applied last in build_unified_database.py so corrections always win regardless of source-master errors. First entry: 7-98211 flipped to primary/preserve (Sean confirmed misclassification in Electrical/Beauty Cover Inventory). Migration buckets shifted: preserve 1099→1100, skip 1098→1097, secondary 1385→1384. Pattern: Sean adds rows, re-run build, deliverables refresh.
    2026-04-28 · Sean / RevShift
  • Cross-reference flag — 15 missing hero SKUs. 7-99738 family (S&P), 7-9975x families (Tea), 7-98690. Cross-check against new data when SSD/updated Items-Jessar arrives. If they're still absent from the canonical master after that pull, they shouldn't be hero candidates — flag back to Sean.
    2026-04-28 · Sean / RevShift
  • Privacy Policy + ToS drafted on Shopify (template). Sean emailed Jessar for legal confirmation. Refund + Shipping policies skipped per Sean — no transactions, so they don't apply. Phase 5 net change: 17 → 19 items (added Privacy/ToS [done], FR translation pass, footer wiring).
    2026-04-28 · Sean
  • Hero list received from Sean — 50 products / 88 SKUs. Parsed into work/hero_products_assigned.csv across 21 categories. 73 of 88 SKUs validated against unified DB; 15 missing (clustered around newest variant families — Salt & Pepper, Tea, Over-the-Door Hanger — likely from recent catalogs). Scope concern: 2.5-3.3x the original 15-20 hero PDP scope. Recommend tiering: top 15-20 get TRUE hero PDP treatment (story, lifestyle imagery, custom layout), other ~30 get "featured" treatment (premium copy + home placement, standard PDP). Awaits Sean's call.
    2026-04-28 · Sean / RevShift
  • Metafield revision per Sean — 22 → 17 defs. Removed 8 (4 bilingual _fr dupes since Translate & Adapt handles them, 2 _en suffixes collapsed, why_stock as forward-leaning, original_wp_url as post-launch dead-weight). Added jessar.catalog_pdf (file_reference) for downloadable B2B sell sheet pattern.
    2026-04-28 · Sean / RevShift
  • Phase 5 setup pass — 3 of 4 punch-list warnings cleared. Location updated to Jessar HQ (341 Allée du Golf, Saint-Eustache, QC J7R 0L5) · FR locale enabled + published (hreflang auto-emitted; dev plan only accepts base fr not fr-CA, sufficient for Quebec content) · 17 jessar.* metafield definitions on PRODUCT owner (revised set). Only remaining warning: Hyper demo→main flip (awaits Sean's purchase). Settings → General "About this store" address is read-only via API — values printed for manual UI paste.
    2026-04-28 · RevShift
  • Afternoon batch (7 items shipped): test product live at admin/products/10306878865730 (10 metafields applied) · Hyper validation removed from public hub · customer-facing brand guide derivative built · public hub redesigned (left-bar accent removed per Sean, palette retained) · redirect map draft (2,172 rows) · brand voice skeleton · Phase 5 Shopify smoke test ran clean (3 warnings for punch list).
    2026-04-28 · RevShift
  • Project State snapshot shipped — comprehensive where-we-stand / where-we’re-going deliverable. Phase grid, action lists for Sean + Jessar, brand-decision impact map, deliverables map by audience. View snapshot. Also: Shopify Access Setup section corrected to 4/4 Complete (was stale since OAuth exchange).
    2026-04-28 · RevShift
  • Brand guide v0.3 shipped — italic-as-emphasis pattern (per Our Place reference) wired into every mock + spec, plus 5 alternative Caraway-spirited palettes (Walnut & Saffron, Bone & Brass, Linen & Forest, Stone & Plum, Almond & Saddle). Pick a direction and a palette — mix-and-match. View v0.3.
    2026-04-28 · RevShift
  • Brand guide v0.2 shipped in response to Sean's feedback that v0.1 mocks looked alike. v0.2 loads real Google Fonts (Fraunces, Cormorant Garamond, Newsreader, Inter), uses all 9 palette colors per direction with semantic roles, and gives each direction its own distinct mock layout. View v0.2.
    2026-04-28 · RevShift
  • Overnight: 3 new deliverables live on jessar-deliverables.vercel.app. (1) brand_guide_options_v0_1 — 3 direction-setting candidates honoring Sean's serif+sans soft-Caraway constraint. (2) investigate_skus_report — 366 WP-only SKUs pre-triaged. (3) wp_category_audit — 147 categories scored (34 abandoned, 11 weak, 102 healthy) for IA input.
    2026-04-28 · RevShift (overnight)
  • Deliverables live on Vercel: jessar-deliverables.vercel.app. Built as replicable cross-client pattern (templates in polished-deliverables skill). Sean can spin up <client>-deliverables.vercel.app for any project in ~5 min.
    2026-04-27 · RevShift
  • Hyper theme VALIDATED. All 3 criteria pass — 5 collection templates, 9 product templates, native filtering/swatches/sorting, 93 sections incl. brand-logos, collapsible-tabs, comparison-table. FR locale built in. See /work/hyper_theme_validation.html. Pebble ruled out.
    2026-04-27 · RevShift
  • WP migration scope is just products + 301 redirects. No plugins, no blog, no menus (existing menu is messed up — we rebuild), no static pages exporting cleanly (we pull what's needed from products). Significantly tighter than first assumed.
    2026-04-27 · Sean
  • AI image + video generation pipeline for hero PDPs and social — feed base product photos, generate lifestyle imagery / short videos. Logged in Phase 6 / retainer scope; design hero templates with AI-imagery placeholder slots so they drop in cleanly.
    2026-04-27 · Sean
  • Phase 5 expanded with 3 critical migration items: 301 redirect map (WP slugs → Shopify URLs from Permalink column), Google Search Console setup, Google Analytics 4 setup. Confirm existing accounts first. Phase 5: 15 → 17 items.
    2026-04-27 · Sean
  • Built product_database_viewer.html — single self-contained file, 3,211 SKUs interactive (sort/filter/search/expand). For Jessar's team to triage at speed. Color-coded tier + action badges, completeness bars, missing-fields chips. Light + dark mode.
    2026-04-27 · RevShift
  • Bug fixes: dark-mode card on 1-pager (hardcoded cream → palette var); responsive breakpoint bumped to 1100px so vertical screens collapse to single-column before right column gets cramped. Skill CSS updated too.
    2026-04-27 · RevShift
  • Additional WP exports requested: Pages, plugin list, menu screenshot. Products export already has the URL slugs needed for 301 redirects.
    2026-04-27 · Sean
  • Tone POC approved by Jessar. Proceed with content gen in the existing voice. Q9 closed.
    2026-04-27 · Jessar
  • FR copy: we do it ourselves. Items-Jessar desc-fr already has 2,659 SKUs covered — we enhance rather than translate from scratch. Cherry-pick human review only. Shopify Translate & Adapt for fallback. Q10 closed.
    2026-04-27 · Jessar
  • MSRP populated from Items-Jessar col AO ("Selling Price"). Stays gitignored; pushed to Shopify as msrp metafield behind dealer login. Q6 fully resolved.
    2026-04-27 · Sean / Jessar
  • Partner logos: Sean procures from public sources (Costco, Linen Chest, Staples). Q17 fully resolved.
    2026-04-27 · Sean
  • Jessar intern available for data tasks. First brief: sub-brand mapping template.
    2026-04-27 · Jessar
  • Secondary product tier added to unified DB. Long-tail products from Master Sku / catalogs get priority_tier=secondary + parallel CSV. Ready to add later without pipeline rebuild.
    2026-04-27 · Sean
  • Data foundation summary refresh after SSD pull — current 1-pager is accurate to what's local; expect updates after asset bulk-copy.
    2026-04-27 · Sean
  • Dark mode + theme toggle on all Jessar HTML deliverables (progress.html, data_gap_report.html, phase1_data_state_one_pager.html). Respects OS preference; ☾/☀ toggle top-right persists to localStorage.
    2026-04-27 · RevShift
  • Unified product database is the Phase 1 deliverable. 3,211 unique SKUs, 5 migration buckets (preserve 1,099 · add 567 · cleanup 81 · investigate 366 · skip 1,098). Completeness scored. Pricing kept out of repo.
    2026-04-27 · RevShift
  • Shopify OAuth complete. shpca_* token stored in .env. Smoke-tested: shop = Jessar Industries Inc., CAD, EN primary, dev plan, 0 products. Granted scope = all admin (~70 scopes — Partner custom apps grant full access by default).
    2026-04-27 · RevShift
  • Hyper + Pebble both pre-installed as demo themes on the dev store (current main = Horizon). Hyper validation can proceed immediately via Shopify CLI pull of theme code without changing the live role.
    2026-04-27 · RevShift
  • WP vs masters reconciliation: 1,226 live + active (preserve), 110 live but discontinued (must clean up), 805 WP-only (status unclear), 440 active but missing from current site (must add).
    2026-04-27 · RevShift
  • Catalog PDFs are searchable text — no OCR needed. PyMuPDF extracted 1,767 SKU rows across 11 PDFs, 451 pages. Full text saved per page for content gen reuse.
    2026-04-27 · RevShift
  • Orange exclusion lives in Items-Jessar's On Hand sheet (not the SKU master). 119 SKUs flagged discontinued.
    2026-04-27 · RevShift
  • WP SKUs are in the Name field, not the SKU column. Built regex extractor.
    2026-04-27 · RevShift
  • WC CSV export is sufficient — REST API not needed for now. Sean uncertain about full API access; 2,196-product CSV covers SKUs, names, descriptions, categories, images, stock, published.
    2026-04-27 · RevShift
  • Brands are sub-brands of Jessar. Top-level identity is Jessar; 10 sub-brands (JS Gourmet, JS Maison, Beauty Cover, Cook & Fresca, IBake, Limpus, Pop Fluff, Veraroma, Jessar Lighting, Xtricity) live inside.
    2026-04-27 · Jessar
  • Orange highlight in Items-Jessar = ignore (discontinued + eco-fees). Read cell fill colors programmatically.
    2026-04-27 · Jessar
  • Source-of-truth confirmed: Items-Jessar + Electrical/Beauty Cover Inventory = primary. Master Sku xlsm = late-stage gap-filling reference.
    2026-04-27 · Jessar
  • No store locator. Replaced with "Partners" section showing major retailers (Costco, etc.) as logos.
    2026-04-27 · Jessar
  • Dealer portal out of scope — link to existing system. Retailer application out of scope (or simple contact form).
    2026-04-27 · Jessar
  • Costco items live on the site (not Costco-exclusive). Catalog supersession: newer wins only if same SKU; otherwise add regardless of year.
    2026-04-27 · Jessar
  • No MSRP yet — add empty msrp metafield as placeholder.
    2026-04-27 · Jessar
  • Brand guide: we design 2–3 options. Jessar has no existing guide. New explicit Phase 3 deliverable.
    2026-04-27 · Jessar
  • Pricing is NOT a gap — Items-Jessar already has prix-list, cout-std, prix-cout, prix. Lives behind dealer login. Local only, never in repo.
    2026-04-27 · RevShift
  • 108 eco-fee / non-product SKUs excluded from migration (accounting line items, not products).
    2026-04-27 · RevShift (pending Jessar confirm)
  • Items-Jessar confirmed as canonical SKU master (provisional). ~2,560 real SKUs across 6 prefixes, fully bilingual, pricing present.
    2026-04-27 · RevShift
  • External SSD primary; Tailscale as fallback. Windows App (RDP) on Mac is not programmatically accessible — SSD is the right call for bulk processing.
    2026-04-27 · Sean
  • Lockstep enforcement via hook + CLAUDE.md. PostToolUse hook injects reminder when PROJECT.md is edited; CLAUDE.md auto-loads at session start. Activate with /hooks once.
    2026-04-27 · Sean
  • Veraroma identified as JS Gourmet sub-line (logo: Veraroma by JS Gourmet). Same pattern likely for other sub-brands — confirm with Jessar.
    2026-04-27 · Sean
  • Custom Shopify Partner app created against jessar-industries.myshopify.com dev store. OAuth flow to capture access token; secret stored in .env (gitignored).
    2026-04-27 · Sean
  • Repo at folder root with smart .gitignore for raw client data.
    2026-04-27 · Sean
  • 6-phase engagement with sign-off gates and renders before commits.
    2026-04-27 · Sean
  • Tooling stack (provisional): Hyper theme + Shopify CLI + Python scripts. Migration tool (Matrixify vs. API) TBD.
    2026-04-27 · Sean
  • Items-Jessar for Sean.xlsx as primary data source (provisional).
    2026-04-27 · Sean
  • PROJECT.md + progress.html in lockstep as canonical state.
    2026-04-27 · Sean
  • 1 TB external SSD for bulk box-artwork + image access.
    2026-04-27 · Sean
  • Confidential files NEVER in repo: SOW, raw xlsm, future pricing, .env.
    2026-04-27 · Sean

Quality Bar (Always-On)

  • 1. Brand elevation is the goal. Migration is the vehicle.
  • 2. Render before commit. No design or IA is "done" until visualized + approved.
  • 3. Phase gates are real. Don't start N+1 until N is signed off.
  • 4. Data first, structure second.
  • 5. Dual-audience always — consumer + B2B on every page.
  • 6. Bilingual EN/FR from day one.
  • 7. Truth over speed. Mark gaps, don't invent data.
  • 8. Reference Caraway/Our Place + Linen Chest/Sur La Table — synthesize, don't copy.
  • 9. PROJECT.md is the single source of truth.
  • 10. Append-only history.