Overview
Evaluates renewable energy project potential through resource assessment, energy yield estimation, and financial analysis. Implements industry-standard methods: PVWatts-equivalent solar modeling, Weibull-based wind resource characterization, levelized cost of energy (LCOE) with the capital recovery factor, and lifetime generation forecasting with degradation. Produces a feasibility report with visualizations that supports go/no-go investment decisions, power purchase agreement (PPA) pricing, and interconnection applications.
Workflow
<Workflow - Resource Data Assessment description="Load or estimate resource data and characterize the solar or wind resource." tools=[file_read, run_python, web_search, url_fetch, get_current_time] triggers=["User requests a renewable energy assessment or uploads resource data"]
[Agent] Verify time-sensitive reference data first. Identify which values the assessment will need (technology costs, incentives, PPA prices, grid limits). For each value that changes over time, fetch the current value from the matching source in references/authoritative-sources.md using web_search or url_fetch. Validate: Every time-sensitive value has a verified source (fetched this session or user-provided). Physical constants come from the methodology references. If fails: Stop and ask the user to confirm or provide the value (Rule 1).
[Agent] Call get_current_time. Determine the technology type from the request or the {{technology}} input. Validate: Technology is one of solar_pv, onshore_wind, offshore_wind. If fails: Ask the user which technology to assess.
[Decide] Does the user have a resource data file?
- Yes: load it with run_python (pandas). Identify columns: timestamp, GHI/DNI/DHI and temperature for solar, or wind_speed/direction, temperature, pressure for wind.
- No: search for resource estimates for the location with web_search (NREL NSRDB for solar, Global Wind Atlas for wind) and use typical meteorological year or regional-average values. Validate: Resource data is available in a usable format (hourly, monthly, or annual). If fails: Ask the user for basic parameters (annual average GHI in kWh/m2/day, or mean wind speed in m/s).
[Agent] Characterize the resource with run_python, following the equations in references/solar-methodology.md (solar) or references/wind-methodology.md (wind). For wind, fit the Weibull distribution by method of moments (no scipy). Validate: Values are physically reasonable (solar GHI 800-2500 kWh/m2/yr; wind mean 4-12 m/s at hub height). If fails: Flag the value and check units (W/m2 vs kWh/m2/day vs kWh/m2/year).
[Agent] Apply corrections: wind shear from measurement height to hub height, or solar transposition from GHI to plane-of-array irradiance for the specified tilt and azimuth, per the methodology references. Validate: Corrected values move in the expected direction (shear raises speed; tilt raises irradiance in most cases). If fails: Use uncorrected values and note the limitation.
</Workflow - Resource Data Assessment>
<Workflow - Energy Yield Estimation description="Calculate expected annual energy production with full loss accounting and uncertainty bounds." tools=[run_python] triggers=["After resource assessment completes"]
[Agent] Calculate gross energy yield before losses using the model in the matching methodology reference. For solar, sum monthly or hourly plane-of-array output; for wind, integrate the power curve against the fitted Weibull distribution with numpy. Validate: Gross capacity factor is within the expected range for the technology. If fails: Check power-curve parameters and resource values.
[Agent] Apply the system loss stack from the methodology reference (multiplicative, including temperature derate for solar). Validate: Net capacity factor is below gross; total losses are 14-20% solar, 5-15% wind. If fails: Check for double-counted or misapplied losses.
[Agent] Generate the lifetime production forecast with degradation (solar default 0.5%/year, wind default 1.6%/year), producing year-by-year energy. Validate: Year 1 exceeds year N; the lifetime total is reasonable. If fails: Check the degradation rate sign and magnitude.
[Agent] Calculate P50, P75, and P90 bounds from combined uncertainty per references/financial-methodology.md. Validate: P90 < P75 < P50; spread is 5-15% solar, 10-20% wind. If fails: Recheck the sigma inputs.
</Workflow - Energy Yield Estimation>
<Workflow - LCOE and Financial Analysis description="Calculate LCOE and key financial metrics for the project." tools=[run_python, web_search, url_fetch] triggers=["After energy yield estimation completes"]
[Ask user] Confirm or provide financial parameters: CAPEX ($/kW), fixed O&M ($/kW-yr), discount rate (WACC), project life, tax credits, and any debt terms. Offer technology-appropriate defaults only after verifying them live per Rule 1. Validate: At least CAPEX and discount rate are confirmed. If fails: Use verified technology defaults and flag them as assumed.
[Agent] Calculate LCOE with the full NPV method in references/financial-methodology.md, then cross-check with the CRF method. Validate: LCOE is within the plausible band for the technology; the CRF result is within ~5% of the NPV result. If fails: Verify input units (common error: $/kW-DC vs $/kW-AC, or nominal vs real WACC). Report the NPV result as primary and note the discrepancy.
[Agent] Calculate additional metrics at the given PPA price: annual revenue, simple payback, project NPV, and IRR using the bisection helper (no numpy_financial). Validate: Payback is shorter than project life; IRR is a real number. If fails: Widen the IRR bracket or report that no IRR exists in the bracket.
</Workflow - LCOE and Financial Analysis>
<Workflow - Report and Visualization description="Generate the assessment report and dashboard, then open them for the user." tools=[run_python, run_python_with_write, file_write, open_in_session_tab] triggers=["After financial analysis completes"]
[Ask user] Confirm the output directory ({{output_dir}} if provided). Never hardcode an output path. Validate: A writable directory is confirmed. If fails: Ask again or offer to write into the current session workspace.
[Agent] Build an HTML dashboard with Highcharts visualizations (monthly resource profile, lifetime generation with degradation, LCOE sensitivity tornado, P50/P75/P90 distribution, cumulative cash flow with payback year). Load the html_design and highcharts skills for design tokens and chart syntax. Validate: Charts render with all data present. If fails: Generate matplotlib PNG charts as a fallback.
[Agent] Produce an LCOE sensitivity analysis by varying CAPEX, discount rate, energy yield, O&M, and degradation by +/-20% and recomputing LCOE. Validate: Directions make physical sense (higher CAPEX raises LCOE). If fails: Present the base case only.
[Agent] Write the assessment report as markdown to the confirmed output directory: Project Summary, Resource Assessment, Energy Yield (P50/P75/P90 and loss breakdown), Financial Analysis (LCOE, payback, NPV, IRR, sensitivity), Assumptions and Limitations, and the Rule 8 professional-advice disclaimer. Validate: The report contains every section, populated. If fails: Generate a partial report with the available results and note the gaps.
[Agent] Open the report and dashboard with open_in_session_tab. Validate: The files are visible to the user. If fails: Output the key results in chat.
</Workflow - Report and Visualization>