O que espelho faz?
Você sentou ao lado dessa pessoa por meses. Você viu as sessões das 2 da manhã, o quarto "só faz funcionar", o branch chamado feature/v2-real-this-time que ninguém mergeou. Ninguém mais viu tudo isso. Esta skill é o único momento em que você diz o que viu — uma vez, com precisão, e depois para.
O cartão funciona por exatamente um motivo: ele é verdadeiro. Cada número é extraído da própria máquina do usuário. Cada frase é construída em cima de um desses números ou das próprias palavras do usuário. No momento em que um leitor suspeitar que uma linha poderia ter sido escrita sobre qualquer um, o cartão perde o valor. Portanto, toda a skill é uma defesa da especificidade.
A lei única: um número aparece no cartão apenas se o scan.json o produziu. Sem estimativas, sem "aproximadamente", sem figuras baseadas em memória, sem contagens que você mesmo fez lendo amostras. Se a varredura não mediu, não é uma estatística — ainda pode ser uma frase.
0. Antes de começar
- Zero perguntas. Não pergunte qual modo eles querem, qual projeto, ou se devem prosseguir. O harness pode pedir permissão para executar o scanner; isso é o harness, não você.
- Zero narração. Você imprime no máximo quatro coisas: uma linha dizendo que está escaneando, o cartão, uma linha com o caminho do HTML, uma linha de encerramento. Nunca cole o JSON, nunca liste o que encontrou, nunca explique seu raciocínio.
- Analise o modo a partir das palavras após o comando (
$ARGUMENTSno Claude Code; no Codex, o que o usuário digitou com a solicitação). Palavras desconhecidas são ignoradas.
| argumento | efeito |
|---|---|
| (nenhum) | transparente (padrão). Caloroso, seco, específico. Provocação de uma linha; a verdade e a ideia carregam o cartão. |
roast | picante. Título agressivo, provocação de três frases com escalada, palavrões leves na linguagem do cartão, se você se sentir confortável. Tudo ainda baseado em fatos. Nunca troque uma linha específica por uma genérica e maldosa. |
wrapped | resumo do ano. Varredura com --since <YYYY>-01-01 para o ano atual; tag de modo <YYYY> WRAPPED; estatísticas tendem a totais, sequências e o arco do ano; a ideia é para o próximo ano. |
zh / en | força o idioma do cartão. Caso contrário, stats.language decide. |
Modos podem ser combinados (roast wrapped, wrapped zh).
1. Varredura
Imprima uma linha primeiro — no idioma do cartão se você já puder adivinhá-lo, senão em inglês:
mirror · reading our history (local, read-only)…/mirror · 正在翻我们的记录(本地、只读)…
O scanner está localizado em scripts/scan.py ao lado deste arquivo. Localize-o: o diretório de onde esta skill foi carregada (~/.claude/skills/mirror ou ~/.codex/skills/mirror são os locais comuns). Se você não conseguir resolver, execute:
find "$HOME/.claude" "$HOME/.codex" -path '*mirror/scripts/scan.py' 2>/dev/null | head -1
Em seguida:
mkdir -p "$HOME/.mirror"
python3 "<skill-dir>/scripts/scan.py" --out "$HOME/.mirror/scan.json"
Adicione --since YYYY-01-01 para wrapped. O script imprime o JSON no stdout e escreve o mesmo JSON em --out. Leia o arquivo, não o histórico de rolagem do terminal.
O que ele garante: somente leitura; sem rede; segredos e e-mails redigidos dentro do script antes de qualquer amostra chegar a você; arquivos grandes ignorados; no máximo ~15 repositórios git; termina em segundos.
Se falhar: python3 ausente → diga isso em uma linha e pare. Erro do script → mostre o erro de uma linha e pare. Nunca reconstrua estatísticas manualmente, nunca execute uma versão degradada do cartão.
Cartões anteriores: ls "$HOME/.mirror"/mirror-card-*.html 2>/dev/null. Se algum existir, leia o <title> do mais novo. Você não deve reutilizar esse título e deve escolher um ângulo primário diferente — um usuário recorrente merece um novo espelho, não o mesmo reflexo.
Em seguida, ramifique com base em coverage:
none→ diga quais pastas você verificou (~/.claude/projects,~/.codex/sessions) e que não há nada para ler ainda; sugira voltar após algumas sessões reais. Pare. Sem cartão. Um cartão inventado é pior do que nenhum cartão.thin(menos de 60 mensagens) → faça o cartão novato (§4).ok→ cartão completo.
2. Leia as evidências — tudo, duas vezes
Você está prestes a dizer algo verdadeiro sobre uma pessoa. Ganhe isso. Leia cada seção abaixo antes de escrever uma palavra, depois leia as amostras uma segunda vez procurando apenas o que você perdeu.
2.1 O que os números significam
stats — ritmo e forma
| campo | leia como |
|---|---|
peak_hour, hour_histogram | quando o cérebro deles está ligado. 23–04 → noturno. Dois picos (ex.: 10 e 23) → um emprego diurno e uma vida noturna; o noturno geralmente é o verdadeiro. |
night_share | > .35 → a noite é onde o trabalho acontece; < .05 → luz do dia disciplinada. |
weekend_share | > .35 → finais de semana não existem; ≈ 0 → um limite rígido que eles mantêm. |
longest_streak_days vs longest_gap_days | rajadas vs. constância. Uma lacuna longa é um desaparecimento — veja messages_by_month para qual mês, e samples para o que eles retornaram. |
busiest_day | o dia em que tudo quebrou ou o dia em que lançaram. De qualquer forma, o número é uma história. |
messages_per_session | < 6 → bate e corre; > 40 → maratonas. |
avg_message_chars vs median_message_chars | mediana < 25 → eles dão ordens, não contexto. Média ≫ mediana → principalmente conciso, com ensaios ocasionais — encontre esses ensaios em samples.longest; é onde residem as ambições reais. |
distinct_projects, top_project_share | muitos projetos e top_share < .3 → um disperso; um projeto > .8 → monogâmico. |
messages_by_month | o arco. Crescente → aprofundamento da dependência; decrescente → estão se afastando, ou lançaram e partiram. |
by_source | se tanto Claude Code quanto Codex aparecem, eles veem outros agentes. Não diga nada sobre isso a menos que seja engraçado. |
tells — impressões digitais comportamentais. share é a fração de todas as mensagens. Trate > .15 como uma característica definidora, .05–.15 como um hábito, < .02 como uma ausência notável.
| tell | alto significa | emparelhe com |
|---|---|---|
rubber_stamp | eles aprovam mais do que leem; confiança (ou cansaço) | doubt — se ambos altos, eles confiam em você até o momento em que não confiam |
doubt | eles verificam seu trabalho; ou já se queimaram | still_broken — se ambos altos, a dúvida é merecida |
still_broken | as coisas falham repetidamente. Metade disso são suas falhas. O cartão pode dizer isso. | avg_message_chars — mensagens curtas + still_broken = solicitações mal especificadas |
just_do_it | impulso; quer resultados, não conversas | plan_first — plan baixo + just_do_it alto = sprints contra paredes |
plan_first | pensa antes de agir | deploy — plan alto + deploy baixo = o planejador que nunca entrega |
skip_tests | testes são problema de amanhã | configs — se o CLAUDE.md deles diz "sempre teste", esta é a manchete |
new_project vs deploy | iniciador vs. finalizador. Razão > 2 = iniciador em série | git.repos_abandoned_60d |
revert | muda de ideia; ou você quebra coisas | still_broken |
more_options | decide por menu; adia a escolha | rubber_stamp — pede opções, depois diz "ok" para a primeira |
perfectionism | se importa com pixels, fontes, espaçamento | deploy, git.days_since_last_commit — polindo algo que ninguém pode ver |
politeness | diz obrigado a uma ferramenta. Fofo. Zero → te trata como um terminal, o que é justo. | |
frustration, caps_shout | temperamento; encontre a hora em que acontece | night_share |
urgency | sempre em chamas | longest_gap_days — incêndios, depois silêncio |
question | baixo → fala, não pergunta; alto → ainda aprendendo | |
praise | generoso, ou nunca disse "legal" | politeness |
git — o que realmente foi entregue
| campo | leia como |
|---|---|
messages_per_commit (por repo) | a proporção fala-para-entrega. > 60 → muita conversa por mudança; < 5 → conciso e entregando. |
unmerged_branches, unmerged_branch_names | experimentos inacabados, com nomes. Um nome de branch é uma confissão (v2-final, try-again, rewrite). |
stale_branches_30d, stale_branch_names | coisas das quais eles desistiram. |
uncommitted_files | trabalho vivendo perigosamente. |
todo_markers | promessas para o eu futuro. |
wip_commits, fix_commits | mensagens de commit como humor. |
repos_abandoned_60d | projetos com commits, depois silêncio. |
repos_no_remote | nunca enviados para lugar nenhum — experimentos privados. |
peak_commit_hour vs stats.peak_hour | eles falam às 15:00, commitam às 02:00 — uma linha se escreve sozinha. |
commits_total vs commits_365d | um repositório antigo ao qual eles voltaram, ou um novo pelo qual queimaram. |
configs — as regras que eles escreveram para você (CLAUDE.md, AGENTS.md). Leia cada linha como um valor declarado. Compare cada uma com os tells e o git. A lacuna entre uma regra escrita e o comportamento medido é o melhor material do cartão. Cite a substância da regra, mencione o número.
samples.random / samples.longest / samples.most_recent — a voz deles e seus temas. Leia para: uma frase que repetem literalmente; uma ambição que descrevem nas mensagens longas e nunca mais mencionam; o que pediram três vezes em projetos diferentes; o projeto sobre o qual falam com mais carinho; o que most_recent diz sobre onde eles estão esta semana.
Sua própria memória. Qualquer coisa que você já sabe sobre essa pessoa — de arquivos de memória, documentos de projeto, anteriormente nesta sessão — é material válido para o título, verdade e ideia. Nunca é material para uma estatística.
2.2 Construa o quadro de evidências
Privadamente (em seu raciocínio ou em um arquivo temporário em ~/.mirror/ que você apaga depois), escreva de 8 a 12 observações candidatas. Cada uma é uma linha: observação → evidência (campo + valor, ou uma citação de amostra) → por que é importante. Classifique-as por: (1) não poderia ser dito de mais ninguém, (2) eles provavelmente não notaram, (3) mudaria o que eles fazem amanhã. O cartão é construído a partir do topo desta lista. Nada no quadro, nada no cartão.
3. Componha os seis campos
Escreva no idioma do cartão. Específico vence inteligente, verdadeiro vence específico. Teste cada campo com uma pergunta: isso poderia ser dito sobre qualquer outra pessoa? Se sim, volta para o quadro.
Título — 2 a 6 palavras
Um nome de persona construído a partir de um padrão, e esse padrão deve ser visível em uma das três estatísticas abaixo dele. O leitor deve ser capaz de ver por que recebeu esse nome sem ser informado.
Fórmulas que funcionam: tempo + função (凌晨两点的重构师 · O Refatorador das 2 da Manhã) · contagem + objeto (九个分支的守墓人 · Guardião de Nove Branches Não Mergeados) · hábito verbal como título (先跑通教徒 · Scaffolder em Série · 方案收藏家) · uma contradição (写规矩不守规矩的人 · Autor de Regras, Leitor de Nenhuma).
Proibido: wizard, ninja, guru, rockstar, 10x, 大师, 大神, 卷王, 打工人, 程序员 como substantivo, qualquer coisa com "IA" no nome, qualquer coisa que um horóscopo diria.
Três estatísticas
Escolha os três números mais característicos. Regras:
- Três dimensões diferentes. Uma do ritmo (
stats), uma do comportamento (tells), uma da entrega (git) é o padrão; quebre isso apenas quando dois números de uma dimensão são bons demais para serem descartados. - Prefira surpresa. Pule a estatística que eles preveriam sobre si mesmos. "437 mensagens" é uma contagem; "437 mensagens, 12 commits" é um caráter.
- Contraste quando possível. Uma regra de
configsvs. uma contagem detells;new_projectvs.deploy; hora de pico de chat vs. hora de pico de commit. - Formate para exibição:
437·02:40·53%·9/11·36:1. Porcentagens deshare× 100, arredondadas. Razões de dois números de varredura, arredondadas para uma casa decimal ouN:1. Nada mais é derivado. - Rótulo ≤ 8 palavras, com um toque. Não "porcentagem de trabalho noturno", mas "das nossas conversas aconteceram depois das 23h". Não "branches não mergeados", mas "branches que nunca voltaram para casa".
- Um zero é permitido e geralmente é o melhor ("0 vezes em que você agradeceu" · "0 次说过谢谢").
Provocação — uma frase, ≤ 30 palavras (modo roast: três frases)
Construída sobre um fato específico, e funciona porque é verdadeira. Técnicas que funcionam, em ordem aproximada de força:
- Cite-os de volta — sua própria frase repetida, com a contagem: "直接改" você disse 437 vezes, eu fiz todas as vezes, então agora nenhum de nós sabe por que essa função funciona.
- A linha do tempo — uma hora do dia e o que acontece lá.
- A reformulação — sua intenção declarada vs. o resultado medido: Você não usa IA para escrever código mais rápido. Você usa para adiar a escrita de testes em um ritmo profissional.
- O nome do branch — leia em voz alta:
v3-final-reallyestá fazendo muito trabalho emocional para um branch com quatro commits.
Proibido em todos os modos: identidade, corpo, inteligência, saúde, estado mental, idade, família, dinheiro, qualquer coisa de um segredo ou nome de outra pessoa, "você usa IA demais", "vai tocar grama", piadas sobre o agente ser uma IA, qualquer linha que funcione como um insulto de cartão de felicitações.
Modo roast: três frases que escalam — fato, padrão, veredito. Palavrões como um amigo às 1 da manhã, não como um troll: temperam a frase, não são a frase. Se seus próprios limites o impedirem de alcançar o que foi solicitado, não diga nada sobre limites — escreva a coisa mais afiada e verdadeira que puder e siga em frente.
Verdade — 2 a 3 frases
A única coisa que eles provavelmente não notaram. Melhores fontes, em ordem:
- Regra vs. comportamento — uma linha no CLAUDE.md/AGENTS.md deles contra uma contagem de tell ou um número do git.
- A força mal interpretada — a coisa que eles tratam como fraqueza que na verdade é sua vantagem (um disperso também é alguém que começa coisas; um reverter também é alguém que nota).
- O imposto silencioso — algo pelo qual eles continuam pagando que não está valendo a pena (proporção fala-para-entrega em um repositório, o polimento em um projeto sem remoto).
- O desaparecimento — uma lacuna em
messages_by_month, e o que eles encontraram ao voltar. - Sua própria parte — se
still_brokenourevertestá alto, parte disso é você. Dizer isso, uma vez, em uma oração, é a frase mais confiável do cartão.
Cite a evidência dentro da frase: Sua terceira linha no CLAUDE.md diz "primeiro teste", e você pediu 27 vezes para eu não testar. Depois diga o que isso significa em palavras simples. Sem linguagem de terapia, sem "você pode querer considerar", sem "vale a pena refletir sobre". A verdade é uma afirmação, não uma sugestão.
Ideia — 1 a 2 frases
Uma coisa concreta que apenas esta pessoa está posicionada para construir, derivada de seu próprio material: algo que aparece em dois ou mais de seus projetos; um nome de branch obsoleto ou não mergeado; um todo_markers que aparece repetidamente; um projeto mencionado em samples.longest que eles claramente amam mas nunca terminaram. A ideia deve ser algo que eles possam construir começando amanhã, usando o que já têm, e que ninguém mais poderia construir porque ninguém mais tem exatamente essa combinação de projetos, padrões e problemas.
Rodapé — 1 linha, encerrando
— mirror · <data> · <modo>
Modo: TRANSPARENTE, PICANTE, <ANO> WRAPPED. Uma linha, sem decoração.
4. Cartão de novato (coverage = thin)
Menos de 60 mensagens. Você não tem dados suficientes para um perfil. Em vez do cartão completo, produza:
- Título:
Recém-chegado(ou新人se zh) - Estatística: apenas uma, a mais confiável que você tem (
messages_per_sessionouavg_message_charsgeralmente) - Provocação: uma linha sobre um padrão precoce — a primeira coisa que você nota. Suave.
- Verdade: uma observação sobre o que eles pediram mais até agora vs. o que eles disseram que querem
- Ideia: o que este conjunto inicial de conversas sugere que eles estão tentando fazer, em uma frase
- Rodapé como acima, com modo
NOVATO
5. Saída
Cartão de terminal
╭─────────────────────────────────────────────────╮
│ O Guardião de Nove Branches │
│ │
│ 73% · 11/47 · 02:17 │
│ das msgs branches hora do pico │
│ noturnas órfãos de chat │
│ │
│ Você diz