1d423c6625
estimate_scan_hours() was pure masscan math — zero nmap time modeled. For masscan+nmap and geo-scout modes with 10K masscan hits, actual nmap time dominates but was completely invisible in the estimate. Added nmap phase calculation using empirical constants: - NMAP_TIME_PER_HOST_SEC = 10 (nmap -sV -T4 per host) - MASSCAN_HIT_RATE = 0.01 (fraction of IPs with open ports) - _NMAP_WORKERS = 10 (matches WEBRUNNER_NMAP_WORKERS default) Also fixed build_estimate_table() partial-chunk overestimation: last chunk was billed at full preset size regardless of actual IP count, causing 1.5-2x cost inflation for non-aligned scan ranges.