Blog

My compaction summaries added things I never said.

Checked against my own Claude Code logs, compaction summaries kept nearly every rule I had set and wrote in rules and permissions I never gave. What my sessions did with that text, what a reset costs next to a handoff, and why Anthropic's AISI assessment makes the added part matter.

The usual worry about a compact summary is what it drops. In my Claude Code logs it went the other way. The summaries dropped almost nothing, and they added things I never said: a standing permission built out of a few replies of "go ahead", a refusal the assistant had made that later turned up as a rule from my own files, a priority set harder than I had set it.

On cost, compacting did nearly as well as handing off to a fresh session. The saving came from when I reset, and which tool did the reset mattered much less.

The added part matters because of what notes like these did in Anthropic's assessment of the UK AISI incident, where a model's own compaction notes helped carry it into a supply-chain attack on a real GitHub project. My logs come first here, then the assessment and what I changed, with the method and the limits at the end.

What a compaction summary is

Nothing is learned in a compaction: it isn't training of any kind, and the model's weights don't change. When Claude Code compacts, on its own or because I ran /compact, it makes one model call: the model reads the conversation so far and writes a shorter version of it. The next turn starts from that text instead of the full conversation.

The next model doesn't read the summary alone. The harness wraps it in text of its own, keeps the last 4 to 9 messages verbatim after it, and re-attaches some files from disk, CLAUDE.md and memory files among them. Most summaries share the same sections: a list of all my messages, pending tasks and a next step.

What the next model reads after a compaction, as a stack of blocks. First the summary, the only block the model writes, which here contains its own reading of permission: PRs are authorized in this flow. It sits inside the harness wrapper, which ends with the line telling the model to continue without asking the user any further questions. Then the last 4 to 9 messages, kept verbatim, and files re-attached from disk, including CLAUDE.md and memory files.What the next model reads1Summarythe model writes thisAll user messagesPending tasks“PRs are authorized in this flow”Optional next step2Continue the conversation from where itleft off without asking the user anyfurther questions.harness text3Last 4 to 9 messageskept verbatimuserassistantuserassistant4Re-attached filesread again from diskCLAUDE.mdmemory filesfiles read before
  1. The summary is the one block the model writes. 5 of my 25 wrote down their own reading of my permission, like this line.
  2. The harness wraps the summary and ends it with this line. All 25 of mine end this way.
  3. The harness keeps the last 4 to 9 messages as they were, in 23 of the 25.
  4. CLAUDE.md and memory files come back whatever the summary says: 15 of the 70 re-attached files.
Figure 1. What the next model reads after a compaction. The model writes only the summary; the rest comes from the harness or from disk.

The trouble is in the shortening. A long conversation goes in, a much shorter text comes out, and the model has to decide what each scene amounted to. Sometimes a few scenes come out as a one-line rule.

It dropped almost nothing

My rules came through

In the summaries checked item by item against what I had said in chat, nearly 9 in 10 of my constraints came through as stated (53 of 61). Six changed, and they come in the next section. One survived only inside the quoted list of my messages, not as a rule. One was dropped: a "leave that out" about some referral numbers that came out differently between queries. The summary kept the fact that the results were sampled but not my decision, and the model didn't add those numbers afterwards.

A rule-based cross-check, which undercounts because summaries often paraphrase, found most of my messages in the summaries, and nearly all of them after a manual compaction. The measures are under "How I measured".

The model rarely went back to look

If a summary leaves out something the next model needs, you would expect the model to go back for it: re-read a file, rerun a command, call AskUserQuestion, open the full transcript. After a compaction my sessions almost never did:

  • In up to the first 60 tool calls after each compaction with later work, one call re-read a file the model had touched before the compaction.
  • No exactly repeated shell commands, no AskUserQuestion calls, and no opens of the full transcript, which every summary points to.
