Such a silly choice of words. I wish the human directing the LLM writing the article put some effort into rewriting the worst examples of LLM style.
> But it did extremely well, and the promise was immediate and specific: builds finishing in less than half the wall-clock time, at 27% lower cost, scoring at or above our incumbent on completed work.
The way the LLMs write (Claude perhaps?) With short phrases separated by colons, commas or full stops, is so poor and frustrating.
There some good insights behind this article, so it's worth reading, for example below, but it isn't easy to read.
> Earlier GPT models cached implicitly on partial prefix matches, which gave decent hit rates for free. GPT-5.6 dropped partial-prefix matching:
Well, unlike OP I haven't run a rigorous test, but I still would expect Fable to be significantly better at building marketing websites than Opus. It sure is way better at building decks.
I admit, I've only used a bastardized form of MCP, but this smells... wrong? It's not clear to me why the Typescript type definitions would have any influence on (what I presume is) JSONSchema being sent from the agent to the inference backend as part of the completion request. The MCP specification (which the OpenAI backend might not use, I don't know) has an explicit field to signify "optional" parameters in the JSONSchema; my read on this is there's a bug somewhere between the Typescript layer(??) and the generated tool description which is actually sent to the inference backend.
It's possible the inference backend has changed from "generate valid tool responses" to "generate valid tool responses according to the JSON schema [where no parameters are optional]" but it's impossible to tell without seeing the actual requests sent to the inference backend (which I didn't see in TFA).
As of today, Ploy’s agent runs on GPT-5.6 Sol, the flagship tier of the model family OpenAI released this morning.
Wait a moment, did they make the switch based on half a days of playing with Sol? Are these companies ran by teenagers?I think a lot of people miss that for many companies, a model upgrade like this is basically a one liner.
Even if you have an amazing model router architecture (which we do for our golden flows), it’s just not worth it. Not to mention reliability and so on
I would consider Luna for parts of the workload that touch actual tools. It is surprisingly capable and it runs fast.
Sol is great at talking to the human and orchestration of agent calls, but it's just too expensive to use everywhere.
You can get 5 Luna runs for the cost of 1 Sol run. Statistically speaking, going from one to five samples is a pretty big deal.
Chances are whatever was needed to make earlier models perform well now either is no longer helping much or actively hurts performance (worse results, slower, uses more tokens …).
It makes me feel like either
1) you don't use the models enough to know how they write
2) you're not self aware enough to know it matters
3) you're oblivious to the situation overall
4) you don't respect your readers
There's no good scenario.
Because GPT 5.6 Sol, while fast and pleasant to use, is essentially the same model as 5.5 wrapped in new marketing packaging, just to avoid losing ground to Anthropic. In practice, it's the same quality: it generates the same garbage, tons of code, and can never solve even a single complex task. We simply don't trust it to write code for clients that they'll end up throwing away anyway.
"Then why not Opus 4.8?" you might ask.
Well, because Opus 4.8 and 4.7 are just another lie, a price hike with no actual quality improvement.
That's why at Playcode, we give our clients the best possible quality/price - which is Opus 4.6. Regardless of what people write in articles like this.
Although tbh the article makes a lot of this obvious and trivial change in syntax.
I saw people bulding a mapping of model->{{prompts}, {tools descriptions}, ...}, but that, to me, it feels extreme. I believe it is the model that needs to adapt to your prompts after a certain point. Models that fail to do so won't get our api requests as they will be out of the failoever roster.
This way I can at least somewhat control the style of the output.
Hand wavy list just to get a general idea...
1) Give me a condensed summary 2) Is this adding anything to what we already have? (I save good articles along with annotations and whatever notes I may write to go along with it.) 3) Locate any upstream ideas on this (often AI articles are rehashing much better written ideas.) ...
Something like that. Not that I have some great system for it. I find these articles are so full of fluff that I have lost patience to attempt to get through them. So, I pull out the AI to parse the AI. I know that the AI may miss some hidden gems, but I'm okay with that.
For example, see this post for Claude models hallucinating properties for an edit/replace tool call in Pi: https://lucumr.pocoo.org/about/
I suspect some part of this comes from the noticed intelligence degradation when you do constrained decoding. Yes, you’re guaranteed schema validation, but you lose a lot of intelligence. It’s fine if you just want a classifier, a summary, a prompt enhancement, etc; but I’d be careful in agentic loops.
Harnesses like Claude Code do a lot of preprocessing, repairing, cleaning, etc; as the blog post shows. You usually don’t see it.
In practice it’s easier and better to just make your harness “looser” and work better with the model (they’re coming out every month or two anyway, each with their own idiosyncrasies) than to assume and force perfect correctness.
Welcome to vibe applied AI ;)
Another reason is that they mean what they say... That they really, really hate the style of writing, enough to fixate on that.
Personally, I think the people whining about the style are silly. Maybe because I'm terrible at grammar and spelling, but I always just focus on the message, not the delivery. I just care about the concept, facts, the argument, and so forth. The actual grammar and spelling are just trees, while the forest is the point.
Edit: just an infobit: The reason my text isn't full of errors is due to the awesomeness of the dictation and a custom hotkey I have created on my computer, which uses a local LLM to spellcheck any text I have selected and replaces it with the corrected one. Nothing has improved my quality of life and writing more than these two tools!
This is exactly why I keep a WRITING.md file alongside AGENTS.md or CLAUDE.md.
Most people spend time telling the model what to build, but very little time telling it how to write. LLMs are surprisingly good at following explicit style guidance if you bother to give it to them.
Mine includes conventions like avoiding unnecessary colons, em dashes, and sentence fragments masquerading as emphasis. Basically, AI-isms and any grammatical errors I tend to make. It also points to writers whose technical prose I admire. Brian Kernighan and Rob Pike are great examples: clear, conversational, and readable without trying to sound important. I've always tried to do two things with documentation: 1) Make it readable and 2) Make people want to read it. A WRITING.md file helps with both points.
If you're generating documentation regularly, it's worth having your agents reference a WRITING.md file. The improvement in readability is often much larger than any gain you'll get from switching to the latest model, and it can keep your documentation consistent between model switches.
Example: for large Eloqua/Marketo/HubSpot emails we would previously make a planner which delegated the sections to their own call.
GPT5.6 can do the whole thing. The planner is unhelpful.
My suggestion: feature flag your complex implementations so you can rapidly contrast with and without it. (Or a formal eval suite if you have one).
If you prefer the simpler path, delete the old path.
Note: the challenge is making things compatible with these tools. Obviously generating html directly has been simple for ages.
(Source: mopsy.ai)
They do work pretty much as advertised. The bulk of our workload is now going via terra, which has cut our cost in half by itself, as well as improved response times by 50% - luna I am using as a backstop for opencv hits, and it is good enough, and so cheap as to almost be free - but very limited - and very fast. Sol only gave marginal improvements over terra for our workload.
I’ve also gotta say I’m impressed as to how well Sol ultra carried out the assessment itself - it made sound recommendations, and gave me a nice big dossier of “you should look at these outputs yourself and compare and consider” along with raw and digested data, and cpm for queries.
Anyway. Spent nothing beyond my pro sub, let Sol gnaw on it for a few hours, and my cost basis just dropped 50% and throughput improved by 100%. Win.
LLMs are so easy to swap out, so having good benchmarks/evals are pretty useful.
Even then, a lot of the time the model improvements are so obvious that you don't even need an eval.
Why would I not just use Codex directly?
The we wrote a bunch of prompts argument is kind of meh. That sort of thing has not only diminishing value with subsequent model releases but I actually believe will turn negative. The model will know better by default.
For example, initially giving the model some advice on code best practice was helpful. But now it's unhelpful because the model already knows best.
It is simply the best model in the world out of everything we have ever tried. It's absolutely fantastic. It solves almost any task from start to finish, the way it should be done — no errors, perfect code. It's a miracle.
If there's any way to make it a little more affordable, that would be incredible.
As for GPT-5.6 Sol — it doesn't even come close. I honestly don't understand why people even try to compare them. It feels like Sam's attempt to hold onto his audience with those endless daily limit resets. A clever trick, nothing more.
We have been testing GPT 5.6 for about a week as a preview model through a YC relationship, providing them feedback on the model. Our evals run in github CI and we can run them all in about 15 minutes against our eval bench of 115+ web design and marketing related jobs that ploy.ai specializes in.
then after we toggled it on (through a posthog feature flag) we actively monitored for failures.
I came from running Webflow, which powers > 1% of the internet so trying my best to relay all of that knowledge to ploy to power more % of the internet!
So depending on how heavily agents are used on what tasks, it's entirely possible that you get worse work for more cost.
Pointing out they generated it at least encourages them to write a shorter article that says what they meant.
This is a feature if your goal is to obtain many samples. Independence is critical. This makes it easier to accurately model the uncertainty of a decision.
If the planner sees that 4/5 Luna runs resulted in approximately the same summary, it may conclude that variance is low and that it is over the target. If all Luna runs are different, the planner can conclude that additional research rounds are required.
I disagree with the person below - I don't think its a wrongheaded goal in and of itself to get better ai generated writing. I read ai output half of my day, I may as well try and make it better for my own sake. Passing that onto other people is an entirely unrelated field of problems, and passing it off as stuff you authored yourself is just plagarism.
I've found the same thing showing with Claude-coded/designed front ends that overuse the same semi-monospaced fonts, Blue/Yellow/Red palette and rounded corner borders. It isn't that it is bad, but it often isn't fit for purpose.
You're right it wont change anything, but authors shouldn't be surprised when people who care about their time/attention comment on low/no effort pieces.
Which is a shame as real insights are buried inside some of these articles, which if the author bothered to write in his own words could have reached an audience that would have appreciated them.
Writing is one of the areas where I want no LLM involvement.
Only so much time in the day, its a quick signal to not waste anymore of it.
The funny thing is - when I first saw ploy, I didn't take it very seriously since so many of the signals that used to signify quality (decent design, copy, hard technical problems) are easy to fake. Plus the "grow while you sleep" space is crowded with weak players.
I wonder what the new markers of quality will be, which would separate the hand-crafted (to the extent possible) work v/s slop.
It has everything to do with the article.
> As for GPT-5.6 Sol — it doesn't even come close. I honestly don't understand why people even try to compare them.
What kind of problems are you working on? I like Fable but when planning work on a complex C codebase it's making more mistakes than 5.6 Sol xhigh for me.
In what scenarios is Fable giving you "no errors, perfect code"?
I'm not trying to hide the problem, just offering a solution that people may find useful, or curiously odd.
https://f.mek.cc/gombasic/file?name=WRITING.md&ci=tip
And in many cases, like you, I spend a good amount of time reading AI documentation. I'm not "stealing" anything, just having a model generate words in a specific way. I'm just being precious in how I want things, without having to do it myself.
The number of things that make it to the top of HN/Reddit/wherever now that are devoid a human's touch is exhausting. Whether it's a site that's got that Claude frontend smell, or a repo that's got a burst of 10 claude commits before getting shared and abandoned, or a series of blog posts that were written by LLMs... it's all, at this point, a flag for me that the human behind the LLM doesn't really want to engage with others or share; in some ways it dehumanises their entire (supposed) audience.
IDK. Maybe having Claude contribute writing about something novel to the general blogosphere is useful in some dimension, but it usually gives me no confidence in the truth of the post.
If an article has interesting content (which comes from an human) and the LLM is just used to help the author finish off the article, I don't have any problem with that.
Labeling both scenarios in the same category feels completely wrong to it, as equating vibe coded stuff (as in no human ever read the produced code) and agent-assisted good old software engineering
What do you think that is referring to?
Funnily enough, we spent a long time on our brand. From our launch video that has human actors, to our product details. I believe a distinctive, high quality, well implemented brand is still a hallmark of a strong product or service.
Neither are mentioned in the article at all, which was about a migration from Claude Opus to GPT 5.6.
Maybe a bit of DeepSeek astroturfing going on?
When an issue arises, I often test the systems by providing a minimal prompt, like: "this user, this is their email, this isn't working, figure it out in production." I send this to both Opus and ChatGPT, but it doesn't help. I've set up Agents.md and Quote.md identically, with the same access and linkers, so the Harness is consistent.
ChatGPT rarely succeeds. If the task is complex and requires a multi-step process to identify the true cause, ChatGPT usually stops after a few initial ideas and wrongly claims it has found the solution.
- For simple tasks, like identifying a missing item in a to-do list, ChatGPT performs well. - However, for issues like memory leaks or file system corruption, it struggles.
On the other hand, Opus 4.8 always finds the solution, albeit slowly. I can rely on it without worrying about whether it will succeed. It just gets the job done.
Recently, Fable 5 has emerged, which resolves issues without needing any prompts. It operates even faster than Opus.
When I ask ChatGPT or Opus to create a new feature: - ChatGPT often produces superficial results, ignoring existing code and building unnecessary independent code. - Interestingly, the outcome from ChatGPT appears functional, but it's usually incorrect, focusing on a superficial "aha!" moment.
Opus, however, plans thoroughly, executes, and cleans up, ensuring everything works correctly. If needed, I can provide more realistic examples, though it's challenging due to the monorepo's size and complexity, with hundreds of thousands of lines of code.
I also think that people should focus on substance and not if AI was used, but AI writes like shit and I find myself retching a bit when I have to read long AI-written documents. Do they say something useful? Maybe, but when my eyes are glazing over because it's just so exhausting trying to parse what's written, I can't tell.
I certainly think less of people when they have such poor taste that they think writing like that is acceptable.
Slop is slop. When the “it works but isn’t great” phrases end up slipping into a strong conceptual core, it compromises the perception of the ideas.
Perhaps our AI will cater to us by rewriting the content we read, and each of us intermediate all communication with systems that make that slop bearable.
Or perhaps, we learn that we kinda still need to give a shit when writing to land on the perception we’re trying to create within our readers

