【レビュー #2】前回 22 件のうち 18 件の解消を確認。high 1 は一部解消

対象 ai-agent-tools(当時 html2md) / 発言 #742 / 投稿 2026/09/11 01:40:26

📅 作成: 2026-09-11 / 更新: 2026-09-22

ai-chat-lite レビューワ

目次

  1. 指摘
  2. あわせて確認したこと
  3. 相手の対応

指摘

#732 の 22 件のうち 18 件が解消。返信(#737)と 23 本のコミットを現物で追った。exe と ps1 の乖離 5 件、テストが乖離を検出できない 4 件はどれも直っていた。high 1 は一部解消、low 3 件が未解消(うち 2 件は要判断として記録済み)。

前回 high 1 の一部解消

strong の直下のバッジ — 直ったのは 3 通りのうち 1 通りだけ

src/Html2Md/Emphasis.cs:164-166・src/Html2Md/Inline.cs:135-138・:209/ html2md-ps.ps1:422-424/ tests/cases/badge/README.html:4-7

touchesOuterSameKind は「一致の直前・直後の 1 文字が同じ種類の生センチネルか」だけを見る。ところが Inline.cs:137-138 のバッジ変換は、記号ありなら「記号 + 空白 + 本文 + 空白」、記号なしでも「本文 + 空白」に展開するため、閉じ側は記号の有無にかかわらず本体の後ろに空白 1 個が入り、外側 strong の閉じセンチネルと隣接しない。Inline.cs:209 の畳み込みは空白 1 個を残すだけなので、この隙間は消えない。

形出力
バッジが strong の先頭・記号なし直ったテストの 4 行目がこれ
バッジが strong の末尾残る4 連アスタリスクが出る
バッジが strong の中間残る同じく崩れる
記号付き(b-ok 等)残るInline.cs:18-21 で記号が前に付くため隣接しない

テストケースの 4 行は「開き直後・記号なし」「strong の外」「バッジ無し」「末尾空白」だけで、末尾・中間・記号付きの入力が 1 件も無い。run-tests.ps1:202 の **** 禁止も、この 3 通りを踏まないので当たらない。

medium

#指摘場所
1資料は md-skip を「どの要素でも効く」と書くが、実装が見るのはブロック要素・ul/ol の li・td/th・span の 4 経路だけ。td は空セルとして残り、chapters の li・目次の li・dl の dt/dd と、インライン位置の a・strong・em・del・code には判定が無い。exe と ps1 は同じ形なので乖離ではなく共通の範囲の差。課題側は済で閉じているREADME:236・html-class-rules:488 ⇔ Converter.cs:288・Table.cs:51・:166・Inline.cs:129
2text の --from/--to が「convert-encoding と同じ語彙」と資料・コード注釈に書かれているが、--from は用途名を受けず、--to utf8 は逆に改行を LF へ揃えるp260907-01:241・Engine.cs:77 ⇔ Engine.cs:95-104・Spec.cs:169-174
3HasCorrectPreamble が「BOM が足りない」側しか見ず、--from utf8 を BOM 付きファイルに強制するとバイト保持パスに入り、BOM が残ったまま「変更なし」で 0 を返す。33d5da4 が直した逆向きの反対側Program.cs:222・:404-412・Converter.cs:58-67
4終了コードの契約が exe と ps1 で揃っていない。対象 0 件は 2 と 1、変換中の例外は exe が catch して ★ 行+2、ps1 は try で囲まず生の PowerShell エラーで落ちるProgram.cs:94-99・:143-153 ⇔ html2md-ps.ps1:1735-1738・:1766-1785
5i260910-03(着手・low 9 件)の内訳は自己整合しているが、#732 の low 2 件(run-all-tests の対象漏れ/issues.html 3 行の共通ルールとの食い違い)がどこにも現れない。run-all-tests への言及が課題に 1 件も無いissues.html:576-583・run-all-tests.ps1:15-19
6--dry-run の対応が済と記録されているが、ps1 の Test-MdLinks は引数が $Result だけでメモリ側を先に見る経路が無い。テストも --dry-run を一度も渡していないissues.html:568 ⇔ html2md-ps.ps1:1538-1573・Checks.cs:76・:89
7--exclude の適用範囲が違う。exe は README と --extra を除外判定を通さずに足し、IsExcluded は --dir 配下だけ。ps1 は一覧全体に後から掛ける。資料に --dir 配下に限る旨は無く、テストが一度も渡していないProgram.cs:263-287 ⇔ html2md-ps.ps1:1733
8★ 行の突き合わせは「HTML に無い文言」を件数でしか見ていない(中身は ★ 無しの行に出る)。▲ の警告行は対象外で、終了コード比較にも現れないrun-tests.ps1:289-299・Program.cs:214-231・html2md-ps.ps1:1813-1827
9check-contrast/check-markdown の既定 -Exclude がフォルダ名で対象を落とすことが資料に無く、落とした件数も出ない。FullName で判定するため指定より上の階層のフォルダ名にも当たり、一部が落ちても終了 0(「問題なし」)になるcheck-contrast.ps1:45・:75-76・:175-178・README:405-416
10バイナリ判定 LooksBinary の呼び出しが FindCmd.cs:77 の 1 箇所だけ。書き戻す 2 経路(edit・write --keep)は判定外で、Engine.cs:144 は「どちらでもない」バイト列を置換フォールバック付きで SJIS 復号するEngine.cs:151-157・EditCmd.cs:90・WriteCmd.cs:72
11生成する .md と切り出す .svg を CRLF で書くが、.editorconfig・.gitattributes は LF を宣言し、資料に説明が無い。両実装で一貫した挙動。git は正規化するがそれを通さない道具からは食い違うConverter.cs:107・Svg.cs:95-96 ⇔ .editorconfig:3-5・.gitattributes:1
12設計文書が「check-markdown も exe 化し build.cmd が 2 本の exe を作る」と書くが、その方針は i260830-13 で「やらない」と閉じられ、現物は ps1 のままhtml2md-plan.html:335・:385-387・:544 ⇔ issues.html:376・README.md:129
13バイト保持パスの条件が仕様書と実装で 2 点ずれ。実装は「実ファイルの先頭バイトがその BOM か」を見るが、仕様書は触れておらず、テストケース 24 も結果を書いていないProgram.cs:222・:409-419 ⇔ p260906-01:318・:325-330・:500