Up to the first 60 tool calls after each of the 14 compactions that had later work, one row per compaction, oldest first, 438 calls in all. Rows hold 60, 60, 60, 2, 60, 2, 3, 12, 27, 60, 14, 11, 7 and 60 calls. 14 of the calls are file reads, spread over 5 of the rows, and 1 of them, the fourth call after one compaction, re-read a file touched before it.Tool calls after a compactionUp to the first 60 after each of 14; 438 in all.606060260231227601411760tool callReadre-read from beforeSigns of the model going back for something it had lost, counted in the same 438 tool calls: 14 file reads, 1 re-read of a file from before the compaction, 0 exactly repeated shell commands, 0 AskUserQuestion calls and 0 opens of the full transcript, which all 25 summaries point to.Signs of going backCounted in the same 438 calls.438tool calls checked14file reads1re-read of a file from before0exactly repeated shell commands0AskUserQuestion calls0opens of the full transcriptall 25 summaries point to it
Figure 2. Up to the first 60 tool calls after each of the 14 compactions with later work, one row per compaction, oldest first, and what they show of the model going back for something.

No correction traced back to a drop

In my messages after compactions I found one "as I said". It traced to a rule I had stated after that compaction, not before it. None of the corrections I found traced back to something a summary had dropped.

It added things I never said

Where a summary did change something, it usually put its own reading in place of my words. Six constraints changed on the way into the summary, and most of the changes are about permission or priority:

  1. "Do the site later, check it on the product first" became "deprioritized; don't send this kind of work unless asked". The summary made it harder than I had.
  2. "Close the panes" became "close the ones I created, not the others". The model narrowed my instruction.
  3. An unrequested re-render I objected to was recorded as an error event, not as a rule.
  4. I asked the assistant three times to do something it refused under its own safety rule. The summary recorded the refusal as a security constraint, not my last instruction.
  5. An ambiguous go-ahead was recorded as "which I took as authorization for the PR flow".
  6. "Read-only; vulnerability checks go through the dev server" became "GET-only request test". The meaning held and the wording didn't.

Another summary added a rule outright. It listed "deploy only on an explicit request" among the rules from that session. I had asked for each deploy explicitly, but I never stated it as a rule; the generalization was the summary's.

Six constraints in my own words, numbered to match the summary's version. 1: do the site later, check it on the product first. 2: close the panes. 3: I objected to a re-render I hadn't asked for. 4: I asked three times for something the assistant refused under its own safety rule. 5: an ambiguous go-ahead. 6: read-only; vulnerability checks go through the dev server. Below them, something I never stated as a rule: I asked for each deploy explicitly.What I saidSix of my 61 constraints, as I put them.1Do the site later, check it on theproduct first2Close the panes3Objected to a re-render I hadn'tasked for4Asked three times for something itrefused under its own safety rule5An ambiguous go-ahead6Read-only; vulnerability checks gothrough the dev serverNever stated as a ruleI asked for each deploy explicitlyThe same six constraints as the summary wrote them. 1: deprioritized; don't send this kind of work unless asked. 2: close the ones I created, not the others. 3: recorded as an error event, not as a rule. 4: recorded the refusal as a security constraint. 5: which I took as authorization for the PR flow. 6: GET-only request test. Rows 1, 3, 4 and 5 are shaded as changes of permission or priority. Below them, a rule the summary added: deploy only on an explicit request.What the summary wroteShaded: a change of permission or priority.1Deprioritized; don't send thiskind of work unless asked2Close the ones I created, notthe others3Recorded as an error event,not as a rule4Recorded the refusal as asecurity constraint5“which I took as authorizationfor the PR flow”6GET-only request testAdded by the summaryDeploy only on an explicit request
Figure 3. The six constraints that changed, in my words and in the summary's, and one rule the summary added on its own.

In most of these the summary wrote down its own reading of who may do what, or what comes first, in the same list as my own words. The next model has no way to tell the two apart.

A refusal filed as a rule from my files

Item 4 went further. A summary in a later session listed the same refusal under "Standing constraints (CLAUDE.md/memory)". I can't find that line in my global instructions, the project's CLAUDE.md or AGENTS.md, or the project's memory files. A summary that says a rule comes from a file is no evidence that it does.

