docs(PLAN63): base イメージの日本語の描画と、文書を扱う軽量の道具の要求仕様と設計 (#161, #160) - #221
Conversation
base コンテナで sans-serif が中国語フェイス(WenQuanYi Zen Hei)へ解決される問題と、 Office 文書・PDF を扱う軽量の道具が無い問題を、1 本の設計にまとめた。 どちらも containers/base/Dockerfile の同じ apt / COPY の区画を触るため 1 本にした。 実装は別のブランチで行う。この Pull Request は設計文書だけを載せる。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 1 | kiro | APPROVE
設計・要求文書 2 ファイルのみの追加。主要な事実主張を作業ツリーで突き合わせて確認した:
- CI が動かない主張(
.github/workflows/ci.ymlのon.pull_request.branches: [main])— 一致 - ビルドコンテキストがディレクトリそのもの(
lib/devbase/commands/container.py:1741のstr(image_dir))— 一致 fc-cacheを末尾に置く根拠(containers/base/Dockerfileの playwright--with-deps chromiumRUN 直後に~/.cache削除、その後にUSER ubuntuの COPY 群)— 一致- 6 パッケージ追加先(
Dockerfile:22のfonts-noto-cjk fonts-noto-cjk-extra;が 1 つ目apt-get installの末尾)— 一致 containers/lfm/Dockerfile:23がfonts-noto-cjkを base 非依存で自前導入 — 一致- 決定 2 の壊れ方(
lang単独条件が欧文/様式を奪う)とそれを回避するfamily+lang設計 — 論旨に矛盾なし
fc-match の解決先やパッケージ数・サイズ増分は稼働中コンテナでの実測値で、イメージ再ビルドでしか最終確認できない旨が本文・受け入れ条件・「未確認のまま残ること」に明記されており、範囲外(#219 / #220)の切り出しも一貫している。修正を要するコード/設定/記述の不整合は検出されなかった。実装 PR で受け入れ条件 1〜16 を再ビルド後の証跡で採り直すこと。
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 1 | agy | REQUEST_CHANGES
要求仕様(受け入れ条件)と設計文書(フォント設定規則・テスト設計)の間で、韓国語等幅フォント(monospace:lang=ko)の検証および fonts-wqy-zenhei のテスト方針に関して記述の整合を取る必要があります。詳細は各インラインコメントをご確認ください。
レビュー指摘 2 件への対応。 - 受け入れ条件 6 の表に総称ファミリ 4 つ × 言語 2 つの 8 行が揃っていなかった。 `sans:lang=zh-cn` / `sans:lang=ko` / `monospace:lang=ko` を足し、欧文を名指しした 行にも `Arial:lang=ko` を足して 12 行にした(major) - 設計文書の「解決先の表」にも同じ 4 行を足し、`serif:lang=ko` の変更前が `(未測定)` のままだったのを実測値 `WenQuanYi Zen Hei` へ直した - テスト設計の受け入れ条件 6 の行を「8 つ」から「12 行(総称ファミリ 4 つ × 言語 2 つの 8 行と、欧文を名指しした 3 行、中国語の書体を名指しした 1 行)」へ改めた - 「変えないもの」の `fonts-wqy-zenhei` の行が Dockerfile の実態と合っていなかった。 導入の行は無く `npx playwright install --with-deps chromium` が依存として入れる、 と書き直した。決定 6 の検査の観点も `apt-get remove` / `apt-get purge` / `dpkg -r` が無いことの確認へ具体化した(minor) いずれも手元の devbase-base:latest(arm64)での実測にもとづく。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
レビュー指摘への対応(round 1)
commit: 対応の内訳1. major — 受け入れ条件 6 の表に 規則は「総称ファミリ 4 つ( 2. minor — 「変えないもの」の書き方が Dockerfile の実態と合っていない( Dockerfile に 検証この Pull Request は設計文書だけでコードの変更もテストコードもないため、テストの追加・実行はありません。代わりに、直した表の行数と設計文書の規則の数が一致していることを確かめました。 受け入れ条件 6 の表は見出しと区切りを除いて 12 行、うち総称ファミリ × 言語が 8 行です。 なお本 Pull Request は 変更したファイルは 🤖 Generated with Claude Code |
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 2 | kiro | APPROVE
設計・要求文書 2 ファイルのみの追加 PR。差分外を含め主要な技術主張をワークツリー実体と突き合わせた(.github/workflows/ci.yml の pull_request.branches: [main]=前提6、containers/base/Dockerfile の apt 2 回呼び出し=L17/L57=決定4、fonts-noto-cjk が L22 で libnss3(L21) の隣=設計の差分の形、末尾 COPY 群の --chmod=0644=L227/240、npx playwright install --with-deps chromium=L213 とその後の cleanup=決定5、sudo install -d/sudo ln -sf=L226/250、tests/snapshot/test_restore_incremental.py の shutil.which→docker info→docker image inspect→skip の 3 段=決定6 の先例、pyproject.toml [tool.pytest.ini_options] に markers/addopts 無し=決定6、amd64 の google-chrome-stable=未確認欄)。いずれも文書の記述と一致し、文書間の用語・前提・数値(+約24MB / 24 パッケージ / +0.34%)にも矛盾は見当たらなかった。修正を要する指摘は無い。
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 2 | codex | REQUEST_CHANGES
切り戻し手順と XML の規則数に関するテスト設計の修正が必要です。
cross-review round 2 (codex) の 2 件へ対応した。 - 切り戻し手順を 4 段(revert / base の再ビルド / 派生イメージの建て直し / 稼働中コンテナの作り直し)へ書き直した。base のタグを戻しても、派生イメージは `FROM devbase-base:latest` を自分のビルドの時点で焼き込むため建て直すまで古い層を持つ。 「影響」の表の「利用者の操作」の行にも同じことを書いた - `fonts-local.conf` の `<match>` は、未導入の書体の受け皿 1 つと総称ファミリ 4 つ × 言語 2 つの 8 つで合計 9 つである。テスト設計の検査条件と本文の説明の両方を 9 つへ直した Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
🤖 cross-review round 2 | fix 完了
commit: 対応の内容
設計文書だけの Pull Request のためテストコードは無く、テストの追加・実行は行っていない。継続的統合はこの Pull Request では動かない(#216)。 レビュースレッドは 2 件とも reply のうえ Resolve 済み。 |
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 3 | codex | REQUEST_CHANGES
修正提案はインラインの1件です。
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 3 | agy | REQUEST_CHANGES
要求文書(受け入れ条件 6)・決定 2・テスト設計との間で「解決先の表」に Times New Roman:lang=zh-cn が欠落している点(major)、および決定 2 内での決定番号の参照違い(minor)の 2 点についてインラインで修正提案を記載しました。
round 3 のレビュー指摘 3 件へ対応する。 - 解決先の表へ `Times New Roman:lang=zh-cn` の行を足す(実測済みの値。 `Arial:lang=ko` は既にあった) - 決定 2 の中の参照先を「決定 4」から「決定 8」へ直す。`sans-serif` の prefer を日本語へ向けるのは決定 8 である - 決定 4 のキャッシュの説明を Docker の仕様へ合わせる。`RUN` のキャッシュが 効いている間はその中身が実行されないため、取得先の内容が変わっても キャッシュは無効にならない Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
round 3 のレビュー指摘への対応
コミット: 変更したのは 対応の内訳
確認設計文書だけの Pull Request でテストコードが無いため、次の 2 点を確認しました。
3 件とも thread へ返信のうえ Resolve 済みです。継続的統合はこの Pull Request では動きません(#216)。 |
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 4 | kiro | COMMENT
設計・要求文書として実測に裏付けられ、コード参照(ci.yml の branches: [main]、Dockerfile の 2 回の apt-get install・playwright --with-deps chromium 直後の ~/.cache 削除・末尾 COPY 群、_build_single_image の str(image_dir)、snapshot テストの 3 段 skip 先例、lfm:23 の fonts-noto-cjk 自前導入)はいずれも作業ツリーと一致していることを確認した。指摘は 1 点(minor / 整合性)で、受け入れ条件 13 の増分サイズの合否ラインと測定方法の不一致(インライン参照)。ブロッカーではない。
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 4 | agy | APPROVE
Round 3 までの修正内容(解決先の表への追加、参照番号の整合、キャッシュ無効化条件の説明)が正しく反映されており、要求仕様および設計文書の整合性が確認できました。追加の修正アクションはありません。
受け入れ条件 13 は合否のラインを「約 24 MB」とし、検証を `docker images` の差と定めていた。しかし 24 MB は稼働中のコンテナでの `du` の差(apt の リストとキャッシュを含む)で、`docker images` が出す層単位の値とは測り方が 違う。そのままでは正しい実装でも不合格になりうる。 合否のラインを「7.09GB に対して +0.5% 未満(40 MB 以下)」へ改め、 24 MB をラインに使わない理由を条件の中に書いた。設計文書の 「未確認のまま残ること」にも、このラインが測り方の違いを吸収するための ものである旨を追記した。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
cross-review 最終スイープ 完了round 4 で残っていた指摘 1 件に対応し、PR 上の未解決スレッドを 0 件にしました。 今回のスイープで対応した件数: 1 件
合否のラインを 7.09GB に対して +0.5% 未満(40 MB 以下) へ改め、「合否のラインを『約 24 MB』にしない」理由(24 MB は稼働中のコンテナでの 状態
継続的統合はこの PR では 1 件も動きません(#216)。 🤖 Generated with Claude Code |
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 5 | kiro | APPROVE
設計・要求文書の主張を実コードと照合した(CI の on.pull_request.branches=main、tests/containers/ 8 ファイル、Docker gated テストの先例 tests/snapshot/test_restore_incremental.py の which→docker info→image inspect 3 段、pyproject.toml に marker/addopts 無し、_build_single_image が containers/base をビルドコンテキストに渡すこと、Dockerfile の COPY 群が USER ubuntu より後で fc-cache を playwright の --with-deps より後に置ける位置関係、fonts-wqy-zenhei が明示 install されず playwright 依存で入ること、<alias>4/<match>9 の内数整合)。いずれも一致し、修正を要する不正確・矛盾・存在しないパスは見つからなかった。指摘無しで承認する。
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 5 | codex | REQUEST_CHANGES
修正が必要な指摘は 1 件です。
devbase rebuild は devbase build --expires=7 のシノニム (lib/devbase/commands/container.py の cmd_rebuild) で、イメージのビルドしか 行わず稼働中のコンテナを作り直さない。期限内ならビルドそのものを飛ばすため、 切り戻しにも適用にも使えない。 「影響」の表の「利用者の操作」と「切り戻し手順」の 4 番目の両方で、稼働中の コンテナの作り直しを devbase down → devbase up に統一し、devbase rebuild が ここでは使えない理由を書き添えた。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
round 5 の指摘への対応
内容codex(major / 正確性)の「
未解決スレッドは 0 件です。設計文書だけの Pull Request のためテストコードは無く、テストの追加・実行はしていません。継続的統合はこの Pull Request では 1 件も動きません(#216)。 🤖 Generated with Claude Code |
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 6 | codex | APPROVE
修正を求める指摘はありません。
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 6 | agy | REQUEST_CHANGES
要求仕様書(受け入れ条件)と設計文書(解決先の表・テスト設計)の間で、検証対象の項目にいくつか漏れや対応の不整合があります。
IPAPGothic(名指し)の対応付け: 設計書の解決先の表で固定対象となっているIPAPGothic(名指し)が、要求仕様書の受け入れ条件およびテスト設計の対応表から欠落しています。fc-match sansの受け入れ条件追加:fonts-local.confで個別に alias を定義し解決先の表にもあるsans単体の検証が、受け入れ条件 1〜4 から抜けています。fc-match -sのテスト設計への反映: 受け入れ条件 2 で要求されているfc-match -s sans-serif:lang=jaの 1 件目の検証が、テスト設計の固定対象(解決先の表の各行)から漏れています。
…-s を書く (#221) round 6 のレビュー指摘 3 件への対応。 - 受け入れ条件 6 の表へ `IPAPGothic`(名指し)の行を足した。イメージに実在する 日本語の書体がそのまま残ることを固定する。受け入れ条件 4 は「イメージに無い 書体名が JP へ落ちる」条件なので、`WenQuanYi Zen Hei`(名指し)と同じ性質の この行は 6 の表へ置いた - 受け入れ条件 1 へ `fc-match sans`(`lang` なし)を足した。`fonts-local.conf` は `sans` の `<alias>` を持つのに、`lang` を付けない照合が固定されていなかった - テスト設計の受け入れ条件 1〜4 の行へ、`fc-match -s sans-serif:lang=ja` の 1 件目も 確かめることを明記した。あわせて受け入れ条件 6 の行数を 12 から 13 へ直した Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
round 6 の指摘への対応(3 件)
commit: 対応の内訳
変更したのは 未解決スレッドは 0 件です。 |
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 7 | kiro | COMMENT
設計・要求文書はコードベースの事実(base Dockerfile の RUN 構成・COPY 区画・playwright --with-deps、_build_single_image のビルドコンテキスト、cmd_rebuild=build --expires=7、test_restore_incremental.py の docker skip 3 段、ci.yml の pull_request.branches: [main]、containers/lfm/Dockerfile:23)と一致していることを確認した。設計レベルの追加指摘は無い。インラインの 1 件(受け入れ条件 5 の Calibri/Cambria の分類)のみ。
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 7 | agy | APPROVE
要求仕様書・設計文書ともに既存コードおよびコンテナ実機検証の結果と整合しており、受け入れ条件とテスト設計の対応付けも正確です。修正を要するアクションはありません。
受け入れ条件 5 の見出しは「欧文が壊れない」だが、`Calibri` と `Cambria` は 変更前に `WenQuanYi Zen Hei`(中国語のフェイス)へ落ちており、`Arial` などの 「変更の前後で変わらない」ものとは性質が違う。同じ枠に並べると基準を誤読させる。 - 受け入れ条件 5 は変わらない 3 つ(`Arial` / `Times New Roman` / `Courier New`)に絞る - 受け入れ条件 11 を「欧文の metric 互換が直る」とし、現状がどちらも `WenQuanYi Zen Hei` であることと、直す手段(`fonts-crosextra-carlito` / `fonts-crosextra-caladea`)を書く - 設計文書のテスト設計の表の `5・11` の行を、上の切り分けに合わせる 受け入れ条件の番号は 1〜16 のまま変えていない。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
cross-review 最終スイープ(完了)round 7 で残っていた 1 件に対応し、PR 上の未解決スレッドは 0 件になった。
このスイープで対応した指摘
指摘のとおりである。
受け入れ条件の番号は 1〜16 のまま変えていない(後ろの条件の番号がずれるとテスト設計の表との対応が壊れるため)。 変更
継続的統合はこの Pull Request では 1 件も動かない(#216)。 |
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 8 | codex | APPROVE
設計文書の差分と関連実装を確認し、修正を要する指摘はありません(イメージ再ビルド・実機描画は本レビューでは未実施)。
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 8 | kiro | REQUEST_CHANGES
設計文書の実測表に 1 件の相互矛盾があります。「解決先の表」の ko 行の『変更前』と、決定 2 の『規則なし』列(=同じ現状 base)で sans-serif:lang=ko / serif:lang=ko の値が食い違っており、受け入れ条件・回帰テストの基準値がずれます。インラインの指摘を参照してください。
「解決先の表」の ko の「変更前」と、決定 2 の表の ko の「規則なし」は 食い違って見えるが、測っている状態が違う。前者は /etc/fonts/local.conf が無い今の base イメージそのまま(WenQuanYi Zen Hei)、後者は local.conf は置いたうえで zh-cn / ko の <match> だけを書かなかった状態 (Noto Sans CJK JP / Noto Serif CJK JP)である。どちらも 2026-09-22 に arm64 で実測した値なので、値は変えない。 読み分けられるように、決定 2 の表の列の見出しを「zh-cn / ko の規則なし」 へ改め、表の直前に 3 つの列がどれも local.conf を置いた状態であることと、 local.conf を置く前の値は「解決先の表」の「変更前」にあることを書いた。 決定 2 の末尾の段落の言い回しも同じ語に揃えた。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
round 8 の指摘 1 件(kiro / major)へ対応しました
指摘「解決先の表」の ko の『変更前』( 判断: 一部だけ受け入れ食い違って見えること自体は正しい指摘なので受け入れました。一方で提案された値の書き換え(「解決先の表」の ko の『変更前』を
実際に直したところ読み分けられるよう、値ではなく列の見出しと前置きの文を直しました。
「解決先の表」の値は 1 つも変えていません。設計文書のみの PR のため、テストの追加・実行はありません(CI は #216 により本 PR では動きません)。 これで round 1〜8 の指摘 14 件すべてが対応済み・Resolve 済み、未解決スレッドは 0 件です。 |
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 9 | codex | APPROVE
要求仕様・設計と関連コードを確認し、修正を要する指摘はありません。
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 9 | agy | APPROVE
要求仕様および設計文書の整合性、受け入れ条件とテスト設計の対応、実測値・切り戻し手順の妥当性を確認しました。修正を要する指摘事項はありません。
Summary
base イメージの日本語の描画(#161)と、文書を扱う軽量の道具(#160)の要求仕様と設計である。設計文書だけを載せる。
containers/base/Dockerfileは変更しない(実装は別のブランチで行う)。2 件を 1 本にしたのは、どちらも
containers/base/Dockerfileの同じ apt / COPY の区画を触るためである(#160 の本文が「#161 を先に入れるか、1 本の PR にまとめる」と書いている)。ベースは
release/v3.7.0(release Pull Request は #212)。範囲外として起票したもの
決めたこと
issues/PLAN63_base-image-rendering-design.md/etc/fonts/local.confから動かさないappend1 つで足りるRUNの最初のapt-get installの一覧へ足すCOPYとfc-cache -fは末尾のCOPY群へ置くTest plan
設計の段で確かめたことである。すべて手元の
devbase-base:latest(Ubuntu 26.04 / arm64 / fontconfig 2.17.1 / 7.09GB)の稼働中のコンテナで実行した(イメージは建て直していない)。実装の受け入れ条件は、建て直したイメージで採り直す。fc-match sans-serif/sans-serif:lang=ja/serif/monospace/Noto Sans JP/Meiryo/Yu Gothic/MS PGothic/Zen Kaku Gothic New/Calibri/CambriaがすべてWenQuanYi Zen Hei(monospaceはWenQuanYi Zen Hei Mono)を返すことを確認。/etc/fonts/local.confは存在しない(lsがNo such file or directory)/etc/fonts/conf.d/99-devbase-fonts.confと/etc/fonts/local.confへ置いて比べた。前者ではsans-serifがWenQuanYi Zen Heiのまま、後者ではNoto Sans CJK JPになる。<alias><prefer>だけが読み込み順に依存し、<match target="pattern">はどちらでも効くことも確認したlangだけを見る)/ この設計の形(family+lang)を同じイメージの中で比べた。bug: 日本語が中国語フォントで描画される(sans-serif の解決先が WenQuanYi Zen Hei になる) #161 の形ではserif:lang=zh-cnがNoto Sans CJK SCに、Arial:lang=zh-cnがNoto Sans CJK SCになる(様式と欧文が奪われる)。この設計の形では 12 行すべてが期待どおりになる。設計の「決定 2」に表があるapt-get install -y --no-install-recommends poppler-utils python3-pil python3-defusedxml python3-lxml fonts-crosextra-carlito fonts-crosextra-caladeaが成功。新規に入るのは 24 パッケージ、ディスクの増分は 約 24 MB。pdftoppm/pdfinfo/pdffonts/pdftocairoが入り、PIL12.1.1 /defusedxml0.7.1 /lxml6.0.2 が import でき、soffice/libreoffice/pip/pip3は入らないCalibri→Carlito、Cambria→Caladea、Arial→Liberation Sansが、local.confを置いた後も変わらないことを確認~/.config/fontconfig/fonts.conf(スロット 50)に書いた<prefer>が/etc/fonts/local.conf(スロット 51)より優先されることを確認playwright-kitの確認:devbasex/ai-pluginsのplugins/playwright-kit/skills/playwright-kit-ops/templates/run.sh・scripts/init_project.sh・templates/runtime-README.mdが、初回にuv sync+playwright install chromiumを実行する設計であることを確認。bug: 日本語が中国語フォントで描画される(sans-serif の解決先が WenQuanYi Zen Hei になる) #161 の「決めること」の判断材料にした(chore: base が Playwright のブラウザを取得直後に捨てている。arm64 には動く Chromium が入らない #220)この Pull Request では継続的統合が 1 件も動かない
.github/workflows/ci.ymlのon.pull_request.branchesはmainだけである。release/v3.7.0を base にした Pull Request では検査ジョブが 1 件も動かない(#216)。gh pr checksはno checks reportedを、mergeStateStatusはCLEANを返すため、画面の上では通ったように見える。通っていない。 検証は手元で行った(上の証跡)。この Pull Request は設計文書の 2 ファイルだけを足すため、
lib/bin/testsには差分が無い。