Roadmap
S2DCartographer follows a milestone-based release cadence. Each milestone targets a focused capability area. The current stable release is v1.9.0, published live on PSGallery.
Live status of everything below is tracked on GitHub Milestones.
Upcoming — v2.0.0 — Extended Hardware Coverage
| Issue | Feature |
|---|---|
| #25 | OEM-specific disk enrichment — extend Get-S2DPhysicalDiskInventory with vendor-specific data from Dell iDRAC, HPE iLO, Lenovo XClarity, and DataON interfaces. Surfaces drive bay location, predicted failure, and platform-level health alongside standard S2D disk data. Pending a validation environment across all four vendors. |
Upcoming — Future Release — Visualization, Scoring & Output
Feature uplift covering interactive diagrams, graduated health check scoring, PDF layout improvements, and operational robustness. Targeting a release after v2.0.0.
Health Check & Scoring
| Issue | Feature |
|---|---|
| #57 | Graduated threshold scoring — partial-credit rules for health checks; replaces flat pass/fail with weighted, threshold-based scoring. |
| #58 | Named calculation references — pre-computed aggregates defined in health check config; depends on #57. |
| #59 | Health check config download and hot-swap — download and upload the health check JSON config via CLI without re-running collection; depends on #57, #58. |
Visualization
| Issue | Feature |
|---|---|
| #60 | vis.js interactive topology diagram — cluster, pool, and volume hierarchy rendered as an interactive in-browser diagram. |
| #61 | html2canvas diagram capture — embed the interactive vis.js diagram as a PNG in PDF and Word reports; depends on #60. |
PDF & Report Layout
| Issue | Feature |
|---|---|
| #62 | Page-break-aware table helper — automatic header repeat across page breaks for all multi-page tables. |
| #63 | Portrait/landscape page switching per PDF section — wide tables switch to landscape and back; depends on #62. |
| #64 | Conditional cell coloring — status and severity-based colour coding in HTML and PDF tables; depends on #62. |
Output & Cost
| Issue | Feature |
|---|---|
| #65 | JSON evidence export — raw collected data export with no scoring metadata, for downstream tooling and audit trails. |
| #68 | Azure Hybrid Benefit and licensing cost savings — surface AHB coverage, per-core cost, and potential savings in the report. |
UX
| Issue | Feature |
|---|---|
| #66 | Full-screen progress overlay — named collection stage labels shown during run so operators know what is happening. |
| #67 | Per-section search and filter — search input in HTML report to filter table rows per section. |
Completed
| Version | Highlights |
|---|---|
| v1.9.0 | Provisioning-aware 70% headroom presentation — amber/warning on the 70% KPI tile, waterfall planning-line row, and headroom table fires only when thin-provisioned volumes are present. All-fixed clusters render 70% as advisory/neutral. Get-S2DExpansionHeadroom gains HasThinVolumes boolean. "Size to enter (New-Volume / WAC)" column — each headroom row shows the exact value to type ({TiB-floor2}TB); PowerShell/WAC read suffixes as binary. JSON snapshot gains SizeToEnterTiB per threshold. WAF correction: N+1/N+2 re-framed as compute advisory — v1.8.0 incorrectly treated this as a storage check; corrected to informational context only (Status='Info', no storage verdict, Check 12 always Status='Pass' at Severity='Info'). Reports re-labelled as compute advisory. |
| v1.8.0 | Maintenance reserve (N+1) assessment — reports whether the scanned cluster has enough free capacity (beyond the rebuild reserve) to drain a node for updates, per Microsoft Well-Architected guidance. New MaintenanceReserveN1 health check and report indicator (Meets / Does not meet, with required vs available headroom in TB and TiB); configurable target via -MaintenanceReserveTarget None|N+1|N+2 (default N+1). Assessment only — does not change any measured capacity number. Mirrors Surveyor's optional N+1/N+2 deduction. |
| v1.7.1 | Expansion Headroom report section (HTML, Word, PDF, JSON) — at 70% / 80% / 90% / 100% pool-fill targets, shows remaining pool footprint and new usable data (footprint ÷ resiliency copies) in TB and TiB, with a Chart.js chart; 70% row styled as the recommended planning line. Math identical to Surveyor's so the two tools reconcile. Fixed per-volume capacity efficiency to derive from the measured FootprintOnPool ÷ Size ratio — a two-copy mirror now correctly reports 50% (was mislabeled 25% on two-node clusters). |
| v1.7.0 | Wave 3 — Validation & report correctness. Cross-tool reconciliation keystone: golden-cluster Pester suite (24 cases, 4 clusters) asserts Cartographer engine output reconciles with Surveyor within ±2% (AB#4633). Concurrent collection guard prevents overlapping runs from corrupting shared state (AB#279). Empty-data safeguards added to Get-S2DCapacityWaterfall, Get-S2DHealthStatus, and Get-S2DStoragePoolInfo (AB#279). PDF waterfall bar now uses exact byte-derived TB values (AB#263 / #53). PDF pool allocation reserve boundary and pool health bar x-axis fixed (AB#264 / #54). Word executive summary table given explicit column widths and cell padding (AB#265 / #55). Word overall document layout — margins, fixed-layout tables, hand-tuned column widths (AB#266 / #56). |
| v1.6.0 | Wave 2 — Legibility. Every capacity figure now carries both TB and TiB labels plus a space badge (FOOTPRINT, DATA (usable), INFORMATIONAL) in the waterfall and HTML report (AB#4645). 70% planning line added — 70% of available-for-volumes vs. consumed volume footprint, matching Surveyor's definition exactly; surfaced as a KPI tile and dashed chart line (AB#4644). |
| v1.5.0 | Wave 1 — Capacity accuracy. Resiliency factor always derived from each volume's actual NumberOfDataCopies; fallback changed from 3.0 to 2.0 (two-way mirror) with explicit labeling when assumed (AB#4642). Reserve calculation confirmed canonical — one capacity drive per server, up to 4 drives, raw-byte basis (AB#4643). |
| v1.4.2 | Fix RebuildCapacity false Critical when NodeName grouping is unreliable after pool-member disk deduplication. |
| v1.4.1 | Fix pool-member disk duplication on multi-node clusters — Get-PhysicalDisk on any S2D node returns all pool members globally; deduplicate by UniqueId to prevent 4× inflation of Stage 1 raw capacity. Adds top-level NodeCount to JSON snapshot. |
| v1.4.0 | 7-stage waterfall (Stage 8 removed), stage health isolation (all stages always OK, reserve health on ReserveStatus only), reserve formula corrected, infra volume detection extended (UserStorage_N, HCI_UserStorage_N, SBEAgent), HTML delta column, Word report waterfall table, Invoke-S2DCapacityWhatIf delta loop fix. Closes #46–#52. |
| v1.3.1 | Sample output reports in docs. |
| v1.3.0 | What-if capacity modeling (Invoke-S2DCapacityWhatIf), thin provisioning risk detection (Check 6 tiered thresholds + new Check 11 ThinReserveRisk), ThinGrowthHeadroom / MaxPotentialFootprint volume properties, Thin Provision Risk KPI in HTML report, Invoke-S2DWaterfallCalculation pure function. Closes #27, #44. |
| v1.2.1 | Capacity model correctness — pool-member-only Stage 1, purely theoretical Stages 7/8, resiliency factor from pool settings. Closes #43. |
| v1.2.0 | JSON snapshot export (SchemaVersion 1.0), opt-in CSV per-collector tables, pool-member disk filter (IsPoolMember) across reports and health checks, Surveyor cross-link in docs, -IncludeNonPoolDisks switch. Closes #35, #40, #41, #42. |
| v1.1.1 | Fix parameter-set splat in Invoke-S2DCartographer that broke -KeyVaultName and explicit -Authentication; added -Username parameter for Key Vault secrets without a ContentType tag. Closes #39. |
| v1.1.0 | Default -Format changed to All; ImportExcel bundled as a RequiredModules dependency; per-run output folder structure <OutputDir>\<ClusterName>\<yyyyMMdd-HHmm>\; session log file; thicker pool allocation breakdown bar; full authentication / remoting / node fan-out docs with flowchart diagram. Closes #34, #36, #37, #38. |
| v1.0.8 | Fix Get-S2DHealthStatus crash on live clusters — replaced Generic.List[S2DHealthCheck] with a plain array to work around PowerShell class type resolution on dot-sourced classes. |
| v1.0.7 | Storage Pool Health bar (WAC-style), Pool Allocation Breakdown bar, Capacity Model stage descriptions, Critical Reserve Status KPI. |
| v1.0.2 – v1.0.6 | Workgroup / non-domain-joined connectivity fixes — WinRM authentication inheritance, TrustedHosts short-name resolution, per-node CIM fan-out FQDN resolution, pre-flight credential validation. |
| v1.0.0 | Full pipeline: all 6 collectors, HTML/Word/PDF/Excel reports, 6 SVG diagram types, Invoke-S2DCartographer orchestrator, 119 Pester tests, MkDocs documentation site. |
| v0.1.0-preview2 | Bug fix: non-domain-joined connectivity (Connect-S2DCluster). |
| v0.1.0-preview1 | Foundation: S2DCapacity class, ConvertTo-S2DCapacity, Connect-S2DCluster, Get-S2DPhysicalDiskInventory. |
Requesting Features
Open an issue at AzureLocal/azurelocal-s2d-cartographer using the feature request template. Include the cluster configuration context (node count, drive types, Azure Local version) — most useful features come from real deployment scenarios.