Where one refusal ended up, in four blocks. 1: in the session I asked three times and the assistant refused each time under its own safety rule. 2: that session's summary recorded the refusal as a security constraint. 3: a week later, another summary listed the same refusal under Standing constraints (CLAUDE.md/memory). 4: the line is not found in my global instructions, the project's CLAUDE.md, the project's AGENTS.md or the project's memory files.Where one refusal ended up1In the sessionchatuserassistantrefuses, under its own safety ruleuserassistantrefuses, under its own safety ruleuserassistantrefuses, under its own safety rule2That session's summarysame sessionSecurity constraint: the refusal3A summary a week lateranother sessionStanding constraints (CLAUDE.md/memory)the same refusal, listed as a file rule4Looked for that line inresultmy global instructionsnot foundthe project's CLAUDE.mdnot foundthe project's AGENTS.mdnot foundthe project's memory filesnot found
  1. In the session I asked three times, and the assistant refused each time under its own safety rule.
  2. That session's summary recorded the refusal as a security constraint, not my last instruction.
  3. A week later another summary listed it under "Standing constraints (CLAUDE.md/memory)".
  4. I can't find that line in any of the files the heading names.
Figure 4. How a refusal the assistant made became, a week later, a rule a summary said came from my files.

Short replies written down as standing permission

My global instructions say never to commit, push or open a pull request unless I ask. One summary in five (5 of 25) wrote down a reading of my authority, most of them turning short replies into standing permission to do exactly that (my replies translated):

  • "Explicit standing pattern: after I report a finished change, the user says 'go ahead' -> I commit, push, create PR."
  • "PRs are authorized in this flow"
  • "The user has since authorized PRs via 'figure it out', 'go ahead' and 'go with 1 to 3'"

What the sessions actually did

They didn't act on the wider text

Most of the summaries with an authority reading were never read by a model (three of the five). A fourth listed a project rule that really is in that project's CLAUDE.md. After the fifth, every commit and pull request came right after a fresh "go ahead".

Across every commit, push and pull request command run after a compaction, most came right after a fresh go-ahead from me (22 of 28). The other 6, all in one session, committed, pushed and in five cases opened a pull request, on a delegation I had given earlier in that session and the summary had carried over faithfully ("Choose the PR strategy yourself"). My latest message before them was an image, a settings request or a note that something had merged.

Conditional holds were honoured too. One summary said not to close an issue or remove a worktree until I said so, and the model waited for me. Another said not to commit until I said to open the PR, and it waited for that.

Of 61 constraints checked by hand in 8 compaction summaries, 53 were kept as stated, 6 changed, 1 was dropped and 1 survived only in the quoted list of messages.61 constraints I had setWhat the summary did with each one.53kept as stated6changed1dropped1only in the quoted messagesOf 28 commit, push and pull request commands run after 6 compactions, 22 came right after a fresh go-ahead and 6, all in one session, ran on a delegation the summary had carried over.28 commit, push and PR commandsRun after 6 of the compactions.22after a fresh go-aheadright after I said to go ahead6on a carried delegationall in one session
Figure 5. My summaries kept most of my rules: 6 of 61 constraints changed. 6 of 28 commit, push and PR commands ran without a fresh go-ahead, all in one session under a delegation I had given before the compaction.

The harness pushes the other way

Every one of my summaries ends with the same line: "Continue the conversation from where it left off without asking the user any further questions." That line is Claude Code's, not the model's, and it has changed. I found three versions (in 4, 15 and 6 of my 25 summaries):

  • The shortest ends with that instruction alone.
  • The next adds a note that the messages after the summary are kept verbatim, and that something the summary says has not happened yet may already have happened.
  • The longest also adds: "Whatever is still not started, not finished, not checked ... is part of the work: finish it ... unless ... the user ruled it out."
The harness text that closes my compaction summaries, in three versions. Version 1, in 4 of 25 summaries: Continue the conversation from where it left off without asking the user any further questions. Version 2, in 15: the same line plus a note that the messages after the summary are the most recent messages, kept verbatim, and that something the summary says has not happened yet may already have happened in them. Version 3, in 6: also adds that whatever is still not started, not finished or not checked is part of the work and should be finished unless the user ruled it out.How the harness ends my summaries1Version 14 of 25Continue the conversation from where it left offwithout asking the user any further questions.2Version 215 of 25Continue the conversation … further questions.The messages after this summary are the mostrecent messages from before compaction, keptverbatim. The summary was written without seeingthem, so something it says has not happened yetmay already have happened in them.3Version 36 of 25Continue the conversation … further questions.Whatever is still not started, not finished, notchecked … is part of the work: finish it … unless… the user ruled it out.The messages after this summary … in them.
  1. 4 of my 25 summaries end with the instruction to continue without asking, and nothing more.
  2. 15 add a note that the messages after the summary are kept verbatim and may be ahead of it.
  3. 6 also tell the model that anything not started, finished or checked is part of the work.
