Skip to content

Commit 7ec508c

Browse files
authored
Merge pull request #47 from NatLabRockies/develop
Release v0.9.0
2 parents 24bb06d + 8ae7c7a commit 7ec508c

180 files changed

Lines changed: 42446 additions & 2195 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.claude/skills/add-hvac/SKILL.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,14 @@ Guide the user through selecting and applying an HVAC system to their model.
5151

5252
6. Report what was created: system name, zones served, equipment types, plant loops.
5353

54+
## Custom HVAC Wiring
55+
56+
For custom HVAC configurations beyond the baseline templates:
57+
```
58+
search_wiring_patterns("DOAS") # get working Ruby wiring code
59+
search_api("CoilCoolingFourPipeBeam") # verify SDK method names
60+
```
61+
5462
## Notes
5563

5664
- Get all zone names from `list_thermal_zones()` — names must match exactly

.claude/skills/energy-report/SKILL.md

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,28 @@ Extract all result categories from a completed simulation and present a structur
1212

1313
1. Identify the run. If user provides a run_id, use it. Otherwise check for the most recent simulation.
1414

15-
2. Extract all result categories:
15+
2. For an HTML report with ~25 sections (fastest):
16+
```
17+
generate_results_report(run_id=<id>)
18+
```
19+
20+
3. Or extract individual categories for custom analysis:
1621
```
1722
extract_summary_metrics(run_id=<id>)
1823
extract_end_use_breakdown(run_id=<id>)
1924
extract_envelope_summary(run_id=<id>)
2025
extract_hvac_sizing(run_id=<id>)
2126
extract_zone_summary(run_id=<id>)
2227
extract_component_sizing(run_id=<id>)
28+
extract_simulation_errors(run_id=<id>)
29+
```
30+
31+
4. For before/after comparison:
32+
```
33+
compare_runs(baseline_run_id=<id1>, retrofit_run_id=<id2>)
2334
```
2435

25-
3. Optionally run QA/QC:
36+
5. Optionally run QA/QC:
2637
```
2738
run_qaqc_checks()
2839
```

.claude/skills/new-building/SKILL.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,13 +68,13 @@ Step 3 — Typical building (same as Workflow B step 4)
6868

6969
For fully custom buildings not matching DOE prototypes:
7070

71-
1. `create_example_osm(name="<name>")` or `create_baseline_osm(name="<name>")`
72-
2. Create geometry with `create_space_from_floor_print` + `match_surfaces`
71+
1. `load_osm_model` an empty model, or start with `create_bar_building` for basic geometry
72+
2. Create/refine geometry with `create_space_from_floor_print` + `match_surfaces`
7373
3. Add glazing with `set_window_to_wall_ratio`
7474
4. Create materials/constructions/loads manually
7575
5. Add HVAC with `add_baseline_system`
76-
6. Set weather + design days
77-
7. Simulate
76+
6. Set weather with `change_building_location`
77+
7. Check with `validate_model`, then simulate
7878

7979
## Simulation
8080

.claude/skills/openstudio-patterns/SKILL.md

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ Weather (EPW + design days, needed before simulation)
3232

3333
## Typical Model Build Order
3434

35-
1. **Create or load model**`create_example_osm` / `create_baseline_osm` / `load_osm_model`
35+
1. **Create or load model**`create_new_building` (recommended) / `load_osm_model` / `create_bar_building`
3636
2. **Geometry**`create_space_from_floor_print` (preferred) or `create_space` + `create_surface`
3737
3. **Match surfaces**`match_surfaces` after all spaces created (finds shared walls)
3838
4. **Thermal zones**`create_thermal_zone` with `space_names`
@@ -84,11 +84,29 @@ Weather (EPW + design days, needed before simulation)
8484

