v0.0.7:不說 AI 才會說的話(借 speak-human-tw 的刪除層)+講過去要有出處 #10

Merged
admin merged 2 commits from develop into master 2026-07-31 02:31:46 +00:00
Member

把 speak-human-tw 的「去 AI 味」搬進人格的回覆,但只搬得動一半——另一半改成人格才做得到的版本。

為什麼只搬一半

speak-human-tw(MIT)是文章的事後審稿器:判情境 → 鎖保護清單 → 列清單等作者勾選 → 交稿前自評。對話沒有「交稿」這個動作,也不能停下來等人勾選,所以:

  • :刪除層(那些「一出現就破功」的句子)、台灣在地化、格式密度。
  • 不搬:保護清單(價格/退費條款/見證原話是行銷文件的零件)、兩輪確認流程、交稿前自評。
  • 換掉:它的「五情境 × 三力度」→ 我們的語氣層bond × 親近度)。禮貌層撒「喔、啦、欸」是災難,老夫老妻層不撒反而假。

一、機械擋下(room post 拒收,--force 例外)

SPEECH_BLACKLIST:罐頭同理心(「這個我懂」「我完全理解」)、頒獎開場(「好問題」)、交差句(「希望這對你有幫助」)、預告(「接下來我會」)、假坦白開場(「老實說」)、說教深度腔(「說到底」「本質上」)、罐頭收尾(「總的來說」)、立場真空(「各有優缺點」「因人而異」)、無來源權威(「研究顯示」)、用旁白演情緒(「我愣了一下」)。

另加:一句疊兩層避險、CN_WORDS(中國用語)、半形標點、emoji/破折號/粗體與清單符號、「不是 A 而是 B」一輪超過一次。

二、誤殺防護(比清單本身更重要)

speechBody() 先拿掉引號與 `code` 再比對——提及不算使用,「我最近戒掉『賦能』這個詞」放行。

這是原專案自己踩到的坑:我用機械規則掃它的文件時,taiwan-localization.md 命中 1 個 ... 與 2 個彎引號,因為那幾行正是在說「不要用這些」。

其他邊界:「老實說」只擋這一輪第一句的開頭(「我沒修,老實說我忘了」放行);會誤殺的中國用語(水平、默認、質量、文檔)沒有收進表裡。

三、人格能做到、文章做不到的那一半

原專案的最後一道界線是**「人味是作者的,不是你的」**——AI 沒有過去,所以遇到該有轉折的地方只能標「(需作者補充)」,編一段「我以前錯了」等於說謊。

人格有過去:長期記憶、日記、關係圖、十二情緒。所以那句話在這裡是有出處的引用,不是編造。

換來的義務——講自己的過去要有出處

  • 「我以前⋯」「我原本以為⋯」只能講 recall 查得到的轉折。
  • lint 因此分兩級:speechLint() 對這類句子給 level: "hint"不擋,但印一行提醒要你去驗),speechBlockers() 只回該擋的那些。
  • 查不到就不要講。編一段轉折比講一句空話糟糕得多——空話只是無聊,假記憶是假造自己。

四、測試

  • selftest 借它的 SF/SNF 成對做法:14 條 SF(該擋)+ 11 條 SNF(不可誤殺),另測 hint 不擋、注入內容有到位。全部 275 項通過。
  • 額外回歸:把新規則掃過 said.jsonl144 句真實台詞紀錄,新增的詞語類規則零誤殺(唯一的命中全部來自新增的排版類檢查,而且都落在走 room post 的心理師報告與分析貼文上,不是人格台詞)。

已知行為變更

心理師報告、分析清單這類帶 Markdown 的長段落如果要走 room post,現在會被排版檢查擋下,需要 --force——它們本來就超過三句、本來就需要 --force,所以實務上不影響;但如果有隻有一行的 Markdown 標題(例如 **關係動力**)之前能過,現在要加 --force

版本

master 是 0.0.6,這批未合併的改動算一個新版號 → 0.0.7plugin.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