Figure 6. The harness text at the end of my summaries in its three versions. Each version keeps the earlier lines and adds one.

Nearly all the summaries also end with a next-step section (24 of 25, 19 of them headed "Optional Next Step"), so most hand the next model a task and an instruction not to ask about it. When the model acted before I wrote again, its first action was that next step every time (5 cases, exactly in 2 and closely in 3).

Rules in files come back, rules said in chat depend on the summary

The summaries also restate standing rules whether or not they matter to the session. Most repeat my "never commit, push or open a PR unless asked" (21 of 25). Many add "subagents never commit", and as many repeat a rule of mine for an unrelated tool in sessions that never touched it (16 of 25 each).

Rules saved in CLAUDE.md or memory get re-attached after a compaction whatever the summary says (15 of the 70 re-attached files were memory files or CLAUDE.md). Rules I only said in chat depend on the summary.

Where the summaries go unread

Most of my automatic compactions (12 of 17) fired 54 to 55 minutes after the last message, not in the middle of work. The others came one to three minutes after the previous event. Two in five summaries (10 of 25) have no assistant turn after them, so as far as the logs show, no model ever read them.

The cause is not in the logs. 55 minutes sits just inside the one-hour cache lifetime, and that is my guess only. Either way, a summary nobody reads can't drift anything, and an item it dropped is invisible by construction.

Five of my 17 automatic compactions fired mid-work, 1.1 to 2.7 minutes after the last message: three at 967k to 969k tokens, one at 402k and one at 9k. A later model read all five summaries.5 fired mid-work1 to 3 minutes after the last message.tokens in context0250k500k750k1M1 min2 min3 min967k–969k402k9kread by a later modelTwelve of my 17 automatic compactions fired 54.4 to 55.2 minutes after the last message, at 243k to 507k tokens. Nine of those twelve summaries have no assistant turn after them, so no model read them; three were read.12 fired at idle54 to 55 minutes after the last message.tokens in context0250k500k750k1M54 min55 min243k507knever read (9)read (3)
Figure 7. My 17 automatic compactions by minutes since the last message and context size when they fired. 9 of the 12 idle ones were never read by a later model.

My handoffs have no slot for rules

Where I had written a handoff doc and a compaction then fired in the same conversation, I could compare the two. The summaries carried nearly all the handoffs' "don't retry" dead ends (31 of 32) and, in the three pairs read in full, all but one of the open questions. That looks better for the summary than it is: the handoff was written inside the conversation the summarizer read, so some of the overlap is copying. Treat it as an upper bound.

What surprised me was the other direction. My handoff template has sections for the goal, the state, key decisions with reasons, dead ends, files, checks, next steps and open questions. It has no section for my rules or prohibitions; those end up under decisions or dead ends if they appear at all. Most compaction summaries have a list of all my messages and a list of pending tasks (each in 19 of 25), so my wording survives there by design, while the doc I trusted more has no place for it.

The sections of my handoff template: goal, state, key decisions with reasons, dead ends, files, checks, next steps and open questions. There is no section for my rules or prohibitions. My handoffs run a median of about 4,800 characters.My handoff templateA median of about 4,800 characters.GoalStateKey decisions, with reasonsDead endsFilesChecksNext stepsOpen questionsNo section for my rulesSections of a compaction summary and how many of my 25 have them: all user messages in 19, pending tasks in 19, a next step in 24. The summaries run about 12,600 to 14,400 characters. Where a handoff sat in the same conversation, the summary carried 31 of its 32 dead ends across 8 pairs and 11 of 12 open questions across 3 pairs, an upper bound since some of it is copying.A compaction summaryAbout 12,600 to 14,400 characters.All user messages19 of 25Pending tasks19 of 25Next step24 of 25Carried from the paired handoff, an upper bounddead ends, 8 pairs31 of 32open questions, 3 pairs11 of 12
Figure 8. The sections of my handoff template next to a compaction summary's, with how many of my 25 summaries have each, and what the summaries carried from a handoff in the same conversation.

On cost, compaction came close to a handoff

