v4（段階1）サイトの店の形の JSON から店を建てる — コードを書き終えました。Unity は押していません。

依頼：unity/claude_code_request_v4_json_store.md
設計：unity/unity_design_v0.md の 0 章「何について正か」（店の形はサイトが正。Unity は形を作らない）

────────────────────────────────────────────────────────
1. 作ったもの（Assets/ServiceSim/ の中だけ。外は触っていません）
────────────────────────────────────────────────────────

新規
  Store/Layouts/p1_efficient_corner.json      サイトから写したもの（43,889 バイト）
  Store/Layouts/p5_crammed.json               サイトから写したもの（43,877 バイト）
  Store/Layouts/summary.json                  一覧（3,042 バイト）
  Store/SimpleJson.cs                         小さな JSON 読み取り（読むだけ。書き出さない）
  Store/JsonStoreLayout.cs                    JSON → StorePlan（Compose）
  Store/StoreLayout_p1_efficient_corner.asset ③ 細い通路 1.2 m
  Store/StoreLayout_p5_crammed.asset          ⑦ 細い通路 0.8 m
  Editor/ServiceSimJsonStore.cs               確かめのメニュー

変えていないもの
  StoreBuilder.cs / StorePlan.cs / StoreLayout.cs / NavMeshBaker.cs
  ロボット・人・実験のコード
  StoreLayout_Family.asset / StoreLayout_Grid.asset（比べる用にそのまま）
  ServiceSimMenu.cs（Build Store はそのまま呼ぶだけ）

写した日時：2026-10-22 18:18:54 JST
写し元：https://pixelstomotors.com/sim/layouts/unity/{名前}.json
       https://pixelstomotors.com/sim/layouts/summary.json
版の番号（meta.generation）：b700048057af（③⑦と summary.json の3つとも同じ）
※ 日時・写し元・版の番号は .asset に持たせてあり、Build Store の報告に出ます。
※ 版の番号が summary.json と違ったら、建てずに止めます（Compose が null を返します）。

JsonStoreLayout が Unity で勝手に作らないもの（依頼の「Unity で店の形を作らない」）
  ・止まる位置は JSON の stop をそのまま使います（deliveryOffsetFromAisleCenter は使いません）
  ・細い通路に入る前に待つ点は JSON の entrance（aisleEntranceSetback は使いません）
  ・JSON に無いもの・対応表に無いものが出たら、埋めずに **建てずに止めて** 報告に並べます

────────────────────────────────────────────────────────
2. 対応づけ（依頼の表のとおり）
────────────────────────────────────────────────────────

floor                → AddFloor
outer_walls          → Wall の箱（高さ meta.heights.wall = 2.7）
walls（height 付き）  → 高さ meta.heights.partition（1.2）以下は Divider、それより高いものは Wall
rooms                → PlanPlace（solid）。レジ・ドリンクバーは高さ meta.heights.counter（1.0）、
                       ほかは壁の高さ。ラベル→PlaceKind は依頼の表どおり
                       （冷蔵・冷凍・保存／洗い場 → Kitchen、更衣室・社員トイレ → Office）
tables[].parts.top   → Table の箱（0.72）
tables[].parts.benches → Bench の箱（1.1）＋ 座面の見た目 BenchSeat（当たりなし・0.45 の上）
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        → booth→WallBooth / t2→WallTable / booth6L→LargeTable
tables[].seats       → PlanSeat.seatCount
aisles               → AddAisle(id, rect, narrow, entrance)
places               → AddPlace（点だけ。箱は置かない）
doors                → 箱を置かず、報告に一覧だけ（③⑦とも 0 件でした）

場所の点（places）を部屋（rooms）より先に入れています。StorePlan.PointOf は
最初に見つけた点を返すので、レジなどの「立つ点」が部屋の真ん中に上書きされないためです。

────────────────────────────────────────────────────────
3. Unity を押す前に確かめたこと（JSON の読み取りと対応づけを Python で写して照合）
────────────────────────────────────────────────────────

                         ③ p1_efficient_corner    ⑦ p5_crammed
  版の番号 vs summary     一致                      一致
  卓                      42（summary 42）          42（summary 42）
  席                      160（summary 160）        160（summary 160）
  細い通路                3 本・幅 1.2 m            3 本・幅 0.8 m
  壁 / 仕切り             9 / 0                     9 / 0
  部屋 / 場所の点         10 / 26                   10 / 26
  椅子 / 席に着く点       8 / 59                    8 / 59
  座る位置                160                       160
  卓の type               booth 33・t2 8・booth6L 1 （③と同じ）
  対応表に無いもの        0 件                      0 件

依頼の確かめ 1（卓 42・席 160・細い通路 3 本／③ 1.2 m・⑦ 0.8 m）は、JSON の中身としては
そろっています。Unity で建てた数は Build Store の確かめで突き合わせます。

