Planner Contract and AI Tunables

This is the canonical planner-control contract for Verdify. It explains what triggers a plan, what values the AI planning agent may write, how those writes publish to the public site, and what live readback evidence says about the bounded tunable surface.

End-to-end path for planner-owned values:

AI planning agent -> MCP set_plan or set_tunable -> setpoint_plan -> v_active_plan -> ingestor dispatcher -> ESPHome number/switch -> firmware global/Setpoints -> cfg_* readback -> setpoint_snapshot and setpoint_changes confirmation.

The ESP32 still owns relay control. The AI planning agent owns bounded setpoint hypotheses, not direct actuator commands.

Related evidencePlanning Loop · Safety Architecture · Operations

This generated page owns triggers, accepted writes, publishing behavior, and per-parameter contract evidence. The planning page owns prompt flow, the safety page owns relay-boundary behavior, and Operations owns current live state.

Trigger Schedule

Every expected trigger is materialized in planner_trigger_ledger before planner delivery. Required full-plan triggers must close with set_plan; tactical checkpoints may close with set_tunable or acknowledge_trigger when no change is warranted.

MIDNIGHT00:15 America/Denver

Required end-of-day review and reset. The AI planning agent evaluates prior-day plans, extracts supported lessons, and starts the new local day with set_plan.

SUNRISEAstral sunrise

Required morning full plan for daylight, peak stress, decline, and evening handoff.

SOLAR_MAXAstral solar noon

Solar checkpoint for a small tactical correction or honest no-change acknowledgement.

TRANSITIONPeak stress and decline

Bounded tactical checkpoint for the two highest-signal day transitions.

SUNSETAstral sunset

Required evening full plan for overnight cold, humidity, dew point, and pre-dawn posture.

FORECAST_DEVIATIONSigma-gated observed miss; fired 34x in the last 14 days

Triggered only when actual outdoor conditions diverge materially from forecast after cooldown and threshold checks. The ledger fire count is read live from planner_trigger_ledger so this label reflects whether the trigger is actually firing, not just configured.

MANUALOperator initiated

Ad-hoc audited planner run with the same MCP bounds and audit metadata as scheduled triggers.

Payload And Runtime Contract

The planner receives one trigger-scoped payload through Hermes /v1/runs: standing directives, the event prompt, assembled greenhouse context, and audit metadata. The session id keeps the historical hermes:iris:main:trigger:<trigger_id> shape because it is a database/service key, not public planner branding.

Planner scheduleringestor/tasks.py::planning_heartbeat

Computes expected trigger times, records them before delivery, dispatches the AI planning agent, and resolves SLA state.

Prompt builderingestor/iris_planner.py

Builds the event prompt, appends live and static context, stamps audit metadata, and posts to Hermes.

Dynamic greenhouse packetscripts/gather-plan-context.sh

Live sensors, equipment, forecast, active plan, scorecards, plan-review backlog, lessons, alerts, tunable constraints, guardrail audits, and context completeness.

Public site packet/srv/verdify/state/planner-static-context.md

Generated from the same Markdown source tree Quartz renders for lab.verdify.ai, with a SHA-256 digest embedded into planner context.

Accepted Writes And Publishing

set_planRequired for full-plan triggers

Validates the plan envelope, bounded climate_intent, bounds, trigger ID, planner instance, and structured hypothesis; materializes to setpoint_plan and audits semantic intent in plan_journal.

set_tunableNarrow tactical correction

Validates one planner-pushable parameter against this registry and writes an audited one-shot setpoint row.

acknowledge_triggerNo-op closeout

Allowed for no-op transition, forecast-deviation, heartbeat, and validation-smoke events; rejected for normal required full-plan cycles.

plan_evaluateLearning-loop closure

Writes outcome, score, anchor score, optional lesson extraction, and validation time back to plan_journal.

Publishingpublish-site-content.sh

MCP writes trigger generated plan pages, archive, forecast, lessons, tunables, baseline, evidence snapshots, public sample data, static planner context, and a Quartz rebuild.

Current Audit Snapshot

238Schema tunables

Every name accepted by PlanTransition, SetpointChange, or setpoint_snapshot.

238Registry rows

Includes dispatcher-routed and readback-only firmware inputs.

40Materialized Tier 1 knobs

MCP derives these from bounded ClimateIntent for routine set_plan writes.

49Planner-policy knobs

The only tunables the planner may write. Operator, crop-band, readback, and retired rows are context only.

26Open alerts

Live safety state at generation time.

0Future active params

0 future active plan rows.

0Reserved active rows

Should remain zero for no-op/deprecated params.

2/230m trigger audit

Plan dispatcher writes carrying trigger IDs.

0.095 kPaMister VPD delta

1164 measured mister cycles in the last 14 days.

Contract class counts: {'planner_policy': 49, 'crop_band': 64, 'controller_safety': 52, 'readback_context': 22, 'retired': 16}.

Embedding corpus counts: {"plan": 159, "lesson": 114, "playbook": 124, "site_doc": 4274, "observation": 636}.

Firmware override events in the last 7 days: {"vent_mist_assist": 357, "occupancy_blocks_equipment": 10}.

Effectiveness labels below mean three different things:

  • Route confirmed means the planner/dispatcher write landed and firmware read it back.
  • Operational effect means firmware has a code path that consumes the value.
  • Greenhouse outcome means a later scorecard or structured rationale supports or falsifies the plan. This page reports the latest available evidence but does not pretend a single tunable has isolated causal proof unless the system measured that directly.

Current controller invariants:

  • DEHUM_VENT exits immediately if dehumidifying with vent/fans pushes VPD above vpd_high; cooling then uses VENTILATE with vent-mist assist, otherwise sealed mist recovery is allowed.
  • Non-safety heat is suppressed while vent/fan air exchange is physically active.
  • heat2 is never valid without heat1; any observed heat2-without-heat1 interval is a fault to investigate, not a planner tactic.
  • The dispatcher preserves a minimum 0.55 kPa house VPD deadband so mixed-zone crop targets do not create controller chatter.
  • During live, near-edge, or recently unrecovered VENTILATE VPD-high stress with healthy dew margin, the dispatcher clamps conservative moisture thresholds near the active vpd_high band: mister_engage_kpa <= vpd_high + 0.05, mister_all_kpa <= max(1.0, vpd_high + 0.25), fog_escalation_kpa <= 0.20 or 0.15 in hot/dry venting, shorter mist delays/gaps, and shorter min_fog_off_s.
  • Planner moisture tuning ladder: open the band-coupled mister surface first, use all_zone_vpd_excess_kpa for distributed mister escalation, shorten mister_pulse_gap_s before increasing mister_pulse_on_s, use fog as the heavy 7x escalation path, and remember mister_vpd_weight changes zone selection rather than total duty.

ClimateIntent AI Surface

Routine set_plan transitions must include a bounded climate_intent object with every field below explicitly set. These fields tune tactical posture around the dispatcher-owned targets; they do not own temp/VPD low, target, or high points.

