V0 — 3D Restaurant Readability Sandbox (visual track — do not merge, Art PM review) - #4
V0 — 3D Restaurant Readability Sandbox (visual track — do not merge, Art PM review)#4HSpector1 wants to merge 10 commits into
Conversation
Create the physically-separate visual track (branch prototype/v0-3d-restaurant-sandbox, worktree ../Restaurant-VisualSandbox) from origin/main. No backend/M0 content. - Godot 4.7.1-stable project skeleton under visual/RestaurantVisualSandbox/ (Forward+; 1 unit = 1 m; V0 config autoload; boot-verified, renders on Metal). - Directory structure per assignment section 8 (scenes/, scripts/, docs/art/, reports/visual/v0/, local-assets/). - v0_config.gd locks the scale standard (section 17) and the role/state visual language (sections 21-22) as the single source of truth. - .gitignore: Godot cache (.godot/), local-assets/ quarantine, exports; keeps reports/visual/v0/ evidence committable (section 9). - local-assets/ quarantine README; asset source archives stay out of the repo. Presentation-only. Owns no gameplay truth. Not integrated with RestaurantSim.Core. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The shared visual contract every scene/script/doc conforms to: the one readability question, engine lock (Godot 4.7.1 / Forward+ / GDScript-only, no C# integration), scale lock (1u=1m), the Mock/Scripted/VisualOnly naming rule, the visual-truth boundary (renderer owns no gameplay truth), placeholder-first policy, the non-goals, and the pass criteria. Where contract and instinct disagree, the contract wins. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Every owner-supplied package inspected read-only from Desktop; no binary extracted into the repo. Licenses verified twice (bundled file + live source): - Downtown City MegaKit [Standard]: CC0 (Quaternius) - cleared, not committed (hygiene) - Universal Animation Library [Standard]: bundled License.txt empty; CC0 confirmed at quaternius.com 2026-07-29; Godot-ready GLBs - cleared, not committed - FBX-...zip: no license, unknown publisher - REJECTED (do not use) - wintersets.zip: legacy game mod, presumed proprietary - REJECTED (do not use) .gitignore: quarantine local-assets/* but keep its README as committed documentation. Ownership of a package is not permission to redistribute its source in a public repo. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Scale lock made visual and testable (section 17): scale-reference scene with a 1 m cube, adult capsule, door, 2-/4-top tables, chair, counter, appliance, and main/kitchen/pinch aisle swatches, all sized from v0_config and rendered so an imported asset can be compared against known human scale (never the reverse). Three camera candidates in one rig (section 19): ISO_A orthographic isometric, ORBIT_B free management orbit, HYBRID_C overview+focus+return. Driven both interactively and by the capture harness. Reproducible-evidence harness: capture_runner renders any capturable scene to a 1920x1080 PNG at an absolute path (single shot or JSON shot-list) with camera and config overrides. No manual screenshotting. mat_lib caches a small shared material set; stage.gd provides the two visual treatments (A clean / B grounded, section 27). Verified: scale ref renders correctly in both orbit and isometric at 1920x1080. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
One compact floor readable from a single management view, with distinct zones (section 18): entrance + host stand + waiting; a 10-table / 32-seat dining room; a compact kitchen with four visually distinct stations (Grill/Fry/Range/Garde), a pass line, and a dishwashing zone; restrooms reached by a deliberately narrow ~0.9 m corridor (the circulation-risk pinch) with an open main aisle as the obvious alternative path; a staff/storage door; exterior walls and faint zone floor tints. Half-height interior dividers let the camera see over them. Exterior walls support solid / auto-hide / cutaway / transparent modes that follow the camera (section 20); roof hidden by default in management view. sandbox_root wires interactive controls (1/2/3 cameras, H walls, J roof, L zone labels, F/G hybrid focus) and a capture_configure hook for the harness. Verified: renders correctly in orbit and isometric at 1920x1080; auto-hide produces a clean dollhouse view; all zones legible from one overview. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
MockService: a PURE, seekable Mock/Scripted/VisualOnly timeline (section 14) — snapshot(scenario, t) returns an authored per-beat snapshot of facts and owns no gameplay truth (section 15). Four scenarios with visually unmistakable, mutually distinct peak beats: healthy, kitchen bottleneck, front-of-house bottleneck, and host/seating bottleneck. ServiceView: the renderer that only decides HOW to show the snapshot — actor pools (customers/host/servers/cooks/busser), table state via tinted tabletop + floating disc, vertical station pressure gauges, and toggleable overlays (OFF/MINIMAL/FULL/ SELECTION): patience pips, workload rings, pass plates, queue counts, path hints. A 2D HUD shows scenario, scripted clock, headline, a role/state legend, and a persistent 'MOCK / SCRIPTED - not a simulation' tag. sandbox_root drives playback (pause/speed/reset/scenario/overlay/cameras) and the capture hook. Verified: the kitchen bottleneck (tall red grill gauge + orange tables + servers massed at the pass) reads clearly different from the FOH bottleneck (calm green kitchen + yellow/cyan/brown tables + overloaded server), satisfying the section 31.5 contrast. Live playback runs error-free. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Reproducible evidence via tools/v0/capture.sh (editor scan -> screenshots -> perf probe). Committed under reports/visual/v0/: - 24 screenshots (1920x1080): 3 camera candidates + hybrid focus; whole/kitchen/ dining views; all four scenario peaks; overlay off/minimal/full; wall modes solid/auto-hide/cutaway/transparent + roof; treatments A/B; scale reference; and a CC0 asset-assisted comparison. - 3 MP4 recordings: kitchen-bottleneck and FOH-bottleneck full scripted services, and a camera-orbit demo (Godot Movie Maker -> ffmpeg). - performance.csv: 5 load configs. Result: 257-361 avg FPS, worst single frame 13.9 ms (72 FPS), 670-848 draw calls, 137k-475k primitives, ~335 MB VRAM on the M3 Max test machine -> large headroom over the 60 FPS target. Asset-assisted finding: Universal Animation Library GLB (CC0) imports natively, measures 1.83 m (scale factor 0.984 to our 1.80 m standard -> ~1:1, no rescale), with 43 animations. Source binary stays in git-ignored placeholders/_assetlab/. Tooling: perf_probe.gd/Perf.tscn, asset_compare.gd/AssetCompare.tscn, capture_runner --outdir/--focus, sandbox_root recording driver, shots_evidence.json. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Author the V0 documentation set (docs/art/) and the final report (reports/visual/v0/V0-REPORT.md), grounded in the captured evidence: - SCALE-STANDARD, CAMERA-EVALUATION, READABILITY-CONTRACT, ART-DIRECTION-HYPOTHESES, PERFORMANCE-BUDGET (with the measured CSV), and the living handoff trio V0-CURRENT-STATE / V0-NEXT-ACTION / V0-DECISION-LOG (section 34). - V0-REPORT.md: sections A-K per section 36, all 12 section-31 pass criteria mapped to evidence, the required Verdict/Action block, and the single Art PM decision. Gate recommendation: Pass-with-notes / Continue (Continue = recommend an Art PM review + limited visual refinement; does NOT authorize M1, backend integration, or final art). Notes: human visual test (section 30) prepared but not run; performance validated on one machine (M3 Max) with gray-box only. Recommended Art PM decision: adopt Hybrid-C camera + 1u=1m scale + treatment-A readability baseline; authorize a limited V0 refinement pass; do not begin M1. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
An independent 3-agent adversarial pass (visual-truth boundary / evidence authenticity / definition-of-done) returned non-blocking PASS across the board. Fixes for its notes: - Overlay triptych was not a controlled comparison: 22-overlay-full.png was byte-identical to 11-scenario-kitchen-bottleneck.png. Re-captured 20/21/22 as a clean HUD-off off/minimal/full set (only overlay mode varies); all now distinct. - Report: softened 'red overloaded-server ring' to a workload ring and recorded that the overloaded marker reads subtly at full-overview distance (a refinement-pass item); flagged the asset numbers as builder-attested (CC0 source git-ignored); marked §31 criterion 4 partial like criterion 3 (both await the human visual test); toned down the performance 'headroom' wording; added a point-in-time-artifact note. - Living docs: replaced stale HEAD hashes / commit counts with 'run git log'. Boundary verdict: snapshot() proven pure, renderer owns no gameplay truth, HUD 'MOCK/SCRIPTED' tag persistent. Evidence verdict: all images real & 1920x1080, perf table matches the CSV exactly. DoD verdict: met. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Update V0-CURRENT-STATE and V0-NEXT-ACTION now that the PR is open (#4) and the adversarial verification pass is complete: next authorized action is the §30 human visual test, not opening the PR. No code or evidence changes. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
HSpector1
left a comment
There was a problem hiding this comment.
Independent V0 Visual Sandbox Audit — Review
A. Review identity
| Repository | HSpector1/Restaurant |
| Pull request | #4 — prototype/v0-3d-restaurant-sandbox → main |
| Exact commit reviewed | a9a4230622959987a3458300936d5ab96f987439 (matches origin PR head) |
| Date | 2026-07-29 |
| Method | Fresh clone at /tmp/v0-audit, read-only; project run from the clean clone; evidence regenerated and diffed; images inspected; licenses re-verified at source |
| Environment | Godot 4.7.1-stable (a13da4feb), Forward+/Metal, Apple M3 Max, macOS 26.5.1, 1920×1080 |
| Sub-agents | Lead + 5 read-only reviewers: A Repo/Isolation, B Camera, C Readability, D Scale/Assets, E Performance/Reproducibility |
B. Executive verdict
- Technical verdict: Pass-with-notes
- Action: Continue → authorize the uncoached human V0 visual test.
- Human-test authorization: YES (with the configuration in §L and the small pre-test items in §M).
- Merge recommendation: DO NOT merge PR #4 before the human gate.
- M1: not authorized. Backend integration: not authorized. Refinement pass: not authorized by this gate.
No Blocker and no High findings across any dimension. Every one of the five dimensions returned PASS or PASS-with-notes. The build runs cleanly from a fresh clone, its committed screenshots are byte-identical deterministic outputs of the committed code (regenerated and diffed — only performance.csv drifts, as expected), isolation from the M0 backend is total, and asset licenses are verified at source. Most importantly, an independent reviewer's uncoached first-reads of all four scenarios were correct and distinct — the core V0 readability question looks answerable.
C. Claims table
| Builder claim | Verdict | Evidence |
|---|---|---|
Branched from minimal main |
Confirmed | merge-base(HEAD, origin/main) = 06f0a7e (the base-only tip) |
| Backend branches / M0 PRs untouched | Confirmed | M0 branch tips intact on origin; PRs #1–3 still OPEN; diff has 0 .cs/src/tests |
| Godot 4.7.1 Forward+/Metal | Confirmed | Ran the project; 4.7.1.stable.official.a13da4feb, Metal 4.0/Forward+ |
| Three camera candidates | Confirmed | camera_rig.gd ISO/ORBIT/HYBRID; screenshots 01–04 |
| Hybrid-C recommended | Confirmed | Reviewer B concurs (Hybrid = Orbit + focus/return) |
1 unit = 1 meter |
Confirmed (lock-with-notes) | v0_config.gd drives all geometry + labels; scenes 50/51 read coherently |
| Gray-box + scripted scenarios | Confirmed | 4 scenarios; pure seekable MockService.snapshot(scenario,t) |
| Distinct kitchen / FOH / host / healthy | Confirmed | Distinct with HUD hidden; kitchen-vs-FOH survives greyscale at the top level |
| Treatment A as readability baseline | Confirmed (baseline, not final style) | 40/41 |
| Quaternius assets CC0 | Confirmed at source | quaternius.com: MegaKit CC0 + Animation Library CC0 (independently fetched) |
| Restricted/unclear assets excluded | Confirmed | loose-FBX (no license) + wintersets (legacy) documented do-not-use; no binaries committed |
| ~330 FPS typical / 72 FPS worst | Refined | Structural cost reproduces exactly; FPS is run-variable (fresh worst 103–420); "72" was a one-off |
| 24 screenshots, 3 recordings | Confirmed | 23 shot-list PNGs byte-identical on regen + 1 asset-assisted; 3 MP4s |
| No authoritative gameplay logic | Confirmed | snapshot() proven pure; renderer reads one-way; no money/served/satisfaction computed |
| Persistent mock/scripted disclosure | Confirmed (see D-note) | "MOCK / SCRIPTED — not a simulation" HUD tag, unconditional in _build_hud() |
| All V0 non-goals absent | Confirmed | Non-goal grep = documentation-only; no navmesh/save/economy/AI |
D. Repository & isolation — PASS
Fresh-clone git diff 06f0a7e..a9a4230 touches only .gitignore, docs/art/*, local-assets/README.md, reports/visual/v0/*, tools/v0/capture.sh, visual/RestaurantVisualSandbox/* — zero .cs/.sln/.csproj, zero src//backend tests/ (only a 0-byte tests/.gitkeep). No tracked engine caches or asset binaries; git check-ignore confirms .godot/, placeholders/_assetlab/, local-assets/* (README kept), and asset-cache/ are ignored while the intended evidence is kept. Visual-authority boundary holds: snapshot() is a pure function of authored beats; ServiceView.apply() only reads the snapshot to choose colours/positions/overlay visibility and never writes back. All FileAccess.WRITE is evidence-capture I/O in diagnostic tooling. Every non-goal keyword hit is documentation-only.
- A6 (Low):
.gitignoreignores the.import/directory and_assetlab/, but not*.importsidecar files generally. Latent only (zero.importfiles exist today). Optional hardening: add*.import.
E. Camera & controls — PASS-with-notes
Clean single-node three-candidate rig; bounds match the docs (pitch 14–80, dist 6–48, ortho 7–44); the faces_camera dot-product wall-hide test is provably correct for the shown camera positions. Verdict: advance Hybrid-C as the primary management camera (Hybrid is Orbit + a focus/return convenience — do not retire Orbit).
- CAM-01 (Medium):
focus_on()/return_to_overview()restore the frame()-time overview pose, not necessarily the exact pre-focus orientation if the user orbited first. Fix before Hybrid-C ships as the shipping camera; does not gate the test. - CAM-02 (Medium): the focused view (pitch 28, dist 9) drops the room frame with no compass/return-hint. For the human test, add a "Focused — press G to return" hint and brief the operator.
- CAM-03 (Medium): rig WASD-pan poll isn't gated on the same focus condition as key handling. Harmless to the committed evidence (capture sets
interactive=false); tidy later.
F. Scale — LOCK-with-notes
1 u = 1 m is coherent and structurally enforced: v0_config.gd defines every dimension metrically, and both the reference scene and the mesh builders size all proxies from those same constants (labels print the same constants, so geometry and labels cannot silently diverge). Screenshots 50/51 show correct relative ordering (adult ≈ 1.8× the 1 m cube; walk-through door; human-scale furniture). No scale hacks. Classify: ready to lock for V0 (notes are minor).
G. Readability — PASS-with-notes (the core question)
An independent, uncoached reviewer's first-reads of all four scenarios were correct and distinct: healthy = calm/no-red; kitchen = tall RED grill gauge pulling the eye to the back wall + orange tables; FOH = short cool kitchen gauges but cyan/red pass + mixed dining; host = entrance queue + idle kitchen. The lead independently confirmed the kitchen-vs-FOH distinction holds with the HUD headline hidden and survives desaturation at the top level (station-gauge height + queue-count text are non-colour cues). This is the §31.5 pass criterion, and it is met.
- C2 (Medium): per-table state is colour-only — in greyscale, table discs/tabletops collapse to near-identical grey (an orange "waiting-food" table is indistinguishable from a green "available" one). The area-level read is safe (gauge height); the per-table vocabulary is not colour-blind-safe. Document this before an uncoached test, or add a non-colour per-table signal (shape/fill/icon).
- C5 (Medium): at 960 px the on-world labels overprint capsules ("KITC.." truncates, "queue 3" overlaps the bar). Run the human test at ≥1920×1080 (where labels are legible) and fix label occlusion.
- Roles are distinguishable by colour + prop (toque/tray/clipboard/bin) — good, not colour-only.
H. Treatment — advance A as readability baseline (not final style)
Treatment A (clean/brighter) is the more readable at management distance; B (grounded/moody) is darker and better for marketing stills. Recommend A as the readability baseline / art-direction foundation, explicitly not the final shipped style.
I. Assets & licenses — PASS
Both used/evaluated packs are CC0, verified at source (not just filenames): Downtown City MegaKit and Universal Animation Library, both stated CC0 on quaternius.com. docs/art/ASSET-EVALUATION.md correctly handles the Animation Library's empty bundled License.txt by confirming CC0 at the source page. Loose-FBX (no license) and wintersets (legacy game mod) are correctly excluded / do-not-use. No asset source binary is committed. Animation compatibility (1.83 m, scale factor 0.984, 43 animations) is credible and reproduces the scale lock — but it is builder-attested: the CC0 GLB is git-ignored, so screenshot 60 is not regenerable from the clone alone (correct license hygiene; note the asymmetry).
J. Performance & reproducibility — ADEQUATE (scoped to the M3 Max)
The load-independent structural columns (draw calls 671–848, primitives 137k–475k, VRAM ~335 MB, mesh/actor counts) are stable and reproduce exactly. These are the defensible signal and they indicate real gray-box headroom.
- PERF-1 (Medium): the FPS columns are run-variable (committed worst 72–330 vs fresh worst 103–420) and read as more precise than the data supports. Reframe: lead with frame-time (~3 ms typical) + draw calls + VRAM; present worst-frame as a range or drop it. "Far exceeds 60 FPS" is fair only as "no red flags on one high-end machine, gray-box, uncapped vsync."
- PERF-4 (Medium): no documented step tells a fresh reviewer how to obtain Godot 4.7.1-stable (the version is pinned; the download is not). One line in the README/
capture.shcloses it. - Media = 27 files / ~7.7 MB, no LFS — proportionate for V0; recommend recordings move to release artifacts at future milestones.
K. Evidence — authentic and reproducible
All 23 shot-list screenshots regenerated byte-identical from the clean clone (deterministic; not hand-picked). Images are 1920×1080 and match their labels; the earlier duplicate (22 == 11) is fixed (the triptych is now a controlled HUD-off off/minimal/full set). The report's §H table matches the committed CSV exactly. The only non-reproducible artifact is screenshot 60 (git-ignored CC0 source, disclosed).
L. Human-test configuration (recommended, single-variable)
| Setting | Value |
|---|---|
| Camera | Hybrid-C, default overview; focus-dive available; brief operator "press G to return" |
| Resolution | ≥1920×1080 on a real display (not 960 px) |
| Walls | AUTO_HIDE default (context + interior visibility) |
| Treatment | A |
| Overlays | MINIMAL→FULL (station gauges + queue-count labels ON); HUD headline OFF during the blind comprehension phase so the answer is not given away |
| Mock disclosure | Facilitator verbally states "mock/scripted visualization" during the blind phase (the HUD tag is hidden with the headline); reveal the HUD after each answer |
| Scenario order | Healthy first (baseline), then the three bottlenecks in a non-obvious order; titles hidden until the viewer answers |
| Reset | R resets the active scenario; F1–F4 select scenario |
Do not vary camera and treatment and overlay simultaneously — hold them fixed and vary only the scenario.
M. Required corrections before an honest human test
(test-protocol / doc items only — none require a code refinement pass, and none are code blockers)
- Run at ≥1920×1080 and confirm on-world labels are legible (C5).
- Brief the operator on focus→G-return and keep a return hint visible (CAM-02).
- Disclose the colour-only limitation of per-table state to note-takers (C2) — do not let a colour-blind pilot's confusion be misread as a design failure.
- Nice-to-have: one-line Godot-download note (PERF-4); reframe FPS wording (PERF-1). Not required to run the test.
N. Final gate
Verdict: Pass-with-notes
Action: Continue
Continue authorizes the uncoached human V0 visual test only. It does not authorize the limited refinement pass, merging PR #4, backend integration, or M1.
O. Required Art PM decision
Authorize the uncoached human visual test of V0 (PR #4) using the §L configuration — Hybrid-C overview, Treatment A, MINIMAL/FULL overlays with the HUD headline hidden during the blind phase, at ≥1920×1080 — and keep PR #4 unmerged until that test is run. Everything else (refinement pass, merge, integration, M1) stays deferred pending the test's outcome.
Independent review complete. Read-only. PR #4 not modified, not merged. M0 backend untouched. No refinement, integration, or M1 begun.
V0 — 3D Restaurant Readability Sandbox
Isolated visual-development track. Presentation-only. Owns no gameplay truth. Not integrated with the M0
RestaurantSim.Core.The question V0 answers
Can a first-time viewer look at one small 3D restaurant during service and quickly understand where customers are, what staff are doing, where congestion is forming, and which area needs attention — without narration?
What's here
tools/v0/capture.sh.The critical read (§31.5): kitchen vs front-of-house bottleneck are unmistakably different
Scale reference and CC0 asset-assisted comparison (imports ~1:1 at 1.83 m, 43 animations):
Performance (M3 Max, 1920×1080, vsync off)
Typical frame ~3 ms (~330 FPS); worst single frame 13.9 ms (72 FPS); <850 draw calls; ~335 MB VRAM — large headroom over the 60 FPS target. Numbers are gray-box on one machine; not a production guarantee. Full table in
reports/visual/v0/performance/performance.csvand the report §H.Isolation & scope (verified)
origin/main(06f0a7e, base only) into worktree../Restaurant-VisualSandbox. The three M0 backend branches are untouched; nothing is merged.visual/,docs/art/,reports/,tools/,.gitignore. Zero.cs/src/tests.docs/art/ASSET-EVALUATION.md). Owner-supplied packages stay quarantined; the two Quaternius packs are CC0 (confirmed), the loose-FBX and wintersets packages are do-not-use.Gate recommendation
Continue = recommend an Art PM review + a limited visual refinement pass. It does not authorize M1, backend integration, or final art.
Notes: the human visual test (§30) is prepared but not yet run (owners' to conduct); performance is validated on one machine with gray-box only.
The single Art PM decision (see report §K)
How to review
Full detail:
reports/visual/v0/V0-REPORT.md(sections A–K, all 12 §31 pass criteria mapped to evidence).🤖 Generated with Claude Code