点が通れない箱の中に入っていないか（NavMesh の確かめで何が出るかの下見）
  止まる位置（42）        ③⑦とも 0 件。家具まで 0.25 m 未満のものも 0 件
  席に着く点（59）        ③⑦とも 0 件（箱の中には入っていない）
  座る位置（160）         160 件すべてベンチ（152）・椅子（8）の上
                          → 人が座る位置なので当然で、NavMesh には乗りません
  場所の点（26）          1 件（下の「相談したいこと」）

────────────────────────────────────────────────────────
4. 相談したいこと（JSON と合わないもの。こちらで埋めていません）
────────────────────────────────────────────────────────

(A) レジ内（RegisterBack）の点が、通れない箱の中に入ります　← 要判断

  依頼の規則は「rooms → PlanPlace（solid）」です。そのとおりに建てると、
  部屋「レジ内」rect [3.3, 1.3, 6.1, 2.2] が通れない箱になります。
  ところが places の RegisterBack の点 [4.7, 1.75] は、その箱の **中** にあります。
  会計のスタッフはここに立つので、このままだと立てません
  （NavMesh にも乗らないので、依頼の確かめ 2 で × として出ます）。

  直し方は2つあって、どちらもサイト側（店の形が正）の判断だと思います。
    1. JSON の rooms に「通れる部屋」の印を足す（レジ内・待合・トイレのような、
       人が入る部屋を solid にしない）
    2. レジ内の点を、部屋の外（太い通路の側）に出す

  v0 の帯の店（BandStoreLayout）では、レジ内は「通れる区画」（solid=false）にして、
  スタッフがそこに立つ作りでした。①の形が近いと思いますが、決めるのはサイト側です。

(B) 壁ぞいの2人席（t2）の横からの spot が、隣の卓の天板まで 0.05 m しかありません

  ③⑦とも 14 点（T34〜T41 の left / right）。人の半径 0.2 m では NavMesh に乗らない見込みで、
  依頼の確かめ 2 に「乗らない点」として出ます。
  ただし同じ卓の "top" の spot は余裕 0.32 m あるので、**席に入れない卓は 0 件**の見込みです
  （42 卓すべてに、余裕 0.2 m 以上の spot が1つ以上あります）。
  このまま進めてよいか（横からの点は使わない扱いにするか）だけ決めてください。

(C) refuges（人がロボットをよける逃げ場）は JSON にまだ無いので空のままです

  空でも動きます。PersonRobotYield.FindRefuge は、よけ場所が1つも無ければ
  「その通路の、ロボットと反対側の出口」へ下がる作りになっています（コードで確認）。
  段階2で人を動かすときに、よけ方が変わる（通路の外へ出ずに出口まで下がる）ので、
  JSON に足すかどうかは段階2の前に決めたいです。

(D) ⑦ では、サイトの解析が 24 卓を category="narrow"（ロボットが行けない）としています

  ⑦の robot_tables は 18・robot_seats は 64（summary.json）。
  依頼の確かめ 3 の CSV には category の列を入れたので、
  narrow の卓で Unity の道のりがどう出るか（行けるのか）も見られます。

────────────────────────────────────────────────────────
5. Unity でしてほしいこと（私は押していません）
────────────────────────────────────────────────────────

メニューを足しました。どちらも「建てて確かめる」だけで、回しません。

  ServiceSim/JSON Store/③ p1_efficient_corner を建てて確かめる
  ServiceSim/JSON Store/⑦ p5_crammed を建てて確かめる
  ServiceSim/JSON Store/③⑦ を続けて確かめる

中でしていること
  1. StoreBuilder と NavMeshBaker の店の形を、その .asset に差し替える
  2. そのまま ServiceSim/Build Store を呼ぶ（組み立て・ベイク・今までの確かめ・上からの撮影）
  3. そのあとに、JSON と突き合わせる確かめを足して書き出す
       {日付}_{名前}_json_check.txt   数／点が NavMesh に乗るか／道のりの照合／席に入れない卓
       {日付}_{名前}_table_dist.csv   table, category, aisle, json_dist_m, unity_path_m,
                                      diff_m, diff_pct, status
     差の平均・大きさの平均・最大と、差が 30% を超えた卓の一覧も報告に出ます。
  書き出し先は ExperimentPlan.screenshotDir（Build Store と同じ場所）です。

お願い
  ・依頼の「Claude Code が書いたコードは、実行する前にエイイチが読む」に従って、
    JsonStoreLayout.cs（283 行）と ServiceSimJsonStore.cs（約 330 行）を先に読んでください
  ・Unity を開くと、まず C# のコンパイルが通るかが分かります（こちらでは Unity を開いていないので、
    文法の確認は目視までです）
  ・(A) のレジ内は、建てると必ず「立てない」側に出ます。先に決めていただくか、
    いったんこのまま建てて確かめの出方を見るか、どちらでもできます

VCS Check-in はまだしていません（依頼の「確かめが通ったら Check-in」のため）。
Build Store の結果を見てから、こちらで入れるか、エイイチが入れるかを決めてください。
