TAP version 13
# Subtest: carved ground is a metre grid with exact, slope-limited road profiles
ok 1 - carved ground is a metre grid with exact, slope-limited road profiles
  ---
  duration_ms: 16658.804818
  ...
# Subtest: square paving has a small drainage fall and the grade survives a JSON round trip
ok 2 - square paving has a small drainage fall and the grade survives a JSON round trip
  ---
  duration_ms: 116.402989
  ...
# Subtest: road ends meet roads, squares, terminal walls or the world boundary, never an unlabelled void
ok 3 - road ends meet roads, squares, terminal walls or the world boundary, never an unlabelled void
  ---
  duration_ms: 317.172947
  ...
# Subtest: straight town rows touch their marked party neighbour, while house widths remain exact inputs
ok 4 - straight town rows touch their marked party neighbour, while house widths remain exact inputs
  ---
  duration_ms: 2.974534
  ...
# Subtest: house pad interiors are flat on the same ground sampled by the walker
ok 5 - house pad interiors are flat on the same ground sampled by the walker
  ---
  duration_ms: 161.988975
  ...
# Subtest: every possible street, rear and barn door has 1.6 m free across tiers, sites and seeds 1 to 5
ok 6 - every possible street, rear and barn door has 1.6 m free across tiers, sites and seeds 1 to 5
  ---
  duration_ms: 182283.677071
  ...
# Subtest: every long urban street shows a shop, bakery, smithy or tavern; the square and gates keep taverns
ok 7 - every long urban street shows a shop, bakery, smithy or tavern; the square and gates keep taverns
  ---
  duration_ms: 20.621616
  ...
# Subtest: retaining walls stand only where the carved ground steps, and never run deep underground
ok 8 - retaining walls stand only where the carved ground steps, and never run deep underground
  ---
  duration_ms: 10.276187
  ...
# house budget: baseline 108518, max patrician 148564, ratio 1.369 (town atom ceilings)
# round 5 irregular triangle ceiling ratio: 1.059 (existing kit counts, add-on ceilings)
# Subtest: catalogue is deterministic, measured and covers wealth, place and construction choices
ok 9 - catalogue is deterministic, measured and covers wealth, place and construction choices
  ---
  duration_ms: 113.76058
  ...
# Subtest: every archetype builds error-free across 20 complete catalogues and all house trades
ok 10 - every archetype builds error-free across 20 complete catalogues and all house trades
  ---
  duration_ms: 3442.750848
  ...
# Subtest: explicit massing overrides win and tower has two stone floors and an oriel
ok 11 - explicit massing overrides win and tower has two stone floors and an oriel
  ---
  duration_ms: 1.743552
  ...
# Subtest: door law: falling ground gets an undercroft door, intermediate and rising slopes get none
ok 12 - door law: falling ground gets an undercroft door, intermediate and rising slopes get none
  ---
  duration_ms: 53.400767
  ...
# Subtest: backDoor false removes every back door, including cellar doors; back-grade boundaries are exact
ok 13 - backDoor false removes every back door, including cellar doors; back-grade boundaries are exact
  ---
  duration_ms: 4.604723
  ...
# Subtest: wealth swaps glazing and chimney stacks; trade only changes the sign
ok 14 - wealth swaps glazing and chimney stacks; trade only changes the sign
  ---
  duration_ms: 16.57066
  ...
# Subtest: brace patterns are structural choices: no braces, corner K atoms or generated X members
ok 15 - brace patterns are structural choices: no braces, corner K atoms or generated X members
  ---
  duration_ms: 11.813094
  ...
# Subtest: missing town kit means sized grey-box instances and findings, thatch falls back to tile strips
ok 16 - missing town kit means sized grey-box instances and findings, thatch falls back to tile strips
  ---
  duration_ms: 6.596519
  ...
# Subtest: new roof furniture sits on the roof field and far/lite preserve the existing detail rules
ok 17 - new roof furniture sits on the roof field and far/lite preserve the existing detail rules
  ---
  duration_ms: 7.820501
  ...
# Subtest: full patrician stays within 1.6x a current 3-bay house; thatch is cheaper than tile
ok 18 - full patrician stays within 1.6x a current 3-bay house; thatch is cheaper than tile
  ---
  duration_ms: 994.446366
  ...
