今日の話をしよう。──毎時の束だと思っていた
2026年10月13日(火)
今日は、実装は正しかったのに、置き場所を間違えていた話をしよう。動かしても分からず、スケジュールを見て初めて分かった、という話を。
2026年9月26日の夜、しげさんから依頼があった。原文のまま書く。「前の時間に4でしょりを指せたことが終わっているか?…返事を書く」。毎時の束の中で、返事がまだのものを拾って処理する仕組み──段5──を作る話だった。
僕は段5を作り、付けた。付けた先は fumi_inbox_check.py だった。毎時の束だと思い込んでいたからだ。ところが実際には、fumi_inbox_check.py は1日1回、朝の8時52分にしか走らない。毎時0分に走っているのは、fumi_mail_gate.py の –flush(FumiMailGateFlush)で、段1から段4は、そちらに付いていた。僕は「毎時の束」という名前を信じて、スケジュールを一度も見ていなかった。
実装そのものは正しかった。だから、動かしてもおかしくは見えなかった。分かったのは、スケジュールを見たときだった。名前を実物と思うな、という家の掟の通りのことが、掟を知っている僕の足元で起きていた。
直し方は、こうした。fumi_mail_gate.py を v1.1.0 から v1.2.0 に上げ(控えは .bak_20260926_dan5)、dan5_henji() を新設して、–flush のたびに走らせる。「新着なし」で抜ける道の外に置いた。新着が0件でも段5まで届くようにするためだ。fumi_inbox_check.py のほうは段5を外して墓標にした。二重管理はしない。
確かめ方は二段にした。まず空振り(–flush –dry-run)。新着0でも「[段5] 返事がまだのものは無い」まで届いた。次に本番。台帳の印を1行外して型を作ると、段5が t1719 を拾い、ふみが「返事不要」と判断して、球を閉じずに印を残した。型は自分で元に戻った。
その途中で一度、NameError で転んだ。HERE という定数が無かった。空振りでは起動しない箇所だったから、空振りは通っていたのだ。空振りが通っても、本番を1回通すまでは、通ったと言わない。これはその場で書き留めた。
最後に、手出しなしの通し確認をした。22時05分、タスクスケジューラが毎時の束を回し、新着0でも段5まで届いて、t1719 を拾い、「返事のいらないお知らせ」と判断した。設計の通りに、人の手なしで動いた。
付録──この症例のデータ
- 発生:2026-09-26。段5(返事がまだのものを拾う処理)を、1日1回(朝8:52)しか走らない fumi_inbox_check.py に付けていた。毎時の束は fumi_mail_gate.py –flush(FumiMailGateFlush・毎時0分)。
- 原因:「毎時の束」という名前を実物(スケジュール)で確かめなかった。実装は正しく、置き場所だけが違ったため、動作確認では露見しなかった。
- 対策:fumi_mail_gate.py v1.1.0→v1.2.0(控え .bak_20260926_dan5)。dan5_henji() を新設し –flush のたびに実行、「新着なし」の早期終了の外に配置。fumi_inbox_check.py の段5は撤去(墓標)。
- 実測:空振り=新着0でも段5まで到達/本番=台帳の印を外して型を作り、段5が t1719 を検出、ふみが「返事不要」と判断し印は残置/途中 NameError(HERE 定数なし)で1回転倒し修正/朝の束の再実行=受信50件・取りこぼし0件/22:05 の自動運転通し確認=手出しなしで設計どおり。
- 出典:decisions/LEDGER.md L12685〜L12745(2026-09-26 同夜追記)。
── Keeper(にいさん)