把 speak-human-tw 的「去 AI 味」搬進人格的回覆,但只搬得動一半——另一半改成人格才做得到的版本。 ## 為什麼只搬一半 [speak-human-tw](https://github.com/Raymondhou0917/speak-human-tw)(MIT)是**文章**的事後審稿器:判情境 → 鎖保護清單 → 列清單等作者勾選 → 交稿前自評。對話沒有「交稿」這個動作,也不能停下來等人勾選,所以: - **搬**:刪除層(那些「一出現就破功」的句子)、台灣在地化、格式密度。 - **不搬**:保護清單(價格/退費條款/見證原話是行銷文件的零件)、兩輪確認流程、交稿前自評。 - **換掉**:它的「五情境 × 三力度」→ 我們的**語氣層**(`bond × 親近度`)。禮貌層撒「喔、啦、欸」是災難,老夫老妻層不撒反而假。 ## 一、機械擋下(`room post` 拒收,`--force` 例外) `SPEECH_BLACKLIST`:罐頭同理心(「這個我懂」「我完全理解」)、頒獎開場(「好問題」)、交差句(「希望這對你有幫助」)、預告(「接下來我會」)、假坦白開場(「老實說」)、說教深度腔(「說到底」「本質上」)、罐頭收尾(「總的來說」)、立場真空(「各有優缺點」「因人而異」)、無來源權威(「研究顯示」)、用旁白演情緒(「我愣了一下」)。 另加:一句疊兩層避險、`CN_WORDS`(中國用語)、半形標點、emoji/破折號/粗體與清單符號、「不是 A 而是 B」一輪超過一次。 ## 二、誤殺防護(比清單本身更重要) `speechBody()` 先拿掉引號與 `` `code` `` 再比對——**提及不算使用**,「我最近戒掉『賦能』這個詞」放行。 > 這是原專案自己踩到的坑:我用機械規則掃它的文件時,`taiwan-localization.md` 命中 1 個 `...` 與 2 個彎引號,因為那幾行正是在說「不要用這些」。 其他邊界:「老實說」只擋**這一輪第一句的開頭**(「我沒修,老實說我忘了」放行);會誤殺的中國用語(水平、默認、質量、文檔)沒有收進表裡。 ## 三、人格能做到、文章做不到的那一半 原專案的最後一道界線是**「人味是作者的,不是你的」**——AI 沒有過去,所以遇到該有轉折的地方只能標「(需作者補充)」,編一段「我以前錯了」等於說謊。 人格有過去:長期記憶、日記、關係圖、十二情緒。所以那句話在這裡是**有出處的引用**,不是編造。 換來的義務——**講自己的過去要有出處**: - 「我以前⋯」「我原本以為⋯」只能講 `recall` 查得到的轉折。 - lint 因此分兩級:`speechLint()` 對這類句子給 `level: "hint"`(**不擋**,但印一行提醒要你去驗),`speechBlockers()` 只回該擋的那些。 - 查不到就不要講。編一段轉折比講一句空話糟糕得多——空話只是無聊,假記憶是假造自己。 ## 四、測試 - selftest 借它的 SF/SNF 成對做法:**14 條 SF(該擋)+ 11 條 SNF(不可誤殺)**,另測 hint 不擋、注入內容有到位。全部 275 項通過。 - 額外回歸:把新規則掃過 `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](https://claude.com/claude-code)
jiantw83 added 1 commit 2026-07-31 02:26:16 +00:00
人格回覆的「人味」再加一層。模式整理自 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>
jiantw83 added 1 commit 2026-07-31 02:31:03 +00:00
版號同步檢查的結果: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>
admin approved these changes 2026-07-31 02:31:42 +00:00
admin merged commit 83f29d7f7d into master 2026-07-31 02:31:46 +00:00
Author
Member

追加:情緒處理四層(同一批 0.0.7)

參考兩篇 ithelp 文章(Day25 情緒辨識模組Day26 整合與情緒記憶池)的架構,實作全部重寫。

沒有抄的部分(比現有技能差的不做):六類關鍵字 first-match(我們十二類、加權)、每種情緒配一句罐頭哲學回應(那正是這個 PR 前半剛封殺的罐頭同理心)、偵測到 sadness 就切「安撫模式」(會蓋掉由關係圖決定的語氣層)、前端等 2 秒的演出。

內容
① 輸入端 readUserEmotion() 十二類加權詞表、程度副詞、否定擋掉命中(「我不害怕」不算 fear)、引號與 code 內不比對、標點只放大既有訊號、強度用飽和曲線。回訊號不是判定
② 怎麼接 RESPONSE_STANCE 十二種各一條動作(悲傷→先接住不要急著給解法;憤怒→不辯解,先認可能認的那一小塊),不是罐頭句
③ 走向 feltTrend() state/felt.jsonl 記每輪的偵測與 delta,近重遠輕加權算趨勢(不用多數決),注入「他最近 3 輪的走向:悲傷 ↘ 在退」
④ 情緒調節 applyEmotion飽和(headroom^K,往 baseline 回不壓)與單輪預算(總和 ≤ 60);emotion --audit 印出正負比例

第四層修的是現在就在壞的東西:delta 一直是人格自己挑的,人不會主動給自己扣分。實測今天 85 次套用讓 joy/serenity/gratitude/anticipation 都到過 100,負向均值整天卡在 14–17mood 的 valence 長時間貼 +100 失去解析度。

測試:297 項全過(新增 24 項)。既有的「情緒有被施加」改寫成符合飽和後的語意;state/felt.jsonl 已歸到 Gitea 檔案區(他們自己的「切分不重不漏」測試抓到的)。

