v1.18.0 — Threat Horizon Forecaster + machine-readable --version
v1.18.0 — Threat Horizon Forecaster + machine-readable --version
A focused minor release that adds one new agentic advisor and finally makes
winsentinel --version safe to call from CI, inventory, and packaging scripts.
✨ New: Threat Horizon Forecast Advisor
ThreatHorizonForecastAdvisor is the sixth agentic sibling alongside
FixOrchestrationPlanner, AlertRoutingAdvisor, AttackerProfileSynthesizer,
PostureRegressionExplainer, and PolicyExceptionRiskAdvisor.
It produces a forward-looking 7-day threat-pressure forecast (0–100) by
blending recent attacker-side recon signals with defender-side posture context:
- Attacker signals (8): port scans, brute-force attempts, IOC matches,
phishing waves, rogue DNS, dark-web mentions, anomalous outbound, etc.
Each contribution is weighted by velocity, freshness, and distinct-source
dedup so a single noisy source can't dominate. - Defender overhang (5): open critical findings, attack-surface size,
recent posture regressions, recently revoked exceptions, exposed assets. - Risk-appetite shift: Cautious +5 / Aggressive −5.
- Verdict ladder:
Calm→Elevated→Imminent→UnderPressure,
graded A–F. - Per-day forecast curve with attacker-decay modeling.
- P0-first hardening playbook (
BLOCK_KNOWN_IOCS,RATE_LIMIT_AUTH,
HARDEN_PERIMETER, war-room convene on 2+ P0s, …). - Cross-signal insights: network / auth / user heat concentration,
compound pressure, sustained pressure. - Renderers: Text / Markdown / JSON.
🐛 Fixes
-
#194 — Machine-readable
--version. Adds two CI/inventory-friendly
variants that compose with the existing 4-line human banner:winsentinel --version --quiet→ bare version string (e.g.1.18.0)winsentinel --version --json→ stable JSON
{ product, version, informationalVersion, runtime, os, machine }
After
--version, only--quiet/--jsonare greedily consumed; any
other trailing flag is rejected with a clear error. -
#192 —
--versionnow reflects the real installed version.
PrintVersionwas readingAssembly.GetName().Version, which returns
the staticAssemblyVersionattribute (pinned at1.0.0.0for binding
stability). With MinVer driving the package version from git tags into
AssemblyInformationalVersion, the printed banner was stuck atv1.0.0
even though the installed tool was1.16.1+. Switched the banner to read
AssemblyInformationalVersionAttribute(withAssemblyFileVersion+
AssemblyName.Versionas fallbacks) and strip the SourceLink
+commitshametadata so the output stays clean for support tickets.
Covered by 4 new regression tests inConsoleFormatterTests.
🧹 Maintenance
- Dependabot config: group minor+patch updates (NuGet, GitHub Actions,
Docker) into single PRs per ecosystem, add ananalyzersgroup, expand
the test-stack group, and ignore semver-major bumps on
mcr.microsoft.com/dotnet/{sdk,runtime,aspnet}base images. The
Dockerfile is pinned to8.0-windowsservercore-ltsc2022to match the
net8.0-windowsTFM across every project; major base-image bumps
require a coordinated TFM migration and are now tracked manually
instead of re-opened weekly by Dependabot.
⬆️ Upgrade
dotnet tool update --global WinSentinel.Cli
winsentinel --version --jsonFull Changelog: v1.17.0...v1.18.0