homemaker-layout/examples/harbor-house/patterns.config
Claude 109849e438
A terrace is no longer worth more per m2 than a real internal room
Owner's ruling. Measured over the twelve baseline layouts as realised value per
m2 (rate x quality, not the rate alone):

  as shipped before this   room  67.0   terrace 294.6   violates, 4.39x
  value_supported=100 only room  67.0   terrace  98.2   violates, 1.46x
  geometric mean only      room 132.9   terrace 296.8   violates, 2.23x
  both                     room 132.9   terrace  98.9   satisfies

The 4.4x is roughly 2.2x aggregation and 2.0x rate, so neither half alone is
enough. That is why 39.18's geometric-mean aggregation moves from default-OFF
to default-ON here rather than waiting on its own A/B: it is not an optional
improvement, it is half of a ruling.

value_supported 300 -> 100, and set to value_outside rather than to a number
that makes the inequality come out -- back-solving from the corpus's measured
mean room quality would rot the moment either changed. Outdoor space is worth
the same to an occupant whatever level it sits on; the real difference between
a ground garden and a roof terrace is what it takes to BUILD, and cost already
says that (outside 10.0 vs outside_supported 110.0). Value describes worth,
cost describes structure, and the level belongs in the second.

Changed in CONF_DEFAULTS and the four corpus patterns.config files, which all
declared 300.0 explicitly. NOT changed in harbor-house-l0 (a shape-curve test
fixture) or y51-sweep-* (historical fixtures that exist to reproduce past
measurements) -- repricing those would destroy what they are for.

Neither change can move a fail, structurally rather than luckily: value rates
never enter fail emission, and evaluate_leaf emits each fail from its factor
before anything is combined. Verified corpus-wide: identical fail sets, scores
+11% to +169% (and -5% once, on a layout that is mostly terrace).

tests/test_terrace_value_ruling.py pins the ruling as an invariant of the
objective, and asserts that reverting the aggregation breaks it again, so
neither half can be quietly dropped.

The 500k cold-start baseline (39.12) is superseded -- this changes what "good"
means. The layouts stay valid and their fail counts are unchanged, but a fresh
corpus run is needed before any new number is compared with them.

Still untouched: circulation returns 0.07 per unit cost against a room's 0.66,
by far the worst thing a building can contain. That is homemaker-py-hxi.

Refs homemaker-py-ecx.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-09-05 19:25:02 +00:00

292 lines
4.9 KiB
Text

---
# Harbor House - Programme-driven building evolution (Simplified)
# Two-story community living facility for 50+ residents
# Using anonymous interchangeable rooms to reduce complexity
# Building programme: community living spaces
spaces:
# GROUND FLOOR - Main Community Areas
cr1:
usage: living
name: Common Room with Fireplace
size:
- 80.0
- 10.0
width:
- 6.0
- 1.5
proportion:
- 2.0
- 0.5
level: 0
adjacency:
- c
- o
ef1:
usage: none
name: Entrance Foyer
size:
- 15.0
- 3.0
width:
- 3.0
- 0.5
level: 0
adjacency:
- c
# homemaker-py-1s3 (§26 path b): a foyer can double as an informal meeting
# nook (Stewart Brand "loose-fit") — declared here, validated against
# interchangeable()'s S1-S4 bounds before it's ever honoured.
co_locate:
- m
da1:
usage: living
name: Dining Area
size:
- 60.0
- 8.0
width:
- 5.0
- 1.0
proportion:
- 2.5
- 0.8
level: 0
adjacency:
- c
- k1
- o
k1:
usage: kitchen
name: Kitchen
size:
- 30.0
- 5.0
width:
- 4.0
- 1.0
level: 0
adjacency:
- da1
- c
# SLEEPING AREAS - Anonymous neighborhoods (5 total, 2 ground + 3 first)
n:
usage: bedroom
name: Neighborhood
size:
- 60.0
- 8.0
width:
- 5.0
- 1.0
proportion:
- 2.0
- 0.6
adjacency:
- c
count: 5
# GROUND FLOOR - Activity Spaces
ws1:
usage: living
name: Workshop Space
size:
- 40.0
- 6.0
width:
- 5.0
- 1.0
proportion:
- 1.8
- 0.5
level: 0
adjacency:
- c
- o
# MEETING ROOMS - Anonymous interchangeable (3 total)
m:
usage: living
name: Meeting Room
size:
- 10.0
- 2.0
width:
- 2.5
- 0.5
level: 0
adjacency:
- c
count: 3
co_locate:
- ef1
# GROUND FLOOR - Service Areas
# BATHROOMS - Ground floor (3 total)
t:
usage: toilet
name: Bathroom
size:
- 6.0
- 1.5
width:
- 2.0
- 0.5
adjacency:
- c
- n # Brand: a WC beside sleeping space can be knocked through later
count: 6 # 3 ground + 3 first floor
la1:
usage: utility
name: Laundry Room
size:
- 20.0
- 4.0
width:
- 3.0
- 0.8
level: 0
adjacency:
- c
# homemaker-py-1s3: laundry and plant/M&E rooms are both "back of house"
# utility space — a common real loose-fit pairing.
co_locate:
- me1
st1:
crinkliness: none # no window needed
usage: utility
name: Ground Floor Storage
size:
- 22.0
- 4.0
width:
- 3.0
- 0.8
level: 0
adjacency:
- c
me1:
crinkliness: none # no window needed
usage: utility
name: Mechanical/Electrical Room
size:
- 25.0
- 4.0
width:
- 3.5
- 0.8
level: 0
adjacency:
- c
co_locate:
- la1
# STAFF OFFICES - Anonymous (2 total)
of:
usage: bedroom
name: Staff Office
size:
- 12.5
- 2.5
width:
- 2.5
- 0.5
level: 0
adjacency:
- c
count: 2
# FIRST FLOOR - Community Areas
li1:
usage: living
name: Library Corner
size:
- 20.0
- 4.0
width:
- 3.5
- 0.8
level: 1
adjacency:
- c
# FIRST FLOOR - Individual Rooms (10 anonymous rooms)
r:
usage: bedroom
name: Individual Room
size:
- 10.0
- 2.0
width:
- 2.5
- 0.5
level: 1
adjacency:
- c
count: 10
# FIRST FLOOR - Storage
st2:
crinkliness: none # no window needed
usage: utility
name: First Floor Storage
size:
- 18.0
- 3.5
width:
- 3.0
- 0.8
level: 1
adjacency:
- c
ut1:
crinkliness: none # no window needed
usage: utility
name: Utilities Closet
size:
- 14.0
- 3.0
width:
- 2.5
- 0.6
level: 1
adjacency:
- c
# Building constraints
storey_minimum: 2
storey_limit: 3
force_roof_garden: 0
# Circulation ratio (allow more circulation for larger building)
ratio_circulation:
- 0.08
- 0.15
# Outside space ratio (courtyard requirement)
ratio_outside:
- 0.15
- 0.10
# Staircase requirements (main + secondary)
staircase_min: 2
staircase_max: 2
# Economic parameters
value_inside: 300.0
value_circulation: 50.0
value_outside: 100.0
# homemaker-py-ecx (DESIGN.md §39.19): an upper-level terrace is worth what
# outdoor space is worth (value_outside); it is the COST that differs by level
# (outside 10.0 vs outside_supported 110.0), not the value. At 300.0 -- the
# `value_inside` rate -- a terrace was worth more per square metre than a real
# internal room, which the owner ruled out.
value_supported: 100.0