Skip to content

Session handover — 2026-07-04 (pt3)

Pointer note. Third session of the day. Two things landed after the pt2 wrap: the spike branch was merged to master (fast-forward), and Priority 2 (extend the Option A image-field fix) was completed. Work is now on master (spike branch is behind by these commits but otherwise identical).

Branch / publish note

spike-0-one-site-operationalmaster fast-forwarded and pushed (0f27a07); then pt3 code + these wiki edits pushed to origin/master. The published wiki now builds with the full one-site milestone — the "lags until merge" caveat from pt1/pt2 is cleared.

What changed — where to look

Priority 2 done — Option A extended to Hero / CTA-strip / Header (commit 8a51bc5): - marketing-blocks/index.ts: fcr.hero.imageUrl, fcr.cta-strip.imageUrl, fcr.header.logoUrlmedia_picker (were text_input). - migrate-block-image-fields-to-string.mjs (new) — generalizes the about-only migration to a {type: field} map; flattened 28 seed fields ({src,originalName} → resolved URL string). Idempotent. - Adapters unchanged — all three already read via shape-agnostic getImageSrc, so the flatten can't regress rendering. - ADR-0005 "Followup" section extended (append-mostly); known-issues image-field bullet narrowed to just repeater-item images.

Reseed-globals bug found + fixed (commit 1d31300): - reseed-d1-from-json.mjs upserted globals by id, but emdash's globals row uses a ULID ≠ seed's id:"site" → every prior globals reseed silently no-op'd the live row and created a junk draft. Header logoUrl is a global, so its migration didn't land until fixed to UPDATE-by-slug. Junk row deleted from remote D1. New known-patterns entry.

known-patterns.md — 1 new entry (reseed globals UPDATE-by-slug); media_picker entry status extended to the 3 new fields.

known-issues.md — image-field bullet rewritten: top-level fields done, repeater-item images (Block-Kit scalar-only) are the remaining piece.

Deployed state

  • Worker replatform-emdash-demo (personal cathaldempsey account), emdash.dcathal.org. Current version 144418fc (media_picker schema).
  • Remote D1 reseeded: hero/cta imageUrl + header logoUrl now scalar strings; ec_globals is a single clean published row. Reseed used the D1-scoped CF_API_TOKEN_REPLATFORM; deploy used CF_API_TOKEN_CD.

Verified

Live: hero / cta-strip / header-logo all render (no missing-image placeholders); all pages 200; remote D1 has zero object-shaped hero/cta fields; globals logoUrl is a string. Not verified by me: the visual admin confirmation (picker shows the image, editable) — needs an OTP login to /_emdash/admin; data shape is correct and matches the proven fcr.about mechanism, so it's expected to work — eyeball to confirm.

Next priorities

  1. Repeater-item image fields — the last image-migration piece; needs the Block-Kit "can media_picker nest in a repeater?" investigation before a 2nd site. See known-issues.
  2. Contact form real submission + move /contact onto FcrBlocks.
  3. Access policy — tighten from whole-domain to specific emails (ADR-0006).
  4. LinkedIn custom SVG — the one remaining icon placeholder (pt2 finding).

Milestone framing still in scope-2026-07-04-one-site-operational.md.

Late incident + recovery (same session)

Right after the pt3 work, the live site lost its nav menu / topbar / footer. Cause: the reseed-globals fix (1d31300) made the globals reseed actually write for the first time — from a seed.json whose globals had drifted to a thin skeleton — clobbering the rich live globals. Recovered the original content from emdash's revisions table (untouched since 2026-05-09), re-pointed the header logo to R2, and wrote it back into seed.json (commit 8ce82af). Data-only, no redeploy. New known-patterns entry "Fixing a silently-broken sync is destructive when the two stores have diverged"; the "reseed reverts content not in seed.json" known-issue strengthened. Lesson for next session: dry-run + diff any reseed payload against live before applying — seed is not automatically canonical.