Skip to content

Commit ed8234a

Browse files
committed
[v0.1.5] 2025-10-06
🚨++ New Plug-in Integrated ++ 🚨 - Boundary-layer conductance plug-in integrated - Updated helios-core to v1.3.52 - Removed wheel support for macos-13, as it is no longer a supported GitHub runner platform. Instead, Intel macs are still supported through macos-14.
1 parent 7833202 commit ed8234a

21 files changed

Lines changed: 1760 additions & 47 deletions

β€Ž.github/workflows/build-wheels.ymlβ€Ž

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,15 @@ jobs:
99
build_wheels:
1010
name: Build wheels on ${{ matrix.os }}
1111
runs-on: ${{ matrix.os }}
12-
timeout-minutes: 45
12+
timeout-minutes: 60
1313
strategy:
1414
matrix:
1515
include:
1616
- os: ubuntu-22.04
1717
arch: x86_64
1818
- os: windows-2022
1919
arch: AMD64
20-
- os: macos-13
20+
- os: macos-14-large
2121
arch: x86_64
2222
- os: macos-14
2323
arch: arm64
@@ -195,7 +195,7 @@ jobs:
195195
else
196196
echo "[macOS] Reusing previously built native libs; skipping rebuild."
197197
fi
198-
CIBW_ENVIRONMENT_MACOS: "MACOSX_DEPLOYMENT_TARGET=${{ matrix.arch == 'x86_64' && '13.0' || '14.0' }} CMAKE_OSX_ARCHITECTURES=${{ matrix.arch }} SYSTEM_VERSION_COMPAT=0"
198+
CIBW_ENVIRONMENT_MACOS: "MACOSX_DEPLOYMENT_TARGET=14.0 CMAKE_OSX_ARCHITECTURES=${{ matrix.arch }} SYSTEM_VERSION_COMPAT=0"
199199

200200
# Ensure CUDA is visible inside cibuildwheel's Windows build environment
201201
CIBW_ENVIRONMENT_PASS_WINDOWS: "CUDA_PATH CUDA_HOME"
@@ -658,6 +658,7 @@ jobs:
658658
test_wheels:
659659
name: Test wheels on ${{ matrix.os }} Python ${{ matrix.python-version }}
660660
runs-on: ${{ matrix.os }}
661+
timeout-minutes: 30
661662
needs: build_wheels
662663
strategy:
663664
matrix:
@@ -670,9 +671,9 @@ jobs:
670671
python-version: '3.8'
671672
- os: windows-2022
672673
python-version: '3.11'
673-
- os: macos-13
674+
- os: macos-14-large
674675
python-version: '3.8'
675-
- os: macos-13
676+
- os: macos-14-large
676677
python-version: '3.11'
677678
- os: macos-14
678679
python-version: '3.11'

β€Ž.github/workflows/docs.ymlβ€Ž

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,14 @@ jobs:
4141
- name: Install system dependencies
4242
run: |
4343
sudo apt-get update
44-
sudo apt-get install -y doxygen graphviz
44+
sudo apt-get install -y graphviz wget
45+
46+
# Install Doxygen 1.13.2 from source to match local build
47+
# Different Doxygen versions generate different anchor hashes, breaking search links
48+
wget https://www.doxygen.nl/files/doxygen-1.13.2.linux.bin.tar.gz
49+
tar -xzf doxygen-1.13.2.linux.bin.tar.gz
50+
sudo cp doxygen-1.13.2/bin/doxygen /usr/local/bin/
51+
sudo chmod +x /usr/local/bin/doxygen
4552
4653
- name: Install Python dependencies
4754
run: |

β€ŽCLAUDE.mdβ€Ž

Lines changed: 193 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -664,32 +664,209 @@ static thread_local std::vector<unsigned int> static_result; // Not just static
664664
- Purpose: persist structured facts and relationships about this repo, projects, and collaborators using the knowledge-graph memory tools.
665665
- Safety: summarize what you plan to store before writing; do not store secrets or API keys.
666666

