# 第3版・敵対的検証結果

2026-10-22再検証（初回2026-10-21）。対象は指定フォルダの依頼書、README、生成・解析・テストコード、6配置のJSON/analysis/summaryと図。行番号は今回の原本。添付の前回レビューや「対応済み」の説明は証拠として信用せず、コードと反例で確認した。

**総合：❌ 現状のまま「客が受け取れる卓の割合」を試算する材料として採用するのは不可。** 数値は再現できるが、L字席の受取側、⓪の駐機寸法、検査のすり抜けが残る。静的な幾何モデルの開発用データとしては利用可能。

依頼で対象外とされた厨房内部の人の動き、すれ違い・複数台運用・旋回、一時的な狭まり、壁高、サイトとUnityの共通スキーマは今回の不合格理由に含めない。

## 実行・再現結果 ✅ OK（数値に限定）

原本を作業フォルダにコピーし、そこで `python test_famires_v3.py` と `python famires_v3.py` を実行した。原本は変更していない。

- 同梱テスト **30件すべてOK、終了コード0**。
- 生成スクリプト **終了コード0**。6配置を2.5cm/1.25cmの両方で実行。
- 生成前の配置辞書は6件とも同梱layoutと一致（JSON化してtuple/listを正規化）。
- 再生成したsummaryは同梱summaryと完全一致。
- 6件のanalysisの `tables`（分類・距離・stop・side・narrowest・path_end等）は全件一致。`resolution_mismatch` はすべて空。
- 実行環境：Python 3.9.6 / NumPy 2.0.2 / SciPy 1.13.1 / Matplotlib 3.9.4。README指定環境とは異なる。Noto Sans CJK JPがなく、PNGは生成されたがフォント警告が出た。元PNGとの画素一致・日本語組版の再現は確認していない。

|配置|卓/席|通常robot 卓/席|narrow 卓/席|human 卓/席|平均m|最長m|
|---|---:|---:|---:|---:|---:|---:|
|⓪|19/88|19/88|0/0|0/0|8.5|14.01|
|①|42/160|42/160|0/0|0/0|10.7|20.14|
|②|28/88|28/88|0/0|0/0|8.4|14.02|
|③|46/200|46/200|0/0|0/0|13.7|23.17|
|④|38/158|38/158|0/0|0/0|10.7|18.38|
|⑤|42/160|18/64|24/96|0/0|11.0|20.32|

平均・最長はrobotとnarrowを合算する実装。human_walk_totalは全配置0。これらは「実装が出す数字」として正しいが、以下の欠陥を含むため、現実の到達率として正しいとは判定できない。

## 1. 前回指摘への対応

|内容|判定|確認結果|
|---|---|---|
|ソファ列の呼び方・向き|✅|今回READMEの定義では、2列の中央でテーブル端が向かい、外側が開く構造。前回の「形を変えるべき」という指摘はこの新しい明示仕様では撤回する。boothの配膳候補もaxisで左右/上下に限定された|
|①⑤レジ横0.1m|✅|6人席をx=6.8へ変更し、レジ右端6.1との間は0.7mになった。人の運用の十分性まで保証する判定ではない|
|②待合・③レジ長・右通路|✅|待合追加、レジ2.5m、右側通路1.5mをコード差分で確認|
|トイレちょうど1m|✅/⚠️|境界を含める処理と例外の新ルールは実装。ただし遮蔽の検査は不十分（後述）|
|半径切り上げ・斜め移動|✅/⚠️|矩形への距離計算と斜め両隣の確認に変更。整数円盤の40cm化は解消。ただし幅の許容誤差を含む計算であり、正確な通過保証と混同しないこと|
|出発点が不通なら停止|✅|同梱反例でValueError。mainでもNGとして記録|
|卓の停止点・path_end保存|✅|保存され再計算とも一致。ただし配膳側の意味に欠陥（後述）|
|待機場所を実寸・駐機込みに|❌|①〜⑤は拡張したが⓪は旧寸法。待機からの発車検査も内部経路を調べない|
|3分類・人の歩行距離|✅/⚠️|分類・集計コードは追加。今回全件human=0なので実データは人の歩行距離機能を検証しない|
|⑤を同じ卓数・席数に|✅|①⑤とも42卓160席、type/seatsと島の4/5/4卓構成一致。比較は固定外形内で列を圧縮するものなので、右側の余白も広がる点は解釈に含める|
|全組合せ検査・NGなら出力停止|❌|項目は増えたがすり抜けあり。NG時に既存出力が残る|
|依存・meta|✅/⚠️|READMEとmetaへの追加は確認。L字・丸卓等の解析形状と家具の受取側は未統一|

