homemaker-layout/examples/health-centre/patterns.config
Claude 4931070602
Outdoor space: enforce the per-level rule, drop the fraction
Owner: "maybe plot_ratio is having unintended consequences, Alexander simply
says that all levels should have accessible outside space, he doesn't say how
much."

Both halves are right, and the codebase had the two rules the wrong way round.

ratio_outside is a gaussian on the outdoor FRACTION, applied as a whole-building
multiplier, and its declared targets have no stated basis and contradict each
other: health-centre targets 0.06 and sits at 0.096-0.129, so it is penalised
x0.39-x0.77 for having too MUCH; programme-house targets 0.30 and sits at
0.098-0.293, penalised x0.40-x0.999 for having too LITTLE. Penalties as large as
the ratio_circulation ones 39.24 removed, pulling two programmes in opposite
directions on the same quantity.

force_roof_garden already implements the rule Alexander actually states -- per
level, no outdoor space at all is a hard fail, no quantity attached. It has
existed all along and was switched OFF in every corpus config.

Near-miss worth recording: measuring first, I found zero "no outside space"
fails across the twelve baseline runs and briefly read that as the requirement
being met everywhere. It meant the check never ran. Same shape as 39.20's parity
tests -- no failures from a test that is not executing looks exactly like no
failures from a test that passes, and the tell was again the config, not the
code.

Enabled, it bites on 4 of 25 baseline levels: maple s0 level 1, and
programme-house level 0 in all three seeds. A house with no outdoor space on its
own ground floor is a fair criticism of the layout, and exactly what a
building-level fraction cannot catch, since 22% outdoor concentrated on one
storey satisfies it perfectly.

The upper side ratio_outside used to provide is covered in a better currency by
the minimum-internal-area factor (internal area >= 1.2x the programme's declared
room area), which is live -- binding on harbor s0 x0.920 and programme-house s0
x0.787.

