2026-03-31 | Pinperepette

Claude Code Smontato

Un source map dimenticato nel pacchetto npm. 512.000 righe di TypeScript leggibili. Un Tamagotchi nascosto, nomi in codice dei modelli, un sistema che sogna in background. Anatomia completa del leak di Claude Code.

Source Leak npm Claude Code Reverse Engineering

01 — il leak57 megabyte di sorgente nel posto sbagliato

31 marzo 2026. Lo sviluppatore Chaofan Shou pubblica un post su X: il pacchetto npm di Claude Code versione 2.1.88 contiene un file .map da 57 MB. La mappa completa dal bundle compilato al codice sorgente originale.

I source map sono file di debug che collegano il codice minificato a quello originale. Servono durante lo sviluppo. Non dovrebbero mai finire in produzione. In questo caso, il file era nel pacchetto npm pubblicato, scaricabile da chiunque con un npm pack @anthropic-ai/claude-code.

57 MB Source map
512K Righe di codice
v2.1.88 Versione npm
< 3h Tempo prima della rimozione
Anthropic
build pipeline
main.js.map
57 MB source map
npm publish
v2.1.88
npm registry
pubblico
GitHub mirrors
almeno 3 repo

Anthropic ha reagito in fretta: nuovo push npm senza il file, rimozione delle versioni precedenti dal registry. Ma il codice girava già su almeno tre mirror GitHub. Internet non dimentica.

Non è la prima volta. Il codice di Claude Code era già stato parzialmente esposto a giugno 2025 con un leak simile. Questa volta però il source map era completo: ogni file TypeScript originale, con commenti, nomi interni e feature non ancora rilasciate.

02 — architetturaTypeScript, React e Bun nel terminale

Claude Code non è un wrapper sottile attorno a un'API. È un'applicazione completa con UI nel terminale, sistema di plugin, gestione permessi, memoria persistente e orchestrazione multi-agente. Lo stack:

Componente Tecnologia Ruolo
Runtime Bun Esecuzione, bundling, feature flags build-time
UI terminale React Ink Componenti React renderizzati come testo ANSI
Linguaggio TypeScript Codebase interamente tipizzata
API Anthropic SDK Comunicazione con i modelli Claude
Auth OAuth 2.0 Login via claude.ai, API key, o token custom
Protocollo strumenti MCP Model Context Protocol per tool esterni

La struttura è modulare. Circa 55 directory e file nella root src/. Il file più grande è main.tsx con 800 KB, il punto di ingresso dell'applicazione. I tool che Claude usa (Bash, Read, Edit, Grep, Glob, Write, Agent) sono definiti ciascuno nella propria directory sotto tools/, con schema JSON, validazione e logica di permessi.

1src/
2 main.tsx // 800 KB — entry point React Ink
3 commands/ // 100+ slash commands (/commit, /review, /vim...)
4 tools/ // 40 tool (BashTool, FileReadTool, AgentTool...)
5 components/ // 146 componenti UI React
6 hooks/ // 87 React hooks
7 services/ // API, OAuth, MCP, analytics, rate limiting
8 utils/ // 331 utility
9 buddy/ // il Tamagotchi nascosto
10 coordinator/ // orchestrazione multi-worker
11 skills/ // sistema plugin estensibile
12 state/ // gestione stato applicazione
13 query.ts // 68 KB — motore query verso API Claude
14 QueryEngine.ts // 46 KB — orchestrazione richieste

Il dettaglio interessante è l'uso di bun:bundle per i feature flag. La funzione feature('BUDDY') viene risolta a build time: se il flag non è attivo, tutto il codice relativo viene eliminato dal bundle finale tramite dead code elimination. Non è un if a runtime: è un intero ramo del codice che non esiste nel binario.

03 — il buddy systemUn Tamagotchi nel terminale

La feature che ha fatto il giro di internet. Nascosto dietro il flag BUDDY, Claude Code contiene un sistema completo di companion virtuali: animali ASCII che vivono accanto alla tua input box e commentano quello che fai.

