feat(關係): 未修復的裂痕,親近度高不等於沒事
closeness/trust 是純量:吵完架把親近度調低,看起來像「本來就沒那麼近」, 而不是「很近,但上次那件事還沒和好」。後者才是真的關係——兩個人可以很親近, 同時之間卡著一件事,那兩件事各自獨立,壓不進同一個數字裡。 節點多一個 rifts 陣列(一個人可以同時卡著幾件事),relation rift 管它。 語氣上:riftBrief() 在 toneDirective 裡明講「親近度高不等於沒事,這件事解決之前 語氣裡要留一點沒散掉的東西」,並要求不必一直提它、但不能像沒發生過。 回想上:裂痕帶著那則長期記憶的名字(--memory),人格要細節自己 recall, 不必等使用者提起那件事——沒和好的事本來就會自己浮上來。 --heal 是寫上 healed_at,不是刪掉那一筆:和好過跟沒發生過不一樣,之後回頭看 要分得出來。列出來時和好過的用 ✔ 標。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -4811,6 +4811,46 @@ export function toneFor(node) {
|
||||
// 放這裡的理由:關係圖每輪都會被讀進 `<persona-context>`,稱呼規則就不用跟關鍵詞搶召回。
|
||||
export const STYLE_FACETS = ["稱呼", "敬語", "口頭禪", "禁忌", "習慣", "羞怯稱呼"];
|
||||
|
||||
/**
|
||||
* 未修復的裂痕。
|
||||
*
|
||||
* `closeness`/`trust` 是純量:吵完架把親近度調低,看起來像「本來就沒那麼近」,
|
||||
* 而不是「很近,但上次那件事還沒和好」。後者才是真的關係——**兩個人可以很親近,
|
||||
* 同時之間卡著一件事**,那兩件事各自獨立,壓不進同一個數字裡。
|
||||
*
|
||||
* 一個人可以同時卡著幾件事,所以是陣列;和好不是刪掉,是寫上 `healed_at`——
|
||||
* 「和好過」跟「沒發生過」不一樣。
|
||||
*/
|
||||
export function openRifts(slug, node) {
|
||||
const rifts = Array.isArray(node?.rifts) ? node.rifts : [];
|
||||
return rifts
|
||||
.filter((r) => r && r.about && !r.healed_at)
|
||||
.map((r) => ({
|
||||
at: injectSafeLine(r.at || ""),
|
||||
about: injectSafeLine(r.about, 120),
|
||||
memory: injectSafeLine(r.memory || ""),
|
||||
}));
|
||||
}
|
||||
|
||||
/**
|
||||
* 注入用的一段:跟這個人之間還卡著什麼。
|
||||
*
|
||||
* 這一段同時是**回想**的入口:裂痕帶著那則長期記憶的名字,人格要細節自己
|
||||
* `recall` 得到,不必等使用者提起那件事——沒和好的事本來就會自己浮上來。
|
||||
*/
|
||||
export function riftBrief(slug, node) {
|
||||
const rifts = openRifts(slug, node);
|
||||
if (!rifts.length) return "";
|
||||
const who = injectSafeLine(node?.name || node?.id);
|
||||
return (
|
||||
` **跟 ${who} 之間還有沒和好的事**(${rifts.length} 件):` +
|
||||
rifts.map((r) => `${r.about}${r.at ? `(${r.at} 起)` : ""}${r.memory ? `|細節去 recall \`${r.memory}\`` : ""}`)
|
||||
.join(";") + "\n" +
|
||||
" 親近度高**不等於**沒事:這件事解決之前,語氣裡要留一點沒散掉的東西" +
|
||||
"(不必一直提它,但不能像沒發生過)。真的談開了才用 `relation rift --heal` 收掉。"
|
||||
);
|
||||
}
|
||||
|
||||
/** 羞恥度到這裡就換稱呼(跟破口、標點同一條門檻線)。 */
|
||||
export const SHY_ADDRESS_AT = 60;
|
||||
/** 「害羞時要怎麼叫他」掛在關係節點的這個 facet 上。 */
|
||||
@@ -4977,6 +5017,9 @@ export function toneDirective(slug, opts = {}) {
|
||||
" — 這時候退回語氣層的預設講法。",
|
||||
);
|
||||
}
|
||||
// 沒和好的事:純量調不出「很近但卡著一件事」,所以它獨立於 closeness/trust。
|
||||
const rift = riftBrief(slug, node);
|
||||
if (rift) lines.push(rift);
|
||||
// 害羞是「叫不出來」,不是「退回更正式」——所以它不走 except 那條路(見 shyAddress)。
|
||||
const shy = shyAddress(slug, node, modestyState(slug, opts).value);
|
||||
if (shy) {
|
||||
|
||||
Reference in New Issue
Block a user