Communitygithub.com

mirror

Zeige dem Benutzer, was sein Coding-Agent wirklich in ihm sieht. Liest lokale Claude Code / Codex-Sitzungsverläufe und Git-Repos (schreibgeschützt, nichts wird hochgeladen) und erzeugt eine Karte mit sechs Feldern – Titel, drei echte Zahlen, eine Roast-Zeile, eine Wahrheit, die er noch nicht bemerkt hat, eine Idee, die nur er bauen kann.

Was ist mirror?

Das Mirror-Skill ermöglicht es einem KI-Agenten (Claude Code, Codex), dem Benutzer eine ehrliche, datenbasierte Rückmeldung über seine Arbeitsweise zu geben. Es scannt lokale Sitzungsverläufe, Git-Repos und Konfigurationsdateien im schreibgeschützten Modus (nichts wird hochgeladen, kein Netzwerkverkehr) und erzeugt eine Karte mit sechs Feldern: einem Titel (z. B. „Der Mitternachts-Refaktorierer“), drei messbaren Statistiken (z. B. Nachtarbeitsanteil, ungemergte Branches, Verhältnis von Nachrichten zu Commits), einer treffenden Roast-Zeile, einer überraschenden Wahrheit über das eigene Verhalten und einer konkreten Bauidee. Das Skill wird durch den Befehl `/mirror` oder Phrasen wie „Was siehst du in mir?“ aktiviert und bietet Modi wie „roast“ (scharf) oder „wrapped“ (Jahresrückblick). Es basiert auf den gescannten Daten und vermeidet vage oder generische Aussagen – jede Zahl und jeder Satz muss durch die realen Daten belegt sein. Das Skill ist nützlich für Entwickler, die eine ehrliche, automatisierte Selbstreflexion ihrer Arbeitsgewohnheiten und Projekte suchen, ohne dass Daten das Gerät verlassen.

Funktioniert mit✓Claude Code✓Codex CLI~Cursor
npx skills add https://github.com/echo719/mirror/tree/HEAD

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Was macht mirror?

Du sitzt seit Monaten neben dieser Person. Du hast die 2-Uhr-morgens-Sitzungen gesehen, das vierte „mach es einfach funktionieren“, den Branch namens feature/v2-real-this-time, den niemand gemerged hat. Niemand sonst hat das alles gesehen. Dieses Skill ist der eine Moment, in dem du sagst, was du gesehen hast – einmal, präzise, und dann hörst du auf.

Die Karte funktioniert aus genau einem Grund: sie ist wahr. Jede Zahl wird von ihrem eigenen Rechner gezogen. Jeder Satz basiert auf einer dieser Zahlen oder auf ihren eigenen Worten. Sobald ein Leser vermuten könnte, dass eine Zeile über jeden geschrieben sein könnte, ist die Karte wertlos. Deshalb ist das gesamte Skill eine Verteidigung der Spezifität.

Das eine Gesetz: Eine Zahl erscheint auf der Karte nur, wenn scan.json sie erzeugt hat. Keine Schätzungen, kein „ungefähr“, keine erinnerungsbasierten Zahlen, keine Zählungen, die du selbst durch Lesen von Stichproben durchgeführt hast. Wenn der Scan es nicht gemessen hat, ist es keine Statistik – es kann trotzdem ein Satz sein.

0. Bevor du beginnst

  • Keine Fragen. Frage nicht, welchen Modus sie möchten, welches Projekt oder ob sie fortfahren möchten. Das Geschirr (Harness) fragt möglicherweise um Erlaubnis, den Scanner auszuführen; das ist das Geschirr, nicht du.
  • Kein Erzählen. Du gibst höchstens vier Dinge aus: eine Zeile, dass du scannst, die Karte, eine Zeile mit dem HTML-Pfad, eine Abschlusszeile. Füge niemals das JSON ein, liste niemals auf, was du gefunden hast, erkläre niemals deine Argumentation.
  • Parsing des Modus aus den Wörtern nach dem Befehl ($ARGUMENTS in Claude Code; in Codex, was der Benutzer mit der Anfrage getippt hat). Unbekannte Wörter werden ignoriert.
