DishwasherBench:评测前沿模型能否装好洗碗机
DishwasherBench – Can Frontier Models Stack a Dishwasher?
DishwasherBench v0.1.0 发布,是基于一台 Bosch SMV4HAX40G 洗碗机物理仿真的评测框架,让人与大语言模型分别通过浏览器或 MCP 玩装载游戏并按洗涤结果打分。两个 GPT 模型(gpt-6.1-sol、gpt-6-astra)已通过 OpenAI 兼容端点跑过 7 关中的 3 关;仿真以一次真实洗涤做校准,但盘子、刀叉堆叠与蛋白、茶渍等土壤的评分仍不可信。
它把洗碗机装载任务做成可复现的物理仿真评测,同时给出两个模型的试跑分数、当前可校验范围和可参与入口。
DishwasherBench 是一款洗碗机装载游戏,基于一台真实机器的物理仿真构建,旨在对语言模型进行基准测试,普通人可以在浏览器中游玩。游戏名为 Spotless,软件包名为 @spotless/*。
玩家在刚体物理引擎中为 Bosch SMV4HAX40G 的 3D 模型装载餐具。然后模拟其 Eco 50 程序下的洗涤过程(喷淋、液滴、沥水、污垢与洗涤剂化学反应),每件洗干净的物品都会为玩家得分。从第二关开始,每一关都装不下所有物品,因此玩家必须选择装载哪些以及如何装载。
这是一个早期发布版本,版本号为 0.1.0。该仿真已根据一台真实机器的一次测试洗涤进行了校准。得分会反映玩家装载是否得当,以及杯子、玻璃杯和锅具是否倒扣入位。但目前尚无法反映盘子和餐具是否码放得当以便清洗干净。分数的可靠范围 一节对此有完整说明。
目前已稳定的部分:装载采用确定性刚体物理,每一次回放都是一份记录,任何人都可通过重放以及再次洗涤其装载来验证;无论是人在浏览器中,还是模型通过 MCP 都在玩同一款游戏。尚待完善的是洗涤过程对盘子和餐具的评分方式。
由 Composo 构建与维护。docs/ 下的许多文档都是工作记录,按写作时的原样保留;docs/README.md 说明了如何阅读它们。
在浏览器中加载第一关。一只餐盘正被手持于下层篮筐上方,"Suggest spots" 已为可用位置编号,推荐顺序从优到次。右侧面板显示了程序将发送的精确姿态。
目录
目前已实现的功能
- 机器。 以一台 Bosch SMV4HAX40G 作为数据和几何来源,依据机主的照片与卷尺读数 (
packages/machine):包括两个篮筐及其齿排、隔层与托架、喷淋臂以及 Eco 50 程序。 - 装载。 一份物品与污垢目录,以及确定性刚体装载(Jolt),再加上承载游戏动作与查询的会话层 (
place、remove、set_rack、list_slots、check_load及其他)。 - 洗涤。 模拟分为两个层级。正式层级给出评分结果;快速层级则是一个更粗略的预览。在参考机器(MacBook Pro,Apple M3 Pro,18 GB)上,对最大关卡进行一次冷启动的正式洗涤耗时 4.9 分钟(三次中取最佳);当有其他任务并行时耗时为 5 到 8.5 分钟,而预算为 30 分钟。
- 共七个关卡组成一套关卡,按难度顺序编号 (docs/benchmark/levels.md),每一关都附有三种脚本玩家(careful、careless、random)的参考装载存档。在参考装载下,有六个关卡能够达到基准门槛;教学关不能(其 careless 装载损失过小)。
- 三种游玩方式。 网页 (
apps/web)、面向智能体的 MCP 服务器 (packages/mcp),以及一个用于运行脚本玩家与模型并写出已验证回合记录的测试框架 (packages/bench)。 - 检查。 将文献中的 48 种装载现象作为可执行的两轮洗涤配对 (docs/research/standards.md 第 9 节),以及一个校准工具, 该工具根据真实洗涤的记录对模拟进行打分,拟合参数并对候选测试洗涤进行排序 (存储的排序属于较早的参数集,尚未重新运行)。
两个模型已通过 OpenAI 兼容端点进行过对战:在官方层级的三个关卡上进行了六局对战 (目前的成绩)。尚未有人作为基线进行过对战, Anthropic 的 API 路径也尚未在真实 API 上运行过。
分数可以信赖之处
包含每个数字及其来源的完整说明见 docs/validation/README.md。简而言之,模拟已从以下四个方面进行了检验:
- 真实机器上的一次测试洗涤。 Eco 50 程序下四个蛋黄盘。结果出来之前写下的预测正确地判断了盘子的顺序和残留物的形态,但对两个烤箱烘干盘上残留量的预测过于乐观,乐观程度达到十倍至三十倍。随后的校准调整了一个数字:长浸泡阶段中水泵运行所占的比例,从 0.5 调整为 0.8(取值范围 0.59 至 1)。关于预测先于结果这一记录保存在未公开的私人开发历史中,因此该顺序无法从本仓库中得到核实。
- 同类机器的已发布类别均值(Bosch SMV6ECX51E,环保程序,参考洗涤剂):餐具在 0.1 评分点以内,瓷器偏低 0.2,玻璃偏低 0.1 至 0.5。这是一个拟合,而非预测:土壤和化学默认值被设置为使这些数字能够出现。
- 48 种装载现象,在文献中具有证据支持:17 项通过,21 项在大小或方向上失败,1 项为有缺陷的场景,9 项需要尚未构建的机制。
- 其自身的账目核对。 水量被精确守恒,且在同一台机器上相同输入产生相同结果。快速层级与官方层级在标准 13 人份负载的判定上一致率为 89%,在关卡上一致率为 97%。
如今的分数可以反映玩家是否装填得当,以及杯子、玻璃杯和壶是否口朝下放置。但它尚不能反映盘子和餐具是否堆叠得当以使它们被洗得干净。
| 判定可以信赖之处 | 判定不能信赖之处 |
|---|---|
| 口朝上或侧放的玻璃杯、马克杯或壶:出来时未洗干净 | 倾倒或相互倚靠的盘子:出来时是干净的,而这很可能是错误的 |
| 被堵塞的洗涤剂分配盒,针对蛋白类污渍(鸡蛋、酸奶、肉糜、牛奶) | 被物品卡住而停止转动的喷淋臂:其上方的盘子维持其判定结果 |
| 真正放在另一件物品内的碗或勺子 | 塞入同一格中的餐具,以及按装载物理通常嵌套方式放置的勺子:干净 |
| 远离干净阈值的物品上的蛋黄及其他蛋白类污渍 | 接近阈值的物品;茶、咖啡和葡萄酒;玻璃上干燥的牛奶;油脂,即使无洗涤剂也能洗净 |
在仔细与粗心参考负载之间的差距中,约四分之三来自口朝错误方向放置的中空件。这些中空件中的污渍(冰沙、番茄汤、番茄酱、鳄梨酱)依赖于文献中的数值,尚未经过任何测试洗涤的检验。
完全未建模:干燥、玻璃上的水渍和薄膜、被水流推动的物品,以及污渍在干净件上的重新沉降。仅对 Eco 50 进行了校准和评分。
要求
DishwasherBench 已在一台机器上运行:一台 MacBook Pro(Apple M3 Pro,18 GB),系统为 macOS 27。本仓库中的所有数据均在该机器上测得。Linux 和 Windows 未经测试。目前尚无已知情况可以排除它们的可能性,欢迎报告在这两个系统上的运行情况(docs/ROADMAP.md)。
- Node 20.x 系列中的 20.19 或更新版本(
.nvmrc固定为 20.19.0)。安装时会拒绝使用更旧的 Node。Node 22 尚未尝试过。 - pnpm 9(
package.json指定为 9.4.0;corepack enable会选用它)。 - Dawn 能够打开的 GPU。清洗过程通过 Node 中的 WebGPU 在 GPU 上追踪水流(
webgpu包,版本 0.6.2,其中包含预编译的 Dawn 二进制文件)。在参考机器上对应的是 Metal。该版本在相同硬件上的 macOS 14.7 上未能加载。 - Google Chrome 或 Chromium,用于发送给智能体的图片以及驱动页面的脚本。测试套件会在常用安装位置查找它;将
SPOTLESS_CHROME设为程序的路径即可选择其他版本。手动游玩只需要一个桌面浏览器,而脚本化游玩则不需要浏览器(--no-render)。 - 克隆约需 680 MB(下载约 290 MB;文件本身约 385 MB,主要为照片、截图和关卡记录),
node_modules约 420 MB。 - 对一个关卡进行标准清洗需要 1 到 2 GB 内存(在标准 13 件餐具的负载下观察到 2.4 GB),并需要空闲端口 8787(游戏服务器)和 8788(MCP 服务器)。
在同一台机器上,结果可以逐位复现。在不同机器、操作系统构建版本以及 webgpu 包的版本之间,最后几位可能存在差异,因此每个结果都会注明计算时所采用的技术栈(docs/research/spike-gpu-compute-macos27-recheck.md)。
快速开始
git clone https://github.com/composo-ai/DishwasherBench.git cd DishwasherBench corepack enable # once: makes pnpm 9.4.0 available pnpm install --frozen-lockfile # about 15 seconds the first time
包无需构建步骤:它们以 TypeScript 源码的形式被消费,并通过 tsx 运行。只有页面需要构建,由下面的 play 命令完成。
展示结果的最简方式是从命令行清洗一个已保存的负载:
pnpm --filter @spotless/wash-runner wash-load tutorial-careful --tier fast # under a minute pnpm --filter @spotless/wash-runner wash-load tutorial-careful --tier official # about 5 minutes the first time
它会输出得分,并针对每件物品输出判定、得分以及其上残留的内容。已保存的负载位于 packages/loader/loads/(<level>-<player>.json)。对同一负载的第一次清洗会计算水流的去向,并将结果保存在 .spotless/exposure-cache 中,因此对同一负载的第二次清洗只需数秒即可完成(传入 --no-cache 可关闭此行为)。
若要检查所有内容是否能在你的机器上运行:
pnpm typecheck # the root and every package; a few seconds pnpm test # every package; 8 to 17 minutes on the reference machine
pnpm test 所需的时间取决于机器当前的其他负载。其中一项测试按设计被跳过。测试会在 GPU 上运行真实的清洗。
当参数集已过时,清洗会拒绝运行。游戏用于清洗的参数集(anchored-v7.owner-capsule,位于 packages/calibration/anchors/)会记录模拟源码以及其对应机器数据的状态。在其中任何一项发生更改后,清洗会停止并列出差异之处。CONTRIBUTING.md 说明了该规则以及如何使参数集重新生效。
在浏览器中游玩
pnpm --filter @spotless/web play
此命令会构建页面并启动游戏服务器。打开 http://127.0.0.1:8787(如需更换端口,请添加 --port <n>)。页面会播放音乐:若不希望听到声音,请将标签页静音,或使用声音按钮。
如果端口已被占用,服务器会以 serve: port 8787 is in use; give --port <n> 停止。服务器只响应它自己服务的页面:携带其他站点 Origin 的请求会得到 403,除非服务器在启动时使用了 --allow-origin <scheme://host[:port]>(可重复使用);其 Host 头中主机名与服务器监听地址(默认是 127.0.0.1、localhost 和 [::1])不同的请求也会得到 403(--allow-host <name> 添加一个名称)。没有 Origin 头的请求(harness、MCP 服务器、curl)不受影响,Vite 开发服务器下的客户端不需要任何标志。
启动清洗时会提供两种类型:
- 快速预览:快速档位。约一分钟;较为粗略,部分判定可能与完整清洗不同。它不计分。
- 完整清洗:官方档位。数分钟;这是计分结果。预览之后,报告会针对同一负载提供完整清洗。
游戏在 Eco 50 模式下评分,使用一盒洗涤剂(Finish Powerball Ultimate,12.9 克)。关卡按 1 到 7 列出,并附有难度数值,该数值由台面上的物品计算得出,并非实测分数。
通过指向放置的方式适用于空行中的盘子、碗和餐具。目前还有两种情况无法通过指向完成:指向已放置盘子旁边空隙的盘子往往会搁在邻位盘子上;杯子和玻璃杯无法倚靠上层篮筐的侧托架。这两种情况下,请拿起该物件并按"Suggest spots"(消耗一次查询),然后点击一个带数字的标记。
对第一关一个粗心负载进行快速预览之后:一个口朝上放置的碗盛有 432 毫升水且未洗净,报告显示有一把叉卡住了下喷淋臂使其停止转动。横幅说明了预览的含义:不是计分结果。以上所有内容都是模拟对一个故意装得很差的负载的输出,并非对真实机器或洗涤剂的测试。
清洗后仔细查看一件物品:残留物被绘制在它原本所在的位置,并标注其面积以及该物品所盛的水量。
运行脚本化玩家
脚本化玩家不需要模型,也不产生费用。这会以官方档位使用严谨参考玩家游玩第一关,然后通过重放其操作并再次清洗该负载(约各五分钟)来验证记录:
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
- 将
--out给出为绝对路径;相对路径在packages/bench内解析。 - 脚本化玩家为
empty、random、careless和careful。添加--tier fast可在约一分钟内完成预览;快速清洗在记录和结果表中被标记为预览,绝不算分。 - 每次运行会在
--out下写入:record.json、结果表(results.md、results.json)、其启动的游戏服务器数据(server-data/),以及在没有--no-render的情况下,工具返回的图片。
脚本化严谨玩家在最大关卡的负载(台面上 62 件,已装载 49 件),分别从上方、正面和侧面展示。已经游玩的两个模型都击败了它。
运行模型
关于 harness、每种玩家看到的内容以及记录内容的全部信息,请参阅 docs/benchmark/README.md。
模型运行需要费用。 将 .env.example 复制到 .env(该文件被 git 忽略),并填写你的端点地址和密钥。命令会打印所设置变量的名称,永远不会打印其值,且密钥和地址都不会写入记录。
在 OpenAI 兼容端点(OpenAI、Azure 或任何提供 Responses 或 chat completions API 的服务器)后方的模型:
pnpm --filter @spotless/bench bench run --levels tutorial --policies openai:gpt-6.1-sol \
--max-input-tokens 2000000 --out "$PWD/.spotless/bench/sol-tutorial"- 通过 policy 指定模型名称,或在 Azure 上指定部署:
openai:<model or deployment>。 - 如果未设置地址,则不会发出请求:本集立即结束且没有结果,其记录显示为
no address of the API (set SPOTLESS_OPENAI_BASE_URL, or give --base-url)。命令随即以状态码 1 退出,pnpm 报告脚本执行失败。 --max-input-tokens会在其请求累计达到更多之前结束一集。根据两个模型的测量:第一关需要 40 万至 65 万输入令牌,37 件的那一关需要 250 万至 280 万,最大的那一关(62 件)需要 300 万至 320 万,其中 95% 以上是从提供商的缓存中读取的。请使用上限 2,000,000、12,000,000 和 20,000,000。- 测试工具会记录令牌数。仅当在
.env中给出价格时,它才会记录费用。 - 没有
--tier fast时,洗牌按官方级别进行,该级别即为评分。 - 每次运行都会在
--out下写入记录、对话脚本、图片和结果表,并通过重放其操作日志来验证这一集。
通过 Anthropic 的 API 使用模型,密钥放在ANTHROPIC_API_KEY中(将模型的 id 放在<model id>的位置):
pnpm --filter @spotless/bench bench run --levels tutorial --policies anthropic:<model id> \ --max-input-tokens 2000000 --out "$PWD/.spotless/bench/anthropic-tutorial"
此路径尚未针对真实 API 运行过。它只有针对本地替身的单元测试,除此之外没有其他内容。欢迎报告首次运行的情况。如果缺少密钥,本集会立即失败(Could not resolve authentication method)。SDK 也接受已存储的登录配置文件(如果你有的话),因此.env中没有密钥并不保证不会产生费用。
连接 MCP 客户端
任何支持 MCP 的智能体都可以参与。一个 MCP 服务器绑定到一集,因此游戏服务器必须以基准模式运行,并且该集必须先存在。
# 1. The game server (the token: 8 characters or more, of your choosing) pnpm --filter @spotless/server exec tsx src/cli.ts serve --admin-token <token> --wash-tier fast \ --data "$PWD/.spotless" # 2. An episode; prints an address for the page, and the episode's id pnpm --filter @spotless/server exec tsx src/cli.ts link --admin-token <token> \ --level tutorial --player my-agent --agent # 3. For a client that speaks streamable HTTP: serves http://127.0.0.1:8788/mcp pnpm --filter @spotless/mcp exec tsx src/cli.ts --server http://127.0.0.1:8787 \ --session <episode id> --http --port 8788
--data将服务器的文件(包括集记录.spotless/episodes/)保留在页面所使用的目录中;如果没有它,serve会写入packages/server/.spotless。link打印的地址会在页面中显示该集,并且仅在页面构建完成后才有效(pnpm --filter @spotless/web build,play也会执行此操作);MCP 调用无论哪种方式都可以工作。如果游戏服务器使用其他端口(serve --port <n>),请使用--server http://127.0.0.1:<n>将地址提供给link。对于通过 stdio 自行启动 MCP 服务器的桌面客户端,其配置位于docs/benchmark/README.md的第 3 节。
在 HTTP 上,MCP 服务器服务于本机上的 MCP 客户端:它对任何带有 Origin 标头的请求返回 403,对 Host 标头未列出其所监听地址的请求同样返回 403(默认为 127.0.0.1、localhost 或 [::1])。对于以其他名称(例如从容器中)访问它的客户端,请使用 --allow-host <name> 启动它;游戏服务器也接受相同的标志。
智能体获得十三个工具(place、remove、reset、set_rack、start_cycle、get_level、get_item、get_state、render、preview、list_slots、check_load、get_report)。若要手动尝试一次调用:
pnpm --filter @spotless/mcp exec tsx scripts/call.ts --url http://127.0.0.1:8788/mcp get_state '{}'
两个服务器都侦听 127.0.0.1,仅供您自己的机器使用(SECURITY.md)。
目前的结果
两个模型已通过一个 OpenAI 兼容端点,在官方级别上跑完了三关课程。每个单元格仅一次记录只是轶事,并非基准测试结果,此处的内容并不能对这两个模型进行排名。
得分,以及占该关得分的比例。中间几列是脚本化的参考玩家。
| # | 关卡 | 可得分数 | 随机 | 粗心 | 细心 | gpt-6.1-sol |
gpt-6-astra |
|---|---|---|---|---|---|---|---|
| 1 | 教程(12 件) | 64 | 20 (31.3 %) | 58 (90.6 %) | 64 (100 %) | 64 (100 %) | 未运行 |
| 4 | 早餐(37) | 220 | 36 (16.4 %) | 112 (50.9 %) | 174 (79.1 %) | 190(86.4 %);第二集 188(85.5 %) | 175 (79.5 %) |
| 7 | 晚宴(62) | 367 | 88 (24.0 %) | 100 (27.2 %) | 250 (68.1 %) | 260 (70.8 %) | 274 (74.7 %) |
gpt-6.1-sol和gpt-6-astra是所使用的 Azure 端点上两个部署的名称。记录中保存了该名称以及 API 上报的推理强度(两者均为 medium;测试工具未发送任何值);未记录模型版本或快照日期。
三个脚本化列是按当前洗涤代码保存的参考装载 (docs/benchmark/course-table.md)。模型剧集旁保存的参考记录是在更早的代码上洗涤后读取的,随机和粗心的早餐分别得到 43 和 117,随机的晚宴得到 99。
六个剧集各自的价值:
- 细致的参考装载不是上限。两个模型都在两个完整关卡上超过了它,它们放置了平底锅、一个长盘和砧板,而脚本化玩家从不尝试这些。这里没有任何归一化处理。
- 两个模型都没有犯关卡设计所针对的错误。六个剧集中,没有空心件被口朝上立起或被侧放,模型装载的东西有 84% 到 100% 是干净的。所以洗涤几乎没在它们之间分出高低:它们的分数差别在于装了什么东西。
- 未显示:人类、任何 Anthropic 模型、关卡 2、3、5 和 6、金钱,或模型自身表现的离散程度(一次重复在装载不同的情况下从 190 变为 188)。
这六个剧集的记录、转写和图片,以及更详细的说明,都放在 docs/benchmark/first-runs/course/。六个模型剧集每个都通过重放和第二次洗涤进行验证,得到相同的判定和分数。洗涤代码自它们运行后变更过一次,所以第二次洗涤报告了不同的结果哈希并说明了原因。
工作原理
装载。每件物品和机器的每个部件都是由参数化描述生成的精确形状的刚性复合体;图像、碰撞形状和洗涤看到的表面都来自同一描述。物品使用刚体物理(Jolt)以固定步长放置,玩家的输入四舍五入到 1 毫米和 1 度,因此人和模型在同一个网格上操作,同一装载总是以相同方式沉降。每个动作都用操作后场景的哈希进行记录,重放日志必须复现每个哈希。 参见 docs/design/platform.md。
洗涤。喷淋从机器上测量的喷嘴位置和机械臂转动出发,在 GPU 上追踪到装载的精确形状上。飞溅和水滴作为液滴运动;落在表面的水作为水膜向下流,在表面能够托住的地方积聚,在不能托住的地方排走。针对每种土壤的土壤模型随后通过时间、温度和洗涤水(洗涤剂、酶、漂白剂)的化学作用在整个洗涤程序中去除土壤。水流的位置与土壤和化学分开缓存,因此使用其他土壤参数洗涤时可以在几秒到约一分钟内重放。官方层在 2 毫米的块上工作,快速层在 4 毫米的块上工作。参见 docs/design/scope.md 了解已构建和未包含的内容,参见 docs/design/sim-core.md 了解设计中的物理。
计分。洗涤后,检查员查看每件物品。当一件物品最多带有 4 个污点和 4 平方毫米可见土壤时为干净,计算脏水留在其放置位置的污渍。每件物品值关卡卡上所述的若干分;干净的物品得分,未干净或被留在台面上的物品不得分。一个剧集就是一次装载和一次洗涤。报告还为每件物品和残留物给出 0 到 5 的分级评分,这些不改变分数。参见 docs/benchmark/README.md 和 docs/benchmark/levels.md。
校准。洗涤的每一个物理常数都存放在一个参数注册表中,每条都有默认值、范围和来源。一条洗涤记录描述了一次真实的测试洗涤:洗衣机和洗涤程序、每一件衣物及其污渍类型和放置位置,以及洗涤后的观察结果。校准工具在一条记录上运行模拟,针对观察结果进行打分,拟合所选参数,并说明哪些参数可以由数据识别、哪些不能。目前只有一条这样的洗涤记录。参见 docs/calibration/wash-record.md、docs/calibration/fitting.md,以及关于游戏洗涤所使用的参数集,请见 docs/calibration/anchoring-v7.md。
亲自检验一下模拟
现象套件(48 个现象,82 次洗涤;在 fast 档位且无缓存时约 15 分钟,全部缓存时约两分半)。请在代码仓库根目录下、用 POSIX shell 运行以下命令:
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 INIT_CWD=. pnpm exec tsx packages/sim-verify/src/phenomena/cli.ts P36 --tier fast \ --params packages/calibration/anchors/anchored-v7.owner-capsule.json --dose-g 12.9 \ --out .spotless/phenomena
不带 id 时会运行全部 48 个。不带 --params 时以注册表默认值和参考洗涤剂进行洗涤;第三种形式则按游戏的方式洗涤,使用校准后的参数集和胶囊。默认情况下报告输出到 packages/sim-verify/phenomena/reports/,即项目的存放报告目录;上述命令则把报告输出到被 git 忽略的 .spotless/phenomena,以免试用覆盖存放的报告。
在这唯一一条测试洗涤上,校准工具:
pnpm --filter @spotless/calibration spotless-fit validate \ packages/calibration/records/owner/owner-wash-01-egg-yolk-eco50.measured.json pnpm --filter @spotless/calibration spotless-fit predict \ packages/calibration/records/owner/owner-wash-01-egg-yolk-eco50.measured.json \ --params packages/calibration/anchors/anchored-v7.owner-capsule.json
validate 检查洗涤记录;predict 显示模拟对其中每次观测给出的结果(首次需要五到七分钟,一旦负载的水被缓存,时间就会缩短)。请提供 --params:没有它,predict 将使用注册表默认值并说明这一点;这些不是游戏内的设置,会将四块板全部读为脏。使用该设置时,predict 会警告其旁边没有 calibration.json;这是预期的。
已有载入配置与当前载入物理的对照:
pnpm --filter @spotless/loader check-loads tutorial-careful
pnpm --filter @spotless/loader check-loads --jobs 3 # all 25 of them: about 50 minutes局限性与路线图
尚未解决的问题(每条都写成了贡献者可以着手的形式)作为 议题 跟踪;docs/ROADMAP.md 是它们的总览图。其中最主要的有:
- 堆叠对盘子和餐具没有影响。盘子倒下、餐具拥挤或机械臂卡住,几乎都没有代价。
- 与另一物体仅相差一两毫米的表面会洗得过干净。针对这种缝隙已构建过一个机制,但未纳入本代码仓库,因为它破坏了餐具控制逻辑,而且其决定性参数缺乏测量依据。
- 油脂在无洗涤剂时也能洗净,而淀粉则总是能洗净。
- 一台洗衣机、一个洗涤程序、一次测试洗涤。关卡所基于的污渍类型从未在实际洗涤中进行过测试。
- 没有人类基线、没有重复回合、也没有通过 Anthropic API 运行过。
- 仅一个平台。Linux 和 Windows 均未经过测试。
各文件所在
| 路径 | 内容 |
|---|---|
| docs/README.md | 文档的索引,附带阅读顺序以及每篇文档的标签:当前、构建记录或已被取代 |
| docs/design/scope.md | 项目目标、最先构建的部分、剔除的部分以及当前状态 |
| docs/validation/README.md | 模拟所对照的验证对象,以及一项结论可被信任到何种程度 |
| docs/benchmark/ | 基准的运行方式、关卡流程,以及使用模型的初次运行 |
| docs/calibration/ | 可用于校准模拟的测试洗涤、洗涤记录格式、拟合工具以及目前仅有的这一次测试洗涤 |
docs/research/ |
有来源的资料汇编:洗衣机、喷射、水膜、污渍、化学、标准以及基准的设计 |
| docs/reference/ | 机器的照片与测量数据、机器图纸、测试洗涤的照片 |
packages/machine, catalogue, geometry, physics |
机器、餐具与污渍、形状、装载物理 |
packages/session, levels, loader |
游戏中的动作与查询、关卡、脚本化玩家及其保存的进度 |
packages/sim-*, inspector |
洗涤:场景、水力、喷嘴、喷雾、液膜、洗涤液、污渍、时间线、结果检查 |
packages/wash-runner |
游戏运行的洗涤:默认参数、报告 |
packages/calibration |
洗涤记录、拟合工具、参数集(anchors/) |
packages/sim-verify |
现象套件与演示洗涤 |
packages/server, mcp, bench, render |
游戏服务器、智能体接口、基准测试框架、图片 |
apps/web |
页面 |
scripts/ |
守护发布内容的卫生检查及其测试 |
spikes/ |
两项早期试验(GPU 计算、刚体引擎)的探索性代码;不属于游戏的一部分 |
贡献
欢迎提交缺陷报告、看起来在物理上不合理的结果、真实机器的测试洗涤、新关卡,以及附带各自回合记录和其他平台报告的模型结果。CONTRIBUTING.md 说明了如何搭建环境、在提交拉取请求前需要运行哪些检查,以及一条常令人意外的规定:仿真源码会被指纹识别,对它的更改会产生相应后果。请阅读行为准则。
问题请提交到 问题表单 中的提问表单。 任何私密事项请发送至 support@composo.ai;如需报告安全问题,或指出某张照片或某条记录中不应公开的内容,请参阅 SECURITY.md。项目维护规模较小,不作任何支持承诺。各版本所含内容详见 CHANGELOG.md。
许可证、声明与免责声明
DishwasherBench 以 MIT 许可证 发布,版权归 Composo Limited 所有。 来自他人的材料以及项目所依赖的主要软件在 THIRD_PARTY_NOTICES.md 中列出:游戏中的音乐为公共领域(CC0)作品,研究笔记中所引用的短段落仍归原作者所有。 机器的照片经其所有者授权,以相同的 MIT 许可证发布,其公开前的准备工作如 docs/reference/REDACTIONS.md 所述。
DishwasherBench 是 Composo Limited 的独立项目,与 BSH Hausgeräte GmbH 或 Robert Bosch GmbH(博世)、Reckitt(Finish)或其中提及的任何其他制造商均无关联、未获其赞助、亦未经其背书。所有产品名称与商标均归各自所有者所有,仅用于指明所测量的对象。仿真是一台私人所有机器的简化模型,依据其所有者的照片、测量数据与测试洗涤,以及公开文档构建而成,其中许多参数均为估计值。游戏、基准测试结果或文档中的任何内容,均不构成对任何真实产品性能、质量或安全性的声明;游戏中显示的装载建议是项目对制造商手册的自行总结,而非制造商的使用说明。
如何引用
CITATION.cff 以 GitHub 与参考文献管理工具可读取的形式给出详细信息。 BibTeX 格式:
@software{dishwasherbench, author = {{Composo}}, title = {DishwasherBench}, version = {0.1.0}, year = {2026}, url = {https://github.com/composo-ai/DishwasherBench} }
来源:Hacker News · github.com



