Claude Code First, specification version 0.1.0. The plain-language guide
Version 0.1.0. Grade R3/S2.
F405 An encoding defect was first blamed on the wrong component, and relocating it reversed the fix already chosen
| Field | Value |
|---|---|
| Status | active |
| Topic | Environment, permissions, and agent-facing products |
| Grade | R3/S2 |
| Cases | polyweave, Shio |
| Contrary | none |
| Harness facts | none |
Claim
When text came out corrupted, the first diagnosis placed the fault in the component that showed the damage, and the real fault was at another boundary (the reader's decode, or the agent's own tooling); within hours the diagnosis was withdrawn and the fix or filing built on it was reverted.
Mechanism
Corrupted characters are seen where they are displayed, not where the bytes changed, and a terminal renders both correct and damaged bytes through its own decode. A diagnosis that reasons from what is displayed, or that measures the product's path but not the agent's own read and write path, lands on the wrong component. What moved the diagnosis in both cases was checking the bytes at each hop.
Observations
- polyweave. On 2026-09-23 PW71 shipped at 12:41 [polyweave@898d788] with an ASCII
substitute for an em dash. At 13:08 PW73 withdrew its premise: "The first reading was that cp1252 cannot hold an em dash" [polyweave@f203b0a], but every such character encodes to cp1252 and "What reads the pipe decodes UTF-8" [polyweave@f203b0a]. The lint over the strings that the design had leant towards "would have enforced the wrong thing" [polyweave@f203b0a], and "The ASCII semicolon PW71 put in that sentence an hour ago is reverted" [polyweave@f203b0a]. The roadmap line kept its symptom because "the premise was false, not the observation" [polyweave@f203b0a].
- shio. On 2026-08-06 at 10:20 a defect was filed against the product,
"the CLI corrupts non-ASCII content on the way in (SH519)" [shio@08eeb9290], placed by "Four measurements" [shio@08eeb9290] of bytes along the CLI's path. At 14:26 it was retired: "the mojibake was mine, not the CLI's" [shio@c17ed995a], because the agent's own patching used subprocess.run(text=True), which "decodes with the locale encoding, cp1252 here" [shio@c17ed995a]. The skill gained the rule to "judge encoding on bytes with od -c rather than on what a terminal prints" [shio@c17ed995a], and the commit states the cost: "A filed defect that does not exist costs whoever picks it up more than the bug would have" [shio@c17ed995a].
Independence
Two independent origins: separate incidents in separate projects, a month apart, with different components and different wrong first readings. Neither cites the other.
Counter-evidence
None found at the pins. Both cases were caught within hours by the session that made them, so the cost recorded is small: one reverted sentence and one retired filing. Shio's first diagnosis rested on measured bytes, not only on a display, so measuring is not by itself the remedy; what it missed was the agent's own tool in the path.
Grade
R3: two independent origins in two projects. S2: each is a dated commit that records the wrong reading and its withdrawal. Nothing counted how often this happens, and no check encodes it.