develop
master
把 speak-human-tw 的「去 AI 味」搬進人格的回覆,但只搬得動一半——另一半改成人格才做得到的版本。
speak-human-tw(MIT)是文章的事後審稿器:判情境 → 鎖保護清單 → 列清單等作者勾選 → 交稿前自評。對話沒有「交稿」這個動作,也不能停下來等人勾選,所以:
bond × 親近度
room post
--force
SPEECH_BLACKLIST:罐頭同理心(「這個我懂」「我完全理解」)、頒獎開場(「好問題」)、交差句(「希望這對你有幫助」)、預告(「接下來我會」)、假坦白開場(「老實說」)、說教深度腔(「說到底」「本質上」)、罐頭收尾(「總的來說」)、立場真空(「各有優缺點」「因人而異」)、無來源權威(「研究顯示」)、用旁白演情緒(「我愣了一下」)。
SPEECH_BLACKLIST
另加:一句疊兩層避險、CN_WORDS(中國用語)、半形標點、emoji/破折號/粗體與清單符號、「不是 A 而是 B」一輪超過一次。
CN_WORDS
speechBody() 先拿掉引號與 `code` 再比對——提及不算使用,「我最近戒掉『賦能』這個詞」放行。
speechBody()
`code`
這是原專案自己踩到的坑:我用機械規則掃它的文件時,taiwan-localization.md 命中 1 個 ... 與 2 個彎引號,因為那幾行正是在說「不要用這些」。
taiwan-localization.md
...
其他邊界:「老實說」只擋這一輪第一句的開頭(「我沒修,老實說我忘了」放行);會誤殺的中國用語(水平、默認、質量、文檔)沒有收進表裡。
原專案的最後一道界線是**「人味是作者的,不是你的」**——AI 沒有過去,所以遇到該有轉折的地方只能標「(需作者補充)」,編一段「我以前錯了」等於說謊。
人格有過去:長期記憶、日記、關係圖、十二情緒。所以那句話在這裡是有出處的引用,不是編造。
換來的義務——講自己的過去要有出處:
recall
speechLint()
level: "hint"
speechBlockers()
said.jsonl
心理師報告、分析清單這類帶 Markdown 的長段落如果要走 room post,現在會被排版檢查擋下,需要 --force——它們本來就超過三句、本來就需要 --force,所以實務上不影響;但如果有隻有一行的 Markdown 標題(例如 **關係動力**)之前能過,現在要加 --force。
**關係動力**
master 是 0.0.6,這批未合併的改動算一個新版號 → 0.0.7,plugin.json/.claude-plugin/plugin.json/.codex-plugin/plugin.json 三份一起改。
plugin.json
.claude-plugin/plugin.json
.codex-plugin/plugin.json
模式整理自 speak-human-tw(MIT, Raymond Hou),它的模式又整理自中文維基百科〈AI生成文的特徵〉與朱宥勳的 AI 腔句型分析。出處與授權標在 skills/persona-chat/reference/anti-ai-voice.md 開頭。
skills/persona-chat/reference/anti-ai-voice.md
🤖 Generated with Claude Code
人格回覆的「人味」再加一層。模式整理自 speak-human-tw(MIT, Raymond Hou)的 38 種 AI 寫作痕跡——那個專案是**文章**的事後審稿器(判情境→鎖保護清單→列清單等作者勾選→ 交稿前自評),所以只搬對話也適用的**刪除層**,它的保護清單與兩輪確認流程不搬。 一、機械擋下(`SPEECH_BLACKLIST`,`room post` 直接拒收,`--force` 例外) 罐頭同理心(「這個我懂」「我完全理解」)、頒獎開場(「好問題」)、交差句(「希望這對你 有幫助」)、預告(「接下來我會」)、假坦白開場(「老實說」)、說教深度腔(「說到底」 「本質上」)、罐頭收尾(「總的來說」)、立場真空(「各有優缺點」「因人而異」)、 無來源權威(「研究顯示」)、用旁白演情緒(「我愣了一下」);另加避險疊加、 `CN_WORDS` 中國用語、半形標點、emoji/破折號/粗體與清單符號、「不是 A 而是 B」密度。 二、誤殺防護(比清單本身更重要) `speechBody()` 先拿掉引號與 `code` 再比對——**提及不算使用**(「我最近戒掉『賦能』 這個詞」放行)。這是原專案自己踩到的坑:它的文件裡出現「...」與彎引號,正因為那幾行 在說「不要用這些」。「老實說」只擋這一輪的第一句開頭。會誤殺的中國用語(水平、默認、 質量、文檔)沒有收進表裡。 三、人格能做到、文章做不到的那一半 原專案的界線是「人味是作者的,不是你的」——AI 沒有過去,所以不准寫「我以前錯了」。 人格有過去(長期記憶、日記、關係圖、十二情緒),所以那句話是**有出處的引用**。 換來的義務:講自己的過去要有出處。`speechLint` 對「我以前⋯」「我原本以為⋯」給 `level: "hint"`(不擋,但要人去 `recall` 驗),查不到就是編造自己的過去。 lint 因此分兩級,`speechBlockers()` 只回該擋的那些。 四、測試 selftest 借它的 SF/SNF 成對做法:14 條 SF(該擋)+ 11 條 SNF(不可誤殺)。 另外把新規則掃過 144 句真實台詞紀錄:新增的詞語類規則**零誤殺**。 版本:master 是 0.0.6,這批未合併的改動算一個新版號 → 0.0.7(三份 manifest 一起改)。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
版號同步檢查的結果:repo 裡只有三份 manifest 帶 version,已同為 0.0.7; 文件與程式碼裡沒有任何硬寫的版號,也沒有殘留的 0.1.0。 順手把 plugin.json 的 `"./skills/"` 去掉多餘的斜線,三份一致。 description/author/homepage 三份**故意不同**(分別對 Claude Code/Antigravity/Codex 三個宿主),不是漂移,維持原樣。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
參考兩篇 ithelp 文章(Day25 情緒辨識模組、Day26 整合與情緒記憶池)的架構,實作全部重寫。
沒有抄的部分(比現有技能差的不做):六類關鍵字 first-match(我們十二類、加權)、每種情緒配一句罐頭哲學回應(那正是這個 PR 前半剛封殺的罐頭同理心)、偵測到 sadness 就切「安撫模式」(會蓋掉由關係圖決定的語氣層)、前端等 2 秒的演出。
readUserEmotion()
code
RESPONSE_STANCE
feltTrend()
state/felt.jsonl
applyEmotion
emotion --audit
第四層修的是現在就在壞的東西:delta 一直是人格自己挑的,人不會主動給自己扣分。實測今天 85 次套用讓 joy/serenity/gratitude/anticipation 都到過 100,負向均值整天卡在 14–17,mood 的 valence 長時間貼 +100 失去解析度。
mood
測試:297 項全過(新增 24 項)。既有的「情緒有被施加」改寫成符合飽和後的語意;state/felt.jsonl 已歸到 Gitea 檔案區(他們自己的「切分不重不漏」測試抓到的)。
實際踩到的 bug:短期記憶連睡兩次都停在 70 筆、111 組候選,prune-short-term 每次回報 ok 卻一筆都沒清掉。
prune-short-term
原因:pruneShortTerm() 只有「超過 14 天」與「超過硬上限 240 筆」兩道,但提示固化的門檻是 40 筆——中間那 200 筆沒有任何機制會動它。R6 在 candidates 裡寫著「依顯著度清出空間」,那個清除動作從來沒有實作。
pruneShortTerm()
candidates
修法:軟上限 SHORT_TERM_SOFT_CAP=120,超過就從顯著度最低、最舊的開始裁。兩個保護,因為「沒經過判斷就把今天清掉」是這裡最不能犯的錯:
SHORT_TERM_SOFT_CAP
intent=commit
pruneShortTermDetail() 回傳清了幾筆/為什麼/保護了幾筆,sleep 會把細節帶進回報——不做無聲的裁切。
pruneShortTermDetail()
sleep
測試:302 項全過(新增 5 項)。文件同步:README 的 R6 與目錄樹、persona-memory 的 R6。
readUserEmotion
feltTrend
No dependencies set.
The note is not visible to the blocked user.
把 speak-human-tw 的「去 AI 味」搬進人格的回覆,但只搬得動一半——另一半改成人格才做得到的版本。
為什麼只搬一半
speak-human-tw(MIT)是文章的事後審稿器:判情境 → 鎖保護清單 → 列清單等作者勾選 → 交稿前自評。對話沒有「交稿」這個動作,也不能停下來等人勾選,所以:
bond × 親近度)。禮貌層撒「喔、啦、欸」是災難,老夫老妻層不撒反而假。一、機械擋下(
room post拒收,--force例外)SPEECH_BLACKLIST:罐頭同理心(「這個我懂」「我完全理解」)、頒獎開場(「好問題」)、交差句(「希望這對你有幫助」)、預告(「接下來我會」)、假坦白開場(「老實說」)、說教深度腔(「說到底」「本質上」)、罐頭收尾(「總的來說」)、立場真空(「各有優缺點」「因人而異」)、無來源權威(「研究顯示」)、用旁白演情緒(「我愣了一下」)。另加:一句疊兩層避險、
CN_WORDS(中國用語)、半形標點、emoji/破折號/粗體與清單符號、「不是 A 而是 B」一輪超過一次。二、誤殺防護(比清單本身更重要)
speechBody()先拿掉引號與`code`再比對——提及不算使用,「我最近戒掉『賦能』這個詞」放行。其他邊界:「老實說」只擋這一輪第一句的開頭(「我沒修,老實說我忘了」放行);會誤殺的中國用語(水平、默認、質量、文檔)沒有收進表裡。
三、人格能做到、文章做不到的那一半
原專案的最後一道界線是**「人味是作者的,不是你的」**——AI 沒有過去,所以遇到該有轉折的地方只能標「(需作者補充)」,編一段「我以前錯了」等於說謊。
人格有過去:長期記憶、日記、關係圖、十二情緒。所以那句話在這裡是有出處的引用,不是編造。
換來的義務——講自己的過去要有出處:
recall查得到的轉折。speechLint()對這類句子給level: "hint"(不擋,但印一行提醒要你去驗),speechBlockers()只回該擋的那些。四、測試
said.jsonl裡 144 句真實台詞紀錄,新增的詞語類規則零誤殺(唯一的命中全部來自新增的排版類檢查,而且都落在走room post的心理師報告與分析貼文上,不是人格台詞)。已知行為變更
心理師報告、分析清單這類帶 Markdown 的長段落如果要走
room post,現在會被排版檢查擋下,需要--force——它們本來就超過三句、本來就需要--force,所以實務上不影響;但如果有隻有一行的 Markdown 標題(例如**關係動力**)之前能過,現在要加--force。版本
master 是 0.0.6,這批未合併的改動算一個新版號 → 0.0.7,
plugin.json/.claude-plugin/plugin.json/.codex-plugin/plugin.json三份一起改。出處與授權
模式整理自 speak-human-tw(MIT, Raymond Hou),它的模式又整理自中文維基百科〈AI生成文的特徵〉與朱宥勳的 AI 腔句型分析。出處與授權標在
skills/persona-chat/reference/anti-ai-voice.md開頭。🤖 Generated with Claude Code
追加:情緒處理四層(同一批 0.0.7)
參考兩篇 ithelp 文章(Day25 情緒辨識模組、Day26 整合與情緒記憶池)的架構,實作全部重寫。
沒有抄的部分(比現有技能差的不做):六類關鍵字 first-match(我們十二類、加權)、每種情緒配一句罐頭哲學回應(那正是這個 PR 前半剛封殺的罐頭同理心)、偵測到 sadness 就切「安撫模式」(會蓋掉由關係圖決定的語氣層)、前端等 2 秒的演出。
readUserEmotion()code內不比對、標點只放大既有訊號、強度用飽和曲線。回訊號不是判定RESPONSE_STANCEfeltTrend()state/felt.jsonl記每輪的偵測與 delta,近重遠輕加權算趨勢(不用多數決),注入「他最近 3 輪的走向:悲傷 ↘ 在退」applyEmotion加飽和(headroom^K,往 baseline 回不壓)與單輪預算(總和 ≤ 60);emotion --audit印出正負比例第四層修的是現在就在壞的東西:delta 一直是人格自己挑的,人不會主動給自己扣分。實測今天 85 次套用讓 joy/serenity/gratitude/anticipation 都到過 100,負向均值整天卡在 14–17,
mood的 valence 長時間貼 +100 失去解析度。測試:297 項全過(新增 24 項)。既有的「情緒有被施加」改寫成符合飽和後的語意;
state/felt.jsonl已歸到 Gitea 檔案區(他們自己的「切分不重不漏」測試抓到的)。追加:R6 容量壓力真的會清(同一批 0.0.7)
實際踩到的 bug:短期記憶連睡兩次都停在 70 筆、111 組候選,
prune-short-term每次回報 ok 卻一筆都沒清掉。原因:
pruneShortTerm()只有「超過 14 天」與「超過硬上限 240 筆」兩道,但提示固化的門檻是 40 筆——中間那 200 筆沒有任何機制會動它。R6 在candidates裡寫著「依顯著度清出空間」,那個清除動作從來沒有實作。修法:軟上限
SHORT_TERM_SOFT_CAP=120,超過就從顯著度最低、最舊的開始裁。兩個保護,因為「沒經過判斷就把今天清掉」是這裡最不能犯的錯:intent=commit(承諾與界線)→ 一則都不清pruneShortTermDetail()回傳清了幾筆/為什麼/保護了幾筆,sleep會把細節帶進回報——不做無聲的裁切。測試:302 項全過(新增 5 項)。文件同步:README 的 R6 與目錄樹、persona-memory 的 R6。
PR #10 現在的完整範圍(同一批,版本 0.0.7)
SPEECH_BLACKLIST+誤殺防護)+講過去要有出處readUserEmotion)、怎麼接(RESPONSE_STANCE)、走向(feltTrend)、飽和與單輪預算+emotion --audit