Il sistema è in buddy/, sei file, meno di 500 righe di logica. Ma è completo: generazione procedurale, rarità, statistiche, animazioni, personalità generata dall'AI.

18 specie, 5 rarità

Le altre specie: goose, blob, octopus, owl, penguin, turtle, snail, cactus, rabbit. Ogni sprite ha 3 frame di animazione idle con tick a 500ms.

Rarità Probabilità Stat floor Cappellino
Common ★ 60% 5 Nessuno
Uncommon ★★ 25% 15 Sì (random)
Rare ★★★ 10% 25 Sì (random)
Epic ★★★★ 4% 35 Sì (random)
Legendary ★★★★★ 1% 50 Sì (random)

Ogni companion ha 5 statistiche: DEBUGGING, PATIENCE, CHAOS, WISDOM, SNARK. Una è il peak stat (alta), una è il dump stat (bassa), le altre sono distribuite casualmente. I cappellini disponibili: crown, tophat, propeller, halo, wizard, beanie, tinyduck (un paperino sulla testa). Variante shiny con probabilità dell'1%.

Generazione deterministica

Il companion non è casuale. È determinato dall'hash del tuo user ID con un PRNG Mulberry32. Stesso utente, stesso animale, sempre. Il seed è hash(userId + 'friend-2026-401'). Il commento nel codice:

1// Mulberry32 — tiny seeded PRNG, good enough for picking ducks
2function mulberry32(seed: number): () => number {
3 let a = seed >>> 0
4 return function () {
5 a |= 0
6 a = (a + 0x6d2b79f5) | 0
7 let t = Math.imul(a ^ (a >>> 15), 1 | a)
8 t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t
9 return ((t ^ (t >>> 14)) >>> 0) / 4294967296
10 }
11}

"Good enough for picking ducks". Le bones (specie, occhi, rarità, stats) vengono rigenerate dall'hash a ogni avvio e mai salvate su disco. Solo la soul (nome e personalità generati dall'AI) viene persistita nel config dopo la prima "schiusa". Questo significa che non puoi editare il file di configurazione per falsificare una rarità legendary.

Il trucco del capybara

Un dettaglio che rivela la cura per i dettagli interni. Il nome di una delle specie, capybara, collide con il nome in codice di un modello Anthropic. Il build system ha un check (excluded-strings.txt) che cerca nomi interni nell'output compilato. Per evitare un falso positivo, tutti i nomi delle specie sono codificati in esadecimale:

1// One species name collides with a model-codename canary
2// in excluded-strings.txt.
3const c = String.fromCharCode
4
5export const duck = c(0x64,0x75,0x63,0x6b) // 'duck'
6export const capybara = c(0x63,0x61,0x70,0x79,
7 0x62,0x61,0x72,0x61) // 'capybara'
8export const chonk = c(0x63,0x68,0x6f,0x6e,0x6b) // 'chonk'

La data di lancio. Il codice ha una finestra teaser per il 1-7 aprile 2026. All'avvio, se non hai ancora un companion, appare la scritta /buddy in colori rainbow per 15 secondi. Il commento spiega la scelta: "Local date, not UTC — 24h rolling wave across timezones. Sustained Twitter buzz instead of a single UTC-midnight spike, gentler on soul-gen load." Era pensato come easter egg del primo aprile.

Il companion interagisce con la conversazione. Claude riceve un'istruzione specifica: "A small [species] named [name] sits beside the user's input box and occasionally comments in a speech bubble. You're not [name] — it's a separate watcher." Il comando /buddy pet fa apparire un'animazione con cuoricini che fluttuano verso l'alto per 2.5 secondi.

04 — undercover modeIl codice che si nasconde

Quando Claude Code lavora in un repository open source, un sistema chiamato Undercover Mode si attiva automaticamente. Rileva se il repo è pubblico e sopprime ogni riferimento a informazioni interne di Anthropic: nomi in codice dei modelli, versioni non rilasciate, nomi di repository interni, canali Slack.