FieldBoundsPlanner meaningFirmware impactMaterialized knobsPlanner guidance
forecast_temp_bias_f-4..4FForecast-backed hot-air pressure signal for the segment.Positive values make cooling more anticipatory without changing dispatcher-owned temp_low/temp_target/temp_high.cool_stage2_over_high_f, sw_cool_all_fans_at_high_enabledUse positive values when forecast or recent misses imply heat will outrun the band; use 0 when no hot miss is expected.
forecast_vpd_bias_kpa-0.4..0.4 kPaForecast-backed dry/wet pressure signal for the segment.Positive values make wet actions more available without changing dispatcher-owned vpd_low/vpd_target/vpd_high.sw_direct_wet_stress_override_enabled, mister_vpd_weight, min_fog_on_sUse positive values for dry forecast error or dry-air ventilation risk; use 0 or negative when dew/RH risk dominates.
solar_precool_gain_f0..4FSolar ramp pressure that justifies cooling lead before peak heat.Tightens stage-2 cooling and fan readiness before high solar load arrives.cool_stage2_over_high_f, sw_cool_all_fans_at_high_enabledRaise during steep solar ramps or known lag; lower after shade/clouds or evening recovery.
thermal_lead_time_min0..90 minHow early forecast preconditioning may begin.Planner audit context for lead timing; firmware safety and dispatcher timing still gate actuation.audit context onlySet to the intended lead window for the segment hypothesis; it documents forecast timing even when no direct Tier 1 knob changes.
economizer_temp_advantage_f1..15FOutdoor temperature advantage needed before vent cooling is attractive.Materializes to vent preference and cold-vent guard thresholds.vent_prefer_temp_delta_f, cold_vent_guard_delta_fLower when outside air can cool without cold shock; raise when cold-slug or oscillation risk is high.
economizer_dewpoint_advantage_f1..15FOutdoor dewpoint advantage needed before dry-air decisions are attractive.Materializes to dewpoint preference for vent/dehumidification choices.vent_prefer_dp_delta_fLower when outdoor air is safely drier and dehumidification is needed; raise when dry ventilation would worsen VPD stress.
moisture_engage_vpd_excess_kpa0..0.5 kPaHow far above dispatcher-owned vpd_high VPD may rise before mister assist is eligible.Materializes targeted mister and direct-wet thresholds relative to the active dispatcher VPD band.direct_wet_stress_vpd_margin_kpa, mister_engage_kpaKeep near 0.05 kPa when VPD compliance is the bottleneck; raise only to conserve water after recovery is proven.
all_zone_vpd_excess_kpa0.05..0.8 kPaHow far above dispatcher-owned vpd_high VPD may rise before all-zone mister rotation is eligible.Materializes the all-zone mister escalation threshold relative to the active dispatcher VPD band without forcing fog earlier.mister_all_kpaKeep near 0.20-0.30 kPa during hot/dry recovery; raise when water use is high without VPD improvement or wetting risk is active.
mist_duty_limit_pct0..100%Maximum climate-misting duty allowed during the segment.Materializes mister pulse duration, wet aggression, and resource budget gates.mister_pulse_on_s, mister_pulse_gap_s, mister_vpd_weight, sw_direct_wet_stress_override_enabledRaise during hot/dry recovery windows with safe dew margin; lower for disease risk, occupancy, or resource conservation.
fog_escalate_vpd_excess_kpa0.1..0.8 kPaHow far above dispatcher-owned vpd_high VPD may rise before fog assist is eligible.Materializes fog escalation relative to the active VPD band, independently from all-zone mist rotation.fog_escalation_kpaUse lower values when VPD is repeatedly above band during ventilation and fog is safe; use higher values when fog overshoot or disease risk is the constraint.
dew_margin_floor_f3..15FMinimum indoor air temperature minus dew point for wet climate actions.Materializes fog/direct-wet dew margin floors and blocks condensation-risk wetting.direct_wet_stress_min_dew_margin_f, fog_stress_min_dew_margin_fKeep conservative at night or near leaf-wetness risk; do not lower it just to chase VPD compliance.
wet_cutoff_hour17..24Latest local hour for climate wetting in this segment.Materializes fog and direct-wet latest-hour limits.direct_wet_stress_latest_hour, fog_stress_window_latest_hour, sw_fog_stress_window_extend_enabledExtend only when dry recovery is worth evening wetting risk and dew margin remains healthy.
daily_mist_budget_gal0..300 galDaily climate-water budget for mister use.Materializes the firmware mister water budget.mister_water_budget_galBudget water according to forecast stress and recent usage; use 0 only when wet actions should be unavailable.
resource_sensitivity0..1Preference for conserving water/electricity after safety and band compliance.Lengthens off dwell and reduces wet/cooling aggression when compliance allows it.mister_pulse_gap_s, min_fog_off_s, min_fog_on_s, cool_stage2_over_high_f, sw_direct_wet_stress_override_enabledRaise only after safety and compliance are stable; lower when temp or VPD is outside band.
relay_churn_penalty0..1Preference for holding stable actions instead of changing modes frequently.Materializes hysteresis, dwell, and mist delay values.cool_exit_hysteresis_f, temp_hysteresis, vpd_hysteresis, vpd_watch_dwell_s, dwell_gate_ms, mister_engage_delay_s, mister_all_delay_sRaise when mode churn or relay wear is the observed failure; lower when response lag is missing compliance windows.

Dispatcher-Owned Climate Targets

The planner receives these target values as read-only prompt context. They are derived from crop profiles and dispatcher policy, and the target delta columns are signed actual - target metrics for graphing and mode diagnosis.

Controller priority is safety rails first, then temperature compliance, then VPD compliance, then resource use. When VPD is above the dispatcher-owned band and dew/occupancy rails are safe, resource minimization must not close wet/fog assist; ClimateIntent should make moisture assist available near the active VPD high edge until target deltas recover.

AxisLowTargetHighActualActual - target
Temp F59.364.369.366.432.13
VPD kPa0.210.4850.760.9920.507

Latest sample: 2026-07-03T09:19:18.064988+00:00; mode VENTILATE.

ClimateIntent Materialization Contract

Routine set_plan calls emit bounded climate_intent transitions. MCP validates that semantic surface, materializes it into the low-level Tier 1 rows below, and stores the original intent in plan_journal.climate_intents.

ParameterActiveFuture rowsLast dispatch7d confirmedPlanner instruction
band_track_fraction0.2502026-06-23 17:21Z-Materialized Tier 1 field. Routine set_plan writes must use bounded climate_intent; MCP derives this low-level row.
cold_vent_guard_delta_f902026-06-26 18:32Z1/1Planner-policy tunable. Raise for cold-slug risk, lower when outdoor exchange is useful and temperature headroom is healthy.
cool_exit_hysteresis_f1.6902026-06-26 18:32Z2/2Planner-policy tunable. Lower values clear VENTILATE sooner; higher values hold cooling longer after hot stress. Keep dew/VPD effects in the hypothesis.
cool_stage2_exit_hysteresis_f102026-06-23 17:21Z-Materialized Tier 1 field. Routine set_plan writes must use bounded climate_intent; MCP derives this low-level row.
cool_stage2_over_high_f002026-07-03 09:09Z28/28Planner-policy tunable. On hot or high-solar days, use 0.5-1.0 F so fan2 helps near the high edge; relax after recovery to reduce fan wear.
direct_wet_stress_latest_hour2202026-06-15 23:55Z-Planner-policy latest-hour cap. Use the earliest hour that covers the dry recovery window, then back out after VPD recovers.
direct_wet_stress_min_dew_margin_f802026-06-23 17:21Z-Planner-policy safety gate. Use 8 F or higher unless disease-risk evidence justifies a stricter margin; never lower to chase compliance blindly.
direct_wet_stress_vpd_margin_kpa0.0502026-06-23 17:21Z-Planner-policy tunable. Keep low, around 0.05-0.15 kPa, when late dry recovery needs direct wetting; raise it to reserve override for stronger dry stress.
dwell_gate_ms22500002026-06-26 18:32Z2/2Materialized Tier 1 field. Routine set_plan writes must use bounded climate_intent; MCP derives this low-level row.
enthalpy_close102026-06-23 17:21Z-Materialized Tier 1 field. Routine set_plan writes must use bounded climate_intent; MCP derives this low-level row.
enthalpy_open-202026-06-23 17:21Z-Materialized Tier 1 field. Routine set_plan writes must use bounded climate_intent; MCP derives this low-level row.
fog_escalation_kpa0.1502026-06-26 18:32Z2/2Planner-policy tunable. During VPD-high or near-edge VENTILATE stress with healthy dew margin, use 0.15-0.20 in hot/dry venting, 0.25-0.30 for mild dry stress, and reserve 0.35-0.50 for VPD-low overshoot, dew risk, or resource limits.
heat_hysteresis1.102026-06-23 17:21Z-Materialized Tier 1 field. Routine set_plan writes must use bounded climate_intent; MCP derives this low-level row.
min_fog_off_s4802026-07-01 21:07Z9/11Planner-policy tunable. During VPD-high or near-edge VENTILATE stress with healthy dew margin, use shorter delays/gaps so ventilation can cool while misting protects VPD.
min_fog_on_s7502026-06-25 06:29Z-Materialized Tier 1 field. Routine set_plan writes must use bounded climate_intent; MCP derives this low-level row.
mist_backoff_s60002026-06-23 17:21Z-Materialized Tier 1 field. Routine set_plan writes must use bounded climate_intent; MCP derives this low-level row.
mist_max_closed_vent_s12002026-06-23 17:21Z-Materialized Tier 1 field. Routine set_plan writes must use bounded climate_intent; MCP derives this low-level row.
mist_thermal_relief_s9002026-06-23 17:21Z-Materialized Tier 1 field. Routine set_plan writes must use bounded climate_intent; MCP derives this low-level row.
mister_all_delay_s79.502026-06-26 18:32Z2/2Planner-policy tunable. During VPD-high or near-edge VENTILATE stress with healthy dew margin, use shorter delays/gaps so ventilation can cool while misting protects VPD.
mister_all_kpa1.102026-07-03 06:21Z83/89Planner-policy tunable. During VPD-high or near-edge VENTILATE stress with healthy dew margin, keep near max(1.0, vpd_high + 0.25) so all-zone mist assist can engage; high absolute values disable escalation.
mister_engage_delay_s39.7502026-06-26 18:38Z3/3Planner-policy tunable. During VPD-high or near-edge VENTILATE stress with healthy dew margin, use shorter delays/gaps so ventilation can cool while misting protects VPD.
mister_engage_kpa0.9502026-07-03 09:10Z144/171Planner-policy tunable. During VPD-high or near-edge VENTILATE stress with healthy dew margin, keep near active vpd_high + 0.05; values near 2.5 suppress wet assist and should be reserved for dew/occupancy/irrigation/water-cap constraints.
mister_pulse_gap_s26.2502026-06-27 12:03Z66/67Planner-policy tunable. During VPD-high or near-edge VENTILATE stress with healthy dew margin, use shorter delays/gaps so ventilation can cool while misting protects VPD.
mister_pulse_on_s9002026-07-03 08:19Z22/22Materialized Tier 1 field. Routine set_plan writes must use bounded climate_intent; MCP derives this low-level row.
mister_vpd_weight2.502026-06-27 12:03Z4/4Materialized Tier 1 field. Routine set_plan writes must use bounded climate_intent; MCP derives this low-level row.
mister_water_budget_gal30002026-06-26 18:38Z3/3Materialized Tier 1 field. Routine set_plan writes must use bounded climate_intent; MCP derives this low-level row.
night_vpd_bias_kpa002026-06-23 17:21Z-Materialized Tier 1 field. Routine set_plan writes must use bounded climate_intent; MCP derives this low-level row.
outdoor_staleness_max_s60002026-06-23 17:21Z-Materialized Tier 1 field. Routine set_plan writes must use bounded climate_intent; MCP derives this low-level row.
sw_cool_all_fans_at_high_enabled102026-07-03 09:09Z28/28Planner-policy switch. Enable only for forecast-backed heat stress windows where one-fan ventilation has been insufficient; disable after the window.
sw_direct_wet_stress_override_enabled102026-06-07 13:34Z-Planner-policy switch. Enable only for VPD-high evening recovery when normal direct-wet drydown is blocking water and dew margin is safely above the configured floor.
sw_dwell_gate_enabled102026-06-07 17:07Z-Materialized Tier 1 field. Routine set_plan writes must use bounded climate_intent; MCP derives this low-level row.
sw_fog_closes_vent102026-06-07 17:07Z-Materialized Tier 1 field. Routine set_plan writes must use bounded climate_intent; MCP derives this low-level row.
sw_mister_closes_vent002026-06-07 17:07Z-Materialized Tier 1 field. Routine set_plan writes must use bounded climate_intent; MCP derives this low-level row.
sw_summer_vent_enabled102026-06-07 17:07Z-Materialized Tier 1 field. Routine set_plan writes must use bounded climate_intent; MCP derives this low-level row.
temp_hysteresis1.6902026-06-26 18:38Z3/3Materialized Tier 1 field. Routine set_plan writes must use bounded climate_intent; MCP derives this low-level row.
vent_exchange_fraction0.302026-06-23 17:21Z-Materialized Tier 1 field. Routine set_plan writes must use bounded climate_intent; MCP derives this low-level row.
vent_prefer_dp_delta_f302026-06-25 11:59Z-Materialized Tier 1 field. Routine set_plan writes must use bounded climate_intent; MCP derives this low-level row.
vent_prefer_temp_delta_f502026-06-26 18:38Z2/2Materialized Tier 1 field. Routine set_plan writes must use bounded climate_intent; MCP derives this low-level row.
vpd_hysteresis0.19302026-06-26 18:38Z3/3Materialized Tier 1 field. Routine set_plan writes must use bounded climate_intent; MCP derives this low-level row.
vpd_watch_dwell_s56.2502026-06-26 18:44Z4/4Materialized Tier 1 field. Routine set_plan writes must use bounded climate_intent; MCP derives this low-level row.

