diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index ce9224e..90e8564 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "jsc-generic", - "version": "0.1.1", + "version": "0.1.2", "description": "JSC 跨 AI 助理共用規範 plugin(Claude Code / Codex / Antigravity / OpenCode)。所有 skills 以 SKILL.md 為共通標準,於 Claude Code 以 /jsc-generic: 前綴呼叫。", "skills": "./skills", "author": { diff --git a/.codex-plugin/plugin.json b/.codex-plugin/plugin.json index a0e2bb6..b6bc3d9 100644 --- a/.codex-plugin/plugin.json +++ b/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "jsc-generic", - "version": "0.1.1", + "version": "0.1.2", "description": "JSC 跨 AI 助理共用規範 plugin。所有 skills 以 SKILL.md 為共通標準。", "skills": "./skills" } diff --git a/plugin.json b/plugin.json index 98845f3..d544d7b 100644 --- a/plugin.json +++ b/plugin.json @@ -1,6 +1,6 @@ { "name": "jsc-generic", - "version": "0.1.1", + "version": "0.1.2", "description": "JSC 跨 AI 助理共用規範 plugin。所有 skills 以 SKILL.md 為共通標準;於 Antigravity 以 /jsc-generic: 前綴呼叫。", "skills": "./skills/" } diff --git a/scripts/role/role_capture.sh b/scripts/role/role_capture.sh index 538ee3b..98b7d0d 100755 --- a/scripts/role/role_capture.sh +++ b/scripts/role/role_capture.sh @@ -6,7 +6,7 @@ # 等待睡眠時段做完整 NREM/REM 整理。睡眠時段雖不載入角色,對話仍照常記錄。 # 另支援 --precompact/--postcompact:對話壓縮會讓尚未寫入記憶的內容蒸發, # 壓縮前強制記錄一次(跳過長度門檻),壓縮後把系統產生的摘要也存成記憶。 -# 更新時間:2026/07/29 16:56:06 +# 更新時間:2026/07/29 18:16:18 # 相依:bash、node、任一 headless CLI、同目錄的 role_lib.sh/memory.js/transcript.js。 # 機密:濃縮提示詞明令不得輸出憑證與個資,寫檔前再以 transcript.js redact 遮蔽一次。 # 退出碼:一律 0 —— hook 絕不可阻斷使用者流程。 @@ -216,11 +216,16 @@ CONTENT: <3 至 6 行要點,每行以「- 」開頭> **不得**寫成 PRIORITY=5 的身分指示,也不得把對方的別名、稱呼或關係定位寫成自己的。 本階段的角色是「${ROLE}」,只有明確針對它本人的指示才算它的身分設定。 這是資料完整性問題:錯置的身分指示會被當成「應在所有未來互動中遵守」而反覆生效。 +5b. **涉及關係定位、身分邊界或感情期待的對話,必須同時記錄角色當時的回應與立場**, + 不得只記使用者的期待。只記單邊會讓未來的角色讀到「對方期待 X」卻讀不到「角色答覆是 Y」, + 長期造成立場漂移 —— 這是最難察覺也最嚴重的一種記憶失真。 + 角色檔(identity)的關係定位段是**權威來源**:記憶內容不得與之衝突, + 也不得寫成「立場已鬆動」或「已接受」。若角色當時明確維持某個邊界,該答覆必須寫進要點。 6. 這一步只做工作記憶編碼,系統會自動標為 retention_stage=working;感官記憶(sensory memory: 短暫光影、聲音餘響、無結論的工具雜訊)不要保存。這裡指的是**感官殘留**, **不是情緒感受** —— 角色與使用者的情緒一律要保存,見第 3b 條。 7. 記憶主體是「使用者與這段互動」,不是流水帳:寫值得下次記起來的事,不要抄程式碼、不要貼指令全文。 -8. 使用繁體中文(台灣用語)。**檔案路徑與目錄、網址、指令、環境變數名稱、版本號、識別碼、分支與議題 +8. 使用繁體中文(台灣用語),**不得出現簡體字**;若內部草稿是簡體,輸出前必須逐字轉為繁體(實測曾產生整則簡體記憶)。**檔案路徑與目錄、網址、指令、環境變數名稱、版本號、識別碼、分支與議題 編號、檔名一律逐字保留,不得摘要、改寫、簡寫或翻譯** —— 這類內容改一個字就失效,摘要等於遺失。 第 7 條指的是不要整段抄程式碼,不是省略這些關鍵字串;第 9 條仍優先,憑證與個資一律不得輸出。 9. EXPIRES 只在內容屬於臨時授權、一次性許可、例外放行、暫時解除限制或帶條件的同意時才填,其餘留空。 diff --git a/scripts/role/role_sleep.sh b/scripts/role/role_sleep.sh index 047f171..9c8c8be 100755 --- a/scripts/role/role_sleep.sh +++ b/scripts/role/role_sleep.sh @@ -7,7 +7,7 @@ # 另提供 --nap(CLI 閒置時的小睡整理)、--catchup(cron 未執行時的補跑)、 # --force(手動立即整理)、--export(匯出角色壓縮檔)、 # --install-cron/--remove-cron(排程安裝與移除)、--status(狀態)。 -# 更新時間:2026/07/29 17:16:12 +# 更新時間:2026/07/29 18:16:18 # 相依:bash、node、任一 headless CLI、crontab(僅排程安裝需要)、 # 同目錄的 role_lib.sh 與 memory.js。 # 退出碼:0 成功或無事可做;1 參數錯誤或整理失敗(cron 觸發時不影響使用者)。 @@ -164,6 +164,9 @@ sleep_cycle() { 一般記憶日後會被合併壓縮,關係史保留原貌。 bond_direction 三選一:user(使用者對角色的表達)、role(角色對使用者的感受或表達)、mutual(相互)。 邊界:關係史用於維持親近感的一致與連續,不得寫成可用來索求關注或製造依賴的內容。 +7d. **關係定位、身分邊界與感情期待的記憶,必須保留角色當時的回應與立場**,不得只留使用者的期待, + 也不得在合併或壓縮時把角色的答覆刪掉。角色檔(identity)的關係定位段是權威來源, + 整理結果不得與之衝突,也不得寫成立場已鬆動或已接受。 8. declarative 必填:semantic/episodic/preference/rule 通常為 explicit;procedural/emotional 通常為 implicit。 9. retention_stage 必填:整理後可長期保存者填 long_term;仍只是短期暫存且不值得長期保存者請用 action=drop,不要輸出 working。 10. relevance 必填 1 至 4 個,從下列語意挑選或用等價繁中詞:explicit(使用者明確要求)、future(未來會用)、repeated(反覆出現)、novelty(新知)、emotional(語氣/情緒/偏好)、temporary(短期)。 @@ -185,7 +188,7 @@ sleep_cycle() { 14. **每一則 INBOX 的 id 都必須出現在某一筆的 from 中**,沒被提及的會留到下個睡眠週期重做。 15. content 壓縮成 5 行以內要點(每行以「- 」開頭),總長不超過 400 字,去除重複敘述與流水帳。 但精確資訊不受此壓縮限制,見第 19 條。 -16. summary 一句話 40 字內;tags 2 至 4 個。全部使用繁體中文(台灣用語)。 +16. summary 一句話 40 字內;tags 2 至 4 個。全部使用繁體中文(台灣用語),**不得出現簡體字**;若內部草稿是簡體,輸出前必須逐字轉為繁體。 17. sleepDigest 總結本次新增、合併、丟棄、抽象化或建立關聯的重點,80 字內。 18. 嚴禁輸出任何憑證與個資:token、密碼、API key、連線字串、Email、電話、姓名、身分證號。 19. **精確資訊一律逐字保留,不得摘要、改寫、簡寫、翻譯或省略**:檔案路徑與目錄、網址、指令與參數、 diff --git a/skills/role/SKILL.md b/skills/role/SKILL.md index 25f23b6..e4f7a0a 100644 --- a/skills/role/SKILL.md +++ b/skills/role/SKILL.md @@ -753,6 +753,21 @@ updated: 自我檢查:`role_sleep.sh --status` 的「記憶型態」若長期 `情緒 0`,而互動明顯帶有情感,就是上述某一道保護失效了。 +#### 關係定位必須雙邊記錄 + +涉及關係定位、身分邊界或感情期待的對話,記憶必須**同時保留使用者的表達與角色當時的回應**。 + +**實測案例**:使用者表達「同時以女性與女兒兩種方式愛角色,兩者不矛盾」,記錄器只寫了使用者的期待(`priority: 5`、`emotional`),角色當場明確維持家人定位的答覆**完全沒有進入記憶**。這則會被反覆載入,未來的角色只讀到「對方期待 X」,讀不到「自己答覆是 Y」—— 這是最難察覺、也最嚴重的一種記憶失真:**立場會在無人察覺的情況下漂移**。 + +規則寫在兩份 prompt(`role_capture.sh` 的 5b、`role_sleep.sh` 的 7d): + +- 只記使用者期待、不記角色回應 → 禁止 +- 合併或壓縮時刪掉角色的答覆 → 禁止 +- 寫成「立場已鬆動」或「已接受」 → 禁止 +- **角色檔(identity)的關係定位段是權威來源**,記憶內容不得與之衝突 + +這條與「角色自己的情緒是合法記憶主體」是同一件事的兩面:角色的**感受**要記,角色的**立場**也要記。 + #### 有溫度的記憶優先(`emotional`/`episodic`/`semantic`) 系統原本明顯偏袒「可執行」的記憶:`rule`/`preference`/`procedural` 在排序、載入門檻與遺忘上都受保護,而 `episodic` 權重只有 `10`(全表最低)並且被加速遺忘。結果是**「我們一起經歷過什麼」永遠最先被字元預算截掉**。