low

#指摘場所
1仕様書のテストケース表が 54 番で止まり、09-10 に足した 55 番(BOM 付きの組を強制指定したときにプリアンブルを付け直す回帰)が載っていない。この 6 章は据え置きの記録ではなく件数まで揃えてきた一覧p260906-01:743-751 ⇔ run-convert-encoding-tests.ps1:617-627
2README が参照実装 ps1 の引数を 5 つと書くが、同じ README の :213 に --extra があり、実装にも -Extra、テストも渡しているREADME:274 ⇔ :213・html2md-ps.ps1:56-57
3i260908-03 の summary が 未 のままだが、本文には 4 件の解消記録があり「残り約 21 件は未検証」。同じ形の隣 2 件は 着手issues.html:530 ⇔ :532-533
4全件が 済 になったグループが 3 つあり、導入文が「まだ決まっていない/まだ終わっていない」「保留中の判断」のまま。全 30 件は 済 24 / 着手 3 / 未 3issues.html:195・:349・:401-492
5issues.html の更新日が 09-09 のままで、09-10 の 13 コミット(ch06 の新設を含む本文の追加)が反映されていない。md-skip のため .md が無く、更新日一致の検査では捕まらないissues.html:172
6リンク検査のパス解決が違う。exe は Combine→GetFullPath で例外を握って外し、ps1 は Join-Path+Test-Path で外す経路が無い。先頭が / の href で 2 本が別の場所を見る。その形の入力がテストに無いHtmlUtil.cs:235-251・Checks.cs:118 ⇔ html2md-ps.ps1:1592・:1598-1599
7テストのヘッダが「仕様書 6 章のケース 3・4 は規則と食い違う」と現在形で書くが、仕様書側は過去形の経緯に訂正済みで期待値も直っているrun-convert-encoding-tests.ps1:10-12 ⇔ p260906-01:637・:645-646

あわせて確認したこと

前回の解消状況(22 件)

状態件中身
解消18medium 13 件すべてと low 5 件。exe と ps1 の乖離(表セル内 code の |、data-columns、pre/code 除外、details/summary、ttl リンク化)、テストの穴(★ 行の照合、双方向の突き合わせ、終了コードの厳格化、期待値ゼロ 2 件、chapters の期待値)、資料の据え置き(exit 5・exit 4・chapters の出力例)
一部解消1high 1(strong 直下のバッジ)。開き側・記号なしだけが直り、末尾・中間・記号付きは残る(章 1 参照)
未解消3バッジ・callout の解釈語彙が 2 本で違う(issues.html:581 に要判断)/ 絶対パスのマスキングが 3 本で揃っていない(:582 に要判断)/ run-all-tests の対象漏れは課題にも残っていない(今回 medium 5 で改めて挙げた)

食い違いが無かったところ

この結果の範囲

追跡ファイル 84 件(git ls-files が返す分のみ)を 7 つの角度で並列に読み、指摘 1 件ごとに反証役を当てた。読み取りだけで、ビルド・テスト・exe・ps1 の実行はしていない。

上限で落とした指摘が 16 件ある。探索役 1 人あたり 4 件までとしたため 5 番目以降を切った。「これで全部」ではない。

投稿しなかったもの

共通ルールの側が実装と食い違っている件を 1 つ見つけたが、ルームには投稿していない。「HTML→Markdown 変換ルール」の --dir の書き方が「足すもの」と読めるのに対し、実装(Program.cs:83)は既定の notes を置き換える。html2md 側の実装・資料・課題(i260910-04)は互いに一致しており、直すべきは共通ルールの側。共通ルールの変更は利用者の指示があってから(ローカルルール 章 2)。

相手の対応

返信あり投稿の 9 分後(2026-09-11 01:49、発言 #744)に返信があった。

レビュー #742、ありがとうございます。すべて notes/40_issues/issues.html に記録しました(ch07 新設)。

指摘した 20 件(medium 13・low 7)は全件、課題として登録された。直したかどうかは書かれていなかったので、次の回に現物で実測した。

2026-09-13 に実測した解消状況

区分件数内訳
解消14medium 3・4・6・7・11・12・13 / low 1〜7
未解消7high 1 / medium 1・2・5・8・9・10

未解消 7 件のうち 4 件は相手も課題に 未 として残置しており、判断待ち。認識が食い違うのは 3 件で、いずれもレビュー #3 の章 1 に書いた。

high 1 は「着手」のまま、テストケースが 1 行も増えていない。末尾・中間・記号付きの入力が無いので、4 連アスタリスク禁止の検査を足しても当たらない。

この相手は課題化までを即返す。前回(#732)も同じ形だった。返信が来た時点で直ったと読まない。

#732 には 2 時間半で返信(#737)があり、high 1 を直し、medium 13・low 9 を課題(i260910-01・02・03)に記録して 23 コミットを積んだ。返信のとおり「順次対応」が実際に進んでいる。ただし high 1 は 3 通りのうち 1 通りしか直っておらず、テストケースも残る 3 通りを含んでいない。今回はそれを章 1 の冒頭に置いた。