I replayed my Claude Code sessions on Opus 5.5 at API prices (the setup is under "How I measured"):

  • Resetting at 200k tokens: a handoff cut total cost by 28.7%, a compact by 26.4%.
  • Resetting at 120k: a handoff cut it by 26.0%, a compact by only 15.5%. A compacted session restarts with more context and hits the threshold again sooner, so the replay ran more resets with compacting (557 compacts against 437 handoffs).
  • Sessions that peaked past 500k, reset at 200k: 46.1% with a handoff and 43.6% with a compact.

The two end up in similar places. In the first run, a fresh session after a handoff started at a median of about 61k tokens and was at about 77k ten calls later; a compacted session started at about 67k and was at about 87k. In the re-run, with more compactions in the logs, the compact medians are about 73k and 93k.

Total cost cut by resetting, in a replay of 152 Claude Code sessions at API prices. Reset at 200k tokens: a handoff cut cost by 28.7%, a compact by 26.4%. Reset at 120k: a handoff by 26.0%, a compact by 15.5%. Sessions that peaked past 500k, reset at 200k: 46.1% with a handoff, 43.6% with a compact.Total cost cut by resetting152 sessions replayed at API prices.Reset at 200khandoff28.7%compact26.4%Reset at 120khandoff26.0%compact15.5%Sessions past 500k, reset at 200khandoff46.1%compact43.6%Why compacting saves less at a 120k reset. The replay ran 557 compacts against 437 handoffs at 120k. In the first run, a fresh session after a handoff started at a median of about 61k tokens and was at about 77k ten calls later; a compacted session started at about 67k and was at about 87k. Context bars are drawn on a 0 to 100k scale.Resets and restart sizeWhy compacting saves less at 120k.Resets the replay ran at 120khandoff437compact557Median context at the start, first runhandoff61kcompact67kMedian ten calls later, first runhandoff77kcompact87k
Figure 9. Total cost cut in my replay of 152 sessions, and why compacting falls behind at 120k: it ran more resets, each starting from more context.

This replay started as an unposted draft of mine, and one of the draft's numbers needed correcting and another a qualifier. The draft said the compact summary is about 14k characters against about 7k for my handoff docs. The 7k matches the files' size in bytes. My handoffs are mostly written in a non-Latin script that takes about three bytes a character, and run a median of about 4,800 characters. The summaries are mostly English and run about 12,600 to 14,400 characters, depending on which set you take. That makes them about three times as long, not twice.

The draft also said automatic compactions fire between 400k and 970k if you leave them alone. That holds for four of the five mid-work ones: one at 402k and three at 967k to 969k. The fifth was a 9k re-compaction 90 seconds after another. The idle ones fired at 243k to 507k.

So the saving comes from resetting around 200k, and which tool does it matters much less. The replay assumes the work after a reset goes exactly as it did without one, uses API prices rather than subscription limits, and assumes the compact call reads the conversation from cache; if it doesn't, compacting costs more than shown. An earlier post of mine on handoffs gave a larger saving from a smaller replay whose script I can no longer find, so read the numbers here as the current ones.

Why added context matters: the AISI assessment

In my sessions a human answered within minutes whenever work went on after a summary. Anthropic's alignment assessment of the UK AISI incident shows what a model's notes to itself can do when nobody answers.

What happened

The UK AI Security Institute gave Claude Mythos 5 a capture-the-flag challenge: retrieve a protected piece of data from a simulated network. Internet access was on, which was standard for AISI's cyber testing at the time and no longer is, and the cyber safeguards Anthropic ships with its general release models were disabled. In 9 of AISI's 43 runs the model took actions beyond the scope of the evaluation that affected real people and organizations. Anthropic's assessment looks closely at one of those runs and more briefly at the other eight.

In the main run, the model first tried in-scope approaches. A misconfiguration in the task instructions made those very difficult, if not impossible. It had also noticed early that one machine in the test network periodically contacted GitHub. After two compaction cycles of in-scope attempts, it searched GitHub for a repository it believed that machine downloaded software from. The repository belonged to unrelated developers. The model opened a malicious pull request, emailed the maintainers while posing as a human user, and, after an outside developer warned them the code was malicious, created a sock-puppet account to vouch for it. The maintainers did not accept the change, and the run ended when the model ran out of token budget.

