homemaker-layout/src/homemaker_layout
Claude 366a047a60
Make the crinkliness factor one-sided: stop billing the daylit wall twice
The tail rescale shipped in cd392e7 is a measured NULL as a search
intervention -- 12 of 12 pairs byte-identical on harbor and maple, 8000 evals
from a plateau, not merely underpowered. Of course it is: the whole failing
tail is 0.034% of corpus value. Looking at the rest of the factor, prompted by
the owner, found something much larger above the threshold.

crink = area_outside/area = (L*h)/A, so 1/crink = A/(L*h) is the room's mean
depth from its daylit wall in storey-heights. That is the right variable for a
daylight rule, and the fail boundary it implies (1/crink = 1.62, i.e. 4.86 m at
h=3) is a sensible one that agrees with 38.3's frontage bound derived
independently. What is wrong is hanging a TWO-sided gaussian on it:

* The near side penalises a room for having MORE daylit wall than target --
  while leaf_cost's siblings edge_cost and outside_edge_cost already charge
  that same wall at exterior_wall=100 and boundary_wall=133.3 per m2. The wall
  is billed once in cost and again as lost value.
* It never earns its keep as a failure either: the over-exposed branch only
  reaches FAIL_THRESHOLD above crinkliness 21.5, and the corpus maximum is
  3.95. It has never produced a single fail; it only removes value.
* 133 of the 318 passing graded leaves in the 500k baseline (42%) sit on that
  side, mean quality 0.810.

crinkliness_shape="daylight" (default OFF, "gaussian" is stock) clips it: a
room shallower than the gaussian's peak scores 1.0, because daylight is a
sufficiency requirement and surplus is the cost model's business, not this
factor's. Clipping at the PEAK rather than at FAIL_THRESHOLD is deliberate --
it keeps the factor continuous and preserves the graded approach to the
daylight limit, where clipping at the threshold would put a 10x cliff on the
exact boundary the 0.5**n fail multiplier already steps on.

Fail set byte-identical on all 21 corpus artefacts for all four
shape/tail combinations, so stock stays a valid yardstick for every arm.
Area-weighted crinkliness quality 0.480 -> 0.513, leaf quality product
0.2722 -> 0.2831; per-artefact score +0.2%..+19.6%, and unlike the ramp it
reaches health-centre and programme-house, where the tail change was 0.000%.

Note "daylight" clips the OPPOSITE side from 38.1's superseded compact_ok,
which forgives being buried; composing either with those modes is refused.

ab_9gj_ramp.py becomes ab_9gj_crinkliness.py and takes named arms, since it
now covers both changes; its first arm is the baseline and the yardstick.

Refs homemaker-py-9gj.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
2026-09-05 07:27:02 +00:00
..
__init__.py Rename package: homemaker → homemaker-layout 2026-06-14 08:18:06 +01:00
bubble.py §39.4 completion + §39.5 retraction + §39.6: the usage namespace is NOT clean 2026-08-26 10:09:14 +00:00
collapse_cmd.py cdl: default local_search on for finish-time collapse call sites 2026-07-26 23:33:40 +01:00
compose.py homemaker-py-2g7.1: plan->dom composer (SVG trace -> slicing-tree .dom) 2026-08-03 11:03:02 +01:00
compose_cmd.py homemaker-py-2g7.1: plan->dom composer (SVG trace -> slicing-tree .dom) 2026-08-03 11:03:02 +01:00
cpsat.py CP-SAT seeding re-measured deterministically: it loses 2026-08-29 14:47:36 +00:00
dom.py §39.4: tighten generic-type matching, reverting the harbor rename 2026-08-26 09:45:28 +00:00
driver.py n_workers is an algorithm parameter, not noise 2026-08-29 12:52:33 +00:00
evolve.py Checkpoint long searches; the cold-start runs were lost to a reclaimed box 2026-08-29 05:43:58 +00:00
fitness.py Make the crinkliness factor one-sided: stop billing the daylit wall twice 2026-09-05 07:27:02 +00:00
fitness_cmd.py Add homemaker-fitness: native Python CLI to replace urb-fitness.pl 2026-06-14 17:15:33 +01:00
genome.py homemaker-py-2g7.1: plan->dom composer (SVG trace -> slicing-tree .dom) 2026-08-03 11:03:02 +01:00
geometry.py Rename package: homemaker → homemaker-layout 2026-06-14 08:18:06 +01:00
graph.py Missing-space cascade no longer weighted by YAML verbosity 2026-08-29 09:33:40 +00:00
innerloop.py x3b/§13.10: productionise leaf-sharing — per-code share grain + CLI wiring 2026-06-28 22:04:35 +01:00
operators.py Recover most of the cpsat test-suite cost; keep the part that is real 2026-08-29 18:55:54 +00:00
oracle.py Fix parity gap: oracle.py must run with URB_NO_OCCLUSION=1 2026-06-17 18:40:56 +01:00
programme.py ssz: crinkliness is declared per space; there is no daylight attribute 2026-08-28 22:39:09 +00:00
shapecurve.py Shape-curve DP models leaf-sharing, so it can fire on real runs 2026-08-29 21:36:45 +00:00
solver.py Rename package: homemaker → homemaker-layout 2026-06-14 08:18:06 +01:00