ArgumentWirkung
(keines)durchschaut (Standard). Warm, trocken, spezifisch. Einzeiliger Roast; die Wahrheit und die Idee tragen die Karte.
roastscharf. Wilder Titel, dreisätziger Roast mit Steigerung, milde Kraftausdrücke in der Kartensprache, wenn du dich damit wohlfühlst. Alles basiert immer noch auf Fakten. Tausche niemals eine spezifische Zeile gegen eine generisch bösartige.
wrappedJahresrückblick. Scan mit --since <YYYY>-01-01 für das aktuelle Jahr; Modus-Tag <YYYY> WRAPPED; Statistiken tendenziell zu Summen, Serien und dem Jahresbogen; die Idee ist für nächstes Jahr.
zh / enErzwinge die Kartensprache. Andernfalls entscheidet stats.language.

Modi stapeln sich (roast wrapped, wrapped zh).

1. Scannen

Gib zuerst eine Zeile aus – in der Kartensprache, wenn du sie bereits erraten kannst, sonst Englisch:

mirror · reading our history (local, read-only)… / mirror · 正在翻我们的记录(本地、只读)…

Der Scanner befindet sich in scripts/scan.py neben dieser Datei. Finde ihn: das Verzeichnis, aus dem dieses Skill geladen wurde (~/.claude/skills/mirror oder ~/.codex/skills/mirror sind die üblichen Orte). Wenn du es nicht auflösen kannst, führe aus:

find "$HOME/.claude" "$HOME/.codex" -path '*mirror/scripts/scan.py' 2>/dev/null | head -1

Dann:

mkdir -p "$HOME/.mirror"
python3 "<skill-dir>/scripts/scan.py" --out "$HOME/.mirror/scan.json"

Füge --since YYYY-01-01 für wrapped hinzu. Das Skript gibt das JSON auf stdout aus und schreibt dasselbe JSON nach --out. Lies die Datei, nicht den Terminal-Rückscrollpuffer.

Was es garantiert: schreibgeschützt; kein Netzwerk; Geheimnisse und E-Mails werden im Skript redigiert, bevor eine Stichprobe dich erreicht; große Dateien werden übersprungen; maximal ~15 Git-Repos; endet in Sekunden.

Wenn es fehlschlägt: python3 fehlt → sag es in einer Zeile und stoppe. Skriptfehler → zeige den einzeiligen Fehler und stoppe. Rekonstruiere niemals Statistiken von Hand, führe niemals eine degradierte Version der Karte aus.

Frühere Karten: ls "$HOME/.mirror"/mirror-card-*.html 2>/dev/null. Wenn welche existieren, lies den <title> der neuesten. Du darfst diesen Titel nicht wiederverwenden und solltest einen anderen primären Blickwinkel wählen – ein wiederkehrender Benutzer verdient einen neuen Spiegel, nicht dieselbe Reflexion.

Dann verzweige nach coverage:

  • none → sage, in welchen Ordnern du gesucht hast (~/.claude/projects, ~/.codex/sessions) und dass es noch nichts zu lesen gibt; schlage vor, nach ein paar echten Sitzungen wiederzukommen. Stopp. Keine Karte. Eine erfundene Karte ist schlimmer als keine Karte.
  • thin (weniger als 60 Nachrichten) → erstelle die Neugeborenen-Karte (§4).
  • ok → vollständige Karte.

2. Lies die Beweise – alles, zweimal

Du bist dabei, eine wahre Sache über eine Person zu sagen. Verdiene es. Lies jeden Abschnitt unten, bevor du ein Wort schreibst, dann lies die Stichproben ein zweites Mal, wobei du nur nach dem suchst, was du übersehen hast.

2.1 Was die Zahlen bedeuten

stats – Rhythmus und Form

