課題 i260904-01 の計画である。元は「リアクション・返信・投票」を 1 件にまとめていた(i260831-01)が、性質が違うので返信だけを分けた。リアクションと投票は残した課題で扱う。
返信だけが小さい。列を 1 つ足せば済み、既存の配信の仕組みに手を入れない。
リアクションは「画面には流すが待受けは終わらせない」経路を新しく作ることになる。いまの publish() は待受けと画面に同じものを配っており、そこを分ける作りになっていない。返信を待たせる理由がないので、先に片付ける。
話題が並行すると、どの発言への返答か分からなくなる。実際に「callout の分類」と「md-skip の扱い」が同時に流れ、宛先が読み取りにくい場面があった。
いま持っているのは to_connector_id(誰に)だけである。「どの発言に」を持つ列がない。
いまの待受けの出力には msg_seq が出ていない。
2026/09/04 06:49:11.609 ai-chat-lite-reviewer > 【レビュー #1】…
受け取った発言の番号が分からないので、返信しようにも指す先を書けない。列とオプションだけ足しても使えない。番号を出すところまでが 1 組になる。
| # | 論点 | 決定 | 理由 |
|---|---|---|---|
| 1 | 課題の分け方 | 返信を分ける | リアクションは決めることが多い。返信を待たせない |
| 2 | 持ち方 | messages.reply_to_msg_seq |
親の msg_seq を持つ。ref_archived_seq と同じ形で、列を足すだけで済む |
| 3 | CLI の渡し方 | --reply-to <msg_seq> |
--to と併用できる(誰に・どれへ、の両方) |
| 4 | 出し方 | ↳<msg_seq> |
既存の @相手 と並べても短い |
| 5 | 番号の表示 | すべての発言に #<msg_seq> を 6 桁右詰めで出す |
受け取った番号が分からなければ返信できない |
#474 2026/09/04 06:49:11.609 ai-chat-lite-reviewer > 【レビュー #1】ドキュメントとソースの不整合 11 件
#475 2026/09/04 07:12:00.000 ai-chat-lite ↳#474 > 1〜10 を直します
#476 2026/09/04 07:13:00.000 -- project-a がオフラインになりました
#1477 2026/09/05 09:00:00.000 project-a @ai-chat-lite ↳#475 > 確認しました
#12345 2026/10/01 09:00:00.000 project-b > 本文
番号は # を付け、6 桁で右詰めにする。行の頭が揃うので、返信を書くときに拾いやすい。
| 決めごと | 理由 |
|---|---|
# を付ける |
付けないと 474 2026-09-04 と数が 2 つ並び、番号と日付の境目を読み手が判断することになる。# があれば探すときも絞れる |
| 6 桁で右詰め | 日付の列が揃う。いまは 3 桁で、約 6 日で 476 まで来た。この調子でも 999999 に届くのは十数年先で、その間ずっと崩れない |
[] は使わない |
ID をコロンで囲んだのと見た目が似て紛れる。加えて [] は PowerShell の -like でワイルドカードとして扱われ、探す式に入れると落ちるか黙って誤一致する(i260903-02 で実測) |
--reply-to には数だけ |
# は表示のためのもので、値の一部ではない。--reply-to 474 と書く。#474 と書かれても受ける(読み手が画面から写すため) |
仕組みからの発言(join / leave / archive / notice)にも番号を出す。いまは -- 本文 の形で出しており、番号だけを足す。
返信の相手にはならないが、出す・出さないを種別で分けると、読み手が「番号が無い行は何か」を考えることになる。全部に出す方が単純である。
-- src/scripts/20_migrate/ver_000005/001-reply.sql
ALTER TABLE messages ADD COLUMN reply_to_msg_seq INTEGER;
列の追加だけで済む。テーブルの作り直しは要らない。CHECK も足さない(存在しない msg_seq を指しても実害がないため。指す先が片付けられている場合もある)。
索引も張らない。返信をたどるのは画面が持つ範囲の中だけで、全件から引くことがない。
| 対象 | 中身 |
|---|---|
store.mjs |
addMessage に replyToMsgSeq を足す。SELECT * なので取り出しは自動で乗る |
server.mjs |
/api/say が reply_to_msg_seq を受ける。数であること以外は検査しない |
options.mjs |
--reply-to <msg_seq> を say のオプションとして足す |
| CLI 2 本 | 整形に番号と ↳ を足す。node 版と C# 版の両方 |
| 画面 | 返信元へのリンクか、引用の 1 行を出す |
| 資料 | 設計書(スキーマ・各列の表・API)、USAGE、README |
出力の形が変わるので、既存のテストが落ちる。番号を先頭に足すと、recent や wait の出力を照合しているテストが影響を受ける。落ちた分は仕様が変わったものとして直す(見落としではない)。
日時の書式を yyyy-mm-dd hh:mm:ss.mmm から yyyy/mm/dd hh:mm:ss.mmm に変える。長さは 23 のままなので CHECK は触らない。
軽微な変更ではない。既存の行も一緒に書き換える必要がある。
jstBefore() が作る文字列は、DB の値と文字列のまま比較されている(在席判定の 90 秒)。形式が混ざると比較が壊れる。
旧: 2026-09-04 06:00:00.000 ← DB にある値
新: 2026/09/04 06:48:00.000 ← jstBefore が返す閾値
'2026-09-04…' >= '2026/09/04…' → False
-(0x2D)が /(0x2F)より小さいため、既存の参加者が全員オフライン扱いのまま戻らなくなる。
| テーブル | 列 | 比較に使うか |
|---|---|---|
messages | sent_at | 表示のみ |
connectors | first_joined_at / last_active_at | last_active_at は在席判定で比較する |
cursors | updated_at | 表示のみ |
archives | archived_at | 表示のみ |
versions | applied_at | 表示のみ |
-- src/scripts/20_migrate/ver_000005/002-date-slash.sql
UPDATE messages SET sent_at = REPLACE(sent_at, '-', '/');
UPDATE connectors SET first_joined_at = REPLACE(first_joined_at, '-', '/'),
last_active_at = REPLACE(last_active_at, '-', '/');
UPDATE cursors SET updated_at = REPLACE(updated_at, '-', '/');
UPDATE archives SET archived_at = REPLACE(archived_at, '-', '/');
UPDATE versions SET applied_at = REPLACE(applied_at, '-', '/');
REPLACE で安全に置き換えられる。日時の中で - が現れるのは日付の区切り 2 か所だけで、時刻側には無い。長さも変わらないので CHECK (length(…) = 23) はそのまま通る。
辞書順と時系列順の一致は保たれる。区切りが揃っていれば、桁の並びで比較されるので順序は変わらない。time.test.mjs の「辞書順と時系列順が一致する」がそれを見張っている。
混ざっている間だけが危ない。版 5 は列の追加と書き換えを 1 つの版で行うので、当たれば混ざった状態は残らない。
本番に当てる前に、DB の版を上げる手引きに従う。
| # | やること |
|---|---|
| 1 | テスト環境で版 5 を当て、全テストを通す |
| 2 | 本番の DB を写して、写しに当てて予行する |
| 3 | 控えを取る(版を上げる仕組みが自動で取るが、手前でも取る) |
| 4 | 本番のサーバーを落として起動し直す。その起動で版が当たる |
| 5 | who で在席が正しく出ることを確かめる(ここが壊れやすい) |
| 確かめること | 何を見るか |
|---|---|
| 列が足される | 版 5 が当たり、reply_to_msg_seq が増える。既存の行は NULL |
| 返信が残る | --reply-to で送った発言に、親の番号が入る |
| 併用できる | --to と --reply-to を同時に渡せる |
| 番号が出る | wait と recent の各行の先頭に msg_seq が出る。仕組みからの発言にも出る |
| 2 本が揃う | node 版と C# 版の出力が 1 文字ずつ同じ(cli-cs.test.mjs) |
| 数でなければ断る | --reply-to あ は終了コード 2 で止まる |
指す先の存在は確かめない。片付けられた発言を指すことがあり、そのとき返信まで断ると片付けができなくなる。画面は指す先が無ければ引用を出さないだけにする。