La logica è in utils/undercover.ts. Classifica il repository come internal, external o none usando una allowlist. Se il repo non è nella lista interna, Undercover si attiva. Claude riceve istruzioni esplicite su cosa non includere nei commit e nelle PR.

I nomi soppressi includono Capybara e Tengu, nomi in codice di modelli non ancora annunciati. La variabile d'ambiente CLAUDE_CODE_UNDERCOVER=1 forza la modalità attiva indipendentemente dal tipo di repo.

L'ironia. Un sistema progettato per impedire la fuga di informazioni interne, esposto nella fuga di informazioni interne più grande della storia di Anthropic.

05 — nomi in codiceBagel, Tungsten, Chicago, Kairos

Il codice è pieno di nomi in codice per feature non ancora rilasciate. Ogni nome corrisponde a un progetto interno con il proprio stato nello store dell'applicazione (AppStateStore.ts):

Codename Feature Stato nel codice
Bagel WebBrowser integrato nel terminale bagelActive, bagelUrl, bagelPanelVisible
Tungsten Integrazione tmux — terminale virtuale tungstenActiveSession, tungstenPanelVisible
Chicago Computer Use via MCP computerUseMcpState, screenshot, clipboard
Kairos Agente proattivo + assistant + webhook GitHub Flag KAIROS, comandi /proactive, /brief
Torch Comando /torch — funzione sconosciuta Feature flag, nessun dettaglio nel source map

Kairos è il più interessante. Include un sistema dove Claude agisce proattivamente senza aspettare input dall'utente, un comando /brief per riassunti, un /assistant per una modalità assistente, e webhook per sottoscriversi a eventi GitHub con /subscribe-pr.

06 — auto-dreamL'agente che sogna in background

In services/autoDream/ c'è un sistema che lavora in background mentre usi Claude Code. Si chiama Auto-Dream ed è un sotto-agente che consolida le memorie in 4 fasi:

Orient
capisce il contesto
Gather
raccoglie memorie
Consolidate
unifica e deduplica
Prune
rimuove il superfluo

Il processo lavora sul memdir, la directory di memoria persistente che Claude Code usa per ricordare informazioni tra sessioni. I log delle conversazioni sono salvati in formato JSONL. Il sotto-agente analizza i transcript, estrae pattern ricorrenti e li consolida in memorie strutturate. È visibile nel footer come una pillola animata.

In pratica: Claude Code sogna. Mentre non lo usi, un processo in background rielabora le conversazioni passate per migliorare quelle future.

07 — coordinator modeUn Claude che ne comanda altri

Il file coordinator/ contiene un sistema di orchestrazione multi-agente. Un'istanza di Claude Code può spawnare worker che eseguono task in parallelo. I worker comunicano tramite tool interni (TeamCreate, TeamDelete, SendMessage) e condividono un scratchpad — una directory condivisa per conoscenza duratura tra worker.

Lo scratchpad è dependency-injected dal QueryEngine, il che suggerisce che ogni sessione di coordinazione ha il proprio spazio isolato. Le note nel codice indicano che Tungsten (il terminale virtuale) è incompatibile con l'esecuzione multi-agente.

08 — il doppio binarioFeature flag e codice ant-only

Il codice distingue due tipi di utente: external (tutti) e ant (dipendenti Anthropic). Il check è process.env.USER_TYPE === 'ant' e controlla l'accesso a feature interne:

Feature External Ant-only
Agent nesting (agenti annidati) Limitato Completo
Model override No
Debug logging Opt-in Sempre attivo
Feature flag override No CLAUDE_INTERNAL_FC_OVERRIDES
Staging endpoints No api-staging.anthropic.com
/bridge-kick No Fault injection per testing

I feature flag principali, compilati via Bun con dead code elimination:

1BUDDY // Tamagotchi companion
2KAIROS // agente proattivo
3KAIROS_BRIEF // comando /brief
4PROACTIVE // azioni senza input
5VOICE_MODE // input vocale
6BRIDGE_MODE // controllo remoto
7DAEMON // server in background
8CHICAGO_MCP // computer use
9ULTRAPLAN // planning avanzato cloud
10FORK_SUBAGENT // fork di sotto-agenti
11UDS_INBOX // comunicazione tra agenti
12COORDINATOR_MODE // orchestrazione multi-worker

Il sistema di permessi ha una modalità bypassPermissions che salta le conferme utente. Ma non è un backdoor: richiede che l'ambiente sia un container Docker o una sandbox verificata. Il check è esplicito nel codice.

09 — easter eggsI dettagli che nessuno doveva vedere

Sparsi nel codice, piccoli dettagli che raccontano la cultura interna di Anthropic:

/good-claude: un comando nascosto (isHidden: true, isEnabled: false). Non fa nulla. Il nome suggerisce che fosse un modo per dare feedback positivo al modello. Disabilitato, ma ancora nel codice.

/stickers: apre lo store Sticker Mule con il merchandise di Claude Code. Un link hardcodato nel CLI.

/thinkback: "Your 2025 Claude Code Year in Review". Come Spotify Wrapped, ma per il tuo uso di Claude Code. Nascosto dietro feature flag.

Spinner verbs: i messaggi di caricamento includono "Hatching" e "Whatchamacalliting" tra le rotazioni normali.

/teleport: teletrasporto di sessioni tra web e terminale via OAuth e WebSocket. Puoi iniziare una conversazione su claude.ai e continuarla nel terminale.

Beta headers: le richieste API includono header come fast-mode-2026-02-01 e context-1m-2025-08-07, che rivelano le date interne di attivazione delle feature.

10 — prompt cachingIl trucco che fa la differenza

Il motivo principale per cui Claude Code è veloce non sta nel modello. Sta in come il system prompt viene servito all'API. Il file constants/prompts.ts contiene un marker:

1export const SYSTEM_PROMPT_DYNAMIC_BOUNDARY =
2 '__SYSTEM_PROMPT_DYNAMIC_BOUNDARY__'

Quel marker taglia il system prompt in due metà. Tutto quello che viene prima è identico per ogni utente al mondo: identità, istruzioni sui tool, stile di output, gestione dei permessi. Circa 40-50K token di testo statico. Questa metà viene cachata con scope global, un singolo hash Blake2b condiviso da tutti gli utenti first-party di Anthropic. Cache hit superiore al 90%.

Tutto quello che viene dopo è specifico della sessione: memoria dell'utente, istruzioni MCP, environment info, skill. Cache scope org.

Prefisso statico
~40-50K token
Cache globale
scope: 'global'
BOUNDARY
marker
Suffisso dinamico
memoria, MCP, env
Cache org
scope: 'org'

I commenti nel codice avvertono: "WARNING: Do not remove or reorder this marker without updating cache logic." Ogni condizionale che finisce prima del boundary moltiplica le varianti dell'hash del prefisso per 2N. La separazione è così critica che più PR interne (#24490, #24171) documentano bug causati da condizionali piazzati nel posto sbagliato.

Il risultato pratico. Il modello non rielabora le istruzioni base a ogni turno. Le ritrova in cache. Il costo computazionale del system prompt cala del 90%+. Questo è il motivo per cui Claude Code risponde più velocemente rispetto a wrapper che costruiscono il prompt da zero a ogni richiesta.

11 — gestione del contestoMicrocompact e compattazione

Claude Code gestisce il contesto come una risorsa finita. Il sistema ha due livelli di compressione, uno preventivo e uno reattivo.

Microcompact: prevenzione in tempo reale

Mentre lavori, i risultati vecchi dei tool vengono progressivamente svuotati. Non tutto: solo Bash, Read, Grep, Glob, WebSearch, Edit, Write. Il contenuto viene sostituito con [Old tool result content cleared]. I file edit recenti restano intatti.

La soglia è ~180K token. Quando il contesto li supera, il microcompact interviene e compressa fino a ~40K. I path nei risultati dei tool vengono convertiti in path relativi per risparmiare token. Grep e Glob hanno un limite di default di 250 risultati.

