Follow-up to #22 / #23, which added the rule (/edit-block-content) but no way to find damage that already exists.
#22 documents how a scripted post_content edit silently strips one backslash level from a block's attribute JSON. The corruption is invisible to every existing check — it stays valid JSON, parse_blocks() parses it, ACF returns it, the template prints it. On the site where it happened it survived six weeks and a production deploy before a human spotted it in a PDF.
A deterministic scan would have caught it in seconds.
Proposal
Add a content check to brmbh doctor that scans posts for stripped-escape artifacts.
Detect, but only inside block delimiter comments (<!-- wp:… {…} -->) — scanning whole post_content would false-positive on ordinary prose:
| Pattern |
Was |
u00[0-9a-f]{2} not preceded by \ |
&, <, >, ", -- |
rn between a lowercase and an uppercase letter |
\r\n |
Report post ID, post type, block name, and the attribute key — enough to repair by hand:
{
"name": "content",
"status": "warn",
"note": "2 posts with stripped block-attribute escapes",
"hits": [
{ "id": 73, "type": "page", "block": "acf/events-grid", "key": "events_0_body", "found": "u0026" }
]
}
warn, not fail — the environment works, the data is wrong.
Details worth deciding
- Skip revisions by default (
--include-revisions to opt in). On the affected site the live post had 2 hits and revisions had ~40 — the noise buries the signal.
- Report only, no
--fix. u0026→& is a deterministic reversal, but rn→\r\n is not: rn occurs in legitimate text. An agent offering to auto-repair here would eventually eat real content. The JSON payload should be precise enough to repair deliberately instead.
- Works over
--ssh — the existing doctor flag already reaches a remote WordPress, so the same check can audit staging and production, which is exactly where this damage hides. That's most of the value.
- Runs via wp-cli, so it should degrade to
skip (not fail) when wp-cli is absent, like the SCF check.
Why it belongs in doctor
Doctor is already the thing an agent runs before and after touching an environment, and it already returns a JSON envelope agents branch on. A rule an agent can check beats one it can only remember — same argument as the verify grep in #23, but covering damage that predates the rule.
Follow-up to #22 / #23, which added the rule (
/edit-block-content) but no way to find damage that already exists.#22 documents how a scripted
post_contentedit silently strips one backslash level from a block's attribute JSON. The corruption is invisible to every existing check — it stays valid JSON,parse_blocks()parses it, ACF returns it, the template prints it. On the site where it happened it survived six weeks and a production deploy before a human spotted it in a PDF.A deterministic scan would have caught it in seconds.
Proposal
Add a
contentcheck tobrmbh doctorthat scans posts for stripped-escape artifacts.Detect, but only inside block delimiter comments (
<!-- wp:… {…} -->) — scanning wholepost_contentwould false-positive on ordinary prose:u00[0-9a-f]{2}not preceded by\&,<,>,",--rnbetween a lowercase and an uppercase letter\r\nReport post ID, post type, block name, and the attribute key — enough to repair by hand:
{ "name": "content", "status": "warn", "note": "2 posts with stripped block-attribute escapes", "hits": [ { "id": 73, "type": "page", "block": "acf/events-grid", "key": "events_0_body", "found": "u0026" } ] }warn, notfail— the environment works, the data is wrong.Details worth deciding
--include-revisionsto opt in). On the affected site the live post had 2 hits and revisions had ~40 — the noise buries the signal.--fix.u0026→&is a deterministic reversal, butrn→\r\nis not:rnoccurs in legitimate text. An agent offering to auto-repair here would eventually eat real content. The JSON payload should be precise enough to repair deliberately instead.--ssh— the existing doctor flag already reaches a remote WordPress, so the same check can audit staging and production, which is exactly where this damage hides. That's most of the value.skip(notfail) when wp-cli is absent, like the SCF check.Why it belongs in doctor
Doctor is already the thing an agent runs before and after touching an environment, and it already returns a JSON envelope agents branch on. A rule an agent can check beats one it can only remember — same argument as the verify grep in #23, but covering damage that predates the rule.