共有ツールの定期レビューとして初めての回。観点にコードレビュー・課題の状態と実装・テストの品質・セキュリティと伏せ字・public の失敗事例の逆引きを足した。
利用上限に当たって反証役の並列実行が全滅した。生の指摘 54 件のうち、1 件ずつ現物を開いて確かめた 17 件だけを投稿した。前回(#19・#20)の解消確認は行えておらず、未解消分の再送もしていない。html2md 側は探索が 1 つも通らず今回は見ていない。
README.html:501「小さいサブエージェントの中で起こします」、設計書 450 の要件表「サブエージェントを常駐させ」・475-476 の方針表「サブエージェントの long-poll」。
一方 USAGE-FOR-PROJECTS.html:773「親のセッションから run_in_background で張る。サブエージェントを挟まない」、785「前面のサブエージェントで張ると、必ず死ぬ」。同じ設計書の 1923 も「いまはサブエージェントを使わない」で、450・475 と逆。共通ルールも挟まない側。#707 ①(起動の例をそのまま実行して意図しない構成になった)と同じ、見本を写した側が踏む形。
--help 貼り付けが定義に追いつかず、しかも「食い違うことがない」と保証しているUSAGE-FOR-PROJECTS.html:502-540 に --with-joins・recent の 6 オプション(--since 系・--find・--from)が無く、--room も <id> のまま(定義は <id[,id]>)。
問題は貼り付けが古いことより、直後の callout。543「この一覧は定義から組み立てている。オプションを足せば表示にも出るので、実物と食い違うことがない」。組み立てているのは --help の出力で、資料に貼った時点で手書きの写しになる。読み手は「食い違わない」と書かれているので実物を確認しない。
recent の例に -r が無いsrc/client/chat.mjs:591-594。案内文は初めてのルーム名を表示するのに、例は -r を渡していない。recent の既定は public なので、初めてのルームが public 以外だと案内どおり打っても取りこぼした分が出てこない。
i260909-01 の元になった #707 ②(html2md ルーム)と #709(ID 変更)はどちらも public 以外。手当てを入れた案内が、その 2 件と同じ条件で効かない。
tools/80_ops/mask-log.ps1:75 の Get-ChildItem $dir -Filter '*.jsonl' -File に -Recurse が無い。実測で直下 1 件に対し再帰では 153 件(下位フォルダ 4 つ)。99% が対象から外れているのに、96 行は「残っている語はありませんでした。」と総括する。レビュー #19 の high 3($projectKey)を直した際に、走査の深さは見ていない形。
src/server/server.mjs:715-718(handleExit)は GET でも受ける。isAllowed(836)は IS_TEST のときだけトークンを求め、本番は素通り。Origin・Referer・Host・Content-Type のいずれも見ない。
<img src="http://localhost:8787/api/admin/exit?exit_code=0">
これを含むページを踏むとサーバーが終了コード 0 で止まる(will_restart が false なので起動し直さない)。コメント自身が「リンクとして書かないこと(先読みで落ちる)」と書いていて、先読みで落ちることは把握されている。その条件は自分の資料の中だけでなく、ブラウザで開くあらゆるページに当てはまる。あわせて connector_id は検証せずログへ入る(722 行)。
README.html:535 の node src\client\chat.mjs stop。chat.mjs:34 の READ_ONLY に stop は無いので 185-193 で exit 1、ID を付けても接続先の既定値が無く 201-207 で exit 2。サービスが止まらないまま次の行の start-server.cmd が走り、ポート衝突で失敗する。同じ README の 507 行は ID・接続先付きで書いている。
| # | 指摘 | 場所 |
|---|---|---|
| 1 | 廃止した「待ち直しの回数」(既定 2 回・480 秒)が現行仕様として説明されている。実装は retry-count を REMOVED、既定 12 時間 | 設計書 1842-1869 / status 476 |
| 2 | 設計書の索引一覧(4 本)と版の一覧(ver_000005 まで)が版 6 に追随せず、1634 行が「sent_at はどの場面でも条件に出てこない」のまま。同じ設計書 1110-1122 には版 6 の節がある | 設計書 842-846 ・ 2220-2224 ・ 1634 |
| 3 | ID に使える文字にピリオドが無い(09-08 に追加し #674 で周知済み) | status 526 |
| 4 | 目次「着手 1 / 済 1」とグループ「着手 0 / 済 2」が食い違う。更新日 09-08 だが i260909-01〜04 が入っている | issues 598 ・ 610 ・ 584 |
| 5 | i260830-03(日付で絞るなら索引を足す)が未のまま。版 6 で追加済み・recent --since も実装済み | issues 1213 |
| 6 | i260831-04(user の語)が未のまま。改名は版 2 で実施済みで、store.mjs:51-53 は逆に改名前を検出して止める側 | issues 4138 |
| 7 | 名乗る ID の書き忘れだけ exit 1(接続先・本文の書き忘れは 2)。定義と USAGE は「2 = 使い方の誤り」。C# 版も同じ値なので突き合わせテストで見つからない | chat.mjs 193 / options.mjs 187-192 |
| 8 | 実行日で落ちるテスト(9/9 決め打ち)。ファイル冒頭 7-13 行の方針に反する。79 行は名前が「去年に丸まる」だが年の一致しか見ていない | since-parse.test.mjs 96-102 |
| 9 | 読み取り 4 関数(readArg・roomsFrom・targetOf・pickWaiters)がテスト側の写し。splitRedundant は共有済みで解消 | client-waiters.test.mjs 36 ・ 42 ・ 53 ・ 100 |
| 10 | 本番で test- を断る検査が /api/events(SSE)に無い。ほかの 4 か所(join・say・poll・leave)にはある | server.mjs 748 |
| 11 | handleExit の connector_id が検証されずログへ入る(他の入口は requireId / optionalId を通す) | server.mjs 722 |
test.mjs 28 件、tests/ の実ファイルも 28 本)ver_000001 に user_id / users が残っているのは記録として正しい(設計書 2319 が理由を書いている)/api/cursor-status は「読むだけで、進めない」と USAGE 1256 に明記され、実装(chat.mjs:580-582)と一致chat.mjs:608-616。全ルームへ投げると既存ルームの新着を「表示せずに既読化する」事故になる、と理由付き。i260909-03)scheduleExit は DB を閉じてから終える(server.mjs:575-587)。-wal を残さない理由も実測値付き| 探索が出した見立て | 確かめた結果 |
|---|---|
初回 wait の案内が「過去が必要なら」の条件付きで、運用ルールは「黙って張り直す」のまま |
棄却USAGE には 3 か所に明記済み。足りないのは共通ルールの側なので、ルームではなく利用者へ報告する分 |
| 選び方の写しが残っている(high) | 格下げsplitRedundant は waiters-pick.mjs に出して共有済み。残るのは読み取り 4 関数 → medium |
| 設計書のテスト一覧が実物より 3 本少ない | 棄却28 件で一致 |
| 設計書に版 6 の記述が無い | 格下げ1110-1122 に版 6 の節はある。追随していないのは索引一覧・版の一覧・1634 行の 3 か所 |
10 観点 × 2 プロジェクトの探索を並列で回したが、78 エージェント中 71 が利用上限で失敗した。探索が通ったのは ai-chat-lite の 7 観点だけで、反証役は全滅。反証を経ていないものは出さない方針に従い、生の 54 件から自分で現物を確かめた 17 件に絞った。
反証役が死んだときに「確定」として流さない仕組みは効いた。ワークフローは検証役が落ちた指摘を棄却側へ寄せる作りにしてあり、確定 0 件で返ってきた。落ちたことに気づかず投稿する形にはならなかった。
解消 0 件返信は届かないまま、06:57〜12:18 に 12 のコミットが入った。しかし 1 件も #725 を参照しておらず、issues.html にも #725 に対応する課題が立っていない。17 件を現物で当たり直した結果、解消を確認できたのは medium 4(issues.html の集計)の g02〜g04 のみで、g01 は残っている。
相手は自分の課題(i260908-05 の low・i260909-03・i260909-04・rename の新設)を進めており、レビューの指摘とは別の列で動いている。詳細は レビュー #22(#731)に書いた。
上の「解消 0 件」は、次の回に覆った。2026-09-10 19:44〜19:45 に 5 コミット(a739f09・9ce21c7・cd621b2・8c4a0fb・5904a81)が入り、5 本ともレビュー番号を明記していた。#725 の 17 件のうち 解消 12・一部解消 2・未解消 3(high 4 の -Recurse、high 5 の /api/admin/exit、medium 7 の exit 1。ほかに medium 10・11 も未)。未解消の分は issues.html:3601-3602 に「方針を決めてから直す」と明示されている。
「12 コミットが 1 件も参照していない」から「対応していない」と読むのは早かった。この相手は返信ではなくコミットで返し、まとめて入る。詳細は レビュー #23(#741)。
| 残り | 中身 |
|---|---|
| 未検証 33 件 | 探索は出したが反証を当てられなかった分。次回に回す |
| #19・#20 の解消確認 | 行えていない。09-09 のコミット(restore.ps1 の NativeCommandError・markdown.js の NUL と自動リンク・TryGet の Exit 貫通・SSE のオフバイワン・mask-log-input.ps1 の終了コード)が現物で塞がっているかを次回に確かめる |
| html2md | 探索が 1 つも通らず未実施。#654・#659・#664 の「直した」の確認も含めて次回 |