Research Obsessions

Claude Code Spinner Verbs: 186 in the Shipped Binary, and Why Every Published Count Disagrees

I extracted the spinner verb array from the shipped Claude Code v2.1.226 binary. It holds 186 verbs, not the 185 everyone republishes, and "almost done thinking" is a stopwatch.

Research brief

What this research adds
A first-party extraction of the spinner verb array, the config merge function, and the extended-thinking status ladder from the shipped Claude Code v2.1.226 native binary, reconciled against seven published verb counts that range from 52 to 191 and disagree with each other and with the shipped artifact.
Research question
How many spinner verbs does the shipped Claude Code binary contain, which republished list is current, and does the 'almost done thinking' label mean the model knows it is nearly finished?
Method
Downloaded @anthropic-ai/claude-code-linux-x64@2.1.226 from the public npm registry on 2026-08-10, located the spinner verb array and the surrounding functions inside the 297 MB native binary by byte offset, and parsed the array with a regex over the decoded segment. Cross-checked the result against seven published counts dated January to June 2026 and against two Claude Code issue threads. Limitations: one platform build (linux-x64) and one version, no historical binaries, and Anthropic publishes no changelog for this array.
Confidence
High
Evidence
first-party binary extraction, primary documentation, published-source reconciliation
Next verification

TL;DR: Claude Code shows a rotating word while it works. Canoodling. Flibbertigibbeting. Prestidigitating. Every blog post that lists them says 185, and every one of them copies the same February 2026 snapshot. I pulled the array out of the shipped v2.1.226 native binary on 10 August 2026 and counted 186. Bunning and Gesticulating ship and appear in none of the republished lists. Evaporating sits in every republished list and ships in none. Sparkling and Blooping, named as defaults by an Anthropic maintainer in issue 6814, are gone too. The better find sits next to the array. During extended reasoning the "thinking" text is no verb at all, just a five-stage ladder keyed to elapsed milliseconds, and "almost done thinking" fires at 45 seconds whether or not the model is close to an answer. You are reading a stopwatch.

Evidence Ledger

ClaimEvidenceSource typeVerifiedConfidenceCaveat
Claude Code v2.1.226 ships 186 default spinner verbs@anthropic-ai/claude-code-linux-x64@2.1.226, array extracted at byte offset 282767567First-party binary extraction2026-08-10HighOne platform build. Other platform binaries were not extracted
Bunning and Gesticulating ship in v2.1.226 and appear in no republished listShipped array vs. the 185-verb list published for v2.1.42First-party extraction plus published list2026-08-10HighCannot date the version that added them
Evaporating appears in the republished lists and does not ship in v2.1.226Zero byte matches in the binary against its presence in the v2.1.42 listFirst-party extraction2026-08-10HighCannot date the version that removed it
Sparkling and Blooping were defaults an Anthropic maintainer named, and neither ships in v2.1.226Maintainer wording in Claude Code issue 6814, zero byte matches in the binaryPrimary documentation plus first-party extraction2026-08-10HighThe issue does not date when those two were retired
The spinnerVerbs setting shipped in v2.1.23 with modes replace and appendMaintainer comment, issue 6814Primary documentation2026-08-10HighVersion attribution rests on the maintainer's comment
mode: "replace" with an empty verbs array silently falls back to all 186 defaultsResolver in the binary: if(t.mode==="replace")return t.verbs.length>0?t.verbs:uUaFirst-party binary extraction2026-08-10HighUndocumented in any public source I found
The default array held 52 gerunds in late January 2026"By default, there are 52 gerunds that cycle through", 28 January 2026Published observation2026-08-10MediumNo version number stated on the page
Extended-thinking text is a five-stage ladder keyed to elapsed time, not a random verb drawFunction in the binary returning thinking, still thinking, thinking more, thinking some more, almost done thinking against constants 10000, 20000, 30000 and 45000 msFirst-party binary extraction2026-08-10HighThresholds read from the shipped constants, not observed in a timed session
spinnerVerbs does not control the extended-thinking label"the 'Thinking' label displayed during the model's extended thinking phase is not affected by this setting"Primary documentation2026-08-10HighConfirmed structurally: the two live in separate code paths
v2.1.116 replaced the whimsical extended-thinking phrases with the plain ladder"In 2.1.116, silly phrases (like 'Consulting the rubber duck') were replaced"Primary documentation2026-08-10HighCorroborated: rubber duck returns zero byte matches in v2.1.226
Published counts of the array range from 52 to 19152, 185, 185 built-in, 187, 191 cataloguedPublished-source reconciliation2026-08-10HighSeveral pages state a count without naming the version they counted

