Repository navigation
S09: OpenStudio native-input read-back and ventilation alignment - #33
Merged
michaldengusiak merged 34 commits intoOct 23, 2026
Merged
Conversation
…file S07 D-F2 and the S09 owner ventilation policy: the supply-air parameters are a requirement; the selected Ventilation profile is the delivery. - V0/V1 (no selection): the DSOA keeps the requirement rates and gets an all-zero fraction schedule (SAM_Schedule_VentilationNotDelivered), so no outdoor air is delivered. It was unscheduled (fraction 1) before. - V2: the selected profile is the fraction schedule (unchanged). - A selection that does not resolve to a Ventilation profile (missing or of another type) is an invalid input: an error, and no delivery (never unscheduled). - The per-space OutsideSupplyAirFlow DSOA follows the same rule, and now states method Sum and every rate explicitly. Before, it had no schedule and relied on OpenStudio's Flow/Person defaults. - Ideal Loads states DCV None, NoEconomizer and no heat recovery, and links the space's effective DSOA explicitly (its own, else the inherited SpaceType one). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
os-input-readback has three steps, each run in its own process: - export: the production writer converts the frozen model and saves the OSM; the saved OSM is then forward-translated to IDF with the SDK. - read: a text-only reader turns the OSM and IDF into native.json. It uses neither the SDK nor the writer. - compare: S07 rows 1-10 against SAM intent, gated by the S08 core. Reuse, not copies: the S08 evaluation core is a project reference and the S08 SAM-intent builder ReadBackExpected.cs is linked, both from the sibling SAM_Tas checkout. The S08 signed-off fixtures are reused byte for byte, with their hashes checked. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Negative mode: eight disposable mutations, covering identity, schedule, missing reference, value and OSM-only changes. - Run-S09-ReadBack.ps1 checks the fixture and EPW hashes, then runs the acceptance and its negatives. Pack-S09-Evidence.ps1 copies the minimal, sanitized evidence into the repository. - 33 offline tests: the reader and schedule units, the writer ventilation policy (V1, V2, V2 back to V1, missing and wrong-type selection, override, Ideal Loads controls, V0), and the end-to-end fresh-process read-back with every negative. - CI: a sparse clone of SAM_Tas holding only the evaluation core and ReadBackExpected.cs, then the new tests run. - The V1 note uses SAM-OS-HVAC-001 (information), as the other Ideal Loads notes do, so it is not counted as an unsupported object. The D1 deferral test now counts only the deferral messages. - The mapping document describes the delivery rule. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…vidence - The report now names OS-MAT-SINGLE-SIDED once per fixture. The rows are listed as MAPPING-DIFFERENCE by S09, from the writer's SAM-OS-MAT-002, not by S07: accepting them is an owner decision. - The evidence packer keeps only report.txt for the negatives. - documentation/S09-OpenStudio-InputReadBack-evidence/: sanitized acceptance evidence (box, two, box-repeat; 8 negatives). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Independent review of d6d1cc5: a Zone Multiplier 1->2, a window Multiplier blank->2 and a Building North Axis blank->90 left the box report unchanged (316/316, BLOCKED owner, exit 12). - OsComparison.Multiplicity: Zone, ZoneGroup and FenestrationSurface:Detailed multipliers read with their EnergyPlus default 1 for a blank field; any effective multiplier other than 1 contradicts SAM (no multiplier) and FAILs; the OSM OS:ThermalZone / OS:SubSurface multipliers must agree with the IDF. - OsComparison.Orientation: GlobalGeometryRules, Building North Axis and Zone Direction of Relative North under the EnergyPlus 25.1 Relative/World rules, against SAM's NorthAngle (unstated = writer default 0); an unrotated model is the only supported configuration. A rotation SAM does not state FAILs; OS:Building must agree with the IDF. - Anything the reader cannot interpret (unreadable or non-integer multiplier, unknown coordinate system, World with a non-zero north axis, an OS:Space transformation, a non-zero SAM North Angle) goes to a new Unsupported list: BLOCKED technical, never PASS. Report schema s09-readback-report/2. - The reader keeps ZoneGroup, OS:SubSurface and the simple Window/Door/ GlazedDoor (and :Interzone) classes; the latter are refused as extras. - Six negatives (the reviewer's three IDF-only mutations and an OSM-consistent variant of each), wired into the acceptance script; 17 new tests. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…fe097f - Record: revision 2 (multiplicity and orientation against SAM intent, before and after on the same inputs), the OS-MAT-SINGLE-SIDED decision table for both fixtures (18/33 exposed-face rows vs 51/105 buried-layer metadata; still proposed and owner-unaccepted) and the construction-performance calculation assessment (no implementation). - Evidence: acc2 acceptance and 14 negatives repacked; revision-2/ab (reviewed head vs revision on the same native inputs); revision-2/optics-table evidence program and its output. Tested content: cfe097f. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ified OSM counterpart OsComparison.Multiplicity skipped the OSM/IDF multiplier check when the IDF Zone or FenestrationSurface:Detailed had no OS:ThermalZone / OS:SubSurface of its name, so a model with the OSM object removed kept BLOCKED owner, exit 12, with complete coverage. - OsmCounterpart: when every OSM object of the type has a readable Name and none matches, the counterpart is proven missing: Consistency (FAIL). A duplicate name or an unreadable Name leaves the identity unproven: Unsupported (BLOCKED technical). - OsmMultiplier reads the field at its known position under the file's own label. Blank is still the documented default 1; a missing or differently labelled field blocks instead of defaulting to 1. - The multiplicity Supporting line states how many IDF objects matched their OSM object. - Negatives neg-osm-missing-thermal-zone and neg-osm-missing-subsurfaces (CLI and acceptance script); 8 tests: both cases on both fixtures, the fixture counterpart counts, and three BLOCKED-technical cases (duplicated zone, unlabelled zone Name, relabelled subsurface Multiplier). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Record: the missing-OSM-counterpart finding (independent review of 6f7e6b7), the change, the before/after on both fixtures, the rules table, and the 16 negatives. - Assessment wording: the Tas-backed U/g/LT claim scoped to the four traced SAM_UI WPF workflows; the GetUValue short-array guard recorded as a code defect separate from the reported Ug display issue, whose cause is not established; World coordinates described as the code handles them (supported, refused only with a non-zero north axis or zone relative north); hosted-CI wording updated (dependency resolution, which suites run, the 6f7e6b7 runs). - Evidence: acc3 repacked (every existing report-*.txt unchanged; 2 new negatives) and the new revision-3/ A/B folder with its scripts. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…a failed CLI step Build 39603021836 at e0a6ea1 failed one negative (neg-people-density, box): compare wrote no report.json and the test loaded it before checking, so the compare exit code and stderr were lost. - Windows reuses the id of an exited process. A negative copy keeps the id of an export that exited long before, so a fresh reader can carry it, and a fresh comparison can carry the reader's. The freshness check compared ids only and refused such a read as infrastructure (exit 70, no report). - export.json (s09-export/2) and native.json (s09-native/2) now record the OS creation time of their process. The same process is the same id and creation time; a missing identity is still an infrastructure failure, and the reader must still start after the export finished. - TestSupport.ReadAndCompare asserts report.json exists before parsing it. A failed read or compare reports the exit code, labelled stdout/stderr, both process identities and times, and the run's files, and writes them to s09-diagnostics; CI uploads those text files when a step fails. - 4 tests: a reused id is judged (FAIL, exit 10); the same process, an unrecorded identity and a read before the export finished stay exit 70. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ailure at 0c23287 The failed final-head run at e0a6ea1 is preserved with its disposition: compare exited before writing a report and the test lost its output. The id-only freshness check refuses a fresh process whose Windows process id was reused; reproduced locally (reviewed head: exit 70, no report; revision 4: FAIL with the unchanged report). That this caused the CI run is likely but unproven. acc6 reports and IDFs are byte-identical to acc3. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…historical 388/2 from the reviewer's filtered 363/2 The writer-suite reproduction command had no category filter and would select the 25 Simulation-category cases. It now passes --filter 'TestCategory!=Simulation'. The historical 388 passed / 2 skipped results (Total 390) are labelled as an unfiltered scope; the retained revision-3 summary is machine-local and the revision-2 scope is unverified. No simulation authorisation is inferred. Reviewer-run results at 5903678 are recorded as reviewer-attributed. Record only; no source, test, workflow or fixture change. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…-SPLIT) SAM LightingRadiantProportion p is the total radiant share of the lighting gain (SAM#217, 113873a0). The writer now sets Fraction Radiant = p(1-s), Fraction Visible = p*s with s = 0.2415/0.576 at full precision, leaves Return Air Fraction unset (0) and never reads LightingViewCoefficient, a comfort coefficient. Authored p, including 0, is preserved; an absent or NaN p takes the common default p0 = 0.576. Both cases raise the new SAM-OS-IC-002 information at Summary, stating the values, s, the reference category and its limits, and for p0 the open owner decision OD-L1. An authored view coefficient is reported with SAM-OS-IC-001 information; the occupancy/equipment view-coefficient reasons no longer claim a missing visible-fraction field. The importer recovers p = Fraction Radiant + Fraction Visible without setting the view coefficient, warns when Return Air Fraction > 0 or the fractions sum above 1, and informs when the short-wave share differs from s. S09 read-back: rows for Return Air Fraction (exact), F_R + F_V, F_V, F_R and the convective remainder, expected from the raw SAM p and the S07 constants only; an absent/NaN p stays S-UNSPEC (DOCUMENTED-DEFAULT, never PASS). The view-coefficient comparison and its exception are removed. Five negative cases, authored-zero, comfort-coefficient-independence and unstated-p tests; writer and importer regressions; coverage manifests and mapping documents. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…plit at 20f8fb6 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…fore any tolerance Independent review of 31af602 reproduced two gaps in OsComparison.LightingSplit. 1. Native domain and energy conservation are now checked before the S07 comparison: Return Air, Radiant and Visible each in [0, 1] and their sum at most 1 (S07 §5.1: a sum above 1 is an input error). A violation is a named EXPORT-DEFECT on all five lighting rows, with no tolerance applied. The floating-point boundary 1e-12 (OsQuantities.LightingFractionBoundary) absorbs only IDF decimal-to-double rounding; no S07 tolerance changes. The reviewed head accepted p = 1 with sum 1.0008 and p = 0 with Fraction Radiant -0.0004 (exit 12); both now FAIL (exit 10). 2. The Lights "Return Air Fraction Calculated from Plenum Temperature" setting is read. Blank, absent or No (the EnergyPlus default) keep the static split. Yes cannot be a verified static T-LIGHT-SPLIT; Yes, an uninterpretable value or an unreadable field make every lighting row UNVERIFIED and name the space in Unsupported: BLOCKED technical (exit 11). CLI cases neg-lighting-sum-above-one, neg-lighting-radiant-to-visible, neg-lighting-plenum-yes/-unknown/-relabelled and the control ctl-lighting-plenum-no; 8 S09 tests (p = 1 and p = 0 controls). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…guards at 225881f Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ed fixtures (exit 14) The owner accepted OS-MAT-SINGLE-SIDED (optics option 1) on 2026-10-22 for the two reviewed fixtures only, with result effects unmeasured. OwnerDecisions supplies one 3a MAPPING-DIFFERENCE acceptance to the S08 core only under the approved rules and when the fixture id and the verified frozen-model SHA-256 are a reviewed fixture's; anything else stays BLOCKED owner, exit 12. Failures, blocks and the OD-L1 documented default are unchanged. 5 S09 tests; 93/93 locally. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…14a7a8 Records the owner decisions of 2026-10-22 (optics option 1 for the two reviewed fixtures only, result effects unmeasured; ventilation A; lighting B1 with OD-L1 open), revision 6's completed technical review, the exit-14 fixture reports, the 93/93 S09 run and the A/B. States that an accepted limitation is not a Phase B PASS. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ision 8) EnergyPlus opaque materials are single-sided and use only the outermost outside face and the innermost zone face. SAM's first layer now carries its internal-face optics (an _Internal variant where faces differ) in both construction directions; every other layer keeps the external face, so interzone constructions stay exact mirrors. - Single-layer outdoor or interzone constructions with differing faces: error SAM-OS-MAT-003, no construction, unsuccessful conversion; ground and adiabatic use the zone face; checked per use before cache reuse. - The forward construction follows the panel's first space; a missing first side is a named error, never a swap. - Every opaque object stamps its source Guid, face and authored face optics; the importer restores both faces from them and warns on inconsistent identity or values, never inventing or merging by name. - S09 derives the used faces from SAM and orientation alone; a used face is never listed; unused faces are listed only when native is the other face. - Revision 7's optics acceptance (OwnerDecisions) is removed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…correction at fc83a6d Records the owner's revision-8 conditions, the verified trace, the face rule, the single-layer error, orientation and import identity, removal of revision 7's acceptance (history kept), fixture results (BLOCKED owner, exit 12, only unused-face rows), S09 95/95, writer/importer 400/2 skipped and benchmark 51/51 (Simulation excluded), both A/Bs and the remaining limits. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…port inherited faces (revision 9) Independent review of 901e592: - Every opaque object records what was written (SAM.Written.*), so an import tells an unchanged default from an edit. An edit is kept on the face the object carries and reported (SAM-OSI-MAT-001); an unchanged default stays unstated. The reported re-export case now keeps 0.42 instead of 0.7. - SAM-written face and thickness objects of one explicit source Guid merge into one SAM material with its Guid restored and each construction layer's thickness kept; thermal, authored or per-face conflicts are reported (SAM-OSI-ID-001) and not merged; never merged by name. - An unstated (absent or NaN) internal value on a zone face that takes the external value is reported at Summary (new SAM-OS-MAT-004); its provenance stays unspecified on import and in S09 (NaN now reads as unstated). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…354e532 Records native-edit preservation, merging by source identity, SAM-OS-MAT-004, the regressions, controls and A/B, S09 97/97, writer/importer 409/2 skipped, benchmark 51/51 (Simulation excluded), and the pre-existing import layer-order defect found. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…red equal-face edits on the faces served (revision 10) Review of 354e532 (two P1 importer defects): - An opaque object carrying a group's SAM.MaterialGuid is validated on its own before any merged material is returned for it, and must be a recorded member of that group. A malformed or identity-inconsistent object is imported as its own material with its own thermal properties and a named diagnostic; it is never aliased to a valid group. Order-independent. - A native edit is kept on every SAM face the object supplies. Internal variants supply the zone face; external objects of divergent materials the external face; external objects of equal-face materials take their faces from the constructions that use them (forward SAM construction last = zone face, first = outer face; unstamped mirrors skipped; other exposed uses supply both). A single-layer equal-face edit therefore stays equal and re-exports valid. The writer and the single-layer differing-face refusal are unchanged. Regressions for both reproductions with import-order, malformed/conflicting identity, single-layer, interzone, multilayer, divergent and unchanged controls. The pre-existing multilayer layer-order defect is unchanged and still recorded. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…the writer's first space on import (revision 11) Owner-approved opaque-only correction of the pre-existing multi-layer import order (review of 806d544): - An opaque layered OS:Construction used by planar surfaces is read innermost layer first, so SAM's first layer faces the surface's zone. Fenestration (glazing, gas, SAM door panes), subsurface-only (unstamped door panes), shading-only, unused, air-boundary and non-layered constructions keep OpenStudio's order. A construction shared by surfaces and a subsurface or shade is split (surfaces innermost first with the SAM Guid; other uses in OpenStudio order with a new Guid), reported as SAM-OSI-APX-001. - An interzone panel is built from the side carrying the SAM-written forward construction, also for a geometric-fallback pair, and the spaces are added in a stable topological order that puts that side first: the writer reads a panel's first space from the cluster's space order. An unstamped panel whose building side is then second is re-read from its partner (APX-001). 19 round-trip tests compare every surface's layers, thicknesses, thermal properties and used-face absorptances (export, import, export): the reviewer's multi-layer reproduction with the edited 0.42 zone face, interzone in both space orders, geometric fallback, unstamped native and mixed models, and glazing, door-pane, shading, air-boundary, non-layered and single-layer controls. Mapping and to-SAM coverage docs record the compatibility impact; previously imported models are not migrated. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… deterministic (revision 11) The re-read of an unstamped interzone panel whose building side is second in the space order keeps its layers, but a face-stamped layer material whose authored faces differ takes the new first space's face role; the SAM-OSI-APX-001 diagnostic is now a warning that says so (mapping doc updated). The mixed-model test places the stamped half's forward construction on the space OpenStudio visits second, so the re-read is reached on every run (both authored space orders), with equal-face materials. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ep its used faces (revision 11) Owner instruction: replace the warning-only re-read of an interzone panel. - Every imported opaque surface panel is checked against managed snapshots of its native surfaces: the first space's surface must hold the SAM layers innermost first and a second side their mirror, and the absorptances the writer would put on each face EnergyPlus uses (both zone faces of an interzone panel; the zone and outdoor faces of an outdoor surface) must equal the native ones. A mismatch is the new error SAM-OSI-CON-002, naming the panel, construction, face and values, and the import returns no model. - A panel whose building side ends up second is re-read from its partner, including a SAM-written panel lost to contradictory forward sides; the check decides. The re-read and contradiction diagnostics say so. - Tests: deterministic mixed models with differing faces (named error, unsuccessful), an equivalent re-read with differing faces and equal-face cases (success, every surface reproduced), contradictory forward sides (error with differing faces, success with equal faces), and an edited single-sided wall (error; equal-face control succeeds). CON-002 is pinned in the released-code table, the to-SAM coverage manifest (145 entries) and the audit doc. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…r and the fail-closed face check at f5f207b Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s on both interzone sides (revision 11) Review of 89a2216: VerifySurfaceFaces compared merged SAM material names only, so a different-thickness object of the same source material on one side of an interzone wall (12.5 mm on one side, a 20 mm copy on the other) imported successfully and re-exported 12.5 mm on both sides. The native snapshot now records each StandardOpaqueMaterial layer's thickness, conductivity, density and specific heat; both sides are compared in their own direction with the SAM panel's layer thicknesses and materials. A mismatch is SAM-OSI-CON-002 and no model. Massless and air-gap layers keep their documented nominal-thickness import (matched by material only). Tests: the reviewer's reproduction on either side and a repeated material with swapped thicknesses fail named; a repeated material at two thicknesses, one material at different thicknesses in unrelated constructions (box and interzone), an interzone cavity wall and a massless interzone layer import as before. The mapping doc's fail-closed text replaces the superseded warning-only wording. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ea2e6c; revision 10 passed review Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
michaldengusiak
marked this pull request as ready for review
October 23, 2026 09:09
… OUT-OF-ENGINE-SCOPE (revision 12) Row-3a absorptance and emissivity on faces EnergyPlus 25.1 does not use are reported as OUT-OF-ENGINE-SCOPE (informational, not gated), only when the side's face role is established independently of the writer (raw SAM spaces, type and flags; the native boundary; the interzone partner and its mirrored construction) and both values are valid and comparable. Used faces, thermal layer properties and invalid, unreadable or undeterminable rows stay gated; an undeterminable role is named as unsupported. The S09-only OS-MAT-SINGLE-SIDED listing is removed. Report schema s09-readback-report/3 keeps both values, the difference, side, layer, reason, amendment and counts, apart from the gated non-PASS items. Both fixtures: PASS (scoped native-input conformance), coverage 319/319 and 592/592. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
8edf793; revision 11 per-layer fix accepted Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…SS, 21/21 negatives FAIL [acceptance-2026-10-23] Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
S09 of the SAM simulation roadmap: an independent OpenStudio/EnergyPlus native-input read-back, plus the owner-approved ventilation alignment and, from revision 5, the S07 §5.1 lighting split. Contract: SAM
documentation/SIMULATION_INPUT_MAPPING_S07.md. Record:documentation/S09-OpenStudio-InputReadBack-PR.md.Do not merge without the owner's decision. Revision 12 implements the approved S07 §5.2 amendment U1 (SAM#218 merge
b06dbe8c, closeout0168d03f) and passed independent code review. Its acceptance run at headd26665bis packed (see "Acceptance" below): both fixtures PASS with exit 0, all 21 negatives FAIL. Revisions 10 and 11 passed independent review earlier, including the per-layer fix4ea2e6c. PASS here is scoped native-input conformance of the OpenStudio export to S07: not simulation equivalence, not a Phase B PASS (which needs S08–S11) and not an owner acceptance of anything else. Ventilation A and lighting B1 stay recorded; OD-L1 stays open. The PR's draft state was set by the owner account and is not changed by this work.Acceptance at head
d26665b(2026-10-23, owner-authorised)Run after revision 12 passed independent code review. Local only; hosted CI does not run it. Raw root
C:\TasOut\s09\acc7-u1(machine-local). Sanitized pack:documentation/S09-OpenStudio-InputReadBack-evidence/acceptance-2026-10-23/. The earlier packs are kept as history. Binaries were built Release x64 fromd26665b(code8edf793): harness8a77b235…, libraryd2368ce8…, writer67a2ded7…. Fixture and Budapest EPW hashes were checked by the script. Export and translation used the OpenStudio SDK 3.10.0 only; no engine, simulation or sizing was run.report.txtSHA-256868a5808d4cc1a96513e54b8189e647c8f45f4375b058a940ac1dee719b959fe9e3a3f0ed0e2fd6d8703154a0cb71a69ffa10344d1e4e253c29886840a6c466dreport.txtare byte-identical, and bothreport.txtfiles match the revision-12 test session. The OSM differs only by OpenStudio's random handles, as in every earlier pack.$PSScriptRootis empty in the parameter defaults, so-Exeand-Targetwere passed explicitly.Pack-S09-Evidence.ps1reads reports as ANSI, which turned "§" into "§". That first pack was discarded and repacked withGet-Contentdefaulted to UTF-8; all 24 packedreport-approved.txtfiles are byte-identical to the raw run.Revision 12: S07 §5.2 opaque optical face scope (amendment U1)
Tested content
8edf793a63b274cafe5e55b9e85fa597d6307a10. Changes only the S09 comparator and report (Compare/OsComparison.cs,Report/OsReport.cs), the S09 tests and one note in the material-mapping doc. Unchanged: the writer, importer, CLI, the shared core (SAM_Tasc50e9169), the linkedReadBackExpected.cs, fixtures, tolerances and workflow.OUT-OF-ENGINE-SCOPE (informational, not gated) applies to a row-3a absorptance or emissivity row only when all of these hold:
Material;A mismatching row qualifies whether or not the native value equals the other face. The row is never MATCH, NOT-APPLICABLE or an accepted limitation.
Face role (
OpaqueRole): derived from raw SAM, the side and the native surface, never from the writer's selector. All of these must hold:Any other failure is named as
Unsupported"optics role: …" (BLOCKED technical at least), and none of the side's rows is excluded.Stays gated: every used face, every thickness, λ, ρ and c row, and any row with a missing, NaN, blank, unreadable or out-of-domain value. An out-of-domain value is INPUT-INVALID (SAM) or EXPORT-DEFECT (native). Each such row says why it was not excluded. The S09-only OS-MAT-SINGLE-SIDED listing (MAPPING-DIFFERENCE, revisions 2–11) is removed.
Gate and report. The informational result stays in
Results, so coverage is unchanged. It carries the shared core's informational flag, so the shared gate ignores it, and everything else gates as before. The report uses schemas09-readback-report/3:CountByOutcomecounts each result once and lists these rows asOutOfEngineScope;NonPassand the newGatedNonPasshold blockers only;OutOfEngineScopeholds the counts (total, differing, equal, by scope, by property) and every row: SAM value, native value, |d|, side, layer, property, SAM material, native object, reason and amendment;report.txtadds both counts to its first line and a separate OUT-OF-ENGINE-SCOPE block.s08-fix-boxs08-fix-twoThe rest of each outcome distribution is unchanged.
report.txtSHA-256 (byte-identical in two sessions): box868a5808…b959fe, two-zone9e3a3f0e…c466d. Example row:layer1.internalEmissivity: SAM 0.87, native 0.95, |d| 0.07999999999999996 (OutsideTolerance); buried layer face (layer 1 of 3, SAM internal face); SAM 'FIX_Concrete'.Tests: 23 new S09 cases (
OpaqueFaceScopeTests.cs), each through the CLI:Only the pre-U1 expectations of existing tests changed (fixture PASS, three variants now PASS). Every negative and every revision 10/11 regression is retained.
A/B (
revision-12/ab-pre-u1.txt), theadcad2flibrary on the same runs:For review:
Evidence:
documentation/S09-OpenStudio-InputReadBack-evidence/revision-12/.Revision 11: opaque multi-layer import order (owner-approved), fail closed
Tested content
4ea2e6c2ac5805426ed1b39bdd5d88b39b1c723f(commits37841ea,5241bdd,f5f207b,4ea2e6c;f5f207bwas the reviewed code). Importer only, plus the new import error code SAM-OSI-CON-002. The writer, S09, revision 10, lighting, ventilation and the single-layer safeguards are unchanged.4ea2e6c; the review of89a2216, P1).M4/OpaqueLayerOrderImportTests.cs). Each compares every surface's layer thicknesses and thermal properties, plus the absorptances of every used face, before export and after re-export, or requires the named error. They cover:documentation/S09-OpenStudio-InputReadBack-evidence/revision-11/.Revision 10: review of revision 9 (group membership, shared equal-face edits)
Tested content
78f1014(full SHA in the record). Importer only (ToSAM/MaterialLibrary.cs,OpenStudioImportContext.cs); the writer, SAM-OS-MAT-003, S09 and glazing are unchanged.SAM.MaterialGuidis validated on its own before any merged material is returned for it, and only a validated member of the group resolves to it.BROKENnow imports with conductivity 9 (was 0.25, silent), and the valid Plasterboard pair still merges.MaterialLibrary.csandOpenStudioImportContext.csrestored, exactly the 16 regressions fail and the 7 controls pass.documentation/S09-OpenStudio-InputReadBack-evidence/revision-10/.Revision 9: review of revision 8 (native edits, merging, inherited faces)
Tested content
354e5322fa3a4c31a984de911c48534e768c40e4.SAM.Written.*), including inherited values and OpenStudio defaults.SAM.MaterialGuidbecome one SAM material, with the source Guid restored and each construction layer's thickness kept.Material.cs,MaterialLibrary.cs,OpenStudioImportContext.csandOsComparison.csrestored, the 9 new face-optics regressions and both S09 provenance cases fail; the controls pass.documentation/S09-OpenStudio-InputReadBack-evidence/revision-9/.Revision 8: opaque face-optics correction
Tested content
fc83a6df1f843f82a043353616a2b4e42a94e6d6. Owner-approved in this PR with conditions (2026-10-22).GetSpaces()order). The writer wrote every opaque layer's External optics. One material object served every position. Forward and reverse constructions share objects in mirror order. EnergyPlus uses only the outermost outside face and the innermost zone face._Internalvariant where the material's faces differ, thermally identical to the external-face object.SAM.MaterialGuid,SAM.MaterialFaceand each authoredSAM.Optic.*value.OwnerDecisionsis removed, andRun/compareare as at revision 6.7fccdccwriter restored: 8 fail (fixtures exit 10).8fd0ffccomparator restored: 8 fail (the swapped face is hidden at exit 12).documentation/S09-OpenStudio-InputReadBack-evidence/revision-8/.Revision 7: owner decisions and acceptance reporting (acceptance superseded by revision 8)
Tested content
614a7a8d70b6a70c5628a0ef3b57eaec0c5ec794.SAM-OS-IC-002. OD-L1 stays open; no fixture uses the fallback; the Tas side needs a separate SAM_Tas approval.Ventilation A and lighting B1 confirm what revisions 1–6 already implement; they change no code or verdict.
Compare/OwnerDecisions.cs,OsComparison.Run,Cli/ReadBackRead.cs):3aMAPPING-DIFFERENCE, with the decision reference. It applies only under the approved rules, and only when both the fixture id and the frozen-model SHA-256 (already verified bycompare) are a reviewed fixture's.report.txtdiffers only in the status line and the accepted rows' reasons.8fd0ffc2'sReadBackRead.csrestored (no acceptance), the 2 acceptance tests fail and the 5 controls pass.documentation/S09-OpenStudio-InputReadBack-evidence/revision-7/.Revision 6: fail-closed guards in the lighting read-back (independent review of
31af6022; passed independent technical review)Tested content
225881f00971c7cab3596e94867924a11866e147. OnlyOsComparison.LightingSplitand its regressions change. The writer and importer split, fixtures, tolerances and shared core are unchanged.OsQuantities.LightingFractionBoundary) absorbs only the decimal-to-double rounding of the IDF text. It is not an S07 tolerance and loosens none. Valid p = 1 and p = 0 splits pass.Lightsindex 12).No(the EnergyPlus default) is the static split.Yescannot be a verified static T-LIGHT-SPLIT.Yes, an uninterpretable value or a relabelled field makes all five lighting rows UNVERIFIED, with a namedUnsupportedentry: BLOCKED technical, exit 11.negativecases plus 8 S09 tests):neg-lighting-sum-above-one(on a p = 1 export) andneg-lighting-radiant-to-visible(on a p = 0 export) → exit 10.neg-lighting-plenum-yes,-unknownand-relabelled→ exit 11.ctl-lighting-plenum-no(unchanged counts).OsComparison.csrestored, the 5 regressions fail (exit 12) and the 3 controls pass.documentation/S09-OpenStudio-InputReadBack-evidence/revision-6/.Revision 5: S07 §5.1 lighting split (amendment L1, SAM#217
113873a0)Checked first: SAM post-merge Test run 39667707673 and Build (Windows) run 39667707679 succeeded on
113873a0.InternalCondition.cs, newLightingSplit.cs):LightingRadiantProportion, the total radiant share. Fraction Radiant = p·(1 − s), Fraction Visible = p·s, with s = 0.2415 / 0.576 at full precision. Return Air Fraction is not set (0); convective is 1 − p.LightingViewCoefficientis never read. When authored it is reported asSAM-OS-IC-001information: a comfort coefficient, not an energy fraction.SAM-OS-IC-002information at Summary, once per SpaceType. It states the values, s, the reference category and its limits; for p₀ it also says it is not a regulatory, NCM, TM59 or dwelling value and names OD-L1.20f8fb65; the acceptance scripts were not run, so the committed pack stays pre-L1acc3):The IDFs differ from the revision-4 acceptance only in the Lights Fraction Radiant / Visible lines, which equal the §5.1 vectors (
revision-5/idf-diff-acc6.txt).Earlier revisions
Record correction after the review of
59036783(documentation only)tests/SAM.Analytical.OpenStudio.Testshad no category filter, so it would select the suite's 25[Category("Simulation")]cases (390 total, 365 without them). It now reads:dotnet test tests/SAM.Analytical.OpenStudio.Tests/SAM.Analytical.OpenStudio.Tests.csproj -c Release -p:Platform=x64 --filter 'TestCategory!=Simulation'The benchmark line already filtered; no other S09 reproduction command runs the writer suite.
C:\TasOut\s09\rev3-ab\other-tests.txt, not committed) shows Total 390, i.e. no category filter, so the Simulation cases were in scope; it does not show whether EnergyPlus was invoked. Revision 2 kept no log; its scope is otherwise unverified. No simulation authorisation is recorded for these runs, and none is inferred. Revision 1's 363/2 matches the filtered count, so the earlier "superseded" note is withdrawn.59036783(not run by this session): S09 62/62; benchmark excluding Simulation 51/51; filtered writer suite 363 passed, 2 skipped.documentation/S09-OpenStudio-InputReadBack-PR.md). No source, test, workflow, fixture, weather, tolerance or writer change; no local test rerun.Revision 4 (after the failed final-head Build 39603021836 at
e0a6ea19)Build (Windows) run 39603021836 failed 1 of 58 S09 tests:
EveryTargetedMutation_Fails("neg-people-density","s08-fix-box")hit aDirectoryNotFoundExceptionloadingcompare-approved/report.json. Benchmark 51/51 and SPDX passed. Dependencies weresow/2026-Q4, SAM_Tasc50e9169. The failed run is kept, with its disposition, in the record and indocumentation/S09-OpenStudio-InputReadBack-evidence/revision-4/.comparereturned before writing any report (exit 64 or 70 only). The test loadedreport.jsonbefore checking the exit code, so the exit code and stderr were lost, and no artifact was kept. Which branch ran in CI is not known.the reader did not run in a fresh process after the export, nocompare-approved(3/3). This is the CI signature.compareis not excluded by CI evidence. A recurrence now uploads its diagnostics.0c232875):export.jsons09-export/2andnative.jsons09-native/2record it.report.txtis unchanged;report.jsonInputs gain the three creation times.TestSupport.ReadAndComparechecks thatreport.jsonexists before parsing it. A failedread/comparereports its exit code, labelled stdout/stderr, both process identities and times, and the run's files, and writess09-diagnostics/*.txt. The Build workflow uploads those only on failure (SAM_OpenStudio-s09-diagnostics, 30 days).ReadBackCompare.cs:159has the same id-only check. It was not assessed; a change there would be a separate SAM_Tas task.Revision 3 (after the independent review of
6f7e6b7d)The review found that
OsComparison.Multiplicityskipped the OSM/IDF multiplier check when the IDFZoneorFenestrationSurface:Detailedhad noOS:ThermalZone/OS:SubSurfaceof its name. With the object removed frommodel.osm(and the manifest's OSM hash updated), a fresh read and compare kept exit 12, 316/316, unchanged outcome counts, and no Consistency or Unsupported entry.OsComparison.OsmCounterpart). Consistency is claimed only against exactly one OSM object of the IDF object's name, read under the file's own labels.Unsupported→ BLOCKED technical (exit 11).OsmMultiplier): read at its known position under its label. Blank is still the documented default 1. A missing or differently labelled field now blocks instead of defaulting to 1.6f7e6b7dc1e53328OS:ThermalZoneremoved (box; two-zone)OS:SubSurfaceremoved (box; two-zone)neg-osm-missing-subsurfaces(box),neg-osm-missing-thermal-zone(two-zone, zone A)In each FAIL, coverage and outcome counts equal the unchanged fixture's. The only Consistency entries are
multiplicity: IDF … '…' has no OS:… in the OSM …, and there are no Unsupported entries. Evidence:documentation/S09-OpenStudio-InputReadBack-evidence/revision-3/.Assessment wording corrected (record only):
values.Length >= 6/values[6]guard is recorded as a code defect, separate from the reported Ug display issue. That issue's cause is not established.Revision 2 (after the independent review of
d6d1cc5b)The review showed three native mutations of the box run left the report unchanged (316/316, BLOCKED owner, exit 12): Zone Multiplier 1→2, window Multiplier blank→2, Building North Axis blank→90.
OsComparison.Multiplicity).OsComparison.Orientation).Unsupportedlist: BLOCKED technical (exit 11), never PASS. Report schema/2.d6d1cc5bneg-zone-multiplier,neg-window-multiplier,neg-north-axis-both)Ventilation (writer fix, unchanged since revision 1)
SAM-OS-SCH-001and no delivery. It is never unscheduled.Fixture verdicts before L1 (revisions 1–4, acceptance
acc3/acc6; superseded by revision 5 above)OS-MAT-SINGLE-SIDED decision table (option 1 accepted 2026-10-22, the two reviewed fixtures only)
EnergyPlus 25.1 uses only the outermost and innermost layers' absorptances (
.eioOpaque Construction Report).Construction-performance assessment (record only)
SAM.Analytical.Glazinghas no U output and is used only by Grasshopper.GetUValueshort-array guard (Length >= 6, thenvalues[6]);.eio-reading harness. It is unverified whether EnergyPlus writes the.eioreport without a simulation, so that needs a separately authorised run.Owner decisions (2026-10-22)
The lighting visible-fraction default of revisions 1–4 needs no decision: L1 withdrew it.
Also recorded:
OS:Building: it makes compare exit 70 (fails closed, but not as a named BLOCKED technical entry). Not changed here.Tests (local, Release x64)
8edf793(record:revision-12/test-summaries.txt): S09 120/120; writer/importer--filter 'TestCategory!=Simulation'471 passed, 2 skipped (real-SQL fixtures; local only, hosted CI does not run it); benchmark 51/51. Built Release x64, thendotnet test --no-build. No engine, simulation, acceptance or packing script.4ea2e6c2ac5805426ed1b39bdd5d88b39b1c723f(harnessos-input-readback.dll4f746d9a…):--filter 'TestCategory!=Simulation': 471 passed, 2 skipped (462 + 9 per-layer consistency cases).--filter TestCategory!=Simulation: 51/51.f5f207b's names-only check restored, the 3 regressions fail (each imported with a changed thickness) and the 6 controls pass.f5f207b456a3e7e2429ead4054c779031615e2b7(harnessos-input-readback.dll6b4c510d…):--filter 'TestCategory!=Simulation': 462 passed, 2 skipped (432 + 30 new).--filter TestCategory!=Simulation: 51/51.5241bdd, one writer case failed.EveryDeclaredDiagnosticCode_Existsbroke because I edited the coverage manifest, which the test reads live, during that run. It passes atf5f207b.78f10146481dbd4fe46af8761813fa4f9d58d357(harnessos-input-readback.dll3589bc9c…):--filter 'TestCategory!=Simulation': 432 passed, 2 skipped (409 + 23 new).--filter TestCategory!=Simulation: 51/51.ROUNDTRIPlines are unchanged, because the layer-order defect is still open.354e5322fa3a4c31a984de911c48534e768c40e4(harnessos-input-readback.dll4edf422b…):--filter 'TestCategory!=Simulation': 409 passed, 2 skipped.--filter TestCategory!=Simulation: 51/51.fc83a6df1f843f82a043353616a2b4e42a94e6d6(harnessos-input-readback.dll44cb7177…):--filter 'TestCategory!=Simulation': 400 passed, 2 skipped. That is 21 new face-optics tests plus 3 test files adjusted.--filter TestCategory!=Simulation: 51/51.614a7a8d70b6a70c5628a0ef3b57eaec0c5ec794(harnessos-input-readback.dlle41b13ee…):225881f00971c7cab3596e94867924a11866e147(harnessos-input-readback.dlla05202d0…):OsComparison.cs(31af6022) restored, exactly the 5 regressions fail.--filter 'TestCategory!=Simulation'): 379 passed, 2 skipped. Revision 6 changes no writer or writer test.20f8fb65): S09 80/80; writer 379 passed / 2 skipped; benchmark 51/51; A/B as in the record.0c232875): S09 62/62; acceptanceacc6; benchmark 51/51.Final head and hosted checks
Head
39a6c90c24b31e82d26f44ed9fefaf0037d41726: the acceptance pack and record commit (documentation only) on top ofd26665b; the tested code content is still8edf793a63b274cafe5e55b9e85fa597d6307a10.3055755of39a6c90into base7f216657, unchanged). SAM, SAM_SQLite and SAM_Validation resolved tosow/2026-Q4, and SAM_Tas toc50e91698e931f98633ac2cb169417e4568da61d(sow/2026-Q4); no task branch shadows a dependency. Benchmark 51/51, S09 120/120, no failed test. Hosted CI does not run the writer/importer suite (471 passed / 2 skipped, local) or the acceptance scripts (local, above).Previous head
d26665bd2e397d011cd1dda382c3e93004e1c231(revision 12 record; the acceptance run's head):0482be0ofd26665binto base7f216657, unchanged). SAM, SAM_SQLite and SAM_Validation resolved tosow/2026-Q4, and SAM_Tas toc50e91698e931f98633ac2cb169417e4568da61d(sow/2026-Q4); no task branch shadows a dependency. Benchmark 51/51, S09 120/120, no failed test. Hosted CI does not run the writer/importer suite; its 471 passed / 2 skipped is local only.Previous head
adcad2f4383ab3763839e4a7e0a87c84d1468e4c(revision 11 final): the record and evidence commit after the tested content4ea2e6c2.sow/2026-Q4, and SAM_Tas toc50e91698e931f98633ac2cb169417e4568da61d(sow/2026-Q4). Benchmark 51/51, S09 97/97, no failed test. Hosted CI does not run the writer/importer suite; its 471 passed / 2 skipped is local only.Previous head
89a2216da8acbde8abfd25430d0b0cf15f9f9730(revision 11 as reviewed): the record and evidence commit after the tested contentf5f207b4.sow/2026-Q4, and SAM_Tas toc50e91698e931f98633ac2cb169417e4568da61d(sow/2026-Q4). Benchmark 51/51, S09 97/97, no failed test. Hosted CI does not run the writer/importer suite; its 462 passed / 2 skipped is local only.37841ea,5241bdd,f5f207b) were never pushed alone; this push carries all four commits.Previous head
93ec3151(revision 10): the revision-10 record and evidence commits (e04ff905, then a whitespace-only fix) after the tested content78f10146.sow/2026-Q4, and SAM_Tas toc50e91698e931f98633ac2cb169417e4568da61d(sow/2026-Q4). Benchmark 51/51, S09 97/97, no failed test. Hosted CI does not run the writer/importer suite.e04ff905also ran Build 39766679143 and SPDX 39766679140 (success). It is superseded.Previous head
806d5449(revision 9):Previous head
901e592a(revision 8):Previous head
7fccdccb(revision 7):Previous head
8fd0ffc2(revision 6, passed independent technical review), tree17d328c9:07ec875of8fd0ffcinto base7f216657(sow/2026-Q4, unchanged).sow/2026-Q4; SAM_Tas toc50e91698e931f98633ac2cb169417e4568da61d(sow/2026-Q4).Earlier head
31af6022(revision 5): Build 39672548198 (S09 80/80, benchmark 51/51) and SPDX 39672548197 succeeded. Earlier heads are in the record.🤖 Generated with Claude Code