As of today, Ploy’s agent runs on GPT-5.6 Sol, the flagship tier of the model family OpenAI released this morning. For months, no model met our bar for replacing Claude Opus. GPT-5.6 Sol did. After a head-to-head evaluation, we made it the default model for every Ploy workspace.
Ploy’s agent builds and edits production marketing websites. It plans a page, reads the codebase, writes components, generates imagery, screenshots its own work, and decides when it is done. We test every frontier release against that workload. During the four months Opus held the default slot (first Opus 4.7, then 4.8), nothing we tested beat it. GPT-5.6 is the first model that did.
The first eval run exposed several failure modes, which we cover below. It also produced strong results. Completed builds took less than half the wall-clock time, cost 27% less, and scored at or above our incumbent. Those results justified the migration work.
We use Vercel’s AI SDK, but switching from Claude Opus 4.8 to GPT-5.6 Sol still exposed provider-specific assumptions throughout our stack. The providers differ in how models fill tool arguments, cache prompts, and replay reasoning between turns.
We fixed the eval harness first, followed by the tool schemas, prompt caching, and reasoning replay.
Our eval suite runs the production agent against fixture workspaces. It covers hundreds of cases, from “build a homepage from scratch” to “is this clone request safe to execute.” For build cases, a visual judge runs ten binary checks against a reference design, such as “the hero is a full-bleed photographic scene” and “primary CTAs are rounded rectangles, not pills.” We also run content checks, tool-trajectory checks, and file assertions. We triage every failure against the full trace, including the tool calls and model text.
The first cross-model run exposed a problem in the eval harness.
Our tool-call budgets were sized for Opus’s sequential style. GPT-5.6 makes parallel calls and exceeded those budgets on cases it was solving correctly. Our eval executor also lacked support for batched file reads, which Opus rarely used and GPT-5.6 uses often. Roughly a third of the raw failures in the first run came from harness assumptions rather than model behavior, and those failures were unevenly distributed. If you are evaluating a challenger against an incumbent, triage the traces before trusting the pass rate. Otherwise, the eval rewards the new model for behaving like the old one.
A dataset that omitted its minScore threshold inherited a default of 1.0, and nothing flagged the fallback. GPT-5.6 therefore “failed” a hero that scored 0.98, while Opus “failed” a case despite passing every individual check. Both designs were defensible, but the implicit threshold failed them.

