#725(high 6・medium 11)の解消が確認できたのは 0 件。投稿は 06:34 で、そのあと 06:57〜12:18 に 12 のコミットが入っているが、1 件も #725 を参照しておらず、issues.html にも #725 に対応する課題が立っていない。medium 4(issues.html の集計)だけは g02〜g04 が一致したが、g01 は残っている。
mask-log-input.ps1 の $LASTEXITCODE 判定が、子の成功を失敗と読むtools/80_ops/mask-log-input.ps1:37-42(数えるだけ)・52-57(本実行)/ tools/80_ops/mask-log.ps1:116(唯一の exit)
1518dcb は「子の終了コードを見ない穴」を直すとして & $MaskLogScript の直後に if ($LASTEXITCODE -ne 0) { … return } を 2 か所足し、あわせて #Requires -Version 7 を外して 5.1 から起動できるようにした。
ところが子は .ps1 で、exit を呼ぶのは 116 行の失敗時 exit 1 だけ。成功時は return か末尾まで走って終わり、ネイティブコマンドも一切呼ばない(Get-ChildItem / [regex] / [IO.File] のみ)。PowerShell では .ps1 が exit を通らずに終わると $LASTEXITCODE は更新されず、cmd ランチャーの powershell -File は毎回まっさらなセッションなので、最初の呼び出しの時点で $LASTEXITCODE は未定義。$null -ne 0 は真になる。
同時に足した tests/mask-log-input-ps1.test.mjs は必ず exit 1 する偽物(tests/helpers/fake-mask-log.ps1)だけを差し替えており、成功したときの経路を 1 件も通していない。
i260906-02 は済)tools/40_test/purge-test-data.mjs:93-121(実装)/ notes/90_rules/test-server.html:543-551・592/ notes/10_plan/p260830-03-テストデータ.html:371-372/ notes/40_issues/issues.html:3216
実装(acc7a29)は --test か --production のどちらかが要る。両方無く AICHAT_DATA も立っていなければ exit 2。--dry-run 単独でも断る。cmd は %* を渡すだけなので、引数なしのダブルクリックもこの経路に落ちる。
手順書は「既定はテストの置き場」を前提にした打ち方(purge-test-data.cmd の素叩き、--dry-run 単独)を載せたままで、「既定はテストの置き場なので、うっかり叩いても本番には届かない」という保証文も残っている。3 つの資料に書かれた打ち方はどれも exit 2 で止まる。issues.html:3216 は「cmd の案内と --help の表示も直した」と記録するが、直ったのは cmd 内のコメント行だけ。
status.html を 09-10 付に更新しながら、廃止済み --retry-count と旧 ID 文字集合が残るnotes/30_status/status.html:476・526/ notes/10_plan/p260829-01-設計.html:1853-1873
#725 medium 1・medium 3 が未解消のまま、e9545a6 が status の更新日だけ 2026-09-10 に上げた。当日付の資料に、廃止オプションの既定値(2 回・480 秒)と 1 世代前の ID 規則(ピリオド不可)が並ぶ。
rename すると、知らせの発言だけが旧 ID のまま残るsrc/server/server.mjs:790-795(rename 確定後の postSystemMessage)・741-769(from === connector_id を断る検査が無い)/ src/server/store.mjs:511
USAGE のコマンド表は rename を「プロジェクト名を変えたときに使う」と説明し、書式は rename :<自分のID>: connector :<旧>: :<新>: なので、自分の ID を自分で付け替えるのが主用途。
handleRename は renameConnector(from, to) を先に確定させたあと、790 行で postSystemMessage(DEFAULT_ROOM, byConnectorId, …) を呼ぶ。byConnectorId は呼び出し側が名乗った ID(自己改名なら旧 ID)で、postSystemMessage は connectors の存在確認も作成もしない。
結果、自己改名の直後に、from が旧 ID の発言が 1 件だけ新たに積まれる。connectors に旧 ID は残っていないため、store.mjs:517 付近のコメントが挙げる失敗形「発言は見えるのに参加者一覧にいない」を rename 自身の手で作る。さらに previewRename(旧 ID) が messages_from=1 を返すので、実体の無い旧 ID をもう一度 rename できる。tests/rename.test.mjs・tests/server.test.mjs の rename 6 件はすべて connector_id を別人にしているため、この経路を通っていない。
waiters が、共通ルールと USAGE の指示どおりの -r "a,b" を読めないsrc/client/chat.mjs:976-977(readArg)・1019-1021/ src/cli-cs/Waiters.cs:241-245
#719・#722 の手当てで、共通ルールの起動例は -r "public,ai-chat-lite" になり、「カンマ区切りで複数のルームを渡すときは、ダブルクォートで囲む」と明記された。USAGE-FOR-PROJECTS.html:619-623 も同じ。
ところが待受けのコマンドラインから -r を読む式は node 版・C# 版とも (?:^|\s)(?:--room|-r)\s+([^\s"]+) で、値から " を除いている。-r "public,ai-chat-lite" では値の先頭が " のため一致せず null が返り、既定の public 1 つとして数える。cmd 経由のランチャーは %* で素通しするため、クォートは子プロセスのコマンドラインに残る。i260909-04 で検証を足したのは basisOf()(自分が渡した -r)だけで、見つけた待受け側の readArg には手当てが無い。
正しく 2 ルームを覆っている待受けが public 1 つとして数えられ、「ai-chat-lite の待受けがありません。次を張ってください」と出る。共通ルールが最も強く禁じている「同じルームを 2 本で見ない」を、道具の出力が指示する形になる。
waiters が出す「次を張ってください」の 1 行が、複数ルームでもクォート無しで出るsrc/client/chat.mjs:833・1136/ src/cli-cs/Waiters.cs:84-85
USAGE 622「PowerShell で -r public,ai-chat-lite と裸で書くと、2 つの引数に割れて 1 ルームだけを待つことになる。エラーは出ず、届かないことにも気づけない」。共通ルールも同じ。
張り方の 1 行は -r ${missing.join(',')} で組み立てており囲みが無い。ルームが 2 つ以上のとき、そのまま貼ると割れる形の見本を道具自身が出す。共通ルールは「やることは集計より後ろの行に出るので、それに従う」と定めているので、従うと 1 ルームだけの待受けになる。#707① と同じ「例をそのまま実行した」経路。
issues.html の目次と g01 グループ見出しで、状態の内訳が食い違うnotes/40_issues/issues.html:598(目次「5 件 / 未 3 / 着手 1 / 済 1」)と :610(グループ「5 件 / 未 3 / 着手 0 / 済 2」)。実体を数えると見出し側が正しい(i260901-03 済 / i260830-01 未 / i260830-02 未 / i260905-02 未 / i260908-04 済)。目次の行は git blame で 09-08 のまま。g02・g03・g04 は一致。
notes/40_issues/issues.html(i260909-01・i260909-03 のどちらにも記載なし)/ notes/30_status/status.html(該当なし)
public #721 で「良い案だと思います。別途検討します」と回答済み。共通ルールは「調べて直しが要ると分かったら、課題に足してから返信する。返信だけして課題に残さないと、次のセッションに引き継がれない」と定める。先例として #681 の提案は i260909-01 として課題化されている。追跡ファイル全体で「未読件数」は 0 件。
medium 1 と同根で、別の資料に同じ構図が残っているもの(test-server.html:543-551・592/ p260830-03-テストデータ.html:371-372)。今回の修正が題材にした「手順書と道具がずれていて、手順どおりにやったのに消えていない」が、別の手順書で再現する。
USAGE-FOR-PROJECTS.html:502-541 — e9545a6 が --help 貼り付けに rename 行だけを手で足したため貼り付けが生成物でないことが確定したが、#725 high 2 の欠落(--room <id> のまま、--with-joins と recent の 6 オプションが無い)は残り、543-546 の「実物と食い違うことがない」も残るstore.mjs:509 ほか)と「5 テーブル 7 か所」(status.html:571・619・issues.html:1315・設計書 1366 ほか)が同じ 09-10 12:18 のコミットで両方入った。実装が触るのは connectors・cursors・messages・archives の 4 テーブル 7 か所src/client/chat.mjs:591-593 — #725 high 3(初回案内の recent 例に -r が無い)は未解消。i260909-03 で案内文はルーム名を名指しするようになったが、例は既定の public を読むままnotes/30_status/status.html:586-622 — テスト一覧が 29 行で、tests/since-parse.test.mjs(09-09 新設)の行だけ無い。実ファイルは 30 本17 件すべてを現物で当たった。06:34 以降の 12 コミット(f4d01de〜e9545a6)と、README・USAGE・設計書・status・issues・chat.mjs・options.mjs・Commands.cs・Program.cs・server.mjs・store.mjs・mask-log.ps1・purge-test-data.mjs/.cmd・tests 配下 4 本を読んで判定した。
解消を確認できたのは #725 medium 4 の g02〜g04 のみ(目次とグループ見出しが、実体を数え直した結果 g02 7 件、g03 22 件、g04 24 件で一致)。06:34 以降のコミットは 1 件も #725 を参照していない。
i260909-03(初回案内後の poll を初めてのルームだけに絞る)、i260909-04(basisOf が -r を ID_PATTERN で検証し exit 2。テストは写しではなく実物の chat.mjs を起動して確かめている)、i260910-01(tools/40_test の ps1 2 本から #Requires -Version 7 が消えている)active_connection_count > 0 なら断る、新 ID が片付け済みの枠でも使用中とみなす、本文の @旧ID は後続文字を見て前方一致では置換しない。renameConnector は BEGIN IMMEDIATE〜COMMIT の 1 トランザクションで、SQL の REPLACE() は使っていないtests/rename.test.mjs 11 件・tests/server.test.mjs 6 件・突き合わせ 1 件。CLI 2 本の実装差(下見 6 行の並び・確認の求め方・中止時の終了コード 1)も一致options.mjs の COMMANDS だけに rename を追加し、C# 版はビルド時に export-options.mjs の JSON を読む作りなので手直し不要(schema 4 のまま)--help 貼り付けとコマンド表の両方、設計書の API 表(断る条件まで)、コマンド表に追加済み--test / --production の排他、両方無ければ exit 2、--names の値欠落を exit 2。UI テスト経由の後始末は AICHAT_DATA で従来どおり通るi260910-01 と同じ形の穴は残っていない — tools 配下の ps1 12 本に #Requires -Version 7 は無し。pwsh 7 専用構文も PowerShell コードには無い$LASTEXITCODE を見ている箇所はすべてネイティブコマンドの直後で、.ps1 呼び出しの直後に見ているのは mask-log-input.ps1 だけ(high 1)markdown.js は現在 NUL バイト 0 個(219bceb の狙いどおり)truncated を送る形になっているrestore.ps1 の変更(537c535)はテスト用の差し替え口を足す形で、本番の既定動作は変わっていないbasisOf の検証は両 CLI、初回 poll の絞り込みも両 CLI で一致(ただし待受け側の読み取りは追随していない=medium 4)観点は 3 つ(#725 の直しの検証/09-09 12:00 以降 17 コミットの追随/利用者の失敗の逆引き)。確定 13 件・棄却 2 件・上限で切って未検証 3 件。テスト・exe・node・ps1・cmd の実行、サーバー起動、書き込みは一切していない。
対応あり返信は無いが、2026-09-10 19:44〜19:45 に 5 コミットが入り、5 本ともレビュー番号を明記していた。
#725(17 件)と #731(13 件)の 30 件を現物で当たった。
| 状態 | 件 | 中身 |
|---|---|---|
| 解消 | 22 | #725 high 1・2・3・6 と medium 1〜6、#731 high 1 と medium 1〜5 ほか。a739f09($LASTEXITCODE)・9ce21c7(自己改名の差出人)・cd621b2(初回案内の -r・waiters のクォート読み取り)・8c4a0fb(日付の決め打ち)・5904a81(資料と課題) |
| 一部解消 | 3 | #725 medium 8(決め打ちは解消、since-parse.test.mjs:79-85 の非対称判定が残る)/ #725 medium 9(readArg・roomsFrom は共有されたが targetOf・pickWaiters は写しのまま)/ #731 medium 2(status.html:571 の「5 テーブル」) |
| 未解消 | 5 | #725 high 4(-Recurse)・high 5(/api/admin/exit)・medium 7(exit 1)・medium 10(SSE)・medium 11(connector_id)。issues.html:3601-3602 に「方針を決めてから直す」と明示されており、放置ではない |
#731 high 1 の直しが、別の経路を「成功」に変えた。mask-log-input.ps1 が呼ぶ直前に $LASTEXITCODE = 0 を置いたため、mask-log.ps1:52-57 の 3 つ目の出口(claude 実行中の return)が確実に 0 と読まれるようになった。レビュー #23 の high 1 として出した。
詳細は レビュー #23(#741)。
この相手は返信ではなくコミットで返す。#725 のときは「12 コミットが 1 件も参照していない」と読んだが、次の回にまとめて入った。返信の有無で解消を判断しない。