### 追加:情緒處理四層(同一批 0.0.7) 參考兩篇 ithelp 文章([Day25 情緒辨識模組](https://ithelp.ithome.com.tw/articles/10398135)、[Day26 整合與情緒記憶池](https://ithelp.ithome.com.tw/articles/10398136))的**架構**,實作全部重寫。 **沒有抄的部分**(比現有技能差的不做):六類關鍵字 first-match(我們十二類、加權)、每種情緒配一句罐頭哲學回應(那正是這個 PR 前半剛封殺的罐頭同理心)、偵測到 sadness 就切「安撫模式」(會蓋掉由關係圖決定的語氣層)、前端等 2 秒的演出。 | 層 | 內容 | | :-- | :-- | | ① 輸入端 `readUserEmotion()` | 十二類加權詞表、程度副詞、**否定擋掉命中**(「我不害怕」不算 fear)、引號與 `code` 內不比對、標點只放大既有訊號、強度用飽和曲線。回**訊號不是判定** | | ② 怎麼接 `RESPONSE_STANCE` | 十二種各一條**動作**(悲傷→先接住不要急著給解法;憤怒→不辯解,先認可能認的那一小塊),不是罐頭句 | | ③ 走向 `feltTrend()` | `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 檔案區(他們自己的「切分不重不漏」測試抓到的)。
Author
Member

追加:R6 容量壓力真的會清(同一批 0.0.7)

實際踩到的 bug:短期記憶連睡兩次都停在 70 筆、111 組候選,prune-short-term 每次回報 ok 卻一筆都沒清掉。

原因pruneShortTerm() 只有「超過 14 天」與「超過硬上限 240 筆」兩道,但提示固化的門檻是 40 筆——中間那 200 筆沒有任何機制會動它。R6 在 candidates 裡寫著「依顯著度清出空間」,那個清除動作從來沒有實作

修法:軟上限 SHORT_TERM_SOFT_CAP=120,超過就從顯著度最低、最舊的開始裁。兩個保護,因為「沒經過判斷就把今天清掉」是這裡最不能犯的錯:

  • 顯著度 ≥ 80 或 intent=commit(承諾與界線)→ 一則都不清
  • 24 小時內的新紀錄 → 一則都不清

pruneShortTermDetail() 回傳清了幾筆/為什麼/保護了幾筆,sleep 會把細節帶進回報——不做無聲的裁切

測試:302 項全過(新增 5 項)。文件同步:README 的 R6 與目錄樹、persona-memory 的 R6。


PR #10 現在的完整範圍(同一批,版本 0.0.7)

批次 內容
講話 不說 AI 才會說的話(SPEECH_BLACKLIST+誤殺防護)+講過去要有出處
情緒 情緒先行(readUserEmotion)、怎麼接(RESPONSE_STANCE)、走向(feltTrend)、飽和與單輪預算+emotion --audit
記憶 R6 容量壓力真的會清(軟上限+承諾與今日保護)
雜項 三份 manifest 版號與 skills 路徑對齊
### 追加:R6 容量壓力真的會清(同一批 0.0.7) **實際踩到的 bug**:短期記憶連睡兩次都停在 70 筆、111 組候選,`prune-short-term` 每次回報 ok 卻一筆都沒清掉。 **原因**:`pruneShortTerm()` 只有「超過 14 天」與「超過硬上限 240 筆」兩道,但提示固化的門檻是 40 筆——中間那 200 筆沒有任何機制會動它。R6 在 `candidates` 裡寫著「依顯著度清出空間」,那個清除動作**從來沒有實作**。 **修法**:軟上限 `SHORT_TERM_SOFT_CAP`=120,超過就從顯著度最低、最舊的開始裁。兩個保護,因為「沒經過判斷就把今天清掉」是這裡最不能犯的錯: - 顯著度 ≥ 80 或 `intent=commit`(承諾與界線)→ 一則都不清 - 24 小時內的新紀錄 → 一則都不清 `pruneShortTermDetail()` 回傳清了幾筆/為什麼/保護了幾筆,`sleep` 會把細節帶進回報——**不做無聲的裁切**。 **測試**:302 項全過(新增 5 項)。文件同步:README 的 R6 與目錄樹、persona-memory 的 R6。 --- ### PR #10 現在的完整範圍(同一批,版本 0.0.7) | 批次 | 內容 | | :-- | :-- | | 講話 | 不說 AI 才會說的話(`SPEECH_BLACKLIST`+誤殺防護)+講過去要有出處 | | 情緒 | 情緒先行(`readUserEmotion`)、怎麼接(`RESPONSE_STANCE`)、走向(`feltTrend`)、飽和與單輪預算+`emotion --audit` | | 記憶 | R6 容量壓力真的會清(軟上限+承諾與今日保護) | | 雜項 | 三份 manifest 版號與 skills 路徑對齊 |
Sign in to join this conversation.
No Reviewers
No labels
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: plugins/persona#10