Files
editor/packages/mcp/test-reports/casa-sol/DESIGN.md
T
Adrian PerezandClaude Opus 4.7 a2e287144b 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>
2026-04-18 18:34:49 +02:00

5.1 KiB
Raw Blame History

Casa del Sol — design brief

A single-story 3-bedroom, 2-bathroom house with a swimming pool and a privacy-screened perimeter, built entirely via @pascal-app/mcp HTTP tools against a fresh scene.

Lot

  • Site polygon: 20 × 15 m rectangle centred at origin → corners (10, 7.5) to (10, 7.5).
  • Origin axes: +x = east, +z = south (core convention; floor plane is xz).

Building envelope

  • Footprint: 12 × 8 m, centred west-of-origin at about (2, 0).
  • Wall thickness: 0.2 m. Wall height: 2.7 m.
  • Floor elevation: 0. Single storey.

Interior rooms (zones)

Origin for interior: building SW corner at (8, 4). All rooms span the 8 m building depth somehow.

Room Footprint (x × z) Polygon corners
Living / dining 7 × 4 (8, 0) (1, 0) (1, 4) (8, 4)
Kitchen 5 × 4 (1, 0) ( 4, 0) ( 4, 4) (1, 4)
Bedroom 2 4 × 4 (8, 4) (4, 4) (4, 0) (8, 0)
Hallway 3 × 1 (4, 2) (1, 2) (1, 1) (4, 1)
Bathroom 2 3 × 2 (4, 4) (1, 4) (1, 2) (4, 2)
Bathroom 1 3 × 1 (4, 1) (1, 1) (1, 0) (4, 0)
Master bedroom 5 × 4 (1, 4) ( 4, 4) ( 4, 0) (1, 0)

Walls (perimeter + partitions, one wall per edge)

Perimeter (4):

  1. South outer: (8, 4) → (4, 4)
  2. North outer: (8, 4) → (4, 4)
  3. West outer: (8, 4) → (8, 4)
  4. East outer: (4, 4) → (4, 4)

Interior (partitions): 5. Living/Kitchen split: (1, 0) → (1, 4) 6. North bedrooms split: (1, 4) → (1, 0) 7. Bedroom 2 east wall: (4, 4) → (4, 0) 8. Hallway north edge: (4, 1) → (1, 1) 9. Hallway south edge: (4, 2) → (1, 2)

Openings (doors + windows)

All positions are normalised 0..1 along the wall (start → end).

Kind Wall Pos Width Height Purpose
door 1 (south outer) 0.20 0.9 2.1 Front entrance
door 1 (south outer) 0.75 2.2 2.1 Sliding glass to pool
door 2 (north outer) 0.65 0.9 2.1 Kitchen back door
door 6 (N-bedrooms split, middle) 0.30 0.8 2.1 Master bedroom door
door 7 (Bedroom 2 east wall) 0.50 0.8 2.1 Bedroom 2 door
door 9 (Hallway south edge) 0.50 0.7 2.0 Bathroom 2 door
window 1 (south outer, living) 0.30 2.0 1.4 Living picture window
window 1 (south outer, living) 0.45 1.4 1.4 Living window 2
window 3 (west outer) 0.25 1.0 1.1 Kitchen window
window 4 (east outer) 0.25 1.4 1.4 Master window
window 4 (east outer) 0.75 1.4 1.4 Bedroom 2 window
window 2 (north outer, bathroom 2) 0.30 0.8 0.6 Bathroom 2 high

(Core validates cut_opening arguments; if wall-endpoint geometry makes two openings collide, the tool returns an error and the script logs the conflict.)

Exterior elements

Swimming pool (east of house):

  • Zone polygon: (5, 1.5) (10, 1.5) (10, 1.5) (5, 1.5) — 5 × 3 m.
  • Metadata: { kind: "pool", depthM: 1.8, finish: "tile" }.
  • Additional slab at elevation 1.8 m to represent the pool basin (same polygon).

Privacy screen fence (lot perimeter):

  • Style: privacy, height 1.8 m.
  • Four fence segments around the 20 × 15 lot, with a 2 m gap at the south entrance (x ∈ [1, 1]).
  • Segments:
    1. South-west: (10, 7.5) → (1, 7.5)
    2. South-east: (1, 7.5) → (10, 7.5)
    3. East: (10, 7.5) → (10, 7.5)
    4. North: (10, 7.5) → (10, 7.5)
    5. West: (10, 7.5) → (10, 7.5)

Garden zone (everything that isn't building or pool):

  • One big zone labelled "garden" with the remaining polygon.

Success criteria

  • validate_scene returns valid: true, errors: 0 after every step.
  • Final node count ≥ 30 (1 site + 1 building + 1 level + ~14 walls + 5 fences + ~7 zones + 6 doors + 7 windows + 1 pool slab ≈ 43).
  • export_json produces a valid parseable JSON.
  • duplicate_level works (produces a second storey at the same layout).
  • Scene exports and imports cleanly: write the export to disk, unloadScene via the bridge (if exposed) or setScene from the export, re-validate.

Non-goals

  • Catalog items (no furniture — the catalog is unavailable in headless mode).
  • Realistic materials / textures (MCP doesn't set material; editor picks defaults).
  • Roof geometry — the roof system is render-only; we skip for v0.1.