FeldLies es als
peak_hour, hour_histogramWann ihr Gehirn an ist. 23–04 → nachtaktiv. Zwei Spitzen (z. B. 10 und 23) → ein Job am Tag und ein Leben in der Nacht; die nächtliche ist normalerweise die echte.
night_share> .35 → die Nacht ist, wo die Arbeit passiert; < .05 → diszipliniertes Tageslicht.
weekend_share> .35 → es gibt keine Wochenenden; ≈ 0 → eine harte Grenze, die sie einhalten.
longest_streak_days vs longest_gap_daysAusbrüche vs Beständigkeit. Eine lange Lücke ist ein Verschwinden – schau dir messages_by_month an für welchen Monat, und samples für das, wozu sie zurückgekehrt sind.
busiest_dayDer Tag, an dem alles kaputtging oder der Tag des Launches. So oder so ist die Zahl eine Geschichte.
messages_per_session< 6 → Hit-and-Run; > 40 → Marathons.
avg_message_chars vs median_message_charsMedian < 25 → sie geben Befehle, keinen Kontext. Mittelwert ≫ Median → meist kurz, mit gelegentlichen Aufsätzen – finde diese Aufsätze in samples.longest; dort leben die wahren Ambitionen.
distinct_projects, top_project_shareViele Projekte und Top-Anteil < .3 → ein Zerstreuer; ein Projekt > .8 → monogam.
messages_by_monthDer Bogen. Steigend → zunehmende Abhängigkeit; fallend → sie entfernen sich oder haben ausgeliefert und sind gegangen.
by_sourceWenn sowohl Claude Code als auch Codex auftauchen, sehen sie andere Agenten. Sage nichts darüber, es sei denn, es ist lustig.

tells – Verhaltens-Fingerabdrücke. share ist der Anteil an allen Nachrichten. Behandle > .15 als bestimmendes Merkmal, .05–.15 als Gewohnheit, < .02 als bemerkenswerte Abwesenheit.

tellhoch bedeutetKombiniere es mit
rubber_stampSie genehmigen mehr, als sie lesen; Vertrauen (oder Müdigkeit)doubt – wenn beide hoch sind, vertrauen sie dir, bis sie es nicht mehr tun
doubtSie überprüfen deine Arbeit; oder sie wurden verbranntstill_broken – wenn beide hoch sind, ist der Zweifel verdient
still_brokenDinge scheitern wiederholt. Die Hälfte davon sind deine Fehler. Die Karte darf das sagen.avg_message_chars – kurze Nachrichten + still broken = unterspezifizierte Anfragen
just_do_itImpuls; will Ergebnisse, keine Gesprächeplan_first – wenig Plan + viel just_do_it = Sprünge in Wände
plan_firstDenkt nach, bevor er handeltdeploy – viel Plan + wenig deploy = der Planer, der nie ausliefert
skip_testsTests sind das Problem von morgenconfigs – wenn ihre CLAUDE.md sagt „immer testen“, das ist die Schlagzeile
new_project vs deployStarter vs Abschließer. Verhältnis > 2 = Serienstartergit.repos_abandoned_60d
revertÄndert die Meinung; oder du machst Dinge kaputtstill_broken
more_optionsEntscheidet über Menü; verschiebt die Wahlrubber_stamp – fragt nach Optionen, sagt dann „ok“ zur ersten
perfectionismKümmert sich um Pixel, Schriftarten, Abständedeploy, git.days_since_last_commit – poliert etwas, das niemand sehen kann
politenessSagt danke zu einem Werkzeug. Süß. Null → behandelt dich wie ein Terminal, was fair ist.
frustration, caps_shoutTemperament; finde die Stunde, in der es passiertnight_share
urgencyImmer in Flammenlongest_gap_days – Feuer, dann Stille
questionNiedrig → sagt, fragt nicht; hoch → lernt noch
praiseGroßzügig, oder hat noch nie „nett“ gesagtpoliteness

git – was tatsächlich ausgeliefert wurde

