diff --git a/.beads/issues.jsonl b/.beads/issues.jsonl index 13f5eec..d191d27 100644 --- a/.beads/issues.jsonl +++ b/.beads/issues.jsonl @@ -1,6 +1,6 @@ {"_type":"issue","id":"homemaker-py-ju3","title":"Programme codes share a namespace with the generic c/o/s type prefixes: 14% of harbor-house is silently optional and cr1's declared targets are all discarded","description":"Urb's type system is prefix-based (a type starting with 'c' is circulation, 'o'/'s' is outside) and programme room codes live in the SAME namespace, so any code whose name happens to start with c, o or s is silently reinterpreted as a generic type. Three separate consequences, none announced anywhere in the output:\\n\\n1. graph.check_space_counts line ~530 does 'if code[0].lower() in (\"c\",\"o\",\"s\"): continue' -- the code is SKIPPED ENTIRELY. Never required, never counted, no missing fail, no too-many fail.\\n2. Fitness.get_space_params returns the generic *_circulation / *_outside params BEFORE consulting self.spaces, so declared size/width/proportion are overridden.\\n3. dom.is_circulation / is_outside become true, changing the leaf's value rate, exempting it from crinkliness, and making it supply daylight to neighbours.\\n\\nharbor-house is affected; maple-court, health-centre and programme-house are namespace-clean.\\n\\n cr1 'Common Room with Fireplace' (c): size 80.0 -\u003e 0.0/14.0, width 6.0 -\u003e 2.4, proportion 2.0 -\u003e 1.5, ALL THREE overridden; is_circulation=True so value_rate 50 not 300.\\n of 'Staff Office' x2 (o): width/proportion overridden; is_outside=True; value_rate 100.\\n st1/st2 'Storage' (s): width/proportion overridden; is_outside AND is_circulation True; value_rate 100.\\n\\n5 of 37 room instances (14%) are silently optional. MEASURED CONSEQUENCE: in a 20k-eval run the two cr1 leaves converged to 32.9 and 17.1 m2 against a declared 80 m2, and produced no too-many-spaces fail despite count:1; of/st1/st2 are absent from the result entirely with zero fails, because nothing ever asked for them. Compounds with homemaker-py-2v1: cr1 is the single largest room in the programme and is classified circulation, so the x6 value gap pays the search to shrink it.","design":"Separate the namespaces. Cleanest is an explicit per-space 'class:' key in patterns.config (inside/circulation/outside) defaulting to inside, with the prefix rule used ONLY for untyped generic leaves the search creates -- programme codes then never collide regardless of spelling. A cheaper stopgap is a load-time validation error in programme.load_programme_dir that refuses a programme code starting with c/o/s, which at least converts a silent misread into a loud one. Renaming harbor's four codes would fix that one programme but leaves the trap armed for the next author.","acceptance_criteria":"A programme declaring a code starting with c/o/s either honours its declared params and count, or fails loudly at load. harbor-house re-baselined against its real 37-instance programme, and every DESIGN.md harbor fail count re-stated or annotated as measured against the 32-instance effective programme.","status":"closed","priority":0,"issue_type":"bug","assignee":"Claude","owner":"noreply@anthropic.com","created_at":"2026-08-26T08:26:37Z","created_by":"Claude","updated_at":"2026-08-26T09:05:11Z","started_at":"2026-08-26T08:55:30Z","closed_at":"2026-08-26T09:05:11Z","close_reason":"Shipped as loud validation + harbor rename rather than the class: key (DESIGN.md §39.3). The class: key was deliberately not built: auditing the prefix rule showed l/k/b/t carry adjacency semantics too, so re-plumbing the type system would invalidate the whole corpus for a problem whose damage is the silence, not the convention. programme.validate_codes raises on c/o/s codes from both parse paths; harbor cr1/of/st1/st2 renamed to fr1/ao/gs1/gs2 (neutral unused prefixes, prefix-sharing preserved); migrate_ju3_rename.py migrates pre-rename .dom files. Re-baselined at seed 1/20k: 57 fails on the 32-instance effective programme -\u003e 55 on the real 37-instance one, with all five previously-lost room instances now placed inside their declared sigma bands and zero fails naming them.","dependency_count":0,"dependent_count":0,"comment_count":0} {"_type":"issue","id":"homemaker-py-2v1","title":"Connectivity is under-priced ~3x against the circulation-\u003ehabitable value gap: the objective is net-positive on severing the spine","description":"Sharper root cause than homemaker-py-ssz, isolated by the 38.6 A/B (which showed none of the three crinkliness modes removes the deletion incentive). Deleting a circulation leaf merges it into its sibling, converting corridor into habitable area. value_circulation=50 vs value_inside=300, so that is a flat 6x value gain. The only counter-pressure is the 'level N not connected' fail, worth 0.5x under value *= 0.5**len(failures). Break-even needs 0.5^k \u003c 50/300, i.e. k \u003e 2.58 -- severing must cost AT LEAST 3 fails to be net-negative, and it costs 1. Net incentive to sever = 6 * 0.5 = 3.0x in favour; measured 4.06x on a well-lit (q_crink=0.736) circulation leaf, so this is NOT the zero-exposure effect and is not fixable inside quality_uncrinkliness. This is the cleanest explanation of why 'level 0 not connected' and 'level 1 not connected' are still present in evolved-3M-nols-3, the best layout found after 1.7M evals: the search is being paid 3-4x to create them.","design":"Options: (a) emit connectivity fails with a multiplicity \u003e= 3 (cheapest, but stacks with the 1i8 cascade-weighting problem and is a magic number); (b) make the connectivity penalty multiplicative and explicit rather than riding the generic 0.5^n (a dedicated building_factor term, sized from the value-rate gap so it tracks value_circulation/value_inside instead of being hard-coded); (c) revalue circulation as infrastructure -- its worth is that it makes other rooms reachable, which the current per-leaf value rate cannot express; the principled version credits circulation with the access it provides rather than its own floor area. (c) is the architecturally correct one and the biggest change. Recommend measuring (a) first purely to confirm the mechanism (does the 3x threshold flip the deletion test?), then designing (b) or (c) properly.","acceptance_criteria":"Deletion test (experiments/diag_exposure_frontage.py value + the ssz A/B harness) shows lit and buried C/O deletions are no longer rewarded; then harbor-house reaches the 15-fail floor in materially fewer than 1.7M evals AND without 'level 0/1 not connected' in the result.","status":"closed","priority":0,"issue_type":"bug","assignee":"Claude","owner":"noreply@anthropic.com","created_at":"2026-08-26T07:37:39Z","created_by":"Claude","updated_at":"2026-08-26T14:13:53Z","started_at":"2026-08-26T14:09:32Z","closed_at":"2026-08-26T14:13:53Z","close_reason":"MEASURED NULL — premise retracted (DESIGN.md §39.8). The arithmetic was right and the premise was wrong. Shipped connectivity_weight (EXPERIMENTAL, default 1.0 = flat rule, byte-identical) with connectivity_weight_for() deriving w=3 from value_inside/value_circulation rather than hard-coding it. At auto the §38.2 deletion test does not move AT ALL: 5/25 rewarded either way, median x0.26 vs x0.27 — because the connectivity fail count is UNCHANGED in every rewarded deletion (measured: 115-\u003e107 fails but 5-\u003e5 connectivity; 107-\u003e99 but 3-\u003e3; etc). Weighting a fail that never fires changes nothing. And when a deletion DOES break connectivity it is already punished: harbor 2 such deletions of 32, both punished (x0.00, x0.01); maple 5 of 32, all punished (x0.58..x0.07). Severing already costs 1-2 connectivity fails plus the cascade after them, which outweighs the x6 value gain. The x4.06 'well-lit circulation leaf' that motivated the bead was a deletion that did not change connectivity at all — it was rewarded for removing its own quality fails (§38.1's zero-value finding) and I misread it as a pricing mechanism. Flag kept default-off with the write-up per house style for a null lever.","dependency_count":0,"dependent_count":2,"comment_count":0} -{"_type":"issue","id":"homemaker-py-bk9","title":"Re-baseline the corpus under the post-39.25 objective (the 500k table is superseded)","description":"DESIGN.md 39.12's cold-start baseline -- four programmes x 3 seeds x 500,000\nevaluations, ~430 h of compute -- was measured under an objective that no\nlonger exists. 39.19 changed what \"good\" means:\n\n * 39.14 crinkliness_shape=\"daylight\" (default OFF, so not yet in the mix)\n * 39.18 quality_aggregate=\"geometric_mean\" (now DEFAULT ON)\n * 39.19 value_supported 300 -\u003e 100 (now the default and in all four\n corpus patterns.config files)\n\nThe committed coldstart-500000-s*.dom layouts remain valid artefacts and their\nFAIL COUNTS are unchanged by any of this (value rates never enter fail\nemission, and evaluate_leaf emits each fail from its factor before anything is\ncombined). What is stale is the comparison: any new run optimises a different\nscalar, so beating 39.12's numbers no longer means what it meant.\n\nNeeded:\n\n python experiments/run_coldstart_baseline.py --budget 500000 --seeds 3\n\non the local machine -- the container is reclaimed on conversation inactivity,\nwhich lost the first attempt at this (0 of 12 completed) before checkpointing\nwas added. The runner commits and pushes after every finished run, one worker\nper run to avoid b8g's parallel non-determinism, seed-major so a lost box\nleaves all four programmes at fewer seeds rather than one programme complete.\n\nRecord, as 39.12 did: per-programme mean, sd, and the minimum detectable\ndifference at n=3, so the next A/B knows what it can resolve. 39.12's MDDs\nunder the OLD objective were harbor 13.7, maple 26.6, health-centre 6.6,\nprogramme-house 0.0 -- expect them to move.\n\nAlso worth capturing this time, since 39.17 showed it predicts the fail rate\nalmost exactly: per-storey supply/demand of daylit wall. And re-check 39.17's\nobservation that the search puts its open space on the storey that already has\nsurplus -- 39.19 repriced exactly that behaviour (terrace 2.69 -\u003e 0.87 return\non cost), so it is the first place to look for an effect.\n\nUntil this lands, no fail count from a new run is comparable with anything in\n39.12, and the acceptance discipline of 39.12 (beat the mean by more than the\nprogramme's MDD, at n \u003e= 3) applies to the re-baseline itself.\n","status":"open","priority":1,"issue_type":"task","owner":"noreply@anthropic.com","created_at":"2026-09-06T07:49:21Z","created_by":"Claude","updated_at":"2026-09-06T15:48:03Z","comments":[{"id":"01a07767-a66e-75e3-ac3b-e30f4575f594","issue_id":"homemaker-py-bk9","author":"Claude","text":"UPDATED SCOPE -- this bead was filed after 39.19; four more objective changes\nhave landed since. The full list of what the re-baseline is measuring:\n\n 39.18 quality_aggregate = geometric_mean (was product; DEFAULT ON)\n 39.19 value_supported 300 -\u003e 100 (a terrace is no longer worth\n more per m2 than a room)\n 39.22 proportion_circulation -\u003e None (no corridor aspect cap)\n 39.23 size_circulation -\u003e None (no corridor area cap)\n 39.24 ratio_circulation -\u003e None (duplicated the per-m2 economics)\n 39.25 ratio_outside -\u003e None, force_roof_garden -\u003e 1\n (swapped the quantitative rule\n for the qualitative one)\n\nStill DEFAULT OFF and NOT in the mix: crinkliness_shape=\"daylight\" and\ncrinkliness_tail=\"ramp\" (39.13/39.14). If the re-baseline is to inform whether\nto turn those on, run them as extra arms rather than assuming.\n\nEffect on the committed baseline LAYOUTS (unchanged artefacts, rescored):\nharbor 33/43/42 -\u003e 32/40/38, maple 54/73/55 -\u003e 52/65/52, health-centre\n4/9/5 -\u003e 3/9/5, programme-house 1/1/1 -\u003e 2/2/2. The 23 removed fails are ones\nthe objective should never have reported; the 4 added are levels with no\noutdoor space, which it should have been reporting all along.\n\nWHAT TO RECORD, beyond 39.12's per-programme mean/sd/MDD:\n\n1. Per-storey supply/demand of daylit wall. 39.17 found the ratio predicts the\n crinkliness fail rate almost exactly -- above ~1.2 near-zero fails, below\n 1.0 40-55% of the storey fails -- and that every harbor/maple GROUND floor\n is starved while every top floor has surplus.\n\n2. The outdoor fraction per programme. 39.25 is the ONE change whose risk is\n unmeasured: outdoor space is profitable (ground outdoor returns 1.64 per\n unit cost against a room's 0.66) and ratio_outside was the only thing\n capping it. If the fraction drifts up materially, that is the signal to\n reconsider -- the minimum-internal-area factor is the remaining bound.\n\n3. Where the search puts its open space by storey. 39.17 found 50 m2 of\n courtyard on harbor's starved ground floor against 223 m2 on its surplus\n first floor, because value_rate paid an upper outside leaf a room's rate.\n 39.19 repriced exactly that (terrace return 2.69 -\u003e 0.87), so this is the\n first place an effect should show.\n\n4. Corridor geometry -- median circulation leaf area and aspect. Was 14.3 m2\n at aspect 1.67, a stubby room rather than a corridor, because the caps\n 39.22/39.23 removed forbade anything longer. If spines do not lengthen,\n something else is binding and worth finding.\n\nHOW: python experiments/run_coldstart_baseline.py --budget 500000 --seeds 3\non the local machine. One worker per run (avoids b8g's parallel\nnon-determinism), seed-major so a lost box leaves all four programmes at fewer\nseeds, commits and pushes after every finished run. The container reclaims on\nCONVERSATION inactivity, not CPU inactivity -- that lost the first attempt at\nthis entirely (0 of 12) before checkpointing was added.\n\nUntil this lands, no fail count from a new run is comparable with 39.12's\ntable, and none of 39.13-39.25 has been shown to help the search -- all six\nwere shipped on correctness grounds and the three A/Bs run so far were one\nnull and two underpowered.","created_at":"2026-09-06T15:47:57Z"}],"dependency_count":0,"dependent_count":0,"comment_count":1} +{"_type":"issue","id":"homemaker-py-bk9","title":"Re-baseline the corpus under the post-39.25 objective (the 500k table is superseded)","description":"DESIGN.md 39.12's cold-start baseline -- four programmes x 3 seeds x 500,000\nevaluations, ~430 h of compute -- was measured under an objective that no\nlonger exists. 39.19 changed what \"good\" means:\n\n * 39.14 crinkliness_shape=\"daylight\" (default OFF, so not yet in the mix)\n * 39.18 quality_aggregate=\"geometric_mean\" (now DEFAULT ON)\n * 39.19 value_supported 300 -\u003e 100 (now the default and in all four\n corpus patterns.config files)\n\nThe committed coldstart-500000-s*.dom layouts remain valid artefacts and their\nFAIL COUNTS are unchanged by any of this (value rates never enter fail\nemission, and evaluate_leaf emits each fail from its factor before anything is\ncombined). What is stale is the comparison: any new run optimises a different\nscalar, so beating 39.12's numbers no longer means what it meant.\n\nNeeded:\n\n python experiments/run_coldstart_baseline.py --budget 500000 --seeds 3\n\non the local machine -- the container is reclaimed on conversation inactivity,\nwhich lost the first attempt at this (0 of 12 completed) before checkpointing\nwas added. The runner commits and pushes after every finished run, one worker\nper run to avoid b8g's parallel non-determinism, seed-major so a lost box\nleaves all four programmes at fewer seeds rather than one programme complete.\n\nRecord, as 39.12 did: per-programme mean, sd, and the minimum detectable\ndifference at n=3, so the next A/B knows what it can resolve. 39.12's MDDs\nunder the OLD objective were harbor 13.7, maple 26.6, health-centre 6.6,\nprogramme-house 0.0 -- expect them to move.\n\nAlso worth capturing this time, since 39.17 showed it predicts the fail rate\nalmost exactly: per-storey supply/demand of daylit wall. And re-check 39.17's\nobservation that the search puts its open space on the storey that already has\nsurplus -- 39.19 repriced exactly that behaviour (terrace 2.69 -\u003e 0.87 return\non cost), so it is the first place to look for an effect.\n\nUntil this lands, no fail count from a new run is comparable with anything in\n39.12, and the acceptance discipline of 39.12 (beat the mean by more than the\nprogramme's MDD, at n \u003e= 3) applies to the re-baseline itself.\n","status":"open","priority":1,"issue_type":"task","owner":"noreply@anthropic.com","created_at":"2026-09-06T07:49:21Z","created_by":"Claude","updated_at":"2026-09-06T16:30:39Z","comments":[{"id":"01a07767-a66e-75e3-ac3b-e30f4575f594","issue_id":"homemaker-py-bk9","author":"Claude","text":"UPDATED SCOPE -- this bead was filed after 39.19; four more objective changes\nhave landed since. The full list of what the re-baseline is measuring:\n\n 39.18 quality_aggregate = geometric_mean (was product; DEFAULT ON)\n 39.19 value_supported 300 -\u003e 100 (a terrace is no longer worth\n more per m2 than a room)\n 39.22 proportion_circulation -\u003e None (no corridor aspect cap)\n 39.23 size_circulation -\u003e None (no corridor area cap)\n 39.24 ratio_circulation -\u003e None (duplicated the per-m2 economics)\n 39.25 ratio_outside -\u003e None, force_roof_garden -\u003e 1\n (swapped the quantitative rule\n for the qualitative one)\n\nStill DEFAULT OFF and NOT in the mix: crinkliness_shape=\"daylight\" and\ncrinkliness_tail=\"ramp\" (39.13/39.14). If the re-baseline is to inform whether\nto turn those on, run them as extra arms rather than assuming.\n\nEffect on the committed baseline LAYOUTS (unchanged artefacts, rescored):\nharbor 33/43/42 -\u003e 32/40/38, maple 54/73/55 -\u003e 52/65/52, health-centre\n4/9/5 -\u003e 3/9/5, programme-house 1/1/1 -\u003e 2/2/2. The 23 removed fails are ones\nthe objective should never have reported; the 4 added are levels with no\noutdoor space, which it should have been reporting all along.\n\nWHAT TO RECORD, beyond 39.12's per-programme mean/sd/MDD:\n\n1. Per-storey supply/demand of daylit wall. 39.17 found the ratio predicts the\n crinkliness fail rate almost exactly -- above ~1.2 near-zero fails, below\n 1.0 40-55% of the storey fails -- and that every harbor/maple GROUND floor\n is starved while every top floor has surplus.\n\n2. The outdoor fraction per programme. 39.25 is the ONE change whose risk is\n unmeasured: outdoor space is profitable (ground outdoor returns 1.64 per\n unit cost against a room's 0.66) and ratio_outside was the only thing\n capping it. If the fraction drifts up materially, that is the signal to\n reconsider -- the minimum-internal-area factor is the remaining bound.\n\n3. Where the search puts its open space by storey. 39.17 found 50 m2 of\n courtyard on harbor's starved ground floor against 223 m2 on its surplus\n first floor, because value_rate paid an upper outside leaf a room's rate.\n 39.19 repriced exactly that (terrace return 2.69 -\u003e 0.87), so this is the\n first place an effect should show.\n\n4. Corridor geometry -- median circulation leaf area and aspect. Was 14.3 m2\n at aspect 1.67, a stubby room rather than a corridor, because the caps\n 39.22/39.23 removed forbade anything longer. If spines do not lengthen,\n something else is binding and worth finding.\n\nHOW: python experiments/run_coldstart_baseline.py --budget 500000 --seeds 3\non the local machine. One worker per run (avoids b8g's parallel\nnon-determinism), seed-major so a lost box leaves all four programmes at fewer\nseeds, commits and pushes after every finished run. The container reclaims on\nCONVERSATION inactivity, not CPU inactivity -- that lost the first attempt at\nthis entirely (0 of 12) before checkpointing was added.\n\nUntil this lands, no fail count from a new run is comparable with 39.12's\ntable, and none of 39.13-39.25 has been shown to help the search -- all six\nwere shipped on correctness grounds and the three A/Bs run so far were one\nnull and two underpowered.","created_at":"2026-09-06T15:47:57Z"},{"id":"01a0778e-9708-7167-8ec5-1b3db63346c1","issue_id":"homemaker-py-bk9","author":"Claude","text":"BROUGHT CURRENT. This bead was filed after 39.19; four more objective changes\nlanded since, so the brief below supersedes the description.\n\nTHE OBJECTIVE TO RE-BASELINE (all live defaults, all live in the four corpus\npatterns.config files):\n\n 39.18 quality_aggregate = geometric_mean (was product)\n 39.19 value_supported = 100 (was 300; = value_outside)\n 39.22 proportion_circulation = None (no corridor aspect cap)\n 39.23 size_circulation = None (no corridor area cap)\n 39.24 ratio_circulation = None (duplicated the per-m2 economics)\n 39.25 ratio_outside = None (Alexander states no quantity)\n 39.25 force_roof_garden = 1 (was 0 EVERYWHERE -- the rule he\n does state, never enforced)\n\nDefault OFF and NOT part of the baseline: crinkliness_shape=\"daylight\",\ncrinkliness_tail=\"ramp\". Both are justified on correctness (39.14/39.13) but\nunproven in search; leave them off so the re-baseline measures one objective.\n\nUnchanged by owner ruling: value_circulation = 50, value_inside = 300.\n\nWHAT THE OLD ARTEFACTS NOW SCORE. The committed coldstart-500000-s*.dom layouts\nare unchanged as geometry; under the current objective their fail counts move,\nbecause 39.22/39.23 removed 7 corridor proportion and 16 corridor size fails\nand 39.25 added 4 \"no outside space\" fails:\n\n harbor-house 33/43/42 -\u003e 32/40/38\n maple-court 54/73/55 -\u003e 51/65/52 (s0 +1 from 39.25 = 52)\n health-centre 4/9/5 -\u003e 3/9/5\n programme-house 1/1/1 -\u003e 2/2/2 (ground floor has no outdoor space\n in all three seeds)\n\nThose are NOT the new baseline -- they are old layouts rescored. The baseline is\nwhat a fresh run produces.\n\nRUN: python experiments/run_coldstart_baseline.py --budget 500000 --seeds 3\non the local machine. ~430 h last time. The runner commits and pushes after\nevery finished run, one worker per run (avoids b8g's parallel\nnon-determinism), seed-major so a lost box leaves all four programmes at fewer\nseeds rather than one programme complete.\n\nRECORD, as 39.12 did: per-programme mean, sd, and the minimum detectable\ndifference at n=3 (39.12's were harbor 13.7, maple 26.6, health-centre 6.6,\nprogramme-house 0.0 -- expect movement).\n\nAND THREE THINGS 39.12 DID NOT CAPTURE, each of which now has a prediction\nattached:\n\n1. Per-storey supply/demand of daylit wall (39.17). It predicted the storey\n fail rate almost exactly: ratio above ~1.2 gives near-zero fails, below 1.0\n gives 40-55%. Every harbor and maple ground floor was below 1.0.\n\n2. Where the search puts its open space (39.17). It put 50 m2 of courtyard on\n harbor's starved ground floor and 223 m2 on the surplus first floor, because\n an upper outside leaf earned a room's value rate at half a room's cost.\n 39.19 repriced exactly that (terrace return 2.69 -\u003e 0.87). If nothing moves\n here, 39.19 did not do what it was for.\n\n3. The outdoor FRACTION per programme. 39.25 is the one change in 39.22-39.25\n whose risk is unmeasured: outdoor space is still the most profitable thing\n per unit cost (ground 1.64 vs a room's 0.66), and the fraction cap that used\n to hold it down is gone. The minimum-internal-area factor should bound it,\n but that is reasoning, not measurement. Baseline fractions were harbor\n 0.13-0.20, maple 0.14, health-centre 0.10-0.13, programme-house 0.10-0.29.\n A large drift upward means 39.25 needs revisiting.\n\nUntil this lands, no fail count from a new run is comparable with anything in\n39.12, and 39.12's acceptance discipline (beat the mean by more than the\nprogramme's MDD, at n \u003e= 3) applies to the re-baseline itself.","created_at":"2026-09-06T16:30:29Z"}],"dependency_count":0,"dependent_count":0,"comment_count":2} {"_type":"issue","id":"homemaker-py-118","title":"Native-vs-Perl fitness parity is unverified: no oracle .score has ever been committed, and the tests were self-comparing","description":"DESIGN.md 39.20. tests/test_dom_corpus.py has two tests --\ntest_native_fitness_score_parity and test_native_fitness_fail_set_parity --\nthat read a cached .score/.fails beside each corpus .dom and treat it as the\nPerl oracle's answer. They are the only check that the native Python fitness\nagrees with the Urb oracle it was ported from.\n\nThey have never run against a real oracle score in this repository:\n\n* .gitignore lines 10-11 exclude *.dom.score and *.dom.fails;\n* git log --diff-filter=A over those patterns finds ZERO files ever added.\n\nSo on a clean checkout all 64 parametrised cases skip. The only cases that\never executed were ones where somebody had locally run homemaker-fitness (the\nNATIVE scorer) and left its output in the corpus directory -- at which point\nthe test compared the native scorer with itself and passed by construction.\n\nThree such cases were live and green in this session, on the\ncoldstart-500000-s*.dom artefacts I generated in examples/programme-house.\nThey only surfaced because the 39.19 objective change made the native scorer\ndisagree with its own stale output.\n\nShipped as a stopgap: the parametrisation is now restricted to the Perl\ncorpus's MD5-named files, so a session artefact can never become a fixture\nagain, and the skip message states plainly that parity is unverified rather\nthan reading like a missing optional cache. A guard test asserts the\nrestriction holds. All 64 cases now skip honestly.\n\nWhat is actually needed:\n\n* regenerate .score/.fails for the 32 MD5-named programme-house fixtures from\n the PERL oracle (needs the ../urb checkout and URB_NO_OCCLUSION=1), and\n COMMIT them -- which means narrowing the .gitignore rules so fixture caches\n can be tracked while working files stay ignored;\n* then confirm whether native fitness still matches. It may well not: this\n session alone shipped 39.14 (crinkliness one-sided), 39.18 (geometric-mean\n aggregation) and 39.19 (value_supported), none of which the Perl oracle has.\n If parity is intentionally abandoned, the tests should be deleted and\n DESIGN.md should say so -- what must not persist is a test that looks like\n it guarantees parity and guarantees nothing.\n\nP1 because it is a measurement-integrity defect in the validation layer\nitself, and because the answer determines whether oracle.py and the Perl shim\nare still meaningful as a cross-check (CLAUDE.md still describes them that\nway).\n","status":"closed","priority":1,"issue_type":"bug","assignee":"Claude","owner":"noreply@anthropic.com","created_at":"2026-09-05T19:18:07Z","created_by":"Claude","updated_at":"2026-09-06T07:56:24Z","started_at":"2026-09-06T07:43:57Z","closed_at":"2026-09-06T07:56:24Z","close_reason":"Closed","dependency_count":0,"dependent_count":0,"comment_count":0} {"_type":"issue","id":"homemaker-py-3z0","title":"Preserve circulation connectivity DURING the resize, instead of repairing after it","description":"Named by homemaker-py-yql / DESIGN.md §39.9. The constructive seeder picks circulation as a CONNECTED dominating set and succeeds every time; _size_divisions_from_targets then moves every wall to hit the programme's area targets and destroys it. Measured: 41 of 49 circulation-to-circulation edges lost on health-centre, surviving shared walls squeezed to 0.54-1.11 m against door_width=1.2, taking fully-connected constructed seeds to 1/20, 1/20 and 0/20 across the corpus (100% with the resize disabled).\\n\\nRepairing AFTER the fact was measured and is a net loss (§39.9): operators.repair_circulation_settled restores 100% connectivity but raises missing-room fails by 5.0-8.5 per seed, because every leaf retyped to C displaces a required room at a 3-5 fail cascade. Kept default off.\\n\\nThe fix belongs upstream: constrain the resize so a shared boundary between two circulation leaves cannot fall below door_width. That is an added constraint on an existing solve rather than a new repair pass, and it keeps the programme intact — nothing is displaced, the wall simply is not allowed to close up.\\n\\nWorth checking while there: solver.py already has min_width_generic (default 1.2) keeping generic leaves from collapsing to slivers, which is the same idea applied to leaf WIDTH rather than to a shared BOUNDARY between two specific leaves. The new constraint may belong in the same place.","acceptance_criteria":"Constructed seeds stay \u003e=90% level-connected WITH the resize enabled, without raising missing-room fails; corpus re-baselined.","status":"closed","priority":1,"issue_type":"feature","assignee":"Claude","owner":"noreply@anthropic.com","created_at":"2026-08-26T14:37:48Z","created_by":"Claude","updated_at":"2026-08-26T15:10:30Z","started_at":"2026-08-26T15:02:29Z","closed_at":"2026-08-26T15:10:30Z","close_reason":"MEASURED NULL (DESIGN.md §39.10), and it reframes §39.9. Built operators._size_divisions_preserving_circulation: snapshot every cut, resize, then revert the cuts on the tree path between each circulation pair the resize broke — programme fully intact, only geometry given back. It works on connectivity (harbor 50-\u003e92%, maple 67-\u003e97%, health-centre 8-\u003e17%) but costs area accuracy: constructed-seed fails harbor 96.6-\u003e141.5, maple 141.8-\u003e175.8, size fails roughly double. Also recorded: both halves of the re-cut do damage in different proportions per programme (freezing rotation leaves harbor 71%, health-centre 8%, maple 92%), so a fix must be able to give back either; and a greedy single-cut revert stalls on the plateau where no ONE revert helps though two would, which is why targeting the broken pairs was needed.\n\nThe defence that raw constructed seeds understate the case — the resize is only a warm start, the inner loop should recover — was TESTED AND FAILS. Full search, harbor-house, 12000 evals, seed 1: OFF 43 fails (9 hard, 3 connectivity); ON 65 fails (26 hard, 4 connectivity). Worse on every axis including connectivity itself.\n\nREFRAMING: §39.9's fact stands (the resize destroys 41 of 49 circulation edges) but is NOT ACTIONABLE, because construction-time connectivity does not determine final connectivity. The search discards and rebuilds the seeder's circulation either way; constraining the seed only spends area quality the search cannot recover. Connectivity was never a construction problem, and §39.8 showed it is not an incentive problem either. Both flags stay default off; do not revisit without a new formulation (the standing bubble.py has).","dependency_count":0,"dependent_count":0,"comment_count":0} {"_type":"issue","id":"homemaker-py-yql","title":"Why do level-not-connected fails persist in the best layout, if severing is already punished?","description":"Re-opened by homemaker-py-2v1 closing NULL (DESIGN.md §39.8). §38.2 claimed the search was PAID to sever the circulation spine; measurement refuted that — every deletion that actually breaks connectivity is already punished (x0.00 to x0.58 across harbor-house and maple-court, 0 of 7 rewarded). So the incentive is correct, yet 'level 0 not connected' and 'level 1 not connected' still survive in evolved-3M-nols-3, the best layout after 1.7M evals.\\n\\nThe evidence now points at REACHABILITY rather than incentive: connected topologies may be hard to construct and hard to hold onto under mutation, not insufficiently rewarded. Worth checking:\\n - what fraction of constructed seeds start connected at all (§39.7 measured 4/3/5 inaccessible-usable-space fails per 3 seeds, so: not many)\\n - whether a connected layout, once found, survives mutation or is quickly lost\\n - whether the constructive seeder's circulation dominating set actually guarantees connectivity, or only approximates it\\n - whether the §39.7 usage change (39% of adjacency edges now trimmed) makes connectivity materially harder to achieve, which would be a cost of that fix worth quantifying\\n\\nNOTE this is now measurable in a way it was not before §39.7: the fails actually fire on constructed seeds instead of being hidden by routes through store cupboards.","acceptance_criteria":"A measurement distinguishing 'rarely constructed' from 'constructed then lost' for level connectivity, and a named lever for whichever it is.","status":"closed","priority":1,"issue_type":"task","assignee":"Claude","owner":"noreply@anthropic.com","created_at":"2026-08-26T14:13:54Z","created_by":"Claude","updated_at":"2026-08-26T14:37:30Z","started_at":"2026-08-26T14:31:19Z","closed_at":"2026-08-26T14:37:30Z","close_reason":"ANSWERED (DESIGN.md §39.9): constructed, then lost — at construction time, in the resize. _assign_adjacency_aware picks circulation as a CONNECTED dominating set and succeeds every time; _size_divisions_from_targets then moves every wall and destroys it. Measured, 20 seeds/programme: fully-connected seeds harbor 1/20, health-centre 1/20, maple 0/20. Control with proportion_aware=False (no resize): 100% connected on all three. Mechanism confirmed on health-centre: 41 of 49 circulation-to-circulation edges destroyed by the resize, surviving shared walls squeezed to 0.54-1.11 m against door_width=1.2. Same failure mode §37.7 recorded for CP-SAT assignment, never looked for in connectivity, worth 35-95 points.\n\n§39.7 COST CHECK: zero. Identical rates under prefix-inferred vs declared usages — has_circulation never trims C-C edges, so the usage change did not make connectivity harder.\n\nREPAIR MEASURED NEGATIVE: operators.repair_circulation_settled (§37.7's alternating-minimisation fix, bridging by retyping to C after geometry settles) restores 100% connectivity on all three programmes but is a net loss — connectivity fails -0.8..-1.7 while missing-room fails +5.0..+8.5, because each retyped leaf displaces a required room at a 3-5 fail cascade. Kept default off with the write-up.\n\nNEXT LEVER NAMED: preserve the connection during the resize (constrain _size_divisions_from_targets so a shared C-C boundary cannot fall below door_width) rather than rebuild it afterwards at the programme's expense.","dependency_count":0,"dependent_count":0,"comment_count":0}