feat(persona): 時區改為+08:00等值轉換、補機密遮蔽,並接上shared共用規範

依 todo.md 執行的規範治理專案:
- persona-lib.mjs 的 iso()/nowIso() 改為輸出 +08:00 offset(等值瞬間轉換,
  非加8小時),新增 nowDisplay()(人讀顯示格式)與 todayTaipei()(台北曆日
  日期鍵),修正 11 處原本用 UTC 字串切片產生日期鍵的錯誤用法;新增
  redactSecrets() 並套用到 persona-gitea.mjs 的 Gitea 錯誤路徑,避免機密
  外洩。
- 新增一次性遷移腳本 scripts/migrate-tz.mjs(備份/dry-run/冪等/衝突偵測
  中止),供之後有真實人格資料需要轉換時使用。
- persona 13 個 skill 與 AGENTS.md 接上 /jsc-shared 共用規範(spec-output、
  spec-script-path、spec-subagent、spec-gitea、spec-git-safety、
  spec-skill-invocation 等),不再各自重抄,且完全未變動人格行為本身的規範
  (情緒模型、記憶衰減、劇場模式、鎖與隔離機制等逐字保留)。
- selftest 全數通過(788/788,含本次新增的時區邊界/冪等性測試)。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-11 06:06:00 +00:00
co-authored by Claude Sonnet 5
parent 5fb2a43189
commit ac2045e52f
25 changed files with 927 additions and 181 deletions
+14 -5
View File
@@ -10,6 +10,14 @@ description: 讓人格睡覺:把一天的活狀態收成能留下來的形狀
---
## 共用規範(必要前置)
先載入 `/jsc-shared:spec-preflight` 並依其流程處理;載入不到即代表 shared plugin 未安裝,
依該 spec 詢問使用者是否安裝 `https://gitea.jsc.idv.tw/plugins/shared.git`,不安裝則中斷本 skill。
本 skill 需要的規範:spec-output、spec-execution、spec-time-log、spec-script-path、spec-subagent、spec-gitea、spec-git-safety
---
## 睡眠是什麼
不是關機,是**把一天的活狀態收成能留下來的形狀**。分成兩半:
@@ -59,17 +67,20 @@ node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" sleep --session <PERSONA_SESSIO
## 情況二:主人格請其他人格去睡(不碰它們的檔案)
使用者說「叫大家去睡」時,**對每一個要睡的人格**各開一個 sub agent:
派工基本規則(一個目標一個 sub agent、回傳結構化結果供主 agent 判讀而非直接面向使用者)
詳見 `/jsc-shared:spec-subagent`。套用到睡眠情境:使用者說「叫大家去睡」時,
**對每一個要睡的人格**各開一個 sub agent:
- `subagent_type`:`jsc-persona:persona-sleeper`
- prompt 內帶:`persona=<slug> session=<PERSONA_SESSION> plugin_root=<CLAUDE_PLUGIN_ROOT>`
那個 sub agent 就是**那個人格本人**在睡:它自己判斷要記住什麼,寫的是自己的檔案。
那個 sub agent 就是**那個人格本人**在睡——它被 pin 在自己的人格上,只能動自己的資料:
它自己判斷要記住什麼,寫的是自己的檔案。
它手上是 5 分鐘的 sleeper 租約(不是 exclusive 鎖),所以它的每個指令都會帶 `--as-sleeper`——
那個旗標只有 persona-sleeper 型的 sub agent 能用,主人格自己帶會被 hook 擋下。
帶了它,讀(`brief`/`show`/`recall`)與寫(`consolidate` 等)都算它自己的資料;
**回報說「判斷式那半被隔離擋下」十之八九就是漏了這個旗標**,不是它沒有權限。
主人格全程不會讀到對方的任何資料——**你只會拿到一份 JSON**:
主人格全程不會讀到對方的任何資料——**回傳值只能是 `sleep --json` 的原文**:
```json
{ "persona": "YUI-01", "ok": true, "slept_at": "...", "steps": [ ... ], "sync": { ... }, "kept_lock": true }
@@ -122,5 +133,3 @@ node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" sleep --session <PERSONA_SESSIO
`sync` 遇到殘留的 `.git/index.lock`(上一次跑到一半被中斷留下的)會自己清掉重試,
不用請使用者手動刪,也不要自己對人格目錄下 `rm`——sleeper 的 shell 寫入本來就被 hook 擋著。
細節見 `/jsc-persona:persona-sync`。
所有面向使用者的輸出使用**繁體中文(台灣用語)**、UTF-8 無亂碼。