2026.07.22 (水)

✨ GPT-5.6 Solの要約  

身体記録UIを直し続けると過去の日記が最新構造と衝突し得ることに気づき、1つのschema_versionでrenderer・schema・validatorを同じバージョンに結び付けた記録。

body_reviewにはバージョンがあったが、rendererは使っていなかった

ブログ内にダイエット・食事管理アプリのMVPを作った後、折りたたみ画面の「今日」と「直近7日」を分け、展開したカードが狭い幅でも崩れないように直した。コーチング判定の白い星も、身体記録と同じ評価表示にそろえた。

画面を直し続けるうちに、もっと大きな問題が見えた。front matterにはすでにschema_versionがあったのに、実際の_includes/body-review.htmlはその値を見ず、最新構造を直接描画していた。後でデータ構造を変えると、過去のDaily Reviewまで最新rendererに入り、壊れる可能性があった。

schema_versionからvN rendererを直接探す

body-review.htmlにバージョンごとのcase whenを並べることはしなかった。数字からパスを作り、そのファイルを直接呼び出す。

{%- assign schema_version = review.schema_version | plus: 0 -%}
{%- capture renderer_path -%}body-review/v{{ schema_version }}.html{%- endcapture -%}
{% include {{ renderer_path }} review=review %}

v4ならbody-review/v4.html、v100ならbody-review/v100.htmlへ進む。v101から急に止まる上限もない。対応するバージョンファイルが実際にあれば同じ規則でつながり、なければ最新バージョンへ黙ってfallbackせずbuildが失敗する。

renderer・schema・validatorを同じ番号で束ねる

画面だけをバージョン管理すると、入力検査がまたずれる可能性がある。そこで1つのバージョンを3つのファイルで構成した。

_includes/body-review/v4.html
_project/blog-system/body-review-schemas/v4.yml
_project/blog-system/body-review-validators/v4.rb

検査器はrepository内のすべてのvNを探し、3ファイルのどれかが欠けているか、rendererにbody-review--vNマーカーがなければ失敗する。新しいデータ構造が必要なときだけ次のバージョンを追加し、すでに公開した記事は自身が宣言したバージョンで解釈し続ける。

v4では、今すぐ気になっていた見た目も一緒に直した。折りたたみ要約では「今日」と「直近7日」を別の行に分け、展開カードはcomponent自身の幅に応じて3列から2列、さらに1列へ変わる。身体記録とコーチング判定は同じ評価includeを使い、UI文言とaccessibility labelも有効な言語ごとのdataから取得する。

これで単純な文言やstyleの修正はv4内で直せばよい。data shapeを壊す変更なら、新しいvNの一式を追加する。最新画面を作るたびに、過去の日記までまとめて書き直す必要がなくなった。

コメントする