## 2. 実配置に残る問題

### ❌ NG [P1] L字席でソファ側への停止を「届く」とする

該当：`famires_v3.py:110–118,130–145,336–346,399–411`、`famires_p0.py:54–62`。

boothだけが候補辺を限定され、**booth6Lとt2には外接矩形の全4辺が返る**。周辺が空いていればソファ側もopen_sidesに残る。sightは対象家具の外形をskipし、辺までしか見ないので、対象家具自身のソファや天板は受け渡しを遮らない扱いになる。L字の天板を図に足しただけでは直っていない。

**現データの反例：⓪T02**

- 家具：x=0, y=9.4, w=2.6, h=3.6、flip/mirrorなし。
- L字ソファの下側の帯は `y=9.4〜11.02`（0.45h）。内側の天板の中心は描画定義から `(2.015,12.01)`、大きさ0.75×1.2m。
- 保存された停止点は `(3.363,9.562)`、side=right、robot、距離10.99m。
- 右辺上の受け渡し先は約 `(2.6,9.562)`。これは**下側ソファ帯の側面**であり、天板のある内側の開口を向いていない。停止点から天板中心までは約2.80m離れている。

これを「座る側で止まれた」とするのは今回の期待に反する。①④⑤のL字も同じ候補辺生成に依存する。ただし、すべてのL字の現停止点がソファ側だとは主張しない。

修正：型・flip・mirrorごとに合法な受取区間を家具座標で定義し、ソファ帯を除く。辺全体ではなく内側開口や天板への受取線を使う。t2もベンチ側・椅子側・側方の扱いを定義し、全4辺を機械的に許さない。候補点が自由なことと客が受け取れることを分けてテストする。

### ❌ NG [P1] ⓪の待機場所が1台0.8×0.8mを満たさない

⓪JSON：`robot_standby.rect=[12.2,5.2,14.4,5.9]`, slots=3。**2.2×0.7m**なので、3台分の2.4×0.8mに不足。`famires_p0.py:69`で旧JSONの待機場所をそのまま継承する。check_rulesは台数や寸法を検査しない。

またall_obstacles（121–127行）は待機矩形を丸ごと塞ぎ、analyze（393–397行）はその**下側の前までstartから到達できるか**を確認するだけ。内部の各機体位置から1台を抜き出し、残る機体を避けて出る経路は計算していない。これは複数台の動的運用以前に、今回「対応済み」とする駐機からの発車接続が未検証という問題。

修正：⓪の寸法修正、slotsに対する収容検査、各スロットの形状・発車姿勢を定義する。発車対象だけ除いた静的障害物でstartへの接続を確認する。現状の検査は「ドック前に近づける」に改称する。

### ⚠️ 要注意 ⓪の一般卓は椅子・着席位置を持たない

t4/r4は旧JSONの天板寸法を矩形として登録する。通常着席時の椅子と人体が解析に入らず、r4は描画が円なのに解析が外接正方形、配膳辺もその正方形である。天板だけで障害物を構成する⓪と、ベンチを含めて構成する①〜⑤では比較の基準が揃わない。これは対象外の「引かれた椅子」とは別に、通常状態の家具定義の不足。採用前に基準状態と配膳位置を明示する。

## 3. 検査をすり抜ける配置（実行で再現）

以下はprepare済み①、または⓪のコピーを変更し、`check_rules`を直接実行した。**すべて返り値は `[]`（違反なし）**。同梱30件の合格だけではこれらを排除できない。

|反例|変更内容|抜け・修正案|
|---|---|---|
|レジ全欠落|①roomsから「レジ」「レジ内」を削除|234–247行は存在するレジの長さだけ検査。存在と店員領域を必須にする|
|トイレ壁ほぼ全撤去|①のトイレ壁を全部削除し、壁1片 `[0,13.8,0.3,14.1]`だけ追加|227–233行は接する壁が1つあって厚ければ合格。客席側各辺の被覆を開口以外について検査する|
|トイレ入口を壁で塞ぐ|①toilet_doors[0]と同じ矩形を壁として追加しlabelを「トイレの壁」にする|221–224行の名前による全免除。壁の役割ではなく開口の幾何を照合する|
|家具中央の偽接合|①卓5の内部にx方向0.05m、y方向0.3mの壁を置きjoint=True|178行はmin(重なり幅)≤8cmなら家具中央でも許す。接するべき背板の境界・向き・位置を確認する|
|100台のドック|①slotsを100にする|寸法・slots整合検査なし。1台区画、収容台数、正の整数を検査する|
|建物外領域を削除|⓪roomsのkind=outsideを削除、outline維持|outsideとoutlineの整合検査がない。建物外が解析上の床になる|
|outlineを2m四方に|①outlineを `[[0,0],[2,0],[2,2],[0,2]]`にする|実際にはほぼ全家具がoutline外でも合格。outline内包を検査する|

