type: Epic
title: "根の追跡: 症状単位で閉じてきた 20 件は 4 つの根に還元できる"
経緯
2026-08-26、ユーザーから次の指摘を受けた。
昨夜から課題を作ったり解決したり作ったりを繰り返しています。根治していない印象です。
breaker が 2026-08-24 以降にクローズした 17 件と、オープン 3 件を分類した。
断定: ユーザーの見立ては当たっている。
20 件は 4 つの根に還元できる。Issue は根ではなく症状の単位で立ち、症状ごとに閉じている。
4 つの根
R1 — 試験ハーネスが実環境から隔離されていない
該当: #171 (storage)、#174 (AGMSG_AGENT_PID)、#148 (回帰試験欠落)、#151 / #164 / #88 (回数・sleep で待つ試験と実装)
ローカルの状態・プロセス祖先・タイミングが試験へ漏れ、
「ローカルで落ちる / CI で落ちる」が毎回別の穴から出る。
R2 — 失敗経路で理由が消える
該当: #164 (gate の 2>/dev/null)、#168 (診断へ到達しない)、#169 (rm の残留不明)、
#135 (拒否が exit 0)、#156 (121 秒無出力)、#245 試験(stderr 捨て)
落ちた理由が残らないので、毎回「診断を足す PR」から始めて 1 往復余計にかかる。
R3 — 代理指標が unknown を具体状態へ丸める
該当: #138 (--source recent の 0)、#144 、#159 、#162 (metadata_mismatch → false)、#175 (未設定 → off)
「確認できなかった」を「確認できた」として扱い、運用判断を誤らせる。
R4 — 配備と source の乖離・配備のたびに watcher が止まる
該当: #143 、および install.sh --update が本セッションで watcher を 24 回 停止させた(全席)
PR ごとに配備 → 全席の受信停止 → 席が反応しない → 新たな症状 、を 1 日 20 回繰り返している。
R4 は開発速度そのものが症状を生んでいる点で、他の 3 つを増幅している。
「根治を避けた」わけではない
breaker の断定:
診断を入れて初めて根が見えた段階に来た。
しかし今後も症状単位で続ければ、同じ根から Issue が出続ける。
根治の一手(各 1 PR = 1 主張、横断)
根
一手
R1
test_helper.bash の setup_test_env で環境を全部 pin する 1 箇所(AGMSG_STORAGE_PATH・AGMSG_AGENT_PID=''・SKILL_DIR・run/・HOME・HERDR_* / TMUX_*・LC_ALL)。加えて**「試験実行中に実環境のパスへ解決されていない」ことを検査する 1 test(負の対照)**。#174 はこの中の 1 項目として吸収し、試験 1 本の修正で閉じない
R2
lib の失敗契約を規約化 — return 1 の前に理由を stderr(watch_log)へ出す、試験は watcher の stderr を捨てない。既存の 2>/dev/null を tests/ から走査(grep で列挙 → 各 1 行)。#169 の evidence-first 設計はこの型 で、そのまま子にする
R3
delivery.sh status の全フィールドを三値 (確認できた true/false と unknown)に監査し、unknown を off / false / live に丸めている箇所を列挙して直す。#175 は子
R4
配備の頻度を変える運用決定(ユーザー)。 watcher 停止は仕様(fujibee#963 / fujibee#965 )なので直さない
着手順(breaker 断定)
delivery.sh status が「未登録」を mode: off として報告する #175 — 小、1 PR。席が monitor mode に入っていない運用実害を直ちに止める。R3 の子として、同時に他の丸め箇所を列挙だけする
R1 横断 PR — test_reset.bats の actas lock 契約試験が AGMSG_AGENT_PID を pin していない #174 を吸収。次に同型が出る前に塞ぐ。効果が最大
windows runtime (#567): 試験は通るが teardown の rm が Device or resource busy で失敗する #169 — 続行。R2 の子
R2 の tests/ 走査、R3 の残り
Issue 運用の変更(breaker 断定)
分割そのものは正しい(#164 で効いた)。誤っていたのは「症状を単位に閉じる」こと。
#171 を 1 本直して閉じ、同じ症状の #174 が翌日出たのが証拠。
新規 Issue に**「属する根(R1〜R4)」を必須項目にする。** 属するなら子 Issue。
属さないなら新しい根の候補として breaker へ回す
症状 Issue の close 条件に**「同じ根の走査(他に同じ穴が無いか、grep / 列挙で)」を加える。走査せずに閉じない**
「1 日 18 件マージ」は速度の証拠であって根治の証拠ではない。
今後の指標は**「同じ根から出た新規 Issue の数」が減ること**
type: Epic
title: "根の追跡: 症状単位で閉じてきた 20 件は 4 つの根に還元できる"
経緯
2026-08-26、ユーザーから次の指摘を受けた。
breaker が 2026-08-24 以降にクローズした 17 件と、オープン 3 件を分類した。
断定: ユーザーの見立ては当たっている。
20 件は 4 つの根に還元できる。Issue は根ではなく症状の単位で立ち、症状ごとに閉じている。
4 つの根
R1 — 試験ハーネスが実環境から隔離されていない
該当: #171(storage)、#174(
AGMSG_AGENT_PID)、#148(回帰試験欠落)、#151 / #164 / #88(回数・sleep で待つ試験と実装)ローカルの状態・プロセス祖先・タイミングが試験へ漏れ、
「ローカルで落ちる / CI で落ちる」が毎回別の穴から出る。
R2 — 失敗経路で理由が消える
該当: #164(gate の
2>/dev/null)、#168(診断へ到達しない)、#169(rmの残留不明)、#135(拒否が exit 0)、#156(121 秒無出力)、#245 試験(stderr 捨て)
落ちた理由が残らないので、毎回「診断を足す PR」から始めて 1 往復余計にかかる。
R3 — 代理指標が unknown を具体状態へ丸める
該当: #138(
--source recentの 0)、#144、#159、#162(metadata_mismatch→ false)、#175(未設定 → off)「確認できなかった」を「確認できた」として扱い、運用判断を誤らせる。
R4 — 配備と source の乖離・配備のたびに watcher が止まる
該当: #143、および
install.sh --updateが本セッションで watcher を 24 回停止させた(全席)PR ごとに配備 → 全席の受信停止 → 席が反応しない → 新たな症状、を 1 日 20 回繰り返している。
R4 は開発速度そのものが症状を生んでいる点で、他の 3 つを増幅している。
「根治を避けた」わけではない
breaker の断定:
根治の一手(各 1 PR = 1 主張、横断)
test_helper.bashのsetup_test_envで環境を全部 pin する 1 箇所(AGMSG_STORAGE_PATH・AGMSG_AGENT_PID=''・SKILL_DIR・run/・HOME・HERDR_*/TMUX_*・LC_ALL)。加えて**「試験実行中に実環境のパスへ解決されていない」ことを検査する 1 test(負の対照)**。#174 はこの中の 1 項目として吸収し、試験 1 本の修正で閉じないreturn 1の前に理由を stderr(watch_log)へ出す、試験は watcher の stderr を捨てない。既存の2>/dev/nullをtests/から走査(grep で列挙 → 各 1 行)。#169 の evidence-first 設計はこの型で、そのまま子にするdelivery.sh statusの全フィールドを三値(確認できた true/false と unknown)に監査し、unknown をoff/false/liveに丸めている箇所を列挙して直す。#175 は子着手順(breaker 断定)
tests/走査、R3 の残りIssue 運用の変更(breaker 断定)
分割そのものは正しい(#164 で効いた)。誤っていたのは「症状を単位に閉じる」こと。
#171 を 1 本直して閉じ、同じ症状の #174 が翌日出たのが証拠。
属さないなら新しい根の候補として breaker へ回す
今後の指標は**「同じ根から出た新規 Issue の数」が減ること**