# Subtest: round 5 unglazed windows have four wall jambs and an exact warm interior, including gables
ok 19 - round 5 unglazed windows have four wall jambs and an exact warm interior, including gables
  ---
  duration_ms: 3.151097
  ...
# Subtest: round 5 exact frontage fits 4-14 m without shrinking the street door
ok 20 - round 5 exact frontage fits 4-14 m without shrinking the street door
  ---
  duration_ms: 246.129897
  ...
# Subtest: round 5 wall ground drops buried openings, enforces door contact and reaches the lowest wall
ok 21 - round 5 wall ground drops buried openings, enforces door contact and reaches the lowest wall
  ---
  duration_ms: 3.724148
  ...
# Subtest: round 5 steps are 17 cm rises, 30 cm treads and meet the unchanged door bottom
ok 22 - round 5 steps are 17 cm rises, 30 cm treads and meet the unchanged door bottom
  ---
  duration_ms: 19.161067
  ...
# Subtest: round 5 irregular zero is the previous spec; seeded warp keeps the same geometry and party planes
ok 23 - round 5 irregular zero is the previous spec; seeded warp keeps the same geometry and party planes
  ---
  duration_ms: 172.031515
  ...
# Subtest: round 5 legacy spec hashes are pinned byte-for-byte
ok 24 - round 5 legacy spec hashes are pinned byte-for-byte
  ---
  duration_ms: 1.923835
  ...
# Subtest: round 5 barn is long and low, with one tall floor, loft hatch, slit pairs and no chimney or glazing
ok 25 - round 5 barn is long and low, with one tall floor, loft hatch, slit pairs and no chimney or glazing
  ---
  duration_ms: 71.8005
  ...
# Subtest: round 5 street-facing trades have different silhouettes, counters and tools, not just signs
ok 26 - round 5 street-facing trades have different silhouettes, counters and tools, not just signs
  ---
  duration_ms: 87.714868
  ...
# Subtest: round 5 aged kit swaps strips, ridge, plaster and oak only when their shelf and atoms are available
ok 27 - round 5 aged kit swaps strips, ridge, plaster and oak only when their shelf and atoms are available
  ---
  duration_ms: 17.906284
  ...
# Subtest: round 5 full-detail irregular houses stay within 1.15x the equivalent current house
ok 28 - round 5 full-detail irregular houses stay within 1.15x the equivalent current house
  ---
  duration_ms: 631.793081
  ...
# Subtest: every relative import stays inside omg/kit/building
ok 29 - every relative import stays inside omg/kit/building
  ---
  duration_ms: 12.472866
  ...
# Subtest: church: slices join with no gaps and add up to the footprint
ok 30 - church: slices join with no gaps and add up to the footprint
  ---
  duration_ms: 11.473607
  ...
# Subtest: church: counts follow the options
ok 31 - church: counts follow the options
  ---
  duration_ms: 0.949537
  ...
# Subtest: church: tower stacks by height, door bay and porch face +Z, west front at -X
ok 32 - church: tower stacks by height, door bay and porch face +Z, west front at -X
  ---
  duration_ms: 0.853696
  ...
# Subtest: landmarks are deterministic per seed and vary across seeds
ok 33 - landmarks are deterministic per seed and vary across seeds
  ---
  duration_ms: 16.108771
  ...
# Subtest: cathedral: chain, crossing, transepts mirrored on -Z, spires
ok 34 - cathedral: chain, crossing, transepts mirrored on -Z, spires
  ---
  duration_ms: 8.558355
  ...
# Subtest: kit lengths win when given, the table when absent or silly; missing atoms are findings
ok 35 - kit lengths win when given, the table when absent or silly; missing atoms are findings
  ---
  duration_ms: 2.130959
  ...
# Subtest: footprint for the planner and massing boxes for a missing kit
ok 36 - footprint for the planner and massing boxes for a missing kit
  ---
  duration_ms: 1.827313
  ...
# Subtest: churchyard: closed wall ring with a lychgate gap, graves outside the church
ok 37 - churchyard: closed wall ring with a lychgate gap, graves outside the church
  ---
  duration_ms: 0.966217
  ...