レジの入口からの距離、ドックと受け渡し口の近さ、スタイル別通路幅、レジ内への入口なども数値検査はない。`STYLE_AISLE`は定義されるがcheck_rulesで使わない。「全部の組み合わせに広げた」との説明は過大。壁対部屋・壁対壁を一律禁止するのも不適切なので、接合・被覆等の意図を持つ検査に分けるべき。

### ❌ NG [P2] トイレ遮蔽は席中心から前方領域中心への1本だけ

211–218行のhiddenは、席中心から**toilet_doors（前方の空ける矩形）の中心**への線分が壁に当たるかを見る。実際の扉線や席の受取点・開口全体ではない。席の端から扉が見えていても中心線上の短い壁で合格し得る。複数トイレでは対象トイレとdoorの対応もなく、全doorへの遮蔽を要求する。

修正：トイレと開口のID対応を持たせ、席側区間と扉開口間の遮蔽の条件を決める。少なくとも端点を含む複数線を検査し、単なる1本の中心線を「へだてる壁」の証拠にしない。

### ❌ NG [P2] 見通しの1cmサンプリングは薄い壁を見逃す

94–101行のseg_hitsで、線分 `(0,0)→(1,0)` と壁矩形 `[0.004,-1,0.006,1]` を与えると **False**。線分は壁を横断している。sight（338–345行）も離散サンプルで、1cm未満の障害物や端点付近を見逃し得る。現在の生成壁が主に15/30cmだからといって検査関数の正しさは保証されない。線分と矩形の解析的交差を使う。

### ❌ NG [P2] best_stopは201番目以降の合法点を捨てる

349–363行、`order[:200]`で見通し判定を打ち切る。最短側200点が遮られ、その先だけ見通せると、本当は届く辺を届かないとする。候補201点・距離0〜200・最後の1点だけsight=Trueのダミーgridで、**best_stopはNone**になった。これは候補選択ロジックの単体反例であり、現6配置がこれで誤分類されたとまでは主張しない。上限を外すか、全候補の見通しを幾何的に一括判定する。

### ❌ NG [P2] NG時も過去の画像・JSONが残る

main:641–647行は出力をスキップするだけで既存ファイルを削除・隔離しない。成功出力のあるディレクトリで配置を不正にして再実行するとsummaryはNGでも古いlayout/analysis/PNGを読める。利用側がsummaryを確認しなければ不正な版を使用し得る。

修正：一時ディレクトリに全出力し、検証後に世代単位で切り替える。NG配置の既存成果物は隔離し、manifestの世代IDをlayout/analysisに持たせる。構造違反を発見しても重い解析に進む現順序も、検査後停止に変更するとよい。

## 4. ⓪の非矩形建物

### ✅ OK 現データはoutlineとoutsideで同じ欠け部分を表す

outlineは24×19.2mの外接矩形から左奥 `[0,17,7.6,19.2]` を除く形。outsideの矩形もこの部分で、all_obstaclesを経てGridに入るため、現データでこの欠け部分を自由床として扱っているわけではない。⓪の再生成・両解像度の分類も一致した。

### ❌ NG outlineは描画専用、検査と経路はoutsideの手入力依存

`check_rules:155–165`と`Grid:260–279`はouterの矩形とrooms等だけを見る。outlineはdraw:501–509行で使用する。上記2反例のように描画輪郭と解析の床が別々に変えられるため、「outline対応の検査」にはなっていない。

修正：outlineを形状の唯一の根拠とし、外領域マスクと境界距離を生成する。または少なくともoutsideの和集合とoutlineの補集合が一致することを自動検証し、全家具・ドック・start・入口・doorの内外を同じ形状に対して検査する。⓪固有のテストは現在test_famires_v3.pyにないので、この不一致を回帰テストに追加する。

## 5. 数字の解釈と仕様の注意

### ⚠️ 要注意 公表通過幅を半径として使うのはモデル化の仮定

