Three neural surrogates (failure · power · wake) feed an exact symbolic optimiser (LP · MILP · payback gate). A two-agent LLM pipeline turns state into deterministic tool calls, and an isolated autonomous watchdog runs that pipeline with no human in the loop when the farm crosses a threshold. Every neural claim is cross-checked against FLORIS physics before it is allowed to act. It all runs locally, on the edge.
Each is normally a separate tool with a separate dashboard and a human stitching them together. That human is the bottleneck, and the single point of failure.
Edge-Cortex stitches all four questions into a single loop and puts an autonomous agent on top. The coupling is bidirectional: the neural side writes the optimiser's objective, and the symbolic side governs and vetoes the neural side. Neither half is decorative; delete either and the system stops working.
LNN failure, KAN power, FNO wake: fast enough to call inside an optimiser loop, exported to ONNX with custom Fourier operators for the edge.
Trust-region LP, day-ahead MILP, and a payback gate, all fed by the surrogates, plus a FLORIS physics oracle that vetoes any wake claim that disagrees on sign.
A Director to Operations pipeline translates state into typed tool calls and governs when to act. It runs on machine triggers, never on operator keystrokes.
Per-turbine remaining-useful-life + P(fail in 7/30/60 d), with an attention readout. Trained on ~28 M rows of Kelmarsh SCADA.
Analytical-symbolic power model P(wind, yaw) with extractable gradients that feed the wake-steering LP.
Full 128×128 wake-velocity field over the farm, supplying cross-turbine coupling. Structured lifting on the real Kelmarsh layout.
Per-turbine anomaly scores against a learned threshold; correlated flags escalate to the watchdog.
Not learned. The ground-truth validator: every wake claim is re-simulated, and a sign-mismatch plan never executes.
Every panel below is driven by a baked replay of the real SCADA window. Scrub the week; the wake field, KPIs, prices and failure risk all move with the clock, and the autonomous watchdog fires on its own as thresholds are crossed. No server, no model, no agent is running: it's a truthful snapshot, not a live system.
Isolation by design: the assistant answers questions but has no path to command the acting agents. Actions come only from the watchdog.
A deterministic watchdog (not an LLM) watches the replay clock for 9 triggers across 6 kinds. When one fires it runs the same Director→Operations pipeline in a thread. If the result is EXECUTE and confidence ≥ 0.70, the action stands and is tagged ⚡ EXECUTED; otherwise it downgrades to a logged recommendation.
| Trigger | Condition | Source |
|---|---|---|
| Imminent failure | P(fail ≤ 7 d) over 0.70 for any turbine | LNN head |
| Failure warning | P(fail ≤ 30 d) rising past its alert level | LNN head |
| Anomaly root-cause | score reaches 85% of the learned threshold | DCFF-MTAD |
| Correlated anomaly | two or more turbines flagged at once | DCFF-MTAD |
| Price spike | price departs the 24 h mean by over 2σ | ENTSO-E |
| Wake loss | farm-wide wake deficit reaches 6% | FNO |
| Wind shift | direction moves over 30° within an hour | Open-Meteo |
| Heartbeat sweep | timed periodic health check | replay clock |
The agents that take actions are sealed off from every operator and user input path. There is no command box, no one-click "run the agents", no way for a human to inject an instruction into the acting pipeline. Operators observe, and ask questions through a separate read-only assistant. This removes an entire class of abuse/attack surface: you cannot socially-engineer, prompt-inject, or fat-finger an autonomous action into existence.
The Operations agent orchestrates 22 tools across 13 MCP servers in a Thought→Action→Observation loop, then summarises citing tool-derived numbers only.
Farm snapshot · Historical weather · Day-ahead prices
RUL forecast (conformal) · KAN gradient · Wake-coupling Jacobian · Anomaly detection · Wake simulation
Wake-steering solver (LP + payback gate) · Day-ahead scheduler (MILP)
Datasheet query · FFT · Band power · Cross-correlation · Window comparison
Dashboard render · Report export · Event log · Logbook query · Period summary
Surrogates compiled to ONNX with native Fourier spectral-conv operators, validated to ~1e-6 parity vs PyTorch.
qwen3.5:4b-mxfp8 for the task agents · lfm2.5-thinking:1.2b for read-only chat · all on Ollama, no API in the loop.
ENTSO-E day-ahead · Open-Meteo weather · Kelmarsh SCADA, all pinned to one replay clock.
SCADA → LNN → LP → setpoints → SCADA, with the market and the wear cost inside the same objective.
No plan executes if FLORIS disagrees on sign, or if the payback gate says the wind won't hold long enough to repay the wear.
Small quantised LLMs + ONNX surrogates. No cloud dependency in the control loop.
Every decision, human-driven or autonomous, is written to DuckDB with replay-time, and is queryable by the agent itself.
Calibrated conformal intervals are surfaced, and the self-execute gate holds at ≥ 0.70 confidence; everything else is a recommendation.
Autonomous actors have no operator input path: a structural guarantee, not a policy you have to trust.
Everything below is future work, not shipped today: the roadmap the current architecture is built to grow into.
The structured FNO lifting and typed physics interfaces generalise beyond Kelmarsh: retarget the layout, keep the loop.
Fold battery dispatch and ancillary-service markets into the same MILP objective.
The payback gate is MPC step one; extend to a receding-horizon controller over the wind forecast.
Deeper datasheet-grounded root-cause analysis linking anomalies to component-level failure modes.
The system maintains itself: it watches its own models for drift, decides when to retrain (humans only label), validates against FLORIS, and redeploys, adapting to the site with less ML babysitting over time.