Where the Evidence Conflicts

Seven published sources give five different counts. None of them lies. They counted a moving array at different times, under different rules about what counts as an entry.

CountSourceDatedWhat it appears to be counting
52Tristan Dunn2026-01-28The array around the release of spinnerVerbs
85Simon S, quoting the bundled extension arrayearly 2026An array bundled in the VS Code extension, not the CLI
184Medium teardown2026-05-31Stated as "around 184", hedged on purpose
185Coding Cocoon, Rushi, wynandw872026-02 to 2026-04v2.1.42, the snapshot everyone else copied
187krishnaclouds, juejin2026-04 to 2026-06A later snapshot, or a count including duplicates
191Spinner Verbs Dictionary2026-02-26191 catalogued, 185 described as active, 6 retired
186This page2026-08-10The array inside the shipped v2.1.226 binary

The 185 figure has the widest reach and the weakest freshness. Coding Cocoon stamped its list v2.1.42. That was honest. Everyone downstream dropped the stamp and kept the number, so a February snapshot now circulates as present-tense fact across blogs, a GitHub collection, and a printed dictionary.

Two things I could not resolve. The 187 sources name no version, so I cannot tell whether they caught a larger array in April or double-counted Channeling and Channelling, which are separate entries that look like a typo.

Nobody dates the individual additions and removals, Anthropic included. Bunning is the strangest survivor in the set. I found no record of when it arrived.

What I Tested

On 10 August 2026 I resolved @anthropic-ai/claude-code on the public npm registry to version 2.1.226. The published package no longer contains the CLI. It ships a wrapper and pulls a platform-specific native binary through optionalDependencies, so I fetched @anthropic-ai/claude-code-linux-x64@2.1.226 directly, a 90 MB tarball that expands to a 297 MB executable.

I searched the binary for Accomplishing, the first verb alphabetically, and found three byte offsets. Two were the string table. The third, at offset 282767567, held the array in source form alongside the function that reads it:

function l7t(){
  let t=Co().spinnerVerbs;
  if(!t) return uUa;
  if(t.mode==="replace") return t.verbs.length>0 ? t.verbs : uUa;
  return [...uUa,...t.verbs]
}

uUa is the 186-entry default array. Three behaviours fall out of four lines. append concatenates in order rather than interleaving, so custom verbs sit at the end of the pool. replace with a populated array wins outright.

replace with an empty array falls back to all 186 defaults. That is the opposite of what anyone trying to silence the spinner would expect.

I parsed the array with a regex over the decoded segment and got 186 entries, zero duplicates, two carrying accents (Flambéing, Sautéing) that a naive strings pass drops. Diffing against the republished 185-verb list produced two additions and one removal. Probing for Sparkling and Blooping returned zero matches anywhere in 297 MB.

I found the extended-thinking behaviour by accident. Searching for rubber duck to check whether the whimsical phrases survived returned nothing, but almost done thinking returned two hits. The surrounding function is a plain threshold cascade:

if(e>=45000) return "almost done thinking";
if(e>=30000) return "thinking some more";
if(e>=20000) return "thinking more";
if(e>=10000) return "still thinking";
return "thinking";
ElapsedLabel
0 to 10sthinking
10 to 20sstill thinking
20 to 30sthinking more
30 to 45sthinking some more
45s onwardalmost done thinking

The input is elapsed milliseconds. Nothing in that function reads token counts, plan state, remaining tool calls, or any signal from the model.

A user in the Claude Community group asked how Claude Code knows it is almost done. The thread filled with plausible theories about step tracking and progress estimation. It does not know. At 45 seconds the label changes, and it says the same thing at four minutes.

Reproducibility limits: one platform, one version, one point in time. Anyone can re-run this against a future release and diff the array. Nobody can re-run it against a past one, because npm serves the current native package and I have no archive of earlier builds.

Change Log

DateChange foundEvidence affectedConclusion changed?
2026-08-10Initial extraction from shipped v2.1.226All claimsInitial publication

My Judgment

My conclusion

The 185-verb list is wrong. It will keep being wrong, because it is a snapshot presented as a constant. On 10 August 2026 the shipped count was 186. Anthropic will change it again without telling anyone. Treat any spinner verb list without a version stamp as folklore.

The extended-thinking labels matter more than the verb trivia. "Almost done thinking" reads as a status report and functions as a timer. Small design choice, real cost. It trains you to trust a progress signal carrying no progress information, inside a tool where you decide whether to wait or interrupt dozens of times a day.

What builders should do

Stamp the version on anything you publish about a shipped array. Pull from the artifact rather than from another blog post. The extraction above took twenty minutes and needed no access, no account, and no permission. That is the move separating a verified claim from a repeated one, which is the argument I keep making about critical AI literacy.

If the spinner distracts you, set spinnerVerbs to {"mode": "replace", "verbs": ["Working"]} in ~/.claude/settings.json. Give it at least one verb, because an empty array restores all 186. The extended-thinking ladder ignores that setting and stays put. Users have filed a request to make it configurable.

And do not read the label as an estimate. If Claude Code says it is almost done thinking, it has been thinking for 45 seconds. That is the entire message.

What I would not trust yet

The count for platforms other than linux-x64. I extracted one build and assumed the array is shared, which is likely and unverified.

Anything about when individual verbs entered or left. The version attributions in this page come from third-party observations and one maintainer comment, not from a changelog, because Anthropic does not publish one for this array.

The 187 sources. They may have caught a real intermediate state I cannot reconstruct, and I would rather flag that than round it away.

What would change my mind

A version-stamped extraction from a different platform build showing a different count would narrow the claim to linux-x64. An Anthropic changelog for the array would date every addition and removal and retire the reconciliation table above. And if a future release feeds real progress state into the thinking labels, the stopwatch criticism stops applying, which is a change I would be glad to log.

FAQ

How many spinner verbs does Claude Code have?

The shipped v2.1.226 binary contains 186 default spinner verbs, extracted from the package on 10 August 2026. The widely republished figure of 185 traces to a single February 2026 snapshot of v2.1.42 that later posts copied without the version stamp. Set against the shipped array, that list drops Bunning and Gesticulating and keeps Evaporating, which no longer ships. Counts published elsewhere run from 52 in January 2026 to 191 in a catalogue separating active from retired entries.

What does "canoodling" mean in Claude Code?

Nothing operational. Canoodling is one of 186 gerunds drawn at random to fill the loading spinner while Claude Code works, and the word tells you nothing about the task. It sits alphabetically between Calculating and Caramelizing in the shipped array. The set mixes cerebral entries like Cogitating, culinary ones like Julienning and Flambéing, and pure whimsy like Flibbertigibbeting and Whatchamacalliting. Where the array sits in the code settles the question. Anthropic stores it as a list of display strings, nowhere near the reasoning path.

Does "almost done thinking" mean Claude is nearly finished?

No. It means 45 seconds have elapsed. The function producing the extended-thinking labels takes elapsed milliseconds as its only input, then steps through five fixed thresholds at 10, 20, 30 and 45 seconds. Anthropic feeds it no token counts, no plan progress, no remaining tool calls. At 45 seconds the label flips to "almost done thinking" and stays there indefinitely, so a four-minute run and a forty-six-second run show identical text. Read it as a stopwatch, never an estimate.

How do I change or turn off Claude Code spinner verbs?

Add a spinnerVerbs block to ~/.claude/settings.json with a mode of replace or append and a list of your own strings. The setting arrived in v2.1.23 and hot-reloads, so changes apply on the next turn without a restart. One trap sits in the resolver: replace with an empty verbs array falls back to all 186 defaults rather than silencing the spinner. Pass at least one string, such as ["Working"]. The extended-thinking labels are a separate code path and ignore this setting.

Do Claude Cowork and the Claude web app use the same spinner verbs?

No. The spinner verb array belongs to the Claude Code CLI. It lives in the CLI's own binary next to a settings resolver reading ~/.claude/settings.json, a file neither Cowork nor the web app touches. Anthropic gives the web app its own rotating loading words, which overlap in spirit and take no customisation. No shared list spans the three surfaces, so a verb count quoted for Claude Code tells you nothing about what the others display. I map the product split in my Claude guides hub.