Sends request text with Cyrillic, accented letters, em dashes, typographic quotes, apostrophes or the euro sign from Windows so that it reaches the server byte for byte. The curl that ships with Git for Windows converts text given on its command line to the ANSI code page, and Windows PowerShell 5.1 sends a string body without UTF-8, writes files in the ANSI code page, as UTF-16 or with a BOM, strips the quotes from JSON it hands to a program, ends strings at typographic quotes and runs Invoke-WebRequest when you type curl. The server still answers 200 and the page later shows � or ?. The body goes into a UTF-8 file without a BOM that curl reads itself, or into a script, or Invoke-RestMethod gets charset=utf-8 in -ContentType; the record is read back and compared with the source, and text that was already sent broken is fixed through an edit route, or the person is asked before anything is submitted twice. Use when an agent or a script on Windows posts JSON or form data with curl, Invoke-RestMethod or another command-line tool from Git Bash or PowerShell, or when text sent from Windows arrives as �, question marks, mojibake or with a BOM.
Windows UTF-8 Request Body: curl and PowerShell is a tested SKILL.md that sends request text with Cyrillic, accented letters, em dashes, typographic quotes, apostrophes or the euro sign from Windows so that it reaches the server byte for byte; an agent buys it once for $0.05 over x402.
Linux and macOS, and PowerShell 7, which was not measured. It does not repair text that is already garbled: our mojibake-repair skill reverses that when the original bytes survived, while a letter that became a question mark is gone and has to be sent again from the source. It does not make a server accept UTF-8.
Tested, honestly
Tested 2026-10-25 with a strong and a weak model.
With and without the skill
Results with and without the skill, for Sonnet and Haiku
Sonnet
Haiku
with
without
with
without
Requests handled right (13 requests)
Requests handled right (13 requests)
13/13
9/13
13/13
8/13
Same request on both sides, scored with the same checks. Read by hand, Sonnet without the skill knew the theory: it gave the ANSI code page as the cause in every diagnosis, knew that PowerShell 5.1 ignores a charset passed in -Headers and that curl is an alias there, and for two JSON bodies it chose a file or escapes on its own. Writing the commands itself, it put the text straight on curl's command line in a multipart field, in a URL-encoded field and in a loop variable, twice saying that Git Bash sends UTF-8, and it left Mara’s inside a single-quoted PowerShell string, which ends at that apostrophe. Haiku without the skill did the same in those four and also sent the English text with accents and curly quotes inline; in the PowerShell example it put „ “ inside double-quoted strings, which end there as well.
Same cases and the same checks with and without the skill. The cases are ours, written around what the skill is for; with a handful of cases, a difference of one or two is within noise.
SonnetStrong model, claude-sonnet-5-5
Right on all 13 requests, read by hand. In Git Bash it put every body with non-ASCII text into a file that curl read itself (--data-binary @file, -F 'title=<file', --data-urlencode 'text@file') or sent it from a Node script with fetch and JSON.stringify. In Windows PowerShell 5.1 it used here-strings, the charset inside -ContentType or UTF-8 bytes, curl.exe instead of the alias, and had the scheduled .ps1 saved as UTF-8 with a BOM. It gave the code page as the cause in all three diagnoses. For the four directories it corrected the one with an edit route through PATCH from a file and a read-back, asked before submitting twice where no edit route existed, checked the third place sent with the same command and left the ASCII-only one alone.
HaikuWeak model, claude-haiku-5-5
Right on all 13 requests by the same checks, read by hand. It wrote the text to files with quoted heredocs or printf and let curl read them, escaped the loop values before printf wrote each body, used a here-string with WriteAllText and a UTF8Encoding without a BOM for curl.exe, compared the response with the source text, and asked before a second submission to the directory without an edit route.
Our own test text, before and after the skill ran. Excerpts only.
English · claude-sonnet-5-5
Before
I'm in Git Bash on Windows 11. Please submit our tool to the directory. Their API: POST https://api.tooldir.example/v1/tools
with a JSON body that has the fields name, url and tagline. Our values:
name: Сверка на фактури — бърз старт
url: https://invoices.example.com
tagline: Проверява ДДС за 30 секунди, без „ръчно“ броене
No auth needed. What exactly do I run?
After
```bash
cat > body.json <<'EOF'
{"name": "Сверка на фактури — бърз старт", "url": "https://invoices.example.com", "tagline": "Проверява ДДС за 30 секунди, без „ръчно“ броене"}
EOF
curl -sS -X POST https://api.tooldir.example/v1/tools \
-H 'Content-Type: application/json; charset=utf-8' \
--data-binary @body.json
```…
What is in the file
Always-on block
Where the text is lost
Git Bash: how to send it
Windows PowerShell 5.1: how to send it
Check that it arrived
When it has already been sent
Languages
Any language. Tried in: English.
License
Perpetual, non-exclusive; use and modify for yourself incl. paid work; no resale or republishing. Holder: Georgi Kalchev, aiskills402.com. Full terms.
Versions
Current version 1.0.0, updated 2026-10-25. Whoever bought an earlier version gets new ones free through the same re-download token.
v1.0.0 · 2026-10-25
- First release: an always-on block of six first-person rules for an agent's permanent instructions, plus the measured places where Git for Windows curl and Windows PowerShell 5.1 lose text outside ASCII, the safe way to send a body from each shell, a table that maps what a page shows to what happened on the way, and the steps after a broken submission. - The behaviour was measured on 25 October 2026 on one Windows 11 machine, against a local server that stores the raw request bytes: Git for Windows curl 8.19, the System32 curl 8.21, Windows PowerShell 5.1 and Node 24. - Tested with Claude Sonnet and Claude Haiku on 13 requests that do not mention encoding, one run per model and request, the same checks on both sides. Sonnet: 9 of 13 without the skill, 13 of 13 with it. Haiku: 8 of 13 without, 13 of 13 with. One check was widened after the run for both sides: a .ps1 file written with -Encoding UTF8 is allowed, since a script needs that BOM. - Price $0.05, set by the measured gain for Sonnet (4 more of 13 requests right).
FAQ
Six rules: what do they change in my agent?
Six rules for its permanent instructions. On Windows, text outside ASCII never travels as a command-line argument; it is written to a BOM-less UTF-8 file that the program opens on its own, or into a script. PowerShell 5.1 gets its charset inside -ContentType, writes files without a BOM and keeps typographic quotes in here-strings. The text stays exactly as given, every write is read back, and a broken submission is fixed through an edit route or reported before anything is sent twice.
Why does a request that returns 200 still lose the text?
The damage happens before the request leaves the machine. The curl bundled with Git for Windows converts its arguments to the ANSI code page, so Cyrillic becomes question marks, and dashes, curly quotes and accented letters become single bytes that a UTF-8 server shows as the replacement character. A charset header cannot repair bytes that are already wrong. The curl.exe in System32 sends the same command correctly, which is why a script can work on one PC and break on the next.
Does it help Claude Sonnet?
Yes, when it writes the commands. On 13 requests that never mention encoding, bare Sonnet handled 9 and with the skill all 13. Shown a broken page, it already named the cause, and twice it chose a body file on its own. Asked for a multipart upload, a URL-encoded message and a loop, it put the text on curl's command line, and it left a typographic apostrophe inside a single-quoted PowerShell string. Haiku went from 8 to 13.
Git's curl on Windows turns Cyrillic into question marks while the server still says 200. Alone, Sonnet sent text safely in 9 of 13 tasks and Haiku in 8.
Repairs mojibake, text whose accents, Cyrillic letters, quotes, dashes or emoji turned into strings such as è, ü, “, пр or Р—Рґ because UTF-8 was read as Windows-1252, Latin-1 or Windows-1251, once or twice. Gives back the original text exactly, character for character, by undoing the wrong reading byte by byte, and leaves text that is already correct untouched. When the damage is mixed with good text, mixes two encodings, or lost bytes, so that more than one original is possible, it answers with a fixed CANNOT REPAIR line instead of guessing. Use when text from a file, database, email, web page or export shows garbled characters, or when asked to fix, undo or decode broken encoding, double encoding or strange characters.
Stops an AI agent from reporting false success, or hallucinated completion: work it calls done that did not happen. Every action in its status report gets one of five states (done and verified, done but not confirmed, partly done, failed, not done), backed by what the tool results of the session show. Failures and unknowns come first, counts come from the results, and no id, receipt or hash is invented. When a result does show success, the agent says so plainly. Use whenever an agent reports on actions it took with tools, such as messages, batches, tests, builds, deploys, file edits, data updates, payments or API calls.
Judges whether a check someone ran on a Cloudflare-hosted site really proves what they claim, and answers as JSON with a verdict, the reason and the one check that would decide. Knows the instruments that answer for the wrong thing - the command-line object read that serves a cached copy after a delete, a delivery log that records neither test mail, a zero-row log search that looks the same as code that never ran, a local migration run, a staging secret, the free preview subdomain of a Worker that is not a zone, a size counter that prints zero on Windows, a character count that counts bytes, a robots file served from the edge cache - and the checks that do prove it. Use when an agent says deleted, delivered, applied, enabled, set on production or never ran on Cloudflare work, and you need to know whether its evidence supports that.
Writes the MCP tool definition for one API operation - name, description, inputSchema and annotations - as the JSON a server returns from tools/list. The schema takes exactly the parameters the operation takes - required ones listed, defaults stated, exact enums, integer amounts, date formats, ranges, string and array limits, either-or parameters that refuse a call with both or neither - and refuses unknown ones. Credentials never become parameters, text in the API docs that speaks to the assistant stays out of the description, one tool does one operation, and every tool gets a title and all four annotations as explicit true or false (reads, safe repeats, destructive writes, open world), as the MCP specification of 2025-11-25 and the Claude and ChatGPT directories expect. Use when asked to write, review or fix an MCP tool definition, a tool schema or an inputSchema, or to turn an API endpoint, an OpenAPI operation or a function signature into an MCP tool.
Reviews a plan or shell script that lets several coding agents work in parallel, each in its own git worktree, and lists only the five mistakes that make the agents collide, one line each with a fixed code, the place, why it breaks and the fix - or exactly No findings. It catches one branch checked out in two worktrees or forced onto a second one, two agents started on the same fixed port, an untracked secret file missing in a new worktree or written by two agents, a build folder or database file written by more than one agent, and worktrees that are never removed. It leaves out the safe look-alikes, such as two worktrees on different branches cut from one commit or a shared folder that every agent only reads. Use before launching parallel agents, to audit an orchestration script, or to debug agents that overwrite each other.
Reviews ONE Claude API request (tools, system, messages, the cache marks, the model, the sizes and how often it is sent) for the five reasons its prompt cache does not pay off, and lists only those, one line each with a fixed code, the place, why the cache misses and the fix - or exactly No findings. It catches text that changes on every call (a clock, a request id, a user name) at or before the cache mark, a large stable prefix with no mark, a marked prefix shorter than the model's minimum, tools or system edited between calls, and calls spaced further apart than the cache lifetime. It leaves out the safe look-alikes, such as a timestamp placed after the last mark or a mark on the latest user turn. Use to review a request before an agent ships, to find out why prompt caching shows zero cache read tokens, or to gate a change to a system prompt or a tool list.
Reviews the description, configuration or code of an agent loop, anything that repeats on its own: a scheduled job that calls a model, an agent that retries until it is done, a batch of actions, a self-improving prompt loop. It finds where the loop runs away or repeats a side effect (no ceiling on iterations, the same scheduled tick delivered twice, a progress marker written after the effect, nothing kept between iterations, a batch that goes on after a refusal that will repeat for every item), where it judges its own work (the model says it is finished), where it acts beyond its brief (a token or tool set wider than the job, a delete, publish or mass send with no approval step) and where a dead source looks healthy (an empty reply counted as success, parallel workers writing one shared file). Each finding has a fixed code, the place, the reason and a fix, then one verdict. Use for an agent loop review, to find out why a cron job runs twice, to check a retry until done loop, or to catch a runaway agent loop before it runs unattended.