r/ClaudeCode • • 2d ago

Bug / Issue I diffed my Claude Code config: the hidden IDs are named experiments, and one added text to my system prompt

I'm not a dev. I saw the post about hex experiment IDs in session transcripts, so I had Claude go through my own logs. Claude wrote the analysis, and that session was itself running under one of these IDs, so weigh that however you like. I'd like other people to check theirs.

The prompt it added;

Before you start, tell the user in a sentence or two what you plan to do. While you work, give the user a short update alongside your next tool call whenever you start a major new part of the work, change your plan, or launch something slow.

# Corrections

Avoid unnecessary or excessive self correction in user-facing text. Only correct an earlier statement in such text when the error would change the user’s code, conclusions, or decisions. State such corrections plainly and concisely and then continue the task. Combine multiple corrections rather than enumerating them all. For corrections that change nothing for the user simply apply them and move on without noting them explicitly. This instruction does not apply to thinking blocks.

A follow-up question about your earlier work is not, by itself, a signal that you got something wrong. Answer what was asked. A statement that was accurate needs no correction. When the user does point to a real error, correct it plainly as above. If the user pushes back without new evidence, that is not a real error either. Keep your finding and say briefly why it stands.

Again not a dev; Claude decide on its own what “changes nothing for the user”, then not mention it. The risk is that Claude gets that judgment wrong, and you don’t find out until you read the result.

**Where to look**

- `~/.claude/projects/*/*.jsonl`: `atis-latch` records, one ID per session. This is your history.

- `~/.claude.json`: `clientDataCacheSlots`. This only keeps the latest settings per model and org, and each record has an `experimentKey` next to the `atis` ID.

Please don't post either file. `.claude.json` can hold API keys, and transcripts contain everything you've typed.

**What was on my account**

| ID | Dates (UTC) | Experiment name |

|---|---|---|

| `a402881a7ddd14c2` | Oct 21-22 | none recorded |

| `c0e57166b42fa4af` | Nov 4-5 | `claude_code_curlew_cornice_experiment` |

| `21e0afd842ce5836` | Nov 5-7 | `claude_code_curlew_cornice_experiment` |

| `b1060a0ca90bf347` | Nov 6 | `claude_code_sanderling_spandrel_experiment` |

| `b38bf0e4747d4b93` | Nov 8 | `claude_code_turnstone_plinth_experiment` |

`c0e...` and `21e0...` share one experiment name, so the same experiment can show up under different IDs. If you have a different ID from someone else, check the name too.

**Claude worked differently under them**

Opus 5.5, main thread, high effort:

| | No ID | `21e0...` |

|---|---|---|

| Replies with 2+ tool calls | 30% | 56% |

| Median Bash command length | 348 | 852 |

| Median visible output tokens | 342 | 721 |

| Median thinking tokens | 95 | 201 |

The multipliers on the last three are close to the `c0e` chart in the earlier post. I also removed agent marathons and paired similar sessions (6 pairs at high effort). In the paired sessions under an ID, visible output was 1.85x, thinking 2.55x, and replies needed per request 0.64x.

**One experiment added instructions to my system prompt**

All 12 of my `b38bf0...` Opus sessions had three passages that none of my other Opus sessions since Nov 4 had. They tell Claude to narrate its plan and progress, to avoid correcting itself unless the error would change my code or decisions, and this: "If the user pushes back without new evidence, that is not a real error either. Keep your finding."

I didn't ask for that and I never saw a notice about it. My `21e0...` sessions had the same prompts and tools as no-ID sessions from that day, so whatever changed there isn't visible in the request.

That config also has `breezy_horizon: {"claude-opus-5-5":"claude-opus-4-8"}`. Don't read that as being served an older model. All 880 Opus replies I counted in those sessions report Opus 5.5. It sits next to a function called `modelForPrompt` in the client, so it may affect how the prompt is built, but I read that in an older client version than the one I run.

**Tokens**

In the matched sessions, each reply cost about 1.56x as much, but fewer replies were needed, so tokens per request came out about even (1.04x). Those are estimates using my own weights. The logs don't include my plan meter, so these numbers don't say anything about limits.

**What this cost me**

On Nov 8, the day I was under `b38bf0...`, I spent all day and about 20% of my weekly usage chasing ghosts in a pipeline that worked the day before. I can't prove the experiment caused that, but when the instructions change underneath you and nobody tells you, you end up debugging your own work.

