Verified 2026-08-05
Stability · 9 rules

What can change without any version bump?

A large amount of Cowork's behaviour is served from the operator's side rather than shipped in the application, which means it can change with no new version, no release note, and no signal to your skill. Tool availability, prompt guidance, and some defaults are all in this category, and at least one of them has been observed changing mid-session. Write skills that detect capabilities at the moment of use and degrade in a stated way, rather than skills that assume a surface.

Detect capabilities at the moment you use them, and state a clear fallback when they are missing.

SILENTMeasured

This is the one defensive pattern that survives every kind of change described here. A skill that checks for the tool it needs, uses it if present, and says plainly what it could not do otherwise will keep working across sandbox changes, served-configuration flips, and version bumps. A skill that assumes a surface breaks silently on all three.

Do not assume configuration is fixed for the lifetime of a session.

At least some served configuration is subscribed to rather than read once, so it can change while a session is running and the application reacts. A skill that reads a capability at the start of a long task and caches the answer can be wrong by the end of it.

Never write a skill that depends on the exact wording of the system prompt.

The instructions a Cowork session runs with can be patched from the operator's side, including a mode that replaces the computed instructions wholesale rather than adding to them. So a model of the session prompt as 'the standard preset plus my additions' can be wrong at any time, with no local artifact changing. Depend on behaviour you can observe, not on text you expect to be present.

Caveat: The replace mode is the one that matters: it discards the computed instructions rather than appending to them.

Do not treat 'the version has not changed' as evidence that behaviour has not changed.

SILENTMeasured

Behaviour governed from the operator's side changes with no new version, no release note, and nothing observable locally. This has been directly observed: a capability that was off in one week's capture was on in the next, with no application update in between.

Assume tool availability and defaults are served to the session, not shipped in the application.

SILENTMeasured

A meaningful part of what a session offers is decided on the operator's side at spawn time. Two sessions on the same application version can therefore present different tools and different defaults. Nothing about the installed version tells you what a given session will look like.

Write down which behaviours your skill depends on, in the skill itself.

FRICTIONInference

When something changes underneath you, the cost of diagnosis is dominated by not knowing what was assumed. A short stated list of dependencies — this needs a delivery tool, this needs shell access, this assumes files persist within the turn — turns a silent failure into an obvious one.

Caveat: Editorial guidance drawn from the failure modes on this site rather than a measurement.

Do not hardcode a tool name your skill merely hopes is present.

Tool surfaces have changed across releases: names differ between runtimes, tools have been added and withdrawn, and which ones a session gets is decided when it starts. Name a tool only after checking it exists, and say what you will do if it does not.

Your skill's own text can be shortened, or dropped entirely, part-way through a session — put what must survive near the top.

SILENTMeasured

When a long conversation is compacted, previously-invoked skills are re-attached from a stored copy rather than re-read from disk, and that copy is subject to two separate limits. The first shortens an over-long skill, keeping roughly the first twenty thousand characters and discarding the tail — and the shortened version replaces the stored copy, so a later compaction cannot bring the rest back. The second is a shared budget across every skill invoked in the session: once it is exhausted, a skill that does not fit is not shortened but emptied, and stays gone for the rest of that session. Skills are packed most-recently-used first and counted at their already-shortened size, so the one that disappears is usually not the largest — it is whichever was used least recently when the budget ran out. Only the first of the two announces itself. When your skill is shortened, a marker is appended to what the model reads, saying in so many words that the text was cut and can be re-read from its path — so a skill can be written to notice that and try to recover. When a skill is emptied by the shared budget it is simply not there that turn: no marker, no entry, nothing to compare against. So a recovery instruction is worth writing, and is worth writing as covering the case it can actually detect rather than as covering both. Nothing errors, and the file on disk is untouched — but treat that recovery as best-effort rather than a guarantee. The location offered to the reader is the one captured when the skill was first invoked, not one resolved fresh at the moment it is read, and where a skill's files are staged is decided by the surface rather than by you. Within a running session it resolves. The case to design against is a session resumed later, where a location captured earlier may no longer describe where that skill now lives — and it would fail by pointing somewhere that is not there rather than by saying so. Two practical consequences: put load-bearing instructions early and push detail into reference files, which are read on demand and are genuinely not counted against either limit; and if a later section of your own skill appears to be missing, say so and re-read the file rather than proceeding on what is left. Be aware of what moving detail into a reference actually trades, though: the shortened skill body tells the reader it was cut, while material that came from a reference and later falls out of the conversation leaves no such signal — so the pointer telling the reader those references exist and must be read has to survive near the top of the file, and is doing more work after the move than before it. One reassurance, so you do not defend against the wrong thing: the shared limit is counted separately for each agent, so dispatching work to sub-agents does not consume the budget your main thread is working within.

Caveat: The exact limits are numbers a future release can change, so treat 'roughly twenty thousand characters' as an order of magnitude rather than a threshold to optimise against. The behaviours — shortened then written back, or emptied outright, both silently — are the durable part.
Caveat: A recovery instruction of the form "if a later section appears to be missing, re-read this file" addresses the shortened case, may still fail there if the recorded location has gone stale, and cannot fire at all for the emptied one, where there is no signal. Phrase it so it does not read as covering both.
Caveat: Recovery is best-effort, and how likely it is to fail depends on the surface. Where a skill's files are staged differs between products: on one, recorded locations are stamped with a version and most of the ones examined no longer existed after updates; on the Cowork sessions examined here the staged location was still present, but that sample was very small. Neither number should be read as a rate. What is established is that the location is captured at first invocation rather than resolved when read; that a later re-read fails as a result is inferred, not observed. Front-loading is the only mitigation here that does not depend on recovery at all.
Caveat: There is a one-line version of this check: find the first heading in your skill and see whether it falls inside the part that survives. If it does not, everything structural is in the discarded half, and what the reader keeps is whatever prose happens to open the file — which in one measured case was release history, leaving no instructions at all. Counting characters tells you whether you are over; finding the first heading tells you whether being over actually costs you anything.

When the capability that is missing is one that CHECKS your work, stop and say so rather than continuing without it.

SILENTInference

A fallback is the right answer when a missing capability costs you convenience. It is the wrong answer when the missing capability is a gate, a second opinion, or a verification step, because what you ship then is a self-graded, self-reviewed result that looks exactly like a checked one — same structure, same confident summary, same score — and neither the user nor a later reader can tell the difference. This is not hypothetical: a review skill run on a surface without its own plugin hand-wrote every hand-off it would normally have delegated, scored its own checklist, ran no adversarial pass and no gates, and produced a report indistinguishable from a verified one, with a single sentence carrying the wrong explanation and nothing else signalling. If you cannot run your checks, refusing costs the user one run; degrading costs them their trust in every run you did check. Where you do continue, name in the output exactly which check did not happen and why, and never let a skipped step be recorded with a value that implies it could be retried here.

Caveat: The reasoning is general; the case behind it is one run of one skill on one surface, relayed from another project.

What is not established

  • This site does not detect product changes. It records what was verified on a date against a build. Anything on this page can be true today and false tomorrow with nothing observable in between.