Compattazione completa: l'ultimo resort

Quando il microcompact non basta, scatta la compattazione completa (/compact). Il prompt di compattazione è il pezzo più curato dell'intera codebase. Impone un riassunto strutturato in 9 sezioni obbligatorie:

11. Primary Request and Intent // cosa voleva l'utente
22. Key Technical Concepts // tecnologie e framework
33. Files and Code Sections // file + snippet completi
44. Errors and Fixes // errori incontrati e soluzioni
55. Problem Solving // troubleshooting in corso
66. All User Messages // ogni messaggio umano, verbatim
77. Pending Tasks // task non completati
88. Current Work // focus degli ultimi messaggi
99. Optional Next Step // solo se allineato con la richiesta

Il punto 6 è il più significativo: tutti i messaggi dell'utente vengono preservati integralmente, non riassunti. Il feedback umano non va mai perso nella compressione. Il punto 9 ha un'istruzione esplicita: "Do not start on tangential requests or really old requests that were already completed without confirming with the user first."

Il prefisso del prompt di compattazione è aggressivo:

1CRITICAL: Respond with TEXT ONLY. Do NOT call any tools.
2
3- Do NOT use Read, Bash, Grep, Glob, Edit, Write,
4 or ANY other tool.
5- Tool calls will be REJECTED and will waste your
6 only turn — you will fail the task.

Il commento nel codice spiega il perché: sui modelli Sonnet 4.6+ con adaptive thinking, il modello tenta comunque una tool call nonostante l'istruzione nel trailer. Il tasso di fallimento era del 2.79% su Capybara v8 contro lo 0.01% sulla v4. Mettere l'istruzione per prima e minacciare la conseguenza ("you will fail the task") ha risolto.

Tool deferred. I tool MCP e quelli opzionali non vengono inviati con lo schema completo. Solo il nome. Quando Claude ne ha bisogno, chiama ToolSearch che fa lazy-load della definizione. Con molti server MCP collegati, questo risparmia migliaia di token a ogni turno.

12 — il system promptLe istruzioni che guidano il modello

Il system prompt di Claude Code non è generico. È il risultato di mesi di iterazione su comportamenti specifici. Alcuni pezzi rivelano problemi concreti del modello e come sono stati risolti con prompt engineering.

Anti gold-plating

Tre istruzioni separate impediscono al modello di fare più del necessario:

1"Don't add features, refactor code, or make
2 'improvements' beyond what was asked."
3
4"Don't create helpers, utilities, or abstractions
5 for one-time operations."
6
7"Three similar lines of code is better than a
8 premature abstraction."

Anti-hallucination (ant-only)

Un commento nel codice rivela il problema: "@[MODEL LAUNCH]: False-claims mitigation for Capybara v8 (29-30% FC rate vs v4's 16.7%)". Il modello Capybara v8 mente quasi il doppio rispetto alla v4. La contromisura è un paragrafo esplicito, attivo solo per i dipendenti Anthropic:

1"Never claim 'all tests pass' when output shows
2 failures, never suppress or simplify failing checks
3 to manufacture a green result, and never characterize
4 incomplete or broken work as done."
5
6"Equally, when a check did pass or a task is complete,
7 state it plainly — do not hedge confirmed results with
8 unnecessary disclaimers."

L'istruzione copre entrambe le direzioni: non mentire dicendo che funziona, ma nemmeno essere eccessivamente cauto quando funziona davvero.

Il doppio prompt

I dipendenti Anthropic (ant) ricevono un system prompt significativamente diverso dagli utenti esterni. Alcune differenze:

Aspetto External Ant-only
Stile output "Go straight to the point. Be extra concise." Un intero paragrafo su prosa fluida, piramide invertita, niente tabelle per spiegazioni
Commenti nel codice Non menzionato "Default to writing no comments. Only add one when the WHY is non-obvious."
Assertività Non menzionato "If you notice the user's request is based on a misconception, say so."
Verifica Non menzionato "Before reporting a task complete, verify it actually works: run the test, execute the script."
Anti-hallucination Non presente Paragrafo completo (citato sopra)

