MEASURED. Wall areas by orientation, glazing by orientation (per opening, 22 IfcWindow at OverallWidth × OverallHeight with the host wall resolved through IfcRelFillsElement), exterior doors (4 IfcDoor), the single flat roof element's upward faces, the union of the ground-slab shadows a conditioned room stands on and its outer ring, storey datums, room floor areas and both volumes are read from the Duplex IFC set by scripts/build-reference-building.mjs. Floor area counts the 18 architectural Rooms, not the 18 analytical Spaces stated over them (A-FLOOR-AREA). Known omission: 2 roof skylights, 1.49 m² of glazing whose host is an IfcRoof and which the wall-hosted opening walk cannot place (A-SKYLIGHTS).
A-FLOOR-AREA · The floor area is 284.98 m² over 18 rooms — the architectural Rooms only — where the file's 37 IfcSpace rows sum to 799.76 m² and its non-ROOF rows to 529.46 m².
Duplex_M_20111024_ROOMS_AND_SPACES.ifc states every room twice: once as an architectural Room and once as the authoring tool's analytical Space, with the same Name, the same LongName, the same plan position and two different GlobalIds. Measured over all 37 rows, 18 carry all four Revit analysis property sets (Energy Analysis, Mechanical - Airflow, Electrical - Loads, Electrical - Lighting) and 19 carry none, with no partial matches, so the property-set signature separates them cleanly where neither name nor geometry can. The ROOM half is kept because its areas reproduce Duplex_A_20110907.ifc's own GSA BIM Area values exactly, and because A104 Bathroom 1 has a Room and no analytical Space at all — keeping the other half would lose a bathroom. The three totals are worth keeping straight: 799.76 is every row; the ROOF-name rule that already existed removes the two 135.151 m² roof planes and gives 529.46; de-duplicating gives 284.98. 529.46 is the figure that would have shipped, and floor area is the denominator of every intensity, so it would have published this building reading 46 % better than it is. scripts/lib/ifc-envelope.mjs classifyAnalyticalSpace carries the full account and the build asserts the 18/18 split rather than trusting it.
A-SKYLIGHTS · The glazing aperture is 64.46 m² and OMITS 2 roof skylights totalling 1.49 m².
Both are M_Skylight 1180 × 1170 mm, and both fill an IfcRoof rather than an IfcWall, so the opening walk — which resolves a host through IfcRelFillsElement and then requires that host to be in the exterior-wall set — cannot place them and reports them unresolved. They are real envelope glazing at a worse orientation than any wall opening, since a horizontal light sees the whole sky. The omission understates the aperture by 2.3 % and understates window loss by about the same, so this building reads marginally better than it is. Carried as a named omission rather than a placeholder because there is no substitute number in play: a placeholder invents a value, and this one is simply absent from the aperture. Fixing it needs the opening walk to accept a roof host and a horizontal sector, which is an extractor change and not this file's.
A-WWR-DENOMINATOR · WWR 0.1893 against GROSS wall area (opaque 267.16 + glazing 64.46 + doors 8.96 = 340.58 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 267.16 the ratio would read 0.2413, the windows would still land right, and 73.42 m² of real wall would be priced as nothing. Derived from the measured parts in code, never typed.
A-WWR-ENGINE-MEAN · All four cardinal ratios handed to MaterialProperties are the single whole-building 0.1893, not the four measured per-sector ratios — because both engine callers of meanWindowToWallRatio pass no weights and so take its plain arithmetic mean.
Measured through the real engine, and RE-measured on 2026-09-06 after the function changed under this text — the first version of this note described an implementation that no longer exists, which is its own lesson about pinning prose to a signature. As it stands, `meanWindowToWallRatio(materials, grossWallByOrientationSqm?)` weights by the gross areas a ratio is quoted against WHEN GIVEN THEM and returns the plain mean otherwise; heat-loss.ts and use-retrofit-scenario.ts both call it without weights, because a MeasuredEnvelope carries one whole-building gross and no split. So with one uniform ratio the mean is exactly aperture ÷ gross, and the engine prices 64.46 m² — the aperture the openings walk counted — at 142.62 kWh/m²·yr. Handing it the four measured ratios instead makes this building read WORSE than it is: their plain mean is 0.2331, which prices 79.37 m², i.e. 14.91 m² of glazing the building does not have, and takes it 142.62 → 156.26 kWh/m²·yr. Weighted by the per-sector gross, the same four ratios land back on 0.189265 and 64.46 m² exactly — identical to the uniform ratio, and identical as an IDENTITY rather than a coincidence, Σ(rᵢ·grossᵢ)/Σgrossᵢ ≡ Σglazing/Σgross. So no wiring of a measured split can move the whole-building mean, on this or any building. The history is worth keeping because it is what caught a real bug: an interim version weighted by `walls[].surfaceArea`, the NET opaque wall, against ratios quoted on gross, and erred the other way — 0.16965, 57.78 m², 136.51 kWh/m²·yr, flattering by 10 % of the glazing. Measuring this building is what surfaced it, and the function now takes the gross areas explicitly instead of inferring them. There is still no orientation-dependent consumer in the energy path — heat-loss.ts collapses the four to one mean, annual-demand.ts's solar gain uses the single collapsed window area against one whole-sky irradiance — so the only caller that passes weights is the legend in reference-energy.tsx, which is exactly where a real split can say something.
A-DOORS · The 8.96 m² of exterior door leaves are priced at the wall U-value.
The engine knows walls and windows and nothing between. A US residential 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, and folding them into glazing would move the WWR denominator. Kept a separate measured field for the same reason the other two buildings keep one.
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 disclosed rather than reconciled, because reconciling it moves every other building in the app. On this building it matters more than on the other two: an uninsulated slab puts a far larger share of the total loss through the ground, so an error in the ground season is worth more here.
A-LAYER-LAMBDAS · Every λ behind these U-values is a mapping this repo chose, not a property the file states.
All 97 IfcThermalTransmittanceMeasure in this model are literally 0., and they sit only on 67 windows and 30 doors — never on a wall, floor or roof, so envelope coverage is 0 %. Under this repo's documented-zero rule a recorded zero means unavailable, and a 0 W/m²K would be a perfect insulator, so none of them is read. The model carries no IfcMaterialProperties either, so it states layer names and thicknesses and nothing thermal. DUPLEX_LAYER_MAPPINGS in constructions.ts names one generic-library material per layer name with the reason for each; that table, and the EN 12524:2000 Table 1 design values behind the library, are where these numbers come from. Korean 별표 values are a substitution on a US building and are stated as one — see docs/05_Research/ENERGY_STANDARD_TRACEABILITY.md.
A-STUD-CAVITY · The wall's 41 mm Metal - Stud Layer is an unventilated air cavity, giving the exterior wall U 0.3404 W/m²K (R 2.937).
THE LARGEST CONSTRUCTION ASSUMPTION IN THIS BUILDING, and the same one the Clinic makes for the same reason: the model names a stud layer and names nothing in it, so nothing is assumed to be in it. Filling the 41 mm with mineral wool would take the wall to U 0.2607 — 23 % better — and DUPLEX_EXTERIOR_WALL_STUD_INSULATED computes exactly that so the claim can be checked. Steel stud bridging is likewise ignored, which pushes the other way. Note the cavity is only 41 mm here against the Clinic's 152 mm, so the same assumption costs this building far less: the wall's insulation is the 50 mm of rigid board, which the model does state.
A-JOIST-ZONE · The roof's 286 mm Wood - Dimensional Lumber layer is solid timber at λ 0.14, giving roof U 0.1871 W/m²K (R 5.346).
It is the layer the model states, and constructions.ts solves assemblies the model states. But a 286 mm dimensional-lumber layer in a joist roof is not 286 mm of wood — it is joists at 400-600 mm centres with air or insulation between them, and ISO 6946 5.3.1's unsubdivided-layer premise does not hold for it. Solid timber gives that layer R 2.043, which is 38 % of the whole assembly's resistance; read instead as an unventilated cavity it gives R 0.17 and the roof lands at U 0.2879, 54 % worse. DUPLEX_ROOF_JOIST_ZONE_AS_CAVITY computes that reading. The stated layer is used and the reader is owed the direction: it is the OPTIMISTIC of the two, and the truth is between them, because a joist bay in a 2011 US roof usually holds batt insulation that this assembly does not name.
A-GREEN-ROOF · The roof's outermost stated layer, 64 mm of Site - Grass, contributes NO thermal resistance and is dropped from the assembly.
The assembly is named Live Roof over Wood Joist Flat Roof and its first layer is grass, so this is a planted roof as modelled and greenRoofCoverage is 1 rather than 0. What is not modelled is what the substrate does: a green roof's benefit is mostly evaporative cooling and thermal mass under summer sun, not conduction, and neither the generic material library nor the degree-day engine has a term for either. GENERIC_MATERIALS has no growing-medium row, and inventing a λ for 64 mm of soil would put a number in the stack that no table supports. Dropping it is the conservative direction — it removes resistance, so the roof reads worse than modelled. The reflectance 0.2 and emissivity 0.95 do describe vegetation rather than membrane.
A-ROOF-BARRIER · The 6 mm Roofing - Barrier layer is dropped from the roof assembly.
The name states a function and not a material — a vapour or root barrier, both of which are films whose resistance is negligible at 6 mm — and the library has no row for either. Dropping it removes at most about 0.02 m²K/W, 0.4 % of the roof's resistance, and in the direction that makes the roof read worse. Named rather than silently skipped, because a reader comparing the manifest's six stated layers with the four solved here is owed both absences.
A-CONCRETE-BLOCK-LAMBDA · The 193 mm Masonry - Concrete Block is the library's concrete-brick entry at λ 0.8 W/m·K.
GENERIC_MATERIALS has no hollow concrete-block row, and a US CMU is hollow: its cores make the real effective λ lower than solid blockwork, so this understates the wall's resistance and the building reads marginally worse than it is. Adding a CMU row belongs to the standards library's own traceability ledger, not to a reference building. The block is 8 % of this wall's resistance either way — the 50 mm of rigid board is 67 % of it — so the error is small against A-STUD-CAVITY and A-JOIST-ZONE.
A-GROUND-UNINSULATED · The slab on grade has NO insulation: R_f is 127 mm of concrete alone, 0.0552 m²K/W, giving ground U 0.8159 W/m²K.
That is what the file states — Floor:127mm Slab on Grade is a single Concrete layer and the model names no insulation above, below or at the edge of it. Nothing is added, and a 2011 US duplex on an uninsulated slab is an ordinary thing to have drawn rather than a modelling gap. The consequence is a different ISO 13370 branch from the other two buildings: d_t is 0.947 m against B' 3.754 m, so d_t < B' and the UNINSULATED equation applies, where the soil rather than the floor carries most of the resistance. Schependomlaan's insulated slab reads 0.1695 and the Clinic's 0.2370; this one is 4.8x the first and 3.4x the second, which makes the ground the lossiest element in this building and the one most sensitive to the soil assumption.
A-GROUND-ROW-IS-AIR-TO-AIR · The ground floor's row in the 외피 구성 section reads U 4.029 W/m²K, not the 0.8159 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: 127 mm of concrete is R 0.055, plus 0.193 of surface resistance, giving 4.029. The energy figure is ISO 13370's, where the soil is most of the path. The same split exists on both siblings — the Clinic's slab row reads 3.873 against 0.237, Schependomlaan's 0.2516 against 0.1695 — but here it is the widest of the three at 4.9x, because this slab is uninsulated and has almost nothing of its own to resist with. A reader looking at the section and the strip on the same screen sees 4.029 and 0.8159 and is owed the reason. DUPLEX_GROUND_FLOOR is the figure in the energy numbers; the section's row is the layer stack's own.
A-SOIL · Soil conductivity 2.0 W/m·K under the slab, ISO 13370's own default when soil is unknown.
Soil is never in a drawing set. On an insulated slab it moves the answer a few per cent; on this uninsulated one the soil IS most of the resistance, so the same uncertainty is worth several times more — DUPLEX_GROUND_FLOOR_RANGE spans 0.6518 (clay, λ 1.5) to 1.2142 (rock, λ 3.5) around the nominal 0.8159, a spread of −20 % to +49 %. On Schependomlaan's insulated slab the same clay-to-rock spread is only −8 % to +16 % (0.1553-0.1968 around 0.1695), which is the difference insulation makes to how much the soil matters. This range should be quoted whenever this building's ground loss is.
A-SUSPENDED-FLOOR · The ground floor is a slab on ground and ISO 13370 §9.3 applies.
The model states Floor:127mm Slab on Grade by name and the 6 Foundation - Concrete walls are below grade around it, so the slab case is what the file describes and there is no crawlspace datum to suggest otherwise. Recorded anyway because 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 compute.
A-GLAZING · Whole-window U 2.8 W/m²K, SHGC 0.70, uncoated double glazing in an aluminium frame.
The file states a U for its windows and that U is 0., which under the documented-zero rule means unavailable rather than perfect, so nothing is read from it. The windows are M_Fixed and M_Casement families with no glazing specification and no frame material stated. 2.8 is what uncoated double glazing in a thermally unbroken aluminium frame achieves and is the ordinary US 2011 residential window where no better performance is specified; it is far worse than Schependomlaan's 1.6, which is the point — that building states an HR++ frame profile and this one states nothing. The value is a placeholder shaped like the era and is not read from the file. It is the single input a real specification would most improve.
A-AIRTIGHT · ACH50 = 7.0 h⁻¹, an era-shaped figure and not a measurement, giving the engine a natural infiltration rate of 0.35 h⁻¹.
No blower-door result exists for this building and none can be inferred from a coordination model. 7.0 h⁻¹ is a typical pre-retrofit US detached or semi-detached dwelling of this era; it is not a code value and not a measurement. The engine divides ACH50 by 20 to reach a natural rate of 0.35 h⁻¹ — that divisor is the one this repo's regression tests protect and it is what makes the figure quotable at all. Against Schependomlaan's derived 2.05 this building is modelled as more than three times leakier, which is the direction a 2011 US masonry-and-stud duplex sits against a 2015 Dutch apartment built to NTA 8800, but the figure itself is an era-shaped assumption and should be argued with.
A-VOLUME · The ventilation term uses the gross conditioned volume, 854.79 m³, not the 639.88 m³ the room solids sum to.
The file states no volume quantity; both figures are measured from it. The gross is room floor area × storey floor-to-floor, i.e. everything inside the air barrier, which is what an infiltration rate is defined against. The net is the 18 room solids as modelled, which stop at the ceilings. Choosing the net would cut infiltration loss by 25 % for air that is inside the envelope. Both figures already exclude the 18 analytical duplicates, which would otherwise have doubled each of them.
A-HVAC · Individual gas heating at η 0.80, split cooling at COP 3.0, natural ventilation, gas DHW at η 0.80.
This building has THREE services models — Duplex_MEP (924 elements), Duplex_Electrical (100) and Duplex_Plumbing (498) — and they are the reason it was chosen, so what they do and do not state is worth being exact about. They state geometry, position and product type in abundance. They state no efficiency, no capacity, no COP and no fuel for any plant item. Two of the three state no network either: the HVAC and electrical models declare ZERO distribution ports, so their topology cannot be traced at all, and only the plumbing model carries any (970 ports, 485 connections, 190 of them directed and 295 bidirectional). Even there the direction is thin — the model declares no plant node, so all 190 directed segments fall to the default label rather than being traced from a source, and the supply/return split those segments carry is not a measurement (A-FLOW-DIRECTION). So the systems here are era-shaped placeholders exactly as on the other two buildings, and the services models' value is that they can be SEEN, not that they can be read. Cooling is modelled as present, unlike Schependomlaan, because a 2011 US dwelling has it.
A-FLOW-DIRECTION · The plumbing layer's 190 directed segments carry NO trustworthy supply/return split, and the two other services layers carry no network at all.
Measured per layer rather than assumed, because the three differ. HVAC: 0 ports, so no topology — the flow note says so and that is the whole truth about it. Electrical: 0 ports, likewise, which matches the Clinic's electrical model. Plumbing: 970 ports and 485 connections, of which 190 state a direction and 295 are declared bidirectional. The part to distrust is the split. This model declares ZERO plant nodes — it is the first layer in this app to have directed edges and no plant, where every directed Clinic layer has at least two — and supply/return is propagated from a plant, so with none to propagate from all 190 segments fall to one side and the manifest reads supplySegments 0, returnSegments 190. Those two numbers are correct counts of a classification that had nothing to classify against. The workspace's flow note renders them as '0 downstream of plant, 190 upstream', which is arithmetically exact and describes a plant this file does not contain; a domestic plumbing model is mostly supply to fixtures and gravity drainage, so 'all return' is not merely unproven but the wrong picture. Not fixed here: reference-building-workspace.tsx belongs to the information-contract lane and this is reported to it rather than patched from this file.
A-LPD · Lighting power density 6 W/m², manual control, fluorescent lamps.
The electrical model states 100 elements including luminaires and their positions, and states no wattage for any of them, so the load is not readable from it. Rather than invent a US residential allowance this takes the repo's own 공동주택 row (korean-building-codes.ts:176), the same substitution Schependomlaan makes and stated the same way. The lamp type is the era's rather than the file's: 2011 US residential lighting was predominantly CFL and incandescent, and 'fluorescent' is the nearer of the enum's options to that.
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. Density IS read (delivered-from-demand.ts:41) and this figure puts about 7 people in the building, i.e. 3.6 per dwelling across two 142 m² units — reasonable for a duplex and derived from the room evidence (each unit has a living room, a kitchen, two bedrooms and two bathrooms, so two dwellings of three to four people). 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 the generic dwelling shape, the same as Schependomlaan's.
A-CLIMATE · A Korean climate (Seoul) for a US building.
This model states NO location, which is a stronger statement than Schependomlaan's unusable one. Three independent tells, all in the file: IfcSite.Name is the literal string 'Default'; IfcPostalAddress.AddressLines is still the authoring tool's placeholder prompt 'Enter address here'; and RefElevation is a signed zero. The 41.8744 N, 87.6394 W coordinate and the 'Chicago', 'IL' town and region are the unfilled Revit 2011 template's own, so no climate may be taken from them — this is the same position as the Clinic, reached by different evidence. The engine's regional table is Korean-only, so Seoul is a substitution and every kWh and every grade from this file is a Korean-climate reading of a US building. Chicago is in fact considerably colder and slightly less humid than Seoul in winter, so a real Chicago run would show MORE heating demand than this file reports — but that is an argument for sourcing a Chicago degree-day row, not for treating the template's coordinate as a location.
A-GRADE-IS-KOREAN · Any 건축물 에너지효율등급 shown for this building is a Korean grade computed under a Seoul climate for a US building.
The grade boundaries are Korean primary-energy thresholds and the climate is a substitution (A-CLIMATE), so the letter is not a statement about how this building would be rated where it stands — there is no 'where it stands' (A-CLIMATE again). It is a like-for-like comparison against the other buildings in this app, which is what it is for. Stated as its own assumption because a grade badge is the single most quotable thing on the page and reads as an official rating unless it says otherwise.
A-WALL-SET-SCOPE · 267.16 m² of Exterior - Brick on Block is the building's whole opaque wall, from 12 of the model's 57 walls.
IsExternal is true on 23 of the 57 and only 13 of those are envelope, so IsExternal is not the filter — third building, third way it fails. The ten it wrongly includes are 4 Party Wall - CMU Residential Unit Dimising Wall, which separate the two dwellings and are conditioned on both sides so no heat crosses them, and 6 Foundation - Concrete, which are below grade and a different boundary condition with a different U. The set is taken by assembly name instead. What that leaves out: nothing identified so far, but the exterior wall above the roof datum is 55.56 m² of the 267.16 — a fifth of it — which for a two-storey building with a flat roof means parapets and the stair enclosure, and those are envelope on both faces in a way a single-sided area does not capture.
A-NORTH · North is the model's −Z, and the four zero diagonal sectors are real.
TrueNorth is absent ($) in BOTH the Model and Plan representation contexts — not the schema default that Schependomlaan carries, but nothing at all — so the model states no orientation and project north is used. manifest.orientation reports offCardinalCount 0 and offCardinalSqm 0 over all 12 exterior walls, so no wall area is being rounded into a cardinal it does not belong to; the building is genuinely rectilinear. Every per-orientation figure in this file, including the measured glazing split that A-WWR-ENGINE-MEAN turns on, rests on the assumption that project north is true north. If the building is rotated, N/S and E/W swap and the uneven glazing swaps with them.
A-NO-FOOTPRINT · The recipe's footprint is an 11.39 m square.
The square has the measured ground slab's area and no relation to the building's shape, which is a long rectangle of two mirrored units. 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, not from the recipe's footprint.
Extruding the square would give 4 × 11.39 × 6.00 = 273 m² of wall against the 340.58 m² this building's own solids measure, and a roof of 129.69 m² against the 132.93 m² the roof element states. The areas travel on the recipe as measuredEnvelope and envelopeQuantities returns them with source 'measured' — and on this building, unlike Schependomlaan, that source string means what it says: every field of DUPLEX_MEASURED_ENVELOPE reads 'manifest' or 'derived_from_manifest' in its provenance map, with the single named exception of the skylights in A-SKYLIGHTS.
A-ERA · Era 2010-2019, use code 02000 (공동주택), structure code 22 (조적조).
The IFC header is dated 2011-09-07 and names Autodesk Revit Architecture 2011, 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 use code is the register's nearest row — a two-dwelling house is not what 공동주택 usually names, but the alternative 단독주택 rows are single-dwelling and this is two. The structure code is likewise nearest available: brick-on-block cavity walls with wood joist floors have no row in the register's vocabulary, and 조적조 is the closest.