homemaker-layout/experiments
Claude 7ec4e5d121
§39.4: tighten generic-type matching, reverting the harbor rename
Supersedes the previous commit's approach. Renaming harbor's four colliding
codes fixed one programme; tightening the matching rule fixes the rule, so a
room may be called anything. cr1/of/st1/st2 are restored and the examples are
byte-identical to their pre-§39 state -- which also means existing .dom
artefacts (evolved-3M*) stay valid, so migrate_ju3_rename.py is deleted.

The rule: Urb has exactly three GENERIC structural types (get_space_types:
qw/C O S/), the leaves the search creates. Measured across the corpus: 154 C,
110 O, 1 S, not one lowercase generic -- while every programme code is
lowercase, including single-character ones (r, t, m, n). Case is the
discriminator, not length. Every generic test was type[0].lower() in (...), a
case-insensitive PREFIX that swept up any programme code starting with those
letters; they now match the generic set exactly. 30 sites across dom, fitness,
graph, operators, programme, shapecurve and bubble.

NOT applied to the SEMANTIC prefixes: l/k/b/t classify programme codes by first
letter (graph.py builds bedroom<->toilet and kitchen<->living relations from
them) and stay prefix-based. Where the namespaces were mixed in one expression
they were split -- has_circulation's ("b","l","k","c") is three semantic
prefixes plus dom.is_circulation; access()'s ("l","c","s") is semantic l plus
the generic circulation set.

New: dom.GENERIC_{CIRCULATION,OUTSIDE,TYPES} + is_generic(); fitness.
_generic_class(), replacing the _t0 dispatch in quality_size/quality_width/
quality_proportion/value_rate -- the four terms that mattered most and that a
first sweep missed, since they dispatch through a t0 variable rather than an
inline test. graph._adjacency_target resolves a generic adjacency requirement
(programmes write "adjacency: [c, o]") to the generic set while every other
requirement keeps Perl's prefix semantics.

Two subtleties: S is in both generic sets but takes the OUTSIDE parameter
families -- a first translation tested circulation first and silently gave S
the circulation params, caught by test_get_space_params_sahn_proportion. And
validate_codes survives, narrowed to a code spelled exactly C/O/S, which is a
genuine ambiguity; merely starting with c/o/s is now fine.

Invariant asserted as a test: test_scoring_is_invariant_under_programme_code_
spelling relabels one tree and its config together and re-scores. Bit-identical
across 12 comparisons (6 seeds x collapse on/off).

Re-baseline (seed 1, 20k, original names): 58 fails (15 hard / 43 soft) against
the real 37-instance programme, with cr1 at 79.1 m2 vs declared 80 (was 32.9
and 17.1), of/st1/st2 all present and in band, and one fail naming any of them.
57 -> 58 on a 5-instance-harder programme is within noise: "did not regress".

Fallout (§39.5): 2g7.5's CP-SAT seeder win does not survive. Over 6 seeds --
harbor real 102/114 (cpsat loses), harbor old-effective 98/99 (tie, so the win
was already marginal), maple-court 156/144 (cpsat wins). maple is the control:
the solver did not regress, harbor's programme changed. Test xfail'd with that
reason plus a maple companion; both assign_solver flags stay default off.
Filed homemaker-py-w6x to re-check other narrow-margin harbor A/Bs.