Findings That Matter

  • mister_engage_kpa is effectful, but it is not the state-machine entry trigger. Firmware enters humidification from vpd_high plus vpd_watch_dwell_s; mister_engage_kpa gates physical S1 mister pulses once SEALED_MIST or explicit VENTILATE assist creates humidity demand. Zone stress can choose the pulse target or satisfy the S1 stress check, but it cannot create a standalone mister mode.
  • mister_all_kpa controls physical all-zone mister rotation. The header mist-stage delay also uses mister_all_delay_s; fog escalation uses fog_escalation_kpa independently.
  • The planner tunes moisture intensity, not the crop band. In VENTILATE, dry outside air can keep temperature in band while pushing VPD high, so moisture thresholds must stay coupled to the active vpd_high unless dew-risk evidence justifies suppression.
  • High mister_engage_kpa/mister_all_kpa values are not resource-neutral during VPD-high stress; they can close the wet-assist path. Save them for dew, occupancy, irrigation, or water-cap constraints.
  • Reserved/no-op values are intentionally not planner-pushable: bias_cool, bias_heat, d_cool_stage_2, d_heat_stage_2, fan_burst_min, fog_burst_min, mist_vent_close_lead_s, mist_vent_reopen_delay_s, mister_all_off_s, mister_all_on_s, mister_max_runtime_min, mister_off_s, mister_on_s, summer_vent_min_runtime_s, sw_fsm_controller_enabled, vent_bypass_min.
  • Readback-only values are now registry-covered but not planner-pushable: fallback_window_s, outdoor_temp_f, outdoor_dewpoint_f.

Clamp Activity (last 30 days)

When the AI planning agent pushes a setpoint outside the active band or a guardrail floor/ceiling, the dispatcher clamps it before it reaches the ESP32 and records the event in setpoint_clamps. A high clamp count means the planner is repeatedly asking for a value the band/guardrail layer will not honor; for moisture knobs that usually means aggressive VPD-hold misting is being capped. These rows are sourced from setpoint_clamps grouped by parameter; the dispatcher also feeds them to the planner each cycle through scripts/gather-plan-context.sh.

ParameterClamps 30dClamps 24hAvg requestedAvg appliedLatest reasonLast clamp
irrig_center_days_mask8094279127127planner_param_not_pushable2026-07-03 09:15Z (5m)
irrig_center_fert_days_mask8094279127127planner_param_not_pushable2026-07-03 09:15Z (5m)
irrig_wall_days_mask8094279127127planner_param_not_pushable2026-07-03 09:15Z (5m)
irrig_wall_fert_days_mask8094279127127planner_param_not_pushable2026-07-03 09:15Z (5m)
sw_economiser_enabled707027900planner_param_not_pushable2026-07-03 09:15Z (5m)
mister_engage_kpa1139641.080.968vpd_high_moisture_guardrail2026-07-03 09:15Z (5m)
mister_all_kpa1068591.2771.17vpd_high_moisture_guardrail2026-07-03 09:15Z (5m)
mister_pulse_gap_s709041.29130vpd_high_moisture_guardrail2026-06-26 18:22Z (6d)
fog_escalation_kpa43700.2780.186vpd_high_moisture_guardrail2026-06-25 22:58Z (7d)
min_fog_off_s434079.57157.408vpd_high_moisture_guardrail2026-07-01 21:01Z (1d)
mister_all_delay_s199096.68690vpd_high_moisture_guardrail2026-06-25 20:24Z (7d)
mister_engage_delay_s199048.34345vpd_high_moisture_guardrail2026-06-25 20:24Z (7d)
mister_center_penalty400.350.35planner_param_not_pushable2026-06-16 00:41Z (17d)

Parameter Index

This is the public contract table for every registered tunable. The row-level implementation dump is still generated for operations, but the public page keeps the reading path compact.

Activity and direct-wet gates