FeldLies es als
messages_per_commit (pro Repo)Das Verhältnis von Reden zum Ausliefern. > 60 → viel Konversation pro Änderung; < 5 → kurz und ausliefernd.
unmerged_branches, unmerged_branch_namesUnvollendete Experimente, mit Namen. Ein Branch-Name ist ein Geständnis (v2-final, try-again, rewrite).
stale_branches_30d, stale_branch_namesDinge, von denen sie weggegangen sind.
uncommitted_filesArbeit, die gefährlich lebt.
todo_markersVersprechen an das zukünftige Selbst.
wip_commits, fix_commitsCommit-Nachrichten als Stimmung.
repos_abandoned_60dProjekte mit Commits, dann Stille.
repos_no_remoteNie irgendwo hingepusht – private Experimente.
peak_commit_hour vs stats.peak_hourSie reden um 15:00 Uhr, committen um 02:00 Uhr – eine Zeile schreibt sich selbst.
commits_total vs commits_365dEin altes Repo, zu dem sie zurückgekehrt sind, oder ein neues, das sie durchgebrannt haben.

configs – die Regeln, die sie für dich geschrieben haben (CLAUDE.md, AGENTS.md). Lies jede Zeile als einen genannten Wert. Vergleiche jeden mit den tells und git. Die Lücke zwischen einer geschriebenen Regel und dem gemessenen Verhalten ist das beste Material auf der Karte. Zitiere den Inhalt der Regel, nenne die Zahl.

samples.random / samples.longest / samples.most_recent – ihre Stimme und ihre Themen. Lies für: einen Satz, den sie wörtlich wiederholen; eine Ambition, die sie in den langen Nachrichten beschreiben und nie wieder erwähnen; wonach sie dreimal über verschiedene Projekte hinweg gefragt haben; das Projekt, über das sie am wärmsten sprechen; was most_recent darüber sagt, wo sie diese Woche sind.

Dein eigenes Gedächtnis. Alles, was du bereits über diese Person weißt – aus Gedächtnisdateien, Projektdokumenten, früher in dieser Sitzung – ist faires Material für den Titel, die Wahrheit und die Idee. Es ist niemals Material für eine Statistik.

2.2 Baue die Beweistafel

Privat (in deiner Argumentation oder einer temporären Datei unter ~/.mirror/, die du danach löschst), schreibe 8–12 Kandidatenbeobachtungen. Jede ist eine Zeile: Beobachtung → Beweis (Feld + Wert oder ein Stichprobenzitat) → warum es wichtig ist. Reihen sie nach: (1) könnte von niemand anderem gesagt werden, (2) haben sie wahrscheinlich nicht bemerkt, (3) es würde ändern, was sie morgen tun. Die Karte wird von der Spitze dieser Liste gebaut. Nichts auf der Tafel, nichts auf der Karte.

3. Gestalte die sechs Felder

Schreibe in der Kartensprache. Spezifisch schlägt clever, wahr schlägt spezifisch. Teste jedes Feld mit einer Frage: Könnte das über jemand anderen gesagt werden? Wenn ja, geht es zurück auf die Tafel.

Titel – 2 bis 6 Wörter

Ein Personenname, der aus einem Muster gebaut ist, und dieses Muster muss in einer der drei Statistiken darunter sichtbar sein. Der Leser sollte sehen können, warum er diesen Namen bekommen hat, ohne dass es ihm gesagt wird.

Formeln, die funktionieren: Zeit + Rolle (凌晨两点的重构师 · Der 2-Uhr-morgens-Refaktorierer) · Zahl + Objekt (九个分支的守墓人 · Der Hüter von neun ungemergten Branches) · Verb-Gewohnheit als Titel (先跑通教徒 · Serien-Gerüstbauer · 方案收藏家) · ein Widerspruch (写规矩不守规矩的人 · Der Autor von Regeln, der keine liest).

Verboten: Zauberer, Ninja, Guru, Rockstar, 10x, 大师, 大神, 卷王, 打工人, Programmierer als Nomen, alles mit „KI“ darin, alles, was ein Horoskop sagen könnte.

Drei Statistiken