After fixing the harness, we reran our redesign suite, where the agent rebuilds a brand’s homepage against a reference design.
| Mean per completed build | Claude Opus 4.8 (n=11) | GPT-5.6 (n=10) |
|---|---|---|
| Cost | $3.06 | $2.22 |
| Wall-clock time | 8m 00s | 3m 42s |
| Input tokens | 2.60M | 1.70M |
| Output tokens | 33.0K | 17.1K |
| Visual score | 0.936 | 0.970 |
GPT-5.6 finished pages 2.2× faster, cost 27% less, and used about half the output tokens. It also wrote less code. In one matched pair, Opus produced a 17,957-character globals.css with 174 CSS variables, including mostly unused color ramps. GPT-5.6 used 2,508 characters and 45 variables for a comparable, and sometimes better, rendered page.
GPT-5.6 is good at clean, tightly gridded layouts, but it tends to converge on that style without strong steering. With our older harness, which was designed for Opus 4.8, GPT-5.6 Sol often ignored the existing design system and produced clean but generic output.

The changes we made here deserve a separate post. Our design and engineering teams improved the steering until GPT-5.6 met the brand-adherence bar we require in production.
Our agent’s code tool has 25 top-level parameters. One, action, is required; the rest are optional. Claude sends the two or three parameters it uses and omits the rest. GPT-5.6 sends all 25 on every call, filling unused parameters with plausible values such as offset: 0, timeout: 120000, and siteId: "00000000-0000-0000-0000-000000000000".
We saw the pattern across three days of production code(read) traces.
| Model | Calls | Carrying all 25 properties |
|---|---|---|
| gpt-5.6 | 6,635 | 6,635 (100%) |
| claude-opus-4.8 | 2,898 | 4 (0.1%) |
| claude-sonnet-5 | 1,933 | 0 |
Verbosity was not the problem. The file-read implementation could not distinguish an invented value from an intended one. It treated offset: 0 as a real argument, causing 52% to 64% of GPT-5.6’s file reads to return empty. The tool returned success: true for both valid and empty reads, so the model could not tell that it was reading blank files. It compensated with more calls and worse results.
Prompting did not fix this. A tool-description directive to “omit unused parameters” still produced 25 of 25 parameters. Per-property “OPTIONAL, omit if unused” hints did the same. We measured identical behavior with OpenAI’s strict mode, and adopting it would have required stripping pattern, format, and array-bound validation from every schema. This behavior comes from how the model emits function calls, so we changed the schema instead.
The working fix was a schema transform at the provider boundary. For OpenAI-family models, we rewrite every optional property as required but nullable using anyOf: [T, null]. This gives the model an explicit value for an unused parameter. We then strip the nulls before validation at the shared tool-invocation boundary, so the tool implementations do not change. The model sees a schema that represents unused values, while the tools receive the same inputs as before.
// Before: 25 keys, every one carrying an invented value
{ "action": "read", "file_paths": [...], "offset": 0, "timeout": 120000, ... }
// After: 25 keys, 4 real values, 21 explicit nulls (stripped before the tool runs)
{ "action": "read", "file_paths": [...], "offset": null, "timeout": null, ... }
After the change, empty file reads fell from 52% to 0%. The agent also used roughly 30% fewer tool calls for the same work because it stopped re-reading blank results.
Both providers offer “prompt caching,” but the implementations differ. Before we accounted for those differences, GPT-5.6 appeared about 50% more expensive than Opus. Our cache configuration caused the gap. The model pricing was fine.
Our agent’s prompt opens with a static prefix of roughly 29K tokens (tool schemas plus the core system prompt) that is identical for every conversation. On Claude, we mark cache breakpoints with cache_control, and the prefix caches across the whole organization. Any conversation in any workspace can use one shared entry, without a per-key throughput budget. Cache hit rates run from 92% to 96%.
GPT-5.6 uses a different OpenAI caching model. Earlier GPT models cached implicit partial-prefix matches. GPT-5.6 dropped partial-prefix matching, so implicit caching now creates whole-prompt entries keyed on the latest message. A new conversation sharing our 29K static prefix cached 0% of it. Each conversation re-billed the full prefix at the uncached rate. GPT-5.6 also applies a 1.25× cache-write surcharge to every uncached prompt, whether or not the application uses caching.
The explicit mechanism uses prompt_cache_breakpoint markers and a mandatory prompt_cache_key. The key is part of the cache identity, so identical prompts with different keys produce no cache hits. Each key maps to a cache node that sustains roughly 15 requests per minute before OpenAI distributes traffic to other nodes with independent cold caches.
The main design decision is which entity should scope the key.
We ship the workspace-scoped key and split the system prompt into breakpointed layers, mirroring the structure we already used for Anthropic:
request ──► hash(prompt head + prompt_cache_key) ──► cache node (~15 req/min per key)
│
┌──────────────────────────────────────────────────────┴───────────────┐
│ entries on the node, all namespaced by key ws:{workspaceId} │
│ │
│ [ tools + static prefix ]······················ A every session │
│ [ tools + static prefix + workspace context ]·· B same context │
│ [ ····················· + turn 1 + … + latest ] C this session │
└──────────────────────────────────────────────────────────────────────┘
Entry A reduces the cost of a session’s first call. When workspace memory changes, the request misses Entry B but still hits Entry A, then writes a new Entry B. That requires one context-sized write instead of re-billing the full 29K prefix. Entry C is OpenAI’s implicit whole-prompt chain, which works within a session because our prompts are strictly append-only.
OpenAI’s key partitioning prevents cross-workspace sharing of the static prefix. Anthropic can share the prefix because its cache is organization-scoped without key partitioning. On GPT-5.6, every workspace pays for one 29K cold write per idle window, about $0.18. The cost is bounded and predictable.
After the change, first-call cache hits rose from roughly 0% to 83.7%, total uncached input tokens fell 28%, and GPT-5.6’s per-suite cost dropped below Opus’s. Cache misconfiguration accounted for the entire cost gap we had measured. Cost comparisons between models are not useful when one model starts with a cold cache.
Reasoning replay caused intermittent failures in production conversations. GPT-5.6’s Responses API replays prior-turn reasoning as server-side item references by default, and our conversations sometimes failed with Item 'rs_...' not found. Setting store: false makes the SDK request encrypted reasoning content and replay self-contained blobs instead of pointers to server state. We also learned that server-side reasoning state can change the effective prompt even when the bytes sent by the application are append-only.
GPT-5.6 launched today and is already live on Ploy. You can start free at ploy.ai, give it a website to build, and see what a sub-four-minute build looks like.
Ploy is an AI layer that plans, builds, publishes, and optimizes websites and campaigns. If debugging cache-node fan-out at 2am sounds like fun, we’re hiring.