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-operational → master 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.logoUrl → media_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(personalcathaldempseyaccount),emdash.dcathal.org. Current version144418fc(media_picker schema). - Remote D1 reseeded: hero/cta imageUrl + header logoUrl now scalar
strings;
ec_globalsis a single clean published row. Reseed used the D1-scopedCF_API_TOKEN_REPLATFORM; deploy usedCF_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¶
- 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.
- Contact form real submission + move
/contactontoFcrBlocks. - Access policy — tighten from whole-domain to specific emails (ADR-0006).
- 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.