I have to wonder if everyone else is just running these models raw without any custom instructions. I hear all these things about voice and code comments and those are all things I've dealt with long ago via claude.md instructions, rules, and hooks. My claude can already respond in any "voice" I want and the quantity and quality of comments is within my control.
My claude.md has a section about not writing those comments, it has stored this in memory, and still every session I need to remind my good friend to stop writing so many garbage wordsalad comments
Maybe system prompt has priority or something but Opus just really really likes writing bad comments
That's why I mentioned hooks in particular. That feels like the right layer for this sort of adjustment. A PostToolUse hook on Edit|Write would be much more reliable than just a CLAUDE.md instruction. The consistency I get from CC comes from instructions at multiple layers.
CLAUDE.md heirarchy: At the top level you've got general instructions you want all contexts to follow and each subdirectory can add more specific instructions in their own CLAUDE.md files. References in CLAUDE.md are not fully loaded into the context. They are loaded opportunistically. So keep important instructions in the CLAUDE.md file itself and not a referenced or linked file.
Rules files: These offer path scoped rules via frontmatter. So you could have specific rules for certain types of files Claude Code interacts with. Certain rules for handling all .cs or .js files for example.
Auto-memory: You cannot rely on this one. I use auto-memory as a cache for potential future CLAUDE.md instructions. I have an audit process that kicks off when the auto-memory gets beyond a certain number of entries.
Skills: On demand context. I don't tend to use /skills explicitly. I tend to have them used in context. I've got a task tracking system I call threads. So whenever I say "Create a thread for X" it has always reliably followed the specific instructions. I've got skills for managing my NAS for searching historical session for sharing content and other things. I use them a lot of times in place of MCP servers.
Hooks: Deterministic scripts run on lifecycle events. I've got hooks that run linters on code files post edit and hooks which tie into the request / response events to push my history into a SQLite database.
Output Styles: CC ships with a few different styles, but you can create your own. This is key for changing the default voice. CLAUDE.md instructions are appended to the system prompt and can fight against the system prompt. A custom Output Style would let you replace the instructions in the system prompt with your own instructions. This can be done at the user level or per project.
Currently, I'm using custom instructions plus reinjecting the writing cues Opus 5 ignores most frequently via a UserPromptSubmit hook. Again and again, I'm reminding the model what voice I want. Again and again, Opus 5 ignores it.
it really just seems like people pump out that its on the end-user, and i just disagree. They have a walled garden around claude code and using their models within it, it should work instantly out of the box when going from an opus 4.8 to an opus 5.0 with the same workflows. it doesn't.
claude.md for all my projects are fairly tight, its seldom where im upset at anything a model does, and if it happens, its likely because i swapped provider and didn't realize i was failing to feed it proper context beforehand.
Opus 5.0 fails in different ways that I haven't had to deal with. Its insufferable with its choice of language, something I've never had to compensate for on any other model across any provider, so of course I have no preexisting rules for that, it also is sometimes just incredibly stubborn and just WONT finish, and requires several just "keep going" prompts.
This is much different than the issues people would make fun of users for in regards to treating models like slot machines and just pulling the lever over and over, this is more its stopping for no reason short of its task, and literally just needs to be told to continue? absurd.
Most of my workflows have reference material, with standards set, why opus 5.0 is the only model that fails to follow those standards and inserts wildly long weird code comments is not a failure on the end-user, thats the model failing. I can be MORE explicit of course, but i shouldnt need to be, this is supposed to be 5.0, its a downgrade. I went back to 4.8 and all these issues vanished.
Opus 5 is remarkably bad at instruction following over long chats. I have to repeat “Be succint”, “talk like a friend or colleague would”, “no rambling” or some variant of it every few messages
Have you tried a custom output style? CLAUDE.md instructions are appended to the system prompt. A custom output style can replace the system prompt. At least the part of it pertaining to voice and persona. The reason it forgets over long chats is the context size starts getting too large. Instructions weigh more strongly the later they appear in the context. This is necessarily true otherwise you couldn't change your mind in a conversation. The model would stick with what you originally said. For the output styles, there is a per-turn "reminder" that gets added to the context asking it to "remember" the content in the system prompt. That's why it has more staying power than the CLAUDE.md instructions in long conversations.