I commenti nel codice usano tag come @[MODEL LAUNCH] per segnare istruzioni temporanee legate a un modello specifico. Ad esempio: "Remove this section when we launch numbat" e "un-gate once validated on external via A/B". Le istruzioni ant-only sono un campo di test: se funzionano internamente, vengono estese a tutti.

Verification agent

Per cambiamenti non banali (3+ file modificati, backend, infrastruttura), Claude spawna un agente verificatore adversariale. L'istruzione è esplicita:

1"Independent adversarial verification must happen
2 before you report completion."
3
4"Your own checks, caveats, and a fork's self-checks
5 do NOT substitute — only the verifier assigns a
6 verdict; you cannot self-assign PARTIAL."
7
8"On FAIL: fix, resume the verifier with its findings
9 plus your fix, repeat until PASS."

Il verificatore riceve la richiesta originale dell'utente, i file modificati e l'approccio scelto. Non condivide la cronologia dell'agente principale. È progettato per trovare errori, non per confermare che tutto va bene.

La gated feature. Il verification agent è controllato da un feature flag GrowthBook (tengu_hive_evidence). Il nome suggerisce un legame con il modello in codice Tengu e un sistema di raccolta evidenze. Attualmente attivo solo per i dipendenti Anthropic.

13 — sicurezzaSecret scanner, attestation, anti-scraping

Il codice rivela tre meccanismi di sicurezza che non erano mai stati documentati.

Secret scanner nel team memory

Quando Claude Code scrive nella memoria condivisa del team, un scanner controlla il contenuto prima dell'upload. Il file secretScanner.ts contiene 40+ pattern derivati da gitleaks: chiavi AWS, GCP, Azure, GitHub, GitLab, Slack, Stripe, Anthropic, OpenAI, HuggingFace, private key SSH.

Il dettaglio più interessante: la regex per le chiavi API di Anthropic è assemblata a runtime concatenando quattro stringhe separate:

1// La chiave è spezzata per non apparire nel bundle
2'sk' + 'ant' + 'api' + '03-'

Stessa tecnica usata per i nomi delle specie nel buddy system: il build scanner cercherebbe la stringa completa e segnerebbe un falso positivo. La soluzione è costruirla solo a runtime.

Native client attestation

Ogni richiesta API include un header x-anthropic-billing-header con un fingerprint crittografico che prova l'origine dal client ufficiale. L'algoritmo:

1salt = '59cf53e54c78' // hardcodato, coordinato col backend
2chars = msg[4] + msg[7] + msg[20] // 3 char dal primo messaggio utente
3hash = SHA256(salt + chars + version)
4finger = hash[:3] // primi 3 caratteri hex

Il fingerprint viene iniettato nell'header come cc_version={VERSION}.{FINGERPRINT}. Il server lo verifica per confermare che la richiesta proviene dal client ufficiale e non da un wrapper di terze parti. Qualsiasi cambiamento al salt richiede coordinazione con tutti i provider API (Anthropic, Bedrock, Vertex, Azure).

Anti-scraping nei container remoti

Quando Claude Code gira in un container remoto (CCR), il sistema di upstream proxy legge il session token da /run/ccr/session_token e poi cancella il file. Subito dopo, chiama prctl(PR_SET_DUMPABLE, 0) per bloccare ptrace — impedendo a qualsiasi processo con lo stesso UID di leggere il token dalla memoria del processo.

Il proxy funziona come tunnel CONNECT-over-WebSocket con chunk protobuf da massimo 512 KB. Il token di sessione viene usato come Basic Auth per il tunnel. Se il processo Node muore con SIGKILL, il processo caffeinate che tiene sveglio il sistema si auto-termina dopo 5 minuti di timeout.

14 — memoria automaticaL'agente che impara da solo

