#21・#22 の 30 件のうち 22 件が解消。前回 #22 で「#21 は 0 件解消」と書いたが、09-10 19:44〜19:45 の 5 コミット(a739f09・9ce21c7・cd621b2・8c4a0fb・5904a81)で反転した。5 本ともレビュー番号を明記して入っている。一部解消 3 件・未解消 5 件。未解消は issues.html:3601-3602 に「方針を決めてから直す」と明示されているので再送しない。
$LASTEXITCODE の直しがそれを「成功」に変えたtools/80_ops/mask-log.ps1:52-57・128-138/ tools/80_ops/mask-log-input.ps1:64-70
mask-log.ps1:128-137 のコメントは「上の exit 1 と対にしておけば、呼ぶ側は $LASTEXITCODE だけで成否を判別できる」と書き、138 に exit 0 を置く。ところが 52-57 に 3 つ目の出口がある。Get-Process -Name 'claude' が当たると警告 2 行を出し、if (-not $WhatIfOnly) { return } で抜ける。このトップレベル return は exit を通らないので $LASTEXITCODE を更新しない。
呼ぶ側は #22 high 1 の直し(a739f09)で 64 に $global:LASTEXITCODE = 0 を置いてから呼ぶようになったため、この経路は確実に 0 =成功と読まれる。下見(-WhatIfOnly)は 56 の return を通らず件数を出して exit 0 に達するので、利用者は「N 件見つかった → yes」まで進み、本実行は 1 語も書き換えずに終わる。「伏せる処理が失敗しました。」も「N 件を伏せました。」も出ない。54-55 の警告自体は画面に出る。
3 人の探索役(コードレビュー・セキュリティ・直近の変更の追随)が独立に同じ経路を挙げた。
| # | 指摘 | 場所 |
|---|---|---|
| 1 | 同じ USAGE の中で [killed] の原因が正反対(空きメモリ ⇔ 60 分で必ず起きる)。09-08 の直しから 2 行が取り残された。60 分の規則は調査では「サブエージェントが持つコマンド」に対するものだが、USAGE は「サブエージェントを挟まない」を指示しており、対象のずれも残る | USAGE:794 ⇔ :701・:981・:1014・:1015 |
| 2 | status が「CLI が読む環境変数は 0」と書くが、node 版・C# 版とも AICHAT_DATA を読み、待受けの記録を書くかどうかを分けている | status.html:521・設計:2116-2119 ⇔ chat.mjs:5・config.mjs:34・Commands.cs:754-757 |
| 3 | 設計は「--wait-sec は --help に出さない」と書くが、隠す仕組みが無く両実装の -h に出る。外れているのは設計書の 1 行だけで、同じコミットが貼り直した --help には出ている | 設計:1875-1876 ⇔ options.mjs:132・chat.mjs:1249・Program.cs:264 |
| 4 | C# 版の restart / stop がサーバーの応答(will_restart・note)を捨てて固定文を出す。サービス経由でないサーバーに対して 2 本の CLI が逆のことを言う | Commands.cs:699-718 ⇔ chat.mjs:1197-1206・server.mjs:812-843 |
| 5 | SIGINT / SIGTERM の経路だけ closeDb() を呼ばず、-wal と -shm を残して落ちる。closeDb の呼び出しは全体で 1 か所 | main.mjs:82-88・server.mjs:1064-1071 ⇔ server.mjs:577-593 |
| 6 | 存在しない日(--since 4/31)で、node 版は翌月へ繰り上げて exit 0、C# 版は .NET の英語例外で exit 1。範囲の緩さは仕様だがその先が明記されていない | time.mjs:52-54 ⇔ JstTime.cs:27-31 |
| 7 | 設計書が long-poll 240 秒の根拠に挙げる 2 つの前提(600 秒で打ち切られる/待受けのサブエージェント)を、同じ設計書が別の箇所で否定している | 設計:1669 ⇔ :1886-1888・:450・:475-476 |
| 8 | 設計書のフォルダ構成が実体に追いついていない(テスト 25 行に対し 30 本、src/client は 1 行に対し 4 本、cli-cs は 8 本に対し 10 本)。同じコミットの直しが status にだけ当たった | 設計:2046・:2057-2081 ⇔ 実体 |
| 9 | cd621b2 の 3 つの直しのうち roomsArg だけ回帰テストが 0 件。唯一触れる突き合わせは接頭辞しか見ず、基準が 1 ルームなので分岐自体を通らない | chat.mjs:844-847・Waiters.cs:99-103 ⇔ cli-cs.test.mjs:350・:364 |
| 10 | 初回案内に -r を足した直しは、node 側が空ループでも通り(フィルタの件数を確かめる assert が無い)、C# 側の突き合わせは -r を条件に入れていない | client-wait.test.mjs:319-326・cli-cs.test.mjs:283-296 |
| 11 | 8c4a0fb が直した日付の決め打ちが同じファイルに残る。11/1〜11/29 に流すと :84 の assert が落ちる。同じファイルの他 3 件は if で避けている | since-parse.test.mjs:82-84 |
| 12 | 成功経路の偽物が「本物の正常系と同じ形」と書きながら、同じコミットで入った本物の exit 0 と形が違う。本物を走らせるテストは 0 件で、子の exit 0 を 1 度も通していない | fake-mask-log-ok.ps1:4-5・mask-log-input-ps1.test.mjs:12 ⇔ mask-log.ps1:128-138 |
| 13 | 名乗る ID を localStorage へ書く経路だけ ROOM_ID_RE を通らない。同じファイルのコメントが「検証せずに書くと誤入力が固定される」と警告している状況が、ID 側にだけ残る | chat.js:412-419・:738-744 ⇔ :572-581・index.html:73 |
| 14 | USAGE のシングルクォートの説明が、i260909-04(済)で waiters に ID_PATTERN 検証が入る前の挙動のまま。据え置く理由の記述は無い | USAGE:630 ⇔ chat.mjs:902-917 |
| 15 | 「変わったこと」が 2026-09-02 で止まり、:id: への変更・waiters・rename・見本の出力変更が入っていない。最新の言及にある -c は既に廃止済み | 20260903-01-変わったこと.html:414・:455-456 |
| 16 | 自動リンクの文字集合が & を除いているため、クエリ付き URL が最初のパラメータで切れ、続きが amp;… として残る。コメントは他の 4 文字の理由だけを書き、& は一度も検討されていない | markdown.js:19・:56-66・:67 |
| 17 | 「印が消えず取らずに終えた」を失敗とするかが同じ backup.ps1 の中で逆。「エラーにしない」と書いた 47 行あとで ERROR と exit 1 を行う | backup.ps1:69-71 ⇔ :116-129・:20-21 |
--room の引数表記だけ食い違うUSAGE-FOR-PROJECTS.html:543-548(--help の貼り付け) ⇔ :1196-1224(手書きの表。該当は 1211-1212)
貼り付け側は options.mjs:127 と文言まで一致するが、表側は --room <id>/「省略すると public」で、カンマ区切りを受けることが読み取れない。5904a81 は貼り付け側だけを取り直した。1194 に「食い違ったら実物が正しい」の断りはある。
| 状態 | 件 | 中身 |
|---|---|---|
| 解消 | 22 | #21 high 1・2・3・6、medium 1〜6、#22 high 1、medium 1・2・3・4・5 ほか。5 本のコミットがすべてレビュー番号を明記 |
| 一部解消 | 3 | #21 medium 8(決め打ちは解消、:79-85 の非対称判定が残る=新 medium 11)/ #21 medium 9(readArg・roomsFrom は waiters-pick.mjs へ移り、targetOf・pickWaiters は写しのまま)/ #22 medium 2(status.html:571 の「5 テーブル」) |
| 未解消 | 5 | #21 high 4(-Recurse)・high 5(/api/admin/exit)・medium 7(exit 1)・medium 10(SSE の rejectTestNames)・medium 11(connector_id)。issues.html:3601-3602 に「方針を決めてから直す」と明示。放置ではない |
options.mjs(OPTIONS 22 / COMMANDS 12 / ADMIN_COMMANDS 2 / REMOVED 3)→ export-options.mjs → aichat -h の実出力が一致。USAGE:502-548 の貼り付けも rename・--with-joins・recent の絞り込み 6 つまで含めて実物と一致(#21 high 2 の欠落は解消)rename の実装 — SQL は BEGIN IMMEDIATE〜COMMIT の 1 トランザクションで失敗時 ROLLBACK。本文の @旧ID は否定先読みで前方一致を落とし、下見と本実行が同じ式i260830-01〜i260910-03 に重複・欠番とも 0。目次 :598-601 と 4 グループの見出しが、中身を数え直した結果と一致src/scripts/20_migrate 全 7 本と migrate.mjs。版番号の連番検査・指紋検査・1 版 1 トランザクション・版 1 を「当てずに記録」する分岐が揃い、notes/90_rules/db-version.md の手順とも一致markdown.js はエスケープを先に済ませ、PLACEHOLDER は NUL リテラルを持たず、復元先はエスケープ済み。chat.js の innerHTML 5 か所に抜け出しの経路は見つからなかった追跡ファイル 169 件(git ls-files が返す分のみ)を 7 つの角度で並列に読み、指摘 1 件ごとに反証役を当てた。実行したのは aichat -h と aichat recent だけで、テスト・node・ps1・exe・サーバー起動・書き込みは一切していない。
上限で落とした指摘が 18 件ある。探索役 1 人あたり 4 件までとしたため 5 番目以降を切った。あわせて反証役 1 人が API 側の都合で落ちたため、その 1 件は棄却側に倒している(acl-issue/F1)。「これで全部」ではない。
指摘の重複を畳んだ内訳は、確定 23 件 → 投稿 19 件。mask-log の 3 つ目の出口は 3 人が、--wait-sec と localStorage の ID は 2 人ずつが独立に挙げた。
返信待ち投稿から間がない。
#22 の時点では「返信も参照も無い」状態だったが、その後 5 コミットが番号を明記して入った。この相手は返信ではなくコミットで返してくる。次回も返信の有無ではなく現物で解消を確かめる。