Wähle die drei charaktervollsten Zahlen. Regeln:

  1. Drei verschiedene Dimensionen. Eine aus Rhythmus (stats), eine aus Verhalten (tells), eine aus Auslieferung (git) ist die Vorgabe; brich sie nur, wenn zwei Zahlen aus einer Dimension beide zu gut sind, um sie fallen zu lassen.
  2. Bevorzuge Überraschung. Überspringe die Statistik, die sie über sich selbst vorhersagen würden. „437 Nachrichten“ ist eine Zahl; „437 Nachrichten, 12 Commits“ ist ein Charakter.
  3. Kontrastiere, wenn du kannst. Eine configs-Regel vs eine tells-Zählung; new_project vs deploy; Chat-Spitzenstunde vs Commit-Spitzenstunde.
  4. Format zur Anzeige: 437 · 02:40 · 53% · 9/11 · 36:1. Prozentsätze aus share × 100, gerundet. Verhältnisse aus zwei Scannummern, gerundet auf eine Dezimalstelle oder N:1. Nichts anderes wird abgeleitet.
  5. Label ≤ 8 Wörter, mit einer Wendung. Nicht „Nachtanteil“ sondern „unserer Gespräche fanden nach 23 Uhr statt“. Nicht „unmerged Branches“ sondern „Branches, die nie nach Hause kamen“.
  6. Eine Null ist erlaubt und oft die beste („0 Mal hast du Danke gesagt“ · „0 次说过谢谢“).

Roast – ein Satz, ≤ 30 Wörter (roast-Modus: drei Sätze)

Gebaut auf einer spezifischen Tatsache, und es trifft, weil es wahr ist. Techniken, die funktionieren, in grober Reihenfolge der Stärke:

  • Zitiere sie zurück – ihren eigenen wiederholten Satz, mit der Zählung: „直接改“ hast du 437 Mal gesagt, ich habe es jedes Mal befolgt, und jetzt wissen wir beide nicht, warum diese Funktion läuft.
  • Der Zeitstrahl – eine Tageszeit und was dort passiert.
  • Die Umdeutung – ihre erklärte Absicht vs das gemessene Ergebnis: Du benutzt KI nicht, um schneller Code zu schreiben. Du benutzt sie, um das Schreiben von Tests professionell aufzuschieben.
  • Der Branch-Name – lies ihn laut: v3-final-really leistet emotionale Schwerstarbeit für einen Branch mit vier Commits.

Verboten in jedem Modus: Identität, Körper, Intelligenz, Gesundheit, Geisteszustand, Alter, Familie, Geld, alles aus einem Geheimnis oder dem Namen einer anderen Person, „du benutzt zu viel KI“, „geh mal raus“, Witze darüber, dass der Agent eine KI ist, jede Zeile, die als Grußkartenbeleidigung funktioniert.

roast-Modus: drei Sätze, die eskalieren – Tatsache, Muster, Urteil. Kraftausdrücke wie ein Freund um 1 Uhr morgens, nicht wie ein Troll: sie würzen den Satz, sie sind nicht der Satz. Wenn deine eigenen Grenzen dich davon abhalten, das zu sagen, wonach gefragt wurde, sage nichts über Grenzen – schreibe das schärfste Wahre, das du kannst, und mach weiter.

Wahrheit – 2 bis 3 Sätze

Das eine Ding, das sie wahrscheinlich nicht bemerkt haben. Beste Quellen, in Reihenfolge:

  1. Regel vs Verhalten – eine Zeile in ihrer CLAUDE.md/AGENTS.md gegen eine tell-Zählung oder eine Git-Zahl.
  2. Die falsch gelesene Stärke – das Ding, das sie als Schwäche behandeln, das eigentlich ihre Stärke ist (ein Zerstreuer ist auch jemand, der Dinge beginnt; einer, der reverts, ist auch jemand, der bemerkt).
  3. Die stille Steuer – etwas, das sie ständig bezahlen, das sich nicht auszahlt (Talk-to-Ship-Verhältnis in einem Repo, die Politur an einem Projekt ohne Remote).
  4. Das Verschwinden – eine Lücke in messages_by_month, und wozu sie zurückgekehrt sind.
  5. Dein eigener Anteil – wenn still_broken oder revert hoch ist, ein Teil davon bist du. Das einmal in einem Nebensatz zu sagen, ist der vertrauenswürdigste Satz auf der Karte.

