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.
build pipeline
57 MB source map
v2.1.88
pubblico
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.
| 1 | src/ |
| 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à
__
<(· )___
( ._>
`--´
/\_/\
( · ·)
( ω )
(")_(")
/^\ /^\ < · · > ( ~~ ) `-vvvv-´
.----. / · · \ | | ~`~``~`~
}~(______)~{
}~(· .. ·)~{
( .--. )
(_/ \_)
.[||]. [ · · ] [ ==== ] `------´
.-o-OO-o-. (__________) |· ·| |____|
n______n ( · · ) ( oo ) `------´
/\ /\ ( · · ) ( .. ) `------´
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 |
| 2 | function 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. |
| 3 | const c = String.fromCharCode |
| 4 | |
| 5 | export const duck = c(0x64,0x75,0x63,0x6b) // 'duck' |
| 6 | export const capybara = c(0x63,0x61,0x70,0x79, |
| 7 | 0x62,0x61,0x72,0x61) // 'capybara' |
| 8 | export 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:
capisce il contesto
raccoglie memorie
unifica e deduplica
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 | Sì |
| 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:
| 1 | BUDDY // Tamagotchi companion |
| 2 | KAIROS // agente proattivo |
| 3 | KAIROS_BRIEF // comando /brief |
| 4 | PROACTIVE // azioni senza input |
| 5 | VOICE_MODE // input vocale |
| 6 | BRIDGE_MODE // controllo remoto |
| 7 | DAEMON // server in background |
| 8 | CHICAGO_MCP // computer use |
| 9 | ULTRAPLAN // planning avanzato cloud |
| 10 | FORK_SUBAGENT // fork di sotto-agenti |
| 11 | UDS_INBOX // comunicazione tra agenti |
| 12 | COORDINATOR_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:
| 1 | export 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.
~40-50K token
scope: 'global'
marker
memoria, MCP, env
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:
| 1 | 1. Primary Request and Intent // cosa voleva l'utente |
| 2 | 2. Key Technical Concepts // tecnologie e framework |
| 3 | 3. Files and Code Sections // file + snippet completi |
| 4 | 4. Errors and Fixes // errori incontrati e soluzioni |
| 5 | 5. Problem Solving // troubleshooting in corso |
| 6 | 6. All User Messages // ogni messaggio umano, verbatim |
| 7 | 7. Pending Tasks // task non completati |
| 8 | 8. Current Work // focus degli ultimi messaggi |
| 9 | 9. 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:
| 1 | CRITICAL: 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:
| 1 | salt = '59cf53e54c78' // hardcodato, coordinato col backend |
| 2 | chars = msg[4] + msg[7] + msg[20] // 3 char dal primo messaggio utente |
| 3 | hash = SHA256(salt + chars + version) |
| 4 | finger = 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:
| 1 | anthropics/claude-cli-internal |
| 2 | anthropics/anthropic |
| 3 | anthropics/apps |
| 4 | anthropics/casino // nome ambiguo |
| 5 | anthropics/dbt // pipeline dati |
| 6 | anthropics/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.
È 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