Development Log¶
2026-03-28 — Pre-launch audit: 23 issues fixed (5C / 7H / 7M / 4L)¶
Complete pre-launch audit across scientific correctness, code quality, testing, data integrity, and production readiness. All identified issues resolved.
Critical fixes:
C1 Gnielinski off-by-one:
if re <= 3000→if re < 3000— Re=3000 previously passed applicability but crashed the evaluator.C2 Churchill-Bernstein lower bound: Added explicit YAML assumption surfacing that this formula is a lower bound per the original paper (CB 1977, p. 304).
C3 Re gap 2300–3000 diagnostics: API router now returns excluded-correlation list instead of a generic “no methods” string when no correlations are applicable.
C4 Petukhov uncertainty corrected:
literature_uncertainty_pctraised 6% → 10% (primary source states ±10% for full Pr 0.5–2000 range).C5 Film temperature advisory: Pipeline now emits
warningslist when external geometry is used withoutwall_temperatureprovided.
High fixes:
H1/H3 Table upper-bound crashes: Hilpert Re=400,000 and Žukauskas Re=1,000,000 previously fell through all table bands and raised ValueError. Fixed by using
<=on table upper bounds.H2 Negative Nu guard: Turbulent plate now raises ValueError for Re < 5×10⁵ instead of returning negative Nu.
H4 Score clamping:
RankingEngine._score()now clamps result to [0.0, 1.0].H5 Dead code removed: Three unused engine singletons removed from
api/dependencies.py.H6 Petukhov test: Added
TestPetukhovwith formula accuracy and comparison tests.H7 ld_min validation: Applicability engine now enforces
ld_minfrom YAML validity dicts (using existingentry_length_ratiocomputed field).
Medium/Low fixes:
M2:
_require_re_prextracted tosrc/htcie/domains/_helpers.py; all three domain modules import from shared location.M3: Score-range test extended to Re=1e9 (extreme extrapolation path).
M4: Report timestamp uses
datetime.now(timezone.utc)(was naive local time).M6:
wall_prandtl_notemetadata key added when wall-Prandtl correction is applied.L4: Gnielinski test updated to reflect inclusive Re=3000 boundary.
2026-03-28 — Primary-source traceability audit (all 13 correlations)¶
Systematic audit of every literature_uncertainty_pct and key validity range against
primary sources and authoritative textbooks. Four substantive corrections; all 13
correlations now carry explicit source-traceability notes.
Substantive corrections:
Žukauskas tube bank
re_min(10 → 20): Primary source p.147 (Advances in Heat Transfer Vol. 8, 1972) explicitly states the validated-data summary covers “Re from 20 to 2×10^6”. YAML hadre_min: 10; Incropera references.yaml noted 16; primary source is authoritative at 20. Three-source discrepancy documented in YAML notes.Petukhov accuracy range (split by Pr): Primary source p.523 Eq.(50) states ±5–6% for Re 10^4–5×10^6 and Pr 0.5–200 separately from ±10% for Pr 0.5–2000. YAML note previously claimed ±6% uniformly for Pr up to 2000 — incorrect. Fixed with exact page citation.
Churchill-Bernstein lower-bound characterization: Original paper (p.304) explicitly states Eq.(9) “is proposed as a lower bound…data generally fall somewhat above.” No ±% is stated anywhere in the paper. YAML previously said “±20% reported in original paper” — corrected to lower-bound characterization with page citation.
Gnielinski ±10% attribution: The ±10% comes from Cengel & Ghajar 5th ed. (Section 8-5), not the 1976 original paper (inaccessible) or the available 2013 update (IJHMT 63:134-140, which does not restate this value). Attribution corrected.
Systematic UNCERTAIN flagging: All 13 literature_uncertainty_pct values annotated.
Only Petukhov’s ±5–6%/±10% is directly confirmed from a primary source. All others are
textbook-consensus estimates; each carries an explicit UNCERTAIN note explaining why the
primary source could not confirm the stated bound (paywall, no ±% in paper, analytical
solution only, or no single original paper).
Sources inspected: Žukauskas (1972), “Heat Transfer from Tubes in Crossflow,” Advances in Heat Transfer, Vol. 8 (pp. 142–157); Gnielinski (2013), “On heat transfer in tubes,” Int. J. Heat Mass Transfer, 63:134–140; Churchill & Bernstein (1977), “A Correlating Equation for Forced Convection from Gases and Liquids to a Circular Cylinder in Crossflow,” J. Heat Transfer (ASME), 99(2):300–306; Petukhov (1970), “Heat Transfer and Friction in Turbulent Pipe Flow with Variable Physical Properties,” Advances in Heat Transfer, Vol. 6, pp. 503–564 (p. 523); Sieder & Tate (1936), “Heat Transfer and Pressure Drop of Liquids in Tubes,” Ind. Eng. Chem., 28(12):1429–1435 (Table II).
2026-03-27 — Explicit tube bank arrangement field¶
Added arrangement: Optional[Literal["inline", "staggered"]] to Geometry in
state.py, required when geometry_type="tube_bank". Previously the arrangement
was inferred from S_T/S_L < 1.0, which made the Incropera Table 7.5 staggered
S_T/S_L ≥ 2 case (C₁=0.40) permanently unreachable.
Changes: state.py (new field + validator), tube_banks.py (removed _arrangement()
helper, added _require_arrangement() reading from state), YAML required_inputs
for both tube bank correlations, 3 test files updated.
2026-03-27 — Validation-grade correlation audit (Incropera 7th ed.)¶
Verified all 13 correlations against Incropera 7th edition (primary reference) and original papers. Corrected four substantive errors:
Žukauskas cylinder Pr exponent (
external.zukauskas_cylinder): Fixed from hardcodedn=0.36ton=0.37for Pr ≤ 10,n=0.36for Pr > 10 per Incropera Eq 7.53. This matters for gases (Pr ≈ 0.7), where the previous value was wrong.Žukauskas tube bank coefficients (
tube_banks.zukauskas): Corrected all Re bands against Incropera Table 7.5:Re < 100: inline 0.9→0.80, staggered 1.04→0.90
Re 100–1000: raised
ValueError(Incropera says approximate as single cylinder; previous values 0.52/0.71 were unsourced)Re > 2×10^5: inline 0.033/0.8→0.021/0.84, staggered 0.031·…/0.8→0.022/0.84
Added staggered S_T/S_L ≥ 2 case (C=0.40) — currently dead code pending explicit arrangement field in state schema (see TODO in tube_banks.py)
Dittus-Boelter Pr lower bound: corrected
pr_minfrom 0.7 to 0.6 per Incropera Eq 8.60. There_max=120000bound is retained (McAdams 1954).Sieder-Tate Pr upper bound: corrected
pr_maxfrom 17000 to 16700 per Incropera Eq 8.61.
All other correlations (Churchill-Bernstein, Hilpert, Pohlhausen, turbulent plate, Gnielinski, Petukhov, Shah laminar, Churchill-Ozoe, Grimison) verified correct.
Updated 4 YAML files, 2 domain source files, 2 test files. 167 tests pass.
2026-03-26 — HTML report renderer¶
Added
src/htcie/reports/renderer.pywithrender_html/save_htmlpublic API.Added
src/htcie/reports/templates/report.html.j2— self-contained Jinja2 template covering all report sections (input conditions, dimensionless groups, evaluations, ranking, spread, explanation).Exposed
render_html,save_html,dump_html_reportfromhtcie.reportspackage.Added “Save as HTML” button to htcie-gui evaluate page (disabled until evaluation runs).
Added demonstration cell to
notebooks/examples.ipynbunder “Using the Report Downstream”.Extracted shared test fixtures to
tests/unit/conftest.py; added 7 renderer tests.
2026-03-25 — Code quality and docstring pass¶
Added class and method docstrings throughout
src/htcie/.All formula-containing docstrings use LaTeX (
:math:RST role).Updated
docs/architecture/overview.mdwith full pipeline diagram and layer-by-layer detail.Updated
docs/architecture/scoring.rstwith correct v1 factor names, weights table, and threshold reference.Updated
docs/methods/metadata-schema.mdto reflect all implemented fields (removed stale “planned” notes).Updated correlation docs (
internal.rst,external.rst,tube_banks.rst) with formula descriptions and implementation notes.
Initial scaffold¶
Renamed starter kit to
htcieand regenerated the full repository scaffold.Implemented seven-layer pipeline: state → registry → applicability → evaluation → ranking → confidence → explanation/report.
Implemented 13 correlations across three domain families: 6 internal convection, 5 external convection, 2 tube banks.
Implemented Scoring v1 with eight weighted factors.
Added FastAPI REST API, Typer CLI, and NiceGUI web interface.
Added JSON and Markdown report serializers.