ParameterClassOwnerDefault / boundsActiveReadbackRouteClamps 30dPlanner status
activity_duration_mincontroller_safetydispatcher defaultdefault 1440; 0 to 1440-780 (1m)readback only; firmware refs 16-MCP rejects planner writes; controller safety context
activity_start_hourcontroller_safetydispatcher defaultdefault 6; 0 to 23-6 (1m)readback only; firmware refs 16-MCP rejects planner writes; controller safety context
activity_start_minutecontroller_safetydispatcher defaultdefault 0; 0 to 59-0 (1m)readback only; firmware refs 28-MCP rejects planner writes; controller safety context
direct_wet_center_drydown_before_off_minscheduled_policyscheduledefault 0; 0 to 720-180 (1m)readback only; firmware refs 10-MCP rejects planner writes; scheduled policy
direct_wet_center_start_offset_minscheduled_policyscheduledefault 0; 0 to 720-120 (1m)readback only; firmware refs 10-MCP rejects planner writes; scheduled policy
direct_wet_min_temp_fscheduled_policyscheduledefault 0; 0 to 90-65 (1m)readback only; firmware refs 14-MCP rejects planner writes; scheduled policy
direct_wet_south_drydown_before_off_minscheduled_policyscheduledefault 0; 0 to 720-120 (1m)readback only; firmware refs 10-MCP rejects planner writes; scheduled policy
direct_wet_south_start_offset_minscheduled_policyscheduledefault 0; 0 to 720-60 (1m)readback only; firmware refs 10-MCP rejects planner writes; scheduled policy
direct_wet_stress_latest_hourplanner_policyplannerdefault 22; 17 to 242222 (17d)readback only-materialized from climate_intent for routine set_plan
direct_wet_stress_min_dew_margin_fplanner_policyplannerdefault 8; 3 to 1588 (1m)readback only; firmware refs 12-materialized from climate_intent for routine set_plan
direct_wet_stress_vpd_margin_kpaplanner_policyplannerdefault 0.05; 0 to 0.50.050.05 (1m)readback only; firmware refs 11-materialized from climate_intent for routine set_plan
direct_wet_wall_drydown_before_off_minscheduled_policyscheduledefault 0; 0 to 720-120 (1m)readback only; firmware refs 9-MCP rejects planner writes; scheduled policy
direct_wet_wall_start_offset_minscheduled_policyscheduledefault 0; 0 to 720-60 (1m)readback only; firmware refs 9-MCP rejects planner writes; scheduled policy
direct_wet_west_drydown_before_off_minscheduled_policyscheduledefault 0; 0 to 720-120 (1m)readback only; firmware refs 10-MCP rejects planner writes; scheduled policy
direct_wet_west_start_offset_minscheduled_policyscheduledefault 0; 0 to 720-60 (1m)readback only; firmware refs 10-MCP rejects planner writes; scheduled policy
sw_direct_wet_gate_enabledplanner_policyplannerdefault 1; switch 0/1-1 (1m)readback only; firmware refs 16-set_tunable allowed; planner may write with a hypothesis

Band

ParameterClassOwnerDefault / boundsActiveReadbackRouteClamps 30dPlanner status
band_temp_high_midcrop_bandbanddefault 70.71; 40 to 100-- (-)static route; firmware refs 5-MCP rejects planner writes; dispatcher/crop-band owned
band_temp_high_smcrop_bandbanddefault 83.79; 40 to 100-- (-)static route; firmware refs 5-MCP rejects planner writes; dispatcher/crop-band owned
band_temp_high_srcrop_bandbanddefault 72.5; 40 to 100-- (-)static route; firmware refs 5-MCP rejects planner writes; dispatcher/crop-band owned
band_temp_high_sscrop_bandbanddefault 82; 40 to 100-- (-)static route; firmware refs 5-MCP rejects planner writes; dispatcher/crop-band owned
band_temp_low_midcrop_bandbanddefault 60.71; 40 to 100-- (-)static route; firmware refs 5-MCP rejects planner writes; dispatcher/crop-band owned
band_temp_low_smcrop_bandbanddefault 73.79; 40 to 100-- (-)static route; firmware refs 5-MCP rejects planner writes; dispatcher/crop-band owned
band_temp_low_srcrop_bandbanddefault 62.5; 40 to 100-- (-)static route; firmware refs 5-MCP rejects planner writes; dispatcher/crop-band owned
band_temp_low_sscrop_bandbanddefault 72; 40 to 100-- (-)static route; firmware refs 5-MCP rejects planner writes; dispatcher/crop-band owned
band_vpd_high_midcrop_bandbanddefault 1.168; 0.1 to 3-- (-)static route; firmware refs 5-MCP rejects planner writes; dispatcher/crop-band owned
band_vpd_high_smcrop_bandbanddefault 1.292; 0.1 to 3-- (-)static route; firmware refs 5-MCP rejects planner writes; dispatcher/crop-band owned
band_vpd_high_srcrop_bandbanddefault 1.185; 0.1 to 3-- (-)static route; firmware refs 5-MCP rejects planner writes; dispatcher/crop-band owned
band_vpd_high_sscrop_bandbanddefault 1.275; 0.1 to 3-- (-)static route; firmware refs 5-MCP rejects planner writes; dispatcher/crop-band owned
band_vpd_low_midcrop_bandbanddefault 0.738; 0.1 to 3-- (-)static route; firmware refs 5-MCP rejects planner writes; dispatcher/crop-band owned
band_vpd_low_smcrop_bandbanddefault 0.862; 0.1 to 3-- (-)static route; firmware refs 5-MCP rejects planner writes; dispatcher/crop-band owned
band_vpd_low_srcrop_bandbanddefault 0.755; 0.1 to 3-- (-)static route; firmware refs 5-MCP rejects planner writes; dispatcher/crop-band owned
band_vpd_low_sscrop_bandbanddefault 0.845; 0.1 to 3-- (-)static route; firmware refs 5-MCP rejects planner writes; dispatcher/crop-band owned
dawn_boost_offset_mincrop_bandbanddefault 60; 0 to 360-60 (2d)readback only; firmware refs 12-MCP rejects planner writes; dispatcher/crop-band owned
manual_override_timeout_mincrop_bandbanddefault 10; 1 to 120-10 (2d)readback only; firmware refs 8-MCP rejects planner writes; dispatcher/crop-band owned
midday_boost_offset_mincrop_bandbanddefault 60; -240 to 240-60 (2d)readback only; firmware refs 13-MCP rejects planner writes; dispatcher/crop-band owned
wet_taper_before_sunset_mincrop_bandbanddefault 120; 0 to 480-120 (2d)readback only; firmware refs 10-MCP rejects planner writes; dispatcher/crop-band owned
zone_priority_centercrop_bandbanddefault 1; 1 to 4-1 (2d)readback only; firmware refs 10-MCP rejects planner writes; dispatcher/crop-band owned
zone_priority_eastcrop_bandbanddefault 4; 1 to 4-4 (2d)readback only; firmware refs 10-MCP rejects planner writes; dispatcher/crop-band owned
zone_priority_southcrop_bandbanddefault 2; 1 to 4-2 (2d)readback only; firmware refs 10-MCP rejects planner writes; dispatcher/crop-band owned
zone_priority_westcrop_bandbanddefault 3; 1 to 4-3 (2d)readback only; firmware refs 10-MCP rejects planner writes; dispatcher/crop-band owned
zone_vpd_width_above_centercrop_bandbanddefault 0.35; 0.02 to 1-- (-)static route; firmware refs 6-MCP rejects planner writes; dispatcher/crop-band owned
zone_vpd_width_above_eastcrop_bandbanddefault 0.23; 0.02 to 1-- (-)static route; firmware refs 6-MCP rejects planner writes; dispatcher/crop-band owned
zone_vpd_width_above_southcrop_bandbanddefault 0.22; 0.02 to 1-- (-)static route; firmware refs 6-MCP rejects planner writes; dispatcher/crop-band owned
zone_vpd_width_above_westcrop_bandbanddefault 0.22; 0.02 to 1-- (-)static route; firmware refs 6-MCP rejects planner writes; dispatcher/crop-band owned
zone_vpd_width_below_centercrop_bandbanddefault 0.2; 0.02 to 1-- (-)static route; firmware refs 6-MCP rejects planner writes; dispatcher/crop-band owned
zone_vpd_width_below_eastcrop_bandbanddefault 0.15; 0.02 to 1-- (-)static route; firmware refs 6-MCP rejects planner writes; dispatcher/crop-band owned
zone_vpd_width_below_southcrop_bandbanddefault 0.18; 0.02 to 1-- (-)static route; firmware refs 6-MCP rejects planner writes; dispatcher/crop-band owned
zone_vpd_width_below_westcrop_bandbanddefault 0.16; 0.02 to 1-- (-)static route; firmware refs 6-MCP rejects planner writes; dispatcher/crop-band owned

Controller gates

