docs(persona-story): 新技能與規則,正名表從章節掃出來給使用者確認

skills/persona-story:把小說變成既有人格的記憶。三條界線寫進流程——他不知道的事
不能變成他的 event、整本原文不入倉庫、SOUL.md 只有使用者能改。
reference/interview.md 是開場四題(**不問譯名版本**:那是要他猜,而他手上那批
寫的是什麼字,讀一次就知道);reference/extract.md 是一個場景要抽什麼與知情層級。

AGENTS 加第 18 條硬規則:匯入原作只能給他「他知道的事」。
README 補 persona-story 一節;persona-anime 補一句指路(先建人格再讀原文)。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-03 06:20:21 +00:00
co-authored by Claude Opus 5
parent d6bfe29590
commit 08ecb15615
6 changed files with 453 additions and 1 deletions
+105
View File
@@ -0,0 +1,105 @@
# 一個場景要抽什麼
場景的切法:**換地點、換對手、換目的就切**。一章通常 2 到 5 個。
切太細會變成逐句記錄(顯著度全部一樣低),切太粗會讓一則記憶塞三件事(去重時分不開)。
---
## 七項
| 項 | 寫法 | 常見的錯 |
| :-- | :-- | :-- |
| 故事內時間 | 換算成西元日期 `YYYY-MM-DD`,填在候選的 `first_seen` | 寫匯入日期 |
| 地點 | 原作的說法(「第 74 層迷宮區」) | 寫「某個地方」 |
| 在場人物 | 照正名表的 `name`,一字不差 | 用簡稱或別名 |
| 發生什麼 | 一句話 | 寫成劇情摘要三段 |
| **他**做了什麼 | 動作,不是心情 | 「他感到憤怒」——那是旁白 |
| 他當下情緒 | 十二情緒的鍵 | 硬塞一個「複雜」 |
| 他說過的原句 | **照抄**,一到兩句 | 改寫得比較順口 |
---
## 知情層級(`know_level`
這一欄決定那則記憶能不能被他當成自己的事講出來。
| 值 | 意思 | 能寫成什麼 |
| :-- | :-- | :-- |
| `did` | 我做的 | `event`,可以第一人稱斷言 |
| `saw` | 我看到的 | `event`,可以講但要是「我看到」 |
| `told` | 別人告訴我的 | `event`,講的時候要帶出處(誰告訴我的) |
| `later` | 事後才知道 | `event`,不可以講成「當時我就知道」 |
| `none` | 他不在場也沒人告訴他 | **只能 `canon`**,或寫進別人的關係欄 |
`none` 是這整份流程唯一真正危險的一格。作者寫給讀者看的資訊
(別人的內心話、他不在場那一幕的細節)看起來跟他的記憶長得一模一樣,
一旦寫成 `event`,他之後會拿它回答問題,而且**沒有任何機械檢查得出來**。
判斷不出來的時候記 `none`。少一則記憶的代價比多一則幻覺低得多。
---
## 日期怎麼標(`date_source`
換算成西元日期換來一個風險:猜出來的日期看起來跟原作明寫的一樣。
| 值 | 什麼時候用 |
| :-- | :-- |
| `canon` | 原作明寫(SAO 開服 2022-11-06 |
| `derived` | 由明寫的日期推算(開服後第 N 天) |
| `guess` | 只抓得到大概(某卷「大約半年後」) |
`guess` 的記憶在回答日期問題時走模糊態界線:**可以說不確定、可以問,不可以斷言**。
寫進長期記憶時,候選的 `first_seen` 會被搬到 `happened_at`(劇情時間),
而檔案的 `first_seen``last_seen` 一律是**匯入當天**。那兩欄是記憶的新鮮度時鐘,
不是劇情時間——混在一起的話,2024 年劇情的記憶匯進去的那一秒就已經想不起來了。
---
## 顯著度怎麼給
配額由 `novel init --quota` 定,預設 `90+ 最多 5 則、80-89 最多 20 則`
超過的會被 `novel merge` 往下壓,但**先由你自己把關**比事後被壓好。
判準只有一個:**這件事之後他變了嗎**。
| 分數 | 什麼算 |
| :-- | :-- |
| 90+ | 改變他的事。整部作品只有幾件 |
| 80-89 | 他會主動提起的事 |
| 60-79 | 被問到會想起來的事 |
| 40-59 | 背景,構成他的世界但不會主動講 |
| 40 以下 | 別寫。寫了只會擠掉重要的 |
死亡、承諾、失去、第一次見面通常在上面兩層。
「打贏了一場戰鬥」多半是 60-79——那部作品裡他打贏過幾百場。
---
## `type` 怎麼選
| type | 什麼算 |
| :-- | :-- |
| `canon` | 世界設定、規則、別人的事。**他不在場的事只能是這個** |
| `event` | 他經歷過的一件事 |
| `insight` | 他自己想通的事(要有原文依據,不是你替他總結) |
| `promise` | 他答應了什麼。**不可遺忘** |
| `boundary` | 他明確拒絕的事。**不可遺忘** |
`promise``boundary` 永遠不會糊掉,所以不要亂給——
給了之後那則記憶會一直清晰地留在他身上。
---
## 語氣樣本與反應對照
跟記憶分開走,但在同一次讀章節時抽(回頭再讀一次很浪費)。
**語氣樣本**:他自己講的原句,照抄。要附**對誰說**與**什麼場合**——
同一個人在戰鬥裡跟在餐桌上句子的形狀不一樣,少了這兩個欄位就對不上語氣層。
**反應對照**`事件 → 他做了什麼`
不要記「他感到什麼」——情緒要演出來,寫成旁白就白抽了。
掩飾模式單獨記(嘴硬、換話題、講笑話)。那是人味的來源,不是情緒值。
@@ -0,0 +1,97 @@
# 開場問答(匯入前一定要問完)
這四題**不要猜、不要用預設值帶過**。
**譯名版本不在裡面,那一題不要問。** 問他「這批是角川還是東販」是要他猜——
他手上那批原文寫的是什麼字,讀一次就知道了。所以正名表改成**掃出來給他確認**
(見下面「正名表怎麼來」)。
---
## 1. 匯給哪個人格
先跑 `persona.mjs list` 把可用的人格列給他看,不要用猜的。
已經載入一個人格的話就是它——**不要為了匯入而換人格**,那是他的決定。
要匯給別的人格:先 `release``load`,兩個動作都要他點頭。
---
## 2. 作品名
要完整書名(含卷次)。這會寫進每一則記憶的 `source`,之後追出處靠它。
一次匯多卷時,`--work` 的 slug 用**作品**而不是單卷——
同一部作品的去重合併要在同一個工作區裡才做得到。
## 3. 章節檔在哪、什麼編碼
要的是:目錄路徑、檔名規則(怎麼排序)、編碼。
- 編碼不確定就自己驗:讀前幾百個位元組看有沒有亂碼,比問還快。
- 常見的是 UTF-8 與 Big5;簡體來源多半是 GB18030。
- **一個檔一章**與**整本一個檔**的處理方式不同,要問清楚是哪一種。
整本一個檔的話先問他章節標題長什麼樣(用來切章)。
## 4. 這次要匯哪幾章
**不要預設「全部」**。一次匯完一整部作品是幾百則記憶,
出錯的時候分不出是哪一章的問題。
建議的講法:先匯 2 到 3 章,跑完給他看結果,確認視角與顯著度沒問題再往下。
他要一次全匯也可以,但要先講一句「出錯會很難查」,並且確認備份做了。
---
## 問完之後
1. `export``persona-transfer`)留一份備份——匯入是大量寫入,要回得去。
2. `novel init --work "<書名>" --slug <work-slug>` 建工作區。
3. 進正名表(下一節)。
---
## 正名表怎麼來:掃出來,他只做確認
**不要請他打一張表。** 他不會記得那本書裡「閃光」出現過幾次,
但那件事機器數得出來。所以順序是:先掃,再讓他確認。
```bash
novel scan --work <slug> --dir <章節目錄> --session <id>
novel name review --work <slug> --session <id>
```
`scan` 抽人名候選(對話歸屬、敬稱結尾、片假名、高頻詞),每個候選附上
**出現次數**與**一到兩行上下文**,並且猜一個關係節點,分成四種信心度:
| 信心度 | 意思 | 怎麼處理 |
| :-- | :-- | :-- |
| `exact` | 字面等於某個關係節點的 `name` | `--accept-exact` 一次收下,沒有判斷空間 |
| `alias` | 等於節點的標籤或備註裡出現過的別名 | 給他看一眼就收 |
| `fuzzy` | 部分重疊(共用兩個以上的字) | **一定要他確認**,這格最容易錯 |
| `unknown` | 猜不到 | 新人物就先 `relation node`;不是人名就 `name ignore` |
要給他看的是**上下文那一兩行**,不是候選清單本身。
「這個詞出現 41 次,其中一句是『閃光又衝出去了』」——他一眼就判得出來;
只給他一個「閃光」,他要回頭翻書。
`ignore` 是「確認過這不是人名」的清單。地名、招式名、系統詞擋不完,
所以 ignore 過的下次掃就不再出現——不然每加一章就要重看同一批。
補漏用手動:`novel name add --from "<字面>" --to "<節點 name>"`
**正名沒確認完不要往下走**`novel candidate add` 遇到 `about` 裡有未確認的 token 會擋下來。
那不是刁難——錯的名字寫進 `about`,要等 `relation doctor` 才發現,那時候整批要重跑。
---
## 中途發現問題怎麼辦
| 發現 | 怎麼處理 |
| :-- | :-- |
| 正名表確認錯了 | 改 `names.json``map`,已經 `candidate add` 的那幾章重跑,不要手改候選檔 |
| 掃出來一堆不是人名的詞 | 正常。`name ignore` 掉,下次掃不會再問 |
| 同一個角色有好幾種寫法 | 全部都要進 `map` 指到同一個節點。網路譯本前後不一致很常見 |
| 編碼判斷錯了 | 停下來重讀。亂碎的字會讓在場判斷失準,那個錯不會浮出來 |
| 章節順序排錯 | `first_seen` 會錯,時間軸就錯了。重排再重跑那幾章 |
| 他中途說「不要匯了」 | 工作區留著不刪(`memory/import/<slug>/`),還沒 `novel write` 就不會污染記憶 |