/api/mesh answers a degraded read with a status code, not prose in a 200

Every POST /api/mesh/* verb used to ship whatever string the operation produced with a 200 and application/json — including the three prose sentinels (Error: …, Not found: …, Unavailable: …), which are not JSON. A caller that checked response.ok() and then parsed the body died inside JSON.parse with nothing naming the path or the reason.

Now a sentinel answer is a 404 (not found), 503 (the read reached no verdict — retry) or 500 (a fault), with a JSON body { "error": "<the sentence>", "kind": "NotFound" | "Unavailable" | "Error" }. A document still goes out verbatim with a 200. The MCP tool result is unchanged, and the memex CLI unwraps the envelope so its output and exit codes are what they were.

Contract and rationale: The /api/mesh REST Contract.