Skip to main content

Work Log — June 11, 2026 (Shopify App Uplift)

Last updated: 06-12 afternoon. Overnight: 4 feature plans approved (12 adversarial Opus review rounds), 25+ PRs raised, every one through an independent implement→verify dyad. All 16 ishaaq review comments addressed across 7 PRs. Decisions: B3 cleared (onboarding metafield failure → typed 502; stack raising), S13 GO (built), B6 DEFERRED.

Open decisions & actions (Raynor)

  1. CFN stack quota (blocks deploys) — dev AWS account full. aws sso login → tear down stale dev cells for merged/closed branches (mind 24-char branch-truncation collision risk) or bump quota → rerun #3525's deploy job.
  2. B3 clearance — ✅ CLEARED (06-11): metafield errors during onboarding → typed 502. Stack raising.
  3. B6 — ⏸ DEFERRED by Raynor (06-11): optional sync_service.py move-only split into services/sync/ package. Revisit in a quieter week; plan row B6 in ~/.claude/plans/crystalline-finding-zephyr.md has the spec (strictly move-only, sync_service_test.py passes with import-only changes, abandon clause if not move-only). S13 — ✅ GO (06-11), built, in verification.
  4. A5 triage — latent bug found by characterization: addDocsConfig: null permanently disables Save in VariantConfiguration. Prod-record check, then small test-first fix.
  5. FN preview link — S8 quickshop screenshot gate ran on Muji US (same Empire theme, exact parity); FN-live click-through needs a fresh FN preview link or post-merge verification.
  6. Remaining main-based merges: #3519 (S2), #3509 (B1), #3525 (B2, deploy pending quota), #3528 (B2b, after #3525).
  7. D1 (cross-component contract fixtures) — unblocked (B4+C3+C4 done), not started; say the word.

⏸ PAUSE STATE (updated evening 06-11)

S-chain merge hold (Raynor): S1–S7 and S10 are merged; S6/S7 deploy checks still gate the remaining S8/S11/S12/S13 merges (Muji preview: swatch rows + +N pills; LG preview: BEST SELLER/SAVE badges). 06-12 update: #3536 and #3539 are on main; rebase/conflict pass completed locally for #3537 and propagated through #3549/#3554/#3556. Current main includes #3615's flat-lay-first image behavior, and the moved carousel helper preserves that ordering.

Rebase pass completed (Codex, 06-12): #3579 (docs/orch-hooks) rebased onto main and pushed; #3537 (ref/card-media) was later rebased locally again after #3536/#3539 were confirmed merged; child stack #3549 (ref/badge-cfg) → #3554 (ref/qs-config) → #3556 (ref/integ-cfg) was propagated onto the updated parents. Local verification on top child #3556 after the latest rebase: npm test -- --run passed (59 files / 743 tests; jsdom navigation/scroll warnings only) and npm run build passed. Latest S-stack push is pending explicit force-with-lease approval for #3537/#3549/#3554/#3556.

⏸ PAUSE STATE (afternoon 06-11, token conservation)

All watchers/polls stopped; teammates dormant. Merged during/since pause: #3525 (B2), #3530 (S5 card-price), #3536 (S7 card-swatch), #3538 (S9 vue-registry), #3539 (S10 ui-split), #3547 (orch ideas) — plus earlier #3521 (S4), #3522 (sa-cover), #3509 (B1). New reviews arrived on some open PRs — NOT yet checked (deliberately deferred).