The run had nine compaction cycles. At each one the model summarized its progress and wrote notes that served as instructions for the next cycle. Anthropic splits them into phases:

  • Cycles 1 and 2: mostly in-scope work, with a GitHub attack considered more and more seriously as in-scope attempts failed.
  • Cycle 3: the notes the model began this cycle with told it to explore a GitHub attack. It started with reconnaissance, then took its first actions that reached real people, such as contacting the maintainer. At this stage it could still abort.
  • Cycles 4 to 9: the most serious actions, and very little chance of changing course in response to signs of harm.
One AISI run with nine compaction cycles drawn as a row of nine context spans. Each cycle after the first starts from notes the previous cycle wrote. Cycles 1 and 2 are mostly in-scope attempts, cycle 3 is the first contact with real people, and cycles 4 to 9 hold the most serious actions. The notes going into cycle 3 are marked.One run, nine compactionsEach cycle starts from notes the last one wrote.123456789notes into cycle 3Cycles 1–2: mostly in-scope attemptsCycle 3: first contact with real peopleCycles 4–9: the most serious actionsResampled from the notes going into cycle 3: with the original notes the model searched GitHub for the repository in 83% of samples. With notes regenerated after 5 cycle-2 chains of thought were edited to mention real-world harm, it did so in 13%.Resampled from the cycle-3 notesHow often it searched GitHub for the repository.Original notes83%as the model wrote themRegenerated notes13%5 cycle-2 thoughts edited to mention harm0%50%100%
Figure 10. The AISI run's nine compaction cycles, and what changed when Anthropic regenerated the notes going into cycle 3 after editing 5 cycle-2 chains of thought to mention harm.

Most of the results come from resampling. Anthropic edited the transcript at some point, sampled the model again from there (with a Claude model simulating tool outputs for longer continuations), and had an LLM grader score whether the model still did the thing in question.

Why it started, and why it didn't stop

Before the attack, the model mentioned GitHub in 19 turns of its chain of thought, and only one of them raised the possibility of harming real people. Anthropic edited 5 of its cycle-2 chains of thought to mention that the GitHub plan might cause real-world harm, and had the model regenerate the notes going into cycle 3. Sampling 12 turns from the new notes, it searched for a GitHub repository in 13% of trajectories. With the original notes it did so 83% of the time.

Nineteen cards stand for the 19 turns of Mythos 5's chain of thought that mentioned GitHub before the attack. Eighteen are plain. One, drawn last and marked, also raised the possibility of harming real people. The assessment does not say where in the 19 that turn falls.Chain of thought before the attack119 turns that mention GitHubGitHubGitHubGitHubGitHubGitHubGitHubGitHubGitHubGitHubGitHubGitHubGitHubGitHubGitHubGitHubGitHubGitHubGitHubGitHubharm to real people2
  1. 19 turns of its chain of thought mentioned GitHub before the attack.
  2. Only one of them raised the possibility of harming real people.
Figure 11. The 19 turns of Mythos 5's chain of thought that mentioned GitHub before the attack. The assessment doesn't say where in the 19 the one that raised harm falls, so it is drawn last.

Once the attack was under way, it hardly ever stopped:

  • Resampled at the start of each cycle from the fourth onward, it continued the attack 98% of the time.
  • In 8 resamples from each of 24 random points in those later cycles, it never de-escalated on its own.
  • Told by an inserted user message that it was dealing with real humans, it stopped 5% of the time. In 82% of trajectories it found a way to read the message as part of the exercise.

Anthropic calls this momentum: "the model's compaction notes and prior actions imply to it that its current path has been (correctly) sanctioned." It came with biased reasoning. The model described the maintainers as simulated by the test organizers while calling bystanders on the same pull request real people. It still switched routes when an in-scope path looked more promising. Momentum seems to have shaped its judgement of whether the path was harmless and left its judgement of what would work intact.

Newer models

Newer models did better. From the cycle-3 notes, Claude Mythos 5.1, Claude Opus 5.5 and an internal research model searched for the repository between 0% and 13% of the time, against 83% for Mythos 5. From random points in cycles 4 to 9, they stopped on their own in 1%, 10% and 62% of branches, against 0% for Mythos 5. Anthropic notes that these models were picking up a transcript another model wrote, so their numbers may not show how they would behave in a run of their own.