pass_widthとnormal_widthは、Grid.freeでそれぞれ直径相当の円形余裕に変換する。これは公表幅そのものが任意の角・停止姿勢での円形通過を保証するという意味ではない。今回対象外の旋回等の再現を要求するものではなく、試算の数字にこの仮定を明記すべきという指摘。

基本値のBellaBot 80cmは指定の[Pudu Academyページ](https://academy.pudutech.com/en/docs/huan-le-song-chan-pin-jian-jie)に記載されるが、ページ見出しはPuduBotで、本文のBellaBot表記とも混在する。機種・型番に対応する一次資料を固定するとよい。[Keenbot T8のメーカー掲載ページ](https://www.irisohyama.co.jp/b2b/robotics/products/keenbot-t8/)では55cm以上とともに環境や利用方法で必要幅が異なる旨が示される。全6機種の価格・仕様・一次出典の網羅的検証は今回実施していない。

### ⚠️ 要注意 2解像度で分類が一致しても幅・距離の保証ではない

freeは `clear >= width/2-res/2`（282–284行）。意図的な許容誤差があり、pathのnarrowestは通常robotで0.97m、⑤narrowで0.77mという保存値が実際にある。READMEの境界付近を許す計算とは整合するが、「1.0m以上」「80cm以上」を厳密に満たした経路というラベルとは区別すべき。丸め前には0.975/0.775m付近もあるため0.97/0.77という丸め値だけから閾値違反と断定はしない。

648行で比較するのはcategoryだけ。距離、停止辺、停止位置、人の歩く距離、最狭幅が変わっても `resolution_mismatch=[]` となる。分類一致は確認できたが、図の「同じ結果」は「分類一致」と書くのが正確。境界幅・複雑な曲がり角・障害物位置のずらしを加え、経路線分全体の余裕も確認するとよい。

### ⚠️ 要注意 human_walkは最も都合のよい受渡位置からの片道距離

416–431行は通常ロボットが到達できる全セルを距離0の出発点とし、人の最短距離を求める。下限的な歩行距離であり、実際の受け渡し場所、そこまでのロボット走行距離、往復・頻度の総計ではない。narrowだけで届く領域は受渡候補にしない。どちらの運用を想定するか明記する。全6配置でhuman=0なので、今回の再現結果だけではこの枝を検証できない。

## 必要な追加テスト

現30件は過去の既知例と直線通路の3つのずらし位置に偏り、合格をもって一般的な正しさを主張できない。優先して次を追加する。

1. ⓪T02等のL字のflip/mirror全組合せで、ソファ側停止を排除し天板側停止を選ぶ。
2. ⓪のドック寸法、全slotからの静的発車接続、slots過大値を検査する。
3. 上表7つの改変を不合格にする。特に壁名変更で遮蔽物検査が無効にならないこと。
4. outline/outsideの欠落・矛盾、startやドックのoutline外配置を不合格にする。
5. 薄い壁の線分交差、201番目だけ合法な停止点、human経路あり/なしを単独で確かめる。
6. 既存出力のある場所で成功→NGを実行し、古いlayout/analysisを現行版として利用できないことを確かめる。

## 試算の材料に使ってよいか

**❌ 到達率や運用負担の比較値として、そのまま採用しない。** 6配置の数値は再現でき、前回の離散膨張と⑤の卓数差は直っている。一方、今回の中心である「客が受け取れる停止点」に実配置の反例があり、⓪は駐機ルールにも未適合。

修正順は **①L字/t2等の受取区間 → ②⓪のドックと発車接続 → ③トイレ・joint・必須設備・非矩形の検査 → ④停止点探索/見通しの完全性 → ⑤NG時の出力世代管理**。修正後に6配置を両解像度で再出力し、今回の反例が落ちることを確認してから採用する。

## 2026-10-22 再検証記録

指定のDownloads内の依頼書を再読し、tools内の原本と前回検証用コピーに差分がないことを確認した。コピー側のtools/sim_layoutsでtest_famires_v3.pyとfamires_v3.pyを再実行し、いずれも終了コード0。同梱テスト30件は再びすべて合格した。summary全体と6配置のanalysis.tablesは同梱値と一致し、分類の解像度差はすべて空だった。

上記の改変反例、薄壁を横切る線分、201番目だけ合法な停止点も再実行し、同じ見逃しを確認した。結論・優先順位は維持する。日本語フォント不足による描画警告は今回もあり、画素一致の検証はしていない。対象原本は変更していない。
