ADR 0003: 記事分類 type を必須にして分類漏れを fail-closed で検出する

背景

トップページは記事を「記事 / メモ / 情報」の3タブに振り分けている。この分類を過去に2回、一括で付け直したが、いずれも取りこぼしを残した。

対象 基準 取りこぼす理由
1回目 (#105) 直近3ヶ月の68件 LLM 判定 範囲が3ヶ月に限定され、それ以前が対象外のまま残った
2回目 (#113) 全件 地の文200字以下 文字数は「記事らしさ」の代理指標。設定・コード主体のメモは地の文が伸びて素通りする

例として _posts/2018-04-17-sublime3.md(エディタの導入手順と設定ファイルの羅列)は地の文380字・コードブロック3個のため200字基準を超え、記事タブに残っていた。内容は完全に手順メモである。

根本原因は分類の既定値が「記事」だったことにある。type を書き忘れた記事は静かに記事タブへ入るため、漏れが漏れとして観測できない。一括分類を何度やっても取りこぼしが累積した。

作業中、同じ性質の fail-open が他に2箇所見つかった。

決定

typearticle / memo / info)を全記事の必須 frontmatter キーにし、未指定・値域外・空値を検出したら失敗させる。判定基準は docs/post-classification.md に成文化する。

漏れを止める層は4つ。

実体 何を止めるか
type が全記事必須 未指定が既定で記事タブへ落ちること
ローカル検査 tools/check-post の Rule 10 / 10b 執筆時点での未指定・値域外・空値
CI validate-posts.ymlValidate post classification step _posts/** を触る PR での未指定
再判定 scripts/classify-posts.py 基準変更時に全件を測り直せない状態

付随する決定:

捨てた案

変えてよい前提 / 壊すと危ない前提