667+
### **CRITICAL: How MCP Search Actually Works**
668+
669+
MCP memory uses **simple case-insensitive substring matching** - NOT semantic search or AI understanding. It searches for your query string within entity names, types, and observations using basic `toLowerCase().includes()`.
670+
671+
**Key Implications:**
672+
- Query "test crash" searches for the EXACT phrase "test crash" as a substring
673+
- Query "boundary-layer conductance test failure" WON'T match unless that exact phrase exists
674+
- NO fuzzy matching, NO synonyms, NO semantic understanding
675+
- Case-insensitive: "Test" finds "test", "TEST", "testing"
676+
- Substring matching: "conduct" finds "conductance", "conductor", "semiconductor"
677+
678+
### Search Strategy (MANDATORY)
679+
680+
**βœ… GOOD Query Patterns:**
681+
```python
682+
# Single keyword queries work best
683+
mcp__memory__search_nodes(query="radiation")
684+
mcp__memory__search_nodes(query="conductance")
685+
mcp__memory__search_nodes(query="pytest")
686+
687+
# Short phrases that appear verbatim
688+
mcp__memory__search_nodes(query="energy balance")
689+
mcp__memory__search_nodes(query="ctypes wrapper")
690+
691+
# Word stems for broader matching
692+
mcp__memory__search_nodes(query="visual") # finds "visualizer", "visualization"
693+
mcp__memory__search_nodes(query="test") # finds "test", "testing", "pytest"
694+
```
695+
696+
**❌ BAD Query Patterns:**
697+
```python
698+
# Complex multi-term queries (searches for EXACT phrase)
699+
mcp__memory__search_nodes(query="boundary-layer conductance test failure exit crash")
700+
701+
# Natural language questions (no semantic understanding)
702+
mcp__memory__search_nodes(query="what causes the radiation plugin to crash?")
703+
704+
# Multiple disconnected concepts (won't match unless exact phrase exists)
705+
mcp__memory__search_nodes(query="CMake plugin shader visualization error")
706+
```
707+
708+
**Query Refinement Strategy:**
709+
1. **Start broad, then narrow**: "test" β†’ "pytest" β†’ "pytest crash" β†’ "pytest contamination"
710+
2. **Use word stems**: "visual" instead of "visualizing", "optim" instead of "optimization"
711+
3. **Multiple simple searches** over one complex search: Do 3 searches with ["radiation", "crash", "GPU"] instead of one "radiation plugin GPU crash"
712+
4. **Search by entity type** if you know it: "technical_issue", "solution", "pattern"
713+
667714
### When to write memory
668715
Trigger a write when any of the following occur:
669716
1. A new project, module, or dataset is introduced.
670717
2. A design decision or convention is finalized.
671-
3. A collaborator’s role, preference, or responsibility is clarified.
718+
3. A collaborator's role, preference, or responsibility is clarified.
719+
4. A technical issue is discovered and solved.
720+
5. An integration pattern or architectural insight is learned.
672721

673722
### How to write memory
674-
Use the server’s tools rather than free-form text. Prefer the smallest useful graph entries.
675723

676-
1. Create entities
677-
Run the MCP tool `create_entities` with fields `name`, `entityType`, and `observations`. Example:
678-
- β€œCreate an entity for the library β€˜Helios EnergyBalanceModel’ with observation summarizing the inputs, outputs, and key files.”
724+
**Entity Naming Standards (MANDATORY):**
725+
- Use underscores for multi-word names: `RadiationModel_Plugin`, `pytest_forked_fix`
726+
- Be specific but concise (3-5 words max): `boundary_layer_conductance_integration`
727+
- Include dates for time-sensitive items: `shader_fix_2025_10_06`
728+
- Use consistent casing: Choose `snake_case` or `CamelCase` and stick with it
729+
- Make names searchable: Include keywords you'd search for
730+
731+
**Atomic Observation Principle:**
732+
One observation = one fact. Break compound statements into separate observations.
733+
734+
βœ… **GOOD Observations:**
735+
```python
736+
observations = [
737+
"Requires OptiX 7.3 or higher",
738+
"GPU acceleration optional via --enable-gpu flag",
739+
"Shader files must be copied to build/shaders/",
740+
"Fixed in commit 7833202 on 2025-09-25",
741+
"Located in pyhelios/RadiationModel.py"
742+
]
743+
```
744+
745+
❌ **BAD Observations:**
746+
```python
747+
observations = [
748+
"Requires OptiX 7.3 or higher and GPU acceleration is optional via --enable-gpu flag, also shader files must be copied to build/shaders/ directory"
749+
]
750+
```
679751

