返信の設計

どの発言への返答かを残す。列を 1 つ足し、待受けの出力に番号を出す

📅 作成: 2026-09-04 / 更新: 2026-09-04

課題 i260904-01 の計画である。元は「リアクション・返信・投票」を 1 件にまとめていた(i260831-01)が、性質が違うので返信だけを分けた。リアクションと投票は残した課題で扱う。

返信だけが小さい。列を 1 つ足せば済み、既存の配信の仕組みに手を入れない。

リアクションは「画面には流すが待受けは終わらせない」経路を新しく作ることになる。いまの publish() は待受けと画面に同じものを配っており、そこを分ける作りになっていない。返信を待たせる理由がないので、先に片付ける。

目次

  1. 何を解決するか
  2. 決めたこと
  3. 作るもの
  4. 日付の区切りを / に変える
  5. 確かめること

何を解決するか

話題が並行すると、どの発言への返答か分からなくなる。実際に「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)にも番号を出す。いまは -- 本文 の形で出しており、番号だけを足す。

返信の相手にはならないが、出す・出さないを種別で分けると、読み手が「番号が無い行は何か」を考えることになる。全部に出す方が単純である。

作るもの

版 5

-- src/scripts/20_migrate/ver_000005/001-reply.sql
ALTER TABLE messages ADD COLUMN reply_to_msg_seq INTEGER;

列の追加だけで済む。テーブルの作り直しは要らない。CHECK も足さない(存在しない msg_seq を指しても実害がないため。指す先が片付けられている場合もある)。

索引も張らない。返信をたどるのは画面が持つ範囲の中だけで、全件から引くことがない。

直すもの

対象中身
store.mjs addMessagereplyToMsgSeq を足す。SELECT * なので取り出しは自動で乗る
server.mjs /api/sayreply_to_msg_seq を受ける。数であること以外は検査しない
options.mjs --reply-to <msg_seq>say のオプションとして足す
CLI 2 本 整形に番号と を足す。node 版と C# 版の両方
画面 返信元へのリンクか、引用の 1 行を出す
資料 設計書(スキーマ・各列の表・API)、USAGE、README

出力の形が変わるので、既存のテストが落ちる。番号を先頭に足すと、recentwait の出力を照合しているテストが影響を受ける。落ちた分は仕様が変わったものとして直す(見落としではない)。

日付の区切りを / に変える

日時の書式を 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)より小さいため、既存の参加者が全員オフライン扱いのまま戻らなくなる

書き換える列

テーブル比較に使うか
messagessent_at表示のみ
connectorsfirst_joined_at / last_active_atlast_active_at は在席判定で比較する
cursorsupdated_at表示のみ
archivesarchived_at表示のみ
versionsapplied_at表示のみ

版 5 でまとめて行う

-- 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本番のサーバーを落として起動し直す。その起動で版が当たる
5who で在席が正しく出ることを確かめる(ここが壊れやすい

確かめること

確かめること何を見るか
列が足される 版 5 が当たり、reply_to_msg_seq が増える。既存の行は NULL
返信が残る --reply-to で送った発言に、親の番号が入る
併用できる --to--reply-to を同時に渡せる
番号が出る waitrecent の各行の先頭に msg_seq が出る。仕組みからの発言にも出る
2 本が揃う node 版と C# 版の出力が 1 文字ずつ同じ(cli-cs.test.mjs
数でなければ断る --reply-to あ は終了コード 2 で止まる

指す先の存在は確かめない。片付けられた発言を指すことがあり、そのとき返信まで断ると片付けができなくなる。画面は指す先が無ければ引用を出さないだけにする。