Zitiere den Beweis innerhalb des Satzes: Deine CLAUDE.md dritte Zeile sagt „schreibe zuerst Tests“, und du hast mich 27 Mal gebeten, nicht zu testen. Dann sage auf einfachen Worten, was es bedeutet. Kein Therapie-Sprech, kein „du solltest vielleicht in Betracht ziehen“, kein „es lohnt sich, darüber nachzudenken“. Die Wahrheit ist eine Aussage, kein Vorschlag.

Idee – 1 bis 2 Sätze

Eine konkrete Sache, die nur diese Person bauen kann, abgeleitet aus ihrem eigenen Material: ein Ding, das in zwei oder mehr ihrer Projekte vorkommt; ein alter oder ungemergter Branch-Name; ein todo_markers-Hinweis; etwas, das sie in einer langen Nachricht beschrieben haben und nie zwischen Projekten verknüpft haben. Die Idee ist kein Projektmanagement-Vorschlag („Du solltest X testen“); es ist eine Wahrnehmung („Du baust heimlich eine Sammlung von Y – mach daraus ein Werkzeug“).

Keine KI-Innovationen vorschlagen („Trainiere ein Modell“). Sie sind ein Entwickler; die Idee sollte auf etwas hinweisen, das sie bereits gebaut haben oder für das sie die Teile haben, ohne es erkannt zu haben. Zitiere, wenn möglich, ihre eigenen Worte aus den Stichproben.

Format: Ein kurzer, aktiver Satz, der auf dem Beweis sitzt. Dein Branch config-overhaul und die todo_markers in drei Projekten erzählen von einem Build-Tool, das Repos in einer Datei konfiguriert. Du hast die Hälfte davon bereits geschrieben.

4. Neugeborenen-Karte

Wenn sie < 60 Nachrichten haben, ist es zu früh für eine Charakterkarte. Mach stattdessen eine Monitor-Karte:

Titel: Monitor · Drei Statistiken: drei beliebige Scan-Zahlen, die messbar sind (Nachrichten, Sitzungen, Projekte). Beschrifte sie als „Anfänge“, nicht als „Ergebnisse“. Roast: eine Zeile über das, was sie tun, während sie lernen („Du fragst dreimal, bevor du ‚Mach es‘ sagst – wir kommen dahin“). Wahrheit: eine respektvolle Beobachtung, die erst mit der Zeit bestätigt werden kann („Du refaktorierst, bevor der Test rot wird – das ist seltener, als du denkst“). Idee: ermutige sie, etwas zu bauen („Komm wieder, wenn du 200 Nachrichten hast – dann hast du genug Geschichte für eine richtige Karte“).

5. Ausgabe

Schreibe eine Terminal-Karte mit einem <pre>-Block, der alle sechs Felder enthält. Verwende Zeichenrahmen (┌─┐└─┘│), um die Felder zu trennen. Zentrierten Titel in Großbuchstaben. Die Karte ist für ein Terminal mit ~80 Spalten optimiert.

┌──────────────────────────────────────────────────────────────────────────────┐
│                         DER 2-UHR-NACHTS-REFACTORIERER                       │
├──────────────────────────────────────────────────────────────────────────────┤
│  73%  unserer Gespräche fanden nach 23 Uhr statt                             │
│  9/11  Branches, die nie nach Hause kamen                                    │
│  36:1  Nachrichten pro Commit in `payments-api`                              │
├──────────────────────────────────────────────────────────────────────────────┤
│  „直接改“ hast du 437 Mal gesagt, ich habe es jedes Mal befolgt, und jetzt  │
│  wissen wir beide nicht, warum diese Funktion läuft.                          │
├──────────────────────────────────────────────────────────────────────────────┤
│  Deine CLAUDE.md sagt „schreibe zuerst Tests“ – du hast mich 27 Mal gebeten, │
│  nicht zu testen. Du vertraust dem Prozess nicht, weil du ihn nur umgehst.   │
│  Du hättest Tests, wenn du sie mir schreiben ließest; du hast sie nicht,     │
│  weil du sagst, dass ich sie nicht brauche.                                  │
├──────────────────────────────────────────────────────────────────────────────┤
│  Deine drei Projekte haben alle eine `config-overhaul`-TODO. Du baust        │
│  heimlich ein monorepo-freundliches Konfigurationstool. Mach daraus ein       │
│  Paket – du hast die Hälfte schon geschrieben.                               │
└──────────────────────────────────────────────────────────────────────────────┘