This is the one change in 39.22-39.25 whose risk is NOT measured: nothing here
proves the outdoor fraction will not drift up once the search is free to raise
it, and outdoor space is profitable (1.64 return against a room's 0.66). The
re-baseline (bk9) is what shows it, and 39.25 asks for the fraction to be
recorded there.

4 hard fails added, none removed. 426 passed.

Refs homemaker-py-hxi.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-09-06 15:41:22 +00:00

384 lines
7.3 KiB
Text

---
# Health Centre - Non-synthetic third example programme (homemaker-py-9yx)
#
# y51's synthetic n=10/14/18/22 sweep (DESIGN.md 24, extended by xyu 31) scales
# room count by duplicating a handful of already-interchangeable programme-house
# codes (b1/t1/b2/t2/l1) via `count:`. harbor-house has real room-type diversity
# (16 distinct codes) but is out of range at 37 room instances, and its own
# result stayed null-to-negative -- so it cannot distinguish "the effect needs
# more rooms than harbor-house has" from "the effect never existed outside the
# duplicated-code mechanism". This programme fills the gap: a genuinely
# different building type (a small primary-care health centre, not a house or
# a dormitory/co-housing facility) with 19 distinct, individually-sized room
# codes at n=20 room instances -- matching xyu's own n=18 test point without
# leaning on `count:` as the scaling knob (only one deliberate, realistic
# duplication: two public WCs).
#
# Code conventions (per maple-court, homemaker-py-leu.1): generic c/o/s are
# reserved for circulation / outside / sahn in fitness.py's get_space_params
# (any code starting with 's' silently falls back to the *_outside defaults
# instead of its own size/width/proportion targets) -- so no room code here
# starts with c, o, or s.
# Building programme: small primary-care health centre
spaces:
# ---- PUBLIC / RECEPTION ----
rc1:
usage: none
name: Reception
size:
- 10.0
- 2.0
width:
- 2.9
- 0.6
proportion:
- 1.6
- 0.5
level: 0
adjacency:
- c
- o
wa1:
usage: none
name: Waiting Room
size:
- 28.0
- 5.0
width:
- 5.0
- 1.0
proportion:
- 1.8
- 0.5
level: 0
adjacency:
- c
- o
- rc1
ph1:
usage: bedroom
name: Pharmacy / Dispensary
size:
- 12.0
- 2.0
width:
- 3.1
- 0.6
proportion:
- 1.6
- 0.5
level: 0
adjacency:
- c
- o
- wa1
# ---- CLINICAL ----
gp1:
usage: bedroom
name: GP Consulting Room
size:
- 14.0
- 2.0
width:
- 3.2
- 0.6
proportion:
- 1.4
- 0.4
adjacency:
- c
ms1:
usage: bedroom
name: Minor Surgery Room
size:
- 20.0
- 3.0
width:
- 4.7
- 0.8
proportion:
- 1.3
- 0.4
adjacency:
- c
# homemaker-py-1s3 (§26 path b): two similar-scale clinical procedure
# rooms, flexible enough to double up in a small practice.
co_locate:
- de1
de1:
usage: bedroom
name: Dental Surgery
size:
- 18.0
- 3.0
width:
- 4.6
- 0.7
proportion:
- 1.5
- 0.4
adjacency:
- c
- zt1
co_locate:
- ms1
zt1:
usage: utility
name: Sterilisation Room
size:
- 6.0
- 1.0
width:
- 1.6
- 0.4
proportion:
- 1.6
- 0.4
adjacency:
- c
- de1
pt1:
usage: bedroom
name: Physiotherapy Room
size:
- 24.0
- 4.0
width:
- 4.8
- 0.8
proportion:
- 1.6
- 0.5
adjacency:
- c
qr1:
usage: bedroom
name: Counselling Room
size:
- 9.0
- 1.5
width:
- 2.6
- 0.5
proportion:
- 1.4
- 0.4
adjacency:
- c
tr1:
usage: bedroom
name: Treatment Room
size:
- 16.0
- 2.5
width:
- 3.3
- 0.6
proportion:
- 1.4
- 0.4
adjacency:
- c
# ---- ADMIN / STAFF ----
mo1:
usage: bedroom
name: Manager's Office
size:
- 10.0
- 1.5
width:
- 2.8
- 0.5
proportion:
- 1.5
- 0.4
adjacency:
- c
# homemaker-py-1s3: a small practice's manager's office and admin office
# are a natural loose-fit pairing.
co_locate:
- ao1
ao1:
usage: bedroom
name: Admin Office
size:
- 14.0
- 2.0
width:
- 3.0
- 0.6
proportion:
- 1.6
- 0.5
adjacency:
- c
co_locate:
- mo1
- br1
re1:
crinkliness: none # no window needed
usage: utility
name: Records Room
size:
- 7.0
- 1.0
width:
- 1.7
- 0.4
proportion:
- 1.6
- 0.4
adjacency:
- c
- ao1
co_locate:
- dp1
br1:
usage: living
name: Staff Room
size:
- 16.0
- 2.5
width:
- 3.4
- 0.6
proportion:
- 1.5
- 0.4
adjacency:
- c
co_locate:
- ao1
kt1:
usage: kitchen
name: Staff Kitchenette
size:
- 8.0
- 1.5
width:
- 2.7
- 0.4
proportion:
- 1.5
- 0.4
adjacency:
- c
- br1
# ---- SERVICE ----
me1:
crinkliness: none # no window needed
usage: utility
name: Plant / Mechanical Room
size:
- 9.0
- 1.5
width:
- 1.9
- 0.4
proportion:
- 1.7
- 0.4
adjacency:
- c
dp1:
crinkliness: none # no window needed
usage: utility
name: General Storage
size:
- 8.0
- 1.5
width:
- 1.8
- 0.4
proportion:
- 1.7
- 0.4
adjacency:
- c
co_locate:
- re1
t9:
usage: toilet
name: Public WC
size:
- 4.0
- 0.8
width:
- 1.5
- 0.3
proportion:
- 1.6
- 0.4
adjacency:
- c
count: 2
t10:
usage: toilet
name: Staff WC
size:
- 3.0
- 0.6
width:
- 1.4
- 0.3
proportion:
- 1.6
- 0.4
adjacency:
- c
# Building constraints
storey_minimum: 1
storey_limit: 2
# homemaker-py-hxi (DESIGN.md §39.25): ENABLED. Fails a level that has no
# outdoor space at all -- Alexander's actual requirement, per level and with no
# quantity attached. It had been off in every corpus config, so the only thing
# expressing outdoor space was ratio_outside's arbitrary fraction.
force_roof_garden: 1
# homemaker-py-hxi (DESIGN.md §39.24): disabled. The score is value/cost, a
# ratio, so the per-m2 economics (circulation worth 50 against a build cost of
# 200) is ALREADY a proportional pressure against circulation -- this said the
# same thing a second time, and with a curve where twice the corridor is far
# more than twice as bad. Its other side, "a building needs some circulation",
# was worth at most 13% here and is enforced structurally anyway by the access
# and connectivity checks. Set a [target, sigma] pair to re-enable.
ratio_circulation:
# homemaker-py-hxi (DESIGN.md §39.25): disabled. Alexander says every level
# should have accessible outside space; he does not say how much. The
# qualitative requirement is force_roof_garden below. Set a [target, sigma]
# pair to re-enable this quantitative one.
ratio_outside:
staircase_min: 1
staircase_max: 2
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