Repository navigation
Description
Status: CLOSED — ITERATION 3 (Systems/TPD foundation + B4 selected-product cooling) ACCEPTED; manufacturer ventilation behaviour MOVED to #123
Integration branch: sow/2026-Q3
Foundation PR1–PR4: COMPLETE
Licensed acceptance: COMPLETE
Persistence/reopen acceptance: COMPLETE
PR5A infrastructure (identity/catalogue/resolver/route policy/orchestration): COMPLETE / MERGED
PR5B selected-product cooling (B4): COMPLETE / ACCEPTED, including real-project acceptance and close/reopen Review (7/7)
PR5A/PR5 manufacturer ventilation behaviour (certified heat recovery, fan SFP/power, B1/B2, bypass/B3): MOVED — see #123
FINAL CLOSEOUT (2026-09-16)
Human programme decision, recorded explicitly per this issue's own closure rule (bottom of this body):
the proven Iteration 3 explicit Systems/TPD route, including the accepted selected-product cooling/B4
route, is complete and accepted. The remaining manufacturer ventilation behaviour — certified heat
recovery, fan SFP/power/heat, B1/B2, and manufacturer bypass/B3 — is deliberately moved to
#123 because its acceptance is blocked on external
manufacturer/EDSL evidence, not on anything implementable in-repo right now. This is the explicit human
decision this issue's closure rule allows, and it satisfies #111's second closure condition.
Final reconciled state:
- PR1–PR4: COMPLETE / frozen (unchanged from FOUNDATION FROZEN).
- PR5A infrastructure (SAM#117, SAM_Systems#23, SAM_Tas#56, SAM_UI#102): MERGED.
- PR5A manufacturer ventilation behaviour (heat recovery, fan SFP/power, B1/B2, bypass/B3): MOVED to
#123 — blocked on external evidence gates E1/E2 and an open
EDSL/TAS technical question, not an in-repo blocker. - PR5B selected-product cooling (SAM_Systems#24, SAM_Tas#59, SAM_UI#103): COMPLETE + ACCEPTED — B4 =
B0 Parity MV + the cooling module, 8/8 TM59 Pass on the canonical fixture, 0/8 outcome changes vs B0. - Real-project B4 acceptance: COMPLETE — full 1a → 1b → 2 → 2B → 3-B0 → 3-B4 route run on the real
project; Reference A FAIL, Candidate B FAIL (a valid weather-driven result, not a defect); recirculation
clamp verified (refusal gone); TM59 NV Criterion 1 seasonal-basis fix (SAM#120) verified not to affect the
(fully mechanical-route) real-project result. - B4 close/reopen Review: COMPLETE, 7/7 acceptance criteria PASS (pairing recovered and restored,
not rerun; engineering results reproduced exactly; 15/15 ledger stages present; no refusal; zero TAS
simulation processes during Review; catalogue provenance revalidated). One separate, non-blocking
evidence-archive finding from this reopen is tracked at
#122. - SAM_Tas: TAS Systems flow sizing is sensitive to component creation order on the explicit Part O ventilation route #113 (TAS Systems sizing order sensitivity): proved a direct PR5B dependency, generically fixed in
SAM_Tas#57 (native creation order made a deterministic function of the graph alone), CLOSED. - SAM_Tas: a 1-day simulation period crashes TSD.exe (0xc0000005) inside Modify.AddResults, surfacing as RPC server unavailable #115 (one-day TSD crash): confirmed separate native debt, not a PR5/Iteration-3 dependency — every
operating-point and acceptance test uses full-year TSD sources and TPD hour windows. Remains OPEN as its
own item. - TM59 NV Criterion 1 seasonal-basis defect: found and fixed, SAM#120 (Pass/Fail now decided from the
May–September basis TM59:2017 requires, not the full year). - SAM_Tas diagnostic-log seasonal-basis alignment: fixed, SAM_Tas#62 (evidence-log-only, no
compliance-decision impact). - Recirculation-flow clamp: verified on the real project (SAM_Tas#60, re-exercised — the refusal is
gone). - Four-airflow invariant: unchanged and reconfirmed throughout —
PartFRequiredAirFlow != DesignAirFlow != SelectedEquipmentCapacity != OperatingAirFlow.
Full narrative: see the final closeout comment on this issue, and
SAM/PROJECT_PROGRESS.md, SAM/documentation/PartO-TAS-VALIDATION.md,
SAM/documentation/PartF-HANDOVER.md.
Current programme state (as at FOUNDATION FROZEN + PR5A/PR5B — historical, preserved)
Foundation milestone = PR1–PR4 (frozen, accepted on merged binaries — see the
ITERATION 3 FOUNDATION FROZEN comment).
Manufacturer-aware milestone = PR5 (now split: PR5A infrastructure + PR5B cooling ACCEPTED under this issue;
PR5A/PR5 manufacturer ventilation behaviour MOVED to #123 — see FINAL CLOSEOUT above).
| item | PR | merge into sow/2026-Q3 |
|---|---|---|
| PR1 — SAM_Systems materialisation | SAM-BIM/SAM_Systems#20 | 89cf139966f4fe426459851d09f052834551792f |
| PR2 — SAM_Tas no-IZAM source + TPD route | SAM-BIM/SAM_Tas#50 | 5bec3a6df4ac… |
| PR3 — SAM_Tas ResultantTemperature bridge | SAM-BIM/SAM_Tas#51 | 81d78841de31… |
| SAM_Tas yearly-profile hour alignment (found in acceptance) | SAM-BIM/SAM_Tas#52 | 1d62f380f0d3f0692b9cf0cc8ecf8b37f93fe375 |
| Generic simulation-result provenance / serialization fix (found in acceptance) | #116 | 553957dc61db876926a5599154770d7aa22f959f |
| PR4 — SAM_UI orchestration + acceptance | SAM-BIM/SAM_UI#100 | 736e177169db2dd1ab27371dd738443596604c49 |
SAM #116 is a generic fix discovered during foundation acceptance: an unstated
GroundTemperature round-tripped a .sam save/reload as a stated 0, and a UI presentation-only
parameter was not excluded from the provenance fingerprint, so a reopened Part O run was refused.
It is not a relocation of TAS responsibility into SAM and adds no TPD/TBD/TSD/TAS identifiers.
Related issues: #114 CLOSED (resolved by caller scoping in SAM_UI#100).
#113 CLOSED (proved a direct PR5B dependency; generically fixed in SAM_Tas#57 — see FINAL CLOSEOUT above).
#115 remains OPEN native TAS debt — not encountered on the canonical full-year route and confirmed not a
PR5/Iteration-3 dependency.
Frozen prerequisite:
Iterations 1a / 1b / 2 / 2B
Core invariant:
PartFRequiredAirFlow
!= DesignAirFlow
!= SelectedEquipmentCapacity
!= OperatingAirFlow
REFERENCE ROUTE
SAM
→ existing TBD route / IZAM
→ TSD
→ ResultantTemperature
→ TM59
ITERATION 3 ROUTE
SAM analytical design
│
├─→ SAM_Systems
│ → explicit MVHR systems
│
└─→ SAM_Tas
→ no-IZAM load TBD/TSD
explicit Systems + no-IZAM load
→ TPD
→ Systems simulation
→ ZoneTemperature
→ copy same no-IZAM TBD
→ thermostat bridge
→ second TSD
→ ResultantTemperature
→ TM59
Settled architecture decisions
-
No new TAS-specific references in SAM.
SAM remains the analytical/design authority.
TPD/TBD/TSD, TAS identifiers, TAS execution and result extraction belong outside SAM. -
SAM production changes for the Iteration 3 foundation: none that carry Systems/TAS knowledge.
The only SAM change (fix: a TAS run's model keeps its simulation-result provenance across .sam save and reopen #116) is the generic simulation-result provenance/serialization fix recorded above. -
No IZAM contribution in the Iteration 3 Systems route.
Ventilation is represented by the explicit TPD/TAS Systems network. -
With the current TAS API semantics:
ModelVentilationFlow = trueModelInterzoneFlow = true
trueselects TAS System Modelled behaviour, so corresponding building-model ventilation/interzone flows are ignored. -
The candidate route must use a newly generated no-IZAM thermal TBD/TSD.
Do not reuse the frozen Iteration 1a TSD as the Systems load source. -
The no-IZAM source must:
- not generate IZAMs;
- remove inherited IZAMs;
- remove/zero mechanical
ticVcontribution; - preserve legitimate infiltration and natural-ventilation behaviour;
- preserve geometry, fabric, shading, weather, occupancy and internal gains.
-
One separate AirSystem per physical analytical AHU/MVHR.
A SystemEnergyCentre may contain several systems; it is not itself one shared ventilation network. -
Every room served by an MVHR belongs to that MVHR system:
- supply-only;
- extract-only;
- supply + extract;
- transfer-only where applicable.
-
Membership and bindings use GUIDs/analytical relationships, never display names.
-
Initial parity operating configuration:
- continuous operation factor =
1.0; - Fan
Heat Gain Factor = 0; - no active heating treatment;
- no active cooling treatment;
- no heat recovery;
- no manufacturer-specific performance.
- continuous operation factor =
-
Heat Gain Factor = 0is a parity configuration only, not the eventual realistic equipment model. -
The shipped
MV.jsonis a topology source, not a ready-to-run Part O system.
It must not be globally modified for this work. -
Manufacturer-specific MRXBOX/XBC15 behaviour is deferred until the generic Systems route has been proven.
(The route was proven; PR5A/PR5B built on it; remaining manufacturer ventilation behaviour is now tracked
at Part O - manufacturer ventilation behaviour: heat recovery, fan performance and bypass #123.)
Temporary ResultantTemperature bridge
Current TAS Systems does not provide the ResultantTemperature required by the Part O assessment.
Temporary SAM_Tas route:
TPD Systems simulation
→ achieved room ZoneTemperature
→ copy of the same validated no-IZAM TBD
→ set both heating and cooling thermostat profiles to the achieved room-air temperature
→ simulate that copied TBD
→ obtain ResultantTemperature
→ existing TM59 calculator
The bridge is entirely a SAM_Tas concern.
When TAS exposes native Systems ResultantTemperature, replace only:
TPD
→ ZoneTemperature
→ TBD thermostat bridge
→ second TSD
with:
TPD
→ native ResultantTemperature
SAM, SAM_Systems materialisation, equipment authority and TM59 assessment must not change.
Implementation plan
-
PR1 — SAM_Systems — Part O Iteration 3 PR1 — deterministic mechanical ventilation materialisation SAM_Systems#20
Generic deterministic mechanical-ventilation materialisation from the existing analytical design.No TAS.
No UI.
No manufacturer behaviour.
No TM59.
No ResultantTemperature bridge.
No SAM production changes. -
PR2 — SAM_Tas — PR2 (SAM #111 Iteration 3): explicit Part O Systems/TPD ventilation route - corrective re-acceptance on a real Iteration 1a design SAM_Tas#50
Generate/validate the dedicated no-IZAM thermal TBD/TSD.
Convert the explicit Systems representation to TPD.
Run TAS Systems.
Use GUID-based load/result bindings.
Extract completeZoneTemperatureresults.
Perform licensed native TAS acceptance. -
PR3 — SAM_Tas — PR3 (SAM #111 Iteration 3): ResultantTemperature thermostat bridge SAM_Tas#51 (+ fix(tas): write TBD yearly profiles hour-aligned, not one hour early SAM_Tas#52 yearly-profile alignment)
Harden the explicit-source no-IZAM thermostat bridge.
Validate complete hourly transfer and achieved temperatures.
Introduce the replaceable ResultantTemperature-provider boundary. -
PR4 — SAM_UI — PR4 (SAM #111 Iteration 3): SAM_UI orchestration + foundation acceptance SAM_UI#100 (+ fix: a TAS run's model keeps its simulation-result provenance across .sam save and reopen #116 generic provenance fix)
Orchestrate Iteration 3.
Present refusals/evidence.
Preserve artifact lineage.
Compare reference Iteration 1a against the Systems route.
Feed the resulting temperatures into the unchanged TM59 authority. -
Licensed TAS acceptance — Reference A PASS, Candidate B PASS, 0/8 TM59 outcomes differ; 3 MVHR / 8 rooms / 14 legs; in-session and close/reopen Review
- no IZAM objects/contribution;
- no duplicated mechanical ventilation;
- separate systems remain separate;
- room/system membership correct;
- terminal/transfer/system flows reconcile;
- full annual results present;
- ZoneTemperature extraction checked against native TAS;
- temporary ResultantTemperature bridge verified.
-
Final regression / architecture review
-
Iteration 3 foundation FROZEN
PR5 — manufacturer-aware behaviour (final reconciliation)
- PR5A infrastructure — SAM#117, SAM_Systems#23, SAM_Tas#56, SAM_UI#102 (identity plumbing,
catalogue v1/v2, COM-free resolver, per-AHU unit settings, fan-heat route policy, exchanger
ExchCalcType conversion/read-back, selected-product orchestration). MERGED. - PR5B selected-product cooling (B4) — SAM_Systems#24, SAM_Tas#59, SAM_UI#103 (same-AirSystem
recirculation branch, damper-controlled control law, DX gate, clamped table, recirculation-flow clamp
SAM_Tas#60). MERGED and ACCEPTED — canonical fixture 8/8 TM59 Pass, 0/8 outcome changes vs B0; real-project
acceptance FAIL→FAIL (valid, weather-driven); B4 close/reopen Review 7/7 PASS. - SAM_Tas: TAS Systems flow sizing is sensitive to component creation order on the explicit Part O ventilation route #113 dependency — proved and generically fixed, SAM_Tas#57. CLOSED.
- PR5A/PR5 manufacturer ventilation behaviour (certified heat recovery, fan SFP/power, B1/B2,
manufacturer bypass/B3) — MOVED, by explicit human decision, to
#123. Blocked on external evidence gates E1/E2 and an open
EDSL/TAS technical question — not an in-repo blocker. NOT part of this issue's closure scope.
Potential later work (superseded by #123 for anything manufacturer-ventilation-specific):
- selected-product parameter overrides — DONE (identity/catalogue/resolver, PR5A);
- justified heat recovery — MOVED to Part O - manufacturer ventilation behaviour: heat recovery, fan performance and bypass #123 (evidence-blocked);
- fan behaviour/power — MOVED to Part O - manufacturer ventilation behaviour: heat recovery, fan performance and bypass #123 (evidence-blocked);
- bypass/control behaviour — MOVED to Part O - manufacturer ventilation behaviour: heat recovery, fan performance and bypass #123;
- cooling modules where supported by manufacturer evidence — DONE (PR5B, B4);
- topology variants only where the physical system genuinely differs — DONE (MVRE displacement-flag
normalisation, PR5A; B4 uses the same-AirSystem branch, no exchanger topology needed).
The foundation did not wait for PR5. The B0 parity configuration remains reproducible as a diagnostic
control throughout PR5A/PR5B.
PR1 API direction
The SAM_Systems seam must remain generic; Part O is only a caller.
Preferred conceptual API:
MaterialiseMechanicalVentilation(...)
Inputs:
- analytical design snapshot;
- explicitly supplied SystemEnergyCentre topology template;
- generic materialisation settings.
Output:
- isolated materialised SystemEnergyCentre;
- explicit refusals;
- deterministic analytical→Systems GUID bindings.
Important:
- design terminal airflow is authoritative;
- do not use Part F requirement as design airflow;
- do not use equipment capacity as design airflow;
- do not rebalance or repair the analytical design;
- no partial-success graph;
- no TAS identifiers.
The generic API may accept an ordinary YearlySchedule.
The Part O parity fixture supplies an 8760-hour constant 1.0 schedule;
constant operation should not unnecessarily become a permanent restriction
of the generic SAM_Systems API.
Generated identity must be deterministic and enumeration-order independent.
Reuse an established SAM/SAM_Systems deterministic GUID convention if one
exists rather than introducing a new UUID mechanism solely for this feature.
Parity / acceptance reference
Reference A — frozen Iteration 1a
SAM analytical design
→ existing TBD/IZAM route
→ TSD
→ ResultantTemperature
→ TM59
Candidate B — Iteration 3 foundation
same analytical design
→ no-IZAM thermal source
+
explicit SAM_Systems MVHR representation
→ TPD Systems simulation
→ ZoneTemperature
→ no-IZAM ResultantTemperature bridge
→ TM59
The comparison must prove first:
- identical engineering inputs;
- correct system membership;
- correct design flows/balance;
- no duplicate ventilation;
- complete annual results.
Then compare thermal results using useful diagnostics such as:
- mean bias;
- RMSE;
- maximum absolute difference;
- relevant exceedance hours;
- TM59 criteria/verdicts.
Do not require bit-identical temperatures merely because the design
airflow values are identical.
Known narrow blockers/debt
Only address these if they block the new route:
ZoneLoadsfixed-index enumeration defect — expected PR2 fix. RESOLVED (PR2).- TPD
Simulatefalse-positive — PR2 must validate real execution/results. RESOLVED (PR2). SystemSpaceResultname/identity ambiguity — new route must use explicit bindings. RESOLVED (PR2).- arbitrary first-related
VentilationSystemZoneGroup issue — do not use that mechanism for Iteration 3 membership; do not broaden this into a general redesign unless required. Not needed by the accepted route.
Progress log
Each merged PR should add a comment here containing:
- PR link;
- reviewed head SHA;
- merge SHA;
- test results;
- licensed TAS evidence where applicable;
- next checklist item.
Do not use Closes #111 on any PR.
See the comment history below for the full progress log through PR5A/PR5B, the real-project acceptance, and
the final closeout comment for the full evidence trail.
Closure rule
PR1–PR4 = foundation milestone (FROZEN). PR5 = manufacturer-aware milestone.
Close this issue only when PR5 / full Iteration 3 is accepted — unless a later
human decision deliberately moves PR5 to a separate tracker.
This condition is now satisfied. The explicit Systems/TPD Iteration 3 route, including the accepted
selected-product cooling/B4 route, is complete and accepted (PR1–PR4 frozen; PR5A infrastructure merged;
PR5B selected-product cooling accepted, including real-project acceptance and the B4 close/reopen Review
7/7). A human decision, recorded above under FINAL CLOSEOUT, deliberately moves the remaining
manufacturer-ventilation behaviour (certified heat recovery, fan SFP/power, B1/B2, bypass/B3) to a
separate tracker, #123, because it is blocked on external
evidence, not on anything left to do in this repository set. #111 is CLOSED.
Activity
michaldengusiak commentedon Sep 9, 2026
Final architecture review confirmation — 2026-09-09
Reviewed the canonical issue against the final Aster architecture report. No material replan is required; the issue body is consistent with the accepted Iteration 3 architecture.
Two clarifications are worth preserving for implementation:
SimulationResultProvenance.Path_TSDis acknowledged legacy boundary debt and is outside this Iteration 3 foundation scope; do not use it as precedent for adding new TPD/TBD/TSD/TAS identifiers to SAM.AddIZAMs = false), remove inherited IZAMs, neutralise mechanicalticVcontribution while preserving infiltration / legitimate natural ventilation, and explicitly pair the generated no-IZAM TBD with its TSD. PR3’s thermostat bridge must start from that explicitly identified same no-IZAM TBD, not from basename/name guessing.Everything else in #111 remains the frozen plan. Next implementation item: PR1 — SAM_Systems generic mechanical-ventilation materialisation.
michaldengusiak commentedon Sep 9, 2026
Pre-start completeness review — closure and PR gates
Before PR1 starts, one programme-level clarification is required so this issue truly remains the canonical tracker for all of Iteration 3, not only the foundation.
Closure semantics
The current PR1→PR4 sequence is the Iteration 3 foundation milestone. After PR4 + native acceptance, record FOUNDATION FROZEN, but do not close #111 if the intended definition of Iteration 3 includes selected-manufacturer equipment behaviour.
The issue should remain open through the deferred manufacturer-aware milestone (currently PR5, split further only if implementation evidence proves that necessary): selected product identity remains authoritative; product-specific parameters may affect fan/heat-recovery/bypass/cooling/control behaviour only where supported; capacity must never become operating airflow; no silent product reselection; and topology variants are allowed only where physical topology genuinely differs.
Close #111 only after either:
PR1 exit gate — SAM_Systems
In addition to the body contract, PR1 must source-verify before implementation:
YearlySchedulecopy currently truncates an annual schedule to 24 values; fix narrowly only if reproduced and directly blocking materialisation;SystemEnergyCentretemplate/output, including mutableSystemSpace/flow objects;MV.json;AirSystemper physical analytical AHU, with all served spaces and explicit transfer topology;PR1 completes only when Release build + full SAM_Systems regression + focused materialisation tests + deterministic/scaling tests are green and the source analytical model/template remain unchanged.
PR2 exit gate — SAM_Tas
PR2 owns the clean no-IZAM load source and TPD execution. It must also close only the narrow defects that block this route:
ZoneLoadsfixed-index enumeration;Simulatefalse-positive success;SystemSpaceResultname/identity ambiguity via explicit GUID bindings.Native evidence must prove no IZAM/mechanical
ticVcontribution, preserved legitimate infiltration/NV, separate AHU systems, correct terminal/transfer/fan flows, complete annual results and API/native agreement forZoneTemperature.PR3 exit gate — SAM_Tas
The temporary ResultantTemperature bridge must:
PR4 exit gate — SAM_UI
PR4 is orchestration/presentation only: stage execution, refusals, artifact lineage, A/B evidence and the unchanged TM59 authority. It must not create a second engineering authority or move TAS knowledge into SAM.
After PR4 + licensed acceptance, record ITERATION 3 FOUNDATION FROZEN and then proceed to the manufacturer-aware milestone if full Iteration 3 remains the programme goal.
This comment supplements the frozen architecture in the issue body; it does not reopen it.
michaldengusiak commentedon Sep 9, 2026
PR1 planning complete — READY TO BUILD
Approved implementation plan for PR1 — SAM_Systems generic deterministic mechanical-ventilation materialisation attached.
Plan was source-verified against current sow/2026-Q3 in SAM_Systems and SAM and incorporates the final multi-AHU, deterministic lineage, isolation, transfer-topology and 5,000-space scaling decisions.
Status: READY TO BUILD
Implementation must treat this attached plan and SAM #111 as the contract. Do not reopen architecture unless BUILD reveals a genuine source contradiction.
No branch, production edits, commit or PR was created during planning.
PR1_SAM_Systems_Approved_Plan_2026-09-09.zip
fix(parto): re-accept PR2 on a real Iteration 1a design, not a harnes…
SAM-BIM-AI commentedon Sep 11, 2026
ITERATION 3 FOUNDATION FROZEN
PR1 → PR4 (this issue's foundation milestone) are all merged and the licensed acceptance is green on
merged binaries. Recording the closeout; this issue stays open for the deferred manufacturer-aware
milestone (PR5).
SAM PR #116 — simulation-result provenance round trip
d43a4ff92f7ce2996175a5ab2939f4078e34daab553957dc61db876926a5599154770d7aa22f959fintosow/2026-Q3SAM.Tests: 2120/2120GroundTemperaturefield round-tripped a.samsave/reload as a stated0instead of staying "not stated", and SAM_UI's own presentation-only "UI Geometry Settings" parameter
was not excluded from the fingerprint — together these made
PartORun.Restorerefuse a persisted PartO run that had not actually changed. Both fixed; simulation-result provenance is now stable across
.samreopen for a model carrying TAS results.SAM_UI PR #100 — Iteration 3 (A/B) orchestration foundation
86a436b6baf2781d2c1c11e4cccfbd6848ec0567736e177169db2dd1ab27371dd738443596604c49intosow/2026-Q3SAM.Analytical.UI.WPF.Tests: 961/961, Release build 0 errors (rebuilt against the merged SAMabove;
SAM_Systems/SAM_Tasunchanged at89cf1399/1d62f380)Licensed merged-state evidence
Canonical fixture (SHA-256
A7E09A25AE29C7DBB4C690D747A96FCD9F110CA27FB4DC2ABE816755368D7E4B), runagainst the merged SAM and rebuilt SAM_UI:
Corridor_1unbound, 14 directed legs(3 supply / 6 extract / 5 transfer)
ZoneTemperatureandResultantTemperatureseries.sam,reproducing the same statistics
TBD/TPD/TAS3D) observed during either Review — onlyTSDresultreaders, polled continuously throughout both runs
Full detail:
SAM_UI/documentation/evidence/PR4-ITERATION3-FOUNDATION.md§5.6.1 (SAM_UI,sow/2026-Q3).SAM #114
Closed: #114 (comment) — resolved by
caller/orchestration identity scoping in PR #100, demonstrated on the canonical fixture above.
Status
ITERATION 3 FOUNDATION FROZEN.
Next programme item: PR5 — manufacturer-aware behaviour (selected-product parameter overrides, heat
recovery, fan behaviour/power, bypass/control, trim cooling/cooling modules, and physical topology
variants only where genuinely required by manufacturer evidence). The frozen invariant still holds and is
unchanged by anything in this closeout:
This issue remains open through PR5.
SAM-BIM-AI commentedon Sep 11, 2026
PR5 PLANNING — investigation complete (no code)
ITERATION 3 FOUNDATION FROZEN. PR5 investigation is complete against
sow/2026-Q3(SAM553957dc, SAM_Systems89cf1399, SAM_Tas1d62f380, SAM_UI736e1771). No branch, commit or PR was made.Milestone shape: PR5 splits into two justified slices.
MV→ the existing shippedMVRE.First canonical product:
Nuaire MRXBOXAB-ECO5-AECV (MR-ECO-COOL-V). It is the only domestic entry (150/150 l/s), the smallest capable unit for every canonical dwelling, and the only one carrying cooling-module data.Source-verified
AirHandlingUnitParameter.VentilationUnitReferenceand is persisted and reopenable. Candidate B currently carries none of it.Matches→ unit settings → PR1 binding. No names are involved.HeatGainFactor = 0is imposed in SAM_Tas (Modify.GroundVentilationFans), so PR5 needs a route policy there and B0 keeps it as the default.ExchangerhasSensibleEfficiency/BypassFactor/Setpointas ProfileData, with table modifiers on ODB/EDB/EDB2/EFlow.Flagsoffers HeatingOnly/AdjustForOptimiser. Calc methods are Simple/NTU/Duty.FanhasHeatGainFactor,Pressure,OverallEfficiencyand FixedSpeed/VariableSpeed control. The measured load is Q·dp/η, so SFP maps to dp/η.DXCoilhasCoolingSetpoint, a scalarCoolingDutyand Normal/OnOff control.ExchCalcType, which must be fixed.Major fail-closed decisions
#113 becomes more likely with MVRE, because new template GUIDs change creation order. It stays OPEN and is not fixed in PR5 unless the canonical B-variant is refused. #115 has no dependency: operating-point tests use full-year TSD sources and TPD hour windows, never 1-day periods.
Next action: PR5A implementation. Merge order is SAM → SAM_Systems → SAM_Tas → SAM_UI. Licensed operating-point tests P0/A–D run before any annual run.
Plan document:
SAM_UI/documentation/plans/PR5-MANUFACTURER-AWARE-PLAN.md. It is committed with PR5A's first SAM_UI commit and reproduced in full below.This issue stays OPEN. PR5 stays [ ]. #113 and #115 stay OPEN.
Full PR5 plan (source map, data model, Systems/TAS mapping, control, four-airflow map, fail-closed rules, test matrix, evidence, UI, PR plan, exit gates, 16 answers)
SAM #111 — PR5 manufacturer-aware MVHR: implementation plan
Date: 2026-09-11 · Status: PLAN — no production code · Tracker: #111
Source-verified against
sow/2026-Q3:553957dc61db876926a5599154770d7aa22f959f89cf139966f4fe426459851d09f052834551792f1d62f380f0d3f0692b9cf0cc8ecf8b37f93fe375736e177169db2dd1ab27371dd738443596604c49TAS capability claims below are from reflection over
SAM_Tas/references_buildonly/Interop.TPD.dll, fromthe SAM_Tas conversion code, and from the licensed PR2 evidence. A property existing on the interop is
not proof of simulated behaviour; anything that needs proof is marked LICENSED EXPERIMENT.
0. Decisions in one screen
PR5 splits into two slices, and the split is justified.
MV→MVRE.PR5B is not simply "more parameters". It extends the four-airflow contract, which PR5A must leave untouched, and it depends on native TAS control behaviour that nothing yet proves. PR5B depends on PR5A's identity-to-graph plumbing and on the MVRE route.
First canonical product:
Nuaire MRXBOXAB-ECO5-AECV (MR-ECO-COOL-V).The certified heat-recovery efficiency and SFP of that product are NOT in SAM and were not retrievable online. Nuaire publishes "up to 95%", and retail pages quote "up to 90%". Both are marketing and are unusable. PR5A therefore opens with an evidence gate (E1/E2). Until those values are transcribed from a certified source, B1/B2 on the real product refuse.
B0 parity stays byte-identical and remains the default control. Manufacturer behaviour is additional configuration over the same route. It is never a replacement.
No manufacturer-name conditionals anywhere. Product data flows as follows:
MechanicalVentilationUnitSettings, keyed by AHU GUID.SAM_Tas: TAS Systems flow sizing is sensitive to component creation order on the explicit Part O ventilation route #113 is not fixed in PR5. MVRE makes it more likely, so PR5 keeps failing closed on a TAS sizing refusal. SAM_Tas: a 1-day simulation period crashes TSD.exe (0xc0000005) inside Modify.AddResults, surfacing as RPC server unavailable #115 has no dependency.
A. Current source map
Equipment authority (Iteration 2, reused unchanged unless noted)
SAM/SAM.Analytical/Classes/System/VentilationUnitTemplate.cs,VentilationUnitReference.cs,VentilationUnitPerformanceTable/Axis/Output.cs,FlowFractionControlCurve.cs,PerformanceJson.csVentilationUnitCapacityDescriptor.cs,Query/CapacityDescriptor.csSAM_Systems/files/resources/Analytical/Systems/VentilationUnit/VentilationUnitCatalogue.JSON(VentilationUnitCatalogue:v1)SAM_Systems/.../SAM.Analytical.Systems/Query/VentilationUnitTemplates.csSAM_UI/WPF/.../Classes/PartO/VentilationUnitCatalogue.csSAM/.../Query/CapableVentilationUnits.cs(SelectSmallestCapableVentilationUnit),Modify/SelectVentilationUnit.cs, called fromModify.PreparePartOIterationSAM/.../Modify/AssignVentilationUnit.csAirHandlingUnitParameter.VentilationUnitReferenceon the dwelling'sAirHandlingUnit(Enums/Parameter/AirHandlingUnitParameter.cs); read byQuery.SelectedVentilationUnitReference(Query/AirHandlingUnitDesignDuty.cs:113).samQuery.IsVentilationUnitSufficient(AirHandlingUnitDesignDuty.cs:196),AirHandlingUnitDesignDutyPartOEquipmentSelection.cs(mode + allowed pool, identities only)PartOProjectTestVentilationUnit.cs(name + 2 capacities, no performance by design)Modify/ApplyTargetedDesignAirFlow.cs,EvaluateDesignAirFlowCapacityEnvelope.csIteration 3 foundation (touched as stated)
Create/MechanicalVentilation.cs(energy-centre key incl. schedule type/name,:322-323)Create/MechanicalVentilationAirSystem.cs(template subgraph re-key; fans get settings schedule:94)Classes/MechanicalVentilationSettings.cs(schedule, name, in-room components)UnitSettingsfiles/.../SystemEnergyCentre/MV.json(2 fans, dampers, no exchanger) /MVRE.json(Exchanger 1: Simple, sensible 0.7, latent 0,AdjustForOptimiser, 2 fans),CapabilityIndex.JSON(MVRE = "SAM's MVHR")SAM.Analytical.Tas.TPD/Create/SystemVentilationRoute.csModify/GroundVentilationFans.cs(forcesHeatGainFactor = 0, reads back; checks 8760 operable hours)ClearToZero(B0 default) /FromSystemsGraphConvert/ToTPD/Fan.cs(writes OverallEfficiency, HeatGainFactor, Pressure, flows, Capacity, ControlType, PartLoad, schedule)Convert/ToTPD/Exchanger.cs(writes type, sensible/latent eff., setpoint method/value, electrical load, duty, BypassFactor, flags; does not writeExchCalcType, writesExchLatTypetwice)ExchCalcTypeCreate/SystemVentilationConversionContext.cs,Modify/MaterialiseVentilationDutyCarriersConvert/ToTPD/DXCoil.cs,CoolingCoil.cs,Controller.csWPF/.../Classes/PartO/PartOIteration3Pipeline.cs(Ventilation_Template = "MV"; "no heat recovery, fan heat, equipment selection… configured")WPF/.../Query/PartOIteration3OperatingSchedule.cs("Part O continuous operation", 8760×1.0)WPF/.../Modify/RunPartOIteration3.cs,SAM_UI/SAM.Analytical.UI/Classes/PartO/PartOIteration3{Record,Ledger,Comparison,Result,Artifacts}.cs,PartORun.csPartOIteration3SystemScope.cs(#114 scoping)No Iteration 3 file references
VentilationUnitReferencetoday, so Candidate B carries no product identity. That is the core gap PR5 fills.B. Equipment data model
Existing fields (catalogue v1)
VentilationUnitReference(Manufacturer/Model/Reference)CoolingModuleModelSourceMaximum{Supply,Extract}FlowRate_LpsRankPerformanceTableFlowFractionByControlTemperatureSource)Required new fields (catalogue schema
VentilationUnitCatalogue:v2; reader accepts v1 = "no behaviour data")All fields are optional. An absent field means not stated, and a behaviour needing it refuses. Every table uses the existing
VentilationUnitPerformanceTablegrammar: raw published units, no conversion on the way in, interpolationonly at use under an explicit
PerformanceDomainPolicy.HeatRecoveryPerformanceSensibleHeatRecoveryEfficiency[-]; +EfficiencyBasisenum (SupplyTemperatureEfficiencyonly, first slice) +StandardtextFanPerformanceSpecificFanPower[W/(l/s)],SfpBasis=TotalBothFansSummerBypass{ Kind: None / Automatic100Percent / Modulating, PublishedThresholds: nullable, ControlDescription }CoolingModulePerformance(PR5B)PerformanceTable+CoolingControl { SetpointDefault_C, SetpointRange_C, AirflowOnCooling }Identity and persistence semantics
Identity stays where it is. The authority is
AirHandlingUnitParameter.VentilationUnitReference, which is already persisted and reopenable, asPartOEquipmentSelectionPersistenceTestspins. No identity moves into Systems or TAS.Carriage into Candidate B is by identity, never by name. The chain runs as follows:
VentilationUnitReference.Matches, the existing identity comparison.MechanicalVentilationBindingmaps the AHU GUID to the AirSystem GUID.No space, system or unit display name takes part.
The capacity number is never persisted beside the identity, as today. Each run persists the resolved behaviour values it used as run evidence. Those values are not model engineering; see section I.
The project test product has no behaviour data, by design. B1+ refuses for an AHU assigned to it; B0 still runs.
C. Systems mapping (selected unit → generic SAM_Systems)
New generic type, SAM_Systems, no product names:
HeatRecoveryPerformanceHeatRecoverySensibleEfficiencySystemExchanger.SensibleEfficiency;LatentEfficiency = 0;ExchangerType = Simple;ExchangerCalculationMethod = Simple;HeatingOnly = false;AdjustForOptimiser = false(MVRE has no optimiser)FanPerformanceSupplyFanPressure_Pa = ExtractFanPressure_Pa = 1000 × SFP_total / 2,FanOverallEfficiency = 1SystemFan.Pressure/OverallEfficiency. TAS fan load isQ·dp/η, measured in PR2-FAN-OPERATION.md §4, so the two fans' load sum isQ·SFP_total. The equal split is a declared simplification: the source publishes the total only. It is recorded as such in evidenceSupply/ExtractFanHeatGainFactorSystemFan.HeatGainFactorSystemFan.Capacitykeeps the template value and is asserted equal to B0Rules
MV, unchanged. B1+ uses the shippedMVRE, the existing SAM MVHR topology perCapabilityIndex.JSON. That is a genuine physical topology variant: an MVHR has a heat exchanger. MV.json and MVRE.json are both read-only.SystemExchanger;UnitSettingsis non-empty. That second case prevents a partially configured graph.UnitSettingsis empty, the code path, the energy-centre key and every derived GUID are identical to PR1. This is asserted by hashing the serialised graph against PR1's output.D. TAS mapping
SystemFan.HeatGainFactorConvert.ToTPD(SystemFan)writes it;GroundVentilationFansoverwrites to 0Fan.HeatGainFactor : doubleFromSystemsGraph)SystemFan.Pressure,OverallEfficiencyFan.Pressure,Fan.OverallEfficiency : ProfileDataSystemFan.FanControlType,MinimumFlowFraction,PartLoadControlType (FixedSpeed/VariableSpeed),MinimumFlowFraction,PartLoad : ProfileDataModify.SetScheduleby nameSetSchedule, yearly tableSystemExchanger.SensibleEfficiencyExchanger.SensibleEfficiency : ProfileData(modifiers: Yearly/Schedule/Table/Curve/Lua)ExchangerCalculationMethodExchanger.ExchCalcType (Simple/NTU/Duty)SystemExchanger.BypassFactorExchanger.BypassFactor : ProfileDataODB/EDB/EDB2= LICENSED EXPERIMENTSetpointMode+SetpointSetpointMethod (None/On),Setpoint : ProfileDataHeatingOnlyflagtpdExchangerFlagHeatingOnlyDisplaySystemHeatingCoil→HeatingCoilSetpoint,Duty,Efficiency,MaximumOffcoilDisplaySystemDXCoil→DXCoil(needs refrigerant group)CoolingSetpoint : ProfileData,CoolingDuty : SizedVariable,ControlMethod (Normal/OnOff),BypassFactor,Min/MaxOffcoilCoolingCoil(needs cooling group/chiller)Setpoint,Duty,BypassFactor,MinimumOffcoilCoolingDutyis a scalar SizedVariable (Value/Size), with no modifiersCoolingSetpointProfileData table modifier onODB,EDB,EFlow(axes count unverified)BypassFactor(coil contact), latent implicitConvert/ToTPD/Controller.csControllerwithSensorTypeincl.tpdThermostatSensor,tpdTempSensor;ControlTypeNormal/Max/Min/If/Outdoor…ISystem.Simulate, multi-room unit)VariableSpeed+ controller, or zoneFlowRateProfileDataGetResultsDatavar 9 (Load) only, measured in PR2E. Control semantics
AllAttachedZonesFlowRate), i.e. OperatingAirFlow = DesignAirFlowSupplyLimit: exchangerSetpointMethod = On,Setpoint = HeatRecoverySupplyLimit_C, stated by the engineer as a scenario parameter and recorded as an assumption, not as manufacturer data. Its intended physics is a modulating bypass holding supply air at or below the limit. If licensed experiment X2 shows TAS's setpoint means something else, B3 uses aBypassFactortable modifier on (ODB,EDB2) instead. If neither is proven, B3 is dropped from PR5A and B1/B2 still shipF. Four-airflow contract
PartFSpaceData.Terminals[].ContinuousDesignFlowRate_Lps(SAM space parameter)VentilationTerminal.DesignFlowRate_Lps(SAM), then PR1SystemSpace.FlowRate/FreshAir+ leg flows (lineage bindings), then TPDSystemZone.FlowRate/damper design flowsPartOIteration3ReconciliationRefusals) is re-run for every B-variantMaximum{Supply,Extract}FlowRate_Lps, reached via AHUVentilationUnitReferenceIsVentilationUnitSufficient) + evidence only; never written into the Systems graph or TPDLoad·η/dp)Existing misuse check (question 4): none found. Capacity is used only as:
ApplyTargetedDesignAirFlow,EvaluateDesignAirFlowCapacityEnvelope);No production assignment of
Maximum*FlowRate_Lpsto a design flow exists. Iteration 3 reads no capacity at all. The MV.json fan prototypeDesignFlowRate 277.33 l/sis a template figure that TAS replaces from the attached zones. It is not capacity.G. Fail-closed rules
Each rule is one refusal with an actionable sentence, and none produces a partial graph.
VentilationUnitReference. It names the dwelling and offers B0.IsVentilationUnitSufficientis false. Refuse; never reselect silently.FanPerformance; B2 needsHeatRecoveryPerformance. Refuse by name and field.ClampToDomain; extrapolation is never allowed.HeatGainFactor,Pressure,OverallEfficiency,SensibleEfficiency,LatentEfficiency,ExchCalcType,SetpointMethod,SetpointorBypassFactordiffers from the graph.H. Acceptance test matrix
COM-free unit tests (SAM.Tests)
HeatRecoveryPerformanceandFanPerformancevalidation: strictly increasing axes, efficiency in [0, 1], SFP > 0.Query.VentilationUnitOperatingParameters(template, supplyDuty, extractDuty):Query.SelectedVentilationUnitTemplate(AHU, templates): identity match, and no name matching.SAM_Systems deterministic tests
Source.UnitSettingsapplied to the correct copy by AHU GUID.UnitSettingsis empty.MechanicalVentilationSettingsincludingUnitSettings.SAM_Tas focused conversion tests
ClearToZero, and the B0 path is unchanged.ExchCalcTypewritten and read back;FromSystemsGraphpreserves the graph's HeatGainFactor;Licensed native TAS operating-point tests
These run against the full-year canonical no-IZAM TSD, with TPD
SimulateSystemswindows (startHour..endHour, already supported). Never a 1-day TBD/TSD (#115). Each test is hand-calculated from TAS's own reported ODB/EDB and flows.GetResultsDatavariables (as PR2 did for fans)SetpointMethod = On, Setpoint 18 °CBypassFactortable on ODB × EDB2 → 1 above thresholdFull annual Part O acceptance (canonical fixture SHA-256
A7E09A25…368D7E4B)Reference A, B0, B1, B2 and B3 (if proven) are each Pass/Fail recorded. B0 must reproduce the frozen foundation result (0/8 TM59 outcomes differ vs A; same statistics).
Per variant:
ZoneTemperatureandResultantTemperature;Attribution:
Each delta is reported as mean bias, RMSE, max |Δ|, and TM59 exceedance hours.
Review in-session and after close/reopen, with no TAS simulation process during Review.
Negative tests
Every G-rule is exercised with a dedicated fixture or harness case:
5,000-space scaling
UnitSettingsfor every AHU. It asserts:I. Persisted evidence (per run, in the Iteration 3 ledger/record)
B0 | SelectedProduct{FanHeat, HeatRecovery, Bypass[, Cooling]}, which names exactly which layers were on.VentilationUnitReference;Sourcestring;J. UI (minimum)
IPartOIteration3Pipeline. They are not permanent UI scenarios.K. PR / repository plan
PR5A (one PR per repo, merge order strictly as listed)
HeatRecoveryPerformance,FanPerformance,SummerBypass;Query.SelectedVentilationUnitTemplate;Query.VentilationUnitOperatingParameters(COM-free resolver); tests. No Systems/TAS knowledge.MechanicalVentilationUnitSettings+ application inMechanicalVentilationAirSystem; B0-hash, determinism, refusal and scaling tests.SystemVentilationRouteOptions(fan-heat policy, exchanger grounding);Convert.ToTPD(Exchanger)writesExchCalcType(and drops the duplicateExchLatTypewrite); exchanger in intent/duty-carrier reconciliation;GroundVentilationExchangersread-back; P0 result probe; licensed operating-point evidence A–D (Documentation/evidence/PR5A-*.md).VentilationUnitCatalogue(extended to expose templates); templateMV/MVREchoice; paired B0/B-selected ledger + evidence; minimal UI; annual acceptance (documentation/evidence/PR5A-*.md).PR5B (after PR5A merged and X4/X5 feasible)
Same four-repo order, covering:
If X4/X5 prove infeasible through the current API, PR5B stops with a recorded NOT REPRESENTABLE finding. A human then decides the next step.
Evidence gates (before the relevant licensed acceptance)
L. Exit gates
PR5A accepted when ALL are true
Source; catalogue tests pin themPR5 (full Iteration 3) accepted, allowing #111 to close, when PR5A is accepted AND
16 questions — answers
TPD.Exchangeron the MVRE air path, withSensibleEfficiency(ProfileData),ExchCalcType = Simpleand latent 0. The exact ε definition and the imbalance handling are licensed experiment X1.DXCoilhas a setpoint, a scalar duty and On/Off control.michaldengusiak commentedon Sep 11, 2026
POST-FREEZE FOLLOW-UP — manual licensed testing findings
ITERATION 3 FOUNDATION REMAINS FROZEN. Nothing below reopens the architecture, begins PR5, tunes Candidate B, or changes the accepted B0 ventilation physics. No engineering behaviour changed in any repository.
Three findings from manual licensed TAS testing of a generated Iteration 3 document, investigated against
sow/2026-Q3(SAM553957dc, SAM_Systems89cf1399, SAM_Tas1d62f380, SAM_UI736e1771).1. PlantRoom sizing — shipped template data, not a defect in the route
IPlantRoom.Simulaterefuses withUnknown design flow rate into component Multi Boiler 1. Reproduced and bisected on the acceptance run's own Candidate B TPD, one fresh copy per variant:Convert.ToTPDwrites exactly the zero the SAM graph states, and the SAM graph states exactly what the shippedMV.jsonstates. The value was never there.MVRE.jsonandPlantroom-Only.json— the two templates refreshed through a working TAS plant room — both carry 11 onDHW Circuit Group, and every template carries 11 on the heating boiler. Before that refresh MVRE carried 0 too. Any non-zero value unblocks sizing, so the magnitude is engineering data, not a switch, and 11 K is not invented here.DHW Circuit Group.DesignDeltaT = 11, all three air systems answer "Done" and every one of the eight rooms'ZoneTemperatureseries is identical to six decimals over 168 hours. The DHW circuit is a disjoint liquid loop. No annual rerun would be required.2. Leeds + London design conditions — two sources, no accumulation
Leeds_TRY ANN HTG / CLG …London_LHR_DSY1 ANN HTG / CLG …Annual Design ConditionAddTSDData. Those two carry the only real design days and name the canonical fixture's annual weather.MV.jsondeclares it inAnalyticalSystemsProperties.DesignConditions, and the conversion re-creates each by name. It arrives with no design day at all: authoring residue, not a statement by the analytical model.ToTPDdeletes any existing TPD first andModify.Addis an upsert by name. The duplication is between two sources, not between runs.CIBSE Weather 2021.twd) and no TPD design condition; the Systems simulation uses the hour range and consults none, because every ventilation duty carrier Part O writes is Value-typed with zero design conditions attached; plant-room sizing (not used by Part O) uses whatever each sized variable names.3. The successful A/B review is now persisted
Every completed pairing writes its whole review beside the pairing record:
<run>-Iteration3-Review.txtand-Review.json. Composed by one authority that the window also renders and Copy All also writes, so the file and the screen cannot drift apart; every number copied from the comparison the review already produced, with the pairing's full identity and provenance added so it reads on its own a year later.The provenance refusal is untouched. A refusal writes nothing at all, so the last report describing a real comparison survives it byte for byte. The window then offers it as "Open Last Successful Report" and says — in the button, the tooltip and the refusal text — that it is HISTORICAL and does not describe the model in front of the user. Verified across two processes: one writes, a fresh one finds it, labels it historical, and still presents no Candidate B number.
4. Window visibility and click smoke test
The window asked for 1400x820 — taller than a 1920x1080 desktop at 125% (825 DIP) or 150% (688 DIP) scaling, and a window taller than the desktop cannot be dragged back into view. Now clamped to the work area and re-centred; the summary and the refusal are bounded and scrollable so long evidence cannot push the action bar off the bottom; the refusal and the comparison grid share one space; the action bar wraps. Measured on the real shown window against the OS client rect at 1920x1080 @100/125/150%, 1366x768 @100% and the window minimum, over complete / refused / refused-with-history: content fits in all 15, no control outside the window.
Every user-accessible control clicked in the state where it has least to work with: all refuse cleanly. One genuine crash fixed — Close threw when the window was shown non-modally.
Manual UI acceptance configuration: Windows 11 26200, primary display 1920x1080, work area 1920x1032, 96 DPI (100% scaling). 125% and 150% were exercised by driving the window at the device-independent work area those scales produce, which is the quantity the layout actually sees.
Changes
Verification
SAM.Analytical.UI.WPF.Tests979/979 (was 961; +18), Release 0 errors — every pre-existing provenance and refusal test green.SAM.Analytical.Systems.Tests149/149 (was 146; +3), Release 0 errors.SAM.Analytical.Tas.TM59.Tests890/890, Release 0 errors.ISystem.Simulatestill answers "Done" for all three air systems and all eight rooms; the full 8760-hour A/B acceptance was not rerun, because nothing that reaches it changed.B0 engineering behaviour: unchanged. The frozen invariant still holds:
Nothing here contradicts the frozen foundation. This issue stays OPEN through PR5; #113 and #115 stay OPEN.
One decision is left to a human: whether to state
DHW Circuit Group.DesignTemperatureDifference = 11in the seven shipped templates that carry 0, so that a native plant-room sizing of a generated document succeeds. It is one property, its value is already shipped in two other templates, and it provably cannot change a Part O result.SAM-BIM-AI commentedon Sep 11, 2026
PR5A Phase 0: licensed TAS capability evidence (measured, no production change)
This is an evidence update to the frozen PR5 plan. The architecture is unchanged. These findings are inputs to the plan, not a re-plan.
553957dc, SAM_Systems89cf1399, SAM_Tas1d62f380, SAM_UI736e1771. All clean.C:\TasOut\p0\PR5A-PHASE0-EVIDENCE.mdon the acceptance machine. The harness, TPDs and hourly CSVs are inC:\TasOut\p0, outside every repository.Method.
Create.MechanicalVentilation(MV / MVRE) and the productionSystemVentilationRoute, run over copies of the full-year no-IZAM TBD/TSD. TPD hour windows only; no 1-day source, so SAM_Tas: a 1-day simulation period crashes TSD.exe (0xc0000005) inside Modify.AddResults, surfacing as RPC server unavailable #115 is not involved.T_sup,out = T_o + ε(T_e,in − T_o), i.e. the supply-temperature-efficiency basisSizing Flow Failed/Main PlantRoom Has Errors)ExchCalcTypeExchCalcType = Simpleexplicitly and read it backBypassFactorSetpointSetpointMethod On+Setpoint, as a declared mode. Manufacturer bypass thresholds remain unknown and are not inventedP = Q·dp/η, independent of HGF.ΔT = HGF·dp/(η·1214.4), linear: 0.6176 K at 750 Pa, η 1, HGF 1. Supply and extract fans behave the sameDisplacementVentilation = trueand MVRE.json's hasfalse, so MV → MVRE silently changes it: up to 3.7 K difference in wet rooms at ε 0. With the flag aligned, MVRE@ε0 reproduces B0 exactly over 384 room-hoursSimulateEx(simdata ⊇ Load|Duct, hWnd 0)(same physics asISystem.Simulate). No native outlet temperature or recovery load exists, and exchanger var 15 is not a loadOwnership note (B3). The supply-limit setpoint is a declared scenario/route parameter, not manufacturer data. It belongs downstream (plan §C,
HeatRecoverySupplyLimit_C), not onVentilationUnitTemplate.Phase 0 production changes: NONE. No repository was changed, and nothing was committed or pushed.
Next: PR5A SAM slice #117 (generic catalogue vocabulary + COM-free resolver). E1 and E2 are still absent, so it fails closed. It is followed by the SAM_Systems slice.
This issue stays OPEN. PR5 stays [ ]. #113 and #115 stay OPEN.
michaldengusiak commentedon Sep 12, 2026
Post-freeze acceptance closeout — three PRs merged, DHW plant-room template fix merged and licensed-validated
Independent review (not taken on trust from prior summaries), merge, and licensed-TAS validation of the three post-freeze PRs plus the deferred DHW plant-room template fix. ITERATION 3 FOUNDATION remains FROZEN — nothing below reopens architecture, touches B0, or starts PR5.
SAM_Systems #21 — plant-carriage regression tests
c0a7076e91643e2f1dc518cb3559e1e8c6a92ca0— merge007a58d52909821cf7e900f5041c8a08ec1cd8d8SAM.Analytical.Systems.Tests: 149/149, Release 0 errors.SAM_Tas #53 — licensed plant-room/design-condition evidence
fcda9156f7259f1c28c49df09b1af2fcb5a43545— merge51edbf1fa898a634d99054bc9f5a5edd5f9b1dd4SAM.Analytical.Tas.TM59.Tests: 890/890, Release 0 errors.SAM_UI #101 — Iteration 3 report persistence + window fixes
6d3683eb0ba013f4b959eaceaada043d67d7ecb3-> fixed head6a75c3eb7f70ffe41f01a6ac669f65afb053d7b7— merge95d200051bc228e624ca108d5391e774b0aa9b02SAM.Analytical.UI.WPF.Tests: 980/980 (979 + 1 new), Release 0 errors.DHW plant-room template fix — SAM_Systems #22 (SAM-BIM/SAM_Systems#22)
54ead044f479429ffdca9eecc09d7f6750c0dbcd— mergea0395dc96ecb085c9b74c350c68234e00e005371c1cc91981efdcbe6735c415feaa3e04f8e704998— marks Polygon2D optimalization #53's evidence note resolved without erasing the forensic record.Root cause: native
PlantRoom.Simulate(1,24,0)answers "Sizing Flow Failed" whenever a DHW circuit's design-flow temperature difference is zero — theIsDHWboolean is irrelevant, only a non-zero dT magnitude matters (SAM_Tas #53).Templates inspected: all ten shipped
SystemEnergyCentretemplates (CAV,DISP,EOC,EOL,MV,MVRE,NV,Plantroom-Only,UV,VAV). Correction to the original estimate: eight carried the gap, not seven.Templates changed (
DHW Circuit Group.DesignTemperatureDifference0 to 11,.MinimumReturnTemperature0 to 50):CAV.json,DISP.json,EOC.json,EOL.json,MV.json,NV.json,UV.json,VAV.json.Engineering authority for 11 K:
MVRE.jsonandPlantroom-Only.jsonalready stated11/50on the identical component, both round-tripped through a native TAS plant-room refresh (commita571080, "MVRE template refresh") — the preferred in-repo, native-refreshed authority. All eight changed templates share byte-identical DHW topology with those two siblings (verified relation-graph walk, not just filename similarity).Templates/fields deliberately NOT changed:
MVRE.json/Plantroom-Only.json— already correct.Multi Boiler 1on all ten templates — still0, unchanged, matching the two native-refreshed siblings where the group-level fix alone was sufficient.Heating Circuit Group/Cooling Circuit Group—0there is not a gap; the boiler (11) and chiller (6) components already state those circuits' design dT.London_LHR_DSY1design conditions — load-bearing (referenced by name from every sized variable in all nine ventilation templates); insufficient evidence to call them stale; left alone. (MVRE's two unreferencedLondon_TRYentries are more plausibly stale authoring residue from the same refresh commit, but touching them means re-authoring the very file the 11 K authority depends on — flagged, not touched, pending template-owner review.)Known debt flagged, not fixed in this PR:
SAM_Tas/SAM.Analytical.Tas/Create/TPD.cs's standaloneCreate.TPD(...)builder hard-codes a disagreeing DHW authority (DesignDeltaT = 50,MinimumReturnTemp = 10, modelling the cold-feed raise rather than the secondary-circulation flow/return the templates use). It has zero references toSystemEnergyCentre/MechanicalVentilation/ToTPD— a disconnected legacy route (Grasshopper + an older UI Simulate command), not part of the Iteration 3 pipeline — so reconciling the two authorities is a separate decision.SAM.Coreresource resolution checks a user-profileDocuments\SAM\resources\...override before the repo's ownfiles/resourcesof the same name. Didn't bite this validation run (it happened to hold identical corrected data) but is a silent staleness risk for future sessions.PROJECT_PROGRESS.mdcontinuity log is several PRs stale (last describes PR refactor(gh): modernise legacy Grasshopper components using variable parameter architecture #40/ticV work); flagged by two independent review passes, not touched in this closeout to avoid scope creep into unrelated repo hygiene.Verification
PlantRoom.Simulate(1,24,0)on the correctedFlat-It3B.tpd: Done (was "Sizing Flow Failed").A7E09A25AE29C7DBB4C690D747A96FCD9F110CA27FB4DC2ABE816755368D7E4B): 3/3 MVHR AirSystems simulate, 8/8 roomZoneTemperatureseries complete.Ensuite_8, hour 5491, max 2.909 K). No separate 8760 h rerun was needed — the production route performs it intrinsically as part of validation, and it matches.Status
All four repositories (
SAM,SAM_Systems,SAM_Tas,SAM_UI) are onsow/2026-Q3, clean, fetched, and in sync with origin.ITERATION 3 FOUNDATION remains FROZEN.
PR5 — manufacturer-aware behaviour remains the next physics milestone. This issue stays open.
michaldengusiak commentedon Sep 12, 2026
ITERATION 3 B0 A/B PARITY DECOMPOSITION — CLOSED
Forensic decomposition of the frozen Candidate B0 / Reference A residual. Evidence only — no
production change in any repository, and Candidate B0 is byte-for-byte the frozen control.
Classification: B — no B0 implementation defect; the residual is a representation difference
Between the legacy TBD/IZAM route and the explicit TAS Systems route. Every defect candidate in
the study brief was tested against native TAS evidence, not argued. The one inherited default
that was found cannot be changed in the direction of parity.
Baseline and pairing
553957dc61db876926a5599154770d7aa22f959fa0395dc96ecb085c9b74c350c68234e00e005371c1cc91981efdcbe6735c415feaa3e04f8e704998(before this PR)95d200051bc228e624ca108d5391e774b0aa9b02Pairing: the post-DHW-template-fix production run, attempt GUID
a28813f0-1811-464f-ab2b-3f0b53d70a11, written2026-09-12 05:41:00Z, inC:\TasOut\pr9out.Reference A design fingerprint
207dbb4ced02f556, scenario fingerprint008beb0b6213be29.Canonical fixture SHA-256
A7E09A25AE29C7DBB4C690D747A96FCD9F110CA27FB4DC2ABE816755368D7E4B.Resource-shadowing trap checked: the user-profile
MV.jsonoverride and the repository copy areidentical (
b0160e2b1757…), so nothing stale was analysed.Flat.tsd(Reference A)E42B48C54939A4C0BDE076C40C314AA065E69EEDEBBB3A83D60E2234E569E3F3Flat.tbdEFFC4CAC8F6EEEFB26F6479A16F724665D0D6BAA62C6DE3B31B399C1DFE7B758Flat-It3B.tsd(no-IZAM source)E6BAA4E2FB72F07A017BA8683E2EA7D63A85456FA4196B3DB3215EBE9A3BE55FFlat-It3B.tbdF5458E7A700BD8FDB7B5B250F9AFD9FC932336297FD04ECF6F56C16F2BA82E8AFlat-It3B.tpd80067D2468B697B21226EECFCCB19C48777EA05239DEBBE765BCA3847633FED2Flat-It3B-Bridge.tsd0BE6B3B693287F936CE88217B7F04F60FDE8E2BDE990F61DF9C8051C02B1580CFlat-It3B-Bridge.tbd6C9D54F853179B55AFCAAFDD8EBA62674D395B06757661CECDEE3F255568DA27hourly-dataset.csv(70 080 rows, kept outside the repo)9689CECB55AA5FDE2E0EB8F17A857B861E7A5A439A1B09126697A54300040B13Were the annual simulations re-run? No.
Both annual TSDs were read as frozen and reproduce every published statistic exactly. Two short
licensed re-computations on copies were needed because TAS does not persist Systems/plant
results in a saved
.tpd(every component result series answersNullReferenceException):per-system
ISystem.Simulate(1, 8760, 0)to recover B0's nativeZoneTemperature, andIPlantRoom.SimulateEx(1, 8760, 15, …, Load|Pipe|Duct|SimEvents|Cont, 1, 0)to recover theper-duct hourly state. The per-system control reproduces frozen B0 to pooled RMSE 0.000874 K,
max 0.001001 K — the bridge's own thermostat resolution.
Findings
Time shift — none. A(t) vs B(t+k) for k in −3…+3:
k = 0is the RMSE minimum for all 8rooms and both quantities, monotonically worse either side, correlation peaking at
k = 0(0.982 air / 0.989 resultant). SAM_Tas #52 was the only alignment defect there was.
A-air vs B-
ZoneTemperature: bias +0.3853 K, RMSE 0.9840 K, max 4.1304 K.A-resultant vs B-resultant: bias +0.3726 K, RMSE 0.8335 K, max 2.9086 K.
Bridge contribution — none; it subtracts. RMSE falls 0.9840 → 0.8335 K across the bridge.
resultant = (air + MRT)/2holds tomax |diff| = 1e-6 Kin all three documents, and thebridge's achieved air equals the Systems
ZoneTemperatureto ≤ 0.001001 K per room. Thetemporary bridge is not a material contributor; replacing it with a native Systems resultant
would remove at most 0.001 K and would probably increase the reported difference.
Supply air — B0 supplies outdoor air, exactly. Read off the native fresh-air duct after
SimulateEx:max |T_freshair − T_outdoor| = 0.000000000 Kon all three units. No exchanger, noheating coil, no cooling coil and no active setpoint exists in any air system; both fans state
HeatGainFactor = 0, efficiency 1. Exchanger effect, fan heat, coils, hidden setpoint, plantcoupling and default component behaviour are each ruled out individually.
Reference A does not supply outdoor air.
Modify.UpdateIZAMswrites one 3 × 3 × 2 mMVHR plant zone per
AirHandlingUnit(MVHR-01/02/03, 18 m³ / 9 m², absent from the 9-space.sam) to stage theFROM OUTSIDEmovement. It is a full thermal zone: against outdoor dry bulbit runs RMSE 1.468 / 0.848 K, max 6.32 K, +1.0 K in January and −1.2 K in August.
Transfer air.
SystemZone.DisplacementVent = trueon all eight B0 zones (inherited from theMV.jsonprototype) makes TAS hand the stratified upper-layer air to the next component: an8 l/s wet-room outlet reaches 79.8 °C while the room reports 17.4 °C. So on the three supply
legs the two routes deliver identical air (to 0.002 K) and on the five transfer legs B0 hands
on air +0.67 … +2.54 K warmer in the annual mean. Reference A's IZAM physics was confirmed
independently: hand-calculating
Q = rho·cp·V·(T_source − T_room)reproduces A's nativeairMovementGainat correlation ≥ 0.99979, impliedrho·cp1224.3–1224.9 J/m³K.Bathroom_2's 12 extra
>26 °Chours. Its transfer inlet is Studio 1_0's stratified outlet at31.6–42.2 °C versus A's mixed 22.3–26.0 °C. All 12 are narrow-margin crossings: B0 exceeds by
0.076–0.850 K (mean 0.466 K) where A already sits at 25.38–25.99 °C, and B0's 16 hours are
a strict superset of A's 4 (0 hours the other way). Limit 262 h; both routes pass by 16×.
Hour 2968 is rank 1 of 8760 for the pooled mean |B−A| (1.7895 K). Day 124, 16:00, outdoor
21.1 °C — only the 290th warmest hour. A's plant zones still lag the heating season (MVHR-01
17.43 °C, MVHR-02/03 19.05 °C) so A supplies 2.05–3.67 K cooler air on the 63 l/s legs; the
four rooms on those legs all take their annual maximum there.
5491 vs 5299 — a 0.000303 K tie. Ensuite_8:
|delta| = 2.908573at 5491 and2.908270at5299 (4819 is third at 2.903435). Both round to 2.909 K. Not a pairing, indexing, timestamp or
stale artefact. Canonical convention recorded: 0-based hour of year 0…8759; argmax is Ensuite_8
at hour 5491.
Ruled out with zero contribution: DesignAirFlow mismatch (all 43 duct flow series constant at
design over 8760 h, every unit balanced 30/30, 63/63, 63/63); duplicate ventilation and residual
IZAM/
ticV(airMovementGainidentically0.000000000,IZAM count = 0,ticV = 0,AHUGain = 0, infiltration identical); schedules (fans operable 8760/8760 at factor 1.0); weatherand internal gains (every series identical to
0.000000); identity/result mapping (GUID-keyedboth sides, control rerun reproduces to 0.001 K).
Is there any legitimate B0 correction? No. Clearing
DisplacementVenton all eight zones andre-simulating gives fully-mixed behaviour like A's — and makes parity worse: pooled bias
+0.386 → +0.986 K, RMSE 0.984 → 1.282 K. Turning it off would be tuning away from A.
Final frozen B0 statistics — unchanged
Irreducible residual. Seasonal, not a level offset: +0.74…+1.07 K Nov–Apr, −0.30…−0.39 K
Jun–Sep. It tracks the two-pass route's own load-evaluation offset — the gap between the
free-running no-IZAM TBD the zone loads were computed in and the temperature the Systems solver
achieves — at r = 0.932 across the twelve months, and it is visible in its cleanest form on
the three supply rooms, which receive identical air at identical flow through identical fabric
and still sit +0.29…+0.52 K above A. By outdoor condition:
In the regime Part O actually assesses the pooled bias is −0.048 K and the RMSE 0.490 K. The
zero TM59 outcome differences are not luck. The residual is physically and numerically acceptable
as the difference between the legacy IZAM representation and explicit TAS Systems.
PR
bc0d9a4d4f4f156c0a69cf42250826635f15a7a7— merge6c622309f6e368cf0116dfabbc20deec45bd2cbaDocumentation/evidence/, 0 deletions,no source file touched, text only.
spdxandbuildgreen.Evidence location
SAM_Tas/Documentation/evidence/PARTO-ITERATION3-B0-PARITY-DECOMPOSITION.md, withPARTO-B0-PARITY-summary.csv(machine-readable), the per-room / shift / monthly / critical-hour /threshold tables, native Reference-A IZAM and B0 TPD topology dumps, native duct results with and
without the displacement flag, every analysis log, and the licensed harness and analysis scripts.
The 70 080-row dataset and five plots are kept beside the acceptance artefacts and hashed in
PARTO-B0-PARITY-artefacts.csv.Input for PR5A (recorded, not acted on)
PR5A Phase 0 required the
DisplacementVentilationflag to be normalised explicitly. This studymeasures the direction, which Phase 0 could not: Candidate B0 runs with it
true, andnormalising to
falsemoves B0 away from Reference A (pooled bias +0.386 → +0.986 K, wet roomsmoving 1.6–1.8 K).
MVREshould be normalised totrueso that MVRE at epsilon 0 stillreproduces B0; normalising both to
falsewould silently change the frozen B0 control andinvalidate the comparison.
Remaining narrow debt (unchanged by this study)
ResultantTemperature— the thermostat bridge stays until TAS exposes one.Measured here as a non-contributor, so its replacement is a simplification, not a fix.
SAM_Tas'sPROJECT_PROGRESS.mdcontinuity log is still several PRs stale.MVRE.json/Plantroom-Only.jsonDHW carriage directly.ITERATION 3 FOUNDATION remains FROZEN.
B0 forensic study is CLOSED.
PR5A may now resume.
PR #117 has NOT been merged or modified by this study — it remains OPEN at head
f6b0d3f93a73c91a9e44c728e5476afe7d7f82f8, unrebased and un-built-on.#113 and #115 retain their existing states; this study produced no new evidence touching either.
This issue stays OPEN.
michaldengusiak commentedon Sep 12, 2026
PR5A resumed — SAM slice (#117) independently reviewed and merged
Independent review (not taken on trust), full local build, and full local test run of PR #117 before merging.
Review
f6b0d3f93a73c91a9e44c728e5476afe7d7f82f8(matched the expected head).SAM.Analytical/SAM.Tests(no SAM_Systems/SAM_Tas/SAM_UI knowledge leaked into SAM).PROJECT_PROGRESS.md).VentilationUnitReference.Matchesonly — a dedicated test (ResolutionIgnoresDisplayNames) proves display names are ignored and an ambiguous/duplicate match refuses rather than picking one.HeatRecoveryPerformance/FanPerformanceabsent →IsHeatRecoveryResolved/IsFanPerformanceResolvedfalse,NaN, never 0 and never MVRE's 0.7 (MissingData_StaysMissingThroughARoundTrip).ResolvingAtTheDesignDuty_NeverMovesItAndNeverReadsTheCapacityresolves at the AHU's actual 30 l/s design duty on a 150 l/s-capacity product and asserts the two give different figures.TheNewFields_AddKeysAndChangeNothingElse).Independent build/test verification (not just re-quoting the PR's own CI)
feature/parto-pr5a-ventilation-unit-performance, built a fresh worktree at the reviewed head.dotnet build SAM.sln -c Release: 0 errors.dotnet test SAM/SAM.Tests -c Release: 2151/2151 passed.build (Release),test (Release),spdx) all green.No genuine defect found. No fix was needed on this PR.
Merge
b4a1283f8f5a805b637943fedc0b2a7f493d7b9aintosow/2026-Q3.SAMsow/2026-Q3fast-forwarded tob4a1283fcleanly.Status
Next: SAM_Systems PR5A slice — catalogue reader v1+v2, E1/E2 evidence gate (transcription only from a certified source; still absent, so behaviour stays fail-closed for the real product),
MechanicalVentilationUnitSettingskeyed by AHU GUID,DisplacementVentilationnormalisation on MV -> MVRE per Phase 0 finding "Test A" (normalise totrue, per the B0 A/B parity decomposition's direction evidence).E1/E2 remain unsourced. B0 is untouched by this slice (SAM has no TAS/Systems concept). This issue stays OPEN.
michaldengusiak commentedon Sep 12, 2026
PR5A resumed — SAM_Systems slice (#23) reviewed, one genuine defect found and fixed, merged
Implementation
MechanicalVentilationUnitSettings(per-AHU-GUID resolved heat recovery efficiency, fan pressure/efficiency/heat-gain-factor; every field NaN/null = "leave the template untouched") andMechanicalVentilationSettings.UnitSettings, keyed by analyticalAirHandlingUnit.Guid, all-or-nothing across the units one call materialises.Create.MechanicalVentilation/MechanicalVentilationAirSystemapply the settings onto the unit's own re-keyed fan/exchanger copies; capacity is never written; the energy-centre identity key folds in every unit's settings only whenUnitSettingsis non-empty, so B0 stays byte-identical to PR1.DisplacementVentilationnormalised totrueunconditionally on every materialised zone, per Phase 0 "Test A" and the licensed B0/A parity decomposition (MV.json alreadytrue; MVRE.json'sfalseis authoring residue that measurably moves B0 away from Reference A). Templates are read-only per the frozen plan, so this is a code-level correction, not a data edit.VentilationUnitCatalogue:v2alongsidev1, validating SAM#117'sHeatRecoveryPerformance/FanPerformancethe same way every other optional field is. Shipped catalogue untouched — E1/E2 still unsourced.Genuine defect found during implementation (self-caught, before any review)
The settings-application logic originally ran after the unit's fan/exchanger copies were added to the plant room.
SystemPlantRoom.Add()clones its argument on the way in, so every override silently had no effect on the materialised graph — caught by a failing test assertion (exchanger stayed at the shipped0.7instead of the requested override). Fixed by moving the whole block earlier, identifying roles on the template's own untouched connectivity (still intact at that point in each unit's pass) rather than the already-added copies, then mapping through to the copies beforeAdd().A related discovery while diagnosing that bug: neither shipped template attaches the supply fan directly to the room. Connector 0 of the prototype room is a damper in both
MV.jsonandMVRE.json; only connector 1 (extract) is a direct fan attachment. The supply fan is identified by elimination — the unit's other fan, among exactly two — never by name.Independent review (a fresh agent, not the implementer)
No correctness defects found (no O(n²) scans, no NRE paths, no manufacturer-name leakage, B0 identity-fold traced and confirmed empty-safe, fan-role test coverage confirmed to genuinely catch a supply/extract swap). One architectural question raised: whether the unconditional
DisplacementVentilation = truenormalisation belongs in generic code. Resolved: it's a deliberate, plan-mandated, two-template correction (§ frozen plan explicitly requires this normalisation and states the templates are read-only, so a data-layer fix is not available) — strengthened the code comment to make that scope explicit, and added an ambiguity check to the prototype-room lookup for defence in depth.Validation
SAM.Analytical.Systems.Tests: 176/176 (was 149; +27 — B0 invariance, zone-flag normalisation on MV vs MVRE, fan settings applied to the structurally-correct fan, heat-recovery mapping with the "exactly one exchanger" refusal, capacity-never-written, all-or-nothing partial-configuration refusal, determinism/isolation, JSON round trip, and a 5,000-space/50-air-handling-unit scaling test).dotnet build SAM_Systems.sln -c Release: 0 errors.build— includes the same test run — andspdx): both green.Merge
3772fc3ccb095edbe0f36f7733f33eaa540e2770— merge SHA5213ba9c0c7003bc38044ab83ae378e238bcb6edintosow/2026-Q3.SAM_Systemssow/2026-Q3fast-forwarded and rebuilt cleanly (0 errors).Status
E1/E2 remain unsourced; the real MRXBOX product still fails closed.
HeatRecoverySupplyLimit_C(B3) is carried on the new settings type but not yet interpreted anywhere — that's SAM_Tas's job.Next: SAM_Tas PR5A slice — route options (
ClearToZeroB0 default /FromSystemsGraph),Convert.ToTPD(Exchanger)writingExchCalcTypeand dropping the duplicateExchLatTypewrite (both confirmed present in the current code by direct read), exchanger reconciliation/duty-carrier handling, a P0 result-read-back probe, and the licensed operating-point evidence A–D against the full-year canonical no-IZAM TSD. This issue stays OPEN.michaldengusiak commentedon Sep 12, 2026
PR5A resumed — SAM_Tas slice (#56) reviewed, licensed-verified, merged
Implementation
Convert.ToTPD(DisplaySystemExchanger, …)now writesExchCalcTypeexplicitly (previously never written — it only ever applied asSimplebecause that happens to be TAS's own default for a new exchanger; Phase 0 X1-D measuredNTUrefuses with zero heat transfer area andDutyignores the stated efficiency). Also drops a duplicateExchLatTypewrite (the identical line appeared twice).SystemVentilationFanHeatGainPolicy(ClearToZerodefault /FromSystemsGraph), threadedCreate.SystemVentilationConversionContext→SystemVentilationConversionContext.FanHeatGainPolicy→Create.SystemVentilationRoute→Modify.GroundVentilationFans.ClearToZerois byte-for-byte the pre-PR5A behaviour (every existing caller's default, unchanged).FromSystemsGraphwrites nothing and only reads back, so a resolved manufacturer fan-heat figure SAM_Systems already wrote onto the graph is never silently discarded.Modify.GroundVentilationExchangers, modelled onGroundVentilationFans: reads backExchCalcType, refuses if notSimple. No-op wherever no exchanger exists (every B0 system).Licensed verification
No COM-free test coverage exists for this (the repo's only test project has fakes for
TPD.SystemComponent/TPD.ZoneLoad, notFan/Exchanger, and building those from scratch was judged higher-risk than exercising the real interop). Instead, a throwaway harness (outside any repository) drove the actual production path —Create.MechanicalVentilation→Create.SystemVentilationConversionContext→Convert.ToTPD— against real TAS, using the shippedMVRE.jsonand two deliberately different fan heat-gain factors (0.5/1.0):ExchCalcTypewrites and reads back astpdExchangerCalcSimplein every run.FromSystemsGraphpreserves both fan figures distinctly (native notes:HeatGainFactor 0.5andHeatGainFactor 1).ClearToZero— both native fans still read backHeatGainFactor 0. The B0 default path is unchanged for every existing caller.Full narrative and exact native notes:
SAM_Tas/Documentation/evidence/PARTO-PR5A-SAMTAS-CONVERSION-EVIDENCE.md.Not covered by this licensed check (disclosed in the evidence doc itself): the full operating-point evidence A–D, and any refusal path through the new code (no genuinely non-
Simpleexchanger or native write rejection was driven — verified by code inspection only, matching a pre-existing gap inGroundVentilationFansitself).Independent review (a fresh agent, not the implementer)
No genuine defects found. Confirmed end-to-end that the new optional parameter's default reaches byte-for-byte the same
ClearToZerocode path as before this PR for every existing caller; confirmedCreate.SystemVentilationConversionContext/Create.SystemVentilationRouteare the only construction/entry sites repo-wide (no second path silently reverts to the enum default); confirmed the duplicateExchLatTyperemoval is genuinely inert; confirmed documentation matches the code.Validation
SAM.Analytical.Tas.TM59.Tests: 890/890, unchanged from baseline.SAM_Tas.slnRelease (VS MSBuild, full .NET Framework —dotnet buildcannot build the COM interop projects): 0 errors, both before opening the PR and again after syncing the mergedsow/2026-Q3.build,spdx): both green. One fix mid-review: a pre-existing file (Exchanger.cs) predated the SPDX-header convention and was missing it; added (no behaviour change), confirmed by CI.Merge
de7a7a955919fcbc01baa13bc6a31bfd63d77cac— merge SHA0f7f59e0444d1798cd81ebac283b50e0cc130605intosow/2026-Q3.SAM_Tassow/2026-Q3fast-forwarded and rebuilt cleanly (0 errors).Status
E1/E2 remain unsourced; the real MRXBOX product still fails closed.
HeatRecoverySupplyLimit_C(B3) is carried on the SAM_Systems settings type but still not interpreted anywhere. The licensed operating-point evidence A–D and any annual acceptance remain gated on the SAM_UI slice (a zone-identity-matched model and the full-year canonical TSD/TPD route are Phase 5 territory).Next: SAM_UI PR5A slice — orchestration/behaviour-mode (parity vs selected-product), per-AHU resolution from the extended catalogue, paired B0/selected-product ledger and evidence, minimal UI. Only after that: the licensed operating-point evidence A–D and any annual acceptance. This issue stays OPEN.
fix(parto): keep pre-PR5A Iteration 3 pairings reviewable as Parity/B0
fix(parto): resolve only materialised units, reject shared air-system…
SAM-BIM-AI commentedon Sep 12, 2026
PR5A resumed — SAM_UI slice (#102) audited against Phase 0, amended, merged
Sync / collision audit (before touching anything)
origin/sow/2026-Q3: SAMb4a1283f(PR5A (SAM slice): optional certified heat recovery / fan performance vocabulary and a COM-free resolver #117), SAM_Systems5213ba9c(feat(geometry): NTS-backed topological validity check and repair #23), SAM_Tas0f7f59e0(ConvexHull and create Polygon2Ds optimalization #56), SAM_UI95d20005. No other open PR or unmerged remote branch targets any PR5A scope. The only unrelated open PR is SAM docs(readme): README capability framing (presentation-only, → sow/2026-Q3) #112, docs → master, DO NOT MERGE.DisplacementVentilation = true, and it reaches TAS through SAM_TasConvert/ToTPD/SystemZone.cs. B0 is unchanged.ExchCalcTypeis written and read back by ConvexHull and create Polygon2Ds optimalization #56.BypassFactor. B3 is not implemented;HeatRecoverySupplyLimit_Cis carried but applied nowhere.ClearToZero. Selected product maps dp = 1000·SFP/2 per fan with η 1 and a declared HGF 1.0. Fan roles are found structurally.Genuine defect found and fixed on #102: pre-PR5A pairings became unreviewable
#102 bumped the record to
PartOIteration3Record:v2. That broke review of existing v1 pairings in two ways:EquipmentResolutionstage, which a v1 record never had.So both acceptance pairings on disk (
C:\TasOut\pr4h,C:\TasOut\pr5a, both v1) would have lost their HISTORICAL review.Amendment
7ea2f704:EquipmentResolutionstage is replayed as the Parity no-op, so the ledger is shown whole. Review stays simulation-free.B2 − B1claim is made.Setpoint, notBypassFactor.Three further defects, raised by the automated review of the amended head — fixed (
eae90881)CI was green on
7ea2f704, but the merge was held because Codex posted two P1s and one P2 against #102's own code:AirHandlingUnitin the scoped copy. SAM SAM_Systems / Iteration 3: PR1 MechanicalVentilation has no system scope, so it refuses any real Part O model carrying authored NV / UV / legacy MV systems #114 scope removes a scoped-out ventilation system but keeps its unit, so Selected product would refuse, or SAM_Systems feat(geometry): NTS-backed topological validity check and repair #23 would reject settings for a unit it doesn't materialise. Now only units a retained ventilation system names are resolved; scoped-out units are noted.Undefined).Validation
b4a1283f, SAM_Systems5213ba9cand SAM_Tas0f7f59e0outputs.SAM.Analytical.UI.WPF.Tests: 1012/1012 (1002 + 10 new).SAM_UI.slnRelease (VS MSBuild): 0 errors.git diff --checkclean.eae90881: build success, spdx success. New automated review comments on it: none new — the three existing threads (P1 scope, P1 lineage, P2 completeness) are the ones fixed in this commit.Merge
eae908813c720efd503efebc31aec4ee5592b5fe; merged by merge commit0daa072dbe8b4bf4ebc2cf51571b7c55fbd11b65intosow/2026-Q3.Status
E1/E2 remain unsourced, so the real MRXBOX product still fails closed, and no values were invented. PR5B has not started.
Remaining PR5A gates (ownership fixed to avoid parallel collisions):
SimulateExdetailed read-back, exchanger ducts found by native port, inlet/outlet temperatures and effective ε, var1/var2 balance, G9 exchanger read-back, fan HGF compared with the graph, and Test A (MVRE@ε0 with the zone flag true == B0) on the merged heads.SetpointMethod On+Setpoint.VentilationSystems(airHandlingUnit)query for 5,000-space scaling.This issue stays OPEN. #113 and #115 are unchanged.
michaldengusiak commentedon Sep 14, 2026
PR5A external evidence gates — Nuaire + EDSL
Current state remains unchanged: Iteration 3 foundation is FROZEN and PR5 manufacturer-aware behaviour remains open.
Two external dependencies now gate the next manufacturer-aware acceptance steps:
1. Nuaire product/performance evidence
Canonical product:
MRXBOXAB-ECO5-AECVused withMR-ECO-COOL-V.Public evidence found so far:
500625is for baseMRXBOXAB-ECO5; no public record or manufacturer statement has been found proving that it applies unchanged to the-AECV/-AE(OH)CVvariant.SensibleEfficiencywhile TAS also models separate fan heat.TotalBothFansrepresentation, but canonical product identity/equivalence remains unresolved.Current readiness:
A technical request to Nuaire has been prepared asking which exact PCDB/test data applies to
MRXBOXAB-ECO5-AECV, for certified SFP vs airflow, and for either exchanger-only sensible efficiency corrected for fan/component heat or sufficient certified data to reproduce the package supply-air temperature without double counting fan heat.2. EDSL / TAS displacement + active-HR clarification
Licensed evidence shows the merged route is correct at ε = 0 and B0 parity remains exact. With
DisplacementVentilation = trueand active HR, TAS exhibits a genuine simulated discontinuity: the exchanger internally uses an extract state that can differ from the reported extract duct state, and that changed supply condition propagates to zone results. Displacement OFF restores smooth/exact behaviour; fan heat and optimiser flags were ruled out.A minimal TAS reproduction package has been prepared for EDSL. Until clarified:
DisplacementVentilation = true(B0 parity depends on it);External acceptance target
For Part O manufacturer validation, the certified package supply-air temperature / supply-temperature ratio is the external performance target. TAS exchanger ε is only an internal modelling parameter; any exchanger+fan decomposition must ultimately reproduce the certified downstream supply-air temperature.
No production code change is authorised by this comment. No B0 architecture is reopened.
SAM-BIM-AI commentedon Sep 15, 2026
PR5B status - SAM#113 became a direct PR5 dependency, fix in review, first valid annual B4 complete
Correction to this issue's tracker text
The body classified #113 as native TAS debt "not part of PR5 unless PR5 proves a direct dependency". PR5B has now proved that dependency.
Flow Sizing Failedor never terminated, depending only on generation.#113 is therefore a PR5 prerequisite.
Resolution in review
SAM-BIM/SAM_Tas#57 (head
800bc885, basesow/2026-Q3, not merged) makes native creation order a function of the graph alone:Evidence, A/B on the same build:
Done.Details are on #113.
First valid annual manufacturer-aware B4
Route: all three dwellings, full year, frozen Iteration 3 route - Systems -> ZoneTemperature -> ResultantTemperature bridge -> unchanged TM59 (SAM_UI
PartOTM59Assessment).B0 and B4 were regenerated together under the same (air-path) order. The configuration is unchanged from the accepted PR5B design:
Results:
Runtime: B4 generation 17.5 s, annual Systems simulation 167 s.
Reproducible: s1 vs s2 annual ZoneTemperature and ResultantTemperature are bit-identical (8 x 8760), TM59 identical.
Systems validity PASS in all three dwellings (plant-room re-simulation):
TM59: 8/8 rooms PASS.
Scope of this result. The canonical fixture demonstrates correctness and room coupling of manufacturer-aware cooling through the frozen route. It cannot demonstrate fail -> pass, because its B0 already passes TM59.
New native constraint for all further comparisons
Creation order is part of TAS's effective numerical state:
From here on, B0 and B4 are always regenerated together under the same ordering. Nothing is compared against an archived old-order B0.
Next
sow/2026-Q3-> post-merge verification (B0 + B4 regenerated together on merged binaries).PR5B evidence and progress: SAM_Tas
codex/pr5b-generic-table-roundtrip@b1569692(not merged). #113 and this issue remain OPEN.SAM-BIM-AI commentedon Sep 15, 2026
Checkpoint - SAM#113 ordering fix merged; PR5B infrastructure blocker cleared
sow/2026-Q3as5d8cfad0c62d36746d6f98cf62ac38e78e63daa1.sow/2026-Q3: PR5B's generic multidimensional table round-trip fix (SAM_Tas495000a1, PR5B branch, unmerged) must reachsow/2026-Q3.RPC_E_SERVERFAULT).This issue stays OPEN.
SAM-BIM-AI commentedon Sep 15, 2026
Checkpoint - both generic PR5B prerequisites merged; infrastructure blocker cleared
sow/2026-Q3as00f51520ce5b69b355436ab737811a75b91ee39f.ProfileData/TableModifierround-trip fix.ba5c5de2; CIbuild+spdxgreen.5d8cfad0.sow/2026-Q3. The integration head is00f51520. The files are byte-identical to the reviewed heads of Performance follow-ups on #56: Akl-Toussaint filter + endpoint connectivity #57 and BoundingBox3D Optimalization #58.Post-merge verification (merged integration branch)
SAM_Tas.slnRelease: 0 errors.SAM.Analytical.Tas.TM59.Tests: 906/906.Extrapolatefalse and true alike:The PR5B infrastructure blocker is cleared.
Next
PR5B consolidation. On the merged integration baseline, regenerate B0 and B4 together, then run:
annual Systems -> ZoneTemperature -> ResultantTemperature bridge -> unchanged TM59 -> PR5 completion.
Archived guid-order B0 artefacts remain invalid comparison baselines. Creation order is part of TAS's numerical state: identical TM59, but isolated hours move up to ~2 K.
This issue stays OPEN.
SAM-BIM-AI commentedon Sep 15, 2026
PR5B production acceptance - B4 = B0 + selected-product cooling module; PRs open, not merged
PRs against
sow/2026-Q3Merge order: SAM_Systems -> SAM_Tas -> SAM_UI. SAM is unchanged.
c36ba11(+ docsf6523d5)5213ba9220ea11f(+ docsae91066d)00f51520(#57 + #58)0d1833ed(+ evidence/docs569ad882)0daa072dSAM_UI/documentation/evidence/PR5B-PRODUCTION-ACCEPTANCE.md.HeatingSetpoint22 C +HeatingDuty0 as the gate;Extrapolatefalse;MV vs MVRE - reconciled; production B4 is deliberately the B0 Parity MV + cooling
SelectedProductmode therefore fails closed for the canonical product.Correction to the 2026-09-15 13:24 comment on this issue. Its "B0" and "B4" (
a-B0c/a-B4c-s1) were both generated on MVRE with no unit settings, so both carried the template's uncertified ε 0.7. Its "B0" hours (Studio 18, Bathroom 2) are not the Parity B0. Those numbers are historical architecture evidence only, and are superseded below. A cumulative B2 + cooling variant waits on E1/E2 and EDSL.Gate 1 (generation / native order)
HeatingDuty0;Exchanger 1.Paired annual result
Production route, full year, B0 and B4 regenerated together on the same binaries. B4 is resolved through SAM_UI's production
PartOIteration3CoolingResolution.Systems validity (route's own plant-room evidence pass on a disposable copy; MVHR-03 / MVHR-02 / MVHR-01):
Reproducibility, B4 vs identity-re-keyed B4:
Limitations
VentilationUnitReference.RunPartOIteration3cooling mode is covered by fake-pipeline tests plus the harness via SAM_UI resolution. There was no UI-driven licensed run.-It3B4).Next
PR5A's E1/E2 gate and the EDSL question remain open. This issue stays OPEN.
SAM-BIM-AI commentedon Sep 15, 2026
Checkpoint - PR5B merged into
sow/2026-Q3The PRs were merged in strict order, each as a merge commit pinned to its reviewed head. Before each merge I confirmed:
build+spdxgreen;sow/2026-Q3)f6523d505ca0c1ae91066dac85b5c3569ad8829f515c4cEach merged tree is byte-identical to its reviewed head (empty
git diff). No source differs from what was reviewed and licensed-tested.Post-merge verification (local, VS MSBuild Release)
05ca0c1:SAM_Systems.slnandSAM_Tas.slnRelease rebuilds: 0 errors.SAM.Analytical.Tas.TM59.Tests922/922.SAM.Analytical.Tas.Benchmark.Tests16/16.05ca0c1+ SAM_Tasac85b5c3:SAM_UI.slnRelease rebuild: 0 errors.SAM.Analytical.UI.WPF.Tests1027/1027.SAM.Analytical.Systems.Tests203/203. That was on the reviewed head, whose tree is identical to merge05ca0c1.PR5B is integrated
MechanicalVentilationCoolingSettings;MechanicalVentilationSettings.CoolingSettings;Modify.GroundRecirculationCooling);Modify.RecirculationCoolingResults,SystemVentilationRoute.RecirculationCoolingResults).PartOIteration3BehaviourMode.SelectedProductCooling(B4 = B0 Parity MV + the cooling module);documentation/evidence/PR5B-PRODUCTION-ACCEPTANCE.md.The annual licensed B0/B4 acceptance was not re-run, because the merged sources are byte-identical to the accepted heads. The canonical acceptance therefore stands:
Remaining programme gate
The only remaining Iteration 3 programme gate is the known failing real-project run:
1a -> 1b -> 2 -> 2B -> 3-B0 -> 3-B4It has not been started. PR5A's E1/E2 evidence gate and the EDSL displacement + active-HR question also remain open. This issue stays OPEN.
michaldengusiak commentedon Sep 16, 2026
Progress log — 2026-09-16, Part O real-project acceptance + Criterion 1 seasonal-basis closeout
Four PRs merged into
sow/2026-Q3today, in dependency order:ad81b21e17af3245f7dbedf0ff862201443f2557, reconciled to1271d919against #119e2c0e2c0SAM.Tests2154/2154a17ed01c267f52fPartODiagnosticLog'shoursExceedingComfortRangealigned to the same summer basis (diagnostic evidence only, no Pass/Fail impact) —SAM.Analytical.Tas.TM59.Tests931/931Evidence position, distinguished:
Full detail:
SAM/documentation/PartO-TAS-VALIDATION.md,SAM/PROJECT_PROGRESS.md,SAM/documentation/PartF-HANDOVER.md§0 (all updated in SAM#121).This issue is not being closed. Per this issue's own closure rule above ("Close this issue only when PR5 / full Iteration 3 is accepted — unless a later human decision deliberately moves PR5 to a separate tracker"): PR5 ("manufacturer-aware behaviour") is listed above as an open, unchecked milestone with an unfinished "Potential later work" list. Items 1–4 above are verified evidence within PR5's line of work (PR5A, PR5B, and this Criterion 1 slice), not the whole of it. No human decision has been made to move PR5 elsewhere, so #111 stays open pending PR5.
Merge pull request #124 from SAM-BIM/docs/parto-111-final-closeout
michaldengusiak commentedon Sep 16, 2026
FINAL CLOSEOUT — SAM Part O Iteration 3
Foundation
PR1–PR4 frozen and accepted (SAM_Systems#20, SAM_Tas#50/#51/#52, SAM#116, SAM_UI#100).
PR5B — selected-product cooling: ACCEPTED
changes vs B0 (SAM_Systems#24, SAM_Tas#59, SAM_UI#103).
(SHA-256
a7e09a25ae29c7dbb4c690d747a96fcd9f110ca27fb4dc2abe816755368d7e4b). 15/15 ledger stagesCOMPLETED. Candidate B is a genuine engineering TM59 FAIL (3 of 8 rooms), not a refusal — thebuilding is a weather-driven failing case by construction, and this is a valid acceptance result.
RecirculationCoolingClamp_Lpsre-exercised; the prior refusal is gone.
PartFRequiredAirFlow != DesignAirFlow != SelectedEquipmentCapacity != OperatingAirFlow.Reopen — B4 close/reopen Review acceptance: PASS 7/7
A fresh SAM process reopened the preserved real-project B4 pairing on the merged binaries:
IsRestored = true, no behaviour-mode picker);zero engineering violations on a deep
Record/Comparisondiff);COMPLETED;TAS-process baseline was empty;
VentilationUnitCatalogue:v1, expected SHA matched disk);No production code was changed to obtain this. Full detail:
SAM/documentation/PartO-TAS-VALIDATION.md§ B4 close/reopen Review acceptance.
Correctness fixes
now decided from the May–September basis TM59:2017 requires, not the full year. Verified not to affect the
(fully mechanical-route) real-project B4 result above.
the identical basis defect in the diagnostic log only, no Pass/Fail impact.
Dependencies
generically fixed in SAM_Tas#57 — creation order is now a
deterministic function of the graph alone, no Part O or manufacturer-specific code involved.
used full-year TSD sources and TPD hour windows, never a 1-day period.
Human programme decision
The proven Iteration 3 explicit Systems/TPD route, including the accepted selected-product cooling/B4
route, is complete. The remaining manufacturer ventilation behaviour — certified heat recovery, fan
SFP/power/heat, B1/B2, and manufacturer bypass/B3 — is deliberately moved to a separate tracker:
#123 — Part O — manufacturer ventilation behaviour: heat recovery, fan performance and bypass
because its acceptance is blocked on external manufacturer/EDSL evidence (PCDB product-variant equivalence
for the MRXBOX
-AECVvariant, certified airflow-indexed SFP, and an open EDSL/TAS technical question aboutdisplacement + active heat-recovery behaviour) — not on anything left to implement in this repository set.
PR5A infrastructure (identity plumbing, catalogue v1/v2, the COM-free resolver, per-AHU unit settings, the
fan-heat route policy, exchanger
ExchCalcTypeconversion/read-back, selected-product orchestration) ismerged and fail-closed for the real product pending that evidence. PR5A was not technically accepted for
manufacturer heat-recovery/fan behaviour — that behaviour's external-evidence-dependent acceptance is
transferred to #123. PR5B (selected-product cooling) is accepted, as recorded above.
Non-blocking evidence issue
The B4 reopen exposed one separate, non-blocking finding: a restored Review does not preserve the original
session's full run-time narration (52 notes reconstructed as 1; the standard archive file is overwritten
with the thinner version). All engineering data — calculations, pairing identity, ledger, TM59, comparison
statistics — are unaffected. Tracked at:
#122 — Part O Iteration 3 — restored Review must preserve original evidence narration
Closure
The explicit Systems/TPD Iteration 3 route tracked by #111 is accepted. The only remaining
manufacturer-ventilation work has deliberately been transferred to a separate tracker (#123). Therefore
#111's second closure condition is satisfied.
Closing this issue.
michaldengusiak commentedon Sep 16, 2026
Closed per the FINAL CLOSEOUT comment above: the explicit Systems/TPD Iteration 3 route (PR1-PR4 foundation, PR5A infrastructure, PR5B selected-product cooling/B4, real-project acceptance, and the B4 close/reopen Review 7/7) is accepted. Remaining manufacturer-ventilation behaviour is transferred to #123; the non-blocking restored-Review evidence finding is tracked at #122.