Adrian Perez 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

92 lines
5.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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.