345 passed, 1 xfailed, 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:45:28 +00:00
..
results homemaker-py-2g7.5: full acceptance-criteria A/B (harbor+maple, 3 seeds, 20k budget) 2026-08-05 00:01:00 +01:00
ab_cpsat_assign.py homemaker-py-2g7.5: CP-SAT exact room-code assignment (seeder + reassign op) 2026-08-04 09:19:36 +01:00
ab_crinkliness_mode_ssz.py §38.2 refinement: connectivity is under-priced ~3x, not just a crinkliness bug 2026-08-26 07:40:37 +00:00
ab_shapecurve_prune.py homemaker-py-wkh: DP-exact hard pre-filter for driver.py's shape-feasibility prune 2026-08-03 21:10:28 +01:00
ab_shapecurve_warmstart.py homemaker-py-6xh: wire shape-curve DP into driver.py as an NM warm-start 2026-08-03 18:43:28 +01:00
accept_innerloop.py Rename package: homemaker → homemaker-layout 2026-06-14 08:18:06 +01:00
audit_programme_config.py DESIGN.md §39: config audit — programme codes collide with the c/o/s type namespace 2026-08-26 08:27:49 +00:00
autodiff_spike.py Spike: torch-autodiff inner-loop ratio optimisation (homemaker-py-2ax) — negative 2026-08-01 10:26:43 +01:00
bakeoff_harbor.json Swap inner loop default from CMA-ES to Nelder-Mead (homemaker-py-d6d) 2026-06-14 08:51:22 +01:00
bakeoff_harbor.py Swap inner loop default from CMA-ES to Nelder-Mead (homemaker-py-d6d) 2026-06-14 08:51:22 +01:00
bakeoff_innerloop.json Bake-off: CMA-ES confirmed as inner-loop optimiser (homemaker-py-d0s) 2026-06-13 09:47:15 +01:00
bakeoff_innerloop.py Rename package: homemaker → homemaker-layout 2026-06-14 08:18:06 +01:00
bakeoff_native.json Swap inner loop default from CMA-ES to Nelder-Mead (homemaker-py-d6d) 2026-06-14 08:51:22 +01:00
bakeoff_native.py Swap inner loop default from CMA-ES to Nelder-Mead (homemaker-py-d6d) 2026-06-14 08:51:22 +01:00
bench_batch_oracle.py Rename package: homemaker → homemaker-layout 2026-06-14 08:18:06 +01:00
benchmark_vs_urbevolve.py Rename package: homemaker → homemaker-layout 2026-06-14 08:18:06 +01:00
diag_2f45907.py Rename package: homemaker → homemaker-layout 2026-06-14 08:18:06 +01:00
diag_depth_balance.py x3b/§13.10: productionise leaf-sharing — per-code share grain + CLI wiring 2026-06-28 22:04:35 +01:00
diag_edge_too_long.py x3b/§13.10: productionise leaf-sharing — per-code share grain + CLI wiring 2026-06-28 22:04:35 +01:00
diag_exposure_frontage.py DESIGN.md §38: the plateau is an objective-gradient problem, not a search problem 2026-08-25 23:18:20 +00:00
diag_leaf_shapefail.py erc.1: Diagnostic A — per-leaf shape-fail vs density (§13.1) 2026-06-23 22:06:04 +01:00
diag_leaf_sharing.py x3b/§13.10: productionise leaf-sharing — per-code share grain + CLI wiring 2026-06-28 22:04:35 +01:00
diag_residual_91f.py homemaker-py-91f: residual diagnostic on the current full default stack 2026-08-01 19:38:46 +01:00
diag_slack_localization.py erc.2: Diagnostic B — undersize-despite-slack localization (§13.2) 2026-06-23 22:47:34 +01:00
dump_areas.pl Scaffold homemaker-py with validated geometry port 2026-06-10 20:50:20 +01:00
dump_areas.py Rename package: homemaker → homemaker-layout 2026-06-14 08:18:06 +01:00
dump_leaf_quality.pl Native fitness: leaf quality terms + cost model (homemaker-py-gnw) 2026-06-13 07:59:21 +01:00
genome_parity.py Rename package: homemaker → homemaker-layout 2026-06-14 08:18:06 +01:00
leaf_parity.py Rename package: homemaker → homemaker-layout 2026-06-14 08:18:06 +01:00
measure_seed_geometry.py Phase 7 §12.2: proportion-aware constructive seeding + storey_minimum fix (leu.2, cq1) 2026-06-20 14:04:42 +01:00
operator_locality.py Rename package: homemaker → homemaker-layout 2026-06-14 08:18:06 +01:00
optimize_fullfitness.py Rename package: homemaker → homemaker-layout 2026-06-14 08:18:06 +01:00
penalty_reshape.json Lexicographic outer-search comparison, preserve inner-loop cliff (homemaker-py-yg5) 2026-06-14 09:20:03 +01:00
penalty_reshape.py Lexicographic outer-search comparison, preserve inner-loop cliff (homemaker-py-yg5) 2026-06-14 09:20:03 +01:00
probe_harbor_floor.py x3b/§13.10: productionise leaf-sharing — per-code share grain + CLI wiring 2026-06-28 22:04:35 +01:00
rebaseline_no_occlusion.py Rename package: homemaker → homemaker-layout 2026-06-14 08:18:06 +01:00
refine_sweep.py Rename package: homemaker → homemaker-layout 2026-06-14 08:18:06 +01:00
resolve_ratios.py Rename package: homemaker → homemaker-layout 2026-06-14 08:18:06 +01:00
run_1s3_confirm.sh homemaker-py-1s3: multi-use leaves N=15 confirmation -- does not replicate 2026-08-01 08:52:24 +01:00
run_1s3_confirm_staged.sh homemaker-py-1s3: multi-use leaves N=15 confirmation -- does not replicate 2026-08-01 08:52:24 +01:00
run_6zy_ab.sh 6zy/§11.8: co-tune topology diversity × tournament pressure — null robust 2026-06-29 22:56:23 +01:00
run_8sh_ab.sh 8sh: insert/relocate-circulation repair operator (qi6 mechanism (a)) 2026-07-24 19:48:13 +01:00
run_9gp_ab.sh Phase 7 §12.3: 9gp A/B measured — NEGATIVE; close 9gp + epic leu 2026-06-21 07:21:51 +01:00
run_9yx_sweep.sh homemaker-py-9yx: health-centre — non-synthetic third example programme 2026-07-30 00:09:37 +01:00
run_and_capture_91f.py homemaker-py-91f: residual diagnostic on the current full default stack 2026-08-01 19:38:46 +01:00
run_c3g_ab.sh c3g: circ-per-room granularity knob (circ_divisor) + A/B harness 2026-06-21 21:10:18 +01:00
run_depthbal_ab.sh erc.4: depth-balanced construction mechanism + floor probe (§13.4) 2026-06-25 22:36:24 +01:00
run_e01_sweep.py e01: harbor-house beam-width larger-N confirmation (null) 2026-07-29 00:22:55 +01:00
run_f1d_ab.sh f1d: ruin-and-recreate LNS operator, validated positive on programme-house 2026-07-26 09:31:42 +01:00
run_f1d_larger_n.sh f1d: ruin-and-recreate LNS operator, validated positive on programme-house 2026-07-26 09:31:42 +01:00
run_f1d_w3_ab.sh f1d: ruin-and-recreate LNS operator, validated positive on programme-house 2026-07-26 09:31:42 +01:00
run_interioro_ab.sh erc/ld2: interior-O light-well seeding — §13.6 positive on dense floors 2026-06-28 07:20:20 +01:00
run_island_ab.py psk/§14: island model — null (best-of-N at equal budget wins) 2026-06-29 06:20:29 +01:00
run_leafshare_ab.sh erc.3: explicit per-leaf multiplicity closes the leak; driver A/B wired (§13.3) 2026-06-24 18:16:17 +01:00
run_leu2_ab.sh Phase 7 §12.2: proportion-aware constructive seeding + storey_minimum fix (leu.2, cq1) 2026-06-20 14:04:42 +01:00
run_lj3_qjg_ab.sh lj3/qjg: larger-N + weight sweep finds bridge_circulation effect is noise 2026-07-25 12:20:22 +01:00
run_multiuse_ab.sh homemaker-py-1s3: multi-use leaves as permanent design goal (§26 path b) 2026-07-31 00:16:12 +01:00
run_qi6_ab.sh qi6: full-budget A/B for graded circulation-connectivity signal, negative result 2026-07-23 18:29:45 +01:00
run_search.py Rename package: homemaker → homemaker-layout 2026-06-14 08:18:06 +01:00
run_search_scaled.py 6zy/§11.8: co-tune topology diversity × tournament pressure — null robust 2026-06-29 22:56:23 +01:00
run_shareedge_ab.sh hph/§13.8: share-aware edge-too-long cap — shared leaves no longer penalised for aggregate wall length 2026-06-28 21:24:51 +01:00
run_sharefactor_sweep.sh erc.7: leaf-sharing × depth-balancing synergy CONFIRMED end-to-end (§13.5) 2026-06-26 16:47:14 +01:00
run_staged_search.py homemaker-py-7ua: pin collapse_insearch=True in run_staged_search.py rescore 2026-08-05 10:08:04 +01:00
run_synergy_ab.sh erc.7: leaf-sharing × depth-balancing synergy CONFIRMED end-to-end (§13.5) 2026-06-26 16:47:14 +01:00
run_xyu_sweep.sh xyu: n=18 ruin_recreate N=15 confirmation — weakened, not resolved 2026-07-29 10:10:23 +01:00
run_y51_sweep.sh y51: synthetic room-count sweep finds no clean ruin_recreate size threshold 2026-07-26 15:35:03 +01:00
run_y51_sweep_ln.sh y51: synthetic room-count sweep finds no clean ruin_recreate size threshold 2026-07-26 15:35:03 +01:00
shapecurve_spike.py homemaker-py-2g7.4: fix shape-curve DP to be rotation-invariant 2026-08-03 07:06:48 +01:00
sweep_failtypes.py Rename package: homemaker → homemaker-layout 2026-06-14 08:18:06 +01:00
tier_ab_2g7_3.py homemaker-py-2g7.3: hard/soft fail tiering behind --use-tiers flag 2026-08-02 16:00:39 +01:00
validate_shapecurve.py homemaker-py-wkh: DP-exact hard pre-filter for driver.py's shape-feasibility prune 2026-08-03 21:10:28 +01:00
validate_shapecurve_multistorey.py homemaker-py-koo: multi-storey (below-link) support for the shape-curve DP 2026-08-03 23:30:18 +01:00
warm_vs_cold.py Rename package: homemaker → homemaker-layout 2026-06-14 08:18:06 +01:00