- demo/scenarios.yaml: Q1 (drill T), Q2 (sustainable MW / 20 yr, with UQ
distributions), Q3 (well placement, with OAT sensitivity knob).
- tools/monte_carlo.py: ensemble wrapper with uniform/normal/lognormal/
triangular sampling; returns P10/P50/P90 temperature + pressure fields
plus per-draw scalar summaries. Default engine = surrogate (30 samples
in ~0.1 s).
- tools/sensitivity.py: OAT parameter sweep with probe_temperature_C and
reservoir-mean metrics; returns per-parameter curves + |delta| ranking.
- agent/runtime.py: two new MCP tools (monte_carlo, sensitivity_oat)
registered with the SDK MCP server; system prompt updated to describe
all four tools.
- agent/api.py: FastAPI app with /health, /scenarios, and SSE /query
streaming AssistantMessage text + ToolUseBlock events to the UI.
- app/app.py: Streamlit fallback (<200 lines) with sidebar scenario
picker, solver/surrogate side-by-side heatmaps, and an agent-trace
panel backed by ClaudeSDKClient.
All 13 tests s…
Day-1 evening milestone: both engines live, agent answers Q1
Ubuntu+1: Claude Opus 4.6
97f04e4
- tools/predict_solver.py: unified (scenario) -> {T, P, grid, engine} wrapper
around solver.coupled.run_coupled_transient
- tools/predict_surrogate.py: matching schema wrapper around v1.1 CNN surrogate
(handles well-index rescaling from arbitrary grid -> 32x32)
- agent/runtime.py: claude-agent-sdk runtime, in-process SDK MCP server
exposing both tools to claude-opus-4-6. CLI entry point answers
natural-language geothermal questions end-to-end.
Q1 verified: "drill at x=200m, y=100m after 1 yr of 0.5 kg/s reinjection" ->
agent correctly maps coords, calls predict_solver, reports T ~ 123 C, P ~ 15.0 MPa.
Spot-check against direct solver call matches.
Day-1-evening GO/NO-GO: solver GO (Theis 0.38% err, conduction 0.18% err).
13/13 tests green.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>