Sam provided /Users/samaguiar/Downloads/aguiarinjurylawyers.com_external_broken_links_20260614.csv and asked to remove, replace, or fix the broken links. I treated this as live WordPress and SEO work, loaded the local SAIL website instructions and skills, and used the live WordPress REST edit source as the truth source.
The CSV contained 54 rows across 30 public URLs. I verified the links against live editable WordPress content, created a repeatable repair script, then applied the fixes through authenticated REST without sending a status field. That preserved each page or post as published.
The repair changed 24 published pages/posts. It performed 28 exact URL replacements and 20 dead-link unwrap operations. Unwrapped links were mostly dead law-firm, legal-vendor, or unsupported private-blog citations, following the SAIL broken-link rule that dead competitor firm links should be unwrapped rather than replaced with another law firm. Six rows were left in place because they reverified live or were crawler blocks: Lane Report, Total Loss Appraisals, NOAA NCEI, and WDRB winter driving.
Primary repair report: /Users/samaguiar/Documents/Projects/admin/scratch/broken-link-repair-2026-06-14/repair-report-20260613-222150.json.
Backups: /Users/samaguiar/Documents/Projects/admin/scratch/broken-link-repair-2026-06-14/backups-20260613-222150/.
Proposed HTML copies: /Users/samaguiar/Documents/Projects/admin/scratch/broken-link-repair-2026-06-14/proposed-20260613-222150/.
Post-deploy link QA: /Users/samaguiar/Documents/Projects/admin/scratch/broken-link-repair-2026-06-14/post-deploy-link-qa-20260613-222150.json showed zero exact remaining non-live broken hrefs and all 30 affected public URLs returned HTTP 200 with a cache-busting query.
Replacement URL QA: /Users/samaguiar/Documents/Projects/admin/scratch/broken-link-repair-2026-06-14/replacement-url-qa-20260613-222150.json checked 29 replacement/live targets. 24 returned 200. Five government URLs returned 403 to this datacenter, which the seo-broken-link-scanner skill classifies as bot-block rather than broken: CDC Stacks, FMCSA insurance, FMCSA ELD, FMCSA Large Truck and Bus Crash Facts, and NHTSA EDR.
Cloudflare exact-file purge succeeded for 24 changed URLs. Purge report: /Users/samaguiar/Documents/Projects/admin/scratch/broken-link-repair-2026-06-14/cloudflare-purge-20260613-222150.json; purge id 9f3c8838b35f17e2f029a5d13d4f169e.
Post-purge public readback: /Users/samaguiar/Documents/Projects/admin/scratch/broken-link-repair-2026-06-14/post-purge-public-readback-20260613-222150.json showed all 24 changed URLs returned HTTP 200 without a cache-busting query.
The local runtime did not have Python Playwright or Node Playwright installed, so the full screenshot gate could not run. I used REST readback, exact href checks, public status checks, replacement URL checks, and Cloudflare purge/readback instead. Because the edits only changed hrefs or removed anchor wrappers, this is an acceptable smoke QA fallback, but a later visual sweep can still be useful.
The live site has been updated. No protected homepage change was made. No publish status drift occurred. No direct WP-CLI post_content update was used. The Projects git tree was already dirty before this session, so I did not stage or commit broad workspace changes. The only intentional local file addition from this session is the repeatable repair script and generated reports under admin/scratch/broken-link-repair-2026-06-14/.
A future agent could rerun the CSV crawl to confirm the external broken-link count drops after Cloudflare and crawler caches settle. It would also be useful to fold this exact repair script pattern into seo-broken-link-scanner or a recurring broken-link repair workflow so the next CSV can be converted into safe replacements, unwrapped citations, backups, Cloudflare purge, and QA in one command.