Skip to content

Commit e2013a2

Browse files
jscott3201claude
andauthored
Add FCU fault family: 5 engine-verified rules — base library complete at 55 (batch 10) (#19)
FCU-FC-001 excessive operating state changes (change-counter with in-graph yWindowFull warm-up gate; count_scale 20.0 at 180 s tick, legal band 57.15 s <= dt <= 450 s), FCU-FC-002/003 SAT low/high in full heating/cooling (saturation conjunct > 99%, exposed as yHtgFullOk/yClgFullOk), FCU-FC-004/005 inactive coil leak pair (inactive_coil_threshold 3.0 C composed per G36 FC#3 sensor bands, fan-heat asymmetry documented). Closeout: AHU-FC-004 card's MovingAverage ring bound corrected (57.15 s, n+1 checkpoints — was 56.25 s); FCU-FC-001 added to CLU-01 (card proposal accepted); FCU README rows verified; root README refreshed to 55 rules / seven families. All 55 rules replay green at ENGINE_PIN e2ff2f8; lint ok. Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
1 parent c52938b commit e2013a2

25 files changed

Lines changed: 7137 additions & 17 deletions

README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,10 @@ Here is a real one — AHU-FC-050, simultaneous heating and cooling:
3434

3535
## What's inside
3636

37-
- **43 verified fault rules** (and counting) across air handlers
38-
(`faults/ahu/`, all 31 reference faults), rooftop units (`faults/rtu/`), and
39-
VAV terminal boxes (`faults/vav/`) — heat pump, fan coil, energy recovery,
40-
and VFD families in progress.
37+
- **55 verified fault rules** across seven equipment families: air handlers
38+
(`faults/ahu/`, all 31 reference faults), rooftop units (6), VAV terminal
39+
boxes (6), fan coil units (5), heat pumps (3), energy recovery ventilators
40+
(2), and VFDs (2) — every base fault in the reference, engine-verified.
4141
- **Point dictionaries** (`points/`) grounding every canonical point name in
4242
Brick 1.4.4 and ASHRAE 223P, so binding a rule to a real building is
4343
mechanical.

clusters/clusters.json

Lines changed: 45 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,14 @@
66
"id": "CLU-01",
77
"name": "Simultaneous Heating & Cooling",
88
"trigger": "AHU-FC-050",
9-
"members": ["AHU-FC-004", "AHU-FC-005", "AHU-FC-012", "AHU-FC-059", "AHU-FC-063"],
9+
"members": [
10+
"AHU-FC-004",
11+
"AHU-FC-005",
12+
"AHU-FC-012",
13+
"AHU-FC-059",
14+
"AHU-FC-063",
15+
"FCU-FC-001"
16+
],
1017
"playbook": "simultaneous-hc",
1118
"prevalence": "common",
1219
"energy_impact": "15-40% of AHU energy"
@@ -15,7 +22,11 @@
1522
"id": "CLU-02",
1623
"name": "Missing Reset Strategy",
1724
"trigger": "AHU-FC-057",
18-
"members": ["AHU-FC-058", "AHU-FC-053", "AHU-FC-065"],
25+
"members": [
26+
"AHU-FC-058",
27+
"AHU-FC-053",
28+
"AHU-FC-065"
29+
],
1930
"playbook": "missing-reset",
2031
"prevalence": "74% of buildings (PNNL 151-building study)",
2132
"energy_impact": "5-20% of site energy"
@@ -24,7 +35,11 @@
2435
"id": "CLU-03",
2536
"name": "Economizer Failure",
2637
"trigger": "AHU-FC-051",
27-
"members": ["AHU-FC-009", "AHU-FC-011", "RTU-FC-053"],
38+
"members": [
39+
"AHU-FC-009",
40+
"AHU-FC-011",
41+
"RTU-FC-053"
42+
],
2843
"playbook": "economizer-failure",
2944
"prevalence": "54% of RTUs (Cowan 2004)",
3045
"energy_impact": "5-20% of cooling energy"
@@ -33,7 +48,11 @@
3348
"id": "CLU-04",
3449
"name": "After-Hours Operation",
3550
"trigger": "AHU-FC-052",
36-
"members": ["SYS-FC-052", "SYS-FC-053", "AHU-FC-060"],
51+
"members": [
52+
"SYS-FC-052",
53+
"SYS-FC-053",
54+
"AHU-FC-060"
55+
],
3756
"playbook": "after-hours-operation",
3857
"prevalence": "~15%",
3958
"energy_impact": "3-16% of site energy"
@@ -42,7 +61,10 @@
4261
"id": "CLU-05",
4362
"name": "Zone Heating & Cooling Conflict",
4463
"trigger": "VAV-FC-055",
45-
"members": ["VAV-FC-052", "SYS-FC-056"],
64+
"members": [
65+
"VAV-FC-052",
66+
"SYS-FC-056"
67+
],
4668
"playbook": "vav-min-flow-reheat",
4769
"prevalence": "common",
4870
"energy_impact": "5-20% of zone energy"
@@ -51,7 +73,11 @@
5173
"id": "CLU-06",
5274
"name": "Chilled Water Plant Inefficiency",
5375
"trigger": "CHW-FC-050",
54-
"members": ["CHW-FC-051", "CHW-FC-052", "CHW-FC-053"],
76+
"members": [
77+
"CHW-FC-051",
78+
"CHW-FC-052",
79+
"CHW-FC-053"
80+
],
5581
"playbook": "chiller-efficiency",
5682
"prevalence": null,
5783
"energy_impact": "5-15% of chiller energy"
@@ -60,7 +86,9 @@
6086
"id": "CLU-07",
6187
"name": "Unnecessary Plant Operation",
6288
"trigger": "SYS-FC-050",
63-
"members": ["SYS-FC-051"],
89+
"members": [
90+
"SYS-FC-051"
91+
],
6492
"playbook": "unnecessary-plant-operation",
6593
"prevalence": null,
6694
"energy_impact": "100% of plant energy while active"
@@ -69,7 +97,10 @@
6997
"id": "CLU-08",
7098
"name": "Schedule Dysfunction",
7199
"trigger": "AHU-FC-052",
72-
"members": ["SYS-FC-057", "SYS-FC-053"],
100+
"members": [
101+
"SYS-FC-057",
102+
"SYS-FC-053"
103+
],
73104
"playbook": "after-hours-operation",
74105
"prevalence": "~15%",
75106
"energy_impact": "3-16% of site energy"
@@ -78,7 +109,12 @@
78109
"id": "CLU-09",
79110
"name": "Sensor Integrity Failure",
80111
"trigger": "AHU-FC-062",
81-
"members": ["AHU-FC-002", "AHU-FC-003", "SYS-FC-054", "SYS-FC-055"],
112+
"members": [
113+
"AHU-FC-002",
114+
"AHU-FC-003",
115+
"SYS-FC-054",
116+
"SYS-FC-055"
117+
],
82118
"playbook": "sensor-drift",
83119
"prevalence": "~15%",
84120
"energy_impact": "prevents false alarms; sensor-dependent"

faults/ahu/AHU-FC-004/card.md

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -178,10 +178,12 @@ basis: N/A.
178178
quietly — a mis-set `count_scale` produces a plausible-looking number.
179179
- **Minimum tick interval, from the same block.** Each `MovingAverage` instance
180180
keeps a fixed 64-checkpoint ring and silently drops the oldest in-window
181-
sample past that (one warning per instance), so the window must not hold more
182-
than 64 ticks: `dt ≥ count_window/64` = 3600/64 = **56.25 s**. Combined with
183-
the scale rule, a legal deployment has `dt ≥ 56.25 s` and
184-
`count_scale = 3600/dt ≤ 64`. At the default 300 s tick the window holds 12
181+
sample past that (one warning per instance). A window spanning n ticks
182+
retains n + 1 checkpoints (one sits at or before the trailing edge), so the
183+
window may span at most 63 ticks: `dt ≥ count_window/63` = 3600/63 =
184+
**57.15 s** (an earlier revision of this card said 56.25 s, dividing by 64).
185+
Combined with the scale rule, a legal deployment has `dt ≥ 57.15 s` and
186+
`count_scale = 3600/dt ≤ 63`. At the default 300 s tick the window holds 12
185187
samples, well inside the ring.
186188
- **Startup artifact (a): a spurious first-tick pulse, which costs nothing
187189
here.** `Integers.Change` compares against `pre_u_start` on the first tick, so

0 commit comments

Comments
 (0)