commit e01906cede777f66e7a741e732db011d06ee4c92
Author: Claude <noreply@anthropic.com>
Date:   Sat Nov 14 07:40:55 2026 +0900

    配膳ロボットのブラウザ版（テスト版）を /sim/serving-robot-3d に公開し、/series8 に入口の節「ブラウザで動かす（テスト版）」を足した。店の名前・人数・混み具合・台数を試算にそろえ、店のデータは public/sim/layouts/unity/ を読む。コードは tools/serving_sim_3d/
    
    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01LevEXU3Z3M9LXKJxzqN9Ew

diff --git a/src/lib/records.ts b/src/lib/records.ts
index 3726163..de04746 100644
--- a/src/lib/records.ts
+++ b/src/lib/records.ts
@@ -44,7 +44,7 @@ export type SimTab = { id: string; task: string; place: string; src: string; tit
 
 // シリーズのページ（URL → 記事のシリーズ名）。Studio の一覧の絞り込み条件と同じ
 // intro はシリーズのページの見出しの下に出す説明（ないシリーズは出さない）
-export const SERIES_PAGES: Record<string, { series: string; title: string; pageTitle: string; limit: number; intro?: string; points?: { h: string; items: string[] }[]; guide?: boolean; thinking?: boolean; serving?: boolean; vision?: boolean; lab?: boolean; scenes?: boolean; sim?: { src: string; title: string; note: string; obs?: { src: string; title: string; label: string; note: string; points: string[] }; tabs?: SimTab[] } }> = {
+export const SERIES_PAGES: Record<string, { series: string; title: string; pageTitle: string; limit: number; intro?: string; points?: { h: string; items: string[] }[]; guide?: boolean; thinking?: boolean; serving?: boolean; vision?: boolean; lab?: boolean; scenes?: boolean; browserTest?: boolean; sim?: { src: string; title: string; note: string; obs?: { src: string; title: string; label: string; note: string; points: string[] }; tabs?: SimTab[] } }> = {
   series1: { series: '薬剤搬送ロボット', title: 'Drug Delivery Robot | 薬剤搬送ロボットハコブくん', pageTitle: 'Series1 | 薬剤搬送ロボット', limit: 12,
     intro: '病院で薬を運ぶロボット「ハコブくん」を題材に、人とロボットの関わり（HRI）を設計している記録です。病院で使う画面（UI）の設計、Unity での自律移動、Fusion での形づくり、分身ロボット（アバター）の考察までを、4コママンガと一緒に残しています。' },
   series2: { series: 'R2R2R', title: 'R2R2R | デジタルツイン学習-R2R2R（Real to Render to Real）', pageTitle: 'Series2 | R2R2R', limit: 12,
@@ -63,7 +63,7 @@ export const SERIES_PAGES: Record<string, { series: string; title: string; pageT
     intro: 'ロボットアームが動きを覚える環境を、自宅にひとりで作っている記録です。机の上のアームでお手本の動きを集め、ロボット用のAI（Physical Intelligence の π0.5 など）に学習させ、実機で動かして確かめます。借りたGPUの種類・時間・費用も含めて、誰でも同じ手順で始められる形で残しています。' },
   series7: { series: '画像認識・物体検出', title: 'Image recognition and Object detection | 画像認識と物体検出', pageTitle: 'Series7 | 画像認識と物体検出', limit: 12, vision: true,
     intro: 'ロボットのカメラが物を見つける仕組みを、下の層から学び直している記録です。画素の数字、色の見分け方、しきい値、輪郭、特徴点といった昔からの手法を、机の上のアームを撮った写真で1つずつ測って確かめ、その上で SAM 3 のような新しいモデルも試します。評価の物差し（IoU・適合率・再現率など）を先に決め、結果は数字で残しています。' },
-  series8: { series: '導入シミュレーション', title: 'Service Robot Simulation | サービスロボット導入シミュレーション', pageTitle: 'Series8 | サービスロボット導入シミュレーション', limit: 12, serving: true, scenes: true,
+  series8: { series: '導入シミュレーション', title: 'Service Robot Simulation | サービスロボット導入シミュレーション', pageTitle: 'Series8 | サービスロボット導入シミュレーション', limit: 12, serving: true, scenes: true, browserTest: true,
     intro: 'サービスロボット導入シミュレーションとは、配膳・清掃・搬送などのロボットを店や施設に入れる前に、待ち時間・必要な人数・ロボットが止まる場所・費用を試算して確かめることです。このシリーズでは、時間・順番・台数を SimPy で、ぶつかる・こぼれるといった空間と動きを Unity で扱い、結果とコードを全量公開しています。',
     // 見出しの下に並べる短い一覧（検索や AI が「何が分かるか・どう試算するか」を拾えるように、本文の文字で書く）
     points: [
diff --git a/src/pages/[series].astro b/src/pages/[series].astro
index 4d74342..ceb2a2b 100644
--- a/src/pages/[series].astro
+++ b/src/pages/[series].astro
@@ -11,6 +11,7 @@ import SeriesDoc from '../components/SeriesDoc.astro';
 import VisionGuide from '../components/VisionGuide.astro';
 import LabGuide from '../components/LabGuide.astro';
 import SimScenes from '../components/SimScenes.astro';
+import BrowserSimTest from '../components/BrowserSimTest.astro';
 import { seriesCards, SERIES_PAGES } from '../lib/records';
 import { media } from '../lib/media';
 import staticPages from '../data/static.json';
@@ -153,6 +154,7 @@ const jsonLd = {
     }
   </script>
   {conf.scenes && <SimScenes />}
+  {conf.browserTest && <BrowserSimTest />}
   <section class="sec"><div class="panel">
     <h2 class="sec-h">記録 | Record</h2>
     <LoadMore limit={conf.limit} total={items.length}>{items.map((c) => <RecordCard item={c} />)}</LoadMore>
