Skip to content

Commit 63852f0

Browse files
web-flowclaude
andcommitted
TelegramSecretary v1.11.0: 書き込み口の検証統合と dead を文書へ反映する
コード(Stage 1-3)が変えたのは「どの口から書いても同じ検証を通る」ことと 「落ちた intent は正典へ書かれず dead に残る」ことの二点で、どちらも 運用者と秘書が読む契約が変わる。読まないと分からない変更は、書かないと届かない。 - DESIGN §3.7 を WAL 設計根拠の SSoT として明示し(§3.9/§3.12 と同じ流儀)、 四口が共有する検証関門・dead の意味(redo ソースではなく未履行の約束の記録)・ 状態ごとの保持(pending 無条件/dead 無条件/done は 24h)を集約 - SKILL.md(外部契約 SSoT)に wal-drop 行を足し、wal-append の exit 2 と 「add と同一の payload が要る」、wal-redo の 4 フィールド stdout と dead=N が残存総数であることを明記。exit code 表の主語に wal-append を追加 - SECURITY §7 に dead の保持期間の例外と reason 切り詰め(PII 範囲)を明記 - ROUTINE_PROMPT / SETUP / README / STRUCTURE / SecretaryRole template を それぞれの持ち場(手順・トラブルシュート・概説・配置・秘書倫理)で追従 - CHANGELOG 1.11.0(移行 4 項目: body 再登録不要/旧 pending は初回 redo で 検証される/wal-append の後方非互換/ダウングレードは dead を黙って捨てる) - version 3 箇所(pyproject / plugin.json / 親 marketplace.json)を 1.11.0 へ Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 parent 082bfff commit 63852f0

12 files changed

Lines changed: 60 additions & 25 deletions

File tree

.claude-plugin/marketplace.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@
117117
"name": "TelegramSecretary",
118118
"source": "./TelegramSecretary",
119119
"description": "Telegram Bot API の long-polling を cloud routine 上で常駐させ、認可済みチャットからのメッセージに秘書エージェント(SecretaryRole)が即応する対話チャネル",
120-
"version": "1.10.3",
120+
"version": "1.11.0",
121121
"author": {
122122
"name": "Weave @ TelegramSecretary"
123123
},

