別表四・五の講座図をbefore/after方式で作り直す(JSON正本からSVGを生成する仕組みへ)

開発eurekapu-nuxt4

税大講本の図を before/after で作り直したやり方が思っていたより自分に合っていた。

左に原図、右に自分で描き直した図を並べる。 並べると、原図の何を写して何を捨てたかが一目で分かる。 同じことを別表四・五の講座でもやりたい、というのが今日の出発点だった。

もとにしている解説書は、図がわかりやすいと言われている。 ただ、その評判が図から来ているのか説明の文章から来ているのかは、自分でも決めきれていない。 とりあえず図から手を付けることにした。

図の実体が1枚も無かった

現状を把握するために、調査を4本のサブエージェントへ分けて走らせた。 税大講本側の before/after の仕組み、別表記事の棚卸し、Turso DB に入っている OCR 図と原本 PDF の照合、表組みを Web で表現する既存スキルの流用性の4本だ。

1本目の報告で前提が崩れた。 書籍側の図ディレクトリがそもそも存在しない。 マークダウンのほうは図を220件参照しているのに、実体は1枚も無い

3本目も近い話を持ってきた。 公開している記事の画像20枚は全部が自製の仮図で、うち17枚はプレースホルダのままだった。 OCR で抜いた原図52枚は memo の下に置かれたきりで、記事には一度も入っていない。 帳票そのものは HTML の table 161個で書かれていた。

権利の扱いも税大講本とは違う。 あちらは公共のデータだが、こちらは市販の解説書なので、原図をそのまま公開物へ並べるわけにはいかない。 before は手元で照合するためのもので、出すのは自分で作り直した after だけにする。 この線引きを計画の頭に置いた。

計画書に5回ダメ出しが返ってきた

計画書と説明図2枚を書かせて、Chrome で描画を確認した。 フェーズ図の Phase 1 と Phase 4 で、説明文が右端で切れている。 各フェーズを2行構成に直させて再生成した。 SVG 内テキストの右端を実測し、696px を超えるものが0件になったところで先へ進んだ。 中身の議論より先に、まず見切れを潰す。

Codex のレビューは一度では通らなかった。 初回に4点。 直しては再レビューに掛け、承認が返ってきたのは5回目だった。

回すたびに計画の形も変わった。 帳票の表現は、HTML の table で組む案から「JSON を正本にして、生成器で SVG を吐く」へ置き換わった。 その手順を別表作成のスキルとして固定するところまで計画に入れた。 動画にしていくのはこれからの話なので、そこはスコープから外した。

判断事項は6件になった。 決裁フォームで答えた。 注釈や細かい修正は JSON のパラメータで持たせる、という方針まで含めて計画が固まった。

Phase 0(原図を掘り起こす)

OCR のやり直しから始めた。 5分から15分かかるので先にバックグラウンドへ投げて、その間に権利ガードを入れさせた。 終わってみると図は220枚で、マークダウンが参照していた件数とそろった。

途中で2回つまずいた。 1つはリポジトリ全体に grep -rn を掛けさせてしまい、node_modules まで走査して重くなったこと。 もう1つは監査スクリプトが相対パスでは動かず、絶対パスの指定が要ったこと。 どちらもすぐ直せるが、作業ディレクトリが動く日には毎回踏む。

図の分類(帳票、図解、装飾)は、サブエージェント5体に分けて回させた。 上がってきた判定はそのまま信じず、親のセッションに全数を突き合わせさせた。 287ページぶんを見て、訂正は1件しか出なかった。 29ページ目にチェック欄の枠があるので、装飾なしから装飾ありへ直した。

Phase 0 は9手順すべてを終え、完了条件の4項目とも実測で満たした。 進捗台帳を新しく作り、チェックを埋めて締めた。 コミットでは学習ゲートが立ったが、今日はスキップと決め、理由を残して通した。

Phase 1 で「ミラーになっていない」と言った

器づくりは素直に進んだ。 ギャラリーの生成コマンドとチェックコマンドを package.json に足させ、テストを2本増やし、全体テストは131ファイル、3,404テストが緑になった(122秒)。 完了報告もそれらしく整っていた。

画面を見て止めた。 図を一覧するページが Miller Column になっていない。 同じリポジトリの別のビューアで採っているレイアウトで、章から図、図から中身へ、列が右に伸びていく形だ。

