test(mcp): Casa del Sol — full house built end-to-end via MCP

Design and live-built a 3-bed 2-bath single-story house with pool and
privacy-screened perimeter ("Casa del Sol") using only @pascal-app/mcp
tools. Exercises every mutation tool in a realistic scenario.

- DESIGN.md: blueprint (lot 20x15, building 12x8, 7 interior zones,
  pool 5x3, 5 privacy fence segments)
- build.ts: MCP client orchestrator
- scene.json: full exported scene (26.7 KB)
- BUILD_REPORT.md: per-step status + final totals

Final scene: 39 nodes pre-duplicate (1 site, 1 building, 1 level,
9 walls, 9 zones, 6 doors, 6 windows, 5 fences, 1 slab), 76 nodes
post-duplicate_level, valid=true, errors=0.

Surfaced the documented StreamableHTTP single-session limitation:
the HTTP server at :3917 rejected the SDK client's initialize with
"Server already initialized" because the previous T3 session consumed
the transport's one-shot session slot. Build fell back to an in-memory
transport exercising the identical tool surface. Fix tracked for v0.2.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Adrian Perez
2026-04-18 18:34:49 +02:00
co-authored by Claude Opus 4.7
parent b37e88cb83
commit a2e287144b
5 changed files with 2439 additions and 0 deletions
@@ -0,0 +1,29 @@
[casa] connecting to http://localhost:3917/mcp via StreamableHTTPClientTransport
[casa] HTTP transport failed: Streamable HTTP error: Error POSTing to endpoint: {"jsonrpc":"2.0","error":{"code":-32600,"message":"Invalid Request: Server already initialized"},"id":null}
[casa] falling back to in-memory MCP server (same tool surface)
[casa] in-memory MCP server connected
[casa] step 01 discover ok (building=building_hhprs7o5kz0q2qo7, level=level_9ded0vdlfag09tdt, 1ms) ids: building_hhprs7o5kz0q2qo7, level_9ded0vdlfag09tdt
[casa] initial node count: 3
[casa] step 02 perimeter walls ok (4 walls via create_wall, 1ms) ids: wall_vc5l8mk2b3j3ukvq, wall_9jaybb53j2r5j5en, wall_a16b1eirqz5p9f98, wall_yiwfcyw716g5ql5y
[casa] step 03 interior walls ok (5 walls via apply_patch, 0ms) ids: wall_9vmyxyv2kea0t2vn, wall_53gr0rtp1ssmxvz2, wall_yzuosc4u4z0a9jqo, wall_eeogjzcwm711gzam, wall_3mznfrklw8ar7jrz
[casa] wall ids (by designId): {"1":"wall_vc5l8mk2b3j3ukvq","2":"wall_9jaybb53j2r5j5en","3":"wall_a16b1eirqz5p9f98","4":"wall_yiwfcyw716g5ql5y","5":"wall_9vmyxyv2kea0t2vn","6":"wall_53gr0rtp1ssmxvz2","7":"wall_yzuosc4u4z0a9jqo","8":"wall_eeogjzcwm711gzam","9":"wall_3mznfrklw8ar7jrz"}
[casa] validate after walls: valid=true, errors=0
[casa] step 04 zones ok (7 zones, 1ms) ids: zone_b51zjgfr0cgc7ncc, zone_x409m2lnw1jpmi8m, zone_and0s1ux5v8rexj6, zone_n8w3oyzr3c4ovcbu, zone_c1wa4cr91h215zzk, zone_e8e6qqmx85tockrm, zone_ebbidjjln9doosy5
[casa] validate after zones: valid=true, errors=0
[casa] step 05 openings ok (6 doors, 6 windows, 0 failures, 2ms)
[casa] validate after openings: valid=true, errors=0
[casa] step 06 pool zone+slab ok (zone=zone_av8rfpjgcpmpx4pb, basin slab=slab_tqyxze2hshzm1it3, 1ms) ids: zone_av8rfpjgcpmpx4pb, slab_tqyxze2hshzm1it3
[casa] validate after pool: valid=true, errors=0
[casa] step 07 privacy fences ok (5 fences via apply_patch, 0ms) ids: fence_hnhjl6vicj3fs234, fence_me6wvw6rf93y2um4, fence_af22csiukvc7gjyf, fence_lp6d7gkrado9z0cc, fence_a09o9w183o453oqh
[casa] validate after fences: valid=true, errors=0
[casa] step 08 garden zone ok (zone=zone_gtpdocou2nceicp9, 0ms) ids: zone_gtpdocou2nceicp9
[casa] step 09 measure cross-zone ok (distance=12.649m, 0ms) ids: wall_vc5l8mk2b3j3ukvq, fence_af22csiukvc7gjyf
[casa] step 10 export json ok (wrote 26761 bytes -> scene.json, 0ms)
[casa] step 11 duplicate level ok (newLevelId=level_zgyhyd1f4vtrm05v, cloned=37 nodes, 0ms) ids: level_zgyhyd1f4vtrm05v
[casa] validate after final: valid=true, errors=0
[casa] FINAL: totalNodes=76 walls=18 zones=18 doors=12 windows=12 fences=10 slabs=2 levels=2
[casa] pre-duplicate=39, post-duplicate=76
[casa] validation: valid=true, errors=0
[casa] wrote BUILD_REPORT.md
[casa] transport: in-memory (in-memory fallback — HTTP server returned: Streamable HTTP error: Error POSTing to endpoint: {"jsonrpc":"2.0","error":{"code":-32600,"message":"Invalid Request: Server already initialized"},"id":null})
[casa] DONE