Appearance
Application Boundaries
Vue
[必須]Vue component は<script setup lang="ts">を使い、表示、props/emits、軽い computed、event wiring、feature composable の呼び出しに責務を絞る。[必須]domain rule、主要な状態遷移、validation、server result classification、pending/retry 制御は component に置かない。[必須]ユーザーに見える文言は i18n key から表示し、validation error key も UI 境界でt(key)する。[条件付き]成功後の単純な route 遷移や query 組み立ては薄い handler に残してよい。複数画面で再利用するか条件が複雑なら composable へ移す。
Composable
[必須]useXxxは UI から見える public contract を小さく保ち、外部境界を adapter、plugin、または注入 dependency に寄せる。[必須]UI が編集する form state は writable、読むだけの state はreadonlyで返す。[推奨]計算可能な値はcomputedまたは pure function に寄せる。[必須]submit 系処理は pending guard を持ち、request 前に古い server error を clear し、finallyで pending を戻す。[必須]server result を呼び出し元へ返し、UI は画面固有の表示・遷移だけを扱う。
Model and Validation
[必須]form、request body、route/query 由来の user input は Zod schema で shape と値制約を検証する。[必須]flow control は Zod に押し込まず composable で扱う。[必須]Zod message は表示文ではなく i18n key にし、form type はz.inferから導出する。[推奨]form default、empty error は factory で作り、field error はRecord<keyof Form, string>を基本にする。[必須]Zod issue から field error への変換は shared utility を使い、composable で最初の issue や field 名を独自解釈しない。[必須]API response と feature result の公開型は model file に置き、composable 内の local type に閉じない。
Result and Errors
[必須]success は{ ok: true, data }、client failure は{ ok: false, source: "client", reason }、server failure は{ ok: false, source: "server", error }の repository contract に合わせる。[必須]server error code は shared resolver で i18n key に変換し、raw Problem Details や HTTP status を component で解釈しない。[必須]field error と server error key は別 state にする。