ついでに3点まとめて注文した。

  • Miller Column(章、図、内容の3列)にする
  • 矢印キーで動けるようにする(上下で項目、左右で列)
  • アイコンは出さない。装飾と判別できたものは最初から一覧に載せない。小さいものはピクセルサイズで落とせる

本家のビューアの見た目とキー操作をそのまま写させ、作り直させた。 判断の基準は好みではない。 自分がチェックしやすいかどうかだけだ。 200枚を超える図を1枚ずつ確認する前提だと、キーボードから手が離れる回数がそのまま所要時間になる。

締めでは、本番ビルドの検証を別の worktree でバックグラウンドに回し、生成物を grep した結果を台帳へ追記させた。 3コミットで Phase 1 を閉じ、検証用の worktree も消してから push した。

Windows と MacBook を行き来する

Phase 1 を締めたところで、続きをどこでやるかで一度迷った。 リモート(Web 版)のセッションで回るかを、リポジトリに入っているものと Windows 機にしか無いものを突き合わせて判定させた。 いったんは「明日ローカルでやる、タスクに積んでおいて」と決めたが、すぐ前言を撤回した。 結局その場で Windows のローカルから続けることにした。

Phase 2 の途中では逆の動きをした。 Windows の前を離れることになったので、成果物をコミットして push させ、MacBook 側で見る形にした。 学習ゲートはクイズに答えられないため、理由を書いてスキップした。 2台運用だと、こういう「機体をまたぐための push」が普通に混ざる。

Phase 2(生成器と別表作成スキル)

JSON 正本の根拠として、令和8年の様式 PDF から項番と欄名を抽出させた。 仕様書を1本書かせてから、データ層と描画層を別々のサブエージェントに分けて並行で走らせた。 データ層にはスキーマ、用語、検証、モデルを、描画層にはレイアウト、描画、CLI を割り当て、どちらも model: opus を明示して起動した。

データ層は用語200語と記入例5本を上げてきた。 記入例はどれも検算を通った。 描画層で止まったのは2点だけで、1つは金額欄の幅超過、もう1つはテストが記入例の件数を5で固定していたことだった。 租税公課の図に使う6本目を足した直後だったので、そこがぶつかった。

Chrome DevTools のスクリーンショットが応答待ちに退避したので、ヘッドレスのブラウザで6枚撮り直し、自分の目で見た。 記事に差し替えた3枚は、PC 幅と390px のエミュレーションの両方で図の位置を実測している。 ギャラリーでは before(書籍のページ)と after(生成した SVG)が並んで出るようになった。

指摘の反映にもサブエージェントを2周ぶん回した。 テストは64件から66件へ増えても緑のままで、6枚とも再生成の差分は出なかった。 待っている間に、スキルの規約表を実装値へ合わせておいた。

ここまでで、JSON 正本から生成器を通して SVG が出る1本の道ができた。 同じ入力からは毎回同じ SVG が出る。

マゼンタは飾りではない

MacBook で並びを見たとき、最初に引っかかったのは色だった。 別表四の図で、留保の欄と52行目の「所得金額又は欠損金額」の文字がマゼンタになっている。 文字は黒でいい。 背景を濃いグレーにすれば足りる。

原図では、当期利益の行から末尾の所得金額までがまとめて枠で囲ってある。 あの囲みが図の主張そのものなので、マゼンタを使うならそちらの枠に使う。 別表五(一)の純資産も同じで、囲う範囲を原図に合わせる。

同じ図で細かいところも2つ返した。 資本準備金の行が落ちているので、原図の中身を省略しない。 区分の列で未納法人税等が3行分をまたいでいるので、そこも別表の表示形式どおりにする。 表示形式は見た目の好みではなく、読み手がその図を申告書として認識するための約束なので、崩すと図の意味が変わる。

指摘は、図を直接直させずに台帳へ逐語で積ませた。 生成器を通さずに SVG を触っても、次の再生成で消える。 台帳のルールを生成器のパラメータへ落として、そこから作り直す。 この周でパラメータに増えたのは、枠、縦に並ぶ複票、欄の左右、グループのタグ、空欄行だ。 増えたぶんはスキルの説明と仕様書にも書き戻させた。

残っているもの

図と説明文のどちらがわかりやすいと言われているのか、まだ確かめていない。 今日は図のほうを作り直したが、答えが文章のほうだったら、次に手を入れる場所が変わる。

  • レビュー、ルール反映、再生成の周回(残りの図)
  • 判断待ちが5件