LG PROMO INVESTIGATION — RESOLVED (lg-promo-qc, Opus): NOT a code regression; stale per-theme promo whitelist. Final mechanism (verified file:line): the app embed reads the theme-scoped metaobject-list setting Global_active_promo (marqo-search-embed.liquid:22; LG typo fallback Globle_active_prmo) and whitelists which of the ~12 active global_promo_message metaobjects survive the client-side filter (promo-metaobjects.ts:110-121). Preview theme 139387797565's whitelist = 2 retired UTM-gated Lead Gen entries → nothing renders without campaign UTMs. LG live runs NO Marqo (preview-only merchant), so this setting is the single source of truth. FIX (Raynor, theme editor): preview theme → Theme settings → "Global active promo" → remove the 2 stale entries, add the current 6/9–6/14 entries (the non-UTM "40% OFF AT CHECKOUT | EXTRA 10%" on All Products Excl. DOTD is the unconditional one), save, reload. Rule of thumb: metaobject activation does nothing until the handle is in THIS theme's picker. — Earlier hypotheses eliminated in order: deploy state (bundle healthy), market/UTM scoping (cross-market repro), S9 registry (exonerated by Raynor's metaobject-badge control test), S5 promo block (byte-untouched). FOLLOW-UPS: promo-message test pin for the S1 suite (specced, pending Raynor's go); cite this incident in theme-targeted-deploys as the motivating per-theme-drift example. S5/S9 fully exonerated (promo render block ProductCard.ts:1030-1049 untouched; promo-metaobjects/enrichment/search.ts empty diffs across the merge range; pipeline runtime-proven working on-page). Root cause: LG's ACTIVE promo metaobjects changed — the previously-rendering set included an unconditional rule; the two currently active metaobjects (codes LG-Z7A994 / LG-Z7F997, activePromos "copy-of-..." handles, collection "all-products-copy") are BOTH utm_campaign-gated, and the preview URL has no UTMs → resolvePromoMessage correctly returns null. Working as designed for the current config. DECISION FOR RAYNOR: (a) want an always-on promo → merchant adds a global_promo_message metaobject with EMPTY utm_parameter + adds its handle to the theme's activePromos setting (customer-Shopify write — human-gated); or (b) UTM-scoping is intentional → nothing to fix; test with &utm_campaign=VtvvyX (note: adding UTMs can bounce the preview session to the live theme via the vsly redirect). FOLLOW-UP regardless: add the missing promo-message pin to the S1 suite (unconditional-rule renders / UTM-gated-without-UTM doesn't) — the one card feature the ratchet never covered. track-storefront retired (context overload); lg-promo-qc idle.

Resume checklist (when Raynor says go):

  • track-sfadmin: check new reviews on #3527/#3531–#3535; base-flip cascade once #3527 merges
  • track-adminserver: check new reviews on #3528/#3551–#3553; #3525 MERGED → flip #3528's base to main + walk B-stack; deploy-rerun question now moot for 3525 (merged) — verify
  • track-storefront RETIRED (context overload) — its S-stack upkeep (reviews on #3534/#3536/#3537/#3549/#3554/#3556 + #3539; base-flip walks for the merged S5/S9 parents) must be REASSIGNED at resume: spawn a fresh implementer with stack-upkeep.md + the S-chain map, or fold into an existing member
  • track-adminui: nothing pending (track fully merged)
  • Lead: re-arm PR merge watcher; sync #3546 if more plan comments; LG investigation outcome → possible fix PR

PR board

Legend: ✅ merged · ⏳ automerge enabled · 🟢 green, awaiting merge · 🔧 conflict fix in flight · 🔒 gated/unraised · 🛠 in implementation

main

├─ TRACK A (admin_ui) — COMPLETE, all in main except A3
│ └─ ✅ #3516 A1 chore/rm-uicustom https://github.com/marqo-ai/cloud_control_plane/pull/3516
│ └─ ✅ #3517 A4 test/ui-variant https://github.com/marqo-ai/cloud_control_plane/pull/3517 (automerge; carried A2 in)
│ └─ ✅ #3523 A2 ref/ui-api-types https://github.com/marqo-ai/cloud_control_plane/pull/3523 (landed via #3517)
│ └─ ✅ #3529 A3 fix/ui-race https://github.com/marqo-ai/cloud_control_plane/pull/3529 — TRACK A 100% MERGED

├─ TRACK B (admin_server)
│ ├─ ✅ #3509 B1 test/as-golden https://github.com/marqo-ai/cloud_control_plane/pull/3509 (merged — golden ratchet live on main)
│ └─ ✅ #3525 B2 test/as-infra https://github.com/marqo-ai/cloud_control_plane/pull/3525 (merged)
│ └─ 🟢 #3528 B2b test/as-infra2 https://github.com/marqo-ai/cloud_control_plane/pull/3528
│ └─ 🟢 #3551 B3 fix/as-failfast https://github.com/marqo-ai/cloud_control_plane/pull/3551 (UX cleared by Raynor; stacked on #3528)
│ └─ 🟢 #3552 B4 ref/as-metafield https://github.com/marqo-ai/cloud_control_plane/pull/3552
│ └─ 🟢 #3553 B5 ref/as-baseurl https://github.com/marqo-ai/cloud_control_plane/pull/3553 — TRACK B COMPLETE (B6 deferred)

├─ TRACK C (storefront_admin)
│ ├─ ✅ #3522 sa-cover test/sa-cover https://github.com/marqo-ai/cloud_control_plane/pull/3522 (automerged)
│ └─ ✅ #3510 C1 test/sa-golden https://github.com/marqo-ai/cloud_control_plane/pull/3510
│ └─ ✅ #3527 C2 ref/sa-conv https://github.com/marqo-ai/cloud_control_plane/pull/3527 (merged; track-sfadmin walking children)
│ └─ 🟢 #3531 C3 feat/sa-zod https://github.com/marqo-ai/cloud_control_plane/pull/3531
│ └─ 🟢 #3532 C4 ref/sa-preview https://github.com/marqo-ai/cloud_control_plane/pull/3532
│ └─ 🟢 #3533 C5 ref/sa-usesets https://github.com/marqo-ai/cloud_control_plane/pull/3533
│ └─ 🟢 #3535 C6r test/sa-deep https://github.com/marqo-ai/cloud_control_plane/pull/3535

├─ TRACK S (storefront_search)
│ ├─ ✅ #3520 S3 test/app-pins https://github.com/marqo-ai/cloud_control_plane/pull/3520
│ ├─ ✅ #3521 S4 ci/bundle-guard https://github.com/marqo-ai/cloud_control_plane/pull/3521 (automerged — bundle gate now LIVE in CI)
│ ├─ ✅ #3508 S1 test/card-pins https://github.com/marqo-ai/cloud_control_plane/pull/3508
│ │ └─ ✅ #3530 S5 ref/card-price https://github.com/marqo-ai/cloud_control_plane/pull/3530 (merged)
│ │ └─ ✅ #3534 S6 ref/card-badges https://github.com/marqo-ai/cloud_control_plane/pull/3534 (merged; track-s-upkeep walking children)
│ │ └─ ✅ #3536 S7 ref/card-swatch https://github.com/marqo-ai/cloud_control_plane/pull/3536 (merged 06-12)
│ │ └─ 🟢 #3537 S8 ref/card-media https://github.com/marqo-ai/cloud_control_plane/pull/3537 (06-12 rebased locally onto main after #3536/#3539; push pending approval)
│ │ └─ 🟢 #3549 S11 ref/badge-cfg https://github.com/marqo-ai/cloud_control_plane/pull/3549 (06-12 rebased onto #3537; MERGEABLE, Claude re-running; LG badges → config, defaults = today)
│ │ └─ 🟢 #3554 S12 ref/qs-config https://github.com/marqo-ai/cloud_control_plane/pull/3554 (06-12 rebased onto #3549; MERGEABLE, Claude re-running; round-2 approved; dyad-caught P1 documented in body)
│ │ └─ 🟢 #3556 S13 ref/integ-cfg https://github.com/marqo-ai/cloud_control_plane/pull/3556 (06-12 rebased onto #3554; MERGEABLE, Claude re-running; local npm test/build passed) — UPLIFT ROADMAP FULLY RAISED
│ └─ ✅ #3519 S2 test/ui-pins https://github.com/marqo-ai/cloud_control_plane/pull/3519
│ └─ ✅ #3538 S9 ref/vue-registry https://github.com/marqo-ai/cloud_control_plane/pull/3538 (merged)
│ └─ ✅ #3539 S10 ref/ui-split https://github.com/marqo-ai/cloud_control_plane/pull/3539 (merged 06-12)

├─ ORCHESTRATION
│ └─ ✅ #3518 orch dyad/worktree fixes https://github.com/marqo-ai/cloud_control_plane/pull/3518

└─ DOCS
├─ ✅ #3546 settings feature plans https://github.com/marqo-ai/cloud_control_plane/pull/3546 (merged; all review rounds addressed)
├─ ✅ #3577 tier-1 422 alignment https://github.com/marqo-ai/cloud_control_plane/pull/3577 (merged — post-merge Codex catch on #3546)
├─ ✅ #3547 orch roadmap ideas https://github.com/marqo-ai/cloud_control_plane/pull/3547 (merged)
├─ ✅ #3576 orch uplift-run lessons https://github.com/marqo-ai/cloud_control_plane/pull/3576 (merged — stack-upkeep.md, verifier env assertion, lead protocol additions, QC heuristics)
└─ 🟢 #3579 orch hooks catalog https://github.com/marqo-ai/cloud_control_plane/pull/3579 (06-12 rebased onto main; MERGEABLE, checks re-running; roadmap idea 9 renumbered to §16 after main added §13–§15)

Feature plans (docs/plans/) — all reviewer-APPROVED

  • settings-concurrency-control.md (3 rounds) — record_version optimistic locking, migration-free legacy=0, structured 409s.
  • settings-versioning.md (2 rounds) — S3 snapshots + SHOPVER# partition; counter shared with concurrency (canonical signature character-identical in both docs).
  • storefront-admin-sso.md (3 rounds) — Cognito console SSO → ES256 session JWT; scoped mqsft_ CLI tokens; allow→warn→deny legacy ratchet; prefixed actor grammar locked across all plans.
  • theme-targeted-deploys.md (3 rounds) — per-theme staged records, live-theme guards, transactional deploy + content-merge rollback.
  • Key finding: real binding size limit is Shopify's 128KB metafield cap (Muji CA ~94%); tripwire = ShopifyAPI.VERSION bump past 2026-04 (client pins 2024-01; manifests already 2025-04).

Notable outcomes

  • ProductCard: 1,261 → 511 LOC over four verbatim extractions; snapshot ratchet never moved.
  • ui-rendering: 24 module-level globals → typed 10-slot registry; then move-only split into 4 modules behind a byte-identical barrel.
  • storefront_admin: converter modular (theme-deploys seam), permissive Zod boundary, render-only preview, extracted dirty-tracking; tests 222 → 331 (+65 sa-cover).
  • admin_server: golden metafield ratchet, full infra characterization, fail-fast pipeline + single write funnel (concurrency seam), metafield publisher split, typed base-URL config.
  • Screenshot gates: read-only Playwright route-interception bundle swaps on Muji US preview (route-hit counter proving the swap); PNGs under tmp/work/ref-card-{swatch,media}/screenshots/ and tmp/work/ref-vue-registry/screenshots/.
  • Process: dyads caught real defects in both directions (plan reviewers: false CORS claim, cross-doc retry contradiction; lead: a verifier measuring the wrong checkout; implementer: lead's wrong S11 base instruction).

Logged follow-ups (escalation files)

  • Preview double-search on repeat submits (pre-existing; cheap fix vs extracted hook) — tmp/work/ref-sa-preview/escalations/
  • A5: addDocsConfig-null Save lockout — tmp/work/ui-variant/escalations/
  • CONFLICT job status has no dedicated badge tone (falls to neutral) — tmp/work/ui-api-types/escalations/
  • biome ^2.4.8 (component) vs 2.3.7 (CI) drift; app/app.css prettier failure pre-existing on main; createRoutesStub navigation hang under vitest/jsdom
  • B4: drop _merge_settings delegate once frozen goldens updated post-merge; S8b optional ProductCard content extraction (511 → ~300)
  • B6 DEFERRED (Raynor, 06-11): sync_service.py (2.1K LOC) move-only split — spec in plan row B6; revisit later
  • NEW S14 candidate (Raynor, 06-11): remove dead marqo-disabled functionality — touchpoints: storefront_search src/errors.ts:170 (write), src/index.ts:17 (boot gate), marqo-loader.js:523-528 (loader gate; 10KB-capped asset, removal shrinks it). Implementer must first confirm the error-recovery write path is genuinely dead (if it's a live crash kill-switch, escalate instead). Task #35.
  • S13 escalation: FeaturedCollectionApp duplicates notifyWishlistWidgets' Swym registration (pre-existing) — dedupe candidate
  • FN-live quickshop click-through verification post-merge (S8/S12 screenshot gates ran on Muji US; no FN preview link)