# Claude Code への依頼：サイトの店の形（JSON）から店を建てる（v4・段階1）

設計書：同じフォルダの unity_design_v0.md（「0. 何について正か」を 2026-10-22 に足した）
回している途中にスクリプトを変えない。Assets/ServiceSim/ の中だけで作る。ServiceSim の外は変えない。

## 0. 何をするか

いまの店（StoreLayout_Family の帯の組み立て）は、Unity で形を作っている。これを、サイトの店の形の JSON を読んで建てる形に変える。
最初に建てるのは2つ。③ 効率重視・入口が角（p1_efficient_corner）と、⑦ その列の間の通路を80cmにした店（p5_crammed）。卓と席数は同じで、細い通路の幅だけが違う（1.2m と 0.8m）。

この依頼は「店を建てて、正しく建ったかを確かめる」まで。スタッフの人数・来客・始め方などの回し方は次の依頼（段階2）でそろえる。ここでは回さない。

## 1. 読むデータ

- 正：サイトの `https://pixelstomotors.com/sim/layouts/unity/{名前}.json`（Unity が建てるための細かい形）と `https://pixelstomotors.com/sim/layouts/summary.json`
- 2つを `Assets/ServiceSim/Store/Layouts/` に写して使う（curl で取る）。写した日時と版の番号（`meta.generation`）を、Build Store の報告に必ず出す
- 版の番号が summary.json と違ったら、建てずに止める
- 座標：JSON の x → Unity の X、JSON の y → Unity の Z、高さ → Y。単位は m。原点は店の外壁の内側の左下の角
- 中身の説明は JSON の `meta.rules`（作り方の規則）と、サイトの `tools/sim_layouts/README.md`

## 2. 作るもの

`JsonStoreLayout : StoreLayout`（新しい .asset の種類）。`Compose()` で JSON を StorePlan にする。StoreBuilder・ロボット・人のコードは変えない。

| JSON | StorePlan |
|---|---|
| `floor`（矩形の並び） | `AddFloor` |
| `outer_walls` | Wall の箱（高さ `meta.heights.wall`） |
| `walls`（`height` 付き） | 高さ 1.2m 以下は Divider、それより高いものは Wall |
| `rooms` | PlanPlace（solid）。ラベルで PlaceKind に対応させる：パントリー→Pantry、キッチン・冷蔵・冷凍・保存・洗い場→Kitchen、更衣室・社員トイレ→Office、トイレ→Toilet、待合→Waiting、レジ→Register、レジ内→RegisterBack、ドリンクバー→DrinkBar。レジとドリンクバーは Counter の箱（高さ `meta.heights.counter`） |
| `tables[].parts.top` | Table の箱（高さ `meta.heights.table`） |
| `tables[].parts.benches` | Bench の箱（高さ `meta.heights.bench`）。座面の見た目（BenchSeat）は今の作りどおり |
| `tables[].parts.chairs` | PlanChair（`pullable`・`pull_dir` をそのまま） |
| `tables[].parts.seat_points` | PlanSeat.seatPoints |
| `tables[].spots` | PlanSeat.spots（`side` を名前に） |
| `tables[].stop` | PlanSeat.deliveryPoint（そのまま。ずらさない） |
| `tables[].aisle` | PlanSeat.aisleIndex（`aisles` の並びの番号に直す。null なら -1） |
| `tables[].type` | SeatKind：booth → WallBooth、t2 → WallTable、booth6L → LargeTable |
| `tables[].seats` | PlanSeat.seatCount |
| `aisles` | `AddAisle(id, rect, narrow, entrance)` |
| `places` | `AddPlace(kind, label, rect, …, point)`。kind の名前は PlaceKind と同じにしてある（FoodPass・DishReturn・Pantry・Entrance・Waiting・Register・RegisterQueue・RegisterBack・Toilet・DrinkBar・DrinkBarStand・DrinkBarQueue・RobotStandby・StaffStandby） |
| `doors` | 箱は置かない（壁の切れ目として、もう空いている）。報告に一覧だけ出す |

守ること：
- **Unity で店の形を作らない・直さない**。JSON に無いもの、合わないものが出たら、その場で埋めずに報告に書いて止める（例：家具が NavMesh を切ってしまう、点が NavMesh に乗らない、PlaceKind に無い kind）
- 今の StoreLayout_Family（帯）と StoreLayout_Grid は消さない・変えない。比べる用に残す
- `refuges`（人がロボットをよける逃げ場）は JSON にまだ無い。空のままで動くかを確かめて報告する。動かなければ止めて報告する
- .asset を2つ作る：`StoreLayout_p1_efficient_corner`、`StoreLayout_p5_crammed`

## 3. 確かめること（回さない。Build Store だけ）

③⑦それぞれで、次を store_report と CSV に出す。

1. 卓の数42・席の数160。細い通路3本（③は幅1.2m、⑦は0.8m）
2. 全部の止まる位置（deliveryPoint）・座る位置・席に着く点・場所の点が NavMesh の上に乗るか（乗らないものの一覧）
3. **卓ごとの道のりの照合**：受け渡し口の前（FoodPass の点）から各卓の止まる位置まで、ロボットの NavMesh で測った道のりと、JSON の `dist` を並べた CSV（卓・JSON の距離・Unity の道のり・差・差の割合）。Unity の方が短く出るのは分かっている（サイトは通路の真ん中に50cmの余裕を取った道のり、Unity は半径25cmで家具に寄って走る）。差の平均・最大と、差が30%を超える卓の一覧を出す
4. 席に入れない卓（今の Build Store の確かめ）がないか
5. 上から見た画面を1枚ずつ（Scene ビュー、ラベルあり）

## 4. 終わったら

- 報告を `claude_code_reports/` に置く（今までと同じ形）
- 確かめが通ったら VCS Check-in する
- 次（段階2）の前に、報告を見て相談する