# Subtest: checkLandmark reports a broken chain
ok 38 - checkLandmark reports a broken chain
  ---
  duration_ms: 0.804655
  ...
# Subtest: wealth rings: square elite, merchants on core main roads, poor near walls and outside
not ok 39 - wealth rings: square elite, merchants on core main roads, poor near walls and outside
  ---
  duration_ms: 5282.696715
  location: '/home/claude-agent/forge-build/forge-assets/.forge-worktrees/1791498880-fc9b80/omg/kit/building/test/layout-model.test.mjs:16:1'
  failureType: 'testCodeFailure'
  error: |-
    The expression evaluated to a falsy value:
    
      assert.ok(distance([p.x, p.z], C) < plan.rect.R * 0.5)
    
  code: 'ERR_ASSERTION'
  name: 'AssertionError'
  expected: true
  actual: false
  operator: '=='
  stack: |-
    TestContext.<anonymous> (file:///home/claude-agent/forge-build/forge-assets/.forge-worktrees/1791498880-fc9b80/omg/kit/building/test/layout-model.test.mjs:24:151)
    Test.runInAsyncScope (node:async_hooks:206:9)
    Test.run (node:internal/test_runner/test:796:25)
    Test.processPendingSubtests (node:internal/test_runner/test:526:18)
    node:internal/test_runner/harness:255:12
    node:internal/process/task_queues:140:7
    AsyncResource.runInAsyncScope (node:async_hooks:206:9)
    AsyncResource.runMicrotask (node:internal/process/task_queues:137:8)
  ...
# Subtest: village and hamlet houses stay low; no street side repeats the same profile three times
ok 40 - village and hamlet houses stay low; no street side repeats the same profile three times
  ---
  duration_ms: 34200.20923
  ...
# Subtest: church is at a square corner; towns have a well, pillory, gate fish market and sheltered garden
ok 41 - church is at a square corner; towns have a well, pillory, gate fish market and sheltered garden
  ---
  duration_ms: 5.212695
  ...
# Subtest: gate suburbs are wholly outside the wall and clear of its roads, with vegetable gardens
ok 42 - gate suburbs are wholly outside the wall and clear of its roads, with vegetable gardens
  ---
  duration_ms: 19.671757
  ...
# Subtest: road sampler uses the drawn triangle heights, including lift, on sharply changing ground
ok 43 - road sampler uses the drawn triangle heights, including lift, on sharply changing ground
  ---
  duration_ms: 1.375225
  ...
# Subtest: all plots have rear grade inputs and blocked/back-to-back rows never have a rear door
ok 44 - all plots have rear grade inputs and blocked/back-to-back rows never have a rear door
  ---
  duration_ms: 1890.423263
  ...
# Subtest: real catalogue variants fit plots and every built street and rear door meets its drawn ground
ok 45 - real catalogue variants fit plots and every built street and rear door meets its drawn ground
  ---
  duration_ms: 12401.398191
  ...
# Subtest: a village without a market hall keeps its council tavern on the square
ok 46 - a village without a market hall keeps its council tavern on the square
  ---
  duration_ms: 9707.780309
  ...
# Subtest: new civic and fish props obey the footprint, road, wall, water and level-ground laws
ok 47 - new civic and fish props obey the footprint, road, wall, water and level-ground laws
  ---
  duration_ms: 354.723324
  ...
# Subtest: renderer passes the exact frontage and measured per-wall ground inputs without extra public layout calls
ok 48 - renderer passes the exact frontage and measured per-wall ground inputs without extra public layout calls
  ---
  duration_ms: 7505.823615
  ...
# fixture: 1581 instances, 87766 triangles, 6 panels, missing roles: eaves.gutter_end
# instances per house over 50 specs: min 1003 / mean 1650 / max 2389
# short top course appears at 3 of 21 depths between 6 and 8 m
# houses.mjs numbers -> gutter-clear: The gutter top is -205 mm below the lowest slate on main/front; it must be 20-40 mm, so the slates would touch the gutter. | gutter-gap: The gutter on main/front stops 120 mm short of the roof edge.
# Subtest: fixture: layout has 0 errors and sane counts
ok 49 - fixture: layout has 0 errors and sane counts
  ---
  duration_ms: 136.929969
  ...
# Subtest: fixture: roof laid from the eaves up, gutter law, downpipes
ok 50 - fixture: roof laid from the eaves up, gutter law, downpipes
  ---
  duration_ms: 77.691772
  ...
# Subtest: fixture: no dormers means no cut; units skip a gable chimney footprint
ok 51 - fixture: no dormers means no cut; units skip a gable chimney footprint
  ---
  duration_ms: 43.446749
  ...
# Subtest: 50 synthetic specs: 0 errors (w 6-12, d 6-8, 1-2 storeys)
ok 52 - 50 synthetic specs: 0 errors (w 6-12, d 6-8, 1-2 storeys)
  ---
  duration_ms: 2039.928033
  ...
# Subtest: attic case: kneewall 0.6 + dormers, 0 errors, no slate centre in a dormer cut
ok 53 - attic case: kneewall 0.6 + dormers, 0 errors, no slate centre in a dormer cut
  ---
  duration_ms: 128.145369
  ...
# Subtest: a 7 m run gets one downpipe, a short top course appears when the gap exceeds the ridge cover
ok 54 - a 7 m run gets one downpipe, a short top course appears when the gap exceeds the ridge cover
  ---
  duration_ms: 578.583716
  ...
# Subtest: tints: different paint gives different instance tints for the same atom part
ok 55 - tints: different paint gives different instance tints for the same atom part
  ---
  duration_ms: 43.275906
  ...
# Subtest: today's houses.mjs roof + gutter FAILS the gutter clearance check
ok 56 - today's houses.mjs roof + gutter FAILS the gutter clearance check
  ---
  duration_ms: 8.448394
  ...
# Subtest: overlap check can fail: two windows on the same spot
ok 57 - overlap check can fail: two windows on the same spot
  ---
  duration_ms: 30.314391
  ...
# Subtest: corner-zone check can fail: a shuttered window pushed to the corner
ok 58 - corner-zone check can fail: a shuttered window pushed to the corner
  ---
  duration_ms: 62.18901
  ...
# Subtest: obbOf respects scale and rotation
ok 59 - obbOf respects scale and rotation
  ---
  duration_ms: 0.54321
  ...
# far triangles per house (worst of 12): {"house":1330,"tavern":1490,"smithy":670,"shop":664,"bakery":620,"market_hall":110,"barn":226}
# Subtest: full is the default and does not change
ok 60 - full is the default and does not change
  ---
  duration_ms: 270.770802
  ...
# Subtest: lite drops the tiles, strips and underlay and adds one slab per slope
ok 61 - lite drops the tiles, strips and underlay and adds one slab per slope
  ---
  duration_ms: 257.752365
  ...
# Subtest: lite slabs are in the same place as the tile roof (ridge, eaves)
ok 62 - lite slabs are in the same place as the tile roof (ridge, eaves)
  ---
  duration_ms: 3.551504
  ...
# Subtest: render: a lite slab and a flat wall are a handful of triangles
ok 63 - render: a lite slab and a flat wall are a handful of triangles
  ---
  duration_ms: 32.846077
  ...
# Subtest: buildSettlement: detail by tier, override and near
ok 64 - buildSettlement: detail by tier, override and near
  ---
  duration_ms: 33830.163765
  ...
# Subtest: simplify: a heavy part loses triangles, a light one is untouched
ok 65 - simplify: a heavy part loses triangles, a light one is untouched
  ---
  duration_ms: 40.083969
  ...
# Subtest: full and lite layouts are byte-identical to before far existed (pinned)
ok 66 - full and lite layouts are byte-identical to before far existed (pinned)
  ---
  duration_ms: 433.290447
  ...
# Subtest: far: at most 2500 triangles per medieval house, same bbox, one opening per window and door
ok 67 - far: at most 2500 triangles per medieval house, same bbox, one opening per window and door
  ---
  duration_ms: 611.063924
  ...
# Subtest: far: Breton houses (openings, chimney and dormer boxes, no atoms)
ok 68 - far: Breton houses (openings, chimney and dormer boxes, no atoms)
  ---
  duration_ms: 107.765682
  ...
# Subtest: buildSettlement: far, auto-far with near, farBuildings
ok 69 - buildSettlement: far, auto-far with near, farBuildings
  ---
  duration_ms: 21671.431846
  ...
# Subtest: area centroid supports triangles and uneven polygons, independent of edge subdivision
ok 70 - area centroid supports triangles and uneven polygons, independent of edge subdivision
  ---
  duration_ms: 2.447524
  ...
# Subtest: a settlement renders with every new kit missing
ok 71 - a settlement renders with every new kit missing
  ---
  duration_ms: 23998.300356
  ...
# Subtest: same plan, same colliders
ok 72 - same plan, same colliders
  ---
  duration_ms: 5691.613935
  ...
# type       width        storeys     tries ...
# house      5.30-11.73 m  storeys 2/1        avg tries 1.00  first-try 200/200  fallbacks 0
# longhouse  9.85-17.33 m  storeys 1+attic    avg tries 1.00  first-try 200/200  fallbacks 0
# tavern     7.55-14.53 m  storeys 2          avg tries 1.00  first-try 200/200  fallbacks 0
# shop       7.20-10.40 m  storeys 2          avg tries 1.00  first-try 200/200  fallbacks 0
#   one-window-per-storey: breton(1) -> main/front/storey 1: A 0.85 x 1.1 m window is used where every full storey takes the same 0.95 x 1.3 m window.
#   head-line: breton(1) -> main/front/storey 0: Ground windows end at 2.15 m but the door head is at 2.1 m; they must line up.
#   garden-facade: breton(1) -> main/back: The garden facade has no back door.
#   pier: breton(2) -> main/front/storey 0: Two neighbouring openings are 2.3 m apart; with shutters a bay needs 2.5 m.
# Subtest: 200 seeds x every type: 0 errors after re-roll, fallback < 5 %
ok 73 - 200 seeds x every type: 0 errors after re-roll, fallback < 5 %
  ---
  duration_ms: 687.812427
  ...
# Subtest: same seed = same hash, different seeds differ, overrides change the spec
ok 74 - same seed = same hash, different seeds differ, overrides change the spec
  ---
  duration_ms: 12.939516
  ...
# Subtest: the fixture passes check()
ok 75 - the fixture passes check()
  ---
  duration_ms: 0.470448
  ...
# Subtest: the fallback template passes check() for every type
ok 76 - the fallback template passes check() for every type
  ---
  duration_ms: 5.849707
  ...
# Subtest: types respect their template (attic, dormers, sign, double door, shopfronts, kneewall)
ok 77 - types respect their template (attic, dormers, sign, double door, shopfronts, kneewall)
  ---
  duration_ms: 113.273626
  ...
# Subtest: back door sits on an outer axis for 2-3 bay facades; garden axes mirror the street
ok 78 - back door sits on an outer axis for 2-3 bay facades; garden axes mirror the street
  ---
  duration_ms: 88.057846
  ...
# Subtest: lean-to annexes blank the bays they cover
ok 79 - lean-to annexes blank the bays they cover
  ---
  duration_ms: 143.882785
  ...
# Subtest: paint: blues in value 0.75-1.0 for door/shutters, cream joinery, buildings differ
ok 80 - paint: blues in value 0.75-1.0 for door/shutters, cream joinery, buildings differ
  ---
  duration_ms: 16.151495
  ...
# Subtest: roles: v1 names by default, v2 names when the kit has them, missing roles are reported
ok 81 - roles: v1 names by default, v2 names when the kit has them, missing roles are reported
  ---
  duration_ms: 1.60783
  ...
# Subtest: rule one-window-per-storey fails on today's breton() (ground 1.30 vs upper 1.10)
ok 82 - rule one-window-per-storey fails on today's breton() (ground 1.30 vs upper 1.10)
  ---
  duration_ms: 2.21244
  ...
# Subtest: rule head-line fails on today's breton() (ground heads 2.15 vs door 2.10)
ok 83 - rule head-line fails on today's breton() (ground heads 2.15 vs door 2.10)
  ---
  duration_ms: 0.996298
  ...
# Subtest: rule garden-facade fails on today's breton() (lone upper windows, no back door)
ok 84 - rule garden-facade fails on today's breton() (lone upper windows, no back door)
  ---
  duration_ms: 0.777534
  ...
# Subtest: rule pier fails on today's breton() (shutter leaves overlap)
ok 85 - rule pier fails on today's breton() (shutter leaves overlap)
  ---
  duration_ms: 1.543268
  ...
# Subtest: rules catch hand-made mistakes in a good spec
ok 86 - rules catch hand-made mistakes in a good spec
  ---
  duration_ms: 5.770705
  ...
# Subtest: writes the longhouse fixture for seat S2 (exact coordinates, from makeSpec)
ok 87 - writes the longhouse fixture for seat S2 (exact coordinates, from makeSpec)
  ---
  duration_ms: 5.413419
  ...
# medieval house    instances avg 1788 max 2265  panels avg 87 (beams 75)
# medieval tavern   instances avg 2747 max 3530  panels avg 137 (beams 123)
# medieval smithy   instances avg 1697 max 2101  panels avg 61 (beams 51)
# medieval shop     instances avg 1635 max 2304  panels avg 59 (beams 49)
# medieval bakery   instances avg 1639 max 2305  panels avg 59 (beams 49)
# medieval market_hall instances avg 2298 max 3325  panels avg 7 (beams 7)
# medieval barn     instances avg 1380 max 1983  panels avg 53 (beams 47)
# modern   villa    instances avg 85 max 100  panels avg 13 (beams 0)
# modern   terrace  instances avg 70 max 86  panels avg 15 (beams 0)
# modern   block3   instances avg 131 max 152  panels avg 17 (beams 0)
# modern   shop     instances avg 60 max 73  panels avg 11 (beams 0)
# Subtest: specs and layouts are deterministic, hash changes with the seed
ok 88 - specs and layouts are deterministic, hash changes with the seed
  ---
  duration_ms: 10873.328929
  ...
# Subtest: medieval: posts at every window jamb of the timber storeys
ok 89 - medieval: posts at every window jamb of the timber storeys
  ---
  duration_ms: 1627.742989
  ...
# Subtest: medieval: no brace crosses a window, braces only on the street facade end panels
ok 90 - medieval: no brace crosses a window, braces only on the street facade end panels
  ---
  duration_ms: 1642.630182
  ...
# Subtest: medieval: one window size per storey
ok 91 - medieval: one window size per storey
  ---
  duration_ms: 1628.637729
  ...
# Subtest: modern: one window size per storey
ok 92 - modern: one window size per storey
  ---
  duration_ms: 154.671984
  ...
# Subtest: modern: one head line per storey (windows, doors, sliders)
ok 93 - modern: one head line per storey (windows, doors, sliders)
  ---
  duration_ms: 148.808956
  ...
# Subtest: modern: parapet coping covers the full perimeter, a corner at each corner
ok 94 - modern: parapet coping covers the full perimeter, a corner at each corner
  ---
  duration_ms: 124.441272
  ...
# Subtest: modern: materials change at storey lines only, max 3 per facade; downpipes at the back corners clear of openings
ok 95 - modern: materials change at storey lines only, max 3 per facade; downpipes at the back corners clear of openings
  ---
  duration_ms: 116.477046
  ...
# Subtest: modern: balconies stack on the axes above a slider (block3)
ok 96 - modern: balconies stack on the axes above a slider (block3)
  ---
  duration_ms: 124.642036
  ...
# Subtest: medieval: tile courses never pass the ridge, rows are full width, lift never accumulates
ok 97 - medieval: tile courses never pass the ridge, rows are full width, lift never accumulates
  ---
  duration_ms: 2474.631456
  ...
# Subtest: medieval: jetty, stone ground storey, tavern features
ok 98 - medieval: jetty, stone ground storey, tavern features
  ---
  duration_ms: 1757.13332
  ...
# Subtest: report: instances and generated panels per building
ok 99 - report: instances and generated panels per building
  ---
  duration_ms: 1662.327711
  ...
# Subtest: smithy: forge_shed on a gable side, chimney_forge beside it, workshop door and sign on the street
ok 100 - smithy: forge_shed on a gable side, chimney_forge beside it, workshop door and sign on the street
  ---
  duration_ms: 936.486299
  ...
# Subtest: smithy: forge on the back wall when both sides are party walls
ok 101 - smithy: forge on the back wall when both sides are party walls
  ---
  duration_ms: 155.930567
  ...
# Subtest: bakery: window_bakery shop, bread_oven on the back, sign_baker, a chimney
ok 102 - bakery: window_bakery shop, bread_oven on the back, sign_baker, a chimney
  ---
  duration_ms: 774.748267
  ...
# Subtest: market_hall: open on all sides, a post on every bay axis, oak plates, tie beams, the tile roof
ok 103 - market_hall: open on all sides, a post on every bay axis, oak plates, tie beams, the tile roof
  ---
  duration_ms: 725.646291
  ...
# Subtest: trades instances carry their kit; the old types stay in the main kit
ok 104 - trades instances carry their kit; the old types stay in the main kit
  ---
  duration_ms: 256.29604
  ...
# Subtest: missing atoms are reported in layout.meta when the kit info lists the trades kit
ok 105 - missing atoms are reported in layout.meta when the kit info lists the trades kit
  ---
  duration_ms: 5.433619
  ...
# Subtest: party: blank side walls, no openings, no chimney, no verge there
ok 106 - party: blank side walls, no openings, no chimney, no verge there
  ---
  duration_ms: 1670.256301
  ...
# Subtest: plinth: the stone ground wall continues below grade on all sides, the door sill stays at the street level
ok 107 - plinth: the stone ground wall continues below grade on all sides, the door sill stays at the street level
  ---
  duration_ms: 1088.790604
  ...
# Subtest: gableFront: ridge along Z, the gable on the street with windows on the axes, narrow 4-7 m
ok 108 - gableFront: ridge along Z, the gable on the street with windows on the axes, narrow 4-7 m
  ---
  duration_ms: 1284.841225
  ...
# Subtest: gableFront with party walls: eaves on a party side do not overhang
ok 109 - gableFront with party walls: eaves on a party side do not overhang
  ---
  duration_ms: 129.687808
  ...
# Subtest: overrides leave default specs untouched
ok 110 - overrides leave default specs untouched
  ---
  duration_ms: 4.792168
  ...
# Subtest: breton: party and plinth overrides keep the spec and layout rules clean
ok 111 - breton: party and plinth overrides keep the spec and layout rules clean
  ---
  duration_ms: 6703.81637
  ...
# Subtest: breton: a lean-to annex gets one tiled slope under the main eaves, a gutter, and side walls that rise to the main wall
ok 112 - breton: a lean-to annex gets one tiled slope under the main eaves, a gutter, and side walls that rise to the main wall
  ---
  duration_ms: 967.518435
  ...
# Subtest: medieval: same seed gives the same village
ok 113 - medieval: same seed gives the same village
  ---
  duration_ms: 10.765916
  ...
# Subtest: medieval: every building's look comes from the village palette
ok 114 - medieval: every building's look comes from the village palette
  ---
  duration_ms: 9.491453
  ...
# Subtest: medieval: no two plots overlap (footprints 1 m apart)
ok 115 - medieval: no two plots overlap (footprints 1 m apart)
  ---
  duration_ms: 19.947604
  ...
# Subtest: medieval: type mix is about 70 % residential, taverns 1 per 10
ok 116 - medieval: type mix is about 70 % residential, taverns 1 per 10
  ---
  duration_ms: 7.10429
  ...
# Subtest: modern: same seed gives the same village
ok 117 - modern: same seed gives the same village
  ---
  duration_ms: 1.031779
  ...
# Subtest: modern: every building's look comes from the village palette
ok 118 - modern: every building's look comes from the village palette
  ---
  duration_ms: 1.849633
  ...
# Subtest: modern: no two plots overlap (footprints 1 m apart)
ok 119 - modern: no two plots overlap (footprints 1 m apart)
  ---
  duration_ms: 19.491436
  ...
# Subtest: modern: type mix is about 70 % residential, taverns 1 per 10
ok 120 - modern: type mix is about 70 % residential, taverns 1 per 10
  ---
  duration_ms: 0.356446
  ...
# Subtest: plots given by the game: positions are used as given
ok 121 - plots given by the game: positions are used as given
  ---
  duration_ms: 9.653816
  ...
# Subtest: village needs makeSpec
ok 122 - village needs makeSpec
  ---
  duration_ms: 2.453245
  ...
# hamlet/plain: {"bush":9,"flower_box":3,"oak":53,"firewood_stack":4,"basket_produce":3,"ash":11,"barrel_stack":1,"lantern_iron":2,"grass":111,"hay_cart":1,"barrel":1,"hay_bale":1,"hedge":18}
# village/plain: {"well_roofed":1,"bench_wood":3,"lantern_post":2,"flower_bed":4,"oak":77,"barrel":18,"grass":488,"flower_box":19,"lantern_iron":13,"ash":30,"firewood_stack":20,"bush":64,"ivy":16,"basket_produce":8,"barrel_stack":5,"washing_line":3,"trough":3,"hay_bale":2,"crate_stack":1,"market_goods":4,"hedge":155}
# town/hill: {"oak":106,"round_stone_bench":1,"churchyard_cross":2,"bench_wood":4,"lantern_post":4,"flower_bed":10,"bush":73,"firewood_stack":72,"grass":138,"flower_box":72,"ash":35,"lantern_iron":29,"ivy":17,"cart_hand":9,"hay_bale":10,"trough":4,"hay_cart":1,"basket_produce":1,"market_goods":22,"hedge":55}
# city/plain: {"oak":254,"round_stone_bench":1,"churchyard_cross":1,"bench_wood":4,"lantern_post":2,"flower_bed":15,"flower_box":256,"lantern_iron":87,"firewood_stack":137,"grass":401,"ivy":75,"basket_produce":47,"ash":89,"bush":242,"barrel":69,"barrel_stack":38,"hay_cart":15,"cart_hand":9,"hay_bale":6,"washing_line":2,"trough":2,"market_goods":22,"hedge":29}
# village/river: {"well_roofed":1,"bench_wood":4,"lantern_post":2,"oak":77,"bush":44,"barrel":15,"grass":482,"flower_box":16,"barrel_stack":9,"firewood_stack":15,"basket_produce":10,"ash":47,"lantern_iron":10,"ivy":11,"washing_line":5,"trough":5,"hay_bale":2,"crate_stack":1,"hay_cart":1,"market_goods":4,"hedge":86}
# town/coast: {"oak":108,"round_stone_bench":2,"churchyard_cross":2,"bench_wood":5,"lantern_post":3,"flower_bed":12,"flower_box":76,"grass":100,"bush":99,"barrel_stack":20,"ivy":26,"lantern_iron":31,"firewood_stack":47,"basket_produce":22,"barrel":24,"ash":35,"washing_line":3,"hay_bale":5,"trough":4,"hay_cart":8,"cart_hand":3,"market_goods":22,"hedge":50}
# Subtest: hamlet/plain/1: deterministic, level and clear roots
ok 123 - hamlet/plain/1: deterministic, level and clear roots
  ---
  duration_ms: 472.51287
  ...
# Subtest: village/plain/1: deterministic, level and clear roots
ok 124 - village/plain/1: deterministic, level and clear roots
  ---
  duration_ms: 7312.381769
  ...
# Subtest: town/hill/1: deterministic, level and clear roots
ok 125 - town/hill/1: deterministic, level and clear roots
  ---
  duration_ms: 10791.404979
  ...
# Subtest: city/plain/1: deterministic, level and clear roots
ok 126 - city/plain/1: deterministic, level and clear roots
  ---
  duration_ms: 45152.875769
  ...
# Subtest: village/river/7: deterministic, level and clear roots
ok 127 - village/river/7: deterministic, level and clear roots
  ---
  duration_ms: 5321.935693
  ...
# Subtest: town/coast/9: deterministic, level and clear roots
ok 128 - town/coast/9: deterministic, level and clear roots
  ---
  duration_ms: 7688.678403
  ...
# Subtest: dressing does not rewrite the finished layout
ok 129 - dressing does not rewrite the finished layout
  ---
  duration_ms: 86.271219
  ...
# Subtest: polygon collision includes concave square recesses
ok 130 - polygon collision includes concave square recesses
  ---
  duration_ms: 0.333126
  ...
# Subtest: flower boxes bind to real window sills, and removal releases dressing
ok 131 - flower boxes bind to real window sills, and removal releases dressing
  ---
  duration_ms: 73.079578
  ...
1..131
# tests 131
# suites 0
# pass 130
# fail 1
# cancelled 0
# skipped 0
# todo 0
# duration_ms 280725.189184