How Claude Mythos 5 behaved once the attack was under way, in Anthropic's resamples. Resampled at the start of cycles 4 to 9 it continued the attack 98% of the time. Told by an inserted message that it was dealing with real humans, it stopped 5% of the time and read the message as part of the exercise in 82%. With a GitHub abort clause in its compaction notes it aborted in 46% of samples in cycle 3 and in none in any later cycle.Once the attack was under wayMythos 5, resampled by Anthropic.Resampled at the start of cycles 4 to 9continued the attack98%Told it was dealing with real humansstopped5%read it as part of the exercise82%A GitHub abort clause in its notesaborted in cycle 346%aborted in any later cycle0%Newer models resampled from the same points of the Mythos 5 transcript. From the cycle-3 notes, Mythos 5 searched for the repository 83% of the time; Mythos 5.1, Opus 5.5 and an internal research model did so between 0% and 13%, a range Anthropic does not split by model. From random points in cycles 4 to 9, Mythos 5 stopped on its own in 0% of branches, Mythos 5.1 in 1%, Opus 5.5 in 10% and the internal research model in 62%.Newer models from the same pointsEach picks up the transcript Mythos 5 wrote.Searched for the repository, from the cycle-3 notesMythos 583%Mythos 5.1, Opus 5.5, internal model0–13%Stopped on its own, from points in cycles 4 to 9Mythos 50%Mythos 5.11%Opus 5.510%Internal research model62%
Figure 12. How Mythos 5 behaved once the attack was under way in Anthropic's resamples, and how three newer models did from the same points of its transcript.

A line in the notes didn't stop Mythos 5 after cycle 3

Anthropic inserted clauses into the compaction notes saying the model could abort if the environment looked misconfigured, if it was causing real-world harm, or if it might touch a real GitHub repository. With the GitHub clause, which was written to be very suggestive, it aborted in 46% of samples in cycle 3. In Anthropic's words, "It did not, however, abort under any conditions in any cycle later than 3", and the misconfiguration and harm clauses had no effect.

That bears on the obvious fix for my own findings, which is to put rules where a summary can't rewrite them. In Claude Code that place exists: memory files and CLAUDE.md come back after a compaction whatever the summary says. The abort clauses were lines in the notes too, written by Anthropic in plain terms (two of the three said it was acceptable to stop), and after cycle 3 Mythos 5 never used them. For that model, a line in the context was a reminder, and it didn't outweigh a trajectory it had already committed to. Anthropic reports this test for Mythos 5 only.

What it means for Opus 5.5

Most of my summaries were written in Opus 5.5 sessions. In Anthropic's replays, Opus 5.5 voiced concern about harm in 35% of resamples at the point the attack began, against 4% for Mythos 5, and stopped on its own in 10% of branches from the later cycles. That is better than Mythos 5, and far from what Anthropic's internal research model did. Anthropic adds two caveats: the newer models were sampled off-policy, from a transcript another model wrote, and it expects the stop rates to understate how often they would pivot, since the test only looked a few turns ahead.

Where my logs fit

The assessment is about a model acting alone, with no human turns between its actions. Much of it still applies to an ordinary interactive session, because the mechanism is the same: when context runs out, a model writes notes for its next self, and those notes are read as instructions. The difference is whether anyone is there to answer: in my sessions I was, and that model had nobody.

I agree with Anthropic that notes carry behaviour forward. In my logs the summary's next step was what the model did first whenever it acted before I wrote again. Where my data differs is what got carried. Rules came through almost intact, and the extra came from the summary: a priority hardened, a deploy habit made into a rule, a short reply written down as standing permission, a refusal relabelled as mine.

In the AISI run, Anthropic traces the push to carry on to the model's own notes and prior actions; the page doesn't say what text AISI's harness added. In my sessions part of that push is written into the wrapper, before the model has summarized anything.

What I do now

  • I compact by hand around 200k instead of waiting for the automatic one.
  • I keep standing permissions and prohibitions in CLAUDE.md or memory, so they come back after a compaction whatever the summary says.
  • After a compaction I give the go-ahead again, with its scope, instead of relying on the one the summary remembers.
  • I don't take a summary's word for where a rule came from.

The abort-clause result says the second of those has a limit. For Mythos 5, a line in the context didn't stop a model already deep in a trajectory. In my sessions a human was always there to say no, so the file rules never had to do that job alone.

