Over the last two months, more and more people are starting to complain about the complete illegibility of Claude’s output. And I don’t think people realize that the problem isn’t really verbosity in itself, or the usage of “big words”, or trying too hard to condense things, or even the usage of jargon. I think the problem is that Claude just outputs pure nonsense in 70% of its writing, especially as context goes over around 200k. I think people don’t realize that Opus and Fable’s verbosity is intentional. Rather than having real intellect, these models “fake it” by being steered into semantically dense spaces, such that the probability of having intelligent insights is higher. This is because in its training data, those intelligent insights are likelier to be found in semantically dense texts. In order to score highly on benchmarks, these labs need to steer these models to prefer semantically dense output, because it is most probably intelligent output. But people don’t realize that these models do not fundamentally reason like a human does. And so when you try reading its output carefully, you find a lot of semantic nonsense. LLMs use turns of phrases often found in intelligent (or, frankly, high-brow) speech or writing, and they use them when the preceding context seem to support usage of that turn of phrase. But they do not actually use them when the semantic content of that phrase is logically consistent with the preceding context. When model outputs appear logically consistent, that is almost always because human-generated data is so vast that it provides these models the ability to be logically consistent most of the time by merely mimicking humans. The lack of innate intelligence therefore produces phrases like “nestled amid a year of war.” Which seems fine at first glance, but when you really think about its semantic content, you realize it does not make any sense at all. What does it mean to “nestle” amid “a year of war” ? Or consider another example of LLM output: “two overarching pillars that undergird the entire…” How can pillars “undergird” (be below […]) while also being “overarching” (be above […])? You may think those examples don’t matter much, since they’re just similes or metaphors, used for prose where the logical content isn’t that important. Sure. The problem is coding. When you describe to Claude the architecture you want your codebase to follow, it becomes difficult to parse what Claude has done exactly and what you want it to do, when it returns that same pseudo-intelligent semantic nonsense back at you. Here is an example I’ve dealt with recently: The phases re-cut honestly. Claude used this phrase when it described to me how it’s going to break down the implementation phases differently. But that phrase in itself makes zero sense, even in-context (you can read the context at the end of the post). What does “re-cut” mean? What does “honestly” even mean? How do you “re-cut” something “honestly”? Well, “honestly” here means “commit will actually compile”. But how are you supposed to deduce that from “honestly”? A normal human would tell you “I’m going to merge phase C into phase B because otherwise the phase B commit would not compile.” Claude isn’t even saving context by writing that since it then literally said it’s going to merge two phases later on. […] a lane press refused by a blocker stays a no-strike skip Claude also loves packing everything into semantically dense clauses, but it condenses phrases in such a way that the semantic content becomes so compressed that it could mean multiple things. Semantic ambiguity is another big reason why it is difficult to work with Claude. Here, “a lane press” could mean multiple things, because in my codebase a “lane” (which I never used to refer to a child operation, it just used that word by itself instead of using “child operation”) could either press a button through CLI as part of its operation job, or press an arbitrary key in general. Claude does not disambiguate what kind of press it is talking about. It also does not tell me what “refused by a blocker” means. There are multiple paths to the press being rejected in the codebase. It could be at the start when the operation fails to meet its predicate. It could be while it’s trying to press, and it catches an error from the low-level adapter interfacing with the OS. It could be if the press is intercepted by a forced cancellation that tells all operations to stop their actions immediately and refuses to spawn new sub-operations. I have no idea who is the “blocker” (I never used the word “blocker” in the code) or what is being refused (which is annoying, because I have already specifically defined in the code things like “predicate_check”, “cancellationtoken” for various types of refusals etc.). It could have told me “if the predicate check fails”. Instead it says “refused by a blocker”, inventing its own jargon out of thin air, creating pointless ambiguity. Anyways: If you’re struggling trying to comprehend what Claude is saying, particularly when coding, it is probably not because you’re too stupid for it. It’s because Claude is outputting nonsense . Or to put it more charitably, it does not know how to communicate in a way that conveys the semantic content of what it wants to do, what it has found, or what it has implemented in a precise way. Therefore, when you actually sit down and try to read through it, you have to exert significant cognitive effort, because they’re either extraneous (it does not know how to get to the point), or because they’re semantically nonsense or ambiguous (you have to actually backward-deduce what it has probably done or found based on the ambiguous things it has said). More importantly, as I’ve said before, this is baked into the model . Rather than having real intellect, these models “fake it” by being steered into semantically dense spaces, such that the probability of having intelligent insights is higher. This is because in its training data, those intelligent insights are likelier to be found in semantically dense texts. In order to score highly on benchmarks, these labs need to steer these models to prefer semantically dense output, because it is most probably intelligent output. As a result: No amount of output styling, claude.md’s, per-turn hooks, per-turn reminders, or plugins like Caveman can solve this problem at the root. I have thus stopped Claude from communicating with me altogether. I’ve only done it for one day so far, but it’s been a massive improvement. I simply told it to stop talking to me, and every time it wants to report its findings or tell me the implementation status of something, to give everything to a different model (right now Grok 4.5), let that model try parsing what it means and re-write whatever it wanted to tell me from scratch, then I’ll read the rewritten output directly. Obviously that model should get access to the repo and docs as well, or you’ll get actual nonsense. You could probably try it with Opus 4.6 or ChatGPT Luna as well. I seriously think this is a massive improvement for me. Give it a shot if you have the money to spare, because this is a net token increase. There are some things I did to make it work better: Use pi. This minimizes the starting context usage and more importantly removes system prompt junk. The rewriter solely focuses on rewriting without all that ambient junk in its context. Actually write the skill yourself, with HUMAN-WRITTEN examples from yourself. The more you let LLMs write their own context, the more context rot sets in. Full context: “The remaining new findings I’ll apply as mechanical fixes with no ruling needed: the registry gains typed atom-class metadata with a total startup-validated classification (…); the menu-drive builder tags its waits so the “window never advances” and dialog-answer cases land in the halt column of a now-complete severity table; the phases re-cut honestly (the vocabulary and framework changes cannot build independently, so they merge into one slice); the slow-stop wording defers to the standing law for an unstuck act past its press; the menu retry states its 500ms backoff; a lane press refused by a blocker stays a no-strike skip; the alarm service’s private lock-drain dies once the checked press protects it; and the permanent concurrency doc plus the three stale “lock means retry” comments join the manifest.” submitted by /u/DarkSkyKnight
Originally posted by u/DarkSkyKnight on r/ClaudeCode
