feat(分段訊息): 高張力或高羞恥時一輪可以補第二則
純文字唯一的「時間」訊號是「他又打了一行」——沒有停頓、沒有語調,真人在聊天軟體上 的情緒有一半是靠補那一句傳出去的。這個手段之前完全沒用到。 splitBudget():張力或羞恥度過 60,或對方那句帶怒意/厭惡,才給第二則額度。 splitDirective():第二則要短,而且是補救、嘴硬或改口,不可以是補充說明—— 把第一則講得更清楚就只是話多,不是慌。 節流 SPLIT_COOLDOWN_TURNS = 4,冷卻靠 felt.jsonl 新增的 split 欄位算。 冷卻是「給了額度就開始算」,不等他真的用了才算:不然「上次給了沒用到」會讓 連續幾輪都允許補話,每輪都補一句是話多不是慌。 沒額度時整段不注入。講「這一輪不能拆成兩則」等於提醒他有這個功能,反而會想用。 selftest 721 → 728。低羞恥度的對照組另建一個男性人格——plainf 是女性預設 70, 本身就過門檻,拿它當「平靜」的對照會測不出東西。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1231,6 +1231,34 @@ check("標點指示有注入,而且講明上限與「強度歸 emoji」", (()
|
||||
const ctxP = pl.turnContext("alpha", S_SPEAK, "那件事後來怎麼了");
|
||||
return ctxP.includes("此刻的標點") && ctxP.includes("刪節號不連發") && ctxP.includes("強度歸 emoji");
|
||||
})(), pl.turnContext("alpha", S_SPEAK, "那件事後來怎麼了").slice(0, 500));
|
||||
|
||||
// 分段訊息:一輪兩則。純文字唯一的「時間」訊號(他又打了一行)
|
||||
console.log("⑥-f 一輪可以拆成兩則");
|
||||
{
|
||||
// 低羞恥度的對照組要自己建:plainf 是女性預設 70,本身就過門檻了
|
||||
fs.mkdirSync(path.join(H, "calmsplit"), { recursive: true });
|
||||
fs.writeFileSync(path.join(H, "calmsplit", "IDENTITY.md"), "- Name: 寅\n- Creature: 人類男性\n");
|
||||
fs.writeFileSync(path.join(H, "calmsplit", "SOUL.md"), "不在意別人眼光,該說就說。");
|
||||
const calm = pl.splitBudget("calmsplit", {});
|
||||
check("張力與羞恥度都不到門檻時不給第二則",
|
||||
calm.allowed === false && calm.reason.includes("門檻"), JSON.stringify(calm));
|
||||
check("平靜時整段不注入(不提醒他有這個功能)", pl.splitDirective("calmsplit", {}) === "");
|
||||
check("從來沒拆過回 null", pl.turnsSinceSplit("calmsplit") === null);
|
||||
const hot = pl.splitBudget("shymax", {});
|
||||
check("羞恥度過門檻就給第二則",
|
||||
hot.allowed === true && hot.modesty >= pl.SPLIT_MODESTY_AT, JSON.stringify(hot));
|
||||
check("第二則是補救/嘴硬/改口,不是補充說明", (() => {
|
||||
const d = pl.splitDirective("shymax", {});
|
||||
return d.includes("補救") && d.includes("不可以是補充說明") && d.includes("要短");
|
||||
})(), pl.splitDirective("shymax", {}));
|
||||
pl.recordFelt("shymax", { modesty: 70, split: true });
|
||||
const cooling = pl.splitBudget("shymax", {});
|
||||
check("給過之後進入冷卻(給了就算,不等他真的用)",
|
||||
cooling.allowed === false && cooling.since === 0, JSON.stringify(cooling));
|
||||
for (let i = 0; i < pl.SPLIT_COOLDOWN_TURNS; i += 1) pl.recordFelt("shymax", { modesty: 70 });
|
||||
check("冷卻過了又能再給", pl.splitBudget("shymax", {}).allowed === true,
|
||||
JSON.stringify(pl.splitBudget("shymax", {})));
|
||||
}
|
||||
check("說話規則有注入「話短、日常字、看得見的東西、不要回頭解釋」", (() => {
|
||||
const ctxSay = pl.turnContext("alpha", S_SPEAK, "隨便講");
|
||||
return ["話短一點", "平常會說的字", "看得見的東西", "不要回頭解釋"].every((w) => ctxSay.includes(w));
|
||||
|
||||
Reference in New Issue
Block a user