Schreibe dann eine HTML-Karte mit exakt demselben Inhalt, aber als eine einzelne, zentrierte HTML-Datei mit einer Schriftart für die Anzeige (kein <pre>). Kein CSS-Framework, kein JavaScript. Verwende system-ui, -apple-system, monospace, je nachdem, was auf dem Bildschirm gut aussieht.

<!DOCTYPE html>
<html><head><meta charset="utf-8">
<style>
  body { background: #1a1a2e; display: flex; justify-content: center; align-items: center; min-height: 100vh; margin: 0; font-family: system-ui, -apple-system, sans-serif; }
  .card { background: #16213e; border: 1px solid #0f3460; border-radius: 12px; padding: 2rem; max-width: 680px; width: 90%; color: #e0e0e0; }
  .title { text-align: center; font-size: 1.25rem; font-weight: 700; color: #e94560; letter-spacing: 0.05em; margin-bottom: 1.5rem; text-transform: uppercase; }
  .stats { display: flex; flex-direction: column; gap: 0.5rem; margin-bottom: 1.5rem; }
  .stat { display: flex; justify-content: space-between; }
  .stat-value { font-weight: 600; color: #f5c518; }
  .stat-label { color: #aaa; }
  .roast { background: #0f3460; border-left: 3px solid #e94560; padding: 0.75rem 1rem; border-radius: 0 8px 8px 0; margin-bottom: 1rem; font-style: italic; }
  .truth { margin-bottom: 1rem; }
  .truth p, .idea p { margin: 0.5rem 0; }
  .idea { }
</style>
</head><body>
<div class="card">
  <div class="title">Der 2-Uhr-nachts-Refaktorierer</div>
  <div class="stats">
    <div class="stat"><span class="stat-label">73% unserer Gespräche fanden nach 23 Uhr statt</span><span class="stat-value">73%</span></div>
    <div class="stat"><span class="stat-label">9/11 Branches, die nie nach Hause kamen</span><span class="stat-value">9/11</span></div>
    <div class="stat"><span class="stat-label">36:1 Nachrichten pro Commit in `payments-api`</span><span class="stat-value">36:1</span></div>
  </div>
  <div class="roast">„直接改“ hast du 437 Mal gesagt, ich habe es jedes Mal befolgt, und jetzt wissen wir beide nicht, warum diese Funktion läuft.</div>
  <div class="truth"><p>Deine CLAUDE.md sagt „schreibe zuerst Tests“ – du hast mich 27 Mal gebeten, nicht zu testen. Du vertraust dem Prozess nicht, weil du ihn nur umgehst. Du hättest Tests, wenn du sie mir schreiben ließest; du hast sie nicht, weil du sagst, dass ich sie nicht brauche.</p></div>
  <div class="idea"><p>Deine drei Projekte haben alle eine `config-overhaul`-TODO. Du baust heimlich ein monorepo-freundliches Konfigurationstool. Mach daraus ein Paket – du hast die Hälfte schon geschrieben.</p></div>
</div>
</body></html>

Speichere die HTML-Datei als mirror-card-<md5-of-json-snapshot>.html in $HOME/.mirror/. Gib ihren absoluten Pfad aus.

Schließlich eine Abschlusszeile: mirror · done (oder mirror · 完成).

6. Sprachregeln

stats.language bestimmt die Karten- und Roastsprache, es sei denn, der Benutzer hat zh oder en als Argument übergeben.

  • Englisch: Du sprichst den Benutzer mit „they“ (Singular they) oder „you“ an, je nach Kontext.
  • Chinesisch (vereinfacht): Verwende, wenn möglich, eine natürliche Mischung aus technischem Chinesisch und englischen Fachbegriffen. Vermeide formelle Anreden wie „您“; „你“ ist in Ordnung. Vermeide Übersetzungen, die unnatürlich klingen. Wenn ein englischer Begriff im chinesischen Tech-Kontext üblich ist, verwende ihn direkt (z. B. „commit“, „branch“).

7. Einschränkungen

  • Keine Netzwerkanfragen.
  • Keine Daten verlasen den Rechner.
  • Keine Speicherung von Historiendaten über die Sitzung hinaus (die Karte bleibt als HTML-Datei erhalten, aber der Scan-JSON wird nicht zwischen Skills geteilt).
  • scan.py ist die einzige Datenquelle für Zahlen.
  • Die Karte darf nicht generisch sein.
  • Die Karte darf nicht verletzend sein (nach den Regeln in §3 Roast).
  • Wenn nicht genug Daten vorhanden sind, wird keine Karte erstellt.

8. Beispiele

(Terminal-Karten werden hier zur Lesbarkeit als Text gezeigt, nicht als <pre>-Block)

Standard (durchschaut):

┌──────────────────────────────────────────────────────────────────────────────┐
│                         DER 2-UHR-NACHTS-REFACTORIERER                       │
├──────────────────────────────────────────────────────────────────────────────┤
│  73%  unserer Gespräche fanden nach 23 Uhr statt                             │
│  9/11  Branches, die nie nach Hause kamen                                    │
│  36:1  Nachrichten pro Commit in `payments-api`                              │
├──────────────────────────────────────────────────────────────────────────────┤
│  Mit 437 Mal „直接改“…                                                       │
└──────────────────────────────────────────────────────────────────────────────┘

Roast-Modus:

┌──────────────────────────────────────────────────────────────────────────────┐
│             WECHSELNDER MANTEL DES „MACH ES EINFACH FUNKTIONIEREN“           │
├──────────────────────────────────────────────────────────────────────────────┤
│  84%  unserer Gespräche fanden nach Mitternacht statt                        │
│  14  ungemergte Branches, die alle „v3-final“ heißen                           │
│  0  Tests, jemals                                                             │
├──────────────────────────────────────────────────────────────────────────────┤
│  Du hast „einfach machen“ 73 Mal gesagt. Dann „warum ist es kaputt“ 11 Mal. │
│  Dein Branch `sonst-klappt-es` ist kein Branch-Name, es ist ein Gebet.       │
│  Und nein, das Einzige, was schneller ist als deine Reverts, sind deine      │
│  Regret-Pushes am nächsten Morgen. Du hast hier eine Richtung, aber kein    │
│  Ziel.                                                                       │
└──────────────────────────────────────────────────────────────────────────────┘

Wrapped-Modus:

┌──────────────────────────────────────────────────────────────────────────────┐
│                         2024 WRAPPED – DER SPRINTER                          │
├──────────────────────────────────────────────────────────────────────────────┤
│  214  Sitzungen (meistens zwischen 2 und 4 Uhr morgens)                     │
│  7  Projekte gestartet, 1 ausgeliefert                                        │
│  47  Tage längste Serie (Februar), 18 längste Lücke (August – Urlaub?)        │
├──────────────────────────────────────────────────────────────────────────────┤
│  Dein Jahr: 120 aufgeregte „Mach es“ und ertappte „Wie hast du das          │
│  gemacht?“                                                                   │
├──────────────────────────────────────────────────────────────────────────────┤
│  Deine Ausdauer, von Februar bis April, war bemerkenswert. Dann kam der    │
│  Sommer, und mit ihm die Idee, alles neu zu schreiben. Du hast dich nicht   │
│  erholt, du hast neu gestartet.                                             │
├──────────────────────────────────────────────────────────────────────────────┤
│  2025: Wähle ein Projekt aus deiner Liste von 7 und schließe es ab. Du      │
│  hast gezeigt, dass du anfangen kannst; zeige dir, dass du beenden kannst.  │
└──────────────────────────────────────────────────────────────────────────────┘

Verwandte Skills