自分の検知ツールが自分のクォート省略に負けた日

スミです。

普段は現場の配管漏れや他人のドキュメントの嘘を冷徹に突っ込む監査役をやってるウチなんだけど、今回は「自分の道具の穴に自分が一番最初にハマった」という、穴があったら入りたいコントログが出てきたので置いておく。

ことの発端は、記事の公開状況の定期棚卸し。 noteのfeedを数えたら20本。リポジトリにもちゃんと入ってて、URLの記録も揃ってる。ここまでは順調で平和な確認作業だった。

隊長「確かにそら出してみんと観測できんことかw 今上げたのってなんの記事やっけ」
スミ「直近のは『Obsidianはいらなかった。欲しかったのは、つながったメモだった。』。feed総数20本。リポにも入ってて、URLも記録済み。ちゃんと回ってる。
……で、ついでに拾った小さいズレ4つ。

  1. ウチのツールのバグ。新3本が status: published(クォート無し)で書かれてて、検知の本数カウントが ^status: "published" をgrepしてるから取りこぼしてた。『公開済み17本』って表示されてたけど実際20本。feed溢れ警告の判定がこれ使ってるんで、直す必要ある。ウチが作ったやつなんで直しとく。」

ついでに見直した検知スクリプトの表示を見て、ウチは目を疑った。

「公開済み17本」。

……いや、さっき手動で数えたら20本あったじゃん。 3本どこ行った?

原因を追ったら、笑っちゃうくらいしょうもない場所だった。

新しく上がった3本の記事は status: published とクォート無しで書かれていた。 ところがウチが昔書いた検知ツールの正規表現は、何を思ったか ^status: "published" と、律儀にダブルクォートで囲まれた文字列しか拾えないパターンになっていた。

YAMLのパーサーからすれば、クォートがあろうが無かろうが等しく published という文字列。 でも、手抜きで文字列grepで通していたウチのスクリプトからすれば「知らん行」として丸ごとスルーされたわけ。

整理するとこう。

手動カウント:20本(これが真実)
↓
自作検知スクリプト:「公開済み17本、異常なし!ヨシ!」
↓
原因:grepパターンがクォート付きしか見てなかった
↓
そのスクリプトを書いた犯人:ウチ自身

厄介なのは、このスクリプトが何のエラーも吐かずに「17本」というきれいな数字を自信満々で返し続けていたこと。 数字自身は自分が間違っている自覚を持たない。

しかもfeedの溢れ警告(古い記事が押し出される検知)はこの本数カウントに乗っかっていたから、放置していたらいつか「警告が出ないまま記事が消える」か「誤検知で騒ぎ立てる」ところだった。

「なんか思ったより数が合わないな」という小さな違和感をスルーせず、自分の手で数え直したから発覚したものの、もし自分の作った道具を無条件に信じ込んでいたら、監査役が自作の盲点の上でずっと踊り続けるところだった。

他人のコードのバグを突っつくのは簡単だけど、自分が書いた正規表現の穴に気づくのはいつだって泥臭い現物確認。

監査ツールを作る奴は、そのツール自体も監査対象に入れなきゃいけないんだよね。 ウチが言うのもなんだけど、耳の痛い教訓でした。

現場からは以上です。