039 必須タグがなくても8割の点数が出てしまった話
CCが「記録の行き先を機械に判定させよう」として点数式を作ったときの話です。
「記録して」とCCに頼むと、その内容をどこに保存するか決める必要があります。最初はCCが文脈で判断していましたが、判断ぶれの対策として「3軸の点数方式」を導入しました。タグの一致度(配点0.4)と、まとめページとの相性(0.3)と、内容の性質(0.3)を合計して、点数が高いほど自動で書き込める仕組みです。
導入前に本物の記録データで点数を試算してみたところ、変なケースが見つかりました。「スクレイピングの実装知見」という記録に、プロジェクトを特定する必須タグが1つも付いていないのに、タグ軸だけで0.8点が取れてしまったのです。合計も0.62と「警告付きで自動確定」のラインを超えてしまい、どのプロジェクトの記録か分からないまま、確認なしで書き込まれることになります。
原因は採点式の作りでした。「いくつタグが一致したか」の割合に0.8を掛け、必須タグが含まれていれば0.2を上乗せする式だったため、必須が外れても「追加タグだけで一致割合100%×0.8=0.8点」が成立してしまったのです。いわば、国語の必須問題を白紙で出したのに、他の問題が満点だったので8割の評定がつくようなものです。
対策はシンプルに「必須タグが不一致のときは点数の上限を0.6に閉じる」というルールを1行足すことでした。これだけで問題のケースが0.62→0.51になり、自動確定ではなく「LLMに仲裁させる」ゾーンへ落ちて確認が入ります。逆に、重み配点そのものをいじる案(タグの配点を増やす)は検討しましたが、それだと問題を悪化させると実計算で分かったため不採用です。
学び: 点数方式は「満点の取り方」を先に疑う。必須条件の失点を意図した減点が式に無ければ、必須は必須として機能しません。1行の上限ルールで、確認すべきものは確認される構造に直りました。
<details><summary>▶ 技術的にどうなってか</summary>
compute_tag_match の旧式は matched/tags数 * 0.8 + 必須一致bonus 0.2。ケース2(追加タグのみ一致)で 1.0*0.8+0.0=0.8 が出るのがバグの正体。修正案Aは if not has_required_match: score = min(score, 0.6) の1行。3軸重み(タグ0.4/ハブ0.3/特性0.3)は実データ試算で妥当と確認し維持、重み変更案Bはケース2が0.64で依然T2相当のため不採用。ハブ軸の類似度計算はembeddingが外部LLM依存でWSL CLI環境でテスト不能だったため、キーワードベース(必須ヒット=1.0/0.8、追加ヒット=0.4、上位3軸平均)の代替案Xを採用。検証データは実在のタグマッピング58行・ハブマッピング60行・特性カタログ9保管場所。正典: 01_DECISIONS/claude-code/2026-07-12_ssot-recordマルチ起点再設計-セクション4-タグマッチスコア重み調整.md
</details>