Skip to content

feat(PLAN63): base イメージの日本語の描画を直し、文書を扱う軽量の道具を足す (#161, #160) - #238

Merged
takemi-ohama merged 4 commits into
release/v3.7.0from
feature/v3.7.0-base-rendering
Sep 22, 2026
Merged

takemi-ohama merged 4 commits into
release/v3.7.0from
feature/v3.7.0-base-rendering

Conversation

@takemi-ohama

@takemi-ohama takemi-ohama commented Sep 22, 2026 •

Copy link
Copy Markdown
Contributor

Summary

base イメージの 2 つの課題を 1 本で閉じる。どちらも containers/base/Dockerfile の同じ
apt / COPY の区画を触るため、分けると同じ箇所で競合する(#160 の本文も「1 本の PR に
まとめる」と書いている)。

要求と受け入れ条件: issues/PLAN63_base-image-rendering.md
設計: issues/PLAN63_base-image-rendering-design.md
実装の分解: issues/PLAN63_base-image-rendering-impl.md
設計 Pull Request: #221 / release Pull Request: #212

中国語・韓国語の規則は、総称ファミリを名指ししたときだけ効かせる(設計の決定 2)

#161 の issue 本文にある形(lang だけを見て前置する)は採っていない。 binding="strong"
の前置は名指しの書体よりも強いため、lang だけを条件にすると Arial:lang=zh-cn から
Liberation Sans を奪い、serif:lang=zh-cn が sans のフェイスに、monospace:lang=zh-cn が
等幅でなくなる。そこで <test name="family"> を伴う 総称ファミリ 4 つ × 言語 2 つ = 8 つの
<match> と、未導入の書体の受け皿 1 つで構成した。

置き場所は /etc/fonts/local.conf から動かせない(設計の決定 1)

conf.d/99-*.conf へ置くと <alias><prefer> が効かない。local.conf は
conf.d/51-local.conf 経由で読まれ、sans-serif を中国語フェイスへ向けている
64-wqy-zenhei.conf / 65-nonlatin.conf より「先」になるためである。理由と実測は
containers/base/fonts-local.conf の先頭のコメントに残してある(受け入れ条件 8)。

実測

CI はこの Pull Request では 1 件も動かない(#216。release/v3.7.0 を base にしているため)。
証跡は手元で採った。gh pr checks の no checks reported は「通った」ことを意味しない。

比較は 2 つのイメージを同じ日に --no-cache で建てて行った。手元にあった 4 日前の
devbase-base:latest(6e67731618ab / 7.09GB)は上流のパッケージが動いており、そのままでは
この変更の増分と混ざるため、release/v3.7.0 の containers/base を
devbase-base-plan63-before:latest として建て直して基準にした。

イメージ Dockerfile ID
変更前 release/v3.7.0 の containers/base cd4ac2330051
変更後 このブランチの containers/base c1b1285cbc66

解決先の表(受け入れ条件 1〜6・11)

docker run --rm --entrypoint /bin/bash <image> -c 'fc-match <指定>'。太字が変わった行。

指定 変更前 変更後
sans-serif WenQuanYi Zen Hei Noto Sans CJK JP
sans-serif:lang=ja WenQuanYi Zen Hei Noto Sans CJK JP
sans WenQuanYi Zen Hei Noto Sans CJK JP
serif WenQuanYi Zen Hei Noto Serif CJK JP
monospace WenQuanYi Zen Hei Mono Noto Sans Mono CJK JP
Noto Sans JP WenQuanYi Zen Hei Noto Sans CJK JP
Meiryo WenQuanYi Zen Hei Noto Sans CJK JP
Yu Gothic WenQuanYi Zen Hei Noto Sans CJK JP
MS PGothic WenQuanYi Zen Hei Noto Sans CJK JP
Zen Kaku Gothic New WenQuanYi Zen Hei Noto Sans CJK JP
Arial Liberation Sans Liberation Sans
Times New Roman Liberation Serif Liberation Serif
Courier New Liberation Mono Liberation Mono
Calibri WenQuanYi Zen Hei Carlito
Cambria WenQuanYi Zen Hei Caladea
sans-serif:lang=zh-cn Noto Sans CJK SC Noto Sans CJK SC
sans:lang=zh-cn Noto Sans CJK SC Noto Sans CJK SC
serif:lang=zh-cn Noto Serif CJK SC Noto Serif CJK SC
monospace:lang=zh-cn Noto Sans Mono CJK SC Noto Sans Mono CJK SC
sans-serif:lang=ko WenQuanYi Zen Hei Noto Sans CJK KR
sans:lang=ko WenQuanYi Zen Hei Noto Sans CJK KR
serif:lang=ko WenQuanYi Zen Hei Noto Serif CJK KR
monospace:lang=ko WenQuanYi Zen Hei Mono Noto Sans Mono CJK KR
Arial:lang=zh-cn Liberation Sans Liberation Sans
Times New Roman:lang=zh-cn Liberation Serif Liberation Serif
Arial:lang=ko Liberation Sans Liberation Sans
WenQuanYi Zen Hei WenQuanYi Zen Hei WenQuanYi Zen Hei
IPAPGothic IPAPGothic IPAPGothic
fc-match -s sans-serif:lang=ja の並び(受け入れ条件 2):
1 番目 2 番目 3 番目
変更前 WenQuanYi Zen Hei IPAPGothic Loma(タイ語)
変更後 Noto Sans CJK JP DejaVu Sans DejaVu Sans

2 番目以降が設計の予想(WenQuanYi Zen Hei → IPAPGothic)と違うのは、
fonts-crosextra-* の依存で fonts-dejavu-core / fonts-dejavu-mono が新たに入るため。
受け入れ条件が固定するのは 1 番目で、そこは設計どおりである。

文書を扱う道具(受け入れ条件 9・10・12)

項目 変更前 変更後
pdftoppm / pdfinfo / pdffonts / pdftocairo 無し /usr/bin/ にある
python3 -c "import PIL, defusedxml, lxml" ModuleNotFoundError: No module named 'PIL' exit=0(PIL 12.1.1 / defusedxml 0.7.1 / lxml 6.0.2)
soffice / libreoffice / pip / pip3 無し 無しのまま
uv /home/ubuntu/.local/bin/uv 同じ
fonts-wqy-zenhei 入っている 入ったまま(前提 2)

イメージのサイズ(受け入れ条件 13)

測り方 変更前 変更後 差
docker image inspect --format '{{.Size}}'(層の合計) 1,602,270,616 B 1,612,709,587 B +10,438,971 B = +10.0 MB
docker images の表示 5.92GB 5.96GB +0.04GB(表示は GB 単位で丸まる)

合否のライン(40 MB 以下)に対して +10.0 MB で収まる。 層の合計の方を合否に使った。
docker images の値は GB 単位に丸まるうえ、containerd の保管では圧縮前後の両方を数えるため、
この規模の差を判定できない。

依存を含めて新規に入ったパッケージは 26(315 → 341。設計の見積もりは 24)。
増えた 2 つは fonts-crosextra-* が引く fonts-dejavu-core / fonts-dejavu-mono である。
消えたパッケージは 0。

fonts-crosextra-caladea fonts-crosextra-carlito fonts-dejavu-core fonts-dejavu-mono
libdeflate0 libgpgme45 libgpgmepp7 libimagequant0 libjbig0 libjpeg-turbo8 libjpeg8
liblcms2-2 liblerc4 libopenjp2-7 libpoppler156 libraqm0 libsharpyuv0 libtiff6
libwebp7 libwebpdemux2 libwebpmux3 libxslt1.1 poppler-utils python3-defusedxml
python3-lxml python3-pil

派生イメージ(受け入れ条件 16)

containers/general(FROM devbase-base:latest の 7 行)を使い捨てのタグで建てて確かめた
(devbase-general:latest は置き換えていない。確認後に削除した)。

sans-serif -> Noto Sans CJK JP        Arial                 -> Liberation Sans
serif      -> Noto Serif CJK JP       sans-serif:lang=zh-cn -> Noto Sans CJK SC
monospace  -> Noto Sans Mono CJK JP   sans-serif:lang=ko    -> Noto Sans CJK KR
command -v pdftoppm -> /usr/bin/pdftoppm

Test plan

  • uv run --locked pytest tests/ -q → exit=0
    • 建て直す前: 2983 passed, 39 skipped(skip は test_base_image_font_matching.py。
      イメージに /etc/fonts/local.conf が無いため。古いイメージを持つ人が赤くならない)
    • 建て直した後: 3022 passed, 0 skipped(skip だった 39 件が実際に通る)
  • devbase build base --no-cache(作業ツリーの containers/base を文脈にして実行)→ exit=0
  • 建て直した後の uv run --locked pytest tests/containers/test_base_image_font_matching.py -q
    → exit=0(39 passed)
  • uv run --locked pytest tests/containers/test_base_dockerfile_fonts.py -q → exit=0(20 passed)
  • 解決先の表 28 行(設計の 26 行のうち Meiryo / Yu Gothic / MS PGothic の行を 3 つへ開いた)
  • イメージのサイズの増分 +10.0 MB(ライン 40 MB 以下)
  • 派生イメージ 1 つで同じ解決先になること

回帰テストの構成(設計の決定 6)

テスト Docker 何を固定するか
tests/containers/test_base_dockerfile_fonts.py 不要 6 パッケージが 1 回目の apt-get install にあること。COPY の宛先が /etc/fonts/local.conf で conf.d/ ではないこと。fc-cache -f が 1 度だけ COPY より後かつ Playwright の RUN より後にあること。fonts-local.conf が 4 つの <alias> と 9 つの <match> を持ち、言語の規則が必ず <test name="family"> を伴うこと。先頭のコメントが置き場所の理由に触れていること。LibreOffice / pip を入れず fonts-wqy-zenhei を消さないこと
tests/containers/test_base_image_font_matching.py 要る 解決先の表の全行。docker run はセッションで 1 回。Docker が無い / イメージが無い / イメージに /etc/fonts/local.conf が無い(古い) ときは skip し、文言に devbase build base --no-cache を出す

利用者への影響

建て直すまで変わらない。 devbase build base --no-cache が要り、devbase up だけでは
反映されない。派生イメージを使っているプロジェクトはその派生イメージも、稼働中のコンテナは
devbase down → devbase up で作り直す(devbase rebuild は使えない)。
言語を明示しない中国語の文書は日本語の字形で描かれるようになる(設計の決定 8。承認済み)。

やらないこと(範囲外)

検査(構造改善 → 実装レビュー → 完了判定)

実装の後に検査の持ち場を通した。この節が最新の証跡である(上の「実測」と「Test plan」は
5821883 の時点のもので、下の 2 つのコミットはテストだけを直している)。

構造改善(/ndf:cross-refactoring)

--scope containers/base tests/containers --severity-threshold major --max-outer-rounds 1 で
起動した。テスト整備ラウンドで 3 者が 6 件を挙げ、統合して 5 件になったが、5 件とも
この Pull Request が 1 行も触っていない containers/base/entrypoint.sh / tmux-clean /
tmux-first を指していた
。差分の外なので全件を却下し、構造改善の変更はこの
Pull Request に 1 つも取り込んでいない
。挙がった中身は #239 として残した。

実装レビュー(/ndf:cross-review)

ホストを除く 3 者(codex / agy / kiro)の輪番で 5 ラウンド。最終ステータス approved、
未解決のスレッド 0 件
(GitHub 側で確認済み)。

ラウンド レビュー 指摘 対応
1 agy=APPROVE / kiro=APPROVE 0 —
2 codex=REQUEST_CHANGES / kiro=APPROVE 1(major) 2674741
3 codex=APPROVE / agy=APPROVE 0 —
4 kiro=COMMENT 1(minor) 80cc84d
5 codex=APPROVE / kiro=APPROVE 0 —

ラウンド 1 で止めなかったのは、3 者輪番の 1 ラウンド目では外れた担当(codex)が差分を
見ていないためである。
実際に codex はラウンド 2 で major を 1 件挙げた。同じ理由で、
80cc84d を入れた後にもう 1 ラウンド(5)回してある。

直した 2 件

コミット ファイル 何が問題だったか
2674741 tests/containers/test_base_image_font_matching.py docker run を包む except (SubprocessError, OSError) が TimeoutExpired まで pytest.skip にしていた。probe が 300 秒で時間切れになると 39 件すべてが skip になり pytest が成功で終わる。try/except を外し、probe の実行中の異常は失敗として上げるようにした。skip は「docker が無い」「daemon / イメージが無い」「古いイメージ(STALE_IMAGE_EXIT)」の 3 つだけに限定される
80cc84d tests/containers/test_base_dockerfile_fonts.py test_no_extra_run_is_added_for_the_six_packages の for run in runs[1:] が RUN で始まる行だけを見ており、パッケージ名は必ず継続行にあるため 2 つの assert が常に真だった。_run_blocks() を足して RUN ブロック単位(行継続を含む 1 命令分)に分け、各ブロックの全文を検査するようにした。退行版の Dockerfile(2 つ目の RUN の継続行へ poppler-utils を足したもの)を一時ディレクトリに作り、旧実装は見逃し、新実装は AssertionError で落ちることを確かめてある

完了判定(/ndf:quality-gates、モード standard)

CI はこの Pull Request では 1 件も動かない(#216)。 手元で CI と同じ検査を行った。

段階 コマンド 対象 実行時刻 結果
限定的な検証 uv run --locked pytest tests/containers/ -q tests/containers/ 2026-09-23 05:17 193 passed / skip 0 / exit=0
全体テスト uv run --locked pytest tests/ -q 全体 2026-09-23 05:18 3022 passed / skip 0 / exit=0
静的解析 ruff check --select=E9,F63,F7,F82 lib lib 2026-09-23 05:20 All checks passed! / exit=0
ビルド検査 python3 -m compileall -q lib bin lib bin 2026-09-23 05:20 exit=0
端から端まで 派生イメージを使い捨てのタグで建て、fc-match 21 行と道具 9 件を実測 containers/go 2026-09-23 05:21 build exit=0 / 全行が base と同じ

skip が 0 件であることが重要である。 Docker が要る 39 件は、この Pull Request の
Dockerfile で建て直した devbase-base:latest(c1b1285 / 1,612,709,587 B)に対して実際に
走っている。イメージの /etc/fonts/local.conf の md5(46ca7156…)はリポジトリの
containers/base/fonts-local.conf と一致し、5821883 より後の 2 コミットは
containers/base を触っていないので、この実測は現在の先端に対するものである。

派生イメージの確認は、FROM 1 行だけの containers/general では「同じ層を指し直すだけ」で
中身が無いため、自前の RUN を持つ containers/go で行った。使い捨てのタグで建てて
確認後に削除してあり、devbase-general:latest などの正規のタグと稼働中のコンテナには
触れていない。shellcheck は手元に無いため実行していない(この差分にシェルの変更は無い)。

受け入れ条件 16 個の判定

# 条件 検証 判定
1〜6 フォントの解決先(総称ファミリ・書体名・欧文・他言語の 28 行) test_base_image_font_matching.py(建て直したイメージに対して 39 passed) 満たす
7 /etc/fonts/local.conf へ置き conf.d/ には置かない。fc-cache -f が 1 度 test_base_dockerfile_fonts.py 満たす
8 置き場所の理由が conf の先頭と設計文書の両方にある 同上(conf 側)+ 設計文書の目視 満たす
9・10・12 poppler の 4 つ / import PIL, defusedxml, lxml / LibreOffice と pip が無い test_base_image_font_matching.py 満たす
11 Calibri → Carlito、Cambria → Caladea 同上 満たす
13 増分が 40 MB 以下 docker image inspect の層の合計で +10.0 MB 満たす(ただし下の注記)
14 pytest tests/ -q が exit=0 上の表 満たす
15 devbase build base --no-cache が arm64 で成功 実装の持ち場で exit=0。6 パッケージの版はイメージの dpkg -l が表と一致 満たす
16 派生イメージを建て直すと同じ解決先 containers/go を使い捨てのタグで建てて実測 満たす

受け入れ条件 13 の注記: 合否のライン(40 MB 以下)は満たすが、条件の文面にある
「依存を含めて新規に入るのは 24 パッケージ」は実測 26 で一致しない。増えた 2 つは
fonts-crosextra-* が引く fonts-dejavu-core / fonts-dejavu-mono である。設計の見積もりの
ずれであって、ラインを外したわけではない。イメージのサイズとパッケージの数は、どの
テストも固定していない
(受け入れ条件 15・16 も同じで、CI がイメージを建てないため)。

Closes #161
Closes #160

takemi-ohama and others added 2 commits September 23, 2026 04:07
`/etc/fonts/local.conf` を 1 つ置き、総称ファミリ (sans-serif / sans / serif /
monospace) と、イメージに無い書体名を Noto CJK の JP フェイスへ向ける。中国語・
韓国語の規則は総称ファミリを名指ししたときだけ効かせる (`<test name="family">`)。
この test を省くと `Arial:lang=zh-cn` から Liberation Sans を奪い、様式も崩れる。

conf.d/99-*.conf へ置くと `<alias><prefer>` が効かない。local.conf は
conf.d/51-local.conf 経由で読まれ、sans-serif を中国語フェイスへ向けている
64 / 65 より「先」になるためで、理由と実測は fonts-local.conf の先頭に残した。

あわせて 6 パッケージを 1 つ目の RUN の 1 回目の apt-get install へ足す。
poppler-utils / python3-pil / python3-defusedxml / python3-lxml と、欧文の
metric 互換の fonts-crosextra-carlito / fonts-crosextra-caladea である。
LibreOffice と pip は入れず、fonts-wqy-zenhei も消さない。

回帰テストは 2 段。Dockerfile と fonts-local.conf の形は Docker なしで、
fc-match の解決先は建てたイメージの中で固定する。後者はイメージが無い・古い
ときは skip する。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011Vu8hNTZKeDeXVLg8hYuK8
@takemi-ohama

Copy link
Copy Markdown
Contributor Author

構造改善(/ndf:cross-refactoring)のテスト整備ラウンドで挙がった 5 件は、いずれもこの PR が 1 行も触っていない containers/base/entrypoint.sh / tmux-clean / tmux-first を指していたため、範囲外と判断して #239 として残した。この PR には構造改善の変更を取り込んでいない。

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 1 | kiro | APPROVE

重点観点(言語規則 8 つの <test name="family"> 有無 / skip 条件の緩さ / Dockerfile の COPY・fc-cache の位置 / テストが設計決定を固定しているか / 本文の実測の裏取り / ドキュメント整合)を確認し、修正を要する指摘は無し。

  • 言語規則 8 件はすべて <test name="family"> を伴い、test_every_language_rule_also_tests_the_generic_family が Arial:lang=zh-cn 退行を辞書一致で固定している(手元で string 系 20 件 pass)。
  • skip は 4 段(docker 無し / daemon 不通 / イメージ無し / /etc/fonts/local.conf 欠如=旧イメージ)で、緩すぎない。手元では既存イメージが検査対象を満たし image 系 39 件が実際に pass(=「常に skip」ではない)。
  • COPY fonts-local.conf と RUN sudo fc-cache -f は Playwright の --with-deps RUN より後に位置し、テストで固定済み。
  • 変更範囲は impl の修正対象 7 ファイルと一致し、.cross_review 等の混入なし。

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 1 | agy | APPROVE

設計PR #221 の決定事項(fonts-local.confの構造・テスト要件・Dockerfileの配置順序)および受け入れ条件の実測整合性を確認し、修正が必要な問題はありません。

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 2 | kiro | APPROVE

承認済みの設計(前提 2/7/8・決定 1/2/5/8)を確認したうえで、実装・テスト・ドキュメントの整合を検証した。修正を要する点は見つからなかった。

  • fonts-local.conf: 言語の規則 8 つはいずれも <test name="family"> を伴い、Arial:lang=zh-cn の退行はない。
  • Dockerfile: COPY fonts-local.conf と RUN sudo fc-cache -f はいずれも Playwright の RUN(--with-deps)より後に置かれている。
  • test_base_image_font_matching.py: skip は docker 不在・イメージ不在・イメージが古い(/etc/fonts/local.conf 無し=exit 90)の 3 条件のみで、常時 skip にはならない。
  • test_base_dockerfile_fonts.py: XML 構造を got == LANG_RULES / got == GENERIC_TO_JP と binding/mode/compare で固定しており、文字列存在だけの検査ではなく退行を捕まえられる。
  • 差分は範囲内(7 ファイル)で、.cross_review 等の混入なし。

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 2 | codex | REQUEST_CHANGES

検証処理のタイムアウトを skip に変換する 1 件の修正をお願いします。

Comment thread tests/containers/test_base_image_font_matching.py Outdated
docker run を包む except (SubprocessError, OSError) が TimeoutExpired まで
pytest.skip にしていたため、Docker もイメージもある状態で probe が 300 秒で
タイムアウトすると 39 件すべてが skip になり pytest が成功終了していた。

skip してよいのは Docker が使えない・イメージが無い (_docker_unavailable) と
イメージが古い (STALE_IMAGE_EXIT) の 3 つだけなので、docker run の try/except を
外して例外のまま失敗させる。意図はコメントで残す。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011Vu8hNTZKeDeXVLg8hYuK8

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 3 | codex | APPROVE

修正を要する新規指摘はありません。

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 3 | agy | APPROVE

修正を要する指摘はありません。設計および受け入れ条件を満たしており、テスト・ドキュメントともに整合しています。

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 4 | kiro | COMMENT

設計 PR #221 で承認済みの事項(fonts-wqy-zenhei 残置・ENV LANG 非設定・言語規則の <test name="family"> 併用・総称ファミリの JP 向け・LibreOffice/pip 非導入)は動かさない前提で実装のみを確認した。手元で devbase-base:latest(ID c1b1285cbc66、PR 本文の「変更後」と一致)に対し test_base_image_font_matching.py を実行し 39 件すべて通ること、test_base_dockerfile_fonts.py 20 件が通ること、fonts-local.conf の言語規則 8 つがすべて <test name="family"> を伴うこと、COPY/fc-cache -f が Playwright の RUN より後にあることを確認した。

指摘は 1 件(minor / テスト)。test_base_dockerfile_fonts.py::test_no_extra_run_is_added_for_the_six_packages の RUN ブロック検査が退行を捕まえられない点をインラインに残した。ブロッキングではない。

Comment thread tests/containers/test_base_dockerfile_fonts.py Outdated
`RUN ` で始まる行だけを集めていたため、各要素は `RUN set -eux; \` のような
1 行目だけになり、パッケージ名が入る継続行を見ていなかった。
`poppler-utils` / `fonts-crosextra` が無いという 2 つの assert は常に真で、
「6 パッケージのために RUN を足していない」という意図を固定できていなかった。

`_run_blocks()` を足して Dockerfile を RUN ブロック (行継続を含む 1 命令分) へ
分け、`_first_run_block()` はその 1 つ目を返す形に寄せた。検査は 1 つ目以外の
各ブロックの全文に対して行う。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011Vu8hNTZKeDeXVLg8hYuK8
@takemi-ohama

Copy link
Copy Markdown
Contributor Author

🔧 /ndf:fix サマリ(最終スイープ)

対応件数: critical=0 / major=0 / minor=1 / nit=0 (合計 1 件)
deferred: 0 件 / rejected: 0 件
commit: 80cc84d
未解決スレッド: 0 件(isResolved == false を数え直して確認)
CI: NONE(このブランチに報告されている check は無い)

詳細

  • tests/containers/test_base_dockerfile_fonts.py:105 — [minor / テスト] for run in runs[1:] の 2 つの assert が常に真だった件。_run_blocks() を足して Dockerfile を RUN ブロック単位(行継続を含む 1 命令分) に分け、_first_run_block() はその 1 つ目を返す形へ寄せた。検査は 1 つ目以外の各ブロックの全文に対して行う。
    • assertion が効くことを確認済み: 一時ディレクトリの複製 Dockerfile の 2 つ目の RUN へ poppler-utils / fonts-crosextra-carlito を足すと、旧実装は見逃し、新実装は AssertionError で落ちる。リポジトリの Dockerfile は書き換えていない。

検証

uv run --locked pytest tests/containers/ -q → 193 passed(skip 0, 41.94s)

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 5 | codex | APPROVE

新規の修正指摘はありません。対象テストは 59 passed / 0 skipped。CI は実行なし。変更前イメージが手元に無く、サイズ増分は再測定していません。

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 5 | kiro | APPROVE

実装・テスト・ドキュメント・CHANGELOG を確認した。承認済みの設計前提(fonts-wqy-zenhei 非削除 / ENV LANG 非設定 / 言語規則は <test name="family"> を伴う / 総称は Noto CJK JP / LibreOffice・pip 非導入)はいずれも守られている。重点確認項目も問題なし: fonts-local.conf の言語 <match> 8 つは全て <test name="family"> を伴い、COPY fonts-local.conf と RUN sudo fc-cache -f は Playwright の RUN より後にある。test_base_dockerfile_fonts.py は XML パースによる構造検査で設計決定を固定しており、文字列存在チェックの退行は捕まる。test_base_image_font_matching.py の skip は Docker 無し / イメージ無し / local.conf 無し(古い)の 3 条件に限定され「常に skip」にはならず、probe の起動失敗は失敗として通知される設計になっている。手元で test_base_dockerfile_fonts.py(20 passed)を確認した。修正提案なし。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant