Correct 39.14/39.15: the crinkliness constant is Alexander 159
The owner supplied the provenance the analysis was missing. The constant is Christopher Alexander, A Pattern Language 159, "Light on Two Sides of Every Room", and it changes what the numbers mean. 1/crink = A/(L*h) is floor area per metre of ILLUMINATED wall over storey height. It is not room depth -- it equals depth only for a room lit on one side. So 5/6 * h = 2.5 m is 2.5 m of room depth PER WINDOW WALL: one side allows 2.5 m at the peak and 4.86 m at the fail edge, two opposite sides allow 5.00 m and 9.72 m. A 4 m room scores 0.395 lit on one side and 0.902 lit on two. The factor is the pattern stated as a ratio, and it is not miscalibrated. WITHDRAWN from 39.14: the "2.5 m absurd optimum" reading, and "the corpus's realised median depth is 2.95 m, so the search built what it was paid for" -- 2.95 was the median A/L, while the corpus's single-aspect leaves are a median 3.46 m deep and its two-opposite leaves 4.42 m. Ordinary rooms. Section retitled, passage struck in place. WITHDRAWN from 39.15: calling six specs "self-contradictory". They are large rooms, and under Alexander a large room is supposed to need two aspects; the audit's new column reports the pattern working, not a mis-specification. What is real is the tension between that demand and what the plan form supplies. SURVIVES, on a better argument: crinkliness_shape="daylight". 159 states a MINIMUM, and a two-sided gaussian turns a minimum into a target -- 68% of the 133 leaves in the clipped region are lit on two or more sides, mean quality 0.770, docked for satisfying the pattern well, on top of the exterior_wall/boundary_wall charge those windows already carry in cost. New 39.16 records this and relocates the residual. Over the 430 graded baseline leaves: unlit 77 (100% fail), one side 208 (15%), two-corner 87 (2%), two-opposite 34 (0%), three/four 24 (4%). Light on two sides all but guarantees a pass and only 33.7% of leaves get it, so the open question is why a binary slicing tree on a convex plot can only give a third of its leaves two aspects -- a plan-form question, not a scoring one. Filed as homemaker-py-773; 39.11's courtyard finding is the same question from the other side. Both errors came from reading a dimensionless ratio as a length, so the provenance and the interpretation now sit next to the constant in fitness.py, not only in DESIGN.md. 405 passed, 72 skipped. Refs homemaker-py-u5q. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MJ84Feep79Hhm3E4zZJmnB
This commit is contained in:
parent
94d112aa02
commit
e92a96ac99
2 changed files with 151 additions and 28 deletions
147
DESIGN.md
147
DESIGN.md
|
|
@ -7085,7 +7085,14 @@ that §39.12 found to be 35% of the whole corpus fail count is not being
|
||||||
decided down here at all. It is being decided above the threshold, in the
|
decided down here at all. It is being decided above the threshold, in the
|
||||||
part of the factor nobody had looked at. §39.14 looks at it.
|
part of the factor nobody had looked at. §39.14 looks at it.
|
||||||
|
|
||||||
### 39.14 What the crinkliness factor actually rewards: a 2.5 m room, twice-charged (`homemaker-py-9gj`)
|
### 39.14 What the crinkliness factor actually rewards: surplus daylight, twice-charged (`homemaker-py-9gj`)
|
||||||
|
|
||||||
|
*(Retitled. As first written this section was headed "a 2.5 m room,
|
||||||
|
twice-charged" and argued that the gaussian's peak encodes an absurd optimum.
|
||||||
|
**That half is withdrawn** — see §39.16: the constant is Alexander 159, "Light
|
||||||
|
on Two Sides of Every Room", and 2.5 m is depth *per window wall*, not room
|
||||||
|
depth. The twice-charged half stands, on a better argument than the one given
|
||||||
|
here. The retracted passage is marked in place below.)*
|
||||||
|
|
||||||
§39.13 fixed the failing tail and the fix did nothing. That is a result about
|
§39.13 fixed the failing tail and the fix did nothing. That is a result about
|
||||||
the tail, but the owner's response to it was the useful one — *if calculating
|
the tail, but the owner's response to it was the useful one — *if calculating
|
||||||
|
|
@ -7118,18 +7125,22 @@ subtraction; it has no enforcement role at all.
|
||||||
*And it is where a lot of the corpus lives.* 133 of the 318 passing graded
|
*And it is where a lot of the corpus lives.* 133 of the 318 passing graded
|
||||||
leaves — 42% — sit on it, at mean quality 0.810.
|
leaves — 42% — sit on it, at mean quality 0.810.
|
||||||
|
|
||||||
**What the peak implies, in metres.** The gaussian peaks at `1/crink = 0.833`,
|
~~**What the peak implies, in metres.** The gaussian peaks at `1/crink =
|
||||||
i.e. a room `0.833 × h` deep. At h = 3 m that is a **2.5 m** room. Single-aspect
|
0.833`, i.e. a room `0.833 × h` deep. At h = 3 m that is a **2.5 m** room. An
|
||||||
quality against depth:
|
ordinary 4 m room loses 60% of its value. And the corpus's realised median
|
||||||
|
|
||||||
| depth (m) | 1.0 | 2.0 | 2.5 | 3.0 | 4.0 | 4.5 | 5.0 | 6.0 |
|
|
||||||
|---|---|---|---|---|---|---|---|---|
|
|
||||||
| quality | 0.395 | 0.902 | **1.000** | 0.902 | 0.395 | 0.191 | 0.076 ✗ | 0.006 ✗ |
|
|
||||||
|
|
||||||
An ordinary 4 m room loses 60% of its value. And the corpus's realised median
|
|
||||||
depth is **2.95 m** — the search has been building 3 m deep rooms because that
|
depth is **2.95 m** — the search has been building 3 m deep rooms because that
|
||||||
is what it is paid for. That is not the search failing to find good buildings;
|
is what it is paid for. That is not the search failing to find good buildings;
|
||||||
it is the search succeeding at a badly-specified goal.
|
it is the search succeeding at a badly-specified goal.~~
|
||||||
|
|
||||||
|
**WITHDRAWN (§39.16).** Both halves of that are wrong. The table it rested on
|
||||||
|
read `1/crink` as room depth; it is depth **per illuminated wall**, so the
|
||||||
|
2.5 m figure is what Alexander 159 asks for on *each* side and the rule it
|
||||||
|
encodes is "a room deeper than 2.5 m per window needs another window". A 4 m
|
||||||
|
room scores 0.395 lit on one side and **0.902** lit on two — which is the
|
||||||
|
pattern working, not a defect. And the "realised median depth 2.95 m" was
|
||||||
|
`A/L`, not depth: the corpus's single-aspect leaves are a median 3.46 m deep
|
||||||
|
and its two-opposite leaves 4.42 m. Ordinary rooms. The claim that the search
|
||||||
|
was driven to build shallow ones does not survive.
|
||||||
|
|
||||||
**What shipped: `crinkliness_shape="daylight"`, default OFF.** A room shallower
|
**What shipped: `crinkliness_shape="daylight"`, default OFF.** A room shallower
|
||||||
than the peak scores 1.0. Daylight is a sufficiency requirement — enough is
|
than the peak scores 1.0. Daylight is a sufficiency requirement — enough is
|
||||||
|
|
@ -7170,8 +7181,9 @@ Per artefact the score moves +0.2% to +19.6%, and unlike the tail change it
|
||||||
reaches health-centre and programme-house, where the ramp was 0.000% on every
|
reaches health-centre and programme-house, where the ramp was 0.000% on every
|
||||||
seed.
|
seed.
|
||||||
|
|
||||||
**Honest scope.** This removes a double-charge and an absurd optimum, but it
|
**Honest scope.** This removes a double-charge (not "an absurd optimum" — see
|
||||||
recovers only 0.480 → 0.513 of the factor's harshness. Crinkliness is still the
|
the withdrawal above), but it recovers only 0.480 → 0.513 of the factor's
|
||||||
|
harshness. Crinkliness is still the
|
||||||
harshest of the seven quality factors, and the bulk of that is now concentrated
|
harshest of the seven quality factors, and the bulk of that is now concentrated
|
||||||
in the part this change deliberately did not touch: the steep decay from the
|
in the part this change deliberately did not touch: the steep decay from the
|
||||||
2.5 m saturation point to the 4.86 m limit, which takes an ordinary 4 m room to
|
2.5 m saturation point to the 4.86 m limit, which takes an ordinary 4 m room to
|
||||||
|
|
@ -7270,16 +7282,27 @@ for programme size, as a cross-programme comparison would not:
|
||||||
| too deep, spec contradictory as declared | 17 (15%) |
|
| too deep, spec contradictory as declared | 17 (15%) |
|
||||||
| too deep, other | 18 (16%) |
|
| too deep, other | 18 (16%) |
|
||||||
|
|
||||||
**So what is actually wrong is not a sigma.** It is that three declared
|
~~**So what is actually wrong is not a sigma.** It is that three declared
|
||||||
quantities — target area, target aspect, and the daylight limit — are jointly
|
quantities — target area, target aspect, and the daylight limit — are jointly
|
||||||
contradictory for six specs, and nothing told anyone. Of the three, the
|
contradictory for six specs, and nothing told anyone.~~
|
||||||
daylight limit is the one with independent support: the gaussian's own crossing
|
|
||||||
and §38.3's frontage bound, derived separately, agree at `1.62·h` = 4.86 m, and
|
**PARTLY WITHDRAWN (§39.16).** The measurement stands; "contradictory" does
|
||||||
the architectural rule of thumb for single-sided daylight (roughly twice the
|
not. Those six specs are not mis-specified — they are large rooms, and the
|
||||||
window head height) puts it in the same region. The area and aspect targets are
|
constant is Alexander 159, so a large room *is supposed to* need light on two
|
||||||
the author's brief. So the resolution is a decision for the programme author —
|
sides. The audit column is reporting the pattern doing its job. What is real,
|
||||||
shrink the room, allow a deeper aspect, or say out loud that it wants a corner
|
and what the column is genuinely useful for, is the **tension between that
|
||||||
— and not a new constant chosen to make the number go down.
|
demand and what the plan form can supply**: harbor asks for 7 rooms with two
|
||||||
|
aspects and maple 6, while across the twelve baseline runs only 33.7% of graded
|
||||||
|
leaves achieve two or more sides at all. The daylight limit itself is the
|
||||||
|
best-supported number in the objective — the gaussian's own crossing, §38.3's
|
||||||
|
frontage bound, and a named design pattern all agree — so it is the last thing
|
||||||
|
that should be retuned.
|
||||||
|
|
||||||
|
The author decision it prompts is therefore not "shrink the room": it is
|
||||||
|
whether the *plot* can give these rooms two aspects. §39.11 already computed
|
||||||
|
the aggregate form of the same question and found harbor needs roughly 49 m² of
|
||||||
|
courtyard to close its frontage gap. A courtyard is precisely what turns
|
||||||
|
single-aspect rooms into two-aspect ones.
|
||||||
|
|
||||||
**Shipped:** the `at declared target` column in `audit_programme_config.py`,
|
**Shipped:** the `at declared target` column in `audit_programme_config.py`,
|
||||||
the tool CLAUDE.md already sends programme authors to, plus a count of
|
the tool CLAUDE.md already sends programme authors to, plus a count of
|
||||||
|
|
@ -7302,3 +7325,83 @@ the size gaussian's upper half is the main thing that makes it fall. Removing
|
||||||
it on the analogy with crinkliness would license the search to inflate every
|
it on the analogy with crinkliness would license the search to inflate every
|
||||||
room until it ran out of plot. If that upper bound is the wrong instrument, the
|
room until it ran out of plot. If that upper bound is the wrong instrument, the
|
||||||
thing to re-examine is the value rate, not the sigma.
|
thing to re-examine is the value rate, not the sigma.
|
||||||
|
|
||||||
|
### 39.16 The crinkliness constant is Alexander 159, and that corrects §39.14/§39.15 (`homemaker-py-u5q`)
|
||||||
|
|
||||||
|
The owner supplied the provenance §39.14 and §39.15 were missing: *the
|
||||||
|
crinkliness number comes from Alexander's "light on two sides of every room"
|
||||||
|
pattern — shallow rooms such as corridors along an outside wall can have light
|
||||||
|
on one side, but deep rooms need to be on a corner or have external walls on
|
||||||
|
opposite sides of the room.*
|
||||||
|
|
||||||
|
That is A Pattern Language 159, and it changes what the constants mean.
|
||||||
|
|
||||||
|
**The same numbers, read correctly.** `1/crink = A/(L·h)` is floor area per
|
||||||
|
metre of *illuminated wall*, divided by storey height — not room depth. Room
|
||||||
|
depth only equals it when the room is lit on one side. So:
|
||||||
|
|
||||||
|
| lighting | depth at the peak | depth at the fail edge |
|
||||||
|
|---|---|---|
|
||||||
|
| one side | 2.50 m | 4.86 m |
|
||||||
|
| two opposite sides | 5.00 m | 9.72 m |
|
||||||
|
|
||||||
|
The constant says **2.5 m of room depth per window wall**. A room deeper than
|
||||||
|
that needs another window. That is the pattern, stated as a ratio. §39.14 read
|
||||||
|
the 2.5 m as an absurd optimum for a whole room; it is the depth Alexander
|
||||||
|
allows *per side*. A 4 m room scores 0.395 lit on one side and **0.902** lit on
|
||||||
|
two — the factor is not miscalibrated, it is doing exactly what it was built to
|
||||||
|
do.
|
||||||
|
|
||||||
|
**What the corpus actually achieves**, over the 430 graded leaves in the twelve
|
||||||
|
500 k baseline runs:
|
||||||
|
|
||||||
|
| exposure | n | share | crinkliness fail rate |
|
||||||
|
|---|---|---|---|
|
||||||
|
| unlit | 77 | 17.9% | **100%** |
|
||||||
|
| one side | 208 | 48.4% | 15% |
|
||||||
|
| two — corner | 87 | 20.2% | 2% |
|
||||||
|
| two — opposite | 34 | 7.9% | **0%** |
|
||||||
|
| three or four | 24 | 5.6% | 4% |
|
||||||
|
|
||||||
|
Light on two sides all but guarantees a pass. The entire crinkliness residual
|
||||||
|
is leaves that did not get it. That also disposes of §39.14's "the search built
|
||||||
|
2.95 m rooms because that is what it was paid for": 2.95 m was the median
|
||||||
|
`A/L`, and the corpus's single-aspect leaves are a median **3.46 m** deep, its
|
||||||
|
two-opposite leaves **4.42 m**. Ordinary rooms.
|
||||||
|
|
||||||
|
**What survives, on a better argument.** `crinkliness_shape="daylight"` still
|
||||||
|
stands, but not because the peak is absurd. Alexander 159 states a
|
||||||
|
**minimum** — light on *at least* two sides — and a two-sided gaussian turns a
|
||||||
|
minimum into a target, penalising rooms for exceeding it. Of the 133 leaves on
|
||||||
|
the clipped side of the peak, **68% are lit on two or more sides**, at mean
|
||||||
|
quality 0.770:
|
||||||
|
|
||||||
|
| exposure of the clipped leaves | n | share | mean stock quality |
|
||||||
|
|---|---|---|---|
|
||||||
|
| two — corner | 55 | 41.4% | 0.748 |
|
||||||
|
| one side | 43 | 32.3% | 0.896 |
|
||||||
|
| two — opposite | 23 | 17.3% | 0.854 |
|
||||||
|
| three or four | 12 | 9.0% | 0.710 |
|
||||||
|
|
||||||
|
So the stock factor's near side is docking a fifth to a quarter of the value of
|
||||||
|
rooms that *satisfy the pattern well* — and doing it on top of the
|
||||||
|
`exterior_wall`/`boundary_wall` charge those windows already carry in `cost`.
|
||||||
|
Both reasons to clip it survive; the "2.5 m optimum" reason does not, and is
|
||||||
|
withdrawn.
|
||||||
|
|
||||||
|
**And it relocates the residual.** The crinkliness fails are not a calibration
|
||||||
|
error to be tuned away. They are leaves that failed to get light on two sides —
|
||||||
|
77 with no light at all (`k54`), and 32 of the 208 single-aspect ones. The
|
||||||
|
question that follows is not *what should sigma be* but *why can a binary
|
||||||
|
slicing tree on a convex plot only give a third of its leaves two aspects*, and
|
||||||
|
the answer §39.11 already reached from the other direction is courtyards: an
|
||||||
|
internal void turns single-aspect rooms into two-aspect ones, and harbor's
|
||||||
|
frontage gap wants ~49 m² of it. `homemaker-py-7b7` enlarged the health-centre
|
||||||
|
plot assuming a courtyard shape for the same reason.
|
||||||
|
|
||||||
|
**Method note, because it cost two published errors.** Both mistakes came from
|
||||||
|
reading a ratio as a length: `1/crink` was taken for room depth, and the median
|
||||||
|
`A/L` was reported as the median depth of built rooms. A dimensionless
|
||||||
|
constant with a physical interpretation needs that interpretation written down
|
||||||
|
next to it — and, where one exists, its provenance. `uncrinkliness: [5/6,
|
||||||
|
1.1/3]` now carries both in `fitness.py`.
|
||||||
|
|
|
||||||
|
|
@ -198,6 +198,23 @@ CONF_DEFAULTS: dict = {
|
||||||
"plot_ratio": [2.00, 0.50],
|
"plot_ratio": [2.00, 0.50],
|
||||||
"ratio_outside": [0.33, 0.15],
|
"ratio_outside": [0.33, 0.15],
|
||||||
"ratio_circulation": [0.00, 0.20],
|
"ratio_circulation": [0.00, 0.20],
|
||||||
|
# PROVENANCE (DESIGN.md §39.16). This is Christopher Alexander, A Pattern
|
||||||
|
# Language 159, "Light on Two Sides of Every Room" -- not an arbitrary
|
||||||
|
# constant. The factor is evaluated at `1/crink = A/(L*h)`: floor area per
|
||||||
|
# metre of ILLUMINATED wall, over storey height. It is NOT room depth, and
|
||||||
|
# reading it as depth has caused two published errors -- it equals depth
|
||||||
|
# only for a room lit on one side.
|
||||||
|
#
|
||||||
|
# 5/6 x h = 2.5 m at h=3 is therefore 2.5 m of room depth PER WINDOW WALL:
|
||||||
|
# a shallow room (a corridor along an outside wall) may be lit on one side,
|
||||||
|
# a deeper one needs a corner or windows on opposite walls. At the fail
|
||||||
|
# edge (+2.146 sigma) the allowance is 4.86 m per wall -- so 4.86 m
|
||||||
|
# single-aspect, or 9.72 m between two opposite windows.
|
||||||
|
#
|
||||||
|
# Independently corroborated twice: the gaussian's own FAIL_THRESHOLD
|
||||||
|
# crossing and §38.3's frontage bound `L >= A/(1.6202*h)`, derived
|
||||||
|
# separately, agree at 1.6202. Of the numbers in this table it is the
|
||||||
|
# best-supported, and the last that should be retuned.
|
||||||
"uncrinkliness": [5.0 / 6, 1.1 / 3],
|
"uncrinkliness": [5.0 / 6, 1.1 / 3],
|
||||||
"uncrinkliness_circulation": [5.0 / 6, 1.1 / 3],
|
"uncrinkliness_circulation": [5.0 / 6, 1.1 / 3],
|
||||||
"size_circulation": [0.0, 14.0],
|
"size_circulation": [0.0, 14.0],
|
||||||
|
|
@ -1315,12 +1332,15 @@ class Fitness:
|
||||||
return self._crinkliness_floor if mode == "floor" else 0.0
|
return self._crinkliness_floor if mode == "floor" else 0.0
|
||||||
|
|
||||||
if self._crinkliness_shape == "daylight" and 1 / crink <= distance:
|
if self._crinkliness_shape == "daylight" and 1 / crink <= distance:
|
||||||
# homemaker-py-9gj (DESIGN.md §39.14). `1/crink` is the room's mean
|
# homemaker-py-9gj (DESIGN.md §39.14, corrected by §39.16).
|
||||||
# depth from its daylit wall in storey-heights, so `1/crink <=
|
# `1/crink` is floor area per metre of illuminated wall over storey
|
||||||
# distance` means comfortably lit -- shallower than the point the
|
# height -- room depth PER WINDOW WALL, not room depth. The target
|
||||||
# stock gaussian peaks at. Stock decays from there as if surplus
|
# is Alexander 159, which states a MINIMUM (light on at least two
|
||||||
# daylight were a defect; it is not one this factor should price,
|
# sides), and a two-sided gaussian turns a minimum into a target:
|
||||||
# because the extra exterior wall is already billed in `cost`.
|
# 68% of the leaves in this clipped region are lit on two or more
|
||||||
|
# sides and are being docked for satisfying the pattern well. Nor
|
||||||
|
# should this factor price the surplus envelope -- `edge_cost` and
|
||||||
|
# `outside_edge_cost` already bill that wall.
|
||||||
# Clipping here (rather than at the fail threshold) keeps the
|
# Clipping here (rather than at the fail threshold) keeps the
|
||||||
# factor CONTINUOUS: the graded approach to the daylight limit
|
# factor CONTINUOUS: the graded approach to the daylight limit
|
||||||
# survives, and no 10x cliff is introduced at the very boundary
|
# survives, and no 10x cliff is introduced at the very boundary
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue