Skip to content

Commit 55c8676

Browse files
Producer GuyProducer Guy
authored andcommitted
Add profile + Smart + calibration redesign spec to roadmap with research citations
1 parent c74734d commit 55c8676

1 file changed

Lines changed: 86 additions & 0 deletions

File tree

ROADMAP.md

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,92 @@ Research-grade data export: `thermalforge log`
5959

6060
---
6161

62+
## Profile + Smart + Calibration Redesign (In Progress)
63+
64+
The entire profile system, Smart curve, and calibration need to be redesigned as one cohesive system. Current profiles are binary switches that immediately set fans to a fixed percentage. They should be proportional curves that respect Apple's fan hardware behavior.
65+
66+
### Research basis
67+
68+
Apple's fan hardware behavior (sources: macos-smc-fan reverse engineering, Tunabelly blog, NMB/Nidec fan motor engineering docs, Analog Devices fan controller datasheets):
69+
70+
- **0 to minimum RPM is binary** — fans jump from off to minimum (2317 RPM on M5 Max, 1200 on M1 Max, 1000 on Mac Studio). No slow start possible — brushless DC motors require a startup burst to overcome static friction. Hardware limitation, not software.
71+
- **Above minimum, smooth ramping** — Apple ramps at ~350-550 RPM/sec up, ~150-300 RPM/sec down. Evaluated every 100ms with small increments.
72+
- **Start/stop cycles are the #1 fan bearing wear factor** — fluid dynamic bearings suffer contact wear during startup (boundary lubrication before hydrodynamic film builds). Minimize on/off cycling.
73+
- **Once spinning, keep spinning** — Apple holds fans at minimum RPM with hysteresis rather than cycling between 0 and spinning. At least 5°C hysteresis between start and stop thresholds.
74+
- **Smoother transitions extend lifespan up to 50%** — per fan engineering literature. Abrupt speed jumps while running cause acoustic and mechanical transients.
75+
76+
### Profile curve design
77+
78+
Each profile has three zones:
79+
80+
**Zone 1: Off** — below the stop threshold, fans stay at 0 RPM (Apple auto).
81+
**Zone 2: Minimum hold** — between stop threshold and start threshold (hysteresis band), fans stay at minimum RPM if already running, stay off if already off.
82+
**Zone 3: Proportional curve** — above the start threshold, fan speed scales proportionally from minimum RPM to the profile's max RPM cap, increasing with temperature.
83+
84+
Ramp governors (matching Apple's behavior):
85+
- Ramp up: max ~400 RPM/sec (~5% of max per 2-second tick)
86+
- Ramp down: max ~200 RPM/sec (~2.5% of max per 2-second tick, already implemented)
87+
88+
### Profile specifications
89+
90+
| Profile | Fans off below | Start ramp at | Max fan speed | Target ceiling | Stop threshold |
91+
|---|---|---|---|---|---|
92+
| **Silent** | 73°C | 78°C | Apple default (reset to auto) | 78°C | 73°C |
93+
| **Balanced** | 50°C | 60°C | 60% of max RPM | 70°C | 50°C |
94+
| **Performance** | 45°C | 50°C | 85% of max RPM | 65°C | 45°C |
95+
| **Max** | Never | Always on | 100% | N/A | N/A |
96+
| **Smart** | 60°C | 60°C | 100% (adapts) | 85°C | 60°C |
97+
98+
**Balanced example curve (60-70°C, 0-60% of max RPM):**
99+
- 60°C: fans jump to minimum RPM (2317)
100+
- 63°C: fans at ~30% of max RPM (~2348 RPM, just above min)
101+
- 65°C: fans at ~40% of max RPM (~3130 RPM)
102+
- 67°C: fans at ~50% of max RPM (~3913 RPM)
103+
- 70°C: fans at 60% of max RPM (~4696 RPM) — cap reached
104+
- Below 50°C and stable: fans off
105+
106+
The curve between start and ceiling is proportional, not stepped. Fan speed = minRPM + (maxRPMCap - minRPM) × ((temp - startTemp) / (ceilingTemp - startTemp)).
107+
108+
**Silent** is special: it doesn't control fans directly. It stays in Apple auto mode and only intervenes if temp hits 78°C, at which point it resets to auto (letting Apple's own thermal management handle it). Below 73°C it returns to hands-off. This is for users who want ThermalForge monitoring without fan control.
109+
110+
### Smart curve redesign
111+
112+
Smart uses the same three-zone model but with:
113+
- Rate-of-change awareness: if temp is rising, boost fan speed proportionally to the rate
114+
- Calibration data: the adaptive intensity finder discovers the machine's thermal response, and calibration maps how each fan speed handles proportional load
115+
- Without calibration: conservative S-curve (already built, stays as fallback)
116+
117+
### Calibration redesign
118+
119+
Calibration needs to work with the new curve system:
120+
- Pre-calibration: adaptive intensity finder discovers ~1°C/sec stress level (already built)
121+
- At each fan level: ramp load using discovered baseline, measure where temp stabilizes within the curve
122+
- Records: at what fan percentage does this machine hold each temperature target?
123+
- Smart uses this to choose the right point on its curve for current conditions
124+
125+
### Logging changes
126+
127+
- Log every fan speed change: from RPM, to RPM, what triggered it (profile curve, rate boost, safety)
128+
- Log when fans turn on from idle (with temperature that triggered it)
129+
- Log when fans return to idle (with temperature and stability confirmation)
130+
- Temperature anomaly logging with process capture (already built: >10°C in 30s)
131+
132+
### Build order
133+
134+
1. Redesign FanProfile model — add curve parameters (startTemp, ceilingTemp, stopTemp, maxRPMPercent)
135+
2. Add ramp-up governor to ThermalMonitor (~400 RPM/sec)
136+
3. Implement proportional curve in ThermalMonitor.tick() for Balanced/Performance
137+
4. Implement Silent as hands-off with 78°C intervention
138+
5. Redesign Smart to use same curve model with rate-of-change and calibration
139+
6. Update calibration to work with new curve parameters
140+
7. Add fan speed change logging
141+
8. Update all documentation (README, ROADMAP, in-app text)
142+
9. Audit and debug
143+
10. Test on M5 Max
144+
11. Test on Mac Studio and M1 Max
145+
146+
---
147+
62148
## Planned Features
63149

64150
### Enhanced Logging

0 commit comments

Comments
 (0)