/var/www/yatta47.log

/var/www/yatta47.log

やったのログ置場です。スクラップみたいな短編が多いかと。

Markdownのチェックリスト(- [ ])が表示されない原因 — GFM仕様の先頭パターン

LLMスキルのルールに [FACT] / [OPINION] ラベルを追加したら、タスクリストのチェックボックスが消えました。 原因はGFMの仕様——task list item の条件は先頭が [ ] / [x] / [X] + ホワイトスペースで始まることで、それ以外のブラケット記法が先頭にあると task list として認識されません。

何が起きたか

Claude Code向けのスキルを書いていて、箇条書き項目に [FACT] / [OPINION] / [INFERENCE] ラベルを付けるルールを追加したんですよ。

「事実と推論を区別する」というやつで、出力の透明性を高めるのが目的でした。

ルール適用後の出力はこんな感じ。

- [FACT] [ ] タスクA
- [FACT] [ ] タスクB
- [OPINION] [ ] タスクC

これ、GitHub(GFM実装環境)で表示するとチェックボックスが出ません。ただの文字列になります。

期待していたのはこっち。

- [ ] タスクA  ←  チェックボックスになる
- [ ] タスクB

原因

犯人はGFMのtask list item仕様(spec section 5.3)です。

GFMでは、- [ ]- [x] がリスト項目の先頭にあるときだけチェックボックスに変換されます。正確には「リスト項目のテキストコンテンツが [ ][x] + 空白で始まる」という条件です。

[FACT] を付けると何が起きるか。task list item の条件は「テキストコンテンツが [ ] / [x] / [X] + 1つ以上のホワイトスペースで始まる」ことです。[FACT] はこの条件を満たさないので、そもそも task list として認識されません。

- [FACT] [ ] タスクA
  ↑テキスト先頭が [FACT] → [ ]/[x]/[X] のいずれでもない → task list 条件不成立

- [ ] タスクA
  ↑テキスト先頭が [ ] + space → task list 条件成立 → チェックボックス確定

対策

タスクチェックリスト(- [ ] / - [x])をラベル付けルールの対象外にする——これだけです。

ルール側を修正しました。

# Before(問題あり)
すべての箇条書き項目に [FACT]/[OPINION]/[INFERENCE] を付ける

# After(修正後)
箇条書き項目に [FACT]/[OPINION]/[INFERENCE] を付ける。
ただし - [ ] / - [x] 形式のタスクリストは除く(TODOの事実分類は不要なため)

タスクリストはそもそも「これをやる/やった」という行動リストなので、FACT/OPINIONに分類する意味がありません。除外しても機能的には何も失わないです。

なぜ気づきにくいか

この問題が厄介なのは、表示が「消える」ではなく「変わる」だからです。

テキストは残ります。- [FACT] [ ] タスクA という文字列はそのまま出てきます。エラーにもなりません。チェックボックスだけが静かにいなくなります。

加えて、LLMはルールを文字通りに実行します。「すべての箇条書き」と書けば、タスクリストも例外なく対象にします。自然言語の「すべて」とMarkupの「すべて」は一致しないんですが、その区別を自動的にはやってくれないです。

気づいたのも自分ではなく、Codex CLIのPRレビューでした。設計者本人がスルーしていたものが、別エージェントのレビューで引っかかったというのが正直なところです。

まとめ

- [ ] の前に別のブラケット記法があると、GFMのtask list item検出が通らずチェックボックスが消えます。

ラベル系のルールを「すべての箇条書き」に適用するときは、task list itemを明示的に除外しておくのがお勧めです。LLMに渡すルールは自然言語で書いても、最終的にはMarkupで処理されるので、構文上の衝突を事前に潰しておく必要があります。

参考