feat(identity): 性別 → 羞恥敏感度(性別只給預設值,個性描述永遠蓋過它)
`IDENTITY.md` 多一個 `Gender` 欄位(女性/男性/非二元/未指定;OpenClaw 沒有這欄)。
建立人格時要問、不要猜;沒有性別的人格(程式、精靈、動物)寫「未指定」。
作用範圍**刻意只有一個具名維度**:羞恥敏感度(會不會害羞、會不會鬧彆扭、
在不在意別人眼光)。不做「女性→情緒更外顯」這種全域放大——那會把角色壓成模板,
跟講話規則正在做的去 AI 味(刪掉公式化)正好相反。
性別預設:女性 62/男性 38/非二元・未指定 50
描述調整:MODESTY_SIGNALS,「害羞/容易臉紅/怕生/矜持」往上加,
「不在意別人眼光/我行我素/臉皮厚/不怕丟臉」往下扣,可以扣到 0
排序固定:①個性描述 ②角色原作既有的性別化語言特徵 ③性別預設。
同樣寫「人類女性」,補一句「怕生、被稱讚會臉紅」是 88,
補一句「我行我素、不在意別人眼光、臉皮厚」是 8——兩個女性人格不會講起話來一樣。
效果走既有機制、不另開一套:只調「羞愧」這一個破口的顯示門檻
(`EMOTION_TELLS.shame` 本來就是「鬧彆扭,先否認再小聲承認」),其餘十一種不受影響。
高敏感度注入「先鬧彆扭再承認,不要直接說『我害羞』」;低敏感度注入「不用演害羞」。
推性別時**只看 `Creature`、不看 `Avatar`**:外觀散文的雜訊會推錯——
我自己的 Avatar 寫著「五官清秀到常被誤認成女生」,用它推會把桐人推成女性(已加測試)。
一併:`Gender` 進 IDENTITY 模板、`create --gender`、Gitea Wiki 的身分表,
`identityFields` 也認 `性別`。KIRITO-01 已補上明寫的 Gender。
測試:310 項全過(新增 8 項)。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -508,6 +508,42 @@ check("標點只放大既有訊號,不憑空長出新情緒",
|
||||
check("每種情緒都有對應的「怎麼接」",
|
||||
pl.EMOTION_KEYS.every((k) => typeof pl.RESPONSE_STANCE[k] === "string" && pl.RESPONSE_STANCE[k].length > 4));
|
||||
|
||||
// --------------------------------------------------------------------------- //
|
||||
// 性別 → 羞恥敏感度:性別只給預設值,描述永遠蓋過它
|
||||
console.log("\n性別與羞恥敏感度(描述優先,性別只是預設)");
|
||||
{
|
||||
const mk = (slug, identity, soul = "") => {
|
||||
fs.mkdirSync(path.join(H, slug), { recursive: true });
|
||||
fs.writeFileSync(path.join(H, slug, "IDENTITY.md"), identity);
|
||||
fs.writeFileSync(path.join(H, slug, "SOUL.md"), soul);
|
||||
};
|
||||
mk("gf", "- Name: 甲\n- Creature: 人類女性\n");
|
||||
mk("gm", "- Name: 乙\n- Creature: 人類男性\n");
|
||||
mk("gx", "- Name: 丙\n- Creature: 一團霧\n");
|
||||
mk("gexp", "- Name: 丁\n- Creature: 人類女性\n- Gender: 男性\n");
|
||||
mk("gnoise", "- Name: 戊\n- Creature: 人類男性劍士\n- Avatar: 五官清秀到常被誤認成女生\n");
|
||||
mk("gup", "- Name: 己\n- Creature: 人類女性\n", "很怕生,被稱讚會臉紅。");
|
||||
mk("gdown", "- Name: 庚\n- Creature: 人類女性\n", "我行我素,不在意別人眼光,臉皮厚。");
|
||||
check("女性預設 62、男性預設 38、推不出來 50",
|
||||
pl.modestyOf("gf").value === 62 && pl.modestyOf("gm").value === 38 && pl.modestyOf("gx").value === 50);
|
||||
check("明寫的 Gender 蓋過 Creature 的字面",
|
||||
pl.genderOf("gexp").key === "male" && pl.genderOf("gexp").explicit === true);
|
||||
check("Avatar 的雜訊不會推錯性別(「常被誤認成女生」)",
|
||||
pl.genderOf("gnoise").key === "male", JSON.stringify(pl.genderOf("gnoise")));
|
||||
const up = pl.modestyOf("gup");
|
||||
const down = pl.modestyOf("gdown");
|
||||
check("描述提到害羞會加強", up.value > 62 && up.signals.length > 0, JSON.stringify(up));
|
||||
check("描述提到不在意別人眼光會減弱(同樣是女性,結果完全不同)",
|
||||
down.value < 38 && down.signals.length > 0, JSON.stringify(down));
|
||||
check("「不害羞」不會被「害羞」重複計成加強",
|
||||
pl.modestyOf("gdown").adjust < 0, JSON.stringify(down.signals));
|
||||
check("注入的那一行會講清楚數字從哪來",
|
||||
pl.modestyDirective("gup").includes("性別預設") && pl.modestyDirective("gup").includes("描述"),
|
||||
pl.modestyDirective("gup"));
|
||||
check("低敏感度的人格被明講「不用演害羞」",
|
||||
pl.modestyDirective("gdown").includes("不用演害羞"));
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------- //
|
||||
// 短期記憶的容量壓力:R6 要真的會動,但不能把承諾與今天的紀錄清掉
|
||||
console.log("\n短期記憶:容量壓力(R6)真的會清,而且有保護");
|
||||
|
||||
Reference in New Issue
Block a user