git init in project root.gitignore for confidential + large files/work/, /renders/, /decisions/, /raw/, /scripts/, /theme/PROJECT.mdclient_id + client_secretshpca_* access token.env (gitignored); ~70 admin scopes confirmed via API smoke test (see PROJECT.md decision log)Items-Jessar for Sean.xlsx → /work/items_jessar_call_brief_2026-04-27.md#FFC000) → 119 excluded, 876 activewc-product-export-27-4-2026-1777321473954.csv (2,196 products live)Name field; 41 cols incl. categories, descriptions, images, stock/work/wp_reconciliation.md/work/catalog_text//work/unified_product_database.csv + .json (3,211 unique SKUs).6-, 3- pending Jessar)unified_product_database.csv + .jsondata_gap_report.html (visual coverage report)third_party_needs.md (photography, copy, partner logos)phase1_data_state_one_pager.html for Sean → Jessar review/work/phase1_data_state_one_pager.html and accepts unified DB as canonical/theme/ via Shopify CLI (blocked: license not yet purchased)msrp metafield from Items-Jessar col AO ("Selling Price")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).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).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).
(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.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.”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.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-pre-residualfix snapshot; Shopify untouched.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.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).pre-qa-2026-05-27 + data snapshot intact. New scripts: aggregate_qa.py, render_qa_report.py. Next: fix plan pending Sean's go.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.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.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.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.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.variant.sku → inventoryItem.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.scripts/ocr_image.swift → scripts/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.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.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..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./Users/macbookpro/Downloads/RevShift Media/revshift-internal/.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.#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.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.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.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.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 →/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.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.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./work/hero_selections_michael.csv; the build pass flips Michael's picks to tier=sow_hero.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.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.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._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.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.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.<client>-deliverables.vercel.app for any project in ~5 min.brand-logos, collapsible-tabs, comparison-table. FR locale built in. See /work/hyper_theme_validation.html. Pebble ruled out.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.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.msrp metafield behind dealer login. Q6 fully resolved.priority_tier=secondary + parallel CSV. Ready to add later without pipeline rebuild.progress.html, data_gap_report.html, phase1_data_state_one_pager.html). Respects OS preference; ☾/☀ toggle top-right persists to localStorage.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).Name field, not the SKU column. Built regex extractor.msrp metafield as placeholder.prix-list, cout-std, prix-cout, prix. Lives behind dealer login. Local only, never in repo.Items-Jessar confirmed as canonical SKU master (provisional). ~2,560 real SKUs across 6 prefixes, fully bilingual, pricing present.CLAUDE.md. PostToolUse hook injects reminder when PROJECT.md is edited; CLAUDE.md auto-loads at session start. Activate with /hooks once.jessar-industries.myshopify.com dev store. OAuth flow to capture access token; secret stored in .env (gitignored).Items-Jessar for Sean.xlsx as primary data source (provisional)..env.