Thermal Feasibility Checker — methodology
Method version 1.6.0 · dataset thermal-limits 2026-09-29 · engine: /engines/thermal-feasibility-checker/ · dataset: datasets/thermal-limits.json
A categorical design review, not a thermal simulation. Every limit it holds a design against is the vendor's published number with the document quoted; the only engineering figures are the cooling and enclosure bands, and they are labelled class E.
Contents
1. What it decides, and what it does not
The checker answers one design-review question: for this module, at this power, in this enclosure class, with this cooling class, at the hottest ambient the site sees — is the thermal design worth building? It returns FEASIBLE, MARGINAL, NOT FEASIBLE, REQUIRES VALIDATION or UNKNOWN.
It does not predict a junction temperature, a throttle onset or a time-to-throttle. Those depend on the actual heatsink, thermal interface, airflow path and workload, none of which a form can capture. The roadmap decision behind this engine is that a categorical answer from the vendor's own limits is honest; a predicted temperature from a form is not.
2. Inputs
| Input | Values | Default | Used by |
|---|---|---|---|
platform | module id (Jetson Orin Nano / NX / AGX Orin family, Thor T5000 / T4000, Raspberry Pi 5, RK3588, Hailo-8 / 8L, Coral Dev Board) | required | all checks |
power_w | module power in W | the rated watts of the preset power_mode resolves to, else the vendor's maximum module power; an uncapped preset (MAXN, MAXN_SUPER), which has no rated watts, uses the vendor's maximum module power and is named as uncapped | power ceiling, cooling capacity |
power_mode | nvpmodel preset id from the power-mode registry, a wattage ceiling such as 30w, maxn or default (see Power mode below) | none; with no power_w either the checks run at the vendor's maximum module power, listed in provenance.defaulted as power_mode | power resolution, power-mode ceiling |
enclosure | open_frame · vented · vented_fan · sealed_fanless · outdoor_sealed | open_frame | ambient rating, cooling resistance, fan in sealed |
cooling | none · passive_small · passive_large · active_reference · active_high_flow · liquid | active_reference | cooling resistance or passive dissipation, fan in sealed |
ambient_max_c | maximum site ambient (°C); alias ambient_c | 25 | ambient rating, cooling resistance |
altitude_m | 0–6000 m | 0 | cooling capacity (air density) |
solar_rise_c | extra internal rise from sun load (°C) | 0 | enclosure air |
carrier | id from the production-carrier registry | — | ambient rating (the carrier's rated range), fan-in-sealed note |
Enclosure air = ambient + the enclosure class's internal rise + solar rise. A thermal-transfer-plate rating is a plate temperature the cooling has to hold, so the TTP range is checked against the site ambient; ambient and module ratings are checked against the enclosure air.
Inputs (WP-01). A field that is not stated takes its documented default and is listed in provenance.defaulted; a field that is stated but invalid — a count of 0, a negative, a fraction or a non-number, true in place of a count, an unknown value of an enumerated input, or an empty string — is rejected with VALIDATION_ERROR naming the field, never replaced by a default.
Input keys (WP-02). The engine accepts one list of input keys — the inputs documented here and their declared backward-compatible aliases. Unknown input keys are rejected with VALIDATION_ERROR naming the key: an invented or misspelt key is never silently ignored, a __ test hook never reaches the engine, and an alias sent together with the key it stands for is rejected too (the engine would read only one of them). export_json.inputs echoes every input the engine honoured, so replaying it reproduces the result.
3. The checks
| Check | Compares | Status | Class |
|---|---|---|---|
ambient_rating | Site ambient (TTP-rated modules) or enclosure air (others) against the module's published operating range and, when given, the carrier's rated range; when only a lower limit is published, enclosure air against the SoC operating limit as a class D anchor | PASS inside every range and below the SoC limit when that anchor applies; FAIL outside any range or above the SoC limit when the site air alone is (air around a powered module is a floor on its temperature); REQUIRES VALIDATION when only the class E enclosure rise carries the air there; UNKNOWN when no ceiling is published and no SoC limit can carry it — never PASS with available null | A (vendor ranges); D when the SoC limit carries the ceiling |
power_ceiling | Module power against the vendor's maximum module power | PASS at or below; FAIL above; UNKNOWN without a published maximum | A (identity / requirement) |
power_mode_ceiling | Present only when a requested power mode is a ceiling the module cannot meet: its lowest preset (or, for a module without presets, its stated power) against the requested watts | FAIL — the other checks still run at that lowest draw | A (power-mode registry / vendor rating) |
cooling_resistance | Deliverable thermal resistance (°C/W) of the cooling class in this enclosure against the resistance the vendor limit demands | see §4 | D (class A limit × class E band) |
passive_dissipation | Module power (W) against the bare-module idle allowance when cooling: none | REQUIRES VALIDATION above idle (the idle allowance is class E, so the miss cannot eliminate); NEAR LIMIT at idle; not used when a heatsink class is selected | E |
fan_in_sealed | A cooling class that needs airflow inside a sealed enclosure | REQUIRES VALIDATION when both (a class E design rule cannot eliminate); PASS otherwise — compatibility only, no numeric comparison | E |
Unknown input keys are rejected; ambient_c is the only documented alias and maps to ambient_max_c.
Power mode. A requested power mode is read as a power ceiling, through the one resolver Jetson Power & PSU, Compute Fit, Camera Stream Capacity and Hardware Match use. An id that is neither a preset of the module, a wattage ceiling, MAXN nor default is a validation error naming power_mode (HTTP 400). A requested mode that is not a preset of the module is sized at the module's highest preset at or below the requested ceiling, and workload.power_mode_request publishes the ceiling, the selected preset and the resolution; when every preset of the module exceeds the ceiling, a power_mode_ceiling FAIL makes the verdict NOT FEASIBLE.
For example, a 30 W request on a Jetson Orin Nano 8GB (presets 7 W, 15 W, 25 W, MAXN_SUPER) is sized at its 25 W preset, and a 5 W request fails: its lowest preset is 7 W. A module without power-mode presets runs at its vendor maximum module power, and fails the same way when that maximum is above the requested ceiling. A named mode is never sized at the vendor maximum as though no power were given.
Cooling resistance, the only arithmetic
required °C/W = (limit − margin − enclosure air) / power, where the limit is the maximum TTP temperature for
modules with a thermal transfer plate (AGX Orin, Thor) and the SoC operating limit for modules without one (Orin NX / Nano,
Raspberry Pi 5) — the vendor's number, quoted in the dataset — and the margin is 5 °C for a TTP limit (the vendor already
specifies it with margin) or 10 °C for a SoC junction limit.
deliverable °C/W = band / (airflow factor × air density), where the band is the cooling class's engineering
thermal resistance, the airflow factor is the enclosure class's, and air density follows altitude (1.00 at sea level,
0.78 at 2000 m). The module's own junction-to-plate resistance is inside the vendor limit and is not added again.
The check misses when deliverable > required (or required ≤ 0). Only evidence that can prove the miss makes it a FAIL
(elimination authority). When required ≤ 0 the enclosure air is already at or above the design target and no cooling class can deliver it; that is FAIL: NOT FEASIBLE when the site air alone is at or above the vendor limit, because the air around a powered module is a floor on its temperature and no estimate moves it. When it is the class E enclosure rise or design margin that closes the gap, the miss rests on planning-only evidence and the check is REQUIRES VALIDATION with the shortfall stated, with a cooler site, a vented enclosure or a lower power mode as the remedy. A miss that rests on the class E cooling band (deliverable > required > 0) is REQUIRES VALIDATION too, because a band cannot eliminate a module that a deployment-specific thermal design could still cool. NEAR LIMIT when deliverable is at least 80 % of required, or when the
estimated surface temperature (enclosure air + power × deliverable) is within the 5 °C marginal band of the target. PASS
otherwise. UNKNOWN when the module has no published limit or no power is known. A bare module (none) above
idle power is REQUIRES VALIDATION: the idle allowance it is compared with is class E.
4. Verdict rule
- UNKNOWN — the module has neither a TTP / SoC limit nor an operating range on record.
- NOT FEASIBLE — any check FAILs.
- REQUIRES VALIDATION — no FAIL, but a check is UNKNOWN because the vendor does not state the limit (for example Hailo-8 has an operating range but no plate or junction limit, so the cooling check cannot be made), or a check misses only on planning-only evidence — the class E cooling band, enclosure rise or design margin, the bare-module allowance or the sealed-enclosure fan rule (§3). That row carries
elimination_authority: planning_only, its demoted status and the shortfall. - MARGINAL — no FAIL or UNKNOWN, but the cooling check is NEAR LIMIT.
- FEASIBLE — every check PASSes.
A module drawing exactly its rated maximum is MARGINAL, not FEASIBLE: the rating is the permitted operating point, but it leaves no allowance for workload variation, peripheral draw, transient load, aging or measurement error.
A FEASIBLE verdict for a SoC-limited module whose datasheet defers the ambient ceiling to the thermal design guide carries LOW confidence: the ambient enters only through the cooling check.
ambient_rating never reports PASS with available null — a material unknown cannot read as PASS.
5. Cooling classes, enclosure classes and margins
| Cooling class | Band (°C/W) | Needs airflow | Typical of |
|---|---|---|---|
| none | — | no | Bare module; not a supported operating condition above idle |
| passive_small | 1.6 | no | Module-sized extruded heatsink in fanless Orin Nano / NX systems |
| passive_large | 0.5 | no | Industrial enclosure using the chassis as the heatsink |
| active_reference | 0.8 | yes | Developer-kit class fan heatsink |
| active_high_flow | 0.3 | yes | AGX-class blower / ducted fan; the AGX Orin guide's worked example needs 0.58 °C/W at MaxN, Thor's 0.49 °C/W |
| liquid | 0.1 | no | Cold-plate solutions |
| Enclosure class | Airflow factor | Internal rise (°C) | Sealed |
|---|---|---|---|
| open_frame | 1.00 | 0 | no |
| vented | 0.75 | 7 | no |
| vented_fan | 0.90 | 3 | no |
| sealed_fanless | 0.40 | 20 | yes |
| outdoor_sealed | 0.30 | 15 (+ solar rise input) | yes |
Margins: 5 °C design margin on a TTP limit, 10 °C on a SoC junction limit, 5 °C marginal band. The bands, factors, rises and margins are class E engineering figures — anchored on the reference designs and worked examples in the vendor thermal design guides, not measured per product — and are published in the dataset so they can be argued with.
6. Vendor limit table and sources
| Module | Limit surface | TTP max | SoC operating / max | Operating range | Max module power | Vendor example | Source |
|---|---|---|---|---|---|---|---|
| Jetson AGX Orin 64GB / 32GB | TTP | 80 °C | 99 / 105 °C | −25 to 80 °C | 60 / 40 W | 0.58 °C/W | Jetson AGX Orin Series Thermal Design Guide TDG-10943-001; Modules Data Sheet DS-10662-001 |
| Jetson AGX Orin Industrial | TTP | 85 °C | 105 / 115 °C | −40 to 85 °C | 75 W | — | same |
| Jetson Orin NX 16GB / 8GB, Orin Nano 8GB / Super / 4GB | SoC | — | 99 / 105 °C | −25 °C floor (ceiling deferred to the guide) | 40 / 40 / 25 / 25 / 15 W | — | Jetson Orin NX Series and Orin Nano Series Thermal Design Guide TDG-11127-001 v1.5; Orin Nano / Orin NX datasheets |
| Jetson Thor T5000 / T4000 | TTP | 80 / 75 °C | 90 / 115 °C (trip 118) | — | 130 / 70 W | 0.49 °C/W; junction-to-plate 0.18 / 0.24 °C/W | Jetson Thor Series Modules Thermal Design Guide TDG-12271-001 v1.3 |
| Rockchip RK3588 | ambient | — | — / 125 °C | 0 to 80 °C | board-dependent | — | RK3588 Datasheet Rev 2.2 |
| Raspberry Pi 5 | SoC | — | 80 / 85 °C (throttle onset / max) | 0 to 70 °C (class C) | 12 W | — | raspberrypi.com “Heating and cooling Raspberry Pi 5”; forum statement (class C) |
| Hailo-8 / 8L | ambient | — | — | −40 to 85 °C (industrial grade) | 2.5 W typical | — | hailo.ai product page |
| Coral Dev Board | ambient | — | — | 0 to 50 °C | — | — | Coral Dev Board datasheet |
Every row in datasets/thermal-limits.json carries the document, URL, retrieval date and a verbatim quote of at most 25 words for each limit. Vendor datasheets hosted on distributor or community mirrors are class A by document with the mirror noted. The engine returns the module's sources with every result.
7. Alternatives and remediation
With a limit and a power on record the engine also reports, for the chosen enclosure and altitude, every cooling class with
its deliverable °C/W and whether it passes (and whether it would be marginal), the power the chosen cooling can hold at this
ambient ((limit − margin − air) / deliverable), and, for sealed enclosures, what a vented enclosure would do to the
internal air. Each failing or marginal check names the remediation that flips it: a lighter cooling class that passes, a
power ceiling, a vented enclosure, a wider-rated module or carrier.
8. Evidence classes and confidence
- A — vendor thermal design guides, datasheets and product pages (all limits and ranges except the Raspberry Pi 5 range).
- C — a Raspberry Pi engineer's forum statement for the Pi 5 operating range.
- D — the cooling-capacity constraint (class A limit combined with a class E band) and an ambient check carried by the SoC / TTP limit.
- E — cooling bands, enclosure factors and rises, margins, the fan-in-sealed rule, the no-heatsink rule.
Confidence: HIGH for ambient and power checks with published figures; MEDIUM for a TTP-limited cooling check; LOW for a SoC-limited cooling check, an ambient check carried by the limit, or any UNKNOWN. The overall confidence is the lowest of the four.
9. What invalidates a result
- A poor thermal interface or partial contact with the thermal transfer plate — the bands assume the guide's full-contact mounting.
- Unbalanced workloads: the Thor guide gives a higher junction-to-plate resistance for unbalanced loads; the checker uses the balanced figure inside the vendor limit.
- A power figure below the workload's real sustained draw — use the preset's watts or a measured module power, not the idle figure.
- Solar gain on an outdoor enclosure that exceeds the solar rise you entered.
- An enclosure that does not match its class (a “vented” box with blocked vents behaves as sealed).
- Altitude above 6000 m, or ambient outside −60 to 90 °C, which the engine rejects.
10. Method changelog
| Method | Dataset | Date | Change |
|---|---|---|---|
| 1.6.0 | 2026-09-29 | 2026-09-29 | Evidence labels and Super envelope (#279): Raspberry Pi 5 operating range is class C; power_ceiling at a Super preset uses the power-mode registry Super envelope maximum. |
| 1.5.0 | 2026-09-08 | 2026-09-29 | elimination authority (#263, owner ruling 2026-09-29). A check FAILs only when the evidence can prove the miss: site air (not the class E enclosure rise or design margin) at or above a vendor limit. A miss on the cooling band, a required resistance of 0 °C/W or less closed only by the rise or margin, the bare-module idle allowance and the sealed-enclosure fan rule are planning-only: REQUIRES VALIDATION with the shortfall stated (was NOT FEASIBLE). Every row publishes elimination_authority. |
| 1.4.0 | 2026-09-08 | 2026-09-29 | A named power mode is resolved by the shared resolver every engine uses (bug #250): a mode the module lacks is a ceiling, sized at the highest preset at or below it and published in workload.power_mode_request; a ceiling below every preset (or, without presets, below the stated power) adds a power_mode_ceiling FAIL (NOT FEASIBLE); an unrecognised id is a 400 naming power_mode. Before, 30w or maxn on an Orin Nano and 50w on an Orin NX read “no power given” (vendor maximum), 20w on an Orin NX and 40w on an AGX Orin ran a preset above the request (legacy-id table), AGX Orin 60w and Thor 100w were read as a measured draw, and an unknown id ran at the vendor maximum. With neither power_w nor power_mode the vendor maximum is listed in provenance.defaulted as power_mode (bug #257); that default is unchanged. A preset the module has is sized exactly as before. |
| 1.3.2 | 2026-09-08 | 2026-09-28 | An uncapped power-mode preset (MAXN, MAXN_SUPER: the power-mode registry lists no rated watts) is still sized at the vendor's maximum module power, and the power-ceiling assumption now names the preset as uncapped instead of reading “no power given” (#245, the Jetson Power & PSU wording). No figure, check or verdict changed. |
| 1.3.1 | 2026-09-08 | 2026-09-28 | Input rules (WP-01 remainder, WP-02): power_w, cooling, enclosure, ambient_max_c, altitude_m and solar_rise_c that are stated but malformed are rejected instead of defaulted; their defaults are listed in provenance.defaulted. Unknown input keys are rejected; power_condition, which was accepted but never read, is no longer an input. No formula changed. |
| 1.3.0 | 2026-09-08 | 2026-09-27 | A required thermal resistance of 0 °C/W or less (enclosure air already at or above the design target) is a hard cooling FAIL and NOT FEASIBLE; it is no longer demoted to REQUIRES VALIDATION with a negative °C/W target, and the remedy names a cooler site, a vented enclosure or a lower power mode. |
| 1.0 | 2026-09-08 | 2026-09-08 | First release. Fifteen modules with vendor limits (NVIDIA Jetson Orin / Thor thermal design guides and datasheets, Rockchip RK3588 datasheet, Raspberry Pi, Hailo and Coral pages), six cooling classes, five enclosure classes, TTP / SoC margins; four checks and the categorical verdict rule. |
Method changes bump the method version; new or re-verified vendor limits bump the dataset version. Both are in every result and in the citation block.