---
name: social-image-verify-pack
description: Verify multi-day scheduled social posts (GHL Social Planner, LinkedIn) match their images by CONTENT, not position or date — plus GHL platform-field display quirk and LinkedIn's published-post image lock. Trigger when listing/verifying scheduled posts, swapping images on scheduled posts, or when a user reports "wrong image on my scheduled posts."
---

# Social Image Verify Pack

Companion to `social-media-content-pipeline` (image selection/rendering rules live there). This pack covers the verification and platform-limit lessons from the 2026-08-11 wrong-image incident.

## Verify by content signature, never by position or date

When verifying a multi-day scheduled batch in GHL:

1. Classify each post by a **content signature** — a distinctive opening phrase, hashtag set, or topic keyword pulled from the actual `summary` field.
2. Confirm the attached image's topic matches THAT signature (vision_analyze the image if needed).
3. **Never assume list order = day order**, and never assume `displayDate` matches the text — a schedule-time text swap leaves the date label pointing at the original draft's image while the text is the replacement.
4. Before PUT-ing any image change across multiple posts, re-open each post's `summary` and build the update map from content, not from an earlier list's ordering. In the 2026-08-11 session a positionally-built map put Tuesday's card on Thursday's post and vice versa — the post-PUT re-list (the pipeline's Hard Rule 3) is what caught it.

## GHL platform-field quirk (display only)

Scheduled posts created via API show `platform: "google"` in list/GET responses even when `accountIds` points at a LinkedIn account; published ones then flip to `platform: "linkedin"`. It is a display quirk in GHL's API, NOT a misroute — verify routing by account ID. Don't debug it, don't alarm the user; note it once if they're watching the output.

## LinkedIn published-post image lock

LinkedIn does NOT allow replacing the image on a published post — text edits only. Consequences:

- A designed-image retrofit for already-published posts is dead on arrival (Rob had editorial cards made for a prior published week; they were parked as `old-*` files, unusable). If the user proposes refreshing images on published posts, say so up front BEFORE anyone designs anything.
- Scheduled (unpublished) posts CAN be re-imaged freely via GHL PUT with the full payload (per pipeline Hard Rule 5).
- The only fixes for a wrong image on a published post: delete + republish (loses any engagement), or leave it.

## Card-render collision check (Pillow-template cards)

When rendering cards from the vault template (`visual-assets/generate_card.py`), vision_analyze can over- or under-report text/photo overlap. Cross-check pixel-level when the call matters: mask orange pixels (`R>200, 90<G<180, B<90`), find max-x of the headline band (y≈230–360), compare against the photo-zone x start (~578 at template defaults, i.e. x=64 text start + ~514px safe width). Note the template's fade zone means ~100px of headline can cross x=578 onto dark suit area harmlessly — face-clear is the real bar, and the face sits deeper in the photo for the full headshot than for the tight crop.
