同一个容器、同一套工具、同一档 effort=xhigh,八个不同的建筑任务各跑一次。
这一轮换的自变量不是 effort 而是任务本身:每个 prompt 只给一张参考图,要求模型自己设计室内。
八个全部通过,问题不在能不能做出来,而在于八次的开销、结构与失败方式有多像。
从表面到深层排列。数字都来自下面各节的表和图。
verify() 报的 changed on reload:同一坐标被写了两次,内存里的记录和导出的文件对不上。八个任务里有三个踩到同一个坑,说明这是模板该挡而没挡住的。镜像 mcgen:latest,工具集 standard(/opt/tools 四件套 + AGENTS.md),
模型 gpt-6-astra,effort=xhigh,一轮 user turn,无网页检索。
前四个由本人手动跑,后四个由 agent 代跑,命令完全相同。
容器内实际执行:
codex exec --skip-git-repo-check --dangerously-bypass-approvals-and-sandbox -m gpt-6-astra
-c model_reasoning_effort="xhigh" --image=<参考图> -- <PROMPT.md>
同一份 PROMPT.md 模板,换掉三处:标题、参考图文件名、参考图的文字描述。 交付要求、坐标约定、确定性要求、测试要求八份逐字相同。每个任务只给一张参考图,室内由模型自己设计。
| 参考图 | prompt | 任务 | 产物尺寸 X×Y×Z |
|---|---|---|---|
![]() |
root-house |
small dwelling built into a hillside under a mass of thick dark wood roots shown in the reference image | 25×23×22 |
![]() |
sandstone-cottage |
wide cottage on a slope, with a pale stair roof and a half sunken lower floor shown in the reference image | 32×24×26 |
![]() |
stone-cottage |
small cottage of stone walls and wooden corner posts under a pale stair roof shown in the reference image | 16×15×14 |
![]() |
red-roof-farmstead |
farmhouse with a steep red roof, standing on a square plot with a well, a field and a windmill shown in the reference image | 42×29×42 |
![]() |
stilt-water-cabin |
an all wood cabin standing on posts over shallow water, with a deck and a mooring shown in the reference image | 28×21×24 |
![]() |
stilted-manor |
tall medieval house whose upper floors overhang a stone ground floor on heavy wooden posts shown in the reference image | 33×39×31 |
![]() |
merchant-manor |
tall medieval merchant house with a stone undercroft, a market stall and steep dark roofs shown in the reference image | 37×43×33 |
![]() |
mediterranean-villa |
two storey white and blue villa with terracotta roofs, terraces, a pergola and a pool shown in the reference image | 35×27×31 |
点表头排序。token 分成三列:新增输入、缓存输入、输出(输出含推理)。
| build | 秒 | 请求 | 命令 | 新增输入 | 缓存输入 | 输出 | 其中推理 | 尺寸 | 体积 | 方块 | palette | 方块种类 | 生成器行 | 测试数 | 测试行 | 失败 | 估算 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
root-house |
1319 | 30 | 28 | 104,524 | 1,830,528 | 39,867 | 18,365 | 25×23×22 | 12,650 | 3,986 | 77 | 52 | 632 | 11 | 360 | 3 | $0.758 |
sandstone-cottage |
755 | 19 | 25 | 101,211 | 780,416 | 23,353 | 6,942 | 32×24×26 | 19,968 | 6,777 | 103 | 72 | 558 | 14 | 313 | 2 | $0.458 |
stone-cottage |
868 | 24 | 24 | 56,248 | 1,052,288 | 25,824 | 6,325 | 16×15×14 | 3,360 | 883 | 65 | 44 | 407 | 11 | 331 | 2 | $0.460 |
red-roof-farmstead |
955 | 20 | 20 | 67,015 | 990,080 | 28,926 | 10,954 | 42×29×42 | 51,156 | 9,152 | 113 | 73 | 589 | 10 | 346 | 3 | $0.497 |
stilt-water-cabin |
854 | 22 | 21 | 66,787 | 1,085,824 | 25,710 | 9,214 | 28×21×24 | 14,112 | 3,603 | 68 | 40 | 459 | 10 | 397 | 2 | $0.476 |
stilted-manor |
1232 | 25 | 28 | 73,507 | 1,300,224 | 37,770 | 15,878 | 33×39×31 | 39,897 | 7,492 | 105 | 64 | 678 | 9 | 286 | 3 | $0.632 |
merchant-manor |
1300 | 27 | 31 | 104,885 | 1,738,880 | 39,277 | 13,468 | 37×43×33 | 52,503 | 7,401 | 132 | 78 | 850 | 10 | 408 | 5 | $0.741 |
mediterranean-villa |
1184 | 20 | 25 | 81,215 | 1,185,152 | 36,822 | 13,625 | 35×27×31 | 29,295 | 7,411 | 120 | 87 | 782 | 11 | 419 | 3 | $0.618 |
| 合计 | 8467 | 187 | 202 | 655,392 | 9,963,392 | 257,549 | 46,705 | 4,955 | 86 | 2,860 | 23 | $4.640 |
八次全部 passed=true、schematic_valid=true、pytest exit=0,
所以这三列没有放进表里。
每张图只放同一量纲的东西。token、秒、方块数、行数不混在一张图里。
八个产物本体,可拖动旋转。文件就是 out/output.litematic 的原件。
root-house — 25×23×22,3,986 方块,77 个状态
sandstone-cottage — 32×24×26,6,777 方块,103 个状态
stone-cottage — 16×15×14,883 方块,65 个状态
red-roof-farmstead — 42×29×42,9,152 方块,113 个状态
stilt-water-cabin — 28×21×24,3,603 方块,68 个状态
stilted-manor — 33×39×31,7,492 方块,105 个状态
merchant-manor — 37×43×33,7,401 方块,132 个状态
mediterranean-villa — 35×27×31,7,411 方块,120 个状态
每组第一张是参考图,其余是模型在 run 中渲染并看过的图。所有渲染都走同一份
template_render.mjs 的光照参数。
root-house7 张渲染,全部是模型自己跑出来看过的。
sandstone-cottage6 张渲染,全部是模型自己跑出来看过的。
stone-cottage6 张渲染,全部是模型自己跑出来看过的。
red-roof-farmstead6 张渲染,全部是模型自己跑出来看过的。
stilt-water-cabin5 张渲染,全部是模型自己跑出来看过的。
stilted-manor8 张渲染,全部是模型自己跑出来看过的。
merchant-manor9 张渲染,全部是模型自己跑出来看过的。
mediterranean-villa7 张渲染,全部是模型自己跑出来看过的。
把每个模型请求按它触发的最强动作打一个标签,八条轨迹就能压成八个字符串。
字母含义:E 探索、G 写生成器、R 渲染、T 测试、
F 修补格式化、V 验证导出、P 纯推理或说明。
| build | 阶段序列(按请求顺序) | 请求数 |
|---|---|---|
root-house | EGEEGRVGTRTPTPTRVEVETRVVTEPTPP | 30 |
sandstone-cottage | EEGEGGRGPRTRTPTTPEP | 19 |
stone-cottage | EGEGPGFGRPPREGGTGTRRPTPP | 24 |
red-roof-farmstead | EGEGRVPRRTPVTEPTRRPP | 20 |
stilt-water-cabin | EEGPEGFGRPPRRTTPVTRTPP | 22 |
stilted-manor | EGGRVPGVTVTRVTRRPTPTTRPTP | 25 |
merchant-manor | EGEEPGRVPRTTVVTRTRTTTRTRTPP | 27 |
mediterranean-villa | EGEEPGRRGPRTRTTETRPP | 20 |
八条轨迹的共同形状:E 开头一到三步摸环境,紧接第一次 G 落地生成器骨架,
然后 R 出现,此后在 R 与 T 之间来回,最后以 P 收尾。
没有一个 run 是先写完测试再建东西的,也没有一个是建完就交付不渲染的。
同一个请求里如果既改了生成器又跑了 pytest,按『最强动作』规则算测试。
这就是 F 在多数 build 里是 0 的原因:yapf 几乎总是和别的动作串在同一条命令里。
root-house — 28 条命令,3 条失败sandstone-cottage — 25 条命令,2 条失败stone-cottage — 24 条命令,2 条失败red-roof-farmstead — 20 条命令,3 条失败stilt-water-cabin — 21 条命令,2 条失败stilted-manor — 28 条命令,3 条失败merchant-manor — 31 条命令,5 条失败mediterranean-villa — 25 条命令,3 条失败归因方式与前三轮一致:看每个请求触发的命令,取最强的动作。没有命令的请求算纯推理。
| 阶段 | root-house | sandstone-cottage | stone-cottage | red-roof-farmstead | stilt-water-cabin | stilted-manor | merchant-manor | mediterranean-villa | 合计 |
|---|---|---|---|---|---|---|---|---|---|
| 探索环境与 API | 33,868 | 16,799 | 10,163 | 10,772 | 15,641 | 6,041 | 30,087 | 22,437 | 145,808 |
| 写生成器 | 12,561 | 17,470 | 27,314 | 13,903 | 6,076 | 8,942 | 8,882 | 9,136 | 104,284 |
| 渲染看图 | 24,139 | 6,924 | 3,752 | 15,120 | 6,401 | 18,277 | 24,744 | 27,705 | 127,062 |
| 写测试与跑测试 | 16,290 | 54,533 | 4,041 | 7,290 | 11,651 | 15,115 | 25,914 | 10,631 | 145,465 |
| 修补与格式化 | 0 | 0 | 281 | 0 | 6,497 | 0 | 0 | 0 | 6,778 |
| 验证导出 | 6,154 | 0 | 0 | 5,652 | 2,094 | 12,702 | 4,797 | 0 | 31,399 |
| 规划与说明 | 11,512 | 5,485 | 10,697 | 14,278 | 18,427 | 12,430 | 10,461 | 11,306 | 94,596 |
| 阶段 | root-house | sandstone-cottage | stone-cottage | red-roof-farmstead | stilt-water-cabin | stilted-manor | merchant-manor | mediterranean-villa | 合计 |
|---|---|---|---|---|---|---|---|---|---|
| 探索环境与 API | 1,980 | 2,119 | 2,846 | 4,493 | 2,997 | 158 | 1,493 | 3,033 | 19,119 |
| 写生成器 | 12,512 | 9,870 | 3,091 | 9,165 | 7,109 | 15,752 | 16,551 | 12,743 | 86,793 |
| 渲染看图 | 2,100 | 1,910 | 2,230 | 3,894 | 4,212 | 4,989 | 3,830 | 4,633 | 27,798 |
| 写测试与跑测试 | 15,108 | 8,545 | 8,018 | 8,410 | 8,761 | 13,085 | 15,922 | 13,514 | 91,363 |
| 修补与格式化 | 0 | 0 | 4,217 | 0 | 116 | 0 | 0 | 0 | 4,333 |
| 验证导出 | 4,505 | 0 | 0 | 1,014 | 1,173 | 1,175 | 967 | 0 | 8,834 |
| 规划与说明 | 3,662 | 909 | 5,422 | 1,950 | 1,342 | 2,611 | 514 | 2,899 | 19,309 |
两张表的分布形状不同:新增输入集中在『探索』和『渲染看图』(读文件、读渲染结果), 输出集中在『写生成器』和『写测试』(真正在产代码)。这也是为什么按输入算和按输出算会得出不同的『瓶颈』。
root-house 逐请求细切 — 30 个请求sandstone-cottage 逐请求细切 — 19 个请求stone-cottage 逐请求细切 — 24 个请求red-roof-farmstead 逐请求细切 — 20 个请求stilt-water-cabin 逐请求细切 — 22 个请求stilted-manor 逐请求细切 — 25 个请求merchant-manor 逐请求细切 — 27 个请求mediterranean-villa 逐请求细切 — 20 个请求费率:新增输入 $1.25/M,缓存输入 $0.125/M,输出 $10/M。 这是估算,实际走订阅额度,真实支出为 0。
| build | 缓存输入 | 缓存费 | 新增输入 | 新增输入费 | 输出 | 输出费 | 合计 |
|---|---|---|---|---|---|---|---|
root-house |
1,830,528 | $0.229 | 104,524 | $0.131 | 39,867 | $0.399 | $0.758 |
sandstone-cottage |
780,416 | $0.098 | 101,211 | $0.127 | 23,353 | $0.234 | $0.458 |
stone-cottage |
1,052,288 | $0.132 | 56,248 | $0.070 | 25,824 | $0.258 | $0.460 |
red-roof-farmstead |
990,080 | $0.124 | 67,015 | $0.084 | 28,926 | $0.289 | $0.497 |
stilt-water-cabin |
1,085,824 | $0.136 | 66,787 | $0.083 | 25,710 | $0.257 | $0.476 |
stilted-manor |
1,300,224 | $0.163 | 73,507 | $0.092 | 37,770 | $0.378 | $0.632 |
merchant-manor |
1,738,880 | $0.217 | 104,885 | $0.131 | 39,277 | $0.393 | $0.741 |
mediterranean-villa |
1,185,152 | $0.148 | 81,215 | $0.102 | 36,822 | $0.368 | $0.618 |
| 合计 | 9,963,392 | $1.245 | 655,392 | $0.819 | 257,549 | $2.575 | $4.640 |
分类沿用前三轮的 A–E,这一轮多出一个 F 导出重载不一致:模板 verify() 在重新加载时
发现某个坐标的方块和内存里记的不一样,原因都是同一个坐标被写了两次。
| 类别 | root-house | sandstone-cottage | stone-cottage | red-roof-farmstead | stilt-water-cabin | stilted-manor | merchant-manor | mediterranean-villa | 合计 |
|---|---|---|---|---|---|---|---|---|---|
| A 写文件时的语法或导入错 | — | — | — | 1 | — | — | — | — | 1 |
| C 自写测试失败 | 3 | 1 | 1 | 2 | 1 | 3 | 5 | 2 | 18 |
| E 其它 | — | — | — | — | — | — | — | 1 | 1 |
| F 导出重载不一致 | — | 1 | 1 | — | 1 | — | — | — | 3 |
结论很集中:模型的主要失败来源是它自己写的测试,占 18/23。这不是坏事——测试先于修复被写出来,
失败一次就改一次生成器。真正暴露工具缺陷的是 F 那三次:模板允许重复写同一格而不报错,
直到导出后重载才炸。这一条应该由 put() 在写入时就挡掉。
root-house — 3 条C 自写测试失败 — exit 1
C 自写测试失败 — exit 1
C 自写测试失败 — exit 1
sandstone-cottage — 2 条F 导出重载不一致 — exit 1
C 自写测试失败 — exit 1
stone-cottage — 2 条F 导出重载不一致 — exit 1
C 自写测试失败 — exit 1
red-roof-farmstead — 3 条C 自写测试失败 — exit 1
C 自写测试失败 — exit 1
A 写文件时的语法或导入错 — exit 1
stilt-water-cabin — 2 条F 导出重载不一致 — exit 1
C 自写测试失败 — exit 1
stilted-manor — 3 条C 自写测试失败 — exit 1
C 自写测试失败 — exit 1
C 自写测试失败 — exit 1
merchant-manor — 5 条C 自写测试失败 — exit 1
C 自写测试失败 — exit 1
C 自写测试失败 — exit 1
C 自写测试失败 — exit 1
C 自写测试失败 — exit 1
mediterranean-villa — 3 条E 其它 — exit 1
C 自写测试失败 — exit 1
C 自写测试失败 — exit 1
八个 build 的测试函数按它检查什么归类。分类是按函数名里的关键词做的,一个函数只归一类。
| 测试目的 | root-house | sandstone-cottage | stone-cottage | red-roof-farmstead | stilt-water-cabin | stilted-manor | merchant-manor | mediterranean-villa | 合计 |
|---|---|---|---|---|---|---|---|---|---|
| 可达性与流线 | 4 | 4 | 2 | 3 | 3 | 4 | 4 | 2 | 26 |
| 封闭性与外壳 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | 9 |
| 支撑与悬空 | 1 | 1 | 2 | 1 | 2 | 1 | — | 3 | 11 |
| 光照 | 1 | 1 | 1 | 1 | — | 1 | 1 | 1 | 7 |
| 家具与内饰 | — | 2 | — | — | 2 | — | 1 | — | 5 |
| 尺寸与比例 | 1 | 1 | 1 | 1 | 1 | — | 1 | 1 | 7 |
| 材质与状态 | — | 1 | 1 | 1 | — | 1 | 1 | — | 5 |
| 确定性与导出 | 2 | 2 | 1 | 1 | 1 | 1 | 1 | 1 | 10 |
| 其它 | 1 | 1 | 2 | 1 | — | — | — | 1 | 6 |
八个 build 无一例外都覆盖了『可达性与流线』『封闭性与外壳』『支撑与悬空』『确定性与导出』这四类, 这正是 AGENTS.md 和 PROMPT.md 明确要求的四类。超出要求自发写的主要是『光照』与『家具与内饰』, 而这两类恰好是渲染图看不出来的——模型知道哪些东西必须靠测试兜。
root-house — 11 个测试 / 360 行 / test_structure.pytest_version_region_size_and_vanilla_states 尺寸与比例test_complete_doors_beds_and_double_plants 可达性与流线test_closed_envelope_separates_all_room_air_from_sky 封闭性与外壳test_every_room_and_floor_reachable_with_headroom 可达性与流线test_decorations_supported_and_foliage_connected 支撑与悬空test_window_and_door_openings_remain_clear 可达性与流线test_all_living_zones_have_nearby_light_and_furnishings 光照test_inventory_nbt_survives_export 确定性与导出test_generator_reruns_without_arguments_and_is_byte_reproducible 确定性与导出test_bucket_frame_is_attached_and_contains_bucket 其它test_household_utilities_accessible 可达性与流线
sandstone-cottage — 14 个测试 / 313 行 / test_structure.pytest_single_region_version_size_and_metadata 尺寸与比例test_all_states_are_vanilla_1211 材质与状态test_matching_complete_doors 可达性与流线test_complete_beds 家具与内饰test_every_room_and_outside_approach_reachable 可达性与流线test_every_usable_floor_cell_reachable 可达性与流线test_stairs_have_correct_rise_and_clearance 可达性与流线test_envelope_separates_all_inside_air_from_sky 封闭性与外壳test_windows_are_clear_and_have_views 其它test_decorations_are_supported 支撑与悬空test_room_lights_near_the_floor 光照test_required_materials_and_furniture 家具与内饰test_boat_entity_survived_export 确定性与导出test_clean_directory_generation_is_reproducible 确定性与导出
stone-cottage — 11 个测试 / 331 行 / test_cottage.pytest_java_version_one_region_scale_and_palette 尺寸与比例test_complete_door_and_recess 可达性与流线test_complete_supported_bed 支撑与悬空test_main_room_and_loft_reachable_with_headroom 可达性与流线test_closed_envelope_and_solid_roof_backing 封闭性与外壳test_clear_windows_and_continuous_wood_frame 其它test_decorations_have_support 支撑与悬空test_lighting_covers_both_floors 光照test_material_variation_and_single_gable 材质与状态test_block_entity_round_trip 其它test_clean_directory_rerun_is_byte_identical 确定性与导出
red-roof-farmstead — 10 个测试 / 346 行 / test_farmstead.pytest_single_region_version_and_scale 尺寸与比例test_all_blockstates_exist_in_java_1211 材质与状态test_export_round_trip_and_clean_directory_reproducibility 确定性与导出test_doors_beds_and_double_plants_are_complete 可达性与流线test_every_floor_and_work_area_is_reachable 可达性与流线test_interior_envelope_has_no_connection_to_sky 封闭性与外壳test_windows_and_doorway_have_clear_openings 可达性与流线test_decorations_have_support_and_structure_is_anchored 支撑与悬空test_each_room_has_nearby_floor_lighting 光照test_farm_features_and_four_sails 其它
stilt-water-cabin — 10 个测试 / 397 行 / test_cabin.pytest_one_region_version_scale_and_valid_vanilla_states 尺寸与比例test_timber_platform_and_piles_leave_water_visible 支撑与悬空test_deck_landing_and_every_room_floor_reachable 可达性与流线test_doors_and_bed_are_complete_matching_pairs 可达性与流线test_all_room_and_attic_air_is_separated_from_sky 家具与内饰test_windows_and_door_openings_stay_clear 可达性与流线test_roof_overhang_and_lighting 封闭性与外壳test_decorations_have_real_support 支撑与悬空test_saved_boat_and_stocked_containers 家具与内饰test_clean_directory_rerun_is_byte_identical 确定性与导出
stilted-manor — 9 个测试 / 286 行 / test_structure.pytest_export_contract_and_all_states 材质与状态test_reproducible_roundtrip 确定性与导出test_complete_doors_and_beds 可达性与流线test_all_rooms_reachable_with_two_blocks_headroom 可达性与流线test_envelope_sealed_including_nonfull_roof_blocks 封闭性与外壳test_supported_decorations_and_ladders 可达性与流线test_windows_and_doorways_clear 可达性与流线test_real_overhang_and_braced_support 支撑与悬空test_rooms_have_nearby_lighting 光照
merchant-manor — 10 个测试 / 408 行 / test_manor.pytest_format_scale_and_vanilla_states 尺寸与比例test_doors_and_beds_are_complete 可达性与流线test_all_rooms_and_front_stairs_are_reachable 可达性与流线test_closed_envelope 封闭性与外壳test_windows_and_entry_clearance 可达性与流线test_lighting_near_each_room_floor 光照test_decoration_support_and_ladders 可达性与流线test_stocked_containers_frames_and_lectern_nbt 家具与内饰test_chimney_smoke_and_required_material_families 材质与状态test_rerun_is_byte_reproducible_and_reload_exact 确定性与导出
mediterranean-villa — 11 个测试 / 419 行 / test_villa.pytest_version_region_bounds_and_vanilla_states 尺寸与比例test_doors_complete_supported_and_clear 可达性与流线test_beds_complete_and_supported 支撑与悬空test_all_rooms_and_terraces_reachable_with_headroom 可达性与流线test_envelope_separates_all_interior_air_from_sky 封闭性与外壳test_all_decorations_have_support 支撑与悬空test_foliage_is_connected_to_structure_or_ground 支撑与悬空test_windows_clear_and_roofs_separate 封闭性与外壳test_room_furnishings_lights_and_serialized_contents 光照test_pool_and_open_pergolas 其它test_rerun_is_byte_reproducible_and_matches_deliverable 确定性与导出
从产物本身数出来的方块名分布(不含空气)。八个建筑用到 203 种不同方块。
| build | 方块名数 | 用量前六 | 只有它用的方块(前六) |
|---|---|---|---|
root-house |
52 | dark_oak_log 727stripped_dark_oak_log 653dirt 332stone 330grass_block 310cobblestone 270 |
brown_stained_glass, loom, stone_pressure_plate |
sandstone-cottage |
72 | stone 1,955spruce_planks 658smooth_sandstone 597dirt 343grass_block 339smooth_sandstone_stairs 296 |
tuff, birch_leaves, sand, polished_granite, polished_granite_slab, birch_log |
stone-cottage |
44 | grass_block 220stripped_oak_log 154andesite 81cobblestone 58andesite_stairs 47spruce_planks 41 |
stone_stairs, andesite_slab, brown_terracotta, sunflower, potted_dandelion |
red-roof-farmstead |
73 | dirt 1,600grass_block 1,348stone 875cobblestone 517spruce_planks 491andesite 487 |
mangrove_planks, mangrove_stairs, red_nether_bricks, red_nether_brick_stairs, farmland, wheat |
stilt-water-cabin |
40 | water 1,074mud 379dirt 272oak_planks 235spruce_planks 232oak_log 231 |
mud, seagrass, sugar_cane, lily_pad, potted_spruce_sapling |
stilted-manor |
64 | dirt 1,049grass_block 880spruce_planks 806stone_bricks 796stripped_spruce_log 743stone_brick_stairs 442 |
spruce_leaves, mossy_stone_brick_stairs, flowering_azalea, anvil, cobblestone_wall |
merchant-manor |
78 | spruce_planks 1,271stone_bricks 798grass_block 762smooth_sandstone 455stripped_spruce_log 408cobblestone 335 |
cobbled_deepslate_stairs, cobbled_deepslate, deepslate_bricks, deepslate_tiles, polished_andesite, deepslate_tile_stairs |
mediterranean-villa |
87 | dirt 1,069diorite 995grass_block 830smooth_quartz 567oak_planks 375white_concrete 347 |
smooth_quartz, white_concrete, calcite, orange_terracotta, light_blue_terracotta, jungle_leaves |
八个 build 都用到的方块(4 种):barrel, grass_block, lantern, spruce_slab。
这批是地基和填充用的通用件,说明八个任务在『骨架材料』上是趋同的,差异全在饰面层。
八份 generate.py 全部从同一个 template_generator.py 出发。
下表列出在两个以上 build 里出现过的函数名:模板自带的 10 个全员保留,
另外 24 个是模型自己发明并且撞名的。
| 函数名 | root-house | sandstone-cottage | stone-cottage | red-roof-farmstead | stilt-water-cabin | stilted-manor | merchant-manor | mediterranean-villa | 出现 |
|---|---|---|---|---|---|---|---|---|---|
main | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 8 |
shell | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 8 |
box | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 8 |
inside | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 8 |
build | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 8 |
get | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 8 |
put | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 8 |
material | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 8 |
texture | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 8 |
__init__ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 8 |
export | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 8 |
verify | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 8 |
terrain | ✓ | ✓ | — | ✓ | — | ✓ | ✓ | — | 5 |
roof | — | ✓ | ✓ | — | ✓ | ✓ | — | ✓ | 5 |
door | — | ✓ | — | — | — | ✓ | ✓ | ✓ | 4 |
garden | ✓ | — | ✓ | — | — | ✓ | — | — | 3 |
structure | — | ✓ | — | — | ✓ | — | — | ✓ | 3 |
p | — | — | — | ✓ | — | — | ✓ | ✓ | 3 |
mix | — | — | — | ✓ | — | — | ✓ | ✓ | 3 |
fill | — | — | — | ✓ | — | — | ✓ | ✓ | 3 |
orient_front | ✓ | — | — | — | — | — | ✓ | — | 2 |
furnish | ✓ | — | — | — | ✓ | — | — | — | 2 |
lantern | — | ✓ | — | — | — | ✓ | — | — | 2 |
slab | — | ✓ | — | — | — | ✓ | — | — | 2 |
interiors | — | ✓ | — | — | — | — | — | ✓ | 2 |
furnishings | — | — | — | ✓ | — | ✓ | — | — | 2 |
connect_fences | — | — | — | ✓ | ✓ | — | — | — | 2 |
greenery | — | — | — | ✓ | — | — | ✓ | — | 2 |
inventory | — | — | — | — | ✓ | — | — | ✓ | 2 |
timber | — | — | — | — | — | ✓ | ✓ | — | 2 |
planter | — | — | — | — | — | ✓ | — | ✓ | 2 |
bed | — | — | — | — | — | ✓ | ✓ | — | 2 |
window | — | — | — | — | — | — | ✓ | ✓ | 2 |
frame | — | — | — | — | — | — | ✓ | ✓ | 2 |
模板自带:shell, box, inside, build, get, put, material, texture, export, verify。
自发撞名:main, __init__, terrain, roof, door, garden, structure, p, mix, fill, orient_front, furnish, lantern, slab, interiors, furnishings, connect_fences, greenery, inventory, timber, planter, bed, window, frame。
root-house/generate.py — 632 行root-house/render.mjs — 74 行sandstone-cottage/generate.py — 558 行sandstone-cottage/render.mjs — 73 行stone-cottage/generate.py — 407 行stone-cottage/render.mjs — 73 行red-roof-farmstead/generate.py — 589 行red-roof-farmstead/render.mjs — 73 行stilt-water-cabin/generate.py — 459 行stilt-water-cabin/render.mjs — 73 行stilted-manor/generate.py — 678 行stilted-manor/render.mjs — 74 行merchant-manor/generate.py — 850 行merchant-manor/render.mjs — 73 行mediterranean-villa/generate.py — 782 行mediterranean-villa/render.mjs — 72 行| build | 第几个请求首次渲染 | 第几个请求首次测试 | 渲染请求数 | 测试请求数 | 留下的渲染图 |
|---|---|---|---|---|---|
root-house | 6 | 9 | 4 | 7 | 7 |
sandstone-cottage | 7 | 11 | 3 | 4 | 6 |
stone-cottage | 9 | 16 | 4 | 3 | 6 |
red-roof-farmstead | 5 | 10 | 5 | 3 | 6 |
stilt-water-cabin | 9 | 14 | 4 | 4 | 5 |
stilted-manor | 4 | 9 | 5 | 7 | 8 |
merchant-manor | 7 | 11 | 6 | 9 | 9 |
mediterranean-villa | 7 | 12 | 5 | 4 | 7 |
共同骨架。八个 run 都走同一条路:先 rg 列文件、cat 读 AGENTS.md 和两个模板,
把模板复制成 generate.py 和 render.mjs;接着去 blocks.json 里查这次要用的方块和它们的
state 合法值;然后把建造方法写成一个大块、拼进 Build 类;跑一次生成,渲染四视图,
用 cutaway.py 切开看室内;之后才开始写测试,并在测试失败与改生成器之间来回,直到全绿。
分歧一:怎么把代码写进文件。七个 run 用 shell heredoc——先把方法体写到 /tmp/*.py,
再用一段 python 把它 splice 进 generate.py。只有 stone-cottage 用了 CLI 自带的 patch 工具,
直接下 unified diff。后者在 trace 里看不到命令,只看到 FileChange 记录,
也因此它的『写生成器』阶段吃掉了 27k 新增输入,是八个里最高的。
分歧二:先看图还是先测试。八个都是先渲染后测试,但间隔差别很大: merchant-manor 在第 10 个请求就开始写测试,之后有 11 个请求在测试上; stilted-manor 拖到第 9 个请求,但渲染请求多达 6 次,它更依赖看图定形。 看图多的那几个(stilted-manor、mediterranean-villa、merchant-manor)也正好是留下渲染图最多的。
分歧三:室内的处理。prompt 只给一张外观图,室内全靠模型自己设计。
八个 run 都用 cutaway.py 切层看内部,说明『看不见的地方要自己检查』这条已经内化;
但只有一半在测试里写了家具与内饰相关的断言,另一半靠渲染肉眼过。
共同的收尾。八个 run 的最后一个请求都是纯文字交付说明,格式高度一致:一句完成, 一组指向产物、生成器、测试、渲染图的链接,一句『所有测试通过』,一句『没有未完成项』。 这是 PROMPT.md 里没要求的格式,模型自己固定下来的。
put() 里。三个 build 撞上 changed on reload,
原因都是同一坐标写两次,而错误要等到导出并重载之后才暴露。模板应当在写入时就报,
并把两次写入的调用点都打出来。这是本轮唯一由工具缺陷直接造成的失败类别。cutaway.py 的用法提到更前面。八个 run 都用了它,但都是在第一次渲染之后才想起来,
说明它现在的位置偏后。室内是这一轮的核心要求,切片应该和四视图渲染并列成为默认动作。cat 整个 sketch.py),
『探索』阶段的新增输入还能再降。report.json 现在记 toolset 名与每个工具文件的 sha256,
workspace_code 标每个文件是 seeded / edited / agent,统计模型代码量时按 diff 算。