680-
2. Add relations
681-
Run `create_relations` to connect entities. Example:
682-
- β€œLink β€˜Helios EnergyBalanceModel’ to β€˜SurfaceEnergyBalance’ with relationType β€˜implements’.”
752+
**Recommended Entity Types for PyHelios:**
753+
- **Components**: `plugin`, `module`, `tool`, `library`
754+
- **Knowledge**: `technical_issue`, `solution`, `pattern`, `architecture`
755+
- **Process**: `workflow`, `convention`, `guideline`
756+
- **Project**: `project`, `feature`, `dataset`
683757

684-
3. Update or annotate
685-
Use `append_observations` to add a brief dated note when behavior or conventions change.
758+
**Creating Entities and Relations:**
759+
```python
760+
# 1. Create entities with atomic observations
761+
mcp__memory__create_entities(entities=[
762+
{
763+
"name": "pytest_forked_plugin",
764+
"entityType": "tool",
765+
"observations": [
766+
"Prevents ctypes contamination between tests",
767+
"Runs each test in subprocess for isolation",
768+
"Required for PyHelios test suite reliability"
769+
]
770+
}
771+
])
772+
773+
# 2. Create meaningful relations
774+
mcp__memory__create_relations(relations=[
775+
{
776+
"from": "pytest_forked_plugin",
777+
"to": "ctypes_contamination_issue",
778+
"relationType": "solves"
779+
}
780+
])
781+
782+
# 3. Update existing entities (use add_observations, NOT append_observations)
783+
mcp__memory__add_observations(observations=[
784+
{
785+
"entityName": "pytest_forked_plugin",
786+
"contents": ["Added to PyHelios in version 0.1.4"]
787+
}
788+
])
789+
```
686790

687791
### When to read memory
688-
Before large refactors, onboarding explanations, or when the task mentions prior decisions, call `search_entities` or `search_relations` with a concise query, then cite what you found.
689792

690-
### Usage examples
691-
- β€œSearch memory for entities about β€˜Helios’ and β€˜stomatal conductance’ and summarize relevant observations.”
692-
- β€œCreate entities for β€˜GEMINI project’ (type: project) and β€˜Nonpareil orchard dataset’ (type: dataset), then relate them with relationType β€˜uses’.”
793+
**ALWAYS search before creating** to avoid duplicates:
794+
```python
795+
# Before creating new entity, search for existing
796+
results = mcp__memory__search_nodes(query="radiation")
797+
# If found, use add_observations to update
798+
# If not found, create new entity
799+
```
800+
801+
**Search at session start** to gather context:
802+
```python
803+
# Use 2-3 keyword searches
804+
results1 = mcp__memory__search_nodes(query="plugin integration")
805+
results2 = mcp__memory__search_nodes(query="boundary conductance")
806+
results3 = mcp__memory__search_nodes(query="pytest")
807+
```
808+
809+
**Use open_nodes when you know exact names:**
810+
```python
811+
entities = mcp__memory__open_nodes(names=[
812+
"PyHelios_Plugin_Integration_Process",
813+
"ctypes_wrapper_error_handling_pattern"
814+
])
815+
```
816+
817+
### Common Pitfalls and Solutions
818+
819+
**Pitfall 1: Overly specific queries return nothing**
820+
- Problem: `search_nodes(query="the test fails with segmentation fault in boundary layer module")`
821+
- Solution: Break into separate searches: `search_nodes(query="segmentation")`, `search_nodes(query="boundary")`
822+
823+
**Pitfall 2: Duplicate entities**
824+
- Problem: Creating `Radiation_Model`, `RadiationModel_Plugin`, `radiation_plugin` separately
825+
- Solution: ALWAYS search before creating: `search_nodes(query="radiation")`
826+
827+
**Pitfall 3: Generic entity names**
828+
- Problem: Entity named "test_issue" is impossible to find
829+
- Solution: Include distinctive identifiers: `pytest_forked_contamination_fix_2025_10`
830+
831+
**Pitfall 4: Compound observations**
832+
- Problem: "Fixed shader compilation and asset copying and CMake configuration"
833+
- Solution: Break into atomic facts: ["Fixed shader compilation issue", "Implemented automatic asset copying", "Updated CMake configuration"]
834+
835+
### PyHelios-Specific Memory Structure
836+
837+
**Core Categories:**
838+
```python
839+
# Plugins (main focus)
840+
"RadiationModel_Plugin", "Visualizer_Plugin", "BoundaryLayerConductance_Plugin"
841+
842+
# Technical challenges
843+
"ctypes_contamination_issue", "pytest_forked_requirement", "cmake_asset_copying_pattern"
844+
845+
# Solutions and patterns
846+
"pytest_forked_solution", "cmake_custom_asset_copy", "errcheck_callback_pattern"
847+
848+
# Architecture
849+
"8_phase_plugin_integration_process", "fail_fast_error_philosophy", "cross_platform_library_loading"
850+
```
851+
852+
**Relation Types to Use:**
853+
- `solves`, `fixes` (solution β†’ problem)
854+
- `depends_on`, `requires` (component β†’ dependency)
855+
- `implements`, `provides` (implementation β†’ interface)
856+
- `part_of`, `contains` (child β†’ parent)
857+
- `follows`, `precedes` (sequence relationships)
858+
859+
### Quick Reference
860+
861+
**Search Commands:**
862+
```python
863+
mcp__memory__search_nodes(query="keyword") # Discovery search
864+
mcp__memory__open_nodes(names=["Entity_Name"]) # Specific retrieval
865+
mcp__memory__read_graph() # Export full graph
866+
```
693867