ParameterClassOwnerDefault / boundsActiveReadbackRouteClamps 30dPlanner status
dwell_gate_msplanner_policyplannerdefault 300000; 60000 to 1800000225000225000 (1m)confirmed; firmware refs 10-materialized from climate_intent for routine set_plan
sw_arbiter_zone_enabledcontroller_safetyoperatordefault 0; switch 0/1-0 (1m)readback only; firmware refs 24-MCP rejects planner writes; controller safety context
sw_dawn_rehydrate_enabledreadback_contextfirmware internaldefault 1; switch 0/1-1 (1m)readback only; firmware refs 22-MCP rejects planner writes; readback context only
sw_direct_wet_stress_override_enabledplanner_policyplannerdefault 0; switch 0/111 (1m)readback only; firmware refs 15-materialized from climate_intent for routine set_plan
sw_dwell_gate_enabledplanner_policyplannerdefault 0; switch 0/111 (1m)readback only; firmware refs 22-materialized from climate_intent for routine set_plan
sw_fsm_controller_enabledretiredoperatordefault 1; switch 0/1-1 (1m)reserved; firmware refs 30-MCP rejects planner writes; reserved/no-op
sw_gl_grow_auto_modescheduled_policyscheduledefault 1; switch 0/1-1 (1m)readback only; firmware refs 2-MCP rejects planner writes; scheduled policy
sw_gl_grow_out_of_servicecontroller_safetyoperatordefault 0; switch 0/1-0 (1m)readback only; firmware refs 15-MCP rejects planner writes; controller safety context
sw_gl_grow_solar_phasingscheduled_policyscheduledefault 0; switch 0/1-0 (1m)readback only; firmware refs 14-MCP rejects planner writes; scheduled policy
sw_gl_main_auto_modescheduled_policyscheduledefault 1; switch 0/1-1 (1m)readback only; firmware refs 2-MCP rejects planner writes; scheduled policy
sw_gl_main_out_of_servicecontroller_safetyoperatordefault 0; switch 0/1-0 (1m)readback only; firmware refs 15-MCP rejects planner writes; controller safety context
sw_gl_main_solar_phasingscheduled_policyscheduledefault 0; switch 0/1-0 (1m)readback only; firmware refs 15-MCP rejects planner writes; scheduled policy
sw_midday_drench_enabledreadback_contextfirmware internaldefault 1; switch 0/1-1 (1m)readback only; firmware refs 22-MCP rejects planner writes; readback context only
sw_night_humidity_source_presentreadback_contextfirmware internaldefault 0; switch 0/1-0 (17d)readback only-MCP rejects planner writes; readback context only
sw_occupancy_inhibitcontroller_safetyoperatordefault 1; switch 0/1-- (-)static route; firmware refs 13-MCP rejects planner writes; controller safety context
sw_overnight_micropulse_enabledreadback_contextfirmware internaldefault 1; switch 0/1-1 (17d)readback only-MCP rejects planner writes; readback context only

Economiser

ParameterClassOwnerDefault / boundsActiveReadbackRouteClamps 30dPlanner status
econ_heat_margin_fcontroller_safetyplannerdefault 5; 1 to 15-5 (1m)readback only; firmware refs 7-MCP rejects planner writes; controller safety context
enthalpy_closeplanner_policyplannerdefault 1; -5 to 2011 (1m)readback only; firmware refs 9-materialized from climate_intent for routine set_plan
enthalpy_openplanner_policyplannerdefault -2; -5 to 0-2-2 (1m)readback only; firmware refs 9-materialized from climate_intent for routine set_plan
site_pressure_hpacontroller_safetyoperatordefault 840; 700 to 1100-840 (1m)readback only; firmware refs 7-MCP rejects planner writes; controller safety context
sw_economiser_enabledcontroller_safetyoperatordefault 1; switch 0/10- (-)static route; firmware refs 117070 (5m)MCP rejects planner writes; controller safety context

Firmware Internal

ParameterClassOwnerDefault / boundsActiveReadbackRouteClamps 30dPlanner status
dawn_rehydrate_gap_sreadback_contextfirmware internaldefault 20; 5 to 600-20 (1m)readback only; firmware refs 18-MCP rejects planner writes; readback context only
dawn_rehydrate_on_sreadback_contextfirmware internaldefault 90; 1 to 600-90 (1m)readback only; firmware refs 18-MCP rejects planner writes; readback context only
dawn_rehydrate_start_minutereadback_contextfirmware internaldefault 0; 0 to 59-0 (17d)readback only-MCP rejects planner writes; readback context only
dawn_rehydrate_window_minreadback_contextfirmware internaldefault 12; 0 to 120-12 (1m)readback only; firmware refs 9-MCP rejects planner writes; readback context only
feed_end_hourreadback_contextfirmware internaldefault 9; 0 to 23-9 (1m)readback only; firmware refs 17-MCP rejects planner writes; readback context only
feed_start_hourreadback_contextfirmware internaldefault 6; 0 to 23-6 (1m)readback only; firmware refs 17-MCP rejects planner writes; readback context only
micropulse_max_on_sreadback_contextfirmware internaldefault 5; 1 to 10-5 (17d)readback only-MCP rejects planner writes; readback context only
micropulse_min_dew_margin_freadback_contextfirmware internaldefault 6; 3 to 15-6 (17d)readback only-MCP rejects planner writes; readback context only
micropulse_min_gap_sreadback_contextfirmware internaldefault 600; 60 to 3600-600 (17d)readback only-MCP rejects planner writes; readback context only
micropulse_vpd_ceilingreadback_contextfirmware internaldefault 1.25; 0.8 to 3-1.25 (17d)readback only-MCP rejects planner writes; readback context only
midday_drench_gap_sreadback_contextfirmware internaldefault 25; 5 to 600-25 (1m)readback only; firmware refs 18-MCP rejects planner writes; readback context only
midday_drench_hourreadback_contextfirmware internaldefault 14; 0 to 23-14 (17d)readback only; firmware refs 1-MCP rejects planner writes; readback context only
midday_drench_on_sreadback_contextfirmware internaldefault 120; 1 to 600-120 (1m)readback only; firmware refs 18-MCP rejects planner writes; readback context only
midday_drench_start_minutereadback_contextfirmware internaldefault 0; 0 to 59-0 (17d)readback only-MCP rejects planner writes; readback context only
midday_drench_window_minreadback_contextfirmware internaldefault 11; 0 to 120-11 (1m)readback only; firmware refs 9-MCP rejects planner writes; readback context only

Fog gates

ParameterClassOwnerDefault / boundsActiveReadbackRouteClamps 30dPlanner status
fog_burst_minretiredoperatordefault 10; 1 to 60-8 (1m)reserved; firmware refs 9-MCP rejects planner writes; reserved/no-op
fog_escalation_kpaplanner_policyplannerdefault 0.4; 0.1 to 0.50.150.15 (1m)confirmed; firmware refs 9437 (7d)materialized from climate_intent for routine set_plan
fog_min_temp_fcontroller_safetyoperatordefault 55; 40 to 65-55 (1m)readback only; firmware refs 6-MCP rejects planner writes; controller safety context
fog_rh_ceiling_pctcontroller_safetyoperatordefault 90; 75 to 98-90 (1m)readback only; firmware refs 6-MCP rejects planner writes; controller safety context
fog_time_window_endcontroller_safetyplannerdefault 18; 14 to 20-17 (17d)readback only-MCP rejects planner writes; controller safety context
fog_time_window_startcontroller_safetyplannerdefault 6; 5 to 12-7 (17d)readback only-MCP rejects planner writes; controller safety context
min_fog_off_splanner_policyplannerdefault 60; 15 to 3004848 (1m)9/11 confirmed; firmware refs 14434 (1d)materialized from climate_intent for routine set_plan
min_fog_on_splanner_policyplannerdefault 60; 15 to 3007575 (1m)readback only; firmware refs 14-materialized from climate_intent for routine set_plan
sw_fog_closes_ventplanner_policyplannerdefault 1; switch 0/111 (1m)readback only; firmware refs 18-materialized from climate_intent for routine set_plan

Grow lights

ParameterClassOwnerDefault / boundsActiveReadbackRouteClamps 30dPlanner status
gl_dli_targetcontroller_safetyplannerdefault 14; 1 to 50-- (-)static route; firmware refs 5-MCP rejects planner writes; controller safety context
gl_grow_dli_targetcontroller_safetydispatcher defaultdefault 14; 1 to 50-21 (1m)readback only; firmware refs 8-MCP rejects planner writes; controller safety context
gl_grow_lux_hysteresisscheduled_policyscheduledefault 8000; 0 to 25000-8000 (1m)confirmed; firmware refs 9-MCP rejects planner writes; scheduled policy
gl_grow_lux_thresholdscheduled_policyscheduledefault 40000; 100 to 100000-40000 (1m)confirmed; firmware refs 9-MCP rejects planner writes; scheduled policy
gl_grow_min_off_sscheduled_policyscheduledefault 60; 0 to 3600-60 (1m)readback only; firmware refs 17-MCP rejects planner writes; scheduled policy
gl_grow_min_on_sscheduled_policyscheduledefault 120; 0 to 3600-120 (1m)readback only; firmware refs 17-MCP rejects planner writes; scheduled policy
gl_grow_sunrise_hourscheduled_policyscheduledefault 7; 0 to 23-6 (1m)readback only; firmware refs 9-MCP rejects planner writes; scheduled policy
gl_grow_sunrise_offset_minscheduled_policyscheduledefault 0; -1440 to 1440-0 (1m)readback only; firmware refs 9-MCP rejects planner writes; scheduled policy
gl_grow_sunset_hourscheduled_policyscheduledefault 19; 0 to 23-21 (1m)readback only; firmware refs 9-MCP rejects planner writes; scheduled policy
gl_grow_sunset_offset_minscheduled_policyscheduledefault 0; -1440 to 1440-0 (1m)readback only; firmware refs 9-MCP rejects planner writes; scheduled policy
gl_grow_target_light_minutesscheduled_policyscheduledefault 960; 0 to 1080-900 (1m)readback only; firmware refs 9-MCP rejects planner writes; scheduled policy
gl_lux_hysteresiscontroller_safetydispatcher defaultdefault 1500; 0 to 10000-1500 (1m)readback only; firmware refs 7-MCP rejects planner writes; controller safety context
gl_lux_thresholdcontroller_safetydispatcher defaultdefault 3000; 100 to 50000-- (-)static route; firmware refs 5-MCP rejects planner writes; controller safety context
gl_main_dli_targetcontroller_safetydispatcher defaultdefault 14; 1 to 50-13 (1m)readback only; firmware refs 8-MCP rejects planner writes; controller safety context
gl_main_lux_hysteresisscheduled_policyscheduledefault 8000; 0 to 25000-8000 (1m)confirmed; firmware refs 9-MCP rejects planner writes; scheduled policy
gl_main_lux_thresholdscheduled_policyscheduledefault 40000; 100 to 100000-40000 (1m)confirmed; firmware refs 10-MCP rejects planner writes; scheduled policy
gl_main_min_off_sscheduled_policyscheduledefault 60; 0 to 3600-60 (1m)readback only; firmware refs 17-MCP rejects planner writes; scheduled policy
gl_main_min_on_sscheduled_policyscheduledefault 120; 0 to 3600-120 (1m)readback only; firmware refs 17-MCP rejects planner writes; scheduled policy
gl_main_sunrise_hourscheduled_policyscheduledefault 7; 0 to 23-6 (1m)readback only; firmware refs 10-MCP rejects planner writes; scheduled policy
gl_main_sunrise_offset_minscheduled_policyscheduledefault 0; -1440 to 1440-0 (1m)readback only; firmware refs 9-MCP rejects planner writes; scheduled policy
gl_main_sunset_hourscheduled_policyscheduledefault 19; 0 to 23-19 (1m)readback only; firmware refs 10-MCP rejects planner writes; scheduled policy
gl_main_sunset_offset_minscheduled_policyscheduledefault 0; -1440 to 1440-0 (1m)readback only; firmware refs 9-MCP rejects planner writes; scheduled policy
gl_main_target_light_minutesscheduled_policyscheduledefault 960; 0 to 1080-780 (1m)readback only; firmware refs 9-MCP rejects planner writes; scheduled policy
gl_sunrise_hourcontroller_safetyplannerdefault 7; 0 to 23-- (-)static route; firmware refs 6-MCP rejects planner writes; controller safety context
gl_sunset_hourcontroller_safetyplannerdefault 19; 0 to 23-- (-)static route; firmware refs 5-MCP rejects planner writes; controller safety context
sw_gl_auto_modecontroller_safetyoperatordefault 1; switch 0/1-- (-)static route-MCP rejects planner writes; controller safety context

Irrigation

ParameterClassOwnerDefault / boundsActiveReadbackRouteClamps 30dPlanner status
irrig_center_days_maskscheduled_policyscheduledefault 127; 0 to 127127127 (1m)readback only; firmware refs 98094 (5m)MCP rejects planner writes; scheduled policy
irrig_center_duration_mincontroller_safetyoperatordefault 10; 1 to 120-10 (1m)readback only; firmware refs 7-MCP rejects planner writes; controller safety context
irrig_center_fert_days_maskscheduled_policyscheduledefault 127; 0 to 127127127 (1m)readback only; firmware refs 108094 (5m)MCP rejects planner writes; scheduled policy
irrig_center_fert_duration_mincontroller_safetyoperatordefault 6; 0 to 60-6 (1m)readback only; firmware refs 7-MCP rejects planner writes; controller safety context
irrig_center_fert_every_ncontroller_safetyoperatordefault 0; 0 to 30-0 (1m)readback only; firmware refs 10-MCP rejects planner writes; controller safety context
irrig_center_flush_mincontroller_safetyoperatordefault 2; 0 to 30-2 (1m)readback only; firmware refs 8-MCP rejects planner writes; controller safety context
irrig_center_interval_dayscontroller_safetyoperatordefault 1; 1 to 14-1 (1m)readback only; firmware refs 7-MCP rejects planner writes; controller safety context
irrig_center_start_hourcontroller_safetyoperatordefault 10; 0 to 23-10 (1m)readback only; firmware refs 10-MCP rejects planner writes; controller safety context
irrig_center_start_mincontroller_safetyoperatordefault 30; 0 to 59-30 (1m)readback only; firmware refs 9-MCP rejects planner writes; controller safety context
irrig_vpd_boost_pctcontroller_safetyplannerdefault 25; 0 to 200-- (-)static route; firmware refs 6-MCP rejects planner writes; controller safety context
irrig_vpd_boost_threshold_hrscontroller_safetyplannerdefault 3; 0 to 24-- (-)static route; firmware refs 5-MCP rejects planner writes; controller safety context
irrig_wall_days_maskscheduled_policyscheduledefault 127; 0 to 127127127 (1m)readback only; firmware refs 98094 (5m)MCP rejects planner writes; scheduled policy
irrig_wall_duration_mincontroller_safetyoperatordefault 10; 1 to 120-10 (1m)readback only; firmware refs 7-MCP rejects planner writes; controller safety context
irrig_wall_fert_days_maskscheduled_policyscheduledefault 127; 0 to 127127127 (1m)readback only; firmware refs 108094 (5m)MCP rejects planner writes; scheduled policy
irrig_wall_fert_duration_mincontroller_safetyoperatordefault 6; 0 to 60-6 (1m)readback only; firmware refs 7-MCP rejects planner writes; controller safety context
irrig_wall_fert_every_ncontroller_safetyoperatordefault 0; 0 to 30-0 (1m)readback only; firmware refs 10-MCP rejects planner writes; controller safety context
irrig_wall_flush_mincontroller_safetyoperatordefault 2; 0 to 30-2 (1m)readback only; firmware refs 8-MCP rejects planner writes; controller safety context
irrig_wall_interval_dayscontroller_safetyoperatordefault 1; 1 to 14-1 (1m)readback only; firmware refs 7-MCP rejects planner writes; controller safety context
irrig_wall_start_hourcontroller_safetyoperatordefault 10; 0 to 23-10 (1m)readback only; firmware refs 9-MCP rejects planner writes; controller safety context
irrig_wall_start_mincontroller_safetyoperatordefault 30; 0 to 59-30 (1m)readback only; firmware refs 9-MCP rejects planner writes; controller safety context
sw_irrigation_center_enabledcontroller_safetyoperatordefault 1; switch 0/1-- (-)static route-MCP rejects planner writes; controller safety context
sw_irrigation_enabledcontroller_safetyoperatordefault 1; switch 0/1-- (-)static route-MCP rejects planner writes; controller safety context
sw_irrigation_wall_enabledcontroller_safetyoperatordefault 1; switch 0/1-- (-)static route-MCP rejects planner writes; controller safety context
sw_irrigation_weather_skipcontroller_safetyoperatordefault 0; switch 0/1-- (-)static route-MCP rejects planner writes; controller safety context

Misting and sealed-humidification

ParameterClassOwnerDefault / boundsActiveReadbackRouteClamps 30dPlanner status
mist_backoff_splanner_policyplannerdefault 600; 60 to 3600600600 (1m)readback only; firmware refs 20-materialized from climate_intent for routine set_plan
mist_max_closed_vent_splanner_policyplannerdefault 600; 120 to 900120120 (1m)readback only; firmware refs 14-materialized from climate_intent for routine set_plan
mist_thermal_relief_splanner_policyplannerdefault 90; 30 to 3009090 (1m)readback only; firmware refs 14-materialized from climate_intent for routine set_plan
mist_vent_close_lead_sretiredplannerdefault 15; 0 to 60-15 (1m)reserved; firmware refs 12-MCP rejects planner writes; reserved/no-op
mist_vent_reopen_delay_sretiredplannerdefault 45; 0 to 120-45 (1m)reserved; firmware refs 12-MCP rejects planner writes; reserved/no-op
mister_all_delay_splanner_policyplannerdefault 300; 60 to 60079.580 (1m)confirmed; firmware refs 16199 (7d)materialized from climate_intent for routine set_plan
mister_all_kpaplanner_policyplannerdefault 1.9; 1 to 2.51.11.01 (1m)83/89 confirmed; firmware refs 91068 (5m)materialized from climate_intent for routine set_plan
mister_all_off_sretiredplannerdefault 420; 120 to 600-- (-)reserved; firmware refs 8-MCP rejects planner writes; reserved/no-op
mister_all_on_sretiredplannerdefault 480; 120 to 600-- (-)reserved; firmware refs 8-MCP rejects planner writes; reserved/no-op
mister_center_penaltyplanner_policyplannerdefault 0.5; 0 to 10.350.35 (1m)readback only; firmware refs 94 (17d)set_tunable allowed; planner may write with a hypothesis
mister_engage_delay_splanner_policyplannerdefault 45; 30 to 30039.7540 (1m)confirmed; firmware refs 14199 (7d)materialized from climate_intent for routine set_plan
mister_engage_kpaplanner_policyplannerdefault 1.6; 0.5 to 2.50.950.81 (1m)144/171 confirmed; firmware refs 101139 (5m)materialized from climate_intent for routine set_plan
mister_max_runtime_minretiredplannerdefault 120; 5 to 480-- (-)reserved; firmware refs 6-MCP rejects planner writes; reserved/no-op
mister_min_off_splanner_policyplannerdefault 45; 30 to 1205050 (1m)readback only; firmware refs 24-set_tunable allowed; planner may write with a hypothesis
mister_off_sretiredplannerdefault 600; 120 to 900-- (-)reserved; firmware refs 8-MCP rejects planner writes; reserved/no-op
mister_on_sretiredplannerdefault 300; 60 to 600-- (-)reserved; firmware refs 8-MCP rejects planner writes; reserved/no-op
mister_pulse_gap_splanner_policyplannerdefault 45; 10 to 6026.2526 (1m)66/67 confirmed; firmware refs 16709 (6d)materialized from climate_intent for routine set_plan
mister_pulse_on_splanner_policyplannerdefault 60; 30 to 909090 (1m)confirmed; firmware refs 16-materialized from climate_intent for routine set_plan
mister_vpd_weightplanner_policyplannerdefault 1.5; 0.5 to 32.52.5 (1m)confirmed; firmware refs 10-materialized from climate_intent for routine set_plan
mister_water_budget_galplanner_policyplannerdefault 300; 100 to 300300300 (1m)confirmed; firmware refs 8-materialized from climate_intent for routine set_plan
sw_mister_closes_ventplanner_policyplannerdefault 0; switch 0/100 (1m)readback only; firmware refs 16-materialized from climate_intent for routine set_plan

Operator

ParameterClassOwnerDefault / boundsActiveReadbackRouteClamps 30dPlanner status
bias_coolretiredoperatordefault 0; -10 to 10-0 (1m)reserved; firmware refs 10-MCP rejects planner writes; reserved/no-op
bias_heatretiredoperatordefault 0; -10 to 10-0 (1m)reserved; firmware refs 10-MCP rejects planner writes; reserved/no-op
fan_burst_minretiredoperatordefault 10; 1 to 60-10 (1m)reserved; firmware refs 5-MCP rejects planner writes; reserved/no-op
vent_bypass_minretiredoperatordefault 10; 1 to 60-10 (1m)reserved; firmware refs 5-MCP rejects planner writes; reserved/no-op

Planner

ParameterClassOwnerDefault / boundsActiveReadbackRouteClamps 30dPlanner status
band_track_fractionplanner_policyplannerdefault 0.25; 0 to 10.250.25 (1m)readback only; firmware refs 9-materialized from climate_intent for routine set_plan
dehum_aggressive_kpacontroller_safetyplannerdefault 0.6; 0.05 to 1-0.6 (1m)readback only; firmware refs 13-MCP rejects planner writes; controller safety context
max_relief_cyclescontroller_safetyplannerdefault 3; 1 to 10-3 (1m)readback only; firmware refs 10-MCP rejects planner writes; controller safety context
night_vpd_bias_kpaplanner_policyplannerdefault 0; 0 to 0.2500 (1m)readback only; firmware refs 9-materialized from climate_intent for routine set_plan
vent_exchange_fractionplanner_policyplannerdefault 0.3; 0.1 to 0.60.30.3 (1m)readback only; firmware refs 10-materialized from climate_intent for routine set_plan
vent_latch_timeout_mscontroller_safetyplannerdefault 1800000; 60000 to 7200000-1800000 (1m)readback only; firmware refs 9-MCP rejects planner writes; controller safety context

Readback-only firmware inputs

ParameterClassOwnerDefault / boundsActiveReadbackRouteClamps 30dPlanner status
fallback_window_sreadback_contextfirmware internaldefault 900; 60 to 3600-3600 (1m)readback only; firmware refs 12-MCP rejects planner writes; readback context only
outdoor_dewpoint_freadback_contextfirmware internaldefault live; - to --45.704 (1m)readback only; firmware refs 2-MCP rejects planner writes; readback context only
outdoor_temp_freadback_contextfirmware internaldefault live; - to --66.002 (1m)readback only; firmware refs 9-MCP rejects planner writes; readback context only

Relay dwell and rotation

ParameterClassOwnerDefault / boundsActiveReadbackRouteClamps 30dPlanner status
lead_rotate_scontroller_safetyoperatordefault 600; 60 to 1800-600 (1m)readback only; firmware refs 8-MCP rejects planner writes; controller safety context
min_fan_off_splanner_policyoperatordefault 90; 30 to 300-90 (1m)readback only; firmware refs 14-set_tunable allowed; planner may write with a hypothesis
min_fan_on_splanner_policyoperatordefault 120; 30 to 300-120 (1m)readback only; firmware refs 14-set_tunable allowed; planner may write with a hypothesis
min_heat_off_splanner_policyoperatordefault 180; 60 to 600-180 (1m)readback only; firmware refs 14-set_tunable allowed; planner may write with a hypothesis
min_heat_on_splanner_policyoperatordefault 120; 30 to 300-120 (1m)readback only; firmware refs 14-set_tunable allowed; planner may write with a hypothesis
min_vent_off_splanner_policyoperatordefault 60; 10 to 300-60 (1m)readback only; firmware refs 14-set_tunable allowed; planner may write with a hypothesis
min_vent_on_splanner_policyoperatordefault 60; 10 to 300-60 (1m)readback only; firmware refs 14-set_tunable allowed; planner may write with a hypothesis

Safety rails

ParameterClassOwnerDefault / boundsActiveReadbackRouteClamps 30dPlanner status
safety_maxcontroller_safetysafetydefault 95; 80 to 110-100 (1m)readback only; firmware refs 25-MCP rejects planner writes; controller safety context
safety_max_seal_margin_fcontroller_safetyplannerdefault 5; 1 to 15-5 (1m)readback only; firmware refs 7-MCP rejects planner writes; controller safety context
safety_mincontroller_safetysafetydefault 45; 30 to 60-40 (1m)readback only; firmware refs 14-MCP rejects planner writes; controller safety context
safety_vpd_maxcontroller_safetysafetydefault 2.5; 2.5 to 3-2.5 (1m)readback only; firmware refs 18-MCP rejects planner writes; controller safety context
safety_vpd_mincontroller_safetysafetydefault 0.3; 0.1 to 1.5-0.3 (1m)readback only; firmware refs 16-MCP rejects planner writes; controller safety context

Summer vent gate

ParameterClassOwnerDefault / boundsActiveReadbackRouteClamps 30dPlanner status
outdoor_staleness_max_splanner_policyplannerdefault 600; 120 to 1800600600 (1m)readback only; firmware refs 8-materialized from climate_intent for routine set_plan
summer_vent_min_runtime_sretiredplannerdefault 180; 60 to 600-180 (1m)reserved; firmware refs 16-MCP rejects planner writes; reserved/no-op
sw_summer_vent_enabledplanner_policyplannerdefault 1; switch 0/111 (1m)readback only; firmware refs 26-materialized from climate_intent for routine set_plan
vent_prefer_dp_delta_fplanner_policyplannerdefault 5; 2 to 1533 (1m)readback only; firmware refs 7-materialized from climate_intent for routine set_plan
vent_prefer_temp_delta_fplanner_policyplannerdefault 5; 2 to 1555 (1m)confirmed; firmware refs 7-materialized from climate_intent for routine set_plan

Temperature band and staging

ParameterClassOwnerDefault / boundsActiveReadbackRouteClamps 30dPlanner status
cold_vent_guard_delta_fplanner_policyplannerdefault 10; 0 to 1599 (1m)confirmed; firmware refs 7-materialized from climate_intent for routine set_plan
cool_exit_hysteresis_fplanner_policyplannerdefault 1.5; 0.3 to 31.691.69 (1m)confirmed; firmware refs 7-materialized from climate_intent for routine set_plan
cool_stage2_exit_hysteresis_fplanner_policyplannerdefault 1; 0.3 to 311 (1m)readback only; firmware refs 7-materialized from climate_intent for routine set_plan
cool_stage2_over_high_fplanner_policyplannerdefault 1; 0 to 300 (1m)confirmed; firmware refs 9-materialized from climate_intent for routine set_plan
d_cool_stage_2retiredoperatordefault 3; 2 to 15-3 (1m)reserved; firmware refs 2-MCP rejects planner writes; reserved/no-op
d_heat_stage_2retiredoperatordefault 5; 2 to 15-5 (1m)reserved; firmware refs 2-MCP rejects planner writes; reserved/no-op
heat_hysteresisplanner_policyplannerdefault 1; 0 to 31.11.1 (1m)readback only; firmware refs 11-materialized from climate_intent for routine set_plan
sw_cool_all_fans_at_high_enabledplanner_policyplannerdefault 0; switch 0/111 (1m)confirmed; firmware refs 19-materialized from climate_intent for routine set_plan
temp_highcrop_bandbanddefault 95; 40 to 100-69.3 (1m)confirmed; firmware refs 38-MCP rejects planner writes; dispatcher/crop-band owned
temp_hysteresisplanner_policybanddefault 1.5; 0.5 to 31.691.69 (1m)confirmed; firmware refs 1-materialized from climate_intent for routine set_plan
temp_lowcrop_bandbanddefault 40; 30 to 80-59.3 (1m)confirmed; firmware refs 41-MCP rejects planner writes; dispatcher/crop-band owned

VPD band

ParameterClassOwnerDefault / boundsActiveReadbackRouteClamps 30dPlanner status
vpd_highcrop_bandbanddefault 2.8; 0.4 to 3-0.76 (1m)confirmed; firmware refs 39-MCP rejects planner writes; dispatcher/crop-band owned
vpd_hysteresisplanner_policybanddefault 0.3; 0.05 to 0.50.1930.192 (1m)confirmed; firmware refs 6-materialized from climate_intent for routine set_plan
vpd_lowcrop_bandbanddefault 0.35; 0.1 to 1-0.21 (1m)confirmed; firmware refs 40-MCP rejects planner writes; dispatcher/crop-band owned
vpd_watch_dwell_splanner_policyplannerdefault 60; 15 to 12056.2556 (1m)confirmed; firmware refs 16-materialized from climate_intent for routine set_plan

Zone scoring

ParameterClassOwnerDefault / boundsActiveReadbackRouteClamps 30dPlanner status
band_temp_target_midcrop_bandbanddefault 65.71; 40 to 100-- (-)static route; firmware refs 5-MCP rejects planner writes; dispatcher/crop-band owned
band_temp_target_smcrop_bandbanddefault 78.79; 40 to 100-- (-)static route; firmware refs 5-MCP rejects planner writes; dispatcher/crop-band owned
band_temp_target_srcrop_bandbanddefault 67.5; 40 to 100-- (-)static route; firmware refs 5-MCP rejects planner writes; dispatcher/crop-band owned
band_temp_target_sscrop_bandbanddefault 77; 40 to 100-- (-)static route; firmware refs 5-MCP rejects planner writes; dispatcher/crop-band owned
band_vpd_target_midcrop_bandbanddefault 0.918; 0.1 to 3-- (-)static route; firmware refs 5-MCP rejects planner writes; dispatcher/crop-band owned
band_vpd_target_smcrop_bandbanddefault 1.042; 0.1 to 3-- (-)static route; firmware refs 5-MCP rejects planner writes; dispatcher/crop-band owned
band_vpd_target_srcrop_bandbanddefault 0.935; 0.1 to 3-- (-)static route; firmware refs 5-MCP rejects planner writes; dispatcher/crop-band owned
band_vpd_target_sscrop_bandbanddefault 1.025; 0.1 to 3-- (-)static route; firmware refs 5-MCP rejects planner writes; dispatcher/crop-band owned
east_adjacency_factorcontroller_safetyplannerdefault 0.3; 0 to 1-0.3 (1m)readback only; firmware refs 10-MCP rejects planner writes; controller safety context
vpd_target_centercrop_bandbanddefault 0.8; 0.1 to 3-0.76 (1m)confirmed; firmware refs 36-MCP rejects planner writes; dispatcher/crop-band owned
vpd_target_eastcrop_bandbanddefault 1; 0.3 to 3-0.71 (1m)confirmed; firmware refs 33-MCP rejects planner writes; dispatcher/crop-band owned
vpd_target_southcrop_bandbanddefault 1.3; 0.3 to 3-0.75 (1m)confirmed; firmware refs 36-MCP rejects planner writes; dispatcher/crop-band owned
vpd_target_westcrop_bandbanddefault 1.2; 0.3 to 3-0.52 (1m)confirmed; firmware refs 36-MCP rejects planner writes; dispatcher/crop-band owned
zone_vpd_target_center_midcrop_bandbanddefault 0.7; 0.1 to 3-- (-)static route; firmware refs 6-MCP rejects planner writes; dispatcher/crop-band owned
zone_vpd_target_center_smcrop_bandbanddefault 1.1; 0.1 to 3-- (-)static route; firmware refs 6-MCP rejects planner writes; dispatcher/crop-band owned
zone_vpd_target_center_srcrop_bandbanddefault 0.9; 0.1 to 3-- (-)static route; firmware refs 6-MCP rejects planner writes; dispatcher/crop-band owned
zone_vpd_target_center_sscrop_bandbanddefault 0.9; 0.1 to 3-- (-)static route; firmware refs 6-MCP rejects planner writes; dispatcher/crop-band owned
zone_vpd_target_east_midcrop_bandbanddefault 0.74; 0.1 to 3-- (-)static route; firmware refs 6-MCP rejects planner writes; dispatcher/crop-band owned
zone_vpd_target_east_smcrop_bandbanddefault 1.22; 0.1 to 3-- (-)static route; firmware refs 6-MCP rejects planner writes; dispatcher/crop-band owned
zone_vpd_target_east_srcrop_bandbanddefault 0.8; 0.1 to 3-- (-)static route; firmware refs 6-MCP rejects planner writes; dispatcher/crop-band owned
zone_vpd_target_east_sscrop_bandbanddefault 0.9; 0.1 to 3-- (-)static route; firmware refs 6-MCP rejects planner writes; dispatcher/crop-band owned
zone_vpd_target_south_midcrop_bandbanddefault 0.75; 0.1 to 3-- (-)static route; firmware refs 6-MCP rejects planner writes; dispatcher/crop-band owned
zone_vpd_target_south_smcrop_bandbanddefault 1.18; 0.1 to 3-- (-)static route; firmware refs 6-MCP rejects planner writes; dispatcher/crop-band owned
zone_vpd_target_south_srcrop_bandbanddefault 0.85; 0.1 to 3-- (-)static route; firmware refs 6-MCP rejects planner writes; dispatcher/crop-band owned
zone_vpd_target_south_sscrop_bandbanddefault 0.95; 0.1 to 3-- (-)static route; firmware refs 6-MCP rejects planner writes; dispatcher/crop-band owned
zone_vpd_target_west_midcrop_bandbanddefault 0.57; 0.1 to 3-- (-)static route; firmware refs 6-MCP rejects planner writes; dispatcher/crop-band owned
zone_vpd_target_west_smcrop_bandbanddefault 1.1; 0.1 to 3-- (-)static route; firmware refs 6-MCP rejects planner writes; dispatcher/crop-band owned
zone_vpd_target_west_srcrop_bandbanddefault 0.6; 0.1 to 3-- (-)static route; firmware refs 6-MCP rejects planner writes; dispatcher/crop-band owned
zone_vpd_target_west_sscrop_bandbanddefault 0.7; 0.1 to 3-- (-)static route; firmware refs 6-MCP rejects planner writes; dispatcher/crop-band owned

Regenerate with scripts/generate-ai-tunables-page.py; publish through scripts/publish-site-content.sh so the static context and public site stay aligned.