homemaker-layout/examples
Claude 697914fac8
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
..
harbor-house ju3: reject programme codes colliding with the c/o/s generic type prefixes 2026-08-26 09:06:08 +00:00
harbor-house-l0 ju3: reject programme codes colliding with the c/o/s generic type prefixes 2026-08-26 09:06:08 +00:00
health-centre homemaker-py-1s3: multi-use leaves as permanent design goal (§26 path b) 2026-07-31 00:16:12 +01:00
maple-court Phase 7 §12.2: proportion-aware constructive seeding + storey_minimum fix (leu.2, cq1) 2026-06-20 14:04:42 +01:00
programme-house Close homemaker-py-hqw: make project standalone (no Perl/Urb dependency) 2026-06-13 23:39:20 +01:00
programme-house2 Added an easier version of programme-house 2026-06-16 07:57:50 +01:00
y51-sweep-10 y51: synthetic room-count sweep finds no clean ruin_recreate size threshold 2026-07-26 15:35:03 +01:00
y51-sweep-14 y51: synthetic room-count sweep finds no clean ruin_recreate size threshold 2026-07-26 15:35:03 +01:00
y51-sweep-18 y51: synthetic room-count sweep finds no clean ruin_recreate size threshold 2026-07-26 15:35:03 +01:00
y51-sweep-22 y51: synthetic room-count sweep finds no clean ruin_recreate size threshold 2026-07-26 15:35:03 +01:00