Session was pushing the DoorDash v2 fix (TOC above snippet, accordion FAQ, deprecated BSG removed, etc.) and shipped a post_content replacement that only contained the .sa-content-grid block. The hero for page 61300 lived inside post_content, not in a Kadence template hook. The REST POST replaced the entire field and destroyed the hero.
Live page rendered without hero from 2026-05-17T10:05 to 2026-05-17T11:02 (about an hour). Sam caught it visually. Hero was restored via v3 push that read the original hero markup from the backup JSON, spliced it ahead of the new content-grid body, and POSTed back. Live page verified: hero present, image present, H1 present, TOC still above snippet.
Only page 61300 was affected. Zero impact on any other live page.
Files changed this session beyond page 61300:
Skill files are read by future agent sessions. They do not push to any live page. The only future risk is another agent making the same mistake, which the new hero-preservation rule now blocks.
I assumed the hero was rendered by a Kadence template hook outside post_content. For some SA-template pages that is true; for the DoorDash page it was not. The original hero block was stored in post_content starting at char 10054, immediately before the content grid. My replacement only included the content grid.
Contributing factor: I did not run playwright-visual-qa between push and reporting done. A single desktop screenshot would have shown the hero was gone.
v3 push (2026-05-17T11:02:57) restored the original hero markup verbatim from backup, kept all the new content (TOC above snippet, accordion FAQ, sidebar fix, removed banned FAQs), and added the missing hero CSS to the page style block.
Backup at outputs/doordash-page-61300-backup-20260517-1400.json (full original post_content, 30424 chars).
wp-content-deployer v2.4 now refuses any update where the current page has sa-hero in post_content and the replacement does not. Refuses with a clear error message that points the agent at the splice pattern. An explicit preserve_hero=False, _hero_drop_reason=... opt-out is required for true full replacements.