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:
@@ -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` 就不會污染記憶 |
|
||||
Reference in New Issue
Block a user