Wall areas, floor areas, volumes, roof and ground are read from the Schependomlaan IFC by scripts/build-reference-building.mjs (inner-leaf exterior-wall walk, IfcSpace rows, storey datums, per-element roof shadows and one-sheet surfaces, the union of the ground-storey slab shadows and its outer ring). The roof area is the outer surface, derived as sporenkap surface 306.00 + (roofUnionSqm 361.86 − sporenkap plan 124.90) = 542.96 m² (A-ROOF-STACK). Glazing aperture and exterior-door aperture used here are stand-ins. The manifest's 106.06 m² glazing and 81.03 m² doors cover only openings resolved against the current exterior-wall set; missing knee/dormer hosts, corner windows and rooflights leave the full scope unresolved (A-WALL-SET-SCOPE). SCHEPENDOMLAAN_PENDING_MEASUREMENTS records the retained assumptions and their stated bias.
A-PLACEHOLDER-STATE · Three engine inputs remain stand-ins: glazing aperture, per-orientation glazing and exterior-door aperture. Partial aperture measurements exist; the complete envelope scope is unresolved.
The committed openings.json records 51 counted windows (106.06 m²), 12 sized windows outside the exterior-wall set (19.49 m²), 4 unresolved corner/splayed windows (5.57 m²), and 10 rooflights without stated dimensions. It records 16 counted doors (81.03 m²); 4 of the 20 IsExternal doors fall outside that wall set. Only 6 of 100 conditioned spaces have solids, so the probe cannot establish a complete boundary and host adjacency decides the counted set. The manifest's glazing and door totals therefore describe selected hosts, not a complete building envelope. Resolve omitted knee/dormer hosts and the remaining openings with A-WALL-SET-SCOPE before replacing the whole-building placeholders or changing the input state. SCHEPENDOMLAAN_PENDING_MEASUREMENTS keeps the original 115.50 m² glazing and 40.00 m² doors explicitly assumed; the legacy state name 'awaiting_lane_b_measurements' denotes this unresolved scope, not an absent extraction file.
A-GLAZING-AREA-PLACEHOLDER · 77 windows at a mean 1.5 m² give a 115.50 m² aperture.
The count is bim-bf's measurement; the mean pane is invented. A Dutch apartment mixes 3-4 m² living-room windows with 0.3-0.5 m² toilet lights and the mean of that mixture is not knowable from a count. The resulting 19.8 % WWR against gross wall is plausible for Dutch housing, which is exactly why it must be labelled — a plausible number is indistinguishable from a measured one once it has been multiplied by a U-value.
A-DOORS-AREA-PLACEHOLDER · 20 IfcDoor marked IsExternal at an assumed mean 2.0 m² give 40.00 m².
The count is an authoring-property count, not a confirmed exterior-boundary count. The extractor resolves 16 against the current exterior-wall set at 81.03 m²; four merk F-R doors sit outside it, and A-WALL-SET-SCOPE remains open. The 40.00 m² stays explicitly assumed while that scope is resolved. Doors remain separate from glazing so the gross-wall denominator keeps both quantities visible.
A-ROOF-STACK · The roof the engine prices is the outer surface, 542.96 m² = sporenkap surface 306.00 + (roofUnionSqm 361.86 − sporenkap plan 124.90), not the 692.04 m² the ten family surfaces sum to and not the 383.55 m² roofProjectedSqm.
The family surfaces cannot simply be summed, because they overlap in plan and are layers of the same roofs: dakvloer's nine slabs on storey '04 dak' (11.62–11.84 m) surface 259.73 but union to 135.37 — eight build-up slabs stacked on one deck, which a sum prices twice; the eight dormer roofs (14.49) and the thin plafond / dakisolatie / spouwisolatie / dakaftimmering pieces (10.77) sit inside the sporenkap's plan on top of it. What the rows do NOT show is the dakvloer under the sporenkap — the 64° sporenkap (44 ROOF slabs, 32 of them on storey 03 at 9.00 m, under the dakvloer's 11.62–11.84 m) is a steep band about 1.3 m wide around the top storey, and the flat dakvloer, plat dak and lifttop lie beside it: their unions 135.37 + 95.01 + 5.75 = 236.13 against the all-family union's 361.86 − 124.90 = 236.96, disjoint from the pitched roof to within 0.83 m². So the outer surface is the pitched roof at its surface plus the flat roofs at their plan, which is their surface. The dormer roofs are left inside the sporenkap's figure rather than added — if the sporenkap is cut at the dormers this understates by up to 14.49 m² plus the dormer cheeks. One solved roof U (the dakplaat panel) is applied to all of it, because the model resolves no separate flat-deck build-up; the flat decks may be built differently and the file does not say.
A-WWR-UNIFORM-PLACEHOLDER · The placeholder glazing is spread pro rata to the measured wall split, so every sector reads the same WWR.
The manifest now carries glazingByOrientationSqm on the same eight sector keys, but only for the selected-host aperture subset (A-PLACEHOLDER-STATE). Its non-uniform split is not yet a complete envelope distribution. SCHEPENDOMLAAN_WWR_BY_SECTOR keeps the original assumed spread until the wall/opening scope is resolved; a field being present is not evidence that its coverage is complete.
A-WWR-DENOMINATOR · WWR 0.1984 against GROSS wall area (opaque 426.63 + glazing 115.50 + doors 40.00 = 582.13 m²).
heat-loss.ts computes windows = gross × WWR and prices the remainder as opaque wall, so the ratio must be quoted against the same gross the engine is handed. Against the net 426.63 the windows would land right and 155 m² of real wall would be priced as nothing. Derived from the parts in code, never typed — so when the placeholders are replaced the expression is unchanged and the ratio simply moves.
A-WWR-ENGINE-MEAN · All four cardinal ratios handed to MaterialProperties are the single whole-building ratio, and the engine takes their plain arithmetic mean.
Not an oversight and not a thing to improve. Each per-sector ratio is quoted against that sector's GROSS wall, so the only mean that reproduces the aperture is Σ(rᵢ·grossᵢ)/Σgrossᵢ — which is identically Σglazing/Σgross, i.e. the single ratio this file already hands over. Weighting a genuine split by gross therefore CANNOT move the whole-building number, and weighting it by anything else moves it wrongly: measured on the Duplex, net-opaque weighting prices 57.78 m² and the unweighted mean 79.39 m², against 64.46 measured. `calculateHeatLoss` has no per-sector gross to weight by (a MeasuredEnvelope carries one whole-building figure), so it is handed the uniform ratio and is exact. The split belongs in the legend, and SCHEPENDOMLAAN_WWR_BY_SECTOR keeps it — built from PLACEHOLDER_GLAZING_BY_SECTOR_SQM here, so this building's split is not even measured yet.
A-DOORS · The 40.00 m² of exterior door leaves are priced at the wall U-value.
The engine knows walls and windows and nothing between. A Dutch apartment entrance door is an insulated opaque leaf, so the wall U is the nearer of the two; leaving the doors out entirely would make the modelled envelope smaller than the building.
A-GROUND-DT · The engine's 13.5 °C ground temperature and 4,380 h ground season.
ISO 13370's U pairs with the annual-mean external air temperature, and the engine applies a fixed 6.5 K drop instead. The mismatch is about 13 % conservative — in the direction that makes the building look worse. It is disclosed rather than reconciled here, because reconciling it moves every other building in the app.
A-CAVITY-WALL · The exterior wall is one 310 mm cavity assembly at U 0.2889 W/m²K (Rc 3.309), built from three separate layer sets: IFC_baksteen_*_100mm outer, IFC_isolatie_110mm_glaswol cavity, IFC_kalkzandsteen_100mm inner.
The file never states these as one assembly — the leaves are separate IfcWall instances and separate IfcMaterialLayerSets, and combining them is this file's inference, not the model's statement. It is built here rather than in constructions.ts for that reason. The value sits inside the 0.28-0.33 the parity brief expected, and the Dutch 2012 Bouwbesluit minimum for walls was Rc 3.5, so as modelled this wall is marginally short of the code it was built under. The model also carries a 120 mm inner leaf (U 0.2868, 0.7 % different); the 100 mm is used and the other is exported beside it.
A-CAVITY-AIR-GAP · No ventilated or unventilated air gap between the insulation and the outer leaf.
Dutch cavity walls normally have one and this model states none, so none is added — a stated layer set is the source, not a mental picture of how the wall was probably built. Adding a 30 mm gap would take the wall from U 0.289 to about 0.275, so the omission costs the building about 5 %, in the direction that makes it look worse.
A-KALKZANDSTEEN-LAMBDA · Calcium-silicate blockwork at λ 0.8 W/m·K, the library's concrete-brick entry.
GENERIC_MATERIALS has no calcium-silicate row and adding one belongs to the standards library's own traceability ledger, not to a reference building. Real kalkzandsteen is nearer λ 1.0, which would cut the inner leaf's R from 0.125 to 0.100 — 0.7 % of the wall assembly. Named rather than searched: searchGenericMaterials substring-matches Korean and English names and would return nothing for any Dutch layer name in this model.
A-ROOF-RC-CONFLICT · The roof U is the SOLVED 0.1776 W/m²K (Rc 5.502), not the 0.2422 its name's stated Rc 4.00 implies.
A 37.6 % disagreement, well past the brief's 10 % threshold. The solved value is used because this module's whole claim is layers → U, the honest direction, and because 'Rc=4,00' is a token in an assembly NAME, not an IfcThermalTransmittance the file declares: 190 mm of glass wool genuinely is about Rc 5.3-5.5, and the name almost certainly records the specification the assembly was created to satisfy rather than what it achieves. The reader is owed the direction: the solved figure is the OPTIMISTIC of the two, and A-ROOF-FRAME-BRIDGE names the effect that closes part of the gap.
A-ROOF-FRAME-BRIDGE · No thermal bridging through the roof panel's frame.
The assembly's own first layer is named '99 Lucht frame' — the model says there is a frame in it. A framed cavity breaks ISO 6946 5.3.1's unsubdivided-layer premise outright, and the timber ribs of a dakplaat typically cost 10-20 % of the assembly's resistance. That bridge is unrepresented and is disclosed rather than tuned away, and it pushes the roof from the solved Rc 5.50 back toward the stated 4.00.
A-ROOF-AIR-LAYER · The 5 mm '99 Lucht frame' layer contributes R 0.14, the library's 10 mm cavity entry.
Three things are wrong with that and all three are disclosed rather than tuned. (1) The void is SUBDIVIDED — the name says 'frame' — so ISO 6946 Table 2's unsubdivided-layer premise (5.3.1) does not hold and the bridge through the ribs is unrepresented. (2) 5 mm is below every row available: Table 2's flat 0.16/0.18 values start at 25 mm and the library's smallest cavity is 10 mm, so the nearest entry over-states this layer by roughly 0.03 m²K/W, 0.5 % of the roof's resistance. (3) The layer is upward-facing in the roof and downward-facing in IFC_verlaagd_plafond, and a name-keyed mapping table cannot carry two heat-flow directions for one name.
A-GROUND-RC-CONFLICT · The floor construction resistance R_f is the SOLVED 3.781 m²K/W, not the stated Rc 3.00.
A 26 % disagreement, again past the 10 % threshold, and again the solved figure is the optimistic one: at the stated Rc the ground U would be 0.1974 instead of 0.1695, 16 % worse. The solved value is used for consistency with the roof and with the Clinic. Both are exported — SCHEPENDOMLAAN_GROUND_FLOOR_AT_STATED_RC carries the other reading — because the difference is larger than the soil uncertainty this building's ground U already carries.
A-HOLLOW-CORE · The 200 mm kanaalplaat is solid reinforced concrete at λ 2.3.
A kanaalplaat is a hollow-core slab: its voids give it more resistance than the solid concrete modelled here, so this understates the floor. The library has no hollow-core entry and inventing an effective λ for one would be a manufacturer's figure dressed as a generic table value. The error is small against 133 mm of EPS — the concrete is 2.3 % of the stack's resistance either way.
A-SUSPENDED-FLOOR · The ground floor is a slab on ground, and ISO 13370 §9.3 applies.
This is the parity brief's decision and is not reopened here, but the reader is owed the doubt: a Dutch kanaalplaat ground floor usually spans a ventilated kruipruimte, which is ISO 13370 §9.2, a different equation; and the model carries a '-1 fundering' datum at −1.00 m and an IFC_vloer_EPS_stortstrook edge detail, both consistent with either. ground-coupling.ts implements the slab case only and throws rather than approximating the others, so the choice is also the only one this repo can currently compute.
A-SOIL · Soil conductivity 2.0 W/m·K under the slab.
ISO 13370's own default when soil is unknown, and soil is never in a drawing set. It moves this ground U from 0.1553 (clay) to 0.1968 (rock); 0.1695 is the nominal. The slab area and exposed perimeter are measured now (345.81 m² / 90.08 m), so soil is the largest remaining uncertainty on this element after the slab-versus-crawlspace question in A-SUSPENDED-FLOOR.
A-LAYER-LAMBDAS · Every λ behind these U-values is a mapping this repo chose, not a property the file states.
The Schependomlaan IFC carries layer names and thicknesses and no IfcMaterialProperties at all — no conductivity, no U-value, no R. SCHEPENDOMLAAN_LAYER_MAPPINGS in constructions.ts names one generic-library material per Dutch layer name with the reason for each; that table, not the model, is where these numbers come from.
A-GLAZING · Whole-window U 1.6 W/m²K, SHGC 0.60, HR++ double low-e in a hardwood frame.
The file carries no IfcThermalTransmittance for its windows; it carries a frame profile, IFC_kozijn_90x114 in hardwood. Dutch 2015 HR++ GLASS is U_g 1.1-1.2, but the engine's field is the whole window: a hardwood frame at U_f near 2.0 over roughly a quarter of the opening, plus the spacer, lands U_w near 1.6. Quoting the glass figure here would credit the building with a frame it does not have. 1.6 sits just under the Bouwbesluit 2012 (2015 revision) window ceiling of 1.65, which is the only sourced bound available.
A-AIRTIGHT · ACH50 = 2.05, converted from the NTA 8800 new-build default qv;10 = 0.6 dm³/s·m².
No blower-door result exists for this building. The conversion is stated so it can be argued with: 0.6 × 965.67 m² = 579.4 L/s at 10 Pa; × 5^0.65 = 1,649 L/s at 50 Pa = 5,938 m³/h; ÷ 2,897.04 m³ = 2.05 h⁻¹, using the conventional pressure exponent n = 0.65. The engine then divides ACH50 by 20 to reach a natural rate of 0.102 h⁻¹, which is the divisor this repo's regression tests protect.
A-VOLUME · The ventilation term uses the gross conditioned volume, 2,897.04 m³, not the 2,497.61 m³ the room solids sum to.
The file states no volume; both figures are measured from it. The gross is floor area × storey floor-to-floor with voids as their own solids — everything inside the air barrier, which is what an infiltration rate is defined against. The net is the 100 space solids as modelled, which stop at the ceilings. Choosing the net would cut infiltration loss by 14 % for air that is inside the envelope. (The net figure itself moved 2026-09-06, 2530.05 → 2497.61: 12 rooms under the pitched roof had their own Qto's GrossVolume read where NetVolume was meant — see the field's own comment above.)
A-HVAC · Individual gas heating at η 0.90, no cooling, mechanical exhaust ventilation without heat recovery, gas DHW at η 0.85.
The archive has no MEP model at all — measured, not assumed: HB_Nutsvoorzieningen.ifc is 42 IfcBuildingElementProxy utility connections with no IfcFlowSegment and no ports. So system type is not partly stated the way the Clinic's is; nothing about the services is stated. These are placeholders shaped like a 2015 Dutch apartment (HR combi boiler, system-C exhaust) and not one of them is read from the file. Cooling efficiency 0 is how annual-demand.ts is told a building has no cooling.
A-LPD · Lighting power density 6 W/m², manual control, LED lamps.
The file states no lighting load and no luminaire. Rather than invent a residential allowance, this takes the repo's own 공동주택 row (korean-building-codes.ts:176) so the building is not an outlier against every other residential model in the app — it is a Korean code-table value applied to a Dutch building, which is the same substitution A-CLIMATE makes and is stated the same way. The lamp type is forced by the enum: 2015 Dutch housing was mid-transition and neither 'fluorescent' nor 'led' describes it.
A-OCCUPANCY · 0.025 persons/m², residential day schedules, and the repo's own 공동주택 figures for internal gain (3) and hot water (40).
No occupancy data exists in a coordination model, and the four fields split cleanly by whether anything reads them. Density IS read (delivered-from-demand.ts:41) and is therefore derived from what spaces.json states — 10 WOONKAMER, 10 KEUKEN, 10 BADKAMER and 10 MK rows make this ten dwellings — at 2.4 people each over 965.67 m², against the table's 0.04, which would put 3.9 people in a 96.6 m² Dutch flat. Internal gain and hot water are NOT read anywhere in src/lib/energy, and hotWaterDemand has no unit in material-types.ts at all, so both take the repo's own residential row rather than a derived figure whose unit this file would be inventing. The schedules are a generic dwelling shape: occupied overnight and at the ends of the day, the opposite of the Clinic's, which materially changes when gains land.
A-CLIMATE · A Korean climate (Seoul) for a Dutch building.
The town Nijmegen IS stated, on both IfcSite and IfcBuilding, so unlike the Clinic this building's location is not unknown — it is unusable. The engine's regional table is Korean-only and has no Netherlands entry, so any climate here is a substitution. A sourced Nijmegen HDD/CDD row from KNMI is the fix and is a follow-up, not this lane. Nijmegen is milder and duller than Seoul: Seoul's larger heating degree-days and far larger cooling degree-days both push this building's demand up.
A-WALL-SET-SCOPE · 426.63 m² of inner-leaf exterior wall is the building's whole opaque wall.
Measured 2026-09-04 23:15 on all 934 walls against the conditioned-space footprints: the tension is not a perimeter shortfall. The block steps back — ground plan 22.4 × 20.7 m, storeys 02/03 about 15.5 × 14.9 m — and storey 03 is a roof storey, so 426.63 m² is not 4 × perimeter × 3 m. The kept inner leaf covers 80 of 86–90 m of the ground outline and matches or exceeds the outer masonry leaf on every storey but the ground; the 154 party walls (605 m²) sit between dwellings inside the block, never on the outline. What the set still omits: dormer cheeks (zijwang dakkapel, 0.15 m leaf, 11.4 m²) and the storey-01 knee walls on the lower roof (knieschot 0.21 m, IsExternal true, 13.0 m²) — about 24.5 m² — plus 42.9 m² of 0.05 m storey-03 knee walls that are envelope only if the insulation line is at the knee wall rather than the rafters, which the file does not say. Not added yet: a name match would also pull in sheathing leaves, so the rule must be thickness-aware, and the gallery card's 426.6 would move.
A-ENVELOPE-ASSEMBLY-SET · Twelve of the model's 28 assemblies are envelope: the roof panel, the dormer cheek, the ground floor and its edge strip, the three cavity-wall leaves and the window frame.
The model does not label an assembly external, so the list in constructions.ts is hand-written and rests on bim-bf's identification of the cavity wall's leaves. IFC_kalkzandsteen appears in five thicknesses and only 100 and 120 mm are named as the exterior inner leaf; 175, 214 and 300 mm are excluded as internal and party walls, which the file does not state either. If that identification is wrong the envelope list is wrong with it. A keyword rule was rejected for the same reason: 'kalkzandsteen' would drag three interior walls onto the envelope, and the Clinic's own rule (exterior|roof|slab on grade|foundation) matches none of these Dutch names at all — applied here it returns an empty section, not a wrong one.
A-WALL-LEAVES-SHOWN-SEPARATELY · The 외피 구성 section shows the cavity wall's three leaves at three separate U-values, not one wall at 0.2889.
That is how the model states them, and constructions.ts solves only assemblies the model states. The insulation leaf alone reads about U 0.31, which is close to the whole wall's 0.29 by coincidence — 110 mm of glass wool is 92 % of the assembly's resistance — and a reader must not take either leaf's row for the wall. The composite is SCHEPENDOMLAAN_CAVITY_WALL in this file, where it is labelled an inference.
A-GROUND-ROW-IS-AIR-TO-AIR · The ground floor's row in the 외피 구성 section reads U 0.2516, not the 0.1695 the energy path uses.
That section reports what a layer stack resists between inside air and outside air, which is not what a floor on the ground does — the same split the Clinic shows, where its slab's row reads 3.873 against ISO 13370's 0.237. Here the gap is 1.5x rather than 16x because this floor is genuinely insulated, which makes it easier to miss, not less wrong. SCHEPENDOMLAAN_GROUND_FLOOR is the figure in the energy numbers; the section's row is the layer stack's own.
A-NORTH · North is the model's −Z, and the wall split's four zero diagonals are real.
TrueNorth is the schema default (0.,1.) in both representation contexts, so the model states no orientation. The manifest's own note claims all 122 inner-leaf walls are cardinal and that the 88 placements at 47.94° belong to the excluded outer leaf. That claim is the extractor's, not this file's, and every per-orientation figure here rests on it.
A-NO-FOOTPRINT · The recipe's footprint is a 17.39 m square.
The manifest states no plan outline and only 6 of the 100 IfcSpace rows carry an extent, so no bounding box can be recovered. The square has the ground storey's floor area and no relation to the building's shape. Nothing in the energy path reads it: measuredEnvelope short-circuits envelopeQuantities, which is the only reason a shape-free stand-in is admissible at all.
A-ENVELOPE-SOURCE · Envelope areas come from the measured manifest and the placeholder table, not from the recipe's footprint.
Extruding a square would produce 4 × 17.39 × 12.00 = 834 m² of wall against the 582.13 m² this building's own solids give, and a roof of 302.24 m² against the 542.96 m² of outer surface the rows measure. The areas travel on the recipe as measuredEnvelope and envelopeQuantities returns them with source 'measured'. Note what that source string does NOT mean today: three of those numbers — the glazing and door apertures inside grossWallSqm — are placeholders, and only SCHEPENDOMLAAN_INPUT_STATE says so.
A-ERA · Era 2010-2019, use code 02000 (공동주택), structure code 22 (조적조).
The archive's coordination models are dated 2015 and the project was built 2015-16, so the era is evidence. What it does NOT do is decide any number here: the era selects Korean code-table defaults for values not overridden, and every U-value, WWR and airtightness figure in this file is overridden explicitly, leaving the era's effect on cosmetic recipe fields only. The structure code is the nearest available: the register's vocabulary has no row for load-bearing calcium-silicate blockwork with precast hollow-core floors and a partial steel frame.