694-
### References inside prompts
695-
- To reference MCP resources or trigger tools, you can type `/mcp` in Claude Code to view available servers and tools, or mention the server by name in your instruction, e.g., β€œUsing the `memory` server, run `search_entities` for β€˜trellis’.” See Anthropic’s MCP guide for listing and managing servers.
868+
**When Search Returns Nothing:**
869+
1. Try shorter query (use word stem: "visual" not "visualization")
870+
2. Try related keywords ("GPU" if "OptiX" fails)
871+
3. Search entity types: `search_nodes(query="technical_issue")`
872+
4. Use `read_graph()` to see all entities

β€Žbuild_scripts/build_helios.pyβ€Ž

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
"energybalance",
4646
"solarposition",
4747
"stomatalconductance",
48+
"boundarylayerconductance",
4849
"photosynthesis",
4950
"plantarchitecture"
5051
]

β€Ždocs/CHANGELOG.mdβ€Ž

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,14 @@
11
# Changelog
22

3+
# [v0.1.5] 2025-10-06
4+
5+
🚨++ New Plug-in Integrated ++ 🚨
6+
- Boundary-layer conductance plug-in integrated
7+
8+
- Updated helios-core to v1.3.52
9+
10+
- Removed wheel support for macos-13, as it is no longer a supported GitHub runner platform. Instead, Intel macs are still supported through macos-14.
11+
312
# [v0.1.4] 2025-09-25
413

514
- Updated helios-core to v1.3.51

β€Ždocs/Doxyfile.pythonβ€Ž

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ INPUT = pyhelios \
129129
docs/plugin_system.md \
130130
docs/user_guide.md \
131131
docs/plugin_integration_guide.md \
132+
docs/plugin_boundarylayerconductance.md \
132133
docs/plugin_energybalance.md \
133134
docs/plugin_photosynthesis.md \
134135
docs/plugin_plantarchitecture.md \
@@ -147,6 +148,7 @@ FILE_PATTERNS = *.py \
147148
RECURSIVE = YES
148149
EXCLUDE = pyhelios/plugins/__pycache__ \
149150
pyhelios/__pycache__ \
151+
pyhelios/wrappers/UBoundaryLayerConductanceWrapper.py \
150152
pyhelios/wrappers/UContextWrapper.py \
151153
pyhelios/wrappers/UGlobalWrapper.py \
152154
pyhelios/wrappers/ULoggerWrapper.py \

β€Ždocs/DoxygenLayout.xmlβ€Ž

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
<!-- Plugin Documentation Section -->
2424
<tab type="usergroup" visible="yes" url="@ref Plugins" title="Plugins" intro="">
2525
<!-- Currently Implemented Plugins (Alphabetized) -->
26+
<tab type="user" visible="yes" url="@ref BoundaryLayerConductanceDoc" title="Boundary Layer Conductance"/>
2627
<tab type="user" visible="yes" url="@ref EnergyBalanceDoc" title="Energy Balance Model"/>
2728
<tab type="user" visible="yes" url="@ref PhotosynthesisDoc" title="Photosynthesis Model"/>
2829
<tab type="user" visible="yes" url="@ref PlantArchitectureDoc" title="Plant Architecture"/>

0 commit comments

Comments
Β (0)