From 6268748fcbd5c0a8dad0d0f14f1a8bfa63bfbb6b Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 5 Sep 2026 16:04:45 +0000 Subject: [PATCH] bd: file homemaker-py-773; record the 39.16 correction on u5q Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB --- .beads/issues.jsonl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.beads/issues.jsonl b/.beads/issues.jsonl index afa332d..f79958c 100644 --- a/.beads/issues.jsonl +++ b/.beads/issues.jsonl @@ -36,7 +36,8 @@ {"_type":"issue","id":"homemaker-py-1p0","title":"Geometry inner loop: full-objective equal-offset ratio optimiser","description":"DESIGN.md §5.1, §7 Phase 1. Productionise experiments/optimize_fullfitness.py into homemaker: optimise(topology, x0=None) -\u003e (geometry, fitness). DOF = equal-offset division ratios of free branches (solver.free_branches, lowest-storey cut ownership), clipped to [eps, 1-eps]. Objective = full oracle fitness (never a proxy — §4.2 falsified). Must support warm-start x0 (§5.6) and a population/batch evaluation mode so each iteration scores via one batched oracle call (§4.6).","acceptance_criteria":"Reproduces or exceeds §4.5 gains (x1.24–x1.67, no new failures) on 2f45907, candidate-002, c964435; works as a library call on any corpus .dom","status":"closed","priority":1,"issue_type":"feature","assignee":"Bruno Postle","owner":"bruno@postle.net","created_at":"2026-06-11T23:36:58Z","created_by":"Bruno Postle","updated_at":"2026-06-12T08:46:31Z","started_at":"2026-06-12T00:14:19Z","closed_at":"2026-06-12T08:46:31Z","close_reason":"innerloop.optimise() lands: batched CMA-ES sigma ladder (0.05/0.15, IPOP popsize doubling, deterministic seeding) over equal-offset free-branch ratios vs full oracle fitness; warm-start x0 supported. Acceptance vs unprojected originals: x1.65/x1.66/x1.58 against bars x1.24/x1.67/x1.59, no new failures, 46 oracle calls vs NM's 200. Two near-bar results accepted as reproduced-within-noise (1% tol) — draw spread brackets the single-NM-draw bars; approved by Bruno 2026-06-12. Gotchas: equal-offset projection of legacy unequal cuts loses fitness/adds failures (midpoint projection used); pycma seed=0 means clock-seeded.","dependencies":[{"issue_id":"homemaker-py-1p0","depends_on_id":"homemaker-py-av5","type":"blocks","created_at":"2026-06-12T00:39:33Z","created_by":"Bruno Postle","metadata":"{}"}],"dependency_count":1,"dependent_count":3,"comment_count":0} {"_type":"issue","id":"homemaker-py-8cs","title":"Experiment: warm-vs-cold start of inner loop (Lamarckian inheritance)","description":"DESIGN.md §5.6, §4.6. Warm-starting a child topology's inner loop from the parent's optimised ratios is the main lever for cutting per-topology cost (~3 min/topology cold). Apply single topology mutations to optimised corpus designs, re-optimise warm (surviving cuts keep values, new cuts get heuristic defaults) vs cold, compare oracle-call counts to convergence at equal final fitness.","acceptance_criteria":"Speedup factor measured across \u003e=10 mutated topologies; decision recorded (expect order-of-magnitude; if \u003c2x, revisit §4.6 Phase-2 scoping)","notes":"Experiment script committed (experiments/warm_vs_cold.py, 1cc86c8) and machinery validated oracle-free; one mutated child scored through the oracle OK. Waiting on homemaker-py-gp2 reference run to finish, then execute under URB_NO_OCCLUSION=1 (3 parents x 400 evals + 12 children x 2 x 200 evals, ~1.5-2 h oracle time). Default budgets: parent 400, child 200; target = evals to 95% of best final.","status":"closed","priority":1,"issue_type":"task","owner":"bruno@postle.net","created_at":"2026-06-11T23:36:58Z","created_by":"Bruno Postle","updated_at":"2026-06-12T11:44:45Z","closed_at":"2026-06-12T11:44:45Z","close_reason":"Measured (URB_NO_OCCLUSION=1, parent budget 400, child 200, 12 single mutations across 3 designs): cold start reached 95% of warm final in 0/12 cases within budget — speedup unbounded at practical budgets; warm finals beat cold finals x1.2-x4 in 12/12; 6/12 warm starts were within 95% at 1 eval (near-neutral mutations). Decision: Lamarckian warm-starting is MANDATORY in the memetic driver (homemaker-py-b39), not an optimisation; cold starts produce strictly worse geometry at equal budget. Note: 2 undivides were exactly fitness-neutral (same-type merge == Merge_Divided equivalence) — locality datum for homemaker-py-nyb.","dependencies":[{"issue_id":"homemaker-py-8cs","depends_on_id":"homemaker-py-1p0","type":"blocks","created_at":"2026-06-12T00:39:34Z","created_by":"Bruno Postle","metadata":"{}"}],"dependency_count":1,"dependent_count":0,"comment_count":0} {"_type":"issue","id":"homemaker-py-av5","title":"Batched oracle: score many .dom files per invocation","description":"oracle.py currently scores one .dom per urb-fitness.pl call (~1.65 s/dom). DESIGN.md §4.6: batching amortises Perl startup to ~0.99 s/dom and is required so population/batch optimisers can score a whole generation in one oracle call. Extend oracle.py with a batch API: write N .dom files, one perl invocation, parse N .score/.fails pairs. Keep the single-file path for compatibility.","acceptance_criteria":"Batch of 35 corpus files scores in one perl invocation; per-file results identical to single-file calls; measured s/dom reported","status":"closed","priority":1,"issue_type":"task","assignee":"Bruno Postle","owner":"bruno@postle.net","created_at":"2026-06-11T23:36:56Z","created_by":"Bruno Postle","updated_at":"2026-06-12T00:14:06Z","started_at":"2026-06-11T23:50:40Z","closed_at":"2026-06-12T00:14:06Z","close_reason":"score_batch() lands in oracle.py; 35-file corpus parity verified single-vs-batch (1e-12 rel fitness, exact fail sets); 0.98 s/dom batched vs 1.27 single, x1.30","dependency_count":0,"dependent_count":1,"comment_count":0} -{"_type":"issue","id":"homemaker-py-u5q","title":"Calibrate the crinkliness decay: an ordinary 4 m deep room scores 0.395, and sigma=1.1/3 was never justified","description":"DESIGN.md 39.14 made the crinkliness factor one-sided, which removed the\ndouble-charge against cost and the absurd 2.5 m optimum. It deliberately left\nthe other half alone: how steeply quality should decay from the saturation\npoint to the daylight limit.\n\nAt the global uncrinkliness params [5/6, 1.1/3] and the corpus's h = 3 m:\n\n depth 2.5 m q = 1.000 (saturation, now clipped)\n depth 3.0 m q = 0.902\n depth 4.0 m q = 0.395\n depth 4.5 m q = 0.191\n depth 4.86 m q = 0.100 (FAIL_THRESHOLD)\n depth 5.0 m q = 0.076 FAILS\n\nA 4 m deep room is entirely ordinary and it loses 60% of its value. After the\none-sided change, crinkliness is still the harshest of the seven quality\nfactors (area-weighted mean 0.513 vs size 0.536, proportion 0.853, width\n0.928, access 0.962, perpendicular 0.982), and essentially all of what is\nleft comes from this decay.\n\nThe two constants are inherited from Urb without a recorded derivation. The\ntarget 5/6 is now only the saturation point, so what actually needs\njustifying is sigma = 1.1/3, which sets how fast a room loses value as it\napproaches a limit it has not yet breached.\n\nNote the limit itself (1.62 h = 4.86 m) is NOT in question: 39.14 records two\nindependent derivations agreeing on it, the gaussian's own crossing and\n38.3's frontage bound.\n\nOptions worth measuring, all default OFF and all preserving the fail\nboundary:\n\n* widen sigma so the decay is gentler and only bites near the limit;\n* replace the gaussian's approach with a shape that is flat until some\n fraction of the limit and then falls -- i.e. move the saturation point out\n from 2.5 m rather than change the curvature;\n* derive sigma from the daylight rule itself rather than picking it, if a\n defensible derivation exists.\n\nJudge on a search A/B (experiments/ab_9gj_crinkliness.py takes named arms),\nscored under stock, with the fail set asserted byte-identical first.\n\nBlocked on 9gj landing.\n","status":"closed","priority":2,"issue_type":"bug","assignee":"Claude","owner":"noreply@anthropic.com","created_at":"2026-09-05T07:28:07Z","created_by":"Claude","updated_at":"2026-09-05T15:11:19Z","started_at":"2026-09-05T07:38:43Z","closed_at":"2026-09-05T15:11:19Z","close_reason":"Closed","dependencies":[{"issue_id":"homemaker-py-u5q","depends_on_id":"homemaker-py-9gj","type":"blocks","created_at":"2026-09-05T07:28:14Z","created_by":"Claude","metadata":"{}"}],"comments":[{"id":"01a0721a-a650-7456-adce-8b3955707592","issue_id":"homemaker-py-u5q","author":"Claude","text":"Done -- DESIGN.md 39.15. The answer is not a new sigma.\n\nFirst, the reframing that made it answerable: a fail is quality \u003c\nFAIL_THRESHOLD and every factor is a gaussian, so (target, sigma) does not\nexpress a soft preference -- it DEFINES an acceptance interval, target +-\n2.1460*sigma. Sigma is the tolerance that decides failures.\n\nThe blanket hypothesis does not survive. programme-house reaches 1 fail on all\nthree 500k seeds, and on two of them that fail is structural (staircase\nvolume, level 1 not connected), not a quality factor. Where a programme is\ninternally consistent the objective is very nearly satisfiable.\n\nThe specific one does, and it shows 39.1's CLEAN verdict was answering a\nweaker question. audit_programme_config.py swept each spec's whole tolerance\nbox and asked \"is SOME shape feasible\" -- all 67 corpus specs pass. But a\ntolerance is not a design intent. At the DECLARED target area and target\naspect:\n\n harbor-house 7 instances need \u003e=2 exposed sides (cr1, da1, 5 x n)\n maple-court 6 instances (da1, lr1, 4 x n)\n health-centre 0\n programme-house 0\n\nharbor's common room is 80 m2 at aspect 2.0 = 6.32 x 12.65 m, and 6.32 m is\ndeeper than the 4.86 m single-aspect daylight limit. It is feasible only at\nthe bottom of its area tolerance and the top of its aspect one (4.5 x 13.4 m\nat 60 m2) -- satisfiable only by building something other than what was asked\nfor.\n\nThose codes carry the failures. Within-programme (which controls for\nprogramme size, as a cross-programme comparison would not): harbor 13/21\ninstances fail = 62% vs 29/113 = 26% for all other codes; maple 14/18 = 78% vs\n53/172 = 31%.\n\nOf the 112 corpus crinkliness fails: 77 (69%) buried at crink == 0 -\u003e k54;\n17 (15%) too deep with a contradictory-as-declared spec; 18 (16%) other.\n\nSo three declared quantities -- target area, target aspect, daylight limit --\nare jointly contradictory for six specs and nothing said so. The daylight\nlimit is the one with independent support (the gaussian's crossing and 38.3's\nfrontage bound agree at 1.62h by separate routes). The area and aspect targets\nare the author's brief, so the resolution is an author decision -- shrink the\nroom, allow a deeper aspect, or declare it wants a corner -- not a constant\nretuned until the number drops.\n\nShipped: the \"at declared target\" column in audit_programme_config.py, the\ntool CLAUDE.md already sends programme authors to, plus the corner-demand\ncount. Objective unchanged.\n\nRecorded not fixed: 36 of 44 size fails (82%) are rooms LARGER than target,\nwhile cost already charges floor area at 200/m2. Same shape as 39.14's\ndouble-charge but NOT the same case -- crinkliness's surplus side never fires\nas a fail, whereas size's upper bound is the main brake on growth (with\nvalue/cost and scores ~1e-11, growth always pays unless quality falls).\nRemoving it on the analogy would license inflating every room. If it is the\nwrong instrument the value rate is what wants re-examining.","created_at":"2026-09-05T15:05:44Z"}],"dependency_count":1,"dependent_count":0,"comment_count":1} +{"_type":"issue","id":"homemaker-py-773","title":"Why can a slicing tree give only a third of its leaves light on two sides? (Alexander 159 vs the plan form)","description":"DESIGN.md 39.16 relocated the crinkliness residual. The constant is Alexander\n159 \"Light on Two Sides of Every Room\" and it is the best-corroborated number\nin the objective (the gaussian's own crossing and 38.3's frontage bound agree\nat 1.6202 by independent routes). It is not miscalibrated.\n\nWhat the twelve 500k baseline runs show is that the plan form cannot deliver\nwhat the pattern asks. Of 430 graded leaves:\n\n unlit 77 17.9% 100% fail\n one side 208 48.4% 15% fail\n two - corner 87 20.2% 2% fail\n two - opposite 34 7.9% 0% fail\n three or four 24 5.6% 4% fail\n\nTwo or more sides = 33.7% of leaves, and those essentially never fail\ncrinkliness. The whole residual is leaves that did not get it.\n\nA binary slicing tree on a convex plot is structurally stingy with two-aspect\npositions: a rectangular storey has exactly 4 corners, and opposite-wall\nexposure needs a leaf spanning the full depth of the plan. Meanwhile harbor\ndemands 7 rooms with two aspects at their declared size and maple 6\n(audit_programme_config.py, \"at declared target\" column).\n\nThe lever 39.11 already identified from the other direction is courtyards: an\ninternal void turns single-aspect rooms into two-aspect ones, and harbor's\nfrontage gap wants ~49 m2 of it. homemaker-py-7b7 enlarged the health-centre\nplot assuming a courtyard shape for the same reason.\n\nWorth investigating:\n\n* Does the search ever construct a courtyard on its own? Measure O/S leaf\n placement in the baseline artefacts -- interior vs perimeter.\n* Is there a construction or mutation operator that can create one? If the\n seeder never proposes an interior void, no amount of search will find it.\n* Would seeding a courtyard into init.dom for harbor and maple move the\n residual? Cheap to test and directly measurable, and unlike a constant\n retune it does not change what \"good\" means.\n* Does the shape-curve DP (37.2) model two-aspect feasibility at all? If it\n prunes on size/width/proportion only, it will accept topologies that cannot\n be daylit.\n\nThis is the successor to u5q. It is a plan-form question, not a scoring one --\nwhich is the point: 39.15 went looking for wrong magic numbers and found the\nnumbers were right and the geometry was the constraint.\n","status":"open","priority":2,"issue_type":"task","owner":"noreply@anthropic.com","created_at":"2026-09-05T15:58:13Z","created_by":"Claude","updated_at":"2026-09-05T15:58:13Z","dependency_count":0,"dependent_count":0,"comment_count":0} +{"_type":"issue","id":"homemaker-py-u5q","title":"Calibrate the crinkliness decay: an ordinary 4 m deep room scores 0.395, and sigma=1.1/3 was never justified","description":"DESIGN.md 39.14 made the crinkliness factor one-sided, which removed the\ndouble-charge against cost and the absurd 2.5 m optimum. It deliberately left\nthe other half alone: how steeply quality should decay from the saturation\npoint to the daylight limit.\n\nAt the global uncrinkliness params [5/6, 1.1/3] and the corpus's h = 3 m:\n\n depth 2.5 m q = 1.000 (saturation, now clipped)\n depth 3.0 m q = 0.902\n depth 4.0 m q = 0.395\n depth 4.5 m q = 0.191\n depth 4.86 m q = 0.100 (FAIL_THRESHOLD)\n depth 5.0 m q = 0.076 FAILS\n\nA 4 m deep room is entirely ordinary and it loses 60% of its value. After the\none-sided change, crinkliness is still the harshest of the seven quality\nfactors (area-weighted mean 0.513 vs size 0.536, proportion 0.853, width\n0.928, access 0.962, perpendicular 0.982), and essentially all of what is\nleft comes from this decay.\n\nThe two constants are inherited from Urb without a recorded derivation. The\ntarget 5/6 is now only the saturation point, so what actually needs\njustifying is sigma = 1.1/3, which sets how fast a room loses value as it\napproaches a limit it has not yet breached.\n\nNote the limit itself (1.62 h = 4.86 m) is NOT in question: 39.14 records two\nindependent derivations agreeing on it, the gaussian's own crossing and\n38.3's frontage bound.\n\nOptions worth measuring, all default OFF and all preserving the fail\nboundary:\n\n* widen sigma so the decay is gentler and only bites near the limit;\n* replace the gaussian's approach with a shape that is flat until some\n fraction of the limit and then falls -- i.e. move the saturation point out\n from 2.5 m rather than change the curvature;\n* derive sigma from the daylight rule itself rather than picking it, if a\n defensible derivation exists.\n\nJudge on a search A/B (experiments/ab_9gj_crinkliness.py takes named arms),\nscored under stock, with the fail set asserted byte-identical first.\n\nBlocked on 9gj landing.\n","status":"closed","priority":2,"issue_type":"bug","assignee":"Claude","owner":"noreply@anthropic.com","created_at":"2026-09-05T07:28:07Z","created_by":"Claude","updated_at":"2026-09-05T15:11:19Z","started_at":"2026-09-05T07:38:43Z","closed_at":"2026-09-05T15:11:19Z","close_reason":"Closed","dependencies":[{"issue_id":"homemaker-py-u5q","depends_on_id":"homemaker-py-9gj","type":"blocks","created_at":"2026-09-05T07:28:14Z","created_by":"Claude","metadata":"{}"}],"comments":[{"id":"01a0721a-a650-7456-adce-8b3955707592","issue_id":"homemaker-py-u5q","author":"Claude","text":"Done -- DESIGN.md 39.15. The answer is not a new sigma.\n\nFirst, the reframing that made it answerable: a fail is quality \u003c\nFAIL_THRESHOLD and every factor is a gaussian, so (target, sigma) does not\nexpress a soft preference -- it DEFINES an acceptance interval, target +-\n2.1460*sigma. Sigma is the tolerance that decides failures.\n\nThe blanket hypothesis does not survive. programme-house reaches 1 fail on all\nthree 500k seeds, and on two of them that fail is structural (staircase\nvolume, level 1 not connected), not a quality factor. Where a programme is\ninternally consistent the objective is very nearly satisfiable.\n\nThe specific one does, and it shows 39.1's CLEAN verdict was answering a\nweaker question. audit_programme_config.py swept each spec's whole tolerance\nbox and asked \"is SOME shape feasible\" -- all 67 corpus specs pass. But a\ntolerance is not a design intent. At the DECLARED target area and target\naspect:\n\n harbor-house 7 instances need \u003e=2 exposed sides (cr1, da1, 5 x n)\n maple-court 6 instances (da1, lr1, 4 x n)\n health-centre 0\n programme-house 0\n\nharbor's common room is 80 m2 at aspect 2.0 = 6.32 x 12.65 m, and 6.32 m is\ndeeper than the 4.86 m single-aspect daylight limit. It is feasible only at\nthe bottom of its area tolerance and the top of its aspect one (4.5 x 13.4 m\nat 60 m2) -- satisfiable only by building something other than what was asked\nfor.\n\nThose codes carry the failures. Within-programme (which controls for\nprogramme size, as a cross-programme comparison would not): harbor 13/21\ninstances fail = 62% vs 29/113 = 26% for all other codes; maple 14/18 = 78% vs\n53/172 = 31%.\n\nOf the 112 corpus crinkliness fails: 77 (69%) buried at crink == 0 -\u003e k54;\n17 (15%) too deep with a contradictory-as-declared spec; 18 (16%) other.\n\nSo three declared quantities -- target area, target aspect, daylight limit --\nare jointly contradictory for six specs and nothing said so. The daylight\nlimit is the one with independent support (the gaussian's crossing and 38.3's\nfrontage bound agree at 1.62h by separate routes). The area and aspect targets\nare the author's brief, so the resolution is an author decision -- shrink the\nroom, allow a deeper aspect, or declare it wants a corner -- not a constant\nretuned until the number drops.\n\nShipped: the \"at declared target\" column in audit_programme_config.py, the\ntool CLAUDE.md already sends programme authors to, plus the corner-demand\ncount. Objective unchanged.\n\nRecorded not fixed: 36 of 44 size fails (82%) are rooms LARGER than target,\nwhile cost already charges floor area at 200/m2. Same shape as 39.14's\ndouble-charge but NOT the same case -- crinkliness's surplus side never fires\nas a fail, whereas size's upper bound is the main brake on growth (with\nvalue/cost and scores ~1e-11, growth always pays unless quality falls).\nRemoving it on the analogy would license inflating every room. If it is the\nwrong instrument the value rate is what wants re-examining.","created_at":"2026-09-05T15:05:44Z"},{"id":"01a0724a-f888-7e40-8f93-814c8c3ef744","issue_id":"homemaker-py-u5q","author":"Claude","text":"CORRECTION -- the owner supplied the provenance this analysis was missing, and\nit withdraws part of what I recorded. DESIGN.md 39.16.\n\nThe crinkliness constant is Christopher Alexander, A Pattern Language 159,\n\"Light on Two Sides of Every Room\". 1/crink = A/(L*h) is floor area per metre\nof ILLUMINATED wall over storey height -- it is NOT room depth, and equals\ndepth only for a room lit on one side. So 5/6 * h = 2.5 m is 2.5 m of depth\nPER WINDOW WALL:\n\n lighting peak depth fail edge\n one side 2.50 m 4.86 m\n two opposite sides 5.00 m 9.72 m\n\nA 4 m room scores 0.395 lit on one side and 0.902 lit on two. The factor is\nnot miscalibrated; it is the pattern stated as a ratio.\n\nWithdrawn from 39.14: the \"2.5 m absurd optimum\" reading, and \"the corpus's\nrealised median depth is 2.95 m, the search built what it was paid for\" --\n2.95 was the median A/L, and the corpus's single-aspect leaves are a median\n3.46 m deep, its two-opposite leaves 4.42 m. Ordinary rooms.\n\nWithdrawn from 39.15: calling the six specs \"self-contradictory\". They are\nlarge rooms, and under Alexander a large room IS supposed to need two aspects.\nThe audit column is reporting the pattern working, not a mis-specification.\n\nWhat survives, on a better argument: crinkliness_shape=\"daylight\" still\nstands, because 159 states a MINIMUM and a two-sided gaussian turns a minimum\ninto a target. Of the 133 leaves in the clipped region, 68% are lit on two or\nmore sides, mean quality 0.770 -- rooms docked a quarter of their value for\nsatisfying the pattern well, on top of the exterior_wall/boundary_wall charge\nthose windows already carry in cost.\n\nAnd it relocates the residual. Over the 430 graded baseline leaves: unlit 77\n(100% fail), one side 208 (15%), two-corner 87 (2%), two-opposite 34 (0%),\nthree/four 24 (4%). Light on two sides all but guarantees a pass, and only\n33.7% of leaves get it. The question is not what sigma should be -- it is why\na binary slicing tree on a convex plot can only give a third of its leaves two\naspects. Filed as homemaker-py-773.\n\nMethod note: both errors came from reading a dimensionless ratio as a length.\nThe provenance and the interpretation are now recorded next to the constant in\nfitness.py, not only in DESIGN.md.","created_at":"2026-09-05T15:58:31Z"}],"dependency_count":1,"dependent_count":0,"comment_count":2} {"_type":"issue","id":"homemaker-py-k54","title":"Grade fully-buried leaves by burial depth: 69% of the crinkliness residual is at crink==0, where no rescaling of the factor can order anything","description":"DESIGN.md 39.13 (homemaker-py-9gj) rescaled the FAILING compact tail of\nquality_uncrinkliness so it stops underflowing. That reaches the 35 corpus\nleaves with partial exposure. It cannot reach the other 77 -- 69% of the\nfailing region -- because they sit at crink == 0 exactly, and 0 times any\nrescaling is still 0.\n\nMeasured over the twelve 500k cold-start runs (39.12): 430 leaves carry a\nminimum-exposure requirement, 112 fail it, 77 of those have zero exposed wall.\nThose 77 are 1612 m2 of floor, and the objective assigns every one of them the\nsame number.\n\n39.13 also establishes that this is NOT beyond the inner loop's reach, which\ncorrects the premise in homemaker-py-gvb: perturbing division ratios alone\nmoves the zero-exposure set on 6-12 of 12 baseline artefacts at +-25%, and on\n0-7 at +-10%. A leaf can slide far enough to meet an outside neighbour or the\nplot edge. So there is a real valley here and the ratio DOF can cross it.\n\nWhat is missing is an ordering over the far side of it. Candidate: grade a\nzero-exposure leaf by its burial DEPTH -- adjacency-graph distance to the\nnearest leaf that does have exposure, or to outside. Depth 1 is one ratio move\nfrom daylight; depth 3 is not.\n\nConstraints any such term must meet, inherited from 39.13:\n\n* It must stay strictly below FAIL_THRESHOLD, so the fail set stays\n byte-identical and stock scoring remains a valid yardstick (the 38.9 trap's\n one exemption).\n* It must be continuous with the ramp at crink == 0, or the two together\n reintroduce a step.\n* It is a NEW objective term, not a repair to an existing one, so it carries a\n calibration burden 9gj's rescale did not: it changes what \"good\" means, and\n a wrong weight will make burial cheap. Default OFF, A/B'd on its own.\n\nBlocked on 9gj landing (and ideally on its A/B verdict -- if the ramp shows no\nsearch effect on the 35 reachable leaves, a term for the other 77 is unlikely\nto pay either, and that is useful evidence about the whole crinkliness story).\n","status":"open","priority":2,"issue_type":"bug","owner":"noreply@anthropic.com","created_at":"2026-09-05T06:19:11Z","created_by":"Claude","updated_at":"2026-09-05T06:19:11Z","dependencies":[{"issue_id":"homemaker-py-k54","depends_on_id":"homemaker-py-9gj","type":"blocks","created_at":"2026-09-05T06:19:18Z","created_by":"Claude","metadata":"{}"}],"dependency_count":1,"dependent_count":0,"comment_count":0} {"_type":"issue","id":"homemaker-py-tco","title":"A/B harnesses should report the minimum detectable difference for the N they run","description":"Two independent findings this session say the project's A/B protocols are\nroutinely underpowered for the margins they report:\n\n §38.19 programme-house needed N=60 to resolve an effect its own protocol\n claimed at N=20 (p ~= 0.069 at N=20, 0.017 at N=60)\n §38.21 harbor's paired sd is 6.19 fails, so n=3 resolves nothing finer than\n ~15.4 fails -- yet every recorded harbor margin is below that, and 25%\n of 3-seed subsets show a clean 3/3 sweep by chance\n\nThe fix is procedural and cheap. The A/B harnesses (run_*_ab.sh, ab_*.py,\nrerun_1ph_protocol.sh) should print, alongside the result, the minimum\ndifference their N and observed sd could have detected -- so an underpowered\nverdict is visible AT THE POINT IT IS MADE rather than years later.\n\nA one-line addition to each harness's summary: from the paired diffs it already\ncomputes, report\n\n minimum detectable difference = t_crit(0.975, N-1) * sd / sqrt(N)\n\nand flag when the observed margin falls below it. Optionally refuse to declare a\nwinner in that case.\n\nThis is not about re-running old A/Bs (§38.21 covers harbor, §38.19\nprogramme-house); it is about not generating more of them.\n","acceptance_criteria":"The shared A/B summary path reports the minimum detectable difference for the N actually run, and flags a verdict whose margin falls below it; applied to at least rerun_1ph_protocol.sh and ab_ssz_search.py.","status":"closed","priority":2,"issue_type":"task","assignee":"Claude","owner":"noreply@anthropic.com","created_at":"2026-08-29T19:34:30Z","created_by":"Claude","updated_at":"2026-08-29T19:51:47Z","started_at":"2026-08-29T19:38:30Z","closed_at":"2026-08-29T19:51:47Z","close_reason":"Shipped experiments/ab_report.py (DESIGN.md §38.22).\n\n minimum detectable difference (MDD) = t_crit(0.975, N-1) * sd / sqrt(N)\n\nA margin below the MDD is not a weak result, it is an ABSENT one -- the\nexperiment could not have distinguished it from zero however it came out. The\nreport flags that, refuses to endorse a winner, and states the N that would be\nneeded. Also reports exact paired t, a Wilcoxon cross-check (fail counts are\nsmall integers, normality is not obvious), CI, and W/L/T.\n\nValidated against both datasets measured this session -- it reproduces the\nhand-computed figures exactly and flags correctly:\n\n programme-house N=60 +0.567 p=0.017 MDD 0.462 -\u003e verdict supported\n programme-house N=20 +0.700 p=0.085 MDD 0.805 -\u003e UNDERPOWERED, N~=26\n harbor N=24 +1.208 p=0.502 MDD 3.669 -\u003e UNDERPOWERED, N~=202\n\nHarbor needing ~200 seeds means it cannot answer the collapse_insearch question\nat any N this project would realistically run.\n\nCaught and fixed a defect in my own first version: with all-ties (sd=0) the MDD\ncollapses to zero, and the naive `abs(mean) \u003c mdd` reported \"margin exceeds the\nMDD -- verdict supported\" for a margin of 0.000, with t=nan. A reporter that\nendorses a zero margin is worse than none. Degenerate cases are now explicit and\ndistinguish all-ties from a constant non-zero difference.\n\nWired into ab_ssz_search.py; rerun_1ph_protocol.sh's TSV is readable directly by\nthe CLI.\n\nSEPARATE CORRECTION made while validating: §38.19's published p-values for N=20\nand N=40 were 0.069 and 0.045, from a normal approximation I used. The exact\npaired t-test gives 0.085 and 0.052 -- so N=40 did NOT reach significance either,\nand it took N=60. The approximation was anti-conservative, making results look\nmore significant than they are, which is the same direction of error this whole\nthread is about. Corrected at all four sites citing it, and §38.19's \"needs\nN \u003e= 40\" guidance raised to N \u003e= 60.\n","dependency_count":0,"dependent_count":0,"comment_count":0} {"_type":"issue","id":"homemaker-py-ioe","title":"Is collapse_insearch=True still the right default under the current objective?","description":"The default was flipped OFF -\u003e ON by homemaker-py-1ph (DESIGN.md §20, 2026-07-24) on the strength of a programme-house N=20 sweep: mean 7.95 -\u003e 7.10, 11W/6L/3T, paired t p ~= 0.028. homemaker-py-d86 (§38.18) has now confirmed that verdict was sound FOR ITS OWN ERA -- it reproduces on a pre-iio commit, and the iio stale-share bug is structurally unreachable on that protocol because programme-house declares count: 1 for every code, so no leaf ever carries a share.\n\nBut the objective has changed substantially since, three times over, and all of it after 1ph:\n\n §39.4 the generic-namespace fix -- codes like cr1 were being read as generic\n circulation, so 14% of harbor's programme was silently optional\n §38.10 / §38.11 crinkliness declared per space; 14 corpus spaces now declare\n crinkliness: none\n §38.12 the missing-space cascade no longer weighted by YAML verbosity, a fixed\n 5 fails per missing instance instead of 3-5\n\ncollapse_insearch runs collapse_global inside every fitness eval, and collapse_global's assignment is valued against exactly the quality factors those changes touched. So the ON-beats-OFF margin was measured against an objective that no longer exists. The direction is plausibly unchanged -- but it is currently an assumption carried on a superseded measurement, and it is a DEFAULT, so every run inherits it.\n\nThe protocol and harness already exist: experiments/rerun_1ph_protocol.sh runs programme-house, budget 3000, 4 workers, seeds 1-20, ON vs OFF, both arms finished with --collapse, and takes about 6 minutes.\n\nNote when re-running: n_workers is an algorithm parameter (§38.17), so keep 4 workers to stay comparable with the published protocol, and record it with the result.","acceptance_criteria":"The 1ph protocol re-run at N=20 on the current codebase and objective, with the ON-vs-OFF verdict either reconfirmed or restated; if the margin has moved materially, DESIGN.md §20's default-flip rationale is updated to say so and the default is reconsidered on the new numbers.","status":"closed","priority":2,"issue_type":"task","assignee":"Claude","owner":"noreply@anthropic.com","created_at":"2026-08-29T13:36:18Z","created_by":"Claude","updated_at":"2026-08-29T13:57:45Z","started_at":"2026-08-29T13:36:32Z","closed_at":"2026-08-29T13:57:45Z","close_reason":"Re-validated: the default STANDS, but with two caveats worth carrying\n(DESIGN.md §38.19).\n\nRe-ran the 1ph protocol as published on the current codebase and objective --\nprogramme-house, budget 3000, 4 workers, ON vs OFF, both arms finished with\n--collapse.\n\n N OFF ON W/L/T diff t p\n published 1ph (07-24) 20 7.95 7.10 11/6/3 +0.85 2.38 0.028\n historical re-run (§38.18) 20 8.05 7.10 11/6/3 +0.95 2.59 --\n current objective 20 7.85 7.15 10/7/3 +0.70 1.82 0.069\n current objective 40 7.60 7.03 21/14/5 +0.57 2.01 0.045\n current objective 60 7.58 7.02 29/19/12 +0.57 2.45 0.017\n\nAt N=60: mean diff +0.567 fails/seed, paired t=2.454 (df=59), p=0.0171 exact,\n95% CI [+0.105, +1.029] excluding zero. Wilcoxon signed-rank cross-check agrees\n(p=0.0138), which matters because fail counts are small integers and normality\nis not obvious.\n\nCaveat 1: the effect is about a third smaller than published (+0.57 vs +0.85).\nPartly regression from a slightly lucky N=20 draw, partly plausible real erosion\n-- several fails collapse_global used to clear have been redefined out of\nexistence or made harder by §39.4 / §38.10-12.\n\nCaveat 2, the more useful one: THE PUBLISHED N=20 CAN NO LONGER DETECT ITS OWN\nEFFECT. At exactly the published sample size the current answer is p ~= 0.069, a\nnull by the conventional threshold. Had I run N=20 and stopped, the honest report\nwould have been \"the 1ph verdict no longer reproduces\" and the default would have\nlooked unjustified. It took N=60 to resolve. That is the \"8sh/1ph/qi6/lj3\npattern\" this log already warns about, now biting the flagship result itself.\nAny future re-validation of this default needs N \u003e= 40; N=20 should not be\ntrusted to settle it either way.\n\n§20 annotated in place so a reader of the original claim sees the current figure.\nHarness now takes a seed range (APPEND=1 to extend a sweep); results in\nexperiments/results/ioe_1ph_current_objective.tsv.\n","dependency_count":0,"dependent_count":0,"comment_count":0}