{
 "generatedAt": "2026-09-13T02:05:39Z",
 "ruleCount": 96,
 "families": [
  {
   "key": "meter",
   "name": "Whole-building meter",
   "order": 1,
   "count": 11
  },
  {
   "key": "ahu",
   "name": "Air-side AHU",
   "order": 2,
   "count": 32
  },
  {
   "key": "vav",
   "name": "VAV / zone",
   "order": 3,
   "count": 7
  },
  {
   "key": "zone",
   "name": "Zones & IAQ",
   "order": 4,
   "count": 10
  },
  {
   "key": "plant",
   "name": "Central plant",
   "order": 5,
   "count": 18
  },
  {
   "key": "rtu",
   "name": "Packaged RTU / DX",
   "order": 6,
   "count": 7
  },
  {
   "key": "hp",
   "name": "Heat pumps / VRF",
   "order": 7,
   "count": 6
  },
  {
   "key": "doas",
   "name": "DOAS / ERV / exhaust",
   "order": 8,
   "count": 5
  }
 ],
 "rules": [
  {
   "id": "fdd_met01_excessive_baseload",
   "slug": "met-01-excessive-night-weekend-baseload",
   "code": "MET-01",
   "title": "Excessive night / weekend baseload",
   "family": "meter",
   "familyName": "Whole-building meter",
   "guideline36": false,
   "source": "meter",
   "needs": {
    "schedule": true,
    "weather": false
   },
   "effort": "medium",
   "pricing": "meter",
   "pricingLabel": "Measured at the meter",
   "diagnosticImpact": null,
   "whatItMeans": "Baseload power during unoccupied hours is higher than expected for the building's size and type.",
   "whyItMatters": "Baseload runs every hour of the year. Even a small fraction of avoidable baseload (lighting circuits, plug loads, HVAC override) adds up to a measurable annual bill.",
   "whatToDo": "Walk the building during unoccupied hours. Check for lighting circuits left on, plug-load schedules, and HVAC overrides that never expired."
  },
  {
   "id": "fdd_met02_baseload_drift",
   "slug": "met-02-baseload-creeping-up-over-time",
   "code": "MET-02",
   "title": "Baseload creeping up over time",
   "family": "meter",
   "familyName": "Whole-building meter",
   "guideline36": false,
   "source": "meter",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "meter",
   "pricingLabel": "Measured at the meter",
   "diagnosticImpact": null,
   "whatItMeans": "The minimum nightly demand has been trending upward across the analysis window.",
   "whyItMatters": "Usually signals 'ratcheting' — new always-on loads being added without being noticed. A 5% baseload creep per year compounds fast.",
   "whatToDo": "Cross-reference the trend onset with known commissioning, IT changes, or equipment installs. Walk the building to find the new always-on circuits."
  },
  {
   "id": "fdd_met03_after_hours_operation",
   "slug": "met-03-after-hours-operation",
   "code": "MET-03",
   "title": "After-hours operation",
   "family": "meter",
   "familyName": "Whole-building meter",
   "guideline36": false,
   "source": "meter",
   "needs": {
    "schedule": true,
    "weather": false
   },
   "effort": "medium",
   "pricing": "meter",
   "pricingLabel": "Measured at the meter",
   "diagnosticImpact": null,
   "whatItMeans": "Building demand is well above baseload during hours the schedule says it should be off.",
   "whyItMatters": "Every hour over baseload is paid-for conditioning of an empty building. Together with MET-01, the single biggest controllable energy story in most commercial buildings.",
   "whatToDo": "Check BMS schedules, tenant override panels, after-hours request logging, and HVAC zone schedules."
  },
  {
   "id": "fdd_met04_weekend_like_weekday",
   "slug": "met-04-weekend-load-shape-looks-like-a-weekday",
   "code": "MET-04",
   "title": "Weekend load shape looks like a weekday",
   "family": "meter",
   "familyName": "Whole-building meter",
   "guideline36": false,
   "source": "meter",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "meter",
   "pricingLabel": "Measured at the meter",
   "diagnosticImpact": null,
   "whatItMeans": "Saturday and Sunday demand profiles look almost identical to weekday profiles, despite no occupancy.",
   "whyItMatters": "An entire empty building running 7 days a week instead of 5 — a 40% energy overhang. Common in tenant-controlled HVAC and BMS schedules that were never set.",
   "whatToDo": "Enable weekend setback. Verify schedule applies to all zones. Look for tenant overrides that defeat the BMS."
  },
  {
   "id": "fdd_met05_peak_demand_anomaly",
   "slug": "met-05-anomalous-peak-demand-event",
   "code": "MET-05",
   "title": "Anomalous peak demand event",
   "family": "meter",
   "familyName": "Whole-building meter",
   "guideline36": false,
   "source": "meter",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "meter",
   "pricingLabel": "Measured at the meter",
   "diagnosticImpact": null,
   "whatItMeans": "A measured peak demand interval is far above what historical demand for that calendar position would predict.",
   "whyItMatters": "Utility demand charges are usually billed on the single highest 15-minute interval of the month. One bad peak can dwarf weeks of careful energy management.",
   "whatToDo": "Investigate what was running during the peak interval — startup sequences, lighting test, HVAC pre-cool. Stagger startups to flatten the peak."
  },
  {
   "id": "fdd_met06_weather_sensitivity",
   "slug": "met-06-weather-sensitivity-has-changed",
   "code": "MET-06",
   "title": "Weather sensitivity has changed",
   "family": "meter",
   "familyName": "Whole-building meter",
   "guideline36": false,
   "source": "meter",
   "needs": {
    "schedule": false,
    "weather": true
   },
   "effort": "medium",
   "pricing": "meter",
   "pricingLabel": "Measured at the meter",
   "diagnosticImpact": null,
   "whatItMeans": "The building's response to outdoor temperature (kWh per degree-day) has shifted from its historical baseline.",
   "whyItMatters": "A real change in weather sensitivity usually signals a control-sequence change, an envelope problem, or new equipment. Worth understanding either way.",
   "whatToDo": "Identify the change-point date and cross-reference with known commissioning, occupancy, or weather events. Confirm whether the change is desired (e.g., post-ECM) or accidental."
  },
  {
   "id": "fdd_met07_simultaneous_heating_cooling_signature",
   "slug": "met-07-heating-cooling-fuel-signature-overlap",
   "code": "MET-07",
   "title": "Heating + cooling fuel signature overlap",
   "family": "meter",
   "familyName": "Whole-building meter",
   "guideline36": false,
   "source": "meter",
   "needs": {
    "schedule": false,
    "weather": true
   },
   "effort": "medium",
   "pricing": "meter",
   "pricingLabel": "Measured at the meter",
   "diagnosticImpact": null,
   "whatItMeans": "Gas (heating) and electric (cooling) consumption both rise across a shoulder-season period when only one should be active.",
   "whyItMatters": "Same waste mechanism as the plant-level PLANT-04 fault but visible at the meter when plant-level data isn't available. Often the only signal in older buildings without submetering.",
   "whatToDo": "Investigate changeover schedule. Look at simultaneous-heating-cooling at the plant if data exists."
  },
  {
   "id": "fdd_met08_load_shape_outliers",
   "slug": "met-08-anomalous-daily-load-shape",
   "code": "MET-08",
   "title": "Anomalous daily load shape",
   "family": "meter",
   "familyName": "Whole-building meter",
   "guideline36": false,
   "source": "meter",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "diagnostic",
   "pricingLabel": "Diagnostic — not priced",
   "diagnosticImpact": "data_quality",
   "whatItMeans": "One or more days have a load shape that doesn't fit any of the building's normal day-type clusters.",
   "whyItMatters": "Outlier days often correspond to malfunctioning equipment, unexpected events, or one-off overrides. Worth investigating because they're often recoverable in the future.",
   "whatToDo": "Look at the specific outlier date in the BMS log — what changed? Was it a holiday with unexpected occupancy? A failed startup sequence?"
  },
  {
   "id": "fdd_met09_baseline_step_change",
   "slug": "met-09-sudden-step-change-in-baseline",
   "code": "MET-09",
   "title": "Sudden step change in baseline",
   "family": "meter",
   "familyName": "Whole-building meter",
   "guideline36": false,
   "source": "meter",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "meter",
   "pricingLabel": "Measured at the meter",
   "diagnosticImpact": null,
   "whatItMeans": "Baseload demand jumped discontinuously up or down on a specific date and didn't return.",
   "whyItMatters": "Step changes usually mark an event: equipment failure, retrofit, schedule change. Understanding which it was tells you whether to celebrate or fix.",
   "whatToDo": "Identify the date, cross-reference with maintenance logs and commissioning records."
  },
  {
   "id": "fdd_met10_meter_integrity",
   "slug": "met-10-meter-data-integrity-issue",
   "code": "MET-10",
   "title": "Meter data integrity issue",
   "family": "meter",
   "familyName": "Whole-building meter",
   "guideline36": false,
   "source": "meter",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "diagnostic",
   "pricingLabel": "Diagnostic — not priced",
   "diagnosticImpact": "data_quality",
   "whatItMeans": "The interval data has gaps, frozen values, or implausible jumps that suggest a meter or telemetry problem rather than building behavior.",
   "whyItMatters": "Bad meter data makes every other rule on that channel suspect. Fix the data layer before drawing conclusions from analytics.",
   "whatToDo": "Check the telemetry pipeline, meter battery, and pulse-output wiring. Backfill gaps from utility bills where possible."
  },
  {
   "id": "fdd_met11_lighting_after_hours",
   "slug": "met-11-lighting-on-after-hours",
   "code": "MET-11",
   "title": "Lighting on after hours",
   "family": "meter",
   "familyName": "Whole-building meter",
   "guideline36": false,
   "source": "meter",
   "needs": {
    "schedule": true,
    "weather": false
   },
   "effort": "low",
   "pricing": "meter",
   "pricingLabel": "Measured at the meter",
   "diagnosticImpact": null,
   "whatItMeans": "The lighting submeter runs well above its normal unoccupied level outside the occupancy schedule.",
   "whyItMatters": "Lighting left on after hours is close to 100 % avoidable — schedules, sweeps and occupancy sensors are the cheapest measures in the building.",
   "whatToDo": "Add or fix the lighting sweep / schedule in the lighting control panel or BAS; check for zones on manual override."
  },
  {
   "id": "fdd_g36_fc01",
   "slug": "ahu-fc01-duct-static-pressure-cannot-be-met",
   "code": "AHU-FC01",
   "title": "Duct static pressure cannot be met",
   "family": "ahu",
   "familyName": "Air-side AHU",
   "guideline36": true,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "The supply fan is at full speed but duct static pressure still isn't reaching its setpoint.",
   "whyItMatters": "Fan can't deliver design flow — every downstream VAV will be starved and compensate with bigger damper openings, masking the issue and burning fan power.",
   "whatToDo": "Check filters and coils for fouling (a loaded filter is the #1 cause). Inspect the fan VFD for current limit. Verify the DSP sensor is in a representative location."
  },
  {
   "id": "fdd_g36_fc02",
   "slug": "ahu-fc02-mixed-air-temperature-below-both-oat-and-rat",
   "code": "AHU-FC02",
   "title": "Mixed-air temperature below both OAT and RAT",
   "family": "ahu",
   "familyName": "Air-side AHU",
   "guideline36": true,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "diagnostic",
   "pricingLabel": "Diagnostic — not priced",
   "diagnosticImpact": "data_quality",
   "whatItMeans": "MAT is colder than both the outdoor air and the return air — physically impossible without a sensor or damper fault.",
   "whyItMatters": "Strong indicator of MAT sensor in a cooling-coil discharge stream (mis-located sensor), stratified mixing, or sensor calibration failure. Every SAT control loop downstream is acting on bad data.",
   "whatToDo": "Inspect MAT sensor placement — it should be downstream of the mixing plenum but upstream of the cooling coil. Verify against OAT and RAT calibration. Look for upstream coil bypass."
  },
  {
   "id": "fdd_mixed_air_calc_check",
   "slug": "ahu-fc02-03-06-mixed-air-temperature-doesnt-match-oa-ra-mix",
   "code": "AHU-FC02/03/06",
   "title": "Mixed-air temperature doesn't match OA/RA mix",
   "family": "ahu",
   "familyName": "Air-side AHU",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "diagnostic",
   "pricingLabel": "Diagnostic — not priced",
   "diagnosticImpact": "data_quality",
   "whatItMeans": "The measured mixed-air temperature is inconsistent with what the OA damper position and the OAT/RAT temperatures predict it should be.",
   "whyItMatters": "Tells you something is wrong with the airside physics — usually a stuck damper, leaking OA path around a closed damper, or a miscalibrated sensor. Every downstream temp control depends on this.",
   "whatToDo": "Inspect the OA damper for full closure (a 'closed' damper often leaks 10–20% in real installations). Verify MAT, OAT, and RAT sensor accuracy. If the damper is verified closed, the MAT sensor location may be averaging unrepresentative streams."
  },
  {
   "id": "fdd_g36_fc03",
   "slug": "ahu-fc03-mixed-air-temperature-above-both-oat-and-rat",
   "code": "AHU-FC03",
   "title": "Mixed-air temperature above both OAT and RAT",
   "family": "ahu",
   "familyName": "Air-side AHU",
   "guideline36": true,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "diagnostic",
   "pricingLabel": "Diagnostic — not priced",
   "diagnosticImpact": "data_quality",
   "whatItMeans": "MAT is hotter than both the outdoor air and the return air — physically impossible without a fault.",
   "whyItMatters": "Usually a MAT sensor in a heating-coil discharge stream or sun-loaded duct section. Misreads the mix temperature high, causing SAT control to under-call cooling.",
   "whatToDo": "Same as FC02 — inspect sensor placement and calibration. Check for duct radiant loading from adjacent hot surfaces."
  },
  {
   "id": "fdd_g36_fc04",
   "slug": "ahu-fc04-operating-state-hunting",
   "code": "AHU-FC04",
   "title": "Operating state hunting",
   "family": "ahu",
   "familyName": "Air-side AHU",
   "guideline36": true,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "The AHU is flipping between heating, free cooling, and mechanical cooling many times an hour.",
   "whyItMatters": "Every state change is a transient: coils fill and drain, dampers stroke, the supply temperature overshoots. It wastes energy and wears actuators, and it usually means the sequence has no deadband between modes.",
   "whatToDo": "Add or widen the deadbands between heating, economizer, and cooling in the AHU sequence; check the SAT setpoint reset and the mixed-air low-limit; verify the OAT sensor isn't noisy."
  },
  {
   "id": "fdd_g36_fc05",
   "slug": "ahu-fc05-supply-air-not-warming-across-active-heating",
   "code": "AHU-FC05",
   "title": "Supply air not warming across active heating",
   "family": "ahu",
   "familyName": "Air-side AHU",
   "guideline36": true,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "Heating valve is open but SAT isn't rising above MAT by more than the fan-heat tolerance — the heating coil isn't delivering heat.",
   "whyItMatters": "Lost heating capacity. Either the coil is air-bound, hot-water flow isn't reaching it, or the valve is reporting open but mechanically stuck closed.",
   "whatToDo": "Check HW supply temperature at the coil inlet. Bleed the coil for air. Verify HW pump is on and the isolation valve is open. Inspect the heating valve actuator linkage."
  },
  {
   "id": "fdd_g36_fc06",
   "slug": "ahu-fc06-oa-fraction-wrong-for-current-operating-state",
   "code": "AHU-FC06",
   "title": "OA fraction wrong for current operating state",
   "family": "ahu",
   "familyName": "Air-side AHU",
   "guideline36": true,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "diagnostic",
   "pricingLabel": "Diagnostic — not priced",
   "diagnosticImpact": "reliability",
   "whatItMeans": "The fraction of outside air being introduced doesn't match what the operating state calls for.",
   "whyItMatters": "Either under-ventilating (IAQ concern) or over-ventilating (energy waste). Both have measurable impact.",
   "whatToDo": "Verify OA damper response to commands. Check whether damper command is being clamped by a high/low limit. Inspect blade leakage."
  },
  {
   "id": "fdd_g36_fc07",
   "slug": "ahu-fc07-sat-low-while-heating-valve-is-full-open",
   "code": "AHU-FC07",
   "title": "SAT low while heating valve is full open",
   "family": "ahu",
   "familyName": "Air-side AHU",
   "guideline36": true,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "Heating valve is saturated open but SAT still hasn't reached setpoint.",
   "whyItMatters": "Heating capacity is gone — coil is undersized, water-side is starving, or coil is fouled. AHU will deliver cold supply air, zones will reheat to compensate, downstream energy bill grows.",
   "whatToDo": "Measure water-side ΔT across the coil (low ΔT = water-side issue). Check HW pump head and pressure-independent control valve setpoint. Inspect coil fins for fouling."
  },
  {
   "id": "fdd_g36_fc08",
   "slug": "ahu-fc08-sat-and-mat-not-tracking-in-economizer",
   "code": "AHU-FC08",
   "title": "SAT and MAT not tracking in economizer",
   "family": "ahu",
   "familyName": "Air-side AHU",
   "guideline36": true,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "In pure economizer mode (no mechanical heating or cooling), SAT should equal MAT plus the fan-heat rise — but it doesn't.",
   "whyItMatters": "Indicates a leaking coil (chilled water trickling through a closed valve, removing heat from supposedly-untreated air) or a SAT/MAT sensor calibration drift.",
   "whatToDo": "Check chilled-water and hot-water valve seat integrity (water-side closed temp test). Verify SAT and MAT sensor calibration against a reference thermometer."
  },
  {
   "id": "fdd_g36_fc09",
   "slug": "ahu-fc09-oat-too-high-for-sat-setpoint-with-free-cooling-alone",
   "code": "AHU-FC09",
   "title": "OAT too high for SAT setpoint with free cooling alone",
   "family": "ahu",
   "familyName": "Air-side AHU",
   "guideline36": true,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "It's too hot outside to hit SAT setpoint without mechanical cooling, but the AHU is still in economizer mode.",
   "whyItMatters": "Wasted economizer dwell — the unit isn't conditioning the space because the airside physics won't allow it. Often a wrong high-limit setting.",
   "whatToDo": "Adjust the economizer high-limit setpoint based on local climate. Check the differential-enthalpy or fixed-dry-bulb economizer enable logic."
  },
  {
   "id": "fdd_g36_fc10",
   "slug": "ahu-fc10-mixed-air-not-tracking-outdoor-air-at-100-oa",
   "code": "AHU-FC10",
   "title": "Mixed air not tracking outdoor air at 100% OA",
   "family": "ahu",
   "familyName": "Air-side AHU",
   "guideline36": true,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "diagnostic",
   "pricingLabel": "Diagnostic — not priced",
   "diagnosticImpact": "data_quality",
   "whatItMeans": "With the outdoor-air damper fully open, the mixed-air temperature should equal the outdoor-air temperature — it doesn't.",
   "whyItMatters": "Either the damper isn't actually open (linkage, actuator), return air is leaking through a closed return damper, or a sensor is wrong — any of which quietly defeats the economizer.",
   "whatToDo": "Stroke the OA and RA dampers and watch MAT respond; compare OAT and MAT sensors against a reference; check for a stuck return damper."
  },
  {
   "id": "fdd_g36_fc11",
   "slug": "ahu-fc11-mechanical-cooling-with-outdoor-air-cold-enough-to-do-the-job",
   "code": "AHU-FC11",
   "title": "Mechanical cooling with outdoor air cold enough to do the job",
   "family": "ahu",
   "familyName": "Air-side AHU",
   "guideline36": true,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "The unit is at 100% outdoor air and still running the cooling coil, although the outdoor air alone is colder than the supply setpoint.",
   "whyItMatters": "The economizer should be modulating the damper down instead of paying for chilled water. This is pure waste for as long as it lasts.",
   "whatToDo": "Check the economizer changeover and the damper minimum/maximum limits; verify the cooling valve seats; confirm the sequence lets the damper modulate before the coil enables."
  },
  {
   "id": "fdd_g36_fc12",
   "slug": "ahu-fc12-sat-too-high-relative-to-mat-in-cooling-mode",
   "code": "AHU-FC12",
   "title": "SAT too high relative to MAT in cooling mode",
   "family": "ahu",
   "familyName": "Air-side AHU",
   "guideline36": true,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "When cooling is active, SAT should drop below MAT. If SAT is higher than MAT, cooling isn't working.",
   "whyItMatters": "Lost cooling capacity — coil is air-bound, chilled-water flow isn't reaching it, or the valve is reporting open but stuck. Compounds with FC07-type symptoms on the heating side.",
   "whatToDo": "Check CHW supply temperature at coil inlet, CHW pump operation, and coil water-side condition. Verify cooling valve actuator linkage."
  },
  {
   "id": "fdd_g36_fc13",
   "slug": "ahu-fc13-supply-air-too-warm-with-the-cooling-valve-full-open",
   "code": "AHU-FC13",
   "title": "Supply air too warm with the cooling valve full open",
   "family": "ahu",
   "familyName": "Air-side AHU",
   "guideline36": true,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "The cooling coil is doing everything it can and the supply air is still above setpoint.",
   "whyItMatters": "Zones downstream will drift warm and the chilled-water plant is being asked for capacity it can't deliver here — low CHW flow, warm CHW, a fouled coil, or an undersized coil.",
   "whatToDo": "Check chilled-water supply temperature and differential pressure at this AHU; look for a closed isolation valve or air-bound coil; clean the coil; compare against the plant's CHW supply setpoint."
  },
  {
   "id": "fdd_g36_fc14",
   "slug": "ahu-fc14-temperature-drop-across-inactive-cooling-coil",
   "code": "AHU-FC14",
   "title": "Temperature drop across inactive cooling coil",
   "family": "ahu",
   "familyName": "Air-side AHU",
   "guideline36": true,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "Cooling valve is commanded closed but air is still being cooled as it crosses the coil.",
   "whyItMatters": "Strong evidence of a leaking cooling valve — chilled water is reaching the coil that's supposed to be off, and removing heat. This is a top hidden waste in heating season.",
   "whatToDo": "Hydraulically isolate the coil and re-check. Replace the cooling valve or its seat. Check whether the actuator is travelling full stroke."
  },
  {
   "id": "fdd_g36_fc15",
   "slug": "ahu-fc15-temperature-rise-across-inactive-heating-coil",
   "code": "AHU-FC15",
   "title": "Temperature rise across inactive heating coil",
   "family": "ahu",
   "familyName": "Air-side AHU",
   "guideline36": true,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "Heating valve is commanded closed but air is still being warmed as it crosses the coil.",
   "whyItMatters": "Leaking heating valve — hot water is heating supposedly-off air, and the system is paying for it. Especially bad in cooling season when chilled water then has to remove that heat.",
   "whatToDo": "Mirror of FC14: hydraulic isolation test, valve replacement, actuator travel check."
  },
  {
   "id": "fdd_simultaneous_heat_cool",
   "slug": "ahu-x01-fighting-coils-heating-and-cooling-on-at-the-same-time",
   "code": "AHU-X01",
   "title": "Fighting coils — heating and cooling on at the same time",
   "family": "ahu",
   "familyName": "Air-side AHU",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "physical",
   "pricingLabel": "Physics-based",
   "diagnosticImpact": null,
   "whatItMeans": "The heating valve and the cooling valve are both driving open simultaneously on the same AHU.",
   "whyItMatters": "Every minute of overlap burns gas to make heat that chilled water immediately removes. This is one of the highest-$ pure-waste faults in HVAC and is invisible without per-actuator data.",
   "whatToDo": "Check the AHU sequence: is there a deadband between heating and cooling demand? Confirm both valves seat fully closed (a stuck-open valve will look like this). Verify the SAT setpoint and reset logic aren't asking heating and cooling to chase each other."
  },
  {
   "id": "fdd_reheat_after_overcool",
   "slug": "ahu-x02-reheat-clawing-back-overcooled-air",
   "code": "AHU-X02",
   "title": "Reheat clawing back overcooled air",
   "family": "ahu",
   "familyName": "Air-side AHU",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "physical",
   "pricingLabel": "Physics-based",
   "diagnosticImpact": null,
   "whatItMeans": "Zone temperature dropped below setpoint and reheat then activated to recover — the AHU overcooled and is paying to heat back up.",
   "whyItMatters": "Pure double-energy waste — chilled water removed heat that gas then had to put back. Usually rooted in a too-low SAT setpoint or oversized cooling coil.",
   "whatToDo": "Raise the SAT setpoint or implement SAT reset based on zone demand. Check whether the zone has a leaking damper or reheat valve causing the initial overcooling."
  },
  {
   "id": "fdd_x03_fan_curve_deviation",
   "slug": "ahu-x03-fan-power-deviates-from-fan-curve-expectation",
   "code": "AHU-X03",
   "title": "Fan power deviates from fan-curve expectation",
   "family": "ahu",
   "familyName": "Air-side AHU",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "The fan is drawing more (or less) power than the affinity laws predict for its current speed.",
   "whyItMatters": "Higher-than-curve power means belt slip, bearing failure, impeller fouling, or excessive duct restriction. Lower-than-curve usually means a sensor calibration issue.",
   "whatToDo": "Inspect belt tension and bearings. Look for restricted return-air paths or filters at end-of-life. Verify fan VFD calibration."
  },
  {
   "id": "fdd_x04_sat_reset_not_implemented",
   "slug": "ahu-x04-sat-setpoint-is-constant-no-reset-strategy",
   "code": "AHU-X04",
   "title": "SAT setpoint is constant — no reset strategy",
   "family": "ahu",
   "familyName": "Air-side AHU",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": true,
    "weather": false
   },
   "effort": "medium",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "The supply-air-temp setpoint never moves across the analysis window, indicating no trim-and-reset or load-based reset is happening.",
   "whyItMatters": "A static SAT setpoint forces VAV boxes to reheat at low loads (excess cooling) or strain at high loads. ASHRAE 90.1 requires SAT reset on most multi-zone AHUs for this reason. Often a 15–20% AHU energy reduction is left on the table.",
   "whatToDo": "Implement trim-and-reset based on the most-open VAV box, or a simple OAT-based reset. Confirm the BMS reset logic actually has authority over the SAT setpoint."
  },
  {
   "id": "fdd_schedule_override",
   "slug": "ahu-x05-equipment-running-outside-its-occupancy-schedule",
   "code": "AHU-X05",
   "title": "Equipment running outside its occupancy schedule",
   "family": "ahu",
   "familyName": "Air-side AHU",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": true,
    "weather": false
   },
   "effort": "low",
   "pricing": "physical",
   "pricingLabel": "Physics-based",
   "diagnosticImpact": null,
   "whatItMeans": "A channel is showing active output during hours the building schedule says it should be off.",
   "whyItMatters": "After-hours operation is a top driver of unexpected baseload. Even a small fraction of the year running 24/7 instead of 12/5 can add 15–25% to annual kWh.",
   "whatToDo": "Check the override status on the BMS, occupancy sensors that may be falsely triggering, manual after-hours requests, and tenant override panels that never time out."
  },
  {
   "id": "fdd_setpoint_hunting",
   "slug": "ahu-x06-control-loop-oscillating",
   "code": "AHU-X06",
   "title": "Control loop oscillating",
   "family": "ahu",
   "familyName": "Air-side AHU",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "low",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "A control output is oscillating quickly enough that the loop is unstable.",
   "whyItMatters": "Hunting wastes valve and actuator life and rarely holds the controlled variable on setpoint. Often masks a deeper tuning or sensor-noise problem.",
   "whatToDo": "Retune the loop's proportional and integral gains. Check sensor placement — a sensor in turbulent flow will cause apparent hunting. Verify the actuator isn't sticking and snapping past setpoint."
  },
  {
   "id": "fdd_sensor_stuck",
   "slug": "ahu-x07-sensor-value-frozen",
   "code": "AHU-X07",
   "title": "Sensor value frozen",
   "family": "ahu",
   "familyName": "Air-side AHU",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "low",
   "pricing": "diagnostic",
   "pricingLabel": "Diagnostic — not priced",
   "diagnosticImpact": "data_quality",
   "whatItMeans": "A sensor's value hasn't changed beyond its noise floor for a long period when it should have.",
   "whyItMatters": "A stuck sensor isn't just one bad data point — it silently corrupts every control loop that depends on it. A stuck SAT will make the AHU control to a fictional temperature.",
   "whatToDo": "Power-cycle the sensor module, check wiring for shorts or opens, look for a recent commissioning override that pinned the value, and verify the BMS isn't suppressing updates."
  },
  {
   "id": "fdd_valve_saturation",
   "slug": "ahu-x08-valve-pegged-open-or-closed",
   "code": "AHU-X08",
   "title": "Valve pegged open or closed",
   "family": "ahu",
   "familyName": "Air-side AHU",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "A valve has been at 100% (or 0%) for sustained periods, suggesting it can't meet load.",
   "whyItMatters": "Saturation means the loop has lost authority — controlled variable is no longer being controlled. Often points to undersized equipment, fouled coil, or a setpoint that's outside the achievable range.",
   "whatToDo": "Check the controlled variable's actual value vs setpoint while the valve is saturated. If the variable still misses setpoint, the equipment or coil is the bottleneck; if it's on setpoint, the setpoint may be reachable with less than 100% (suggesting a calibration issue)."
  },
  {
   "id": "fdd_fan_at_high_speed_low_load",
   "slug": "ahu-x09-supply-fan-riding-high-with-no-cooling-demand",
   "code": "AHU-X09",
   "title": "Supply fan riding high with no cooling demand",
   "family": "ahu",
   "familyName": "Air-side AHU",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "The supply fan is running above its minimum speed but the cooling load is near zero.",
   "whyItMatters": "Fan power is cubic in speed — riding a VFD at 70% with no load wastes 3× more than necessary. This is a top-three air-side waste on overlooked AHUs.",
   "whatToDo": "Check whether the DSP setpoint is too high (fan ramps to maintain pressure with no demand), whether minimum-OA logic is forcing flow, or whether the BMS lost its trim-and-reset routine and the fan is at constant speed."
  },
  {
   "id": "fdd_oat_reset_compliance",
   "slug": "ahu-x10-hot-water-supply-not-following-oat-reset",
   "code": "AHU-X10",
   "title": "Hot-water supply not following OAT reset",
   "family": "ahu",
   "familyName": "Air-side AHU",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "The hot-water supply temperature is too high for the current outdoor temperature — the reset schedule isn't being followed.",
   "whyItMatters": "Every 10°F of unnecessary HW supply increases distribution losses, can prevent condensing operation on a condensing boiler (a 10-point efficiency hit), and wastes fuel maintaining hotter water that nobody needs.",
   "whatToDo": "Verify the OAT reset schedule is enabled. Check the OAT sensor accuracy. Confirm the worst-case zone really needs the high supply temp — most buildings can run 20–40°F lower in shoulder seasons."
  },
  {
   "id": "fdd_supply_air_temp_deviation",
   "slug": "ahu-x11-supply-air-temperature-missing-setpoint",
   "code": "AHU-X11",
   "title": "Supply air temperature missing setpoint",
   "family": "ahu",
   "familyName": "Air-side AHU",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "Supply air temperature is drifting above or below its setpoint by more than the tolerance.",
   "whyItMatters": "When SAT doesn't track setpoint, every downstream zone is being delivered air at the wrong temperature — VAV boxes will respond by opening to weird positions to compensate, masking the underlying SAT issue.",
   "whatToDo": "Check whether either coil is saturated (running this rule together with valve_saturation usually clinches the diagnosis). Verify the SAT sensor isn't in a turbulent or stratified location."
  },
  {
   "id": "fdd_unoccupied_reheat",
   "slug": "ahu-x12-reheat-active-during-unoccupied-hours",
   "code": "AHU-X12",
   "title": "Reheat active during unoccupied hours",
   "family": "ahu",
   "familyName": "Air-side AHU",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": true,
    "weather": false
   },
   "effort": "low",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "Hot-water reheat is running at night or on weekends when the building should be unoccupied and unconditioned.",
   "whyItMatters": "There's no setpoint-defensible reason to reheat empty space. This is a top driver of high winter baseload and is usually a forgotten override or a leaky valve being chased by night setback control.",
   "whatToDo": "Check whether night-setback heating is too aggressive, whether a manual override has never been cleared, and whether the valve is mechanically leaking (a closed-command valve at 90°F downstream usually means leak-through)."
  },
  {
   "id": "fdd_excess_outdoor_air",
   "slug": "ahu-x13-outside-air-damper-open-past-minimum-without-economizer-reason",
   "code": "AHU-X13",
   "title": "Outside-air damper open past minimum without economizer reason",
   "family": "ahu",
   "familyName": "Air-side AHU",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "The OA damper is open well past its minimum position even though OAT is too hot or too cold for free cooling to be useful.",
   "whyItMatters": "Each percent of excess OA is conditioned, dehumidified, and reheated for no ventilation benefit. In peak summer or winter, every CFM of excess OA carries a measurable kWh cost.",
   "whatToDo": "Verify the economizer enable logic (high-limit lockout temp). Check whether the damper actuator is sticking open or whether minimum-OA logic has been hard-coded above design ventilation."
  },
  {
   "id": "fdd_economizer_check",
   "slug": "ahu-x14-mechanical-cooling-while-free-cooling-was-available",
   "code": "AHU-X14",
   "title": "Mechanical cooling while free cooling was available",
   "family": "ahu",
   "familyName": "Air-side AHU",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "physical",
   "pricingLabel": "Physics-based",
   "diagnosticImpact": null,
   "whatItMeans": "Outdoor air is cool enough to provide free cooling, but the AHU is at minimum OA and running mechanical cooling instead.",
   "whyItMatters": "Every hour of free-cooling-foregone is pure waste — the building paid for chilled water it could have had for free. Especially impactful in mild climates and shoulder seasons.",
   "whatToDo": "Check the economizer enable point, OAT sensor accuracy (a too-high OAT reading locks out economizer), damper actuator binding, and whether the high-limit cutoff is set too aggressively."
  },
  {
   "id": "fdd_x15_dsp_reset_not_implemented",
   "slug": "ahu-x15-static-pressure-setpoint-never-resets",
   "code": "AHU-X15",
   "title": "Static-pressure setpoint never resets",
   "family": "ahu",
   "familyName": "Air-side AHU",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": true,
    "weather": false
   },
   "effort": "low",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "The supply-duct static-pressure setpoint sits at one value whenever the unit runs — there is no trim-and-respond reset from the VAV box dampers.",
   "whyItMatters": "Fan power scales with the cube of flow and roughly with static; holding design static at part load is the single largest avoidable fan cost on a VAV system.",
   "whatToDo": "Enable static-pressure reset per ASHRAE Guideline 36 (trim-and-respond on damper positions), with a sensible minimum; verify the most-open box stays satisfied."
  },
  {
   "id": "fdd_g36_fc16",
   "slug": "erv-fc16-energy-recovery-not-recovering",
   "code": "ERV-FC16",
   "title": "Energy recovery not recovering",
   "family": "ahu",
   "familyName": "Air-side AHU",
   "guideline36": true,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "The recovery wheel or core is commanded on but the supply air isn't being pre-conditioned much by the exhaust stream.",
   "whyItMatters": "A dead recovery section shifts its whole load onto the heating and cooling coils — often 20–40% of the unit's conditioning energy.",
   "whatToDo": "Check the wheel belt/motor and rotation, the bypass damper position, frost-control settings, and whether the wheel is fouled; verify the sensors are on the correct side of the wheel."
  },
  {
   "id": "fdd_vav01_airflow_sensor_miscal",
   "slug": "vav-01-vav-airflow-sensor-miscalibrated",
   "code": "VAV-01",
   "title": "VAV airflow sensor miscalibrated",
   "family": "vav",
   "familyName": "VAV / zone",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "The VAV's airflow reading doesn't match what's expected from its damper position and the serving AHU's supply pressure.",
   "whyItMatters": "The VAV box is controlling to a fictional airflow. Zone temp control suffers, and the AHU's flow-summing logic for SAT reset is corrupted.",
   "whatToDo": "Recalibrate the flow sensor at known dampered positions. Check for blocked flow rings. Verify the damper position feedback isn't itself broken."
  },
  {
   "id": "fdd_vav02_leaking_damper",
   "slug": "vav-02-vav-damper-leaking-when-commanded-closed",
   "code": "VAV-02",
   "title": "VAV damper leaking when commanded closed",
   "family": "vav",
   "familyName": "VAV / zone",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "Damper command is at minimum but measured airflow is well above minimum and the serving fan is running.",
   "whyItMatters": "Conditioned air bleeding into a zone that doesn't call for it. Cumulatively a big driver of overcooling and energy waste in shoulder seasons.",
   "whatToDo": "Inspect damper seat for debris or warpage. Verify actuator travel reaches full close. Replace if blade-and-frame leakage exceeds spec."
  },
  {
   "id": "fdd_vav03_leaking_reheat",
   "slug": "vav-03-vav-reheat-valve-leaking",
   "code": "VAV-03",
   "title": "VAV reheat valve leaking",
   "family": "vav",
   "familyName": "VAV / zone",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "Reheat valve is commanded closed but discharge-air temperature is rising above supply-air temperature.",
   "whyItMatters": "Same waste mechanism as a leaking heating valve at the AHU, but at every zone instead of one central place. The aggregate $ across a building can rival a leaking central coil.",
   "whatToDo": "Replace the reheat valve cartridge. Check that the actuator is travelling full close. Inspect the HW supply for over-pressurized branch flow."
  },
  {
   "id": "fdd_vav04_zone_unsatisfied",
   "slug": "vav-04-zone-outside-its-setpoint-band",
   "code": "VAV-04",
   "title": "Zone outside its setpoint band",
   "family": "vav",
   "familyName": "VAV / zone",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": true,
    "weather": false
   },
   "effort": "medium",
   "pricing": "diagnostic",
   "pricingLabel": "Diagnostic — not priced",
   "diagnosticImpact": "comfort",
   "whatItMeans": "Zone temperature is sustained above the cooling setpoint or below the heating setpoint by more than the tolerance.",
   "whyItMatters": "Direct comfort complaint risk — the most-occupied buildings get the most complaints from this exact pattern. Often signals a downstream box stuck or a serving-AHU problem.",
   "whatToDo": "Check whether the box is stuck (run VAV-06). If the box is responding but can't move the zone, look upstream — the AHU may not be delivering useful supply air (FC07 / FC12)."
  },
  {
   "id": "fdd_vav05_reheat_saturated",
   "slug": "vav-05-vav-reheat-valve-pegged-but-zone-still-cold",
   "code": "VAV-05",
   "title": "VAV reheat valve pegged but zone still cold",
   "family": "vav",
   "familyName": "VAV / zone",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "Reheat valve has been at 100% but the zone temp is still below the heating setpoint.",
   "whyItMatters": "Lost heating capacity at the box. Often hot-water flow doesn't reach the coil, the coil is fouled, or the box is undersized for current load.",
   "whatToDo": "Check HW pressure at the box, verify the local balancing valve isn't closed off, and look for coil air-binding."
  },
  {
   "id": "fdd_vav06_box_stuck",
   "slug": "vav-06-vav-box-stuck-at-min-or-max-airflow",
   "code": "VAV-06",
   "title": "VAV box stuck at min or max airflow",
   "family": "vav",
   "familyName": "VAV / zone",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "VAV airflow has been pinned at the minimum or maximum setpoint regardless of zone demand.",
   "whyItMatters": "Box has lost authority over the zone. Comfort drifts, neighboring zones may be over-conditioned to compensate, AHU SAT reset gets corrupted by the box's bad signal.",
   "whatToDo": "Inspect damper actuator and linkage. Check for control output failure at the box controller. Verify the BMS is sending varying commands."
  },
  {
   "id": "fdd_vav07_rogue_zone",
   "slug": "vav-07-single-zone-driving-ahu-reset",
   "code": "VAV-07",
   "title": "Single zone driving AHU reset",
   "family": "vav",
   "familyName": "VAV / zone",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "One VAV is consistently the most-open box and is driving the AHU's SAT reset target colder or hotter than the rest of the building needs.",
   "whyItMatters": "The whole AHU is being penalized to serve one problem zone. Usually the rogue zone has a leaking damper, a miscalibrated thermostat, or a real building-fabric issue (south-facing glass, server room).",
   "whatToDo": "Investigate the rogue zone specifically — recalibrate its thermostat, check for leaks, consider adding local supplementary capacity. Once fixed, the rest of the building's energy use improves."
  },
  {
   "id": "fdd_fcu01_valve_leak_by",
   "slug": "fcu-01-fan-coil-valve-leaking-by",
   "code": "FCU-01",
   "title": "Fan-coil valve leaking by",
   "family": "zone",
   "familyName": "Zones & IAQ",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "The coil valve is closed but the discharge air is still well away from the zone temperature.",
   "whyItMatters": "A leaking valve heats or cools the space with no call — energy waste and the classic 'always too warm' room.",
   "whatToDo": "Stroke the valve and check it seats; replace the actuator or valve if it cannot close."
  },
  {
   "id": "fdd_fcu02_fan_vs_call",
   "slug": "fcu-02-fan-coil-fan-out-of-step-with-its-call",
   "code": "FCU-02",
   "title": "Fan-coil fan out of step with its call",
   "family": "zone",
   "familyName": "Zones & IAQ",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": true,
    "weather": false
   },
   "effort": "low",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "The fan runs unoccupied with the valve closed, or the valve opens while the fan is off.",
   "whyItMatters": "Fan-on-no-call is pure fan energy; call-without-fan wastes pumping and never conditions the room.",
   "whatToDo": "Set the fan to auto after hours; check the fan interlock and the fan motor/relay."
  },
  {
   "id": "fdd_fcu03_simultaneous_heat_cool_fcu",
   "slug": "fcu-03-four-pipe-fan-coil-heating-and-cooling-together",
   "code": "FCU-03",
   "title": "Four-pipe fan-coil heating and cooling together",
   "family": "zone",
   "familyName": "Zones & IAQ",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "Both the heating and cooling valves of a fan-coil are open at once.",
   "whyItMatters": "The coils fight each other — the same waste as an AHU with both valves open, multiplied by every fan-coil doing it.",
   "whatToDo": "Check the fan-coil controller deadband and changeover logic; verify both valves seat."
  },
  {
   "id": "fdd_zone01_co2_over_ventilation",
   "slug": "zone-01-over-ventilating-a-lightly-occupied-zone",
   "code": "ZONE-01",
   "title": "Over-ventilating a lightly occupied zone",
   "family": "zone",
   "familyName": "Zones & IAQ",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": true,
    "weather": false
   },
   "effort": "medium",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "CO₂ is far below the demand-control setpoint while the outdoor-air damper is wide open.",
   "whyItMatters": "Every cubic foot of outdoor air beyond what the occupants need is heated, cooled and dehumidified for nothing.",
   "whatToDo": "Enable or fix demand-controlled ventilation; check the CO₂ sensor calibration and the damper minimum."
  },
  {
   "id": "fdd_zone02_co2_under_ventilation",
   "slug": "zone-02-under-ventilated-zone-co2-high",
   "code": "ZONE-02",
   "title": "Under-ventilated zone (CO₂ high)",
   "family": "zone",
   "familyName": "Zones & IAQ",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": true,
    "weather": false
   },
   "effort": "medium",
   "pricing": "diagnostic",
   "pricingLabel": "Diagnostic — not priced",
   "diagnosticImpact": "comfort",
   "whatItMeans": "CO₂ stays above the comfort / code limit while the space is occupied.",
   "whyItMatters": "High CO₂ tracks with complaints, drowsiness and code non-compliance; it also means the ventilation system isn't delivering.",
   "whatToDo": "Check the outdoor-air damper minimum, the DCV setpoint, VAV minimums and the CO₂ sensor calibration."
  },
  {
   "id": "fdd_zone03_rh_out_of_band",
   "slug": "zone-03-zone-humidity-out-of-band",
   "code": "ZONE-03",
   "title": "Zone humidity out of band",
   "family": "zone",
   "familyName": "Zones & IAQ",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": true,
    "weather": false
   },
   "effort": "medium",
   "pricing": "diagnostic",
   "pricingLabel": "Diagnostic — not priced",
   "diagnosticImpact": "comfort",
   "whatItMeans": "Occupied relative humidity sits outside the comfort band for a sustained period.",
   "whyItMatters": "High RH risks mold and discomfort at any temperature; low RH dries out occupants and materials.",
   "whatToDo": "High: check the cooling coil dehumidification, reheat and outdoor-air load; low: check humidifier operation and excess outdoor air in winter."
  },
  {
   "id": "fdd_zone04_condensation_risk",
   "slug": "zone-04-condensation-risk-on-a-chilled-surface",
   "code": "ZONE-04",
   "title": "Condensation risk on a chilled surface",
   "family": "zone",
   "familyName": "Zones & IAQ",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "diagnostic",
   "pricingLabel": "Diagnostic — not priced",
   "diagnosticImpact": "reliability",
   "whatItMeans": "A chilled beam / radiant / supply surface is colder than the zone dewpoint.",
   "whyItMatters": "Water forms on the surface — dripping, stained ceilings, mold, and eventually a shut-down system.",
   "whatToDo": "Raise the chilled-water supply setpoint to the beams, fix the dewpoint reset, or dehumidify the outdoor air with the DOAS."
  },
  {
   "id": "fdd_zone05_zone_temp_sensor_bias",
   "slug": "zone-05-zone-temperature-sensor-biased-vs-neighbours",
   "code": "ZONE-05",
   "title": "Zone temperature sensor biased vs neighbours",
   "family": "zone",
   "familyName": "Zones & IAQ",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "diagnostic",
   "pricingLabel": "Diagnostic — not priced",
   "diagnosticImpact": "data_quality",
   "whatItMeans": "One zone sensor reads persistently offset from the median of its neighbours.",
   "whyItMatters": "A biased sensor drives its box to over-heat or over-cool the space every day.",
   "whatToDo": "Compare against a reference thermometer; relocate the sensor away from sun, drafts or equipment; recalibrate or replace."
  },
  {
   "id": "fdd_zone06_setpoint_policy",
   "slug": "zone-06-occupied-setpoints-outside-policy",
   "code": "ZONE-06",
   "title": "Occupied setpoints outside policy",
   "family": "zone",
   "familyName": "Zones & IAQ",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": true,
    "weather": false
   },
   "effort": "low",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "During occupied hours the zone is asked for cooling colder, heating warmer, or a deadband narrower than the building's setpoint policy.",
   "whyItMatters": "Each degree of overcooling or overheating costs roughly 3 % of the zone's HVAC energy, and narrow deadbands make heating and cooling fight through the day.",
   "whatToDo": "Restore the setpoint policy in the BAS (74/70 °F, 4 °F deadband) and limit local adjustment to ±2 °F; investigate zones that were lowered to compensate for another problem."
  },
  {
   "id": "fdd_zone07_setback_depth",
   "slug": "zone-07-night-setback-too-shallow",
   "code": "ZONE-07",
   "title": "Night setback too shallow",
   "family": "zone",
   "familyName": "Zones & IAQ",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": true,
    "weather": false
   },
   "effort": "low",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "The unoccupied cooling and heating setpoints are within a few degrees of the occupied ones — the zone is kept at comfort conditions overnight and at weekends.",
   "whyItMatters": "Unoccupied hours are two-thirds of the week; a 5–10 °F setback typically cuts unoccupied HVAC energy by 20–40 %.",
   "whatToDo": "Set unoccupied setpoints to about 80 °F cooling / 60 °F heating with optimal-start recovery, and confirm the occupancy schedule matches how the space is used."
  },
  {
   "id": "fdd_plant01_chw_supply_temp_not_met",
   "slug": "plant-01-chiller-cant-make-chilled-water-supply-setpoint",
   "code": "PLANT-01",
   "title": "Chiller can't make chilled-water supply setpoint",
   "family": "plant",
   "familyName": "Central plant",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "diagnostic",
   "pricingLabel": "Diagnostic — not priced",
   "diagnosticImpact": "reliability",
   "whatItMeans": "The chiller is on but CHW supply temperature is above its setpoint by more than the tolerance.",
   "whyItMatters": "Source-side problem: every downstream AHU and VAV will see warm CHW and either ramp valves wide open or fail to control SAT. Many AHU-side faults (FC07, FC12) downstream of this one are actually consequences of it — the suppression layer hides them.",
   "whatToDo": "Check refrigerant charge, condenser heat-rejection (cooling tower performance), evaporator approach. Verify CHW pump head and flow. Inspect for fouled tubes."
  },
  {
   "id": "fdd_plant02_low_chw_dt",
   "slug": "plant-02-low-chilled-water-delta-t-syndrome",
   "code": "PLANT-02",
   "title": "Low chilled-water ΔT syndrome",
   "family": "plant",
   "familyName": "Central plant",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "The chilled-water loop's supply-to-return delta is below design when the chiller is loaded.",
   "whyItMatters": "Low ΔT means the loop is moving more water than the load actually needs. CHW pump power goes up cubically with flow, chillers run at low efficiency, capacity is artificially limited. A classic — and expensive — pumping syndrome.",
   "whatToDo": "Check coil valves for being stuck open (most common cause), 3-way valves bypassing flow, decoupled bridge balance, and CHW pump control sequence."
  },
  {
   "id": "fdd_plant03_condenser_approach_drift",
   "slug": "plant-03-condenser-approach-drifting-up-likely-tube-fouling",
   "code": "PLANT-03",
   "title": "Condenser approach drifting up — likely tube fouling",
   "family": "plant",
   "familyName": "Central plant",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "The gap between condenser leaving water temp and refrigerant condensing temp has grown over time when normalized by load.",
   "whyItMatters": "Every 1°F of extra approach typically costs 1–2% in chiller efficiency. Compound across a season and the bill is real. Tube fouling is the most common cause; eddy-current testing is the gold-standard inspection.",
   "whatToDo": "Schedule a tube cleaning or brush. Check condenser-water chemistry. Verify CW flow is at design."
  },
  {
   "id": "fdd_plant04_simultaneous_heating_cooling_plant",
   "slug": "plant-04-boiler-and-chiller-running-at-the-same-time",
   "code": "PLANT-04",
   "title": "Boiler and chiller running at the same time",
   "family": "plant",
   "familyName": "Central plant",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "The building is calling for both heating and cooling at the central plant simultaneously.",
   "whyItMatters": "Some buildings genuinely need this (interior cores vs perimeter), but most don't — and when they do, the changeover band and economizer schedule are usually mistuned. Each overlapping hour burns gas and chilled water together.",
   "whatToDo": "Audit the heating-cooling changeover schedule. Check whether economizer ride-time has been removed. Look for zones with leaking heating valves driving cooling demand elsewhere."
  },
  {
   "id": "fdd_plant05_pump_deadheading",
   "slug": "plant-05-pump-running-with-no-flow",
   "code": "PLANT-05",
   "title": "Pump running with no flow",
   "family": "plant",
   "familyName": "Central plant",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "Pump status reads on but flow is at or near zero — the pump is deadheading against closed valves.",
   "whyItMatters": "Deadheading destroys pump bearings and seals quickly. Also wastes power on hydraulic work that's just heating the loop water.",
   "whatToDo": "Check downstream isolation valves and balancing valves. Verify the loop has an active load. Consider adding a minimum-flow bypass."
  },
  {
   "id": "fdd_plant06_tower_fan_short_cycling",
   "slug": "plant-06-cooling-tower-fan-short-cycling",
   "code": "PLANT-06",
   "title": "Cooling-tower fan short-cycling",
   "family": "plant",
   "familyName": "Central plant",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "The cooling tower's fan is starting and stopping more frequently than its minimum-runtime allows.",
   "whyItMatters": "Hard on the gearbox, motor, and VFD. Also wastes the inrush current and prevents stable condenser-water control.",
   "whatToDo": "Investigate the tower control sequence — is staging hunting? Is the CW supply setpoint too tight? Consider a longer minimum-on timer."
  },
  {
   "id": "fdd_chiller_short_cycling",
   "slug": "plant-07-chiller-short-cycling",
   "code": "PLANT-07",
   "title": "Chiller short-cycling",
   "family": "plant",
   "familyName": "Central plant",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "The chiller is starting and stopping more frequently than its minimum-runtime safety limit allows.",
   "whyItMatters": "Short-cycling destroys chiller bearings, reduces compressor life by years, and drops average efficiency. Repeated starts also draw heavy in-rush current that can trip utility demand charges.",
   "whatToDo": "Check the chiller's minimum run timer and minimum off timer settings. Investigate whether the chilled-water loop is undersized for the load (no thermal mass) or whether staging logic is hunting between stages."
  },
  {
   "id": "fdd_boiler_short_cycling",
   "slug": "plant-07b-boiler-short-cycling",
   "code": "PLANT-07B",
   "title": "Boiler short-cycling",
   "family": "plant",
   "familyName": "Central plant",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "The boiler is starting and stopping more frequently than its minimum-runtime safety limit allows.",
   "whyItMatters": "Short-cycling slashes seasonal efficiency (each start has a purge cycle that dumps heated combustion air up the stack) and accelerates heat-exchanger and ignition-control failure.",
   "whatToDo": "Check the boiler's minimum run timer, the supply-water setpoint range, and the staging logic. Oversized boilers are the most common root cause — consider modulating-burner retrofit or condensing replacement."
  },
  {
   "id": "fdd_plant07_chiller_kw_per_ton_drift",
   "slug": "plant-07d-chiller-efficiency-drifting",
   "code": "PLANT-07D",
   "title": "Chiller efficiency drifting",
   "family": "plant",
   "familyName": "Central plant",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "The chiller uses more kW for the same cooling than it did at the start of the data.",
   "whyItMatters": "Fouled tubes, refrigerant loss or a control problem cost efficiency quietly for years.",
   "whatToDo": "Check condenser approach and tube cleanliness, refrigerant charge, and compressor / VFD control; compare against the manufacturer's curve."
  },
  {
   "id": "fdd_plant08_low_load_chiller_runtime",
   "slug": "plant-08-chiller-running-at-very-low-load",
   "code": "PLANT-08",
   "title": "Chiller running at very low load",
   "family": "plant",
   "familyName": "Central plant",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "The chiller idles below a quarter of its rated draw for hours.",
   "whyItMatters": "Part-load efficiency is poor and the compressor cycles; a smaller machine, staging or thermal storage would carry it.",
   "whatToDo": "Review staging setpoints and minimum-load unloading; consider a pony chiller or free cooling for light loads."
  },
  {
   "id": "fdd_plant09_chws_reset_absent",
   "slug": "plant-09-chilled-water-supply-reset-absent",
   "code": "PLANT-09",
   "title": "Chilled-water supply reset absent",
   "family": "plant",
   "familyName": "Central plant",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": true,
    "weather": false
   },
   "effort": "medium",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "The chilled-water supply setpoint stays flat for weeks while the weather swings.",
   "whyItMatters": "Every degree of warmer chilled water is ~1.5–2% chiller energy; a fixed setpoint gives that up all year.",
   "whatToDo": "Add a supply-temperature reset on OAT or valve position, with a dewpoint low limit."
  },
  {
   "id": "fdd_plant10_cw_setpoint_reset_absent",
   "slug": "plant-10-condenser-water-reset-absent",
   "code": "PLANT-10",
   "title": "Condenser-water reset absent",
   "family": "plant",
   "familyName": "Central plant",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": true,
    "weather": false
   },
   "effort": "medium",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "The condenser-water setpoint never follows the wet-bulb.",
   "whyItMatters": "Colder condenser water is free chiller efficiency whenever the wet-bulb allows it.",
   "whatToDo": "Reset the tower setpoint on wet-bulb plus approach, within the chiller's minimum lift."
  },
  {
   "id": "fdd_plant11_tower_approach_high",
   "slug": "plant-11-cooling-tower-approach-high",
   "code": "PLANT-11",
   "title": "Cooling-tower approach high",
   "family": "plant",
   "familyName": "Central plant",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "Tower leaving water is far above the outdoor wet-bulb with the fans working.",
   "whyItMatters": "Scale, fouled fill or poor water distribution raises chiller lift and kW per ton.",
   "whatToDo": "Inspect fill and nozzles, check water treatment and blowdown, verify fan and float operation."
  },
  {
   "id": "fdd_plant12_tower_fan_staging_ineff",
   "slug": "plant-12-tower-fans-overshooting-setpoint",
   "code": "PLANT-12",
   "title": "Tower fans overshooting setpoint",
   "family": "plant",
   "familyName": "Central plant",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "Tower fans at full speed while the leaving water is already colder than setpoint.",
   "whyItMatters": "Fan energy spent making water colder than the chiller asked for.",
   "whatToDo": "Tune the tower fan loop / staging and check the leaving-water sensor."
  },
  {
   "id": "fdd_plant13_decoupler_reverse_flow",
   "slug": "plant-13-decoupler-reverse-flow",
   "code": "PLANT-13",
   "title": "Decoupler reverse flow",
   "family": "plant",
   "familyName": "Central plant",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "The secondary loop pulls more water than the primary supplies.",
   "whyItMatters": "Return water short-circuits through the decoupler, the building supply temperature rises, and coils starve at peak.",
   "whatToDo": "Stage another chiller/primary pump earlier, or reduce secondary pump speed; check the flow meters."
  },
  {
   "id": "fdd_plant14_hw_return_temp_high_condensing",
   "slug": "plant-14-condensing-boiler-not-condensing",
   "code": "PLANT-14",
   "title": "Condensing boiler not condensing",
   "family": "plant",
   "familyName": "Central plant",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "Hot-water return to a condensing boiler is warm enough that the flue gas cannot condense, so the boiler runs as a conventional one.",
   "whyItMatters": "Above the dewpoint of the flue gas the boiler runs at 85% instead of 95%; the premium paid for a condensing boiler is lost.",
   "whatToDo": "Lower the supply-temperature reset, fix the loop ΔT (coil valves, bypasses), and verify the return sensor."
  },
  {
   "id": "fdd_plant15_hw_low_dt",
   "slug": "plant-15-hot-water-loop-low-delta-t",
   "code": "PLANT-15",
   "title": "Hot-water loop low ΔT",
   "family": "plant",
   "familyName": "Central plant",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "The hot-water loop ΔT collapses while the boiler runs.",
   "whyItMatters": "Over-pumping and bypassed coils raise pump energy and return temperature (killing condensing).",
   "whatToDo": "Check three-way valves and bypasses, pump speed / ΔP reset, and coil control valves."
  },
  {
   "id": "fdd_plant16_pump_dp_reset_absent",
   "slug": "plant-16-pump-delta-p-reset-absent",
   "code": "PLANT-16",
   "title": "Pump ΔP reset absent",
   "family": "plant",
   "familyName": "Central plant",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": true,
    "weather": false
   },
   "effort": "medium",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "The secondary pump differential-pressure setpoint is flat for weeks.",
   "whyItMatters": "Without a valve-position reset the pumps ride the curve at full ΔP all year — often 20–40% of pump energy.",
   "whatToDo": "Implement trim-and-respond ΔP reset on the most-open valve; verify the ΔP sensor location."
  },
  {
   "id": "fdd_rtu01_compressor_short_cycling",
   "slug": "rtu-01-compressor-short-cycling",
   "code": "RTU-01",
   "title": "Compressor short-cycling",
   "family": "rtu",
   "familyName": "Packaged RTU / DX",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "The compressor is starting far more often than a healthy unit should.",
   "whyItMatters": "Every start is inrush current, poor oil return and no cooling delivered; it is the fastest way to kill a compressor.",
   "whatToDo": "Check the anti-short-cycle timer, the thermostat/setpoint deadband, low-charge and high-head trips, and whether the unit is grossly oversized for the zone."
  },
  {
   "id": "fdd_rtu02_stage_hunting",
   "slug": "rtu-02-cooling-heating-stage-hunting",
   "code": "RTU-02",
   "title": "Cooling / heating stage hunting",
   "family": "rtu",
   "familyName": "Packaged RTU / DX",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "A stage is flipping on and off many times an hour.",
   "whyItMatters": "Hunting wears contactors and never settles the space; it usually means the staging deadband or sensor is wrong.",
   "whatToDo": "Widen the stage deadband / inter-stage delay; check for a noisy or badly located space sensor."
  },
  {
   "id": "fdd_rtu03_dx_capacity_degradation",
   "slug": "rtu-03-dx-cooling-capacity-degraded",
   "code": "RTU-03",
   "title": "DX cooling capacity degraded",
   "family": "rtu",
   "familyName": "Packaged RTU / DX",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "On hot days with the compressor running the supply air is not getting as cold as the coil should make it.",
   "whyItMatters": "Lost capacity means longer run hours, higher kWh per ton and comfort complaints on the hottest days — classic low charge or a fouled coil.",
   "whatToDo": "Check refrigerant charge and superheat/subcooling, clean condenser and evaporator coils, verify the second stage actually energizes."
  },
  {
   "id": "fdd_rtu04_integrated_economizer_unused",
   "slug": "rtu-04-integrated-economizer-not-used",
   "code": "RTU-04",
   "title": "Integrated economizer not used",
   "family": "rtu",
   "familyName": "Packaged RTU / DX",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "The compressor runs while outdoor air is cool enough for free cooling and the damper is parked at minimum.",
   "whyItMatters": "Free cooling is the cheapest cooling there is; a locked-out economizer wastes it for every cool hour of the year.",
   "whatToDo": "Check the economizer changeover setting and sensor, the damper actuator and linkage, and any 'economizer disabled' override."
  },
  {
   "id": "fdd_rtu05_heat_cool_stage_overlap",
   "slug": "rtu-05-heat-and-cool-stages-on-together",
   "code": "RTU-05",
   "title": "Heat and cool stages on together",
   "family": "rtu",
   "familyName": "Packaged RTU / DX",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "A heating stage and a compressor stage are energized at the same time.",
   "whyItMatters": "Gas or electric heat is being removed by the compressor — pure waste, and hard on both.",
   "whatToDo": "Check the thermostat/controller mode logic and the heat/cool interlock; look for a stuck contactor."
  },
  {
   "id": "fdd_rtu06_fan_runs_no_call",
   "slug": "rtu-06-supply-fan-running-after-hours-with-no-call",
   "code": "RTU-06",
   "title": "Supply fan running after hours with no call",
   "family": "rtu",
   "familyName": "Packaged RTU / DX",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": true,
    "weather": false
   },
   "effort": "low",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "The fan runs outside the schedule with neither heating nor cooling active.",
   "whyItMatters": "Fan 'on' instead of 'auto' after hours adds thousands of fan hours a year and pulls in unconditioned outdoor air.",
   "whatToDo": "Set the fan to auto during unoccupied periods; check for a manual override or a schedule that never releases."
  },
  {
   "id": "fdd_rtu07_high_compressor_runtime_low_oat",
   "slug": "rtu-07-high-compressor-runtime-on-cool-days",
   "code": "RTU-07",
   "title": "High compressor runtime on cool days",
   "family": "rtu",
   "familyName": "Packaged RTU / DX",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "On days cool enough that mechanical cooling should barely run, the compressor runs most of the time.",
   "whyItMatters": "Points at low charge, a failed economizer, a setpoint problem, or a space sensor in the sun.",
   "whatToDo": "Verify economizer operation and changeover, refrigerant charge, and the zone sensor location/setpoint."
  },
  {
   "id": "fdd_hp01_aux_heat_lockout",
   "slug": "hp-01-auxiliary-heat-without-lockout",
   "code": "HP-01",
   "title": "Auxiliary heat without lockout",
   "family": "hp",
   "familyName": "Heat pumps / VRF",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "low",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "Electric resistance / auxiliary heat runs while it is warm enough for the compressor to carry the load.",
   "whyItMatters": "Resistance heat costs about three times heat-pump heat; a missing lockout is one of the largest single wastes on a heat pump.",
   "whatToDo": "Set an outdoor lockout for auxiliary heat (typically 30–40 °F), check the balance point and the thermostat staging."
  },
  {
   "id": "fdd_hp02_defrost_excess",
   "slug": "hp-02-excessive-defrost",
   "code": "HP-02",
   "title": "Excessive defrost",
   "family": "hp",
   "familyName": "Heat pumps / VRF",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "The outdoor coil is defrosting far more than it should.",
   "whyItMatters": "Each defrost reverses the cycle and often energizes aux heat; excess defrost is a large hidden heating penalty.",
   "whatToDo": "Check the defrost sensor / board and its termination temperature, coil cleanliness, airflow and refrigerant charge."
  },
  {
   "id": "fdd_hp03_hp_short_cycling",
   "slug": "hp-03-heat-pump-compressor-short-cycling",
   "code": "HP-03",
   "title": "Heat-pump compressor short-cycling",
   "family": "hp",
   "familyName": "Heat pumps / VRF",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "The heat-pump compressor is starting far more often than a healthy unit should.",
   "whyItMatters": "Inrush, oil return and wear with little useful output.",
   "whatToDo": "Check the anti-short-cycle timer, thermostat deadband, refrigerant charge and sizing."
  },
  {
   "id": "fdd_hp04_reversing_valve_mode_mismatch",
   "slug": "hp-04-reversing-valve-mode-mismatch",
   "code": "HP-04",
   "title": "Reversing valve / mode mismatch",
   "family": "hp",
   "familyName": "Heat pumps / VRF",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "The unit says heating but the supply air is colder than return (or the opposite in cooling).",
   "whyItMatters": "A stuck reversing valve or a wrong mode point means the unit works against the space every time it runs.",
   "whatToDo": "Verify the reversing-valve solenoid and coil, the mode/changeover point wiring, and the thermostat configuration."
  },
  {
   "id": "fdd_vrf01_simultaneous_mode_conflict",
   "slug": "vrf-01-vrf-indoor-units-in-conflicting-modes",
   "code": "VRF-01",
   "title": "VRF indoor units in conflicting modes",
   "family": "hp",
   "familyName": "Heat pumps / VRF",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "On a heat-pump (non-heat-recovery) VRF system, some indoor units call for heating while others call for cooling.",
   "whyItMatters": "The losing zones get nothing while the outdoor unit hunts; comfort complaints and wasted compressor hours.",
   "whatToDo": "Group zones with similar loads on each outdoor unit, use master-mode selection or a heat-recovery system where loads genuinely differ."
  },
  {
   "id": "fdd_vrf02_unit_runtime_imbalance",
   "slug": "vrf-02-vrf-indoor-unit-runtime-imbalance",
   "code": "VRF-02",
   "title": "VRF indoor unit runtime imbalance",
   "family": "hp",
   "familyName": "Heat pumps / VRF",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "diagnostic",
   "pricingLabel": "Diagnostic — not priced",
   "diagnosticImpact": "reliability",
   "whatItMeans": "One indoor unit runs several times longer than its siblings.",
   "whyItMatters": "Usually an undersized unit, a bad thermostat location, or a space used very differently from the design — the outdoor unit runs for one zone.",
   "whatToDo": "Check the heavy zone's setpoint, sensor placement and load; consider rebalancing or resizing."
  },
  {
   "id": "fdd_bp01_building_static_out_of_band",
   "slug": "bp-01-building-pressure-out-of-band",
   "code": "BP-01",
   "title": "Building pressure out of band",
   "family": "doas",
   "familyName": "DOAS / ERV / exhaust",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": true,
    "weather": false
   },
   "effort": "medium",
   "pricing": "diagnostic",
   "pricingLabel": "Diagnostic — not priced",
   "diagnosticImpact": "reliability",
   "whatItMeans": "Building static pressure is negative or excessive during occupancy.",
   "whyItMatters": "Negative buildings pull in humid or cold air and make doors hard to open; over-pressurized buildings push moist air into walls.",
   "whatToDo": "Rebalance supply, return and exhaust; check the relief/return damper control and the pressure sensor location."
  },
  {
   "id": "fdd_doas01_supply_setpoint_not_met",
   "slug": "doas-01-doas-supply-setpoint-not-met",
   "code": "DOAS-01",
   "title": "DOAS supply setpoint not met",
   "family": "doas",
   "familyName": "DOAS / ERV / exhaust",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "diagnostic",
   "pricingLabel": "Diagnostic — not priced",
   "diagnosticImpact": "comfort",
   "whatItMeans": "The dedicated outdoor-air unit's supply temperature misses its setpoint for an hour or more while running.",
   "whyItMatters": "The terminal units downstream inherit a latent and sensible load they were never sized for — humidity complaints and lost capacity.",
   "whatToDo": "Check coil capacity and chilled-water availability, the reset schedule, the wheel/recovery section and the sensor location."
  },
  {
   "id": "fdd_ef01_exhaust_without_supply",
   "slug": "ef-01-exhaust-running-without-supply",
   "code": "EF-01",
   "title": "Exhaust running without supply",
   "family": "doas",
   "familyName": "DOAS / ERV / exhaust",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "Exhaust fans run while the supply fan is off.",
   "whyItMatters": "The building goes negative and draws unconditioned, unfiltered air through the envelope, doors and flues.",
   "whatToDo": "Interlock exhaust with supply, fix the schedules, and check for exhaust fans on local switches left on."
  },
  {
   "id": "fdd_ef02_exhaust_schedule_override",
   "slug": "ef-02-exhaust-running-outside-the-schedule",
   "code": "EF-02",
   "title": "Exhaust running outside the schedule",
   "family": "doas",
   "familyName": "DOAS / ERV / exhaust",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": true,
    "weather": false
   },
   "effort": "low",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "General exhaust runs during unoccupied hours.",
   "whyItMatters": "Fan energy plus the make-up air that has to be heated or cooled to replace what is exhausted.",
   "whatToDo": "Put the exhaust on the occupancy schedule; keep only code-required continuous exhaust running."
  },
  {
   "id": "fdd_erv02_bypass_misuse",
   "slug": "erv-02-energy-recovery-bypass-open-when-recovery-pays",
   "code": "ERV-02",
   "title": "Energy-recovery bypass open when recovery pays",
   "family": "doas",
   "familyName": "DOAS / ERV / exhaust",
   "guideline36": false,
   "source": "bas",
   "needs": {
    "schedule": false,
    "weather": false
   },
   "effort": "medium",
   "pricing": "capacity",
   "pricingLabel": "Capacity-based",
   "diagnosticImpact": null,
   "whatItMeans": "The recovery bypass is open while indoor and outdoor temperatures differ a lot.",
   "whyItMatters": "The recovery section is being bypassed exactly when it would save the most energy.",
   "whatToDo": "Check the bypass control logic (economizer / frost control), the damper actuator and any manual override."
  }
 ]
}
