Infrastructure errors, reproduced and fixed
Reproducible fixes for infrastructure errors: WSL2, Synology, Docker Swarm, Graylog, MediaWiki. Every post is a real incident with the exact error message, the diagnosis and the verified fix.
Latest posts
- A phone input mask that silently rewrote the number I typed
A jquery.mask field with a fixed national format did not reject a foreign number — it reshaped the digits into a different, valid-looking one. How to detect this class of bug and why fixed-length masks are the wrong validation tool.
- Cloudflare Email Routing rejects mail with 550 5.7.26 "not authenticated"
A forwarding alias accepts RCPT TO and still refuses the message: Cloudflare will not forward mail that lacks SPF/DKIM alignment. How to prove the alias exists, what the rejection means for your contact address, and what the forwarded headers look like when it works.
- HTTP 522 after pointing a domain at Cloudflare Pages (and the Search Console fallout)
Adding a custom domain to a Pages project and flipping DNS in the same minute produces a short 522 window. That window is enough for Googlebot to record a failed sitemap read that sticks around after the site is healthy.
- reCAPTCHA v3 rejects your headless Chromium and no fingerprint patch fixes it
A form on your own site works in a normal browser and fails from a headless Chromium with a server-side score rejection. Here is what I measured across UA spoofing, navigator.webdriver, window.chrome.runtime and screen size — and the one change that actually mattered.
- MCP server dies at startup after the mcp package resolves to 2.0.0
A working stdio MCP server suddenly fails to start because its dependency spec says mcp>=0.9.0 and the resolver picks 2.0.0, which removed Server.list_tools(). Pin the SDK, and check the client side too.
- gpsoauth returns BadAuthentication on a 2FA Google account (app passwords do not help)
perform_master_login fails with BadAuthentication even with an app password. The working path is the oauth_token cookie from accounts.google.com/EmbeddedSetup — and you can capture that HttpOnly cookie over CDP instead of digging in DevTools.
- Graylog 7 API: POST /api/streams returns 400 "entity cannot be null"
The stream creation payload changed in Graylog 7: the stream object must be wrapped in an entity envelope. Also, the root admin account cannot hold an API token, which breaks scripted setups in a second, less obvious way.
- Synology NAS: scp fails with "subsystem request failed on channel 0"
DSM ships an SSH server without the sftp subsystem, so scp and sftp both fail even though ssh logs in fine. Transfer files with cat over ssh instead — and do not expect the bundled ffmpeg to encode anything.
- docker manifest inspect fails with "permission denied" on /etc/docker/certs.d
A deploy script that pre-checks whether an image tag exists breaks for non-root users on nodes with a private registry CA. The registry API answers anyway — use a plain HTTP HEAD as the fallback.
- Editing a Subversion repository without a working copy: svnmucc
Checking out a release repository just to change one deploy script is slow and error-prone. svnmucc performs put, rm and mv straight against the URL as one atomic commit — including the commit-message prefix a pre-commit hook may demand.
- WSL2: /mnt/c fails with "Input/output error (os error 5)" after the laptop sleeps
After a suspend/resume cycle every Windows drive mount in WSL2 returns os error 5 while native Linux paths keep working. Here is how to tell it apart from a permissions problem, and why the only reliable fix has to be run from Windows.
- Teams incoming webhook returns HTTP 200 but no message appears
Office 365 connector webhooks on *.webhook.office.com are retired: they accept your POST, answer 200 and silently drop it. The response headers prove it. Migrate to a Power Automate Workflows webhook and an Adaptive Card payload.
- Reading and writing MediaWiki pages from a script: action=raw and the two-token login
Fetching a wiki page with an HTTP client can silently return Recent Changes instead of the article, and editing needs two different tokens in the right order. Both fixes, plus the credential-file trap that broke my first attempt.
- Word tracked changes in a .docx: python-docx cannot do it, raw XML can
python-docx has no API for revisions, so a document that must be reviewed with accept/reject has to be edited as OOXML. The w:ins and w:del structures, the unique-id rule that silently corrupts documents, and how to prove accept and reject both work before you send it.
- When an MCP wrapper hides API fields: set Redmine parent, due date and estimate over REST
create_issue and update_issue in a Redmine MCP wrapper expose only a handful of fields, so parent_issue_id, due_date and estimated_hours are unreachable. The REST API supports all of them — including the query-string API key the docs bury.