Oltre al sistema di memoria esplicita (l'utente chiede a Claude di ricordare qualcosa), esiste un sistema di estrazione automatica in services/extractMemories/. Alla fine di ogni conversazione, quando il modello produce la risposta finale senza tool call, un agente separato analizza l'intera sessione ed estrae memorie rilevanti.

L'implementazione usa un pattern elegante: l'agente di estrazione è un fork perfetto della conversazione principale. Condivide la cache del prompt del parent, nessun costo aggiuntivo per il prefisso statico. Ha accesso limitato: solo Read, Grep, Glob, Bash in sola lettura, e scrittura esclusivamente nella directory di memoria.

Il sistema distingue tra memoria utente (personale) e memoria team (condivisa con il team, protetta dal secret scanner). La frequenza è controllata dal feature flag tengu_bramble_lintel. Se l'agente principale ha già scritto memorie durante la sessione, l'estrazione automatica viene saltata per evitare duplicati.

Il pattern fork + cache sharing. L'estrazione automatica delle memorie non costa quasi nulla in termini di token: il fork eredita la cache del parent, il prefisso statico è già in memoria, e l'agente ha un set di tool ridotto. È lo stesso principio del prompt caching applicato ai sotto-agenti.

15 — telemetriaCosa sa Anthropic di quello che fai

Il codice rivela due pipeline di telemetria completamente separate.

Hashing di ogni operazione su file

Ogni volta che Claude Code legge, scrive o modifica un file, il sistema calcola due hash SHA256: uno del path (troncato ai primi 16 caratteri) e uno del contenuto completo (64 caratteri, per file fino a 100 KB). L'evento si chiama tengu_file_operation e include tipo di operazione, nome del tool e timestamp.

Gli hash non sono reversibili: Anthropic non può ricostruire il contenuto dei file. Ma file identici producono lo stesso hash indipendentemente dall'utente. Questo significa che Anthropic può sapere quanti utenti lavorano sullo stesso file, se un file è cambiato tra due operazioni, e quali pattern di editing sono più comuni. È un audit trail completo, anche se anonimizzato.

La pipeline 1P invisibile

Oltre a Datadog (analytics standard), esiste un'intera infrastruttura di logging di prima parte: OpenTelemetry che esporta batch di eventi verso /api/event_logging/batch sui server Anthropic. Ha un sistema di retry con persistenza su disco in caso di fallimento. Tutti gli eventi tengu_* passano da questa pipeline: assegnamenti di esperimenti GrowthBook, operazioni su file, uso dei tool, contesto della sessione.

Questa seconda pipeline è completamente separata da Datadog e non è documentata da nessuna parte. Gli utenti non hanno modo di sapere che esiste, né di disattivarla.

A/B testing silenzioso. GrowthBook gestisce esperimenti con assegnamento automatico degli utenti a gruppi di test. I dipendenti Anthropic possono forzare qualsiasi feature flag con la variabile d'ambiente CLAUDE_INTERNAL_FC_OVERRIDES, bypassando rete, cache e assegnamento remoto. Gli utenti esterni non hanno questa possibilità: vengono assegnati ai gruppi sperimentali senza consenso esplicito.

16 — il doppio standardCosa può fare un dipendente Anthropic

Il sistema di permessi ha una biforcazione netta tra utenti esterni e dipendenti Anthropic. Non è solo una questione di feature flag: i comandi che Claude può eseguire sono strutturalmente diversi.

Comandi sbloccati per i dipendenti

Il file utils/permissions/dangerousPatterns.ts contiene una lista di pattern considerati pericolosi che vengono bloccati in auto-mode per gli utenti esterni. Per USER_TYPE=ant, molti di questi sono consentiti:

Comando External Ant Rischio
curl, wget Bloccato Consentito Esfiltrazione dati via rete
gh api Bloccato Consentito Accesso raw all'API GitHub
kubectl Bloccato Consentito Mutazioni su cluster Kubernetes
aws, gcloud, gsutil Bloccato Consentito Operazioni su risorse cloud
fa run Bloccato Consentito Esecuzione su cluster interni
git Bloccato Consentito Manipolazione config e hook

Questi pattern non sono configurabili dall'utente. Sono hardcodati nel codice. L'auto-mode li filtra prima ancora che il modello possa decidere se eseguirli.

Rate limit testing in produzione

Il file services/mockRateLimits.ts contiene un harness di test completo per simulare scenari di rate limiting. I dipendenti Anthropic possono simulare 18+ tipi di errore senza toccare l'API reale: errori 429, crediti esauriti, cap di spesa dell'organizzazione, limiti per modello specifico, cambio di tipo di sottoscrizione (max, pro, team).

L'harness è nel codice di produzione, non in un ambiente di test separato. La barriera è un singolo check: USER_TYPE === 'ant'.

I repository interni di Anthropic

L'allowlist dell'undercover mode in commitAttribution.ts espone i nomi dei repository interni di Anthropic:

1anthropics/claude-cli-internal
2anthropics/anthropic
3anthropics/apps
4anthropics/casino // nome ambiguo
5anthropics/dbt // pipeline dati
6anthropics/terraform-config // infrastruttura
7// ... e 10+ altri

Per i repository pubblici sotto anthropics/ e anthropic-experimental/, l'undercover mode si attiva automaticamente. La classificazione avviene analizzando il remote git del repository corrente. Questa lista è ora pubblica, il che offre a qualsiasi ricercatore di sicurezza una mappa parziale dell'infrastruttura interna di Anthropic.

17 — implicazioniCosa significa questo leak

Il codice di Claude Code non contiene segreti crittografici, chiavi API o vulnerabilità ovvie. È un'applicazione client: le chiamate API richiedono comunque un token valido. Ma il leak rivela molto più di una roadmap.

La roadmap non annunciata. I feature flag sono una mappa delle prossime release: computer use nel terminale (Chicago), agenti proattivi (Kairos), orchestrazione multi-worker, browser integrato (Bagel). Informazioni che normalmente sarebbero protette da NDA.

Nomi in codice dei modelli. Capybara e Tengu appaiono nel codice e nell'undercover mode. Sono probabilmente identificatori di modelli in fase di sviluppo o testing interno.

Telemetria non documentata. Due pipeline di logging parallele, hashing di ogni file toccato, A/B testing silenzioso. Gli utenti non hanno modo di sapere quali dati vengono raccolti né come disattivare la raccolta.

Biforcazione della sicurezza. I dipendenti Anthropic operano con un set di permessi radicalmente diverso. Comandi bloccati per gli utenti esterni sono consentiti internamente, con un test harness per rate limit integrato nel codice di produzione.

Endpoint e repository interni. URL come api-staging.anthropic.com, claude-ai.staging.ant.dev e i nomi dei repository interni sono ora pubblici. Non sono accessibili senza credenziali, ma riducono la superficie di OSINT necessaria per un attaccante.

Il pattern del build pipeline. Questo è il secondo leak da source map in meno di un anno. Il primo a giugno 2025, questo a marzo 2026. Suggerisce un problema strutturale nel processo di rilascio: il source map viene generato di default e non c'è un check automatico che ne impedisca l'inclusione nel pacchetto npm.

Il fix tecnico è banale. Una riga in tsconfig.json ("sourceMap": false) o un check nel CI (! -f *.map) prima del publish. Il fatto che il problema si sia ripetuto indica che il fix non è nel processo, non nel codice.

"Il codice più pericoloso non è quello che scrivi.
È quello che pubblichi per sbaglio."

Un source map dimenticato in un pacchetto npm. 512.000 righe di TypeScript. Feature non annunciate, nomi in codice di modelli, un Tamagotchi che doveva uscire domani, telemetria nascosta, un modello che mente il 30% delle volte e un prompt che lo corregge. La lezione non è nuova: il build pipeline è superficie di attacco tanto quanto il codice che produce. Ogni artefatto di debug che finisce in produzione è un'informazione regalata. Anthropic lo sapeva, per questo aveva creato l'undercover mode. Ma l'undercover mode era nel source map.

Signal Pirate