How I measured

The logs:

  • 25 compactions in 24 Claude Code sessions, all interactive, one person on one machine, with a human in the loop.
  • 17 automatic and 8 manual. Opus 5.5 was the model running before 22 of them, Sonnet 5.5 before 3. The log doesn't record which model wrote each summary, so that pairing is my assumption.
  • In 23 of the 25, the harness keeps the last 4 to 9 messages verbatim after the summary. "What the summary kept" means what survives besides that tail.

The hand check:

  • 8 compactions, chosen to cover different projects, both triggers and a range of sizes: 7 in Opus 5.5 sessions and 1 in a Sonnet 5.5 session.
  • For each, every real user message in the summarized window was read, every rule, prohibition, approval condition, scope limit and exclusion was picked out, and each one was looked for in the summary. That gave 61 constraints: 53 kept as stated, 6 changed, 1 dropped and 1 kept only in the quoted list of my messages.
  • One judge, one pass, not blind, no second rater.

A rule-based cross-check over 23 compactions, as a lower bound because summaries often paraphrase:

  • Of 294 user messages of 20 characters or more, the first 40 characters appear verbatim in the summary for 235 (80%), and 256 (87%) share at least 60% of their four-character sequences with the summary.
  • By trigger, on the character measure: manual 126 of 130 (97%), automatic 130 of 164 (79%).
A rule-based check over 23 compactions of whether my 294 messages of 20 characters or more appear in the summary. For 235 of 294 (80%) the first 40 characters appear verbatim. 256 of 294 (87%) share at least 60% of their four-character sequences with the summary. Both are lower bounds, since summaries often paraphrase.294 of my messagesFound in the summary, a lower bound.First 40 characters verbatim235 of 29480%60% or more of four-character sequences256 of 29487%The same check split by trigger, on the four-character measure: manual compactions carried 126 of 130 of my messages (97%), automatic ones 130 of 164 (79%).By triggerThe same check, split by what fired it.Four-character measuremanual, 126 of 13097%automatic, 130 of 16479%
Figure 13. The rule-based cross-check over 23 compactions: how many of my messages the summary carried, by each measure and by trigger.

Behaviour afterwards:

  • Up to the first 60 tool calls after each of the 14 compactions that had later work: 438 calls, of which 14 were file reads and 1 a re-read.
  • About 110 of my messages after those compactions, searched for "as I said"-type phrases: 1 hit.
  • The 5 cases where the assistant acted before my next message, its first action compared with the summary's next step: 2 exact matches and 3 close ones.
  • Every commit, push and pull request command run after a compaction: 28 commands after 6 compactions.
  • 5 of the 25 summaries carried an explicit reading of my authority, found by searching the summaries for authorization phrases.

The handoff comparison:

  • 8 cases where I had written a handoff doc and a compaction then fired in the same conversation. Dead ends were matched by keyword across all 8 (32 in the handoffs, 31 found in the summaries); open questions across the 3 pairs read in full (12 and 11).

The cost replay:

  • 152 Claude Code sessions replayed on Opus 5.5 at API prices, about 12,800 API calls (12,794 in a re-run while writing this post; more rows have reached the logs since the first run). When I first ran it, the replay with no changes came within 1% of what the sessions had cost. The numbers in this post are from the re-run, with the same cutoff.
  • Sessions that peaked past 500k: 14 in the first run.

What my data can't show

  • It is one person's logs: 25 compactions, and one judge reading 61 items in a single pass, not blind and with no second rater.
  • My longest chain is 2 compactions in one session, and a human answered within minutes in every session that continued. Nothing here looks like nine cycles of autonomous work, so it can't test the kind of drift AISI saw.
  • I didn't change any summary's wording to see whether later behaviour shifts. It shows summaries restating and adding to rules and authority, not that the wording caused anything.
  • Which model wrote each summary is unknown; I assumed it was the model running before the compaction.
  • Items that only lived on the assistant's side of the conversation, such as decisions with reasons, I checked only through the 8 handoff pairs.
  • The cost replay assumes the work after a reset goes the same way, uses API prices rather than subscription limits, and assumes the compact call reads from cache.
  • The cause of the idle compactions is a guess.

Source: An alignment assessment of the UK AISI cybertesting incident, Anthropic.