DishwasherBench
Een speler ruimt een 3D-model in van een Bosch SMV4HAX40G met rigid-body physics. Vervolgens wordt een wasbeurt op het Eco 50-programma gesimuleerd (stralen, druppels, afvloeiing, vuil en detergentchemie), waarbij de speler punten krijgt voor elk item dat schoon uit de machine komt. Vanaf het tweede niveau past niet alles in de machine, waardoor de speler moet kiezen wat er wordt ingeladen en hoe.
Dit is een vroege release (versie 0.1.0). De simulatie is gekalibreerd op één testwas van de echte machine. De score laat zien of een speler efficiënt heeft ingeruimd en bekers, glazen en potten met de opening naar beneden heeft geplaatst. Het laat nog niet zien of borden en bestek zo zijn gestapeld dat ze schoon worden gewassen (zie de sectie "Betrouwbaarheid van de scores" voor details).
Het project is gebouwd en wordt onderhouden door Composo. Veel documenten onder docs/ zijn werkverslagen die zijn bewaard zoals ze geschreven zijn; docs/README.md legt uit hoe deze gelezen moeten worden.
Wat er op dit moment werkt
De machine
Eén Bosch SMV4HAX40G als data en geometrie, gebaseerd op foto's en opmetingen van de eigenaar (packages/machine): beide manden met hun pinnenrijen, planken en steunen, de sproeiarmen en het Eco 50-programma.
Het inruimen
Een catalogus van items en vuil, deterministisch rigid-body inruimen (Jolt), en een sessielaag met de acties en query's van het spel (place, remove, setrack, listslots, check_load, etc.).
De wasbeurt
Een simulatie op twee niveaus. De "officiële" laag geeft het gescorede resultaat; de "snelle" laag is een grovere preview. Een koude officiële was van het grootste niveau duurt 4,9 minuten op de referentiemachine (MacBook Pro Apple M3 Pro, 18 GB), best of three, en 5 tot 8,5 minuten wanneer er een andere taak naast draait (binnen een budget van 30).
Levels en spelwijzen
- Course: Een reeks van zeven levels, genummerd op volgorde van moeilijkheid (
docs/benchmark/levels.md), elk met opgeslagen referentie-indelingen van drie gescripte spelers (voorzichtig, onvoorzichtig, willekeurig). Zes hiervan passeren de benchmark-poorten; de tutorial doet dit niet (omdat de onvoorzichtige indeling te weinig punten verliest). - Speelwijzen:
- De webpagina (
apps/web). - Een MCP-server voor agenten (
packages/mcp). - Een harness dat gescripte spelers en modellen uitvoert en geverifieerde episode-records schrijft (
packages/bench).
Controles
- Fenomenen: 48 inruim-fenomenen uit de literatuur als uitvoerbare paren van wasbeurten (
docs/research/standards.mdsectie 9). - Kalibratie: Een kalibratietool die de simulatie scoort tegen een record van een echte wasbeurt, parameters optimaliseert en kandidaat-testwasbeurten rangschikt.
- Modellen: Twee modellen hebben gespeeld via een OpenAI-compatibel endpoint: zes episodes over drie levels op het officiële niveau.
Betrouwbaarheid van de scores
De volledige onderbouwing staat in docs/validation/README.md. Kort samengevat is de simulatie gecontroleerd tegen vier zaken:
- Eén testwas op de echte machine: Vier borden met eigeel op Eco 50. Een voorspelling geschreven vóór het resultaat kreeg de volgorde van de borden en de vorm van het residu correct, maar was tien tot dertig keer te optimistisch over de hoeveelheid vuil op de twee oven-gedroogde borden. De daaropvolgende kalibratie paste één getal aan: het aandeel van het lange weken waarbij de pomp draait, van 0,5 naar 0,8.
- Gepubliceerde klassengemiddelden van een zustermachine: (Bosch SMV6ECX51E, eco-programma, referentie-detergent). Bestek binnen 0,1 van een scorepunt, servies 0,2 te laag, glas 0,1 tot 0,5 te laag. Dit is een aanpassing (fit), geen voorspelling.
- 48 inruim-fenomenen met bewijs uit de literatuur: 17 geslaagd, 21 gefaald in grootte of teken, 1 is een foutief scenario en 9 vereisen mechanismen die nog niet zijn gebouwd.
- Eigen boekhouding: Water wordt exact geconserveerd en dezelfde input geeft hetzelfde resultaat op één machine. De snelle laag stemt overeen met de officiële laag bij 89% van de oordelen van een standaard 13-stuks belading en bij 97% op de levels.
Wat een oordeel wel/niet zegt
| Een oordeel is betrouwbaar voor: | Een oordeel is NIET betrouwbaar voor: |
|---|---|
| Een glas, mok of pot dat met de opening naar boven of op zijn zijkant staat: dit komt niet schoon uit. | Borden die omgevallen zijn of tegen elkaar leunen: deze komen schoon uit, wat waarschijnlijk onjuist is. |
| Een geblokkeerd detergentbakje bij proteïnevuil (ei, yoghurt, gehakt, melk). | Een sproeiarm die stilgehouden wordt door een item: de borden daarboven behouden hun oordeel. |
| Een kom of lepel die echt in een andere ligt. | Bestek dat in één vak gepropt is, en lepels zoals de fysica ze meestal nest: deze komen schoon uit. |
| Eigeel en ander proteïnevuil op een item dat ver van de schoonheidsdrempel ligt. | Items vlakbij de drempel; thee, koffie en wijn; melk opgedroogd op glas; vet (dat zelfs zonder detergent schoon wordt). |
Ongeveer driekwart van het gat tussen een voorzichtige en een onvoorzichtige referentiebelading wordt veroorzaakt door holle stukken die verkeerdom zijn geplaatst. De vuilsoorten in die stukken (smoothie, tomatensoep, ketchup, guacamole) zijn gebaseerd op waarden uit de literatuur die nog niet door een testwas zijn gecontroleerd.
Niet gemodelleerd: drogen, vlekken en film op glas, items die verplaatst worden door de waterstralen, en vuil dat neerslaat op schone stukken. Alleen Eco 50 is gekalibreerd en gescoord.
Systeemvereisten
DishwasherBench is getest op een MacBook Pro (Apple M3 Pro, 18 GB) onder macOS 27. Linux en Windows zijn niet getest.
- Node.js: 20.19 of nieuwer (gepinned op 20.19.0 in
.nvmrc). - pnpm: versie 9 (bijv. 9.4.0).
- GPU: Een GPU die Dawn kan openen. De wasbeurt traceert water op de GPU via WebGPU vanuit Node (via het
webgpupackage, versie 0.6.2). Op de referentiemachine is dit Metal. - Browser: Google Chrome of Chromium voor de afbeeldingen die naar een agent worden gestuurd en voor de scripts die de pagina aansturen.
- Opslag: Ongeveer 680 MB voor de clone en 420 MB voor
node_modules. - Geheugen: 1 tot 2 GB RAM voor een officiële was van een level (2,4 GB gezien bij een standaard 13-stuks belading).
- Poorten: Vrije poorten 8787 (game server) en 8788 (MCP server).
Snelstart
git clone https://github.com/composo-ai/DishwasherBench.git
cd DishwasherBench
corepack enable # Eenmalig: maakt pnpm 9.4.0 beschikbaar
pnpm install --frozen-lockfile # Ongeveer 15 seconden de eerste keer
Er is geen build-stap voor de packages; ze worden als TypeScript-bron gebruikt en uitgevoerd met tsx. Alleen de webpagina wordt gebouwd.
Een opgeslagen belading wassen vanaf de command line:
pnpm --filter @spotless/wash-runner wash-load tutorial-careful --tier fast # Minder dan een minuut
pnpm --filter @spotless/wash-runner wash-load tutorial-careful --tier official # Ongeveer 5 minuten de eerste keer
Controleren of alles werkt:
pnpm typecheck # De root en elke package
pnpm test # Elke package; 8 tot 17 minuten op de referentiemachine
Let op: Een wasbeurt weigert te draaien wanneer de parameterset verouderd is. CONTRIBUTING.md legt uit hoe u de set weer actueel maakt.
Spelen in de browser
pnpm --filter @spotless/web play
Open http://127.0.0.1:8787.
Twee soorten wasbeurten:
- Quick preview (fast tier): Ongeveer een minuut; grover, sommige oordelen kunnen afwijken van de volledige was. Dit is niet het gescorede resultaat.
- Full wash (official tier): Enkele minuten; dit is het gescorede resultaat.
Tips voor het plaatsen: Plaatsen via aanwijzen werkt voor borden in een vrije rij, kommen en bestek. Voor bekers en glazen die tegen de zijsteunen van de bovenmand moeten leunen, of voor borden in kleine openingen, gebruik de knop "Suggest spots" en klik op een genummerde markering.
Een gescript personage uitvoeren
Dit voert het eerste level uit met de "careful" referentie-speler op het officiële niveau en verifieert vervolgens het record:
pnpm --filter @spotless/bench bench run --levels tutorial --policies careful \
--no-render --out "$PWD/.spotless/bench/scripted"
pnpm --filter @spotless/bench bench verify \
"$PWD"/.spotless/bench/scripted/tutorial__careful__*/record.json --rewash
Een model uitvoeren
Kopieer .env.example naar .env en vul de adresgegevens en sleutel van uw endpoint in.
Voor een OpenAI-compatibel endpoint:
pnpm --filter @spotless/bench bench run --levels tutorial --policies openai:gpt-6.1-sol \
--max-input-tokens 2000000 --out "$PWD/.spotless/bench/sol-tutorial"
Voor een Anthropic API:
pnpm --filter @spotless/bench bench run --levels tutorial --policies anthropic:<model id> \
--max-input-tokens 2000000 --out "$PWD/.spotless/bench/anthropic-tutorial"
Een MCP-client koppelen
Elke agent die MCP spreekt kan spelen.
- De game server starten:
``bash pnpm --filter @spotless/server exec tsx src/cli.ts serve --admin-token <token> --wash-tier fast \ --data "$PWD/.spotless" ``
- Een episode aanmaken:
``bash pnpm --filter @spotless/server exec tsx src/cli.ts link --admin-token <token> \ --level tutorial --player my-agent --agent ``
- De MCP server starten (HTTP):
``bash pnpm --filter @spotless/mcp exec tsx src/cli.ts --server http://127.0.0.1:8787 \ --session <episode id> --http --port 8788 ``
De agent krijgt dertien tools, waaronder place, remove, startcycle, getstate en get_report.
Huidige resultaten
Twee modellen hebben drie levels gespeeld op het officiële niveau via een OpenAI-compatibel endpoint.
| Level | Punten beschikbaar | Random | Careless | Careful | gpt-6.1-sol | gpt-6-astra |
|---|---|---|---|---|---|---|
| 1: tutorial (12 stuks) | 64 | 20 (31.3%) | 58 (90.6%) | 64 (100%) | 64 (100%) | niet gedraaid |
| 4: breakfast (37 stuks) | 220 | 36 (16.4%) | 112 (50.9%) | 174 (79.1%) | 190 (86.4%) | 175 (79.5%) |
| 7: dinner-party (62 stuks) | 367 | 88 (24.0%) | 100 (27.2%) | 250 (68.1%) | 260 (70.8%) | 274 (74.7%) |
Analyse:
- Beide modellen versloegen de "careful" referentiebelading door pannen en platen te plaatsen die de gescripte speler nooit probeert.
- Geen van de modellen maakte de fout waar de levels om gebouwd zijn (holle stukken met de opening naar boven of op de zijkant plaatsen).
- De scores verschillen voornamelijk door hoeveel items ze in de machine kregen.
Hoe het werkt
Inruimen
Elk item en elk onderdeel van de machine is een rigid compound van exacte vormen, gegenereerd vanuit een parametrische beschrijving. Items worden geplaatst met rigid-body physics (Jolt) met een vaste stap. Input van de speler wordt afgerond op 1 mm en 1 graad, zodat zowel mensen als modellen op hetzelfde raster acteren.
De wasbeurt
Waterstralen worden op de GPU getraceerd vanaf de gemeten spuitmondposities naar de exacte vormen van de belading. Spatten en druppels reizen als druppeltjes; water dat landt, loopt als een film langs oppervlakken, verzamelt zich in kuilen en loopt weg waar dat mogelijk is. Een vuilmodel per soort vuil verwijdert vervolgens vuil op basis van tijd, temperatuur en chemie.
Scoring
Na de wasbeurt inspecteert een tool elk item. Een item is schoon wanneer het maximaal 4 spikkels en 4 mm² zichtbaar vuil bevat. Schone items leveren de punten op die op de level-kaart staan.
Kalibratie
Elke fysische constante van de wasbeurt staat in een parameterregister. De kalibratietool draait de simulatie op een record van een echte wasbeurt en optimaliseert de parameters om de waargenomen resultaten te benaderen.
De simulatie zelf controleren
De fenomenen-suite (48 fenomenen):
INIT_CWD=. pnpm exec tsx packages/sim-verify/src/phenomena/cli.ts --list
INIT_CWD=. pnpm exec tsx packages/sim-verify/src/phenomena/cli.ts P01 P36 --tier fast \
--out .spotless/phenomena
De kalibratietool op de testwas:
pnpm --filter @spotless/calibration spotless-fit validate \
packages/calibration/records/owner/owner-wash-01-egg-yolk-eco50.measured.json
Beperkingen en roadmap
De openstaande problemen worden bijgehouden als issues; docs/ROADMAP.md is de kaart hiervan. De belangrijkste punten zijn:
- Stapelen maakt momenteel geen verschil voor borden en bestek.
- Oppervlakken die binnen een millimeter of twee van elkaar liggen, worden te schoon.
- Vet wordt schoon zonder detergent, en zetmeel wordt altijd schoon.
- Er is slechts één machine, één programma en één testwas gebruikt.
- Er is geen menselijke baseline, geen herhaalde episodes en geen run via de Anthropic API.
- Alleen getest op macOS.
Projectstructuur
| Pad | Inhoud |
|---|---|
docs/README.md | Index van documenten |
docs/design/scope.md | Projectdoel, status en wat is weggelaten |
docs/validation/README.md | Validatie van de simulatie |
docs/benchmark/ | Benchmark uitvoering, levels en model-runs |
docs/calibration/ | Testwasbeurten en kalibratietool |
docs/research/ | Dossiers over machine, stralen, chemie, etc. |
docs/reference/ | Foto's en metingen van de machine |
packages/machine | Machine, items, vuil en inruim-fysica |
packages/session | Acties, query's, levels en gescripte spelers |
packages/sim-* | De wasbeurt: hydrauliek, stralen, vuil en inspectie |
packages/wash-runner | Uitvoering van de wasbeurt en rapporten |
packages/calibration | Was-records en parameter-sets |
packages/sim-verify | Fenomenen-suite |
packages/server, mcp, bench | Game server, agent interface en benchmark harness |
apps/web | De webinterface |
Bijdragen
Bugrapporten, fysiek onjuiste resultaten, testwasbeurten van echte machines en nieuwe levels zijn welkom. Zie CONTRIBUTING.md voor de setup en regels. Let op: de broncode van de simulatie is "fingerprinted"; wijzigingen hierin hebben gevolgen voor de validatie.
Licentie, mededelingen en disclaimer
DishwasherBench is uitgebracht onder de MIT-licentie, copyright Composo Limited.
Disclaimer: DishwasherBench is een onafhankelijk project van Composo Limited en is niet gelieerd aan, gesponsord door of onderschreven door BSH Hausgeräte GmbH, Robert Bosch GmbH (Bosch), Reckitt (Finish) of andere genoemde fabrikanten. De simulatie is een vereenvoudigd model van één privébezit machine. Niets in het spel of de resultaten is een uitspraak over de prestaties, kwaliteit of veiligheid van een echt product.
Citeren
Voor citaties kan het CITATION.cff bestand worden gebruikt. In BibTeX:
@software{dishwasherbench,
author = {{Composo}},
title = {DishwasherBench},
version = {0.1.0},
year = {2026},
url = {https://github.com/composo-ai/DishwasherBench}
}
Groetjes,