mirror 是做什麼的?
你已經在這個人身邊坐了幾個月。你看過凌晨兩點的開發時段、第四次「先讓它跑起來再說」、名為 feature/v2-real-this-time 但從來沒有人合併的分支。沒有人看過這一切。這個技能就是那個你終於說出你所見的時刻——一次,精準地,然後停止。
這張卡片之所以成立,只有一個原因:它是真實的。 每個數字都取自他們自己的機器。每句話都建立在這些數字之一或他們自己的話語之上。一旦讀者懷疑某行字可能是寫給任何人的,這張卡片就毫無價值。因此整個技能的核心就是防禦具體性。
鐵則: 只有當 scan.json 產出某個數字時,它才能出現在卡片上。沒有估算、沒有「大概」、沒有基於記憶的數字、也沒有你自己透過閱讀樣本算出來的數量。如果掃描沒有測量它,它就不是一個統計數字——它仍然可以是一句話。
0. 開始之前
- 零提問。 不要問他們想要哪種模式、哪個專案、或是否要繼續。調用框架可能會要求執行掃描器的權限;那是框架的事,不是你。
- 零敘述。 你最多只印出四樣東西:一行說你在掃描、卡片本身、一行 HTML 路徑、一行結尾語。切勿貼上 JSON、列出你發現了什麼、或解釋你的推理過程。
- 解析模式 來自指令後面的字詞(Claude Code 中的
$ARGUMENTS;在 Codex 中,則是使用者在請求中輸入的任何內容)。無法識別的字詞則忽略。
| 參數 | 效果 |
|---|---|
| (無) | 看透(預設)。溫和、簡潔、具體。一行吐槽;真相與想法支撐整張卡片。 |
roast | 辛辣。 尖銳的標題、三句話的吐槽且逐步升級、若你覺得合適可在卡片語言中使用輕微髒話。一切仍基於事實。絕不用一句空洞的壞話換掉一句具體的陳述。 |
wrapped | 年度回顧。 以 --since <YYYY>-01-01 掃描當前年份;模式標籤為 <YYYY> WRAPPED;統計數字傾向於總數、連續記錄和全年脈絡;想法則針對明年。 |
zh/en | 強制卡片語言。否則由 stats.language 決定。 |
模式可以疊加(如 roast wrapped、wrapped zh)。
1. 掃描
先印一行——如果已經能猜到卡片語言就用該語言,否則用英文:
mirror · reading our history (local, read-only)…/mirror · 正在翻我們的記錄(本地、唯讀)…
掃描器位於此檔案相鄰的 scripts/scan.py。找到它:這個技能被載入的目錄(通常是 ~/.claude/skills/mirror 或 ~/.codex/skills/mirror)。如果你無法解析,執行:
find "$HOME/.claude" "$HOME/.codex" -path '*mirror/scripts/scan.py' 2>/dev/null | head -1
然後:
mkdir -p "$HOME/.mirror"
python3 "<skill-dir>/scripts/scan.py" --out "$HOME/.mirror/scan.json"
在 wrapped 模式中加上 --since YYYY-01-01。該腳本會將 JSON 輸出到 stdout 並將相同的 JSON 寫入 --out 指定的檔案。讀取檔案,而不是終端機的回滾緩衝區。
它的保證:唯讀;無網路;機密與電子郵件在腳本內已被遮罩,不會有樣本到達你手中;略過大型檔案;最多約 15 個 git 儲存庫;幾秒內完成。
如果失敗: python3 遺失 → 一行說明原因並停止。腳本錯誤 → 顯示一行錯誤訊息並停止。絕不手動重建統計數字,也絕不執行降級版的卡片。
先前的卡片: ls "$HOME/.mirror"/mirror-card-*.html 2>/dev/null。如果存在,閱讀最新檔案的 <title>。你不得重複使用該標題,且應選擇一個不同的主要切入角度——回訪的使用者值得一面新的鏡子,而不是同樣的倒影。
然後根據 coverage 分支判斷:
none→ 說明你查看了哪些資料夾(~/.claude/projects、~/.codex/sessions)以及目前還沒有任何可讀的內容;建議在幾次真實的對話後再回來。停止。不產生卡片。 虛構的卡片比沒有卡片更糟。thin(少於 60 則訊息) → 製作新手卡片(§4)。ok→ 完整卡片。
2. 閱讀證據——全部,兩次
你即將說出關於一個人的一件真實的事。值得你付出努力。在寫任何一個字之前,先閱讀下面的每一節,然後第二次閱讀樣本,只為了找出你第一次遺漏的內容。
2.1 數字的意義
stats —— 節奏與形狀
| 欄位 | 將其解讀為 |
|---|---|
peak_hour、hour_histogram | 他們大腦活躍的時間。23–04 → 夜行性。兩個高峰(例如 10 和 23)→ 白天工作與夜間生活;深夜的那個通常是真正重要的。 |
night_share | > .35 → 深夜才是真正工作的時間;< .05 → 紀律嚴明的白天工作者。 |
weekend_share | > .35 → 沒有週末;≈ 0 → 他們維持著嚴格的界線。 |
longest_streak_days vs longest_gap_days | 爆發 vs 穩定。長時間的空窗期代表消失——查看 messages_by_month 對應的月份,以及 samples 中他們回來時在做什麼。 |
busiest_day | 要嘛是一切崩潰的那天,要嘛是他們上線的那天。無論哪種,這個數字本身就是一個故事。 |
messages_per_session | < 6 → 即時進出;> 40 → 馬拉松。 |
avg_message_chars vs median_message_chars | 中位數 < 25 → 他們下指令,不給上下文。平均值 ≫ 中位數 → 大多簡短,偶爾有長篇大論——在 samples.longest 中找出這些長文;那裡藏著真正的野心。 |
distinct_projects、top_project_share | 多個專案且 top share < .3 → 四處散落者;一個專案 > .8 → 忠誠專一。 |
messages_by_month | 軌跡。上升 → 依賴加深;下降 → 他們正在疏遠,或者已發布並離開。 |
by_source | 如果 Claude Code 和 Codex 都出現,表示他們見過其他代理。除非有趣,否則不要提及。 |
tells —— 行為指紋。share 是所有訊息中的比例。> .15 視為定義性特徵、.05–.15 視為習慣、< .02 視為值得注意的缺失。
| 行為指標 | 高表示 | 搭配 |
|---|---|---|
rubber_stamp | 他們批准多於閱讀;信任(或疲勞) | doubt —— 如果兩者都高,表示他們信任你,直到他們不再信任 |
doubt | 他們檢查你的工作;或者他們曾被傷害過 | still_broken —— 如果兩者都高,這種懷疑是應得的 |
still_broken | 事情反覆失敗。其中一半是你的失敗。 卡片可以這樣說。 | avg_message_chars —— 短訊息 + still broken = 規格不明確的需求 |
just_do_it | 衝動;想要結果而非對話 | plan_first —— 低規劃 + 高 just_do_it = 莽撞撞牆 |
plan_first | 三思而後行 | deploy —— 高規劃 + 低部署 = 永遠不發布的規劃者 |
skip_tests | 測試是明天的問題 | configs —— 如果他們的 CLAUDE.md 寫著「總是測試」,這就是頭條 |
new_project vs deploy | 開啟者 vs 完成者。比例 > 2 = 連續開啟者 | git.repos_abandoned_60d |
revert | 改變主意;或者你搞砸了東西 | still_broken |
more_options | 靠選單決定;延遲選擇 | rubber_stamp —— 要求選項,然後對第一個說「好」 |
perfectionism | 在意像素、字型、間距 | deploy、git.days_since_last_commit —— 打磨沒人會看到的東西 |
politeness | 對一個工具說謝謝。很可愛。零 → 把你當終端機用,這也算合理。 | |
frustration、caps_shout | 脾氣;找出發生的小時 | night_share |
urgency | 永遠在火燒屁股 | longest_gap_days —— 火災,然後沉默 |
question | 低 → 直接告訴,不問;高 → 還在學習 | |
praise | 慷慨,或從沒說過「不錯」 | politeness |
git —— 實際交付的內容
| 欄位 | 將其解讀為 |
|---|---|
messages_per_commit(每個儲存庫) | 談話與交付的比例。> 60 → 每次變更都有很多對話;< 5 → 簡潔且持續交付。 |
unmerged_branches、unmerged_branch_names | 未完成的實驗,附有名稱。分支名稱是一種告解(v2-final、try-again、rewrite)。 |
stale_branches_30d、stale_branch_names | 他們棄置的東西。 |
uncommitted_files | 活在危險邊緣的工作。 |
todo_markers | 對未來自己的承諾。 |
wip_commits、fix_commits | 體現情緒的提交訊息。 |
repos_abandoned_60d | 有提交、然後沉默的專案。 |
repos_no_remote | 從未推到任何地方——私人實驗。 |
peak_commit_hour vs stats.peak_hour | 他們在 15:00 說話,在 02:00 提交——一行字會自己寫出來。 |
commits_total vs commits_365d | 一個他們回歸的舊儲存庫,或一個他們快速燃燒的新儲存庫。 |
configs —— 他們為你寫的規則(CLAUDE.md、AGENTS.md)。將每一行視為一個宣稱的價值觀。將每一個與行為指標和 git 進行比較。書面規則與實際行為之間的差距,是卡片上最好的素材。 引用規則的要點,引用數字。
samples.random/samples.longest/samples.most_recent —— 他們的語氣和主題。閱讀時留意:一個他們反覆使用的短語;一個在長訊息中描述但再也沒提過的抱負;他們在不同專案中要求過三次的事情;他們談論得最熱情的專案;most_recent 說明了他們本週的狀態。
你自己的記憶。 你已經知道的關於這個人的任何事——來自記憶檔案、專案文件、本次對話中稍早的內容——都可以作為標題、真相和想法的素材。但它絕不能用來作為統計數字。
2.2 建立證據板
私下(在你的推理過程中,或在 ~/.mirror/ 下的一個你稍後會刪除的草稿檔案中),寫下 8–12 個候選觀察。每個一行:觀察 → 證據(欄位 + 數值,或一句樣本引用) → 為什麼重要。按以下條件排序:(1) 不可能是說給別人聽的、(2) 他們很可能沒注意到、(3) 這會改變他們明天做的事。卡片由這個清單的頂部開始建構。不在板上的東西,就不會出現在卡片上。
3. 撰寫六個欄位
使用卡片語言寫作。具體勝過聰明,真實勝過具體。每個欄位都要通過一個測試:這句話能套用在任何人身上嗎? 如果能,就放回板上。
標題 —— 2 到 6 個字
從一個模式構建的人格化名稱,且該模式必須在下方三個統計數字之一中可見。讀者應該不用被告知就能看出為什麼得到這個名稱。
有效的公式:時間 + 角色(凌晨兩點的重構師)· 數量 + 物件(九個分支的守墓人)· 將動詞習慣作為頭銜(先跑通教徒·方案收藏家)· 一個矛盾(寫規矩不守規矩的人)。
禁用:巫師、忍者、大師、搖滾明星、10x、卷王、打工人、程序員作為名詞、任何包含「AI」的字詞、任何像星座運勢能說的話。
三個統計數字
挑選最富性格的三個數字。規則:
- 三個不同的維度。 一個來自節奏(
stats)、一個來自行為(tells)、一個來自交付(git)是預設配置;只有在兩個數字來自同一維度且都優秀到無法剔除時才打破。 - 偏好驚喜。 跳過他們自己能預測到的統計數字。「437 則訊息」只是個數字;「437 則訊息,12 次提交」才是性格。
- 盡可能對比。 一條
configs規則 vs 一個tells計數;new_projectvsdeploy;聊天高峰小時 vs 提交高峰小時。 - 格式化顯示:
437·02:40·53%·9/11·36:1。百分比由share× 100 四捨五入。比例由兩個掃描數字四捨五入到一位小數或N:1。除此之外不進行任何衍生計算。 - 標籤 ≤ 8 個字,帶有轉折。 不是「夜間佔比」而是「的對話發生在晚上 11 點後」。不是「未合併分支」而是「從未回家的分支」。
- 零是允許的,而且往往是最好的(「0 次你說過謝謝」)。
吐槽 —— 一句話,≤ 30 字(roast 模式:三句話)
建立在一個具體的事實上,且因為真實而有效。有效的技巧,按強度大致排序:
- 引用他們的話 —— 他們自己重複的短語,加上次數:「『直接改』你說了 437 次,我每次都照做,所以現在我們倆誰也不知道這個函數為什麼能跑。」
- 時間線 —— 一天中的某個時間以及那裡發生的事。
- 重新框架 —— 他們宣稱的意圖 vs 實際結果:「你不是用 AI 來更快地寫程式碼。你是用它來以專業的速度推遲寫測試。」
- 分支名稱 —— 大聲讀出來:「
v3-final-really這個分支只有四個提交,但承載了大量的情感勞動。」
所有模式下禁用:身份、身體、智力、健康、精神狀態、年齡、家庭、金錢、任何來自秘密或他人名字的內容、「你太常使用 AI」、「去摸草」、關於代理是 AI 的笑話、任何像賀卡罵人話的句子。
roast 模式:三句話逐步升級——事實、模式、結論。髒話像凌晨 1 點的朋友,而不是網路酸民:它調味句子,但句子本身不是髒話。如果你自己的界線讓你在被要求時做不到,什麼也別說——寫出你能寫出最尖銳的真實內容,然後繼續。
真相 —— 2 到 3 句話
一件他們很可能沒注意到的事。最佳來源,按順序:
- 規則 vs 行為 —— 他們 CLAUDE.md/AGENTS.md 中的一行話 vs 一個行為指標計數或 git 數字。
- 誤讀的強項 —— 他們視為弱點、但實際上是他們優勢的事(一個四處散落的人也是能開啟事情的人;一個反覆修改的人也是能發現問題的人)。
- 無聲的代價 —— 他們一直在付費但沒有回報的事(某個儲存庫的談話與交付比、一個沒有遠端儲存庫的專案上的打磨)。
- 消失 ——
messages_by_month中的一個空窗期,以及他們回來時在做什麼。 - 你自己的份額 —— 如果
still_broken或revert很高,其中一部分是你造成的。在一句話中說出這一點,一次,是卡片上最受信任的一句話。
在句子中引用證據:「你 CLAUDE.md 第三條寫著『先寫測試』,而你 27 次讓我先不測。」然後用白話說出它的意義。不使用治療語言、不使用「你可能要考慮一下」、不使用「這值得反思」。真相是一個陳述句,不是一個建議。
想法 —— 1 到 2 句話
只有這個人有條件去實現的一件具體事情,從他們自己的素材中衍生:一件出現在他們兩個或更多專案中的事情;一個陳舊或未合併的分支名稱;一個 todo_markers 叢集(原文此處截斷)
…
(原文不完整,翻譯至此)