Fix mutate_level_add: use generic C/O floor instead of room duplicate
Previously level_add copied the top storey exactly, duplicating all
named programme rooms and immediately triggering space-count failures
for every room on the new floor. The lex outer-search comparison
(-n_fails, score) then always rejected the multi-storey child because
its fail count was far higher than the single-storey parent.
Fix: retype all named-room leaves on the new storey to generic C or O
before admitting the child. The outer search then retypes them
incrementally via the normal retype operator. This allows level_add to
produce designs with the same fail count as the parent (storey_minimum
fail removed, no duplication fails added), making the multi-storey
transition visible to the lex selector.
Result on programme-house cold start (init.dom, 100k evals, 4 workers):
before: 6 fails, single-storey, stuck after 40k evals
after: 4 fails, two-storey, still improving at 100k
Also adds examples/harbor-house/ from urb/examples for future runs.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-14 10:33:05 +01:00
|
|
|
---
|
|
|
|
|
# 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
|
ju3: reject programme codes colliding with the c/o/s generic type prefixes
Closes homemaker-py-ju3. DESIGN.md §39.3.
The class: key from the bead's design was deliberately NOT built. Auditing
every use of the prefix rule first showed it runs deeper than c/o/s -- l/k/b/t
carry real adjacency semantics (graph.py builds bedroom<->toilet and
kitchen<->living relations from first characters) -- so re-plumbing the type
system would invalidate the whole corpus and every baseline, for a problem
whose damage is the silence, not the convention. Two findings made the smaller
fix sufficient: no corpus programme has ever declared a bare c/o/s code, so
check_space_counts' skip only ever discarded declared rooms; and nothing
references harbor's four codes in any adjacency or co_locate list.
- programme.validate_codes raises on a reserved-prefix code, with the full
explanation. Called from BOTH parse paths (programme._parse_spaces and
fitness.Fitness._load_programme parse conf["spaces"] independently, so
validating one would leave the other door open). l/k/b/t stay unreserved.
- harbor-house and harbor-house-l0 renamed: cr1->fr1, of->ao, st1->gs1,
st2->gs2. New prefixes are unused in harbor and semantically neutral, and
the two storage codes still share a prefix, preserving the structure
evaluate_building's per-code plot-ratio term depends on. name: unchanged.
- experiments/migrate_ju3_rename.py migrates .dom files written before the
rename (--check dry-runs). Pre-rename artefacts, notably evolved-3M*.dom,
must be migrated or their leaves read as unmatched generics.
- test_collapse_global's c/o/s exclusion test now uses a generic C leaf, which
is what the exclusion is actually for; it previously relied on a programme
code colliding, which is no longer possible.
Re-baseline (seed 1, 20k evals, same settings as §38's run): 57 fails against
the 32-instance effective programme -> 55 against the real 37-instance one,
with all five previously-lost room instances now placed inside their declared
sigma bands (fr1 87.2 vs declared 80, was 32.9/17.1; ao/gs1/gs2 were absent
entirely) and no failure naming any of the four codes. At one seed each,
57 vs 55 is within noise -- the robust result is the room placement, not the
count. Historical harbor numbers are not comparable to post-ju3 ones; filed
homemaker-py-t3s to restate 2v1's acceptance figure once evolved-3M is
migrated.
346 passed (+10 new), same 7 pre-existing fixture failures.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-26 09:06:08 +00:00
|
|
|
fr1:
|
Fix mutate_level_add: use generic C/O floor instead of room duplicate
Previously level_add copied the top storey exactly, duplicating all
named programme rooms and immediately triggering space-count failures
for every room on the new floor. The lex outer-search comparison
(-n_fails, score) then always rejected the multi-storey child because
its fail count was far higher than the single-storey parent.
Fix: retype all named-room leaves on the new storey to generic C or O
before admitting the child. The outer search then retypes them
incrementally via the normal retype operator. This allows level_add to
produce designs with the same fail count as the parent (storey_minimum
fail removed, no duplication fails added), making the multi-storey
transition visible to the lex selector.
Result on programme-house cold start (init.dom, 100k evals, 4 workers):
before: 6 fails, single-storey, stuck after 40k evals
after: 4 fails, two-storey, still improving at 100k
Also adds examples/harbor-house/ from urb/examples for future runs.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-14 10:33:05 +01:00
|
|
|
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:
|
|
|
|
|
name: Entrance Foyer
|
|
|
|
|
size:
|
|
|
|
|
- 15.0
|
|
|
|
|
- 3.0
|
|
|
|
|
width:
|
|
|
|
|
- 3.0
|
|
|
|
|
- 0.5
|
|
|
|
|
level: 0
|
|
|
|
|
adjacency:
|
|
|
|
|
- c
|
2026-07-31 00:16:12 +01:00
|
|
|
# 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
|
Fix mutate_level_add: use generic C/O floor instead of room duplicate
Previously level_add copied the top storey exactly, duplicating all
named programme rooms and immediately triggering space-count failures
for every room on the new floor. The lex outer-search comparison
(-n_fails, score) then always rejected the multi-storey child because
its fail count was far higher than the single-storey parent.
Fix: retype all named-room leaves on the new storey to generic C or O
before admitting the child. The outer search then retypes them
incrementally via the normal retype operator. This allows level_add to
produce designs with the same fail count as the parent (storey_minimum
fail removed, no duplication fails added), making the multi-storey
transition visible to the lex selector.
Result on programme-house cold start (init.dom, 100k evals, 4 workers):
before: 6 fails, single-storey, stuck after 40k evals
after: 4 fails, two-storey, still improving at 100k
Also adds examples/harbor-house/ from urb/examples for future runs.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-14 10:33:05 +01:00
|
|
|
|
|
|
|
|
da1:
|
|
|
|
|
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:
|
|
|
|
|
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:
|
|
|
|
|
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:
|
|
|
|
|
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:
|
|
|
|
|
name: Meeting Room
|
|
|
|
|
size:
|
|
|
|
|
- 10.0
|
|
|
|
|
- 2.0
|
|
|
|
|
width:
|
|
|
|
|
- 2.5
|
|
|
|
|
- 0.5
|
|
|
|
|
level: 0
|
|
|
|
|
adjacency:
|
|
|
|
|
- c
|
|
|
|
|
count: 3
|
2026-07-31 00:16:12 +01:00
|
|
|
co_locate:
|
|
|
|
|
- ef1
|
Fix mutate_level_add: use generic C/O floor instead of room duplicate
Previously level_add copied the top storey exactly, duplicating all
named programme rooms and immediately triggering space-count failures
for every room on the new floor. The lex outer-search comparison
(-n_fails, score) then always rejected the multi-storey child because
its fail count was far higher than the single-storey parent.
Fix: retype all named-room leaves on the new storey to generic C or O
before admitting the child. The outer search then retypes them
incrementally via the normal retype operator. This allows level_add to
produce designs with the same fail count as the parent (storey_minimum
fail removed, no duplication fails added), making the multi-storey
transition visible to the lex selector.
Result on programme-house cold start (init.dom, 100k evals, 4 workers):
before: 6 fails, single-storey, stuck after 40k evals
after: 4 fails, two-storey, still improving at 100k
Also adds examples/harbor-house/ from urb/examples for future runs.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-14 10:33:05 +01:00
|
|
|
|
|
|
|
|
# GROUND FLOOR - Service Areas
|
|
|
|
|
# BATHROOMS - Ground floor (3 total)
|
|
|
|
|
t:
|
|
|
|
|
name: Bathroom
|
|
|
|
|
size:
|
|
|
|
|
- 6.0
|
|
|
|
|
- 1.5
|
|
|
|
|
width:
|
|
|
|
|
- 2.0
|
|
|
|
|
- 0.5
|
|
|
|
|
adjacency:
|
|
|
|
|
- c
|
|
|
|
|
count: 6 # 3 ground + 3 first floor
|
|
|
|
|
|
|
|
|
|
la1:
|
|
|
|
|
name: Laundry Room
|
|
|
|
|
size:
|
|
|
|
|
- 20.0
|
|
|
|
|
- 4.0
|
|
|
|
|
width:
|
|
|
|
|
- 3.0
|
|
|
|
|
- 0.8
|
|
|
|
|
level: 0
|
|
|
|
|
adjacency:
|
|
|
|
|
- c
|
2026-07-31 00:16:12 +01:00
|
|
|
# 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
|
Fix mutate_level_add: use generic C/O floor instead of room duplicate
Previously level_add copied the top storey exactly, duplicating all
named programme rooms and immediately triggering space-count failures
for every room on the new floor. The lex outer-search comparison
(-n_fails, score) then always rejected the multi-storey child because
its fail count was far higher than the single-storey parent.
Fix: retype all named-room leaves on the new storey to generic C or O
before admitting the child. The outer search then retypes them
incrementally via the normal retype operator. This allows level_add to
produce designs with the same fail count as the parent (storey_minimum
fail removed, no duplication fails added), making the multi-storey
transition visible to the lex selector.
Result on programme-house cold start (init.dom, 100k evals, 4 workers):
before: 6 fails, single-storey, stuck after 40k evals
after: 4 fails, two-storey, still improving at 100k
Also adds examples/harbor-house/ from urb/examples for future runs.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-14 10:33:05 +01:00
|
|
|
|
ju3: reject programme codes colliding with the c/o/s generic type prefixes
Closes homemaker-py-ju3. DESIGN.md §39.3.
The class: key from the bead's design was deliberately NOT built. Auditing
every use of the prefix rule first showed it runs deeper than c/o/s -- l/k/b/t
carry real adjacency semantics (graph.py builds bedroom<->toilet and
kitchen<->living relations from first characters) -- so re-plumbing the type
system would invalidate the whole corpus and every baseline, for a problem
whose damage is the silence, not the convention. Two findings made the smaller
fix sufficient: no corpus programme has ever declared a bare c/o/s code, so
check_space_counts' skip only ever discarded declared rooms; and nothing
references harbor's four codes in any adjacency or co_locate list.
- programme.validate_codes raises on a reserved-prefix code, with the full
explanation. Called from BOTH parse paths (programme._parse_spaces and
fitness.Fitness._load_programme parse conf["spaces"] independently, so
validating one would leave the other door open). l/k/b/t stay unreserved.
- harbor-house and harbor-house-l0 renamed: cr1->fr1, of->ao, st1->gs1,
st2->gs2. New prefixes are unused in harbor and semantically neutral, and
the two storage codes still share a prefix, preserving the structure
evaluate_building's per-code plot-ratio term depends on. name: unchanged.
- experiments/migrate_ju3_rename.py migrates .dom files written before the
rename (--check dry-runs). Pre-rename artefacts, notably evolved-3M*.dom,
must be migrated or their leaves read as unmatched generics.
- test_collapse_global's c/o/s exclusion test now uses a generic C leaf, which
is what the exclusion is actually for; it previously relied on a programme
code colliding, which is no longer possible.
Re-baseline (seed 1, 20k evals, same settings as §38's run): 57 fails against
the 32-instance effective programme -> 55 against the real 37-instance one,
with all five previously-lost room instances now placed inside their declared
sigma bands (fr1 87.2 vs declared 80, was 32.9/17.1; ao/gs1/gs2 were absent
entirely) and no failure naming any of the four codes. At one seed each,
57 vs 55 is within noise -- the robust result is the room placement, not the
count. Historical harbor numbers are not comparable to post-ju3 ones; filed
homemaker-py-t3s to restate 2v1's acceptance figure once evolved-3M is
migrated.
346 passed (+10 new), same 7 pre-existing fixture failures.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-26 09:06:08 +00:00
|
|
|
gs1:
|
Fix mutate_level_add: use generic C/O floor instead of room duplicate
Previously level_add copied the top storey exactly, duplicating all
named programme rooms and immediately triggering space-count failures
for every room on the new floor. The lex outer-search comparison
(-n_fails, score) then always rejected the multi-storey child because
its fail count was far higher than the single-storey parent.
Fix: retype all named-room leaves on the new storey to generic C or O
before admitting the child. The outer search then retypes them
incrementally via the normal retype operator. This allows level_add to
produce designs with the same fail count as the parent (storey_minimum
fail removed, no duplication fails added), making the multi-storey
transition visible to the lex selector.
Result on programme-house cold start (init.dom, 100k evals, 4 workers):
before: 6 fails, single-storey, stuck after 40k evals
after: 4 fails, two-storey, still improving at 100k
Also adds examples/harbor-house/ from urb/examples for future runs.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-14 10:33:05 +01:00
|
|
|
name: Ground Floor Storage
|
|
|
|
|
size:
|
|
|
|
|
- 22.0
|
|
|
|
|
- 4.0
|
|
|
|
|
width:
|
|
|
|
|
- 3.0
|
|
|
|
|
- 0.8
|
|
|
|
|
level: 0
|
|
|
|
|
adjacency:
|
|
|
|
|
- c
|
|
|
|
|
|
|
|
|
|
me1:
|
|
|
|
|
name: Mechanical/Electrical Room
|
|
|
|
|
size:
|
|
|
|
|
- 25.0
|
|
|
|
|
- 4.0
|
|
|
|
|
width:
|
|
|
|
|
- 3.5
|
|
|
|
|
- 0.8
|
|
|
|
|
level: 0
|
|
|
|
|
adjacency:
|
|
|
|
|
- c
|
2026-07-31 00:16:12 +01:00
|
|
|
co_locate:
|
|
|
|
|
- la1
|
Fix mutate_level_add: use generic C/O floor instead of room duplicate
Previously level_add copied the top storey exactly, duplicating all
named programme rooms and immediately triggering space-count failures
for every room on the new floor. The lex outer-search comparison
(-n_fails, score) then always rejected the multi-storey child because
its fail count was far higher than the single-storey parent.
Fix: retype all named-room leaves on the new storey to generic C or O
before admitting the child. The outer search then retypes them
incrementally via the normal retype operator. This allows level_add to
produce designs with the same fail count as the parent (storey_minimum
fail removed, no duplication fails added), making the multi-storey
transition visible to the lex selector.
Result on programme-house cold start (init.dom, 100k evals, 4 workers):
before: 6 fails, single-storey, stuck after 40k evals
after: 4 fails, two-storey, still improving at 100k
Also adds examples/harbor-house/ from urb/examples for future runs.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-14 10:33:05 +01:00
|
|
|
|
|
|
|
|
# STAFF OFFICES - Anonymous (2 total)
|
ju3: reject programme codes colliding with the c/o/s generic type prefixes
Closes homemaker-py-ju3. DESIGN.md §39.3.
The class: key from the bead's design was deliberately NOT built. Auditing
every use of the prefix rule first showed it runs deeper than c/o/s -- l/k/b/t
carry real adjacency semantics (graph.py builds bedroom<->toilet and
kitchen<->living relations from first characters) -- so re-plumbing the type
system would invalidate the whole corpus and every baseline, for a problem
whose damage is the silence, not the convention. Two findings made the smaller
fix sufficient: no corpus programme has ever declared a bare c/o/s code, so
check_space_counts' skip only ever discarded declared rooms; and nothing
references harbor's four codes in any adjacency or co_locate list.
- programme.validate_codes raises on a reserved-prefix code, with the full
explanation. Called from BOTH parse paths (programme._parse_spaces and
fitness.Fitness._load_programme parse conf["spaces"] independently, so
validating one would leave the other door open). l/k/b/t stay unreserved.
- harbor-house and harbor-house-l0 renamed: cr1->fr1, of->ao, st1->gs1,
st2->gs2. New prefixes are unused in harbor and semantically neutral, and
the two storage codes still share a prefix, preserving the structure
evaluate_building's per-code plot-ratio term depends on. name: unchanged.
- experiments/migrate_ju3_rename.py migrates .dom files written before the
rename (--check dry-runs). Pre-rename artefacts, notably evolved-3M*.dom,
must be migrated or their leaves read as unmatched generics.
- test_collapse_global's c/o/s exclusion test now uses a generic C leaf, which
is what the exclusion is actually for; it previously relied on a programme
code colliding, which is no longer possible.
Re-baseline (seed 1, 20k evals, same settings as §38's run): 57 fails against
the 32-instance effective programme -> 55 against the real 37-instance one,
with all five previously-lost room instances now placed inside their declared
sigma bands (fr1 87.2 vs declared 80, was 32.9/17.1; ao/gs1/gs2 were absent
entirely) and no failure naming any of the four codes. At one seed each,
57 vs 55 is within noise -- the robust result is the room placement, not the
count. Historical harbor numbers are not comparable to post-ju3 ones; filed
homemaker-py-t3s to restate 2v1's acceptance figure once evolved-3M is
migrated.
346 passed (+10 new), same 7 pre-existing fixture failures.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-26 09:06:08 +00:00
|
|
|
ao:
|
Fix mutate_level_add: use generic C/O floor instead of room duplicate
Previously level_add copied the top storey exactly, duplicating all
named programme rooms and immediately triggering space-count failures
for every room on the new floor. The lex outer-search comparison
(-n_fails, score) then always rejected the multi-storey child because
its fail count was far higher than the single-storey parent.
Fix: retype all named-room leaves on the new storey to generic C or O
before admitting the child. The outer search then retypes them
incrementally via the normal retype operator. This allows level_add to
produce designs with the same fail count as the parent (storey_minimum
fail removed, no duplication fails added), making the multi-storey
transition visible to the lex selector.
Result on programme-house cold start (init.dom, 100k evals, 4 workers):
before: 6 fails, single-storey, stuck after 40k evals
after: 4 fails, two-storey, still improving at 100k
Also adds examples/harbor-house/ from urb/examples for future runs.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-14 10:33:05 +01:00
|
|
|
name: Staff Office
|
|
|
|
|
size:
|
|
|
|
|
- 12.5
|
|
|
|
|
- 2.5
|
|
|
|
|
width:
|
|
|
|
|
- 2.5
|
|
|
|
|
- 0.5
|
|
|
|
|
level: 0
|
|
|
|
|
adjacency:
|
|
|
|
|
- c
|
|
|
|
|
count: 2
|
|
|
|
|
|
|
|
|
|
# FIRST FLOOR - Community Areas
|
|
|
|
|
li1:
|
|
|
|
|
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:
|
|
|
|
|
name: Individual Room
|
|
|
|
|
size:
|
|
|
|
|
- 10.0
|
|
|
|
|
- 2.0
|
|
|
|
|
width:
|
|
|
|
|
- 2.5
|
|
|
|
|
- 0.5
|
|
|
|
|
level: 1
|
|
|
|
|
adjacency:
|
|
|
|
|
- c
|
|
|
|
|
count: 10
|
|
|
|
|
|
|
|
|
|
# FIRST FLOOR - Storage
|
ju3: reject programme codes colliding with the c/o/s generic type prefixes
Closes homemaker-py-ju3. DESIGN.md §39.3.
The class: key from the bead's design was deliberately NOT built. Auditing
every use of the prefix rule first showed it runs deeper than c/o/s -- l/k/b/t
carry real adjacency semantics (graph.py builds bedroom<->toilet and
kitchen<->living relations from first characters) -- so re-plumbing the type
system would invalidate the whole corpus and every baseline, for a problem
whose damage is the silence, not the convention. Two findings made the smaller
fix sufficient: no corpus programme has ever declared a bare c/o/s code, so
check_space_counts' skip only ever discarded declared rooms; and nothing
references harbor's four codes in any adjacency or co_locate list.
- programme.validate_codes raises on a reserved-prefix code, with the full
explanation. Called from BOTH parse paths (programme._parse_spaces and
fitness.Fitness._load_programme parse conf["spaces"] independently, so
validating one would leave the other door open). l/k/b/t stay unreserved.
- harbor-house and harbor-house-l0 renamed: cr1->fr1, of->ao, st1->gs1,
st2->gs2. New prefixes are unused in harbor and semantically neutral, and
the two storage codes still share a prefix, preserving the structure
evaluate_building's per-code plot-ratio term depends on. name: unchanged.
- experiments/migrate_ju3_rename.py migrates .dom files written before the
rename (--check dry-runs). Pre-rename artefacts, notably evolved-3M*.dom,
must be migrated or their leaves read as unmatched generics.
- test_collapse_global's c/o/s exclusion test now uses a generic C leaf, which
is what the exclusion is actually for; it previously relied on a programme
code colliding, which is no longer possible.
Re-baseline (seed 1, 20k evals, same settings as §38's run): 57 fails against
the 32-instance effective programme -> 55 against the real 37-instance one,
with all five previously-lost room instances now placed inside their declared
sigma bands (fr1 87.2 vs declared 80, was 32.9/17.1; ao/gs1/gs2 were absent
entirely) and no failure naming any of the four codes. At one seed each,
57 vs 55 is within noise -- the robust result is the room placement, not the
count. Historical harbor numbers are not comparable to post-ju3 ones; filed
homemaker-py-t3s to restate 2v1's acceptance figure once evolved-3M is
migrated.
346 passed (+10 new), same 7 pre-existing fixture failures.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-08-26 09:06:08 +00:00
|
|
|
gs2:
|
Fix mutate_level_add: use generic C/O floor instead of room duplicate
Previously level_add copied the top storey exactly, duplicating all
named programme rooms and immediately triggering space-count failures
for every room on the new floor. The lex outer-search comparison
(-n_fails, score) then always rejected the multi-storey child because
its fail count was far higher than the single-storey parent.
Fix: retype all named-room leaves on the new storey to generic C or O
before admitting the child. The outer search then retypes them
incrementally via the normal retype operator. This allows level_add to
produce designs with the same fail count as the parent (storey_minimum
fail removed, no duplication fails added), making the multi-storey
transition visible to the lex selector.
Result on programme-house cold start (init.dom, 100k evals, 4 workers):
before: 6 fails, single-storey, stuck after 40k evals
after: 4 fails, two-storey, still improving at 100k
Also adds examples/harbor-house/ from urb/examples for future runs.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-14 10:33:05 +01:00
|
|
|
name: First Floor Storage
|
|
|
|
|
size:
|
|
|
|
|
- 18.0
|
|
|
|
|
- 3.5
|
|
|
|
|
width:
|
|
|
|
|
- 3.0
|
|
|
|
|
- 0.8
|
|
|
|
|
level: 1
|
|
|
|
|
adjacency:
|
|
|
|
|
- c
|
|
|
|
|
|
|
|
|
|
ut1:
|
|
|
|
|
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
|
|
|
|
|
value_supported: 300.0
|