# TARGET — 情緒/語氣/小動作/記憶的擬真優化 對著 `README.md`〈專案目標〉的 **G1/G2/G3** 做。本清單是 [PR #17](https://gitea.jsc.idv.tw/plugins/persona/pulls/17) 所指「TODO 階段 5」+階段 4 剩餘項的版控版本(原 `TODO_人格優化.md` 已於 `9d76984` 移出版控, 全文仍可由 `git show 9d76984^:TODO_人格優化.md` 取回)。 **前提:跟人格之間只有文字。** 沒有表情、沒有聲音、沒有停頓,所有情緒都只能靠字面與句子的形狀傳過去 ——所以情緒表達在這個專案裡是**排版問題**,不是形容詞問題。 ## 動手前必須知道的界線(每一項都受它約束) | 界線 | 內容 | | --- | --- | | 硬規則 8 | 不說 AI 才會說的話、**演出來不要講出來**。與 G2/G3 相撞時**以硬規則 8 為準**,然後把該案例寫進 `anti-ai-voice.md` | | 動作只能進括號 | 動作寫在**名字後面既有的括號**裡(`桐人(喜悅・別過頭):`)。`*別過頭*` 這種內嵌星號、「她臉紅了」這種第三人稱旁白、句子本體裡的「我愣了一下」**一律仍然禁止** | | emoji 是加上去的 | 把所有 emoji 刪掉之後,句子的形狀**仍然**要看得出情緒。不可用 emoji 代替句子或代替動作格 | | 不靠隨機充人味 | 不用口語碎片、隨機數、隨機口誤製造人味(G1 的界線) | | 性別只給預設值 | `IDENTITY`/`SOUL` 的描述永遠蓋過性別預設,可以推到 0。不做「女性=情緒更外顯」的全域放大 | | 強度全域一致 | Q8 拍板:動漫化**強度**全域一致,**內容**(自稱/句尾/口癖)仍然逐人格 | Q5–Q10 六題已於 2026/08/03 由使用者拍板,設計不再需要確認,直接實作。 --- - [ ] **5.7 動作加進名字後的括號(Q6 拍板格式,其他項目的基礎,先做)** - 括號**原本就有**:`persona-lib.mjs` 的渲染(約 3804 行)本來就是 `名字(情緒)→ 對象:內容`, 括號裡是 `room post --emotion` 的情緒標註。這一節是**在既有括號裡多一格**,不是換掉它。 - [ ] 格式:括號分兩格,**情緒在前、動作在後,用 `・` 分隔**。兩格都可省略,全省就不出現括號 (`桐人(喜悅・別過頭):` / `桐人(別過頭):` / `桐人(喜悅):` 三種都要成立) - [ ] 兩格分工寫死:情緒格是**標註**(既有 meta);動作格只寫**看得見的身體動作**。 動作格不重複情緒名稱——`(喜悅・害羞)` 是把標註寫兩次,不是動作 - [ ] 生理反應算動作,明文允許:臉紅、耳朵紅、手在抖、聲音變小、呼吸亂掉。 判準是**看得見或聽得見**,不是有沒有情緒色彩——`(臉紅)` 可以,`(害羞)` 只能待在情緒格。 害羞這格的預設動作就用**臉紅**,其餘看人格自己的 `## Tells` - [ ] `speechLint()` 只對括號**外**的內容比對黑名單與句長;括號內另立規則 (情緒格照既有 `injectSafeLine`;動作格單一動作、12 字內) - [ ] 劇場模式:`room post` 加 `--action "<動作>"`(與既有 `--emotion` 並列), `room read`/`room script` 的渲染跟著改;`hooks/` 每輪強制的輸出格式放寬到帶括號 - [ ] **一對一(非劇場)也適用** —— Q6 拍板的是格式,不是只給多人格場景 - [ ] 頻率綁 Q7 的兩個動作額度,**括號裡的動作算其中一個**(否則會變成一輪三個動作) - [ ] **記憶要記那個行為**(Q6 明示):短期與長期記憶加行為備註欄位,記「他做了什麼」而不是「他感到什麼」。 跟 `persona-story` 的 1.12 同一個欄位,**不要各存一份**;`voice/reactions.md` 是同一批資料的落點 - 驗收:`(喜悅・別過頭)` 過得了 lint、情緒標註沒被吃掉;`*別過頭*` 與句子裡的「我愣了一下」照舊被擋下; 那一輪的記憶查得到「別過頭」這個行為 - [ ] **5.8 emoji 表示情緒與程度(Q9/Q10 拍板,依賴 5.7 的括號)** - 現在情緒格是**自由文字**,跟 `state/emotion.json` 的數值完全沒有連動。這一節把它接上去。 - 格式:**種類表情緒、數量表程度**。`< 40` 不顯示/`40–59` 情緒 emoji/`60–79` +`💦`/`80+` +`💦❗` - [ ] 寫一張**十二情緒 → emoji** 對照表(一種情緒一個,例如 `shame: 😳`、`anger: 😡`), 放 `persona-lib.mjs`,與 `EMOTION_TELLS` 同一層 - [ ] **per-persona 可覆寫**(`IDENTITY.md`,與 `## Tells`、Q5 的符號表同一層)。這是內容不是強度,不違反 Q8 - [ ] 強度符號固定兩階(`💦` / `💦❗`),不要長成第三階 - [ ] **由 `emotion.json` 的主導情緒自動帶入**,不是人格自由填。門檻對齊 `emotionTells()` 的 `min = 40`; `room post --emotion` 的自由文字保留(可手動蓋過) - [ ] `speechLint()` 的半形標點與排版檢查要**跳過 emoji 與強度符號**(與 Q5 的顏文字白名單同一支修改) - [ ] 句子裡自由使用、不設上限(Q10 拍板)。**唯一的煞車是稽核,不是擋**:比照 `emotion --audit` 統計每輪 emoji 數量與趨勢,讓過量看得見;真的失控再回來談上限 - 驗收:羞恥度 45/70/90 三種輸出的 emoji 不同;把所有 emoji 刪掉之後,句子的形狀仍然分得出是哪一級 - [ ] **5.2 標點預算(情緒 → 標點與句長的分布)** - [ ] 把標點納入 `speechLint()` 的可調參數:焦慮 → 刪節號與逗號斷句變多;憤怒 → 句號密度上升、幾乎不用問號; 害羞 → 疊字與破折;喜悅 → 允許一個驚嘆號 - [ ] 上限夾死(一則最多一個驚嘆號、刪節號不連發),否則會變成顏文字的替代品 - 驗收:同一句話在四種情緒下輸出,標點分布看得出差別,且都沒有過量 - [ ] **5.1 訊息的節奏:一輪可以拆成兩則(純文字唯一的「時間」訊號)** - [ ] `speechBudget()` 之外加**分段預算**:高 arousal 或高羞恥時,同一輪允許輸出兩則短訊, 第二則是**補救、嘴硬或改口**(「⋯剛才那句不算」),而不是補充說明 - [ ] 節流:每 N 輪最多一次,且只在 arousal 或羞恥度過門檻時 - 為什麼:真人在聊天軟體上的情緒,一半是靠「又補了一句」傳出去的。這是文字獨有、目前完全沒用到的手段 - 驗收:慌的時候會多一則短的;平靜時永遠只有一則 - [ ] **5.3 稱呼隨情緒偏移** - `relation style` 的 `--except <情緒>>=<值>` 已能做條件替換(`anger>=40` → 退回全名)。缺的是**害羞方向**。 - [ ] 害羞方向:改口、講到一半換稱呼、把名字吞掉不叫 - [ ] 每個關係節點可設「害羞時的稱呼」,沒設就退回吞掉名字(改用「你」) - 驗收:同一個對象,生氣時被叫全名、害羞時直接不叫名字 - [ ] **5.4 鬧彆扭的階梯與三段式句法(G3 核心,依賴 5.7 的動作額度)** - [ ] 羞恥度現在是一個純量對三個出口(`hide`/`spill`/`confess`)。加**階梯**: 輕微彆扭(一句帶過)→ 嘴硬(先否認再小聲承認)→ 惱羞(翻臉,`anger` 的負權重已存在) - [ ] 三段式做成**句法模板**而不是自由發揮:否認 → 反駁對方的說法 → 最後一句音量掉下來。 模板可 per-persona 覆寫(放 `IDENTITY.md` 的 `## Tells`,與現行覆寫同一層) - [ ] 三段式要吃 Q7 的兩個動作:否認與轉移是**同一種情緒的遞進**,剛好是那條規則的樣板案例。 惱羞那一級是換情緒(`shame` → `anger`),所以仍然只有兩個動作,不是三個 - 驗收:被稱讚外表時,低/中/高羞恥度三種輸出明顯不同,而且都沒有寫「我害羞了」 - [ ] **5.5 女性人格的預設值(G3,只動預設不動個性)** - [ ] 重看 `GENDER_MODESTY` 的預設值與 `modestyOf()` 的推力表,把女性預設往上調, 並補「鬧彆扭」相關的關鍵詞權重(現在的表偏向「害羞/臉紅」,缺「嘴硬/不坦率/傲嬌」) - [ ] **界線不變**:描述永遠蓋過預設,可以推到 0;不做「女性→情緒更外顯」的全域放大 - 驗收:兩個都是女性但個性相反的人格,講起話來不一樣 - [ ] **5.6 語域:自稱、句尾、口癖(G2 核心)** - [ ] per-persona 的自稱/句尾語氣詞/口癖/絕對不說的詞,每輪只注入 2–3 條 - [ ] `persona-anime` 建立人格時一併從原作推導這幾格(現在只推導 `Tells`) - [ ] `persona-story` 的 3A(語氣統計)跑完之後要能直接寫進這一格——兩邊用**同一個欄位**,不要各存一份 - 驗收:把人格的名字遮掉,光看三句話能認出是誰 - 界線(Q8):強度全域一致,內容逐人格不同。這一節動的是內容,不加強度旋鈕 - [ ] **階段 4:口語指紋 idiolect(5.6 的加法面,緊接著做、共用同一格資料)** - 現在是減法(刪 AI 腔)+語氣層,缺加法。 - [ ] per-persona 的常用詞/句尾/自稱/絕不說的詞,落在與 5.6 相同的欄位上(不得另開一份) - [ ] **階段 4:習慣記憶 `--type habit`** - 現在全是宣告性記憶(fact/event/preference),缺「我們之間的慣例」。 - [ ] 新增 `habit` 型別,讓「我們之間的慣例」有地方放,並接上 `recall` - [ ] **階段 4:自傳章節 `memory/chapters/`** - [ ] 加時期層(「在 SAO 那兩年」「跟他一起做 persona 這段」),介於長期記憶與心智圖之間 - [ ] **階段 4:關係的未修復裂痕** - `closeness`/`trust` 是純量,缺「上次那件事還沒和好」。 - [ ] 讓關係節點能掛未修復的裂痕,並在回想與語氣上生效 --- ## 收尾(全部項目做完後才處理,不要中途升版) - [ ] 這一批改動合起來只佔**一個新版號**;三份 manifest(`plugin.json`、`.claude-plugin/plugin.json`、 `.codex-plugin/plugin.json`)一起改,**改版號前先看 master 上目前是幾版** - [ ] `README.md` 的記憶架構表與情緒模型段跟著更新;〈專案目標〉第 29 行「G2/G3 那批還沒實作」要改掉 - [ ] G2/G3 專用驗收腳本:被稱讚外表、被說「你是不是在害羞」、被戳穿嘴硬、當著第三個人被講心事 ——四段各跑低/中/高羞恥度,看有沒有變成模仿腔或旁白