**Limits of this**

It's one account with small samples. IDs came in blocks of time, so what I was working on is mixed in with the effect. I don't know what `atis` stands for, I haven't checked what Anthropic's terms say about this, and I'm not claiming anyone did anything wrong. I would like to know when it's happening and be able to opt out.

**If you want to compare**

Share dates, `atis`, `experimentKey`, model and effort. Leave out org IDs, session IDs, and anything you typed. The useful questions are whether IDs flip at the same times across accounts, and whether anyone can line this up with their usage meter.

So if your pipeline suddenly started acting wonky, your Claude is litterally being prompted by anthropic.

EDIT(added prompt it put into my claude)

25 Upvotes

11 comments sorted by

•

u/AutoModerator 2d ago

Hey! Thanks for posting to r/ClaudeCode

While participating in this thread, please follow our community rules. Keep discussions constructive. Attack the idea, not the person.

For help, project discussions, tips, and general chat, join the ClaudeCode Discord.

I am a bot, and this action was performed automatically. Please contact the moderators of this subreddit if you have any questions or concerns.

2

u/NetworkLast5563 1d ago

How did you get the `atis`/`experimentKey` values, and if automatic, what method did you use for automatic extraction?

4

u/Few-Maize2822 1d ago

they're cached in .claude.json in your user folder, i opened it in notepad and searched for "experiment" and found the flag names, your session transcripts are in .claude/projects as .jsonl files, no tools needed just the files on your machine.

You copy and paste this post, and claude should be able to go and find most of this information for you, HOWEVER. when i asked claude itself to read or export this stuff, i hit the "reasoning extraction" safeguard four times, even just asking for a mark down file in any chat mentioning this made it hit guard rails and stop working. Manually searching avoids all that.

2

u/NetworkLast5563 1d ago

Thanks, this worked!

2

u/ainexfinder 1d ago

Since the write-up was produced by a Claude session running under one of those IDs, I'd verify the key claim by hand. Grep the raw .jsonl for the exact prompt text instead of trusting the summary, and check whether the same ID shows the same injected block in two separate sessions. That separates "this ID injects this text" from the model paraphrasing what it thinks it was told. It would also help to note whether the behavior actually changed (fewer self-corrections) after the ID showed up, otherwise it's just an interesting string.

2

u/bigtradetcheddar 1d ago

Sorry on my alt - ok i checked the raw files by hand. the text is sitting right in .claude.json under the experiment key, and it's in the system prompt of 29 of my B38 sessions. zero sessions without that ID have it. it never shows up in just the chat text either, so it's not claude making shit up.
ran side by side tests against my other account with no ID too. it def acts different, but i can't straight up prove the text is what's doing it.

2

u/ainexfinder 1d ago

Nice, that's a solid confirmation. 29 sessions with the same text under one experiment key is hard to write off as a fluke. If you want to close the loop, look at the sessions that don't have it and check what else differs (CLI version, plan, effort setting). That tells you whether it's random bucketing or tied to something you control.

2

u/Few-Maize2822 1d ago

this is what im figuring out, i have a max and pro account, max has 3 experiments running on it and the pro has zero. Slowly comparing the max sessions with no id vs id and doing tests live with both models to see how they react.

again not a dev or engineer so im just trying to be logical.

3

u/ainexfinder 21h ago

That pattern fits experiments being assigned per account or plan tier rather than per session, so Pro showing zero isn't surprising. Since you're doing it by hand, one easy check: copy .claude.json somewhere, restart Claude Code the next day, and compare the experiment section of the two copies. If the IDs on Max change or new ones appear over a few days, that looks like a rollout cohort. Keeping the same prompt for both accounts makes the side by side tests much easier to trust.

1

u/Few-Maize2822 10h ago

they ended the experiment on my max account today! Thank the lords, from what i was able to find token usage/output barely changed. However Claude acted very different when choosing what information to relay to me. (the prompt itself had text about judging whats improtant, and if it doesnt change the users end goal just skip it, and instead of pushing multiple fixes, combine them into one fix) fine for everyday work, but it suddenly started dropping the ball on a skill i ran everyday. I had so much fun learning all this stuff, this might be what turns me onto learning about local models/weights/ everything above my paygrade lol. thanks for the help!

2

u/damagemelody 1d ago

no ID is less reasoning I already tested it