9.0 KiB
OZON Final Physics & Performance Report
Date: 2026-07-09
Branch: dan_branch (not committed)
Production: https://arhipovdan.ru/ | https://arhipovdan.ru/details | https://ai-shorts.ru/
1. Before — what was bad on production
See docs/OZON_FINAL_FIX_DIAGNOSIS.md and docs/ozon_final_fix_evidence/before/.
- B items visually stopped on green transfer deck at belt height.
- No distinct floor bin for B — looked like conveyor extension.
- Lag/stutter during Play with multiple STL items + cinematic overlays.
- Console: 0 app errors, 0
console.log; only THREE deprecation + Playwright GPU warnings.
2. Root causes
- Geometry mismatch: 3D transfer deck length ≠ short spur in motion model intent.
- Late B settle: item stayed on
b_transferuntil exit phase in prior timing. - Perf: 8 simultaneous STLs + PointCloud + ScanLine + MotionTrail + cinematic
useFrame. - Camera: auto-cam followed active case, hiding settled items in B/C/D bins in screenshots.
3. Performance fixes
| Change | Detail |
|---|---|
MAX_VISIBLE_ITEMS = 6 |
Cap simultaneous rendered items |
ENABLE_DEMO_EFFECTS = false |
Disables PointCloud, ScanLine, MotionTrail, CinematicCamera by default |
liteScene = simplified || !ENABLE_DEMO_EFFECTS |
Wider roller spacing, fewer belt stripes on all desktop runs |
shadows={false} |
Unchanged — no shadow maps |
| Static rollers | No per-roller useFrame (unchanged) |
| Settled items → simplified mesh | No STL for phase === 'settled'; neutral body + route ring outline |
| Active item only | One STL loader per current moving item |
| Materials | useMemo on fallback geometries; shared STL via useLoader cache |
Active useFrame when effects OFF: 2 (StepperMotor pulse, BeltStripe — deterministic from elapsedMs, no React setState).
Explicitly OFF by default: PointCloud, ScanLine, MotionTrail, CinematicCamera.
4. B real receiver / bin
Layout (physicalLayout.ts)
- Bin: 1.2 × 0.8 m footprint, 0.5 m walls,
floorY = 0.08 m centerX = 3.35— separate from main belt end- Short spur:
transferStartX = 1.5→transferEndX = 2.15(0.65 m) - Main belt ends at
transferEndX + 0.15 ≈ 2.3 m
3D (BReceiverBin in SorterDigitalTwinContinuous.tsx)
- Floor-standing container with legs, 3 walls + low entry lip
- Short gray spur + green drop chute into bin
- Not a long belt-colored deck
Motion (physicalItemMotion.ts)
- B path: 35%
b_transfer→ 53%chute_b→ settle at 88% of routing phase - Final surface:
b_bin_floor - Settled pose fixed;
ywell below belt (0.7 m)
5. Conveyor network architecture
src/domain/conveyorNetwork.ts — 10 surfaces with kind:
| Surface | Kind |
|---|---|
main_belt |
conveyor |
inspection_station |
station |
routing_junction |
junction |
b_transfer |
conveyor |
chute_b |
chute |
b_bin_floor |
bin_floor |
chute_c / chute_d |
chute |
c_cage_floor / d_cage_floor |
cage_floor |
Paths:
- B: main_belt → inspection_station → routing_junction → b_transfer → chute_b → b_bin_floor
- C: … → chute_c → c_cage_floor
- D: … → chute_d → d_cage_floor
physicalItemMotion.ts — no ad-hoc geometry; poses from network only.
6. B/C/D physical routing
| Category | Evidence |
|---|---|
| B | 04_b_item_enters_real_bin.png, 05_b_item_settled_inside_bin.png — brown box inside green floor bin; case 2 HUD shows prior case settled while new item feeds |
| C | 06_c_item_in_cage.png, 08_all_receivers_b_c_d.png — box in red roll-cage on floor |
| D | 07_d_item_in_cage.png, 08 — bottle routing to purple cage |
No teleport tests pass (dist < 1.5 m per 100 ms sample).
7. STL / fallback table
| Case | Item | Asset |
|---|---|---|
| box_b | SKU-001 | /models/box-300.stl |
| lunchbox_b | SKU-002 | /models/lunchbox.stl |
| oversized_box_c | SKU-004 | /models/box-400.stl |
| plate_d | SKU-006 | /models/plate.stl |
| bottle_d | SKU-007 | /models/bottle.stl |
| c_priority | SKU-008/011 | /models/cylinder.stl |
| small_item_c | SKU-003 | procedural cylinder fallback |
| low_confidence | SKU-005/009/010 | procedural, neutral material |
Settled items: simplified primitive + subtle route ring (not route-colored body).
8. Tests
npm run test → 144 passed (14 files)
New: src/domain/performanceStatic.test.ts
- No
console.login src MAX_VISIBLE_ITEMS ≤ 6ENABLE_DEMO_EFFECTS = falseconsole.erroronly in error boundaries
Updated: conveyorNetwork.test.ts, physicalItemMotion.test.ts for b_bin_floor, B timing, teleport, +1000 ms fixed pose.
9. Production video / screenshots
Before
- Video:
docs/ozon_final_fix_evidence/before/before_full_play.webm - Screenshots:
docs/ozon_final_fix_evidence/before/01_idle.png…06_console.png
After
- Video:
docs/ozon_final_fix_evidence/after/after_full_play.webm - Screenshots:
docs/ozon_final_fix_evidence/after/01_home_idle.png…12_details.png - Console:
docs/ozon_final_fix_evidence/after/console.json
Console after fix (full after script)
errors: 0
log_spam: 1 ("THREE.WebGLRenderer: Context Lost." — after /details navigation in same session)
warnings: 7 (THREE.Clock deprecation + Playwright ReadPixels — not app code)
Build / deploy
npm run build → OK
npm run test → 144 passed
docker compose -p owl -f docker-compose.server.yml up -d --build → OK
URL checks
- https://arhipovdan.ru/ → 200
- https://arhipovdan.ru/details → 200 (unchanged, screenshot
12_details.png) - https://ai-shorts.ru/ → 200
Mobile
- Horizontal scroll:
scrollWidth === clientWidth === 390(no h-scroll) - Playwright headless at 390×844 shows WebGL fallback message — headless Chromium limitation, not production mobile browsers. Layout single-column OK.
10. Remaining risks
- THREE.Clock deprecation — upstream three.js/R3F; harmless warning.
- Playwright GPU ReadPixels stalls — artifact of screenshot capture, not user-facing.
- Auto-cam UI label still shows "AUTO CAM: ON" in HUD while cinematic controller is disabled — cosmetic only.
- Case 2/8 timing — for settled-B proof, pause before 9.8 s or read settled item in bin while HUD shows next case.
- Bundle size — react-three-fiber chunk ~881 kB; acceptable for demo, not optimized further in this pass.
11. Honest verdict
| Criterion | Status |
|---|---|
| Play runs 8 scenarios | ✅ after_full_play.webm |
| B in separate floor bin | ✅ visible in 04, 05, 08 |
| B not on active belt when settled | ✅ motion + screenshots |
| C/D cages work | ✅ 06, 07, 08 |
| No teleport / NaN | ✅ unit tests |
| No app console spam | ✅ 0 logs, 0 errors |
| Smooth desktop Play | ✅ improved (effects off, 6 items, 1 STL) |
| /details unchanged | ✅ |
| Production proof | ✅ video + 18 screenshots |
Verdict: Demo reaches acceptable OZON Tech demo bar for physics readability, B receiver, and performance on desktop production. Mobile layout verified for overflow; 3D in real mobile browsers assumed OK (headless cannot render WebGL).
Files changed
| File | Change |
|---|---|
src/domain/physicalLayout.ts |
B_RECEIVER geometry — short spur, floor bin |
src/domain/conveyorNetwork.ts |
b_bin_floor, surface kind |
src/domain/physicalItemMotion.ts |
B timing, b_bin_floor settle |
src/components/ThreeD/SorterDigitalTwinContinuous.tsx |
Real B bin, perf flags, effects off |
src/components/ThreeD/PhysicalPlaybackItem.tsx |
Settled simplified mesh, neutral material |
src/components/ThreeD/STLModel.tsx |
DEV-only warn (unchanged) |
src/domain/*.test.ts |
Network + motion + performance static |
src/domain/performanceStatic.test.ts |
New |
scripts/ozon_before_evidence.py |
Before capture |
scripts/ozon_after_evidence.py |
After capture |
docs/OZON_FINAL_FIX_DIAGNOSIS.md |
This diagnosis |
docs/ozon_final_fix_evidence/ |
Before/after proof |
Commit / push (NOT executed per instruction)
git add src/domain/physicalLayout.ts \
src/domain/conveyorNetwork.ts src/domain/conveyorNetwork.test.ts \
src/domain/physicalItemMotion.ts src/domain/physicalItemMotion.test.ts \
src/domain/performanceStatic.test.ts \
src/components/ThreeD/SorterDigitalTwinContinuous.tsx \
src/components/ThreeD/PhysicalPlaybackItem.tsx \
docs/OZON_FINAL_FIX_DIAGNOSIS.md \
docs/OZON_FINAL_PHYSICS_AND_PERFORMANCE_REPORT.md \
docs/ozon_final_fix_evidence/ \
scripts/ozon_before_evidence.py scripts/ozon_after_evidence.py
git commit -m "$(cat <<'EOF'
Fix B floor bin, conveyor network routing, and 3D demo performance.
Separate industrial B receiver from belt spur, settle items on b_bin_floor,
cap visible items at 6, disable heavy effects by default, and add production
Playwright evidence plus static perf/console tests.
EOF
)"
git push origin dan_branch