8585
| Goal | Tool | Notes |
8686
|------|------|-------|
87-
| Quick test model (1 zone) | `create_example_osm` | Minimal geometry, no HVAC |
88-
| Baseline with HVAC (10 zones) | `create_baseline_osm` | Includes ASHRAE system, geometry, schedules |
89-
| Custom geometry | `create_space_from_floor_print` | Preferred — auto-creates walls, floor, ceiling from polygon |
90-
| Explicit surfaces | `create_surface` | Use only when floor print extrusion won't work |
91-
| Typical building (standards-based) | `create_typical_building` | ComStock measure, adds constructions + loads + HVAC + schedules |
87+
| Production building model | `create_new_building` | End-to-end: geometry + weather + HVAC + loads. Recommended starting point. |
88+
| Custom geometry only | `create_bar_building` | Bar geometry from building type/area. Follow with `create_typical_building` for loads+HVAC. |
89+
| Custom floor plan | `create_space_from_floor_print` | Extrude polygon into 3D space. Use for non-rectangular geometry. |
90+
| Standards template on existing geometry | `create_typical_building` | Adds constructions + loads + HVAC + schedules to model with geometry. |
91+
| Import from FloorSpaceJS | `import_floorspacejs` | Load custom geometry JSON, then `create_typical_building` for loads+HVAC. |
92+
| Quick test (1 zone, no HVAC) | `create_example_osm` | Testing/demos only. |
93+
| Baseline test (10 zones) | `create_baseline_osm` | Testing/demos only. |
94+
95+
## Pre-Simulation Checklist
96+
97+
Before `run_simulation`, call `validate_model` to verify:
98+
- Weather file set (EPW)
99+
- Design days present (from DDY)
100+
- HVAC assigned to zones
101+
- Constructions on surfaces
102+
103+
## HVAC Measure Authoring
104+
105+
Before writing measures that create HVAC objects:
106+
```
107+
search_api("CoilCoolingFourPipeBeam") # verify real method names
108+
search_wiring_patterns("four pipe beam") # get working connection code
109+
```
92110

93111
## Common Error Patterns
94112

.claude/skills/qaqc/SKILL.md

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,19 @@ Inspect the current model for common issues before running a simulation.
99

1010
## Steps
1111

12-
1. Get model overview:
12+
1. Quick automated check:
13+
```
14+
validate_model()
15+
```
16+
Checks weather, design days, HVAC, constructions in one call.
17+
18+
2. Get model overview:
1319
```
14-
inspect_osm_summary()
1520
get_model_summary()
21+
get_building_info()
1622
```
1723

18-
2. Check for missing critical elements:
24+
3. Check for missing critical elements:
1925
- **Zones without HVAC:** `list_thermal_zones()` — look for zones with no equipment
2026
- **Spaces without zones:** `list_spaces()` — look for spaces not assigned to a thermal zone
2127
- **Missing constructions:** `list_surfaces()` — look for surfaces without constructions

.claude/skills/retrofit/SKILL.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,11 @@ extract_end_use_breakdown(run_id=<retrofit_id>)
6565
```
6666

6767
### 5. Compare Results
68-
Present side-by-side comparison:
69-
- EUI change (absolute and percentage)
70-
- End-use breakdown delta (which categories improved)
71-
- Unmet hours change (ensure comfort wasn't sacrificed)
68+
```
69+
compare_runs(baseline_run_id=<baseline_id>, retrofit_run_id=<retrofit_id>)
70+
```
71+
Returns EUI delta, per-fuel end-use breakdown, and unmet hours change.
72+
For manual comparison, use `extract_summary_metrics` on both runs.
7273

7374
## Notes
7475

.claude/skills/tool-workflows/SKILL.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,12 @@ extract_summary_metrics(run_id=<retrofit_id>)
120120

121121
See the `measure-authoring` skill for run_body patterns and language guidance.
122122

123+
For HVAC measures, verify methods exist and get wiring code first:
124+
```
125+
search_api("CoilCoolingFourPipeBeam") # check real setter/getter names
126+
search_wiring_patterns("four pipe beam") # get working Ruby wiring code
127+
```
128+
123129
## Write and Apply a Custom ReportingMeasure
124130

125131
ReportingMeasures run after simulation to analyze SQL results.

.claude/skills/troubleshoot/SKILL.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,14 @@ query_timeseries(run_id=..., variable_name="Zone Mean Air Temperature",
5858
frequency="Hourly", key_value="Zone 1")
5959
```
6060