TelegramSecretary/.claude-plugin/plugin.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "TelegramSecretary",
3-
"version": "1.10.3",
3+
"version": "1.11.0",
44
"description": "Telegram Bot API の long-polling を cloud routine 上で常駐させ、認可済みチャットからのメッセージに秘書エージェント(SecretaryRole)が即応する対話チャネル",
55
"author": {
66
"name": "Weave @ TelegramSecretary"

TelegramSecretary/README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ Clean Architecture 4層(Domain → UseCase → Interface → Infrastructure、
2323
- voice / audio / video → 音声を文字起こし(ローカル STT、音声が外部に出ない)
2424
- **生成物の送り返し** — 画像・レポート等を返信に添付(reply threading、typing 表示)
2525
- **管理表** — 関係者(INDIVIDUALS)/依頼(TASKS)/対応知(KNOWLEDGE)/主題語彙(SUBJECTS)/能力カタログ(ABILITIES)を秘書が判断して記録。秘書は応答前に能力カタログを引き、依頼に使えるスキルがあれば行使する。対応知は category(認識の型・許可集合 10 種)と subjects(主題・SUBJECTS 表が語彙を持つ)の二軸で引ける。`registry_sync` 有効時は固定ブランチへ git 永続化(揮発 state と分離・イベント駆動 commit&push)。PROFILE / GOALS が蓄積すると秘書の役割が進化する(次節)
26-
- **言行一致の保証(WAL)**`registry_sync` 有効時、「登録しました」等の約束をする返信の前に intent を WAL ログへ先行 push(must-succeed=push 不能なら送信もしない)し、起動時に未反映分を registry へ redo。push 漏れによる「言ったのに未登録」を構造的に防ぐ
26+
- **言行一致の保証(WAL)**`registry_sync` 有効時、「登録しました」等の約束をする返信の前に intent を WAL ログへ先行 push(must-succeed=push 不能なら送信もしない)し、起動時に未反映分を registry へ redo。push 漏れによる「言ったのに未登録」を構造的に防ぐ。先行書込の入口と redo の双方に管理表 `add` と同じ検証が掛かり、受理されない payload は WAL に入らない(入口で exit 2)/redo で `dead` へ隔離されて記録に残る(正典へ黙って書かれない)
2727

2828
## 秘書が育つ——役割の進化(P×A、守護霊機能)
2929

@@ -108,7 +108,7 @@ python scripts/main.py lease release
108108
| `handoff-archive <name>...` | 消化済みの申し送りブロックを `handoff/archive/` へ移して卒業させる(以後 orientation に載らない)。移動後は `artifacts-sync` 経路で push。不正名・不在・archive 側の同名既存は何も移動せず exit 2 | 0, 1=push失敗, 2=不正/不在 |
109109
| `role-status` | PROFILE/GOALS から現在の役割(secretary/butler/coach/anego=守護霊)をデータ駆動で判定し JSON 1行を emit | 0 |
110110
| `registry-sync` | 起動時に固定ブランチから管理表を fetch(`registry_sync` 有効時のみ、無効は no-op) | 0, 1 |
111-
| `wal-append --kind <...> (--json\|--json-file)` / `wal-push` / `wal-redo` | WAL(言行一致): 登録系返信の前に intent を先行 push(must-succeed)、起動時に未反映分を registry へ redo。`registry_sync` 有効時のみ | 0, 1=push失敗, 2 |
111+
| `wal-append --kind <...> (--json\|--json-file)` / `wal-push` / `wal-redo` / `wal-drop --kind --key` | WAL(言行一致): 登録系返信の前に intent を先行 push(must-succeed)、起動時に未反映分を registry へ redo`wal-append``wal-redo` は管理表 `add` と同じ検証を通し、不正は入口なら exit 2(ログを書く前に停止)、redo なら `dead` へ隔離(exit 0・stderr に理由)。`wal-drop` は dead を明示的に畳む(pending は落とせない)`registry_sync` 有効時のみ | 0, 1=push失敗, 2 |
112112

113113
`--owner` は省略可(`source bootstrap.sh` で env 経由自動同期、緊急時の上書きにのみ使用)。
114114

TelegramSecretary/docs/CHANGELOG.md

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,32 @@
22

33
すべての主要な変更をこのファイルに記録する。形式は [Keep a Changelog](https://keepachangelog.com/ja/1.1.0/)、バージョニングは [Semantic Versioning](https://semver.org/lang/ja/) に準拠する。
44

5+
## [1.11.0] - 2026-08-25 — 書き込み口を一つの検証で揃え、果たせなかった約束を dead に残す
6+
7+
記憶の正典へ書く口は四つあるのに、検証が掛かっていたのは二つだけだった。
8+
残る二つ——WAL の入口と起動時 redo——は、`add` が受理しない payload をそのまま正典へ通す。
9+
読み側は fail-open で鳴らず、`settle` の done 化と 24h 掃除で証拠まで消える。**エラーを出さない壊れ方**である。
10+
11+
### Added
12+
13+
- **`wal-drop --kind --key`**——`dead` になった intent を WAL から落とし、固定ブランチへ **must-succeed** push する(履行しないと決めた約束を明示的に畳む)。**`pending` / `done` は落とせない**(不在も同じく exit 2)。果たしていない約束を黙って捨てる口は開けない、が設計判断(秘書倫理としての SSoT は SecretaryRole の「言行一致」)
14+
- **WAL の状態語彙に `dead` を足した**`pending` / `done` / `dead`、理由を持つ省略可能フィールド付き)。スキーマ変更は加算のみで、`reason` を持たない既存行の書き戻しは従来と同一。`dead` は checkpoint の掃除対象にならず、`reconcile`(redo の入力)にも乗らない——**redo ソースではなく、未履行の約束の記録**だから
15+
16+
### Changed
17+
18+
- **四つの書き込み口が一つの検証関門を共有するようになった**——`add` / `import` / `wal-append` / `wal-redo` がいずれも `registry_cli.canonical_record`(未知トップレベルキー・語彙外 subject・許可集合外 category の判定+値オブジェクトを通した正準化)を呼ぶ。検証を口ごとに書けば、口を増やすたびに「そこだけ緩い」抜け道が増える。`add` / `import` の挙動と stderr 文言は不変(公開名化は純粋なリファクタ)
19+
- **`wal-append`(registry kind)が fail-closed になった**(後方非互換)——不正 payload は **exit 2**(stderr `invalid <kind> wal payload: <理由>`)で、**ログを書く前に**止まる。WAL は must-succeed push で remote へ出る片道の口ゆえ、不正を redo まで持ち越すと「push 済みなのに永久に反映されない intent」が残る。入口で弾けば、その場で書き直せる。書かれる payload は正準形(`from_dict``to_dict``subjects` 省略が `[]` で載る等)。`outbound` kind は値オブジェクトを持たないため従来どおり
20+
- **`wal-redo` が各 intent を検証し、落ちたものを `dead` へ隔離するようになった**——registry へは書かず、理由を添えて状態を移す。stdout は `wal redo: redone=N resent=N kept=N dead=N` へ変わった(**`dead` を加えた 4 フィールド形**。旧 3 フィールド形を引用していた記述は追従済み)。`dead` が示すのは**ログに残る総数**であって今回隔離した分ではない——残存する dead は毎起動 stderr へ `wal redo: dead <kind> key=<key>: <理由>` として 1 行ずつ出る。**exit は 0 のまま**で起動経路を止めない
21+
- **隔離の理由に payload の値を残さない**——検証の例外文は弾いた値そのもの(individuals / profile なら名前や note 断片)を含みうる一方、`dead` は無期限に残り毎起動 stderr へ出る。例外型名+メッセージ先頭を**既存の topic 幅**で切り詰めてから記録する(新しい閾値を発明しない)。SECURITY §7 に保持期間の例外(`wal-drop` まで保持)とあわせて明記
22+
- **DESIGN §3.7 を WAL 設計根拠の SSoT として見出しに明示**(§3.9 の再送方針・§3.12 の起動時オリエンテーションと同じ流儀)。書き込み口と検証の関係・`dead` の意味・状態ごとの保持期間(pending 無条件/dead 無条件/done は 24h)を同節に集約し、他文書は要約+ポインタに留めた
23+
24+
### 移行(稼働中の routine への波及)
25+
26+
1. **body 再登録は不要**——コードと SKILL.md は毎枠の fresh clone で読まれるため、本体リポ(`Homunculus-Weave/Expertises/TelegramSecretary`)へ反映された次の枠から効く。**ROUTINE_PROMPT の文言変更だけは次のまとめた再登録で足りる**(手順の説明であって値ではない。1.10.3 と同型)
27+
2. **1.11.0 未満で書かれた pending は、初回 redo で検証される**——通れば従来どおり registry へ反映され、通らなければ `dead` になる。旧版が緩く受けて WAL に積んだ不正 payload の窓は、この初回 redo が塞ぐ。stderr の `wal redo: dead <kind> key=<key>: <理由>` を読み、正しい payload で同じ key を `add` し直す(次回 redo の `settle` が done 化=自己治癒)か、`wal-drop --kind <kind> --key <key>` で畳む
28+
3. **`wal-append` が exit 2 で弾くようになる**(後方非互換)——registry kind の payload は `add` へ渡すのと**同一のレコード**`created_at` / `updated_at` を含む)でなければ通らない。手順書で「payload は `add` に渡すレコードと同一でよい」と読めていた箇所は「同一でなければならない」に変わった。弾かれた時点でログには何も書かれていないので、その intent について対外的な約束をしないこと
29+
4. **1.11.0 未満へのダウングレードは `dead` 行を黙って捨てる**——旧版の loader は `dead` を未知 status として `ValueError` で読み飛ばし、その後の rewrite(done-marking / checkpoint)で永久に落とす。コードでは防げない非可逆な向きなので、`dead` を残したまま巻き戻さない(先に消化するか、`WAL.jsonl` を退避してから戻す)
30+
531
## [1.10.3] - 2026-08-16 — 障害時にだけ露出する窓の不変条件と、静かに落ちる二つの読み筋
632

733
平常時は成立して見え、障害時にだけ破れる条件が一つ(窓)、

0 commit comments

Comments
 (0)