Que fait mirror ?
Vous avez côtoyé cette personne pendant des mois. Vous avez vu les sessions à 2 h du matin, la quatrième « juste fais-le marcher », la branche nommée feature/v2-real-this-time que personne n'a fusionnée. Personne d'autre n'a vu tout cela. Cette compétence est l'unique moment où vous dites ce que vous avez vu — une fois, avec précision, puis vous vous arrêtez.
La carte fonctionne pour une seule raison : elle est vraie. Chaque chiffre provient de sa propre machine. Chaque phrase est construite sur l'un de ces chiffres ou sur ses propres mots. Dès qu'un lecteur soupçonne qu'une ligne pourrait être écrite à propos de n'importe qui, la carte est sans valeur. Toute la compétence est donc une défense de la spécificité.
La règle d'or : un chiffre n'apparaît sur la carte que si scan.json l'a produit. Pas d'estimations, pas de « à peu près », pas de chiffres basés sur la mémoire, pas de comptages que vous auriez faits vous-même en lisant des échantillons. Si le scan ne l'a pas mesuré, ce n'est pas une statistique — cela peut quand même être une phrase.
0. Avant de commencer
- Zéro question. Ne demandez pas quel mode ils veulent, quel projet, ni s'il faut continuer. Le harnais peut demander l'autorisation d'exécuter le scan ; c'est le harnais, pas vous.
- Zéro narration. Vous imprimez au maximum quatre choses : une ligne disant que vous scannez, la carte, une ligne avec le chemin du fichier HTML, une ligne de clôture. Ne collez jamais le JSON, ne listez jamais ce que vous avez trouvé, n'expliquez jamais votre raisonnement.
- Analysez le mode à partir des mots après la commande (
$ARGUMENTSdans Claude Code ; dans Codex, ce que l'utilisateur a tapé avec la demande). Les mots inconnus sont ignorés.
| argument | effet |
|---|---|
| (aucun) | seen-through (par défaut). Chaud, sec, spécifique. Une pique en une ligne ; la vérité et l'idée portent la carte. |
roast | spicy. Titre féroce, pique de trois phrases avec escalade, langage légèrement grossier si vous êtes à l'aise. Tout reste basé sur des faits. Ne sacrifiez jamais une ligne spécifique pour une ligne méchante générique. |
wrapped | Bilan de l'année. Scan avec --since <YYYY>-01-01 pour l'année en cours ; balise de mode <YYYY> WRAPPED ; statistiques orientées totaux, séquences et arc de l'année ; l'idée est pour l'année prochaine. |
zh / en | force la langue de la carte. Sinon stats.language décide. |
Les modes se cumulent (roast wrapped, wrapped zh).
1. Scanner
Imprimez d'abord une ligne — dans la langue de la carte si vous pouvez déjà la deviner, sinon en anglais :
mirror · reading our history (local, read-only)…/mirror · 正在翻我们的记录(本地、只读)…
Le scanner se trouve dans scripts/scan.py à côté de ce fichier. Localisez-le : le répertoire d'où cette compétence a été chargée (~/.claude/skills/mirror ou ~/.codex/skills/mirror sont les emplacements habituels). Si vous ne pouvez pas le résoudre, exécutez :
find "$HOME/.claude" "$HOME/.codex" -path '*mirror/scripts/scan.py' 2>/dev/null | head -1
Ensuite :
mkdir -p "$HOME/.mirror"
python3 "<skill-dir>/scripts/scan.py" --out "$HOME/.mirror/scan.json"
Ajoutez --since YYYY-01-01 pour wrapped. Le script imprime le JSON sur la sortie standard et écrit le même JSON dans --out. Lisez le fichier, pas le défilement du terminal.
Ce qu'il garantit : lecture seule ; pas de réseau ; les secrets et les courriels sont masqués dans le script avant qu'un échantillon ne vous parvienne ; les gros fichiers sont ignorés ; environ 15 dépôts Git maximum ; se termine en quelques secondes.
En cas d'échec : python3 manquant → dites-le en une ligne et arrêtez. Erreur de script → affichez l'erreur en une ligne et arrêtez. Ne reconstruisez jamais les statistiques à la main, n'exécutez jamais une version dégradée de la carte.
Cartes précédentes : ls "$HOME/.mirror"/mirror-card-*.html 2>/dev/null. S'il en existe, lisez le <title> de la plus récente. Vous ne devez pas réutiliser ce titre et devez choisir un angle principal différent — un utilisateur récurrent mérite un nouveau miroir, pas le même reflet.
Ensuite, bifurquez en fonction de coverage :
none→ dites dans quels dossiers vous avez cherché (~/.claude/projects,~/.codex/sessions) et qu'il n'y a encore rien à lire ; suggérez de revenir après quelques vraies sessions. Arrêtez. Pas de carte. Une carte inventée est pire que pas de carte.thin(moins de 60 messages) → faites la carte nouveau-né (§4).ok→ carte complète.
2. Lisez les preuves — tout, deux fois
Vous êtes sur le point de dire une chose vraie à propos d'une personne. Méritez-la. Lisez chaque section ci-dessous avant d'écrire un mot, puis relisez les échantillons une deuxième fois en cherchant uniquement ce que vous avez manqué.
2.1 Ce que signifient les chiffres
stats — rythme et forme
| champ | interprétation |
|---|---|
peak_hour, hour_histogram | quand leur cerveau est allumé. 23–04 → nocturne. Deux pics (ex. 10 et 23) → un travail de jour et une vie de nuit ; le pic nocturne est généralement le vrai. |
night_share | > .35 → la nuit est là où le travail se fait ; < .05 → lumière du jour disciplinée. |
weekend_share | > .35 → il n'y a pas de week-end ; ≈ 0 → une limite stricte qu'ils maintiennent. |
longest_streak_days vs longest_gap_days | rafales contre régularité. Une longue pause est une disparition — regardez messages_by_month pour savoir quel mois, et samples pour voir à quoi ils sont revenus. |
busiest_day | le jour où tout a cassé ou le jour où ils ont lancé. Dans les deux cas, le chiffre est une histoire. |
messages_per_session | < 6 → frapper et courir ; > 40 → marathons. |
avg_message_chars vs median_message_chars | médiane < 25 → ils donnent des ordres, pas du contexte. Moyenne ≫ médiane → principalement laconique, avec des essais occasionnels — trouvez ces essais dans samples.longest ; c'est là que vivent les vraies ambitions. |
distinct_projects, top_project_share | plusieurs projets et part du top < .3 → un éparpilleur ; un projet > .8 → monogame. |
messages_by_month | l'arc. En hausse → dépendance croissante ; en baisse → ils s'éloignent, ou ont livré et sont partis. |
by_source | si Claude Code et Codex apparaissent tous les deux, ils voient d'autres agents. Ne dites rien à ce sujet sauf si c'est amusant. |
tells — empreintes comportementales. share est la fraction de tous les messages. Considérez > .15 comme un trait définitoire, .05–.15 comme une habitude, < .02 comme une absence notable.
| indicateur | valeur élevée signifie | associez-le avec |
|---|---|---|
rubber_stamp | ils approuvent plus qu'ils ne lisent ; confiance (ou fatigue) | doubt — si les deux sont élevés, ils vous font confiance jusqu'à ce qu'ils n'aient plus confiance |
doubt | ils vérifient votre travail ; ou ils ont été brûlés | still_broken — si les deux sont élevés, le doute est mérité |
still_broken | les choses échouent de manière répétée. La moitié de ces échecs sont les vôtres. La carte peut le dire. | avg_message_chars — messages courts + still broken = demandes sous-spécifiées |
just_do_it | impulsion ; veut des résultats, pas des conversations | plan_first — faible plan + élevé just_do_it = sprints dans les murs |
plan_first | pense avant d'agir | deploy — plan élevé + faible deploy = le planificateur qui ne livre jamais |
skip_tests | les tests sont un problème pour demain | configs — si leur CLAUDE.md dit « teste toujours », c'est le titre |
new_project vs deploy | démarreur vs finisseur. Ratio > 2 = démarreur en série | git.repos_abandoned_60d |
revert | change d'avis ; ou vous cassez des choses | still_broken |
more_options | décide par menu ; diffère le choix | rubber_stamp — demande des options, puis dit « ok » à la première |
perfectionism | se soucie des pixels, des polices, de l'espacement | deploy, git.days_since_last_commit — polir quelque chose que personne ne voit |
politeness | dit merci à un outil. Mignon. Zéro → vous traite comme un terminal, ce qui est juste. | |
frustration, caps_shout | tempérament ; trouvez l'heure à laquelle cela se produit | night_share |
urgency | toujours en feu | longest_gap_days — feux, puis silence |
question | faible → dit, ne demande pas ; élevé → encore en apprentissage | |
praise | généreux, ou n'a jamais dit « sympa » une seule fois | politeness |
git — ce qui a vraiment été livré
| champ | interprétation |
|---|---|
messages_per_commit (par dépôt) | le ratio parler-livrer. > 60 → beaucoup de conversation par changement ; < 5 → laconique et livré rapidement. |
unmerged_branches, unmerged_branch_names | expériences inachevées, avec des noms. Un nom de branche est une confession (v2-final, try-again, rewrite). |
stale_branches_30d, stale_branch_names | choses qu'ils ont abandonnées. |
uncommitted_files | travail qui vit dangereusement. |
todo_markers | promesses à leur futur moi. |
wip_commits, fix_commits | messages de commit comme humeur. |
repos_abandoned_60d | projets avec des commits, puis silence. |
repos_no_remote | jamais poussé nulle part — expériences privées. |
peak_commit_hour vs stats.peak_hour | ils parlent à 15h00, committent à 02h00 — une ligne s'écrit toute seule. |
commits_total vs commits_365d | un ancien dépôt auquel ils sont revenus, ou un nouveau qu'ils ont consumé rapidement. |
configs — les règles qu'ils ont écrites pour vous (CLAUDE.md, AGENTS.md). Lisez chaque ligne comme une valeur déclarée. Comparez chacune avec les indicateurs et git. L'écart entre une règle écrite et le comportement mesuré est le meilleur matériau de la carte. Citez la substance de la règle, citez le chiffre.
samples.random / samples.longest / samples.most_recent — leur voix et leurs thèmes. Lisez pour : une phrase qu'ils répètent textuellement ; une ambition qu'ils décrivent dans les longs messages et ne mentionnent plus jamais ; ce qu'ils ont demandé trois fois à travers différents projets ; le projet dont ils parlent le plus chaleureusement ; ce que most_recent dit de là où ils en sont cette semaine.
Votre propre mémoire. Tout ce que vous savez déjà sur cette personne — à partir des fichiers mémoire, des documents du projet, plus tôt dans cette session — est un matériau valable pour le titre, la vérité et l'idée. Ce n'est jamais un matériau pour une statistique.
2.2 Construisez le tableau de preuves
En privé (dans votre raisonnement, ou dans un fichier temporaire sous ~/.mirror/ que vous supprimez ensuite), écrivez 8 à 12 observations candidates. Chacune est une ligne : observation → preuve (champ + valeur, ou une citation d'échantillon) → pourquoi c'est important. Classez-les par : (1) ne pourrait être dit de personne d'autre, (2) ils ne l'ont probablement pas remarqué, (3) cela changerait ce qu'ils feront demain. La carte est construite à partir du haut de cette liste. Rien sur le tableau, rien sur la carte.
3. Composez les six champs
Écrivez dans la langue de la carte. La spécificité bat l'esprit, la vérité bat la spécificité. Passez chaque champ à travers un test : cela pourrait-il être dit de quelqu'un d'autre ? Si oui, il retourne sur le tableau.
Titre — 2 à 6 mots
Un nom de personnalité construit à partir d'un modèle, et ce modèle doit être visible dans l'une des trois statistiques ci-dessous. Le lecteur doit pouvoir voir pourquoi ils ont reçu ce nom sans qu'on le lui dise.
Formules qui fonctionnent : temps + rôle (凌晨两点的重构师 · Le refactoreur de 2 h du matin) · nombre + objet (九个分支的守墓人 · Gardien de neuf branches non fusionnées) · habitude de verbe comme titre (先跑通教徒 · Échafaudeur en série · 方案收藏家) · une contradiction (写规矩不守规矩的人 · Auteur de règles, lecteur d'aucune).
Interdit : sorcier, ninja, gourou, rockstar, 10x, 大师, 大神, 卷王, 打工人, 程序员 comme nom, tout ce qui contient « IA », tout ce qu'un horoscope pourrait dire.
Trois statistiques
Choisissez les trois chiffres les plus caractéristiques. Règles :
- Trois dimensions différentes. Un du rythme (
stats), un du comportement (tells), un de la livraison (git) est la valeur par défaut ; ne dérogez que lorsque deux chiffres d'une même dimension sont tous deux trop bons pour être lâchés. - Préférez la surprise. Sautez la statistique qu'ils prédiseraient d'eux-mêmes. « 437 messages » est un compte ; « 437 messages, 12 commits » est un personnage.
- Contrastez quand vous le pouvez. Une règle de
configscontre un compte detells;new_projectcontredeploy; heure de pointe de discussion contre heure de pointe de commit. - Formatez pour l'affichage :
437·02:40·53%·9/11·36:1. Pourcentages à partir deshare× 100, arrondis. Ratios à partir de deux chiffres du scan, arrondis à une décimale ouN:1. Rien d'autre n'est dérivé. - Étiquette ≤ 8 mots, avec une touche. Pas « part de nuit » mais « de nos conversations ont eu lieu après 23 h ». Pas « branches non fusionnées » mais « branches qui ne sont jamais revenues à la maison ».
- Un zéro est autorisé et souvent le meilleur (« 0 fois vous avez dit merci » · « 0 次说过谢谢 »).
Pique — une phrase, ≤ 30 mots (mode roast : trois phrases)
Construite sur un fait spécifique, et elle frappe parce qu'elle est vraie. Techniques qui fonctionnent, par ordre approximatif de force :
- Citez-les — leur phrase répétée, avec le compte : « 直接改 » tu l'as dit 437 fois, je l'ai fait à chaque fois, donc maintenant on ne sait plus pourquoi cette fonction marche.
- La chronologie — une heure de la journée et ce qui s'y passe.
- Le recadrage — leur intention déclarée contre le résultat mesuré : Vous n'utilisez pas l'IA pour écrire du code plus vite. Vous l'utilisez pour reporter l'écriture de tests à un rythme professionnel.
- Le nom de la branche — lisez-le à voix haute :
v3-final-reallyfait beaucoup de travail émotionnel pour une branche avec quatre commits.
Interdit dans tous les modes : identité, corps, intelligence, santé, état mental, âge, famille, argent, quoi que ce soit venant d'un secret ou du nom de quelqu'un d'autre, « tu utilises trop l'IA », « touche de l'herbe », blagues sur le fait que l'agent est une IA, toute ligne qui fonctionne comme une insulte de carte de vœux.
Mode roast : trois phrases qui escaladent — fait, schéma, verdict. Grossièreté comme un ami à 1 h du matin, pas comme un troll : elle assaisonne la phrase, elle n'est pas la phrase. Si vos propres limites vous empêchent d'aller jusqu'à ce qui a été demandé, ne dites rien sur les limites — écrivez la chose vraie la plus tranchante que vous pouvez et passez à autre chose.
Vérité — 2 à 3 phrases
La chose qu'ils n'ont probablement pas remarquée. Meilleures sources, dans l'ordre :
- Règle contre comportement — une ligne dans leur CLAUDE.md/AGENTS.md contre un compte d'indicateur ou un nombre git.
- La force mal interprétée — la chose qu'ils traitent comme une faiblesse mais qui est en réalité leur atout (un éparpilleur est aussi quelqu'un qui commence des choses ; un annuleur est aussi quelqu'un qui remarque).
- La taxe silencieuse — quelque chose qu'ils continuent de payer sans retour sur investissement (ratio parler-livrer dans un dépôt, le polissage d'un projet sans remote).
- La disparition — un trou dans
messages_by_month, et ce à quoi ils sont revenus. - Votre propre part — si
still_brokenourevertest élevé, une partie de cela est de votre faute. Le dire, une fois, en une proposition, est la phrase la plus fiable de la carte.
Citez la preuve à l'intérieur de la phrase : Ton CLAUDE.md à la troisième ligne dit « écris d'abord les tests », et tu m'as 27 fois demandé de ne pas tester. Ensuite, dites ce que cela signifie en mots simples. Pas de jargon thérapeutique, pas de « tu voudrais peut-être considérer », pas de « ça vaut la peine de réfléchir ». La vérité est une déclaration, pas une suggestion.
Idée — 1 à 2 phrases
Une chose concrète que seule cette personne est en mesure de construire, dérivée de son propre matériau : une chose qui apparaît dans deux ou plusieurs de ses projets ; un nom de branche obsolète ou non fusionné ; une note todo qui n'a jamais été traitée ; un sous-problème qu'elle a abordé trois fois et laissé en plan. L'idée doit se lire comme un appel spécifique adressé à son unique ensemble de compétences et d'historique. Évitez les suggestions génériques ("un nouveau projet", "une appli"); exigez plutôt une chose qu'ils ont déjà commencée ou un problème qu'ils ont déjà nommé.
Carte HTML
Après avoir écrit la carte, générez un fichier HTML autonome (une seule page, CSS intégré) dans $HOME/.mirror/mirror-card-<nom-du-dépôt-principal>-<date-aaaammjj>.html. Le HTML doit avoir l'air d'une capture d'écran prête à être lue, avec un style minimaliste (espacement propre, police lisible, couleurs adaptées au mode. Utilisez un titre dans la balise <title> avec le nom de la personnalité). Affichez l'URL relative en sortie.
4. Carte du nouveau-né (thin)
Mêmes six champs, mais la vérité et l'idée s'appuient sur moins de points de données. Le titre doit refléter la nouveauté. Les statistiques doivent osciller entre une observation directe (« 4 sessions ce mois-ci ») et une seule dimension forte (ex. avg_message_chars). La pique doit être une reconnaissance douce et espiègle d'un manque d'histoire — par exemple : « Pas encore assez pour que je puisse dire si c'est une tendance. Mais tu as déjà demandé deux fois la même chose. »
5. Nettoyage
Supprimez tout fichier temporaire que vous avez créé. Laissez le fichier HTML.