61+
## Verify SDK Methods
62+
63+
If a measure fails due to nonexistent API methods:
64+
```
65+
search_api("CoilCoolingFourPipeBeam") # list real setters/getters
66+
search_api("BoilerHotWater", method_pattern="Efficiency")
67+
```
68+
6169
## Quick Fixes
6270

6371
| Problem | Tool |

.github/workflows/ci.yml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -62,17 +62,17 @@ jobs:
6262
case ${{ matrix.shard }} in
6363
1)
6464
# sim test + component/weather + loop ops + skill_retrofit
65-
FILES="tests/test_example_workflows.py tests/test_component_properties.py tests/test_comstock.py tests/test_weather.py tests/test_mcp_seb4.py tests/test_create_constructions.py tests/test_loop_operations.py tests/test_plant_loop_demand.py tests/test_sizing_properties.py tests/test_skill_retrofit.py tests/test_integration.py"
65+
FILES="tests/test_example_workflows.py tests/test_component_properties.py tests/test_comstock.py tests/test_weather.py tests/test_weather_files.py tests/test_mcp_seb4.py tests/test_create_constructions.py tests/test_loop_operations.py tests/test_plant_loop_demand.py tests/test_sizing_properties.py tests/test_skill_retrofit.py tests/test_integration.py"
6666
EXTRA_ENV="-e MCP_OSW_PATH=tests/assets/SEB_model/SEB4_baseboard/workflow.osw -e EXPECTED_EUI=1.8750760248144998 -e EXPECTED_EUI_RTOL=0.02 -e EXPECTED_EUI_ATOL=0.0"
6767
;;
6868
2)
69-
# common_measures, hvac_systems, geometry, zone terminal, skill_energy_report, hvac_validation (consolidated)
70-
FILES="tests/test_common_measures.py tests/test_hvac_systems.py tests/test_replace_zone_terminal.py tests/test_geometry.py tests/test_bar_building.py tests/test_skill_energy_report.py tests/test_hvac_validation.py"
69+
# common_measures, hvac_systems, geometry, zone terminal, skill_energy_report
70+
FILES="tests/test_common_measures.py tests/test_hvac_systems.py tests/test_replace_zone_terminal.py tests/test_geometry.py tests/test_skill_energy_report.py"
7171
EXTRA_ENV=""
7272
;;
7373
3)
7474
# controls, object mgmt, loads, building, doas, hvac, measures, measure_authoring, skill_qaqc, hvac_supply_wiring
75-
FILES="tests/test_component_controls.py tests/test_object_management.py tests/test_generic_access.py tests/test_create_loads.py tests/test_building.py tests/test_doas_system.py tests/test_hvac.py tests/test_measures.py tests/test_measure_authoring.py tests/test_skill_qaqc.py tests/test_hvac_supply_wiring.py tests/test_validate_model.py"
75+
FILES="tests/test_component_controls.py tests/test_object_management.py tests/test_generic_access.py tests/test_create_loads.py tests/test_building.py tests/test_doas_system.py tests/test_hvac.py tests/test_measures.py tests/test_measure_authoring.py tests/test_skill_qaqc.py tests/test_hvac_supply_wiring.py tests/test_validate_model.py tests/test_api_reference.py"
7676
EXTRA_ENV=""
7777
;;
7878
4)
@@ -81,8 +81,8 @@ jobs:
8181
EXTRA_ENV=""
8282
;;
8383
5)
84-
# HVAC supply wiring simulation smoke tests (DOAS, radiant, district, beams)
85-
FILES="tests/test_hvac_supply_sim.py"
84+
# HVAC supply sim smoke tests + hvac_validation + bar_building + concurrent regression
85+
FILES="tests/test_hvac_supply_sim.py tests/test_hvac_validation.py tests/test_bar_building.py tests/test_concurrent_tools.py"
8686
EXTRA_ENV=""
8787
;;
8888
esac

CHANGELOG.md

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
# Changelog
2+
3+
## [0.9.0] - 2026-04-10
4+
5+
### Added
6+
- **Geometry tools**: `create_bar_building`, `create_new_building`, `import_floorspacejs` for model creation from DOE prototypes and FloorSpaceJS JSON
7+
- **Generic object access**: `get_object_fields`, `set_object_property`, dynamic `list_model_objects` for any OpenStudio type
8+
- **Measure authoring skill**: `create_measure`, `edit_measure`, `test_measure` with ReportingMeasure support
9+
- **Tool routing**: `search_api` (OpenStudio SDK search), `recommend_tools`, `search_wiring_patterns` (24 HVAC wiring recipes)
10+
- **HVAC components**: FourPipeBeam and CooledBeam air terminals, `set_zone_equipment_priority`
11+
- **LLM test suite**: 170+ tests across 5 tiers with progressive difficulty (L1 vague / L2 moderate / L3 explicit), cross-model benchmark sweeps (sonnet/opus/haiku), CodeMode A/B comparison
12+
- **Concurrent tool regression test**: validates MCP responses under concurrent tool calls
13+
- **Stdout purity test**: validates no C-level pollution on complex 44-zone models
14+
- **Response-size guardrails**: `max_results` + filters on all list tools, brief mode for large responses
15+
- **Agent guardrails**: anti-loop instructions in MCP server, tool-bypass prevention
16+
- Tags on all 142 tools for ToolSearch discovery
17+
- Enriched tool descriptions for better LLM tool selection
18+
- `list_weather_files` tool, `validate_model` tool, `extract_simulation_errors` tool
19+
- `compare_runs` tool for two-simulation comparison
20+
- CI expanded to 5 shards, ~450+ integration tests
21+
22+
### Fixed
23+
- **Concurrent tool timeout (issue #42)**: permanent fd redirect replaces racy global middleware — C stdout goes to stderr once at startup, Python sys.stdout gets private fd to MCP client
24+
- **Polyhedron stdout leak**: OpenStudio geometry engine C++ diagnostics no longer corrupt JSON-RPC stream
25+
- SWIG memory leak warnings fully suppressed across all callsites
26+
- Measure XML stale checksums causing OS App rejection
27+
- Choice-type measure argument validation in wrappers
28+
- JSON-string list params across 9 affected tools (`parse_str_list()`)
29+
- `conditioned_floor_area` computed from model instead of hardcoded
30+
- EUI units now report MJ/m2 + kBtu/ft2 alongside GJ/m2
31+
32+
### Changed
33+
- `list_files` hardened to `/inputs` + `/runs` only
34+
- `change_building_location` preferred over `set_weather_file` (sets EPW+DDY+CZ in one call)
35+
- Consolidated 4 HVAC validation test files into single `test_hvac_validation.py`
36+
- Consolidated integration tests: -8 files, -57 Docker sessions
37+
38+
## [0.8.2] - 2026-03-28
39+
40+
### Added
41+
- Tool description enrichment for all 142 tools
42+
- CodeMode toggle (default off) with LLM harness support
43+
44+
## [0.8.0] - 2026-03-13
45+
46+
### Added
47+
- Measure authoring skill with test framework
48+
- SWIG stdout suppression middleware (replaced in 0.9.0)
49+
- Phase 10 results tools: `extract_simulation_errors`, `list_output_variables`, `compare_runs`
50+
51+
## [0.7.0] - 2026-03-07
52+
53+
### Added
54+
- LLM agent test suite (170+ tests, local-only)
55+
- Geometry workflows (FloorSpaceJS import, bar building)
56+
57+
## [0.6.0] - 2026-02-28
58+
59+
### Added
60+
- Response-size guardrails on all list tools
61+
- Generic object access (Phase C)
62+
63+
## [0.5.0] - 2026-02-21
64+
65+
### Added
66+
- Agent guardrails (anti-loop, tool-bypass prevention)
67+
- Weather file improvements
68+
69+
## [0.4.0] - 2026-02-14
70+
71+
### Added
72+
- Common measures integration (20 measures, 11 wrapper tools)
73+
- Context reduction (auto-load, brief mode, batch removal)
74+
75+
## [0.3.0] - 2026-02-07
76+
77+
### Added
78+
- Initial skills architecture (22 skills, 126 tools)
79+
- 5-shard CI pipeline
80+
- OpenStudio SDK 3.11.0 integration

0 commit comments

Comments
 (0)