Roadmap
This roadmap maps 1:1 with tracked work in GitHub Issues. It outlines the
evolution of finfocus while strictly adhering to the technical
guardrails in CONTEXT.md.
Table of Contents
Section titled “Table of Contents”- Immediate Focus (v0.3.6)
- Near-Term Vision (v0.3.x)
- Future Vision (v0.4.0+)
- Completed Milestones
- Cross-Repository Feature Matrix
- Boundary Safeguards
Immediate Focus (v0.3.6)
Section titled “Immediate Focus (v0.3.6)”v0.3.5 released 2026-03-30.
- Implement EstimateCost RPC consumer (remove stub) (#847) [M]
- Implement BatchCost RPC consumer for multi-resource queries (#846) [L]
- Resource History Store with Layered Cost Attribution (#934) [L]
- Resource History Store — Code Review Follow-ups (from #934 PR review)
- Fix double-prefixing in
StackContext.Hash(#966) [S] - Extract correct URN hash segment in
filterFullyExpiredURNs(#968) [S] - Capture analyzer resource properties and extract tags into history (#955) [S]
- Populate tags in
convertDescriptorsToHistoryState(#956) [S] - Copy tags in
convertEngineStateToHistoryState(#957) [S] - Return success indicator from
detectHistoryStackContext(#958) [S] - Reuse loaded config in overview
initHistoryFromConfigcalls (#959) [S] - Use pointer type for
HistoryConfig.RetentionDays(#960) [S] - Only ignore missing-file errors in
GetProjectName(#961) [S] - Track newest entry per URN hash in
GetDeletedResources(#962) [S] - Set
enabled=falseonBoltStore.Close(#963) [S] - Merge tag timestamps instead of overwriting in
upsertTags(#964) [S] - Fix
newTestEntryWithTimeto ensureFirstSeen <= LastSeen(#965) [S] - Escape delimiters in
BuildTagKey(#967) [S]
- Fix double-prefixing in
Near-Term Vision (v0.3.x - Forecasting & Profiles)
Section titled “Near-Term Vision (v0.3.x - Forecasting & Profiles)”- Overview Performance Pipeline (deferred from v0.3.2)
- Overview TUI Quality (deferred from v0.3.2)
- Pricing Transparency (follow-up to #465 research)
- Contextual Profiles (“Dev Mode”)
(#368) [L]
- CLI: Implement
--profileflag (e.g.,dev,prod) to pass hints to plugins - Configuration: Allow default profile definition in
finfocus.yaml - Spec ready:
UsageProfileenum (PROD/DEV/BURST) available in finfocus-spec v0.5.5 — core-only implementation
- CLI: Implement
- Scale Testing
- Pulumi TypeScript scalability fixture for E2E performance testing (#658) [M]
- Spec v0.5.7 Features
- All v0.5.7 consumer items promoted to Immediate Focus
- Time-Series Forecasting Enhancement
- Enhance
cost estimatewith ARIMA + driver-based forecasting (#539) [L]
- Enhance
- Forecasting & Projections (“Cost Time Machine”)
(#364) [L]
- Projection Math Engine (Linear/Exponential extrapolation)
- TUI: ASCII Line Chart visualization for 6-12 month forecasts
- Status: Spec primitives available (GrowthType/GrowthRate)
Future Vision (v0.4.0+ - Notifications, Integrations & Backlog)
Section titled “Future Vision (v0.4.0+ - Notifications, Integrations & Backlog)”- Governance Overrides (“YOLO Mode”)
(#365) [M]
- CLI: Implement
--yolo/--forceflag to bypass budget gates - UX: “Warning Mode” UI styles for bypassed runs
- Blocked: Requires
BypassReasonenum in finfocus-spec (not yet defined)
- CLI: Implement
- External Notifications
- Webhook and email notifications for budget alerts (#220) [L]
- Note: Requires external service integration to maintain core statelessness per CONTEXT.md boundaries
- Recommendation Lifecycle Enhancements (spec-first)
- Cost Time Machine (depends on #548)
- Phase 1 — MVP:
cost history collect+view --plainwith asciigraph and bbolt storage (#549) [L] - Phase 2 — Interactive TUI: ntcharts TimeSeriesLineChart with pan/zoom, provider split, budget overlay (#550) [L]
- Phase 3 — Export & Sparklines: JSON/CSV/NDJSON export + inline sparkline indicators (#551) [M]
- Cost history diff: resource-level change attribution (#554) [L]
- Prune & retention policy (#555) [M]
- Mixed-currency snapshot handling (#556) [M]
- CI/CD automation recipes (documentation) (#553) [S]
- Phase 1 — MVP:
- Cache Architecture Improvements
- Add optional LRU in-memory cache layer to complement BoltStore (#495) [M]
- TUI Lazy Loading & Error Recovery (#483) [L] Deferred from TUI Phase 7
- Plugin integrity verification strategy (#164) [M]
- Accessibility options (—no-color, —plain, high contrast) (#224) [M]
- Configuration validation with helpful error messages (#223) [M]
- Plugin Generator Enhancements (Deprioritized — solo plugin dev)
- Update Plugin Generator Templates for spec v0.5.x (#248) [M]
- Generate Docker support files (#456) [S]
- Generate documentation templates (#457) [S]
- Add GetPluginInfo and Supports to calculator template (#458) [S]
- Add health endpoint to generated main.go (#459) [S]
- Enhanced Makefile template with new targets (#460) [S]
- Add new CLI flags for generation control (#461) [S]
- Generate standardized GitHub workflow files (#462) [S]
- Generate .golangci-lint.yml configuration (#493) [S]
- Use registry-based plugin install for cross-repo integration tests (#517) [M]
- Plugin developer upgrade command for SDK migrations (#270) [L] — Research
- Dependency Visualization (“Blast Radius”)
(#366) [L]
- TUI: Interactive Dependency Tree view (consuming Lineage Metadata)
- Cross-Repo: Consumes
CostAllocationLineage/ParentResourceIDfrom finfocus-spec
- Spot Market Advisor
(#367) [L]
- TUI: Highlight Spot savings in Cyan; show Risk Icon
- Display “Savings vs On-Demand” percentage
- Cross-Repo: Requires
PricingTier/SpotRiskenums in finfocus-spec; CE plugin implementsDescribeSpotPriceHistory
- Carbon Footprint Estimation
- Carbon footprint estimation plugin using Cloud Carbon Footprint methodology (#688) [L]
- Mixed-Currency Aggregation Strategy (MCP Alignment)
- Objective: Implement core-level grouping for multi-currency stacks to support the finfocus-mcp Mixed-Currency Research.
- Technical Approach: Enhance
CostResultaggregation logic to preserve currency codes and provide structured groupings for downstream consumers (CLI, TUI, MCP). - Success Criteria: Orchestrator returns grouped results by currency when multi-region/multi-currency resources are encountered.
- Markdown “Cost-Change” Report & CI/CD Bridge
- Objective: Enable automated PR feedback by providing a Git-native visualization of cost deltas.
- Technical Approach: Implement a new
OutputFormatterthat translatesCostResultmaps into GFM (GitHub Flavored Markdown) using collapsible<details>tags for per-resource breakdowns. - Anti-Guess Boundary: The engine MUST NOT calculate the delta itself if it isn’t already provided by the input source; it strictly formats data returned by the orchestration layer.
- Success Criteria: A valid GFM document is generated that renders
correctly in a GitHub comment using only data from the
CostResultarray.
- Pulumi Cloud API Integration (depends on #934)
- Pulumi Cloud API Integration for Historical State Snapshots (#935) [L]
- Agent Skills (co-located, tool-dependent)
-
plugin-manage— Discover, install, update, validate, and troubleshoot finfocus plugins via gRPC protocol (#911) [M] -
finfocus-diagnose— Debug plugin connectivity, config resolution, BoltDB cache issues, and zero-cost results (#913) [M] -
finfocus-budget— Configure, monitor, and troubleshoot budget thresholds with scoped rules, health tracking, and CI/CD exit codes (#914) [M] - Format: Agent Skills spec (SKILL.md + references/), installable via
npx skills add rshade/finfocus -s <name> - Generic cost workflow skills (cost-check, cost-drift, cost-optimize, budget-setup) live in rshade/agent-skills as multi-tool skills — see Split-Tier Placement consensus
-
- Cost Diff View
- Add cost diff view to
cost projectedcommand (#576) [M]
- Add cost diff view to
- Overview Command Enhancements (follow-ups from #578)
- Add
--output jsonsupport tofinfocus overview(#579) [M] - Add
--force-colorand--no-colorflags to overview command (#641) [S] - Interactive pre-flight confirmation prompt for overview command (#642) [S]
- Warning column and
OverviewWarningtype (#643) [M] - Test coverage for overview enrichment and CLI to 80%+ (#645) [L]
- Overview command documentation with screenshots (#646) [M]
- Add
- Config Refactoring
- Thread budget flag overrides explicitly instead of mutating global config singleton (#808) [M]
- Platform Reliability
- Reimplement plugin installer lock for Windows reliability (#573) [M]
- Stateless Cost-Policy Linting
- Objective: Prevent accidental cost overruns by flagging resources that exceed organizational informational thresholds.
- Technical Approach: Compare the
Monthlyfield of aCostResultagainst a static threshold defined in a localpolicy.yaml. - Anti-Guess Boundary: This is a comparison-only feature; the core MUST NOT attempt to “optimize” or “suggest remediation” for the resource configuration.
- Success Criteria: The CLI produces a “Policy Violated” diagnostic when a plugin-returned cost exceeds the user-defined threshold.
Completed Milestones
Section titled “Completed Milestones”2026-Q1
Section titled “2026-Q1”- Add
--state-onlyflag to skip pulumi preview (#690) [M] (Completed 2026-03-31) - Clarify budget status visibility in overview output modes (#855) [S] (Completed 2026-03-31)
- Agent Skills (Batch) (Completed 2026-03-27)
- Update aws-public plugin to install router by default (#895) [S] (Completed 2026-03-26)
- Consume
expires_atcaching hints from plugin cost responses (#845) [M] (Completed 2026-03-26) - Recognize
PLUGIN_CAPABILITY_BATCH_COSTin capability routing and plugin list (#848) [S] (Completed 2026-03-10) - Show property changes in overview detail view (#852) [M] (Completed 2026-03-03)
- Upgrade finfocus-spec from v0.5.6 to v0.5.7 (#844) [S] (Completed 2026-03-02)
- Add
config routes listandconfig routes testCLI commands (#687) [M] (Completed 2026-03-02) - Bubble Tea v2 Upgrade (Completed 2026-03-01)
- False-positive drift for resources created mid-month in overview (#760)
- Implement
GetPricingSpecandEstimateCostmethods on RecorderPlugin (#734) - Short flags (
-s,-f,-a) for overview command (#644) - Overview TUI Quality Fixes (Completed 2026-02-28)
- TUI & Engine Fixes (Completed 2026-02-28)
- BoltDB Cache Stability (post-#674 migration fixes)
-
BoltStore.Setreturns nil when disabled, inconsistent with other methods (#682)
-
- Analyzer Quality Fixes (Completed 2026-02-27)
- Eliminate duplicate
ResolvePolicyPackDircall inRunChecks(#822) - AnalyzeStack stack summary always shows $0.00 (0 resources analyzed) (#746)
-
--forcereinstall does not sync policy pack binary, leaving it stale (#754) -
analyzer installshould setup policy pack directory for--policy-packworkflow (#755) -
analyzer installshould print PATH setup instructions post-install (#756) - Add
finfocus analyzer checkcommand for setup verification (#757)
- Eliminate duplicate
-
compact()leaves store unusable if reopen fails after rename (#681) - CLI tests leak real
~/.finfocusconfig causing JSON parse failures (#809) - Integration Test Coverage (Completed 2026-02-24)
- Add TUI interactive mode integration tests (#735)
- Add cache system integration tests (#736)
- Add concurrency and performance regression tests (#738)
- Add project-local config and config precedence tests (#739)
- Add analyzer concurrency and partial failure tests (#740)
- Resolve nightly build tag fragmentation (#741)
- Add plugin resilience and crash recovery tests (#742)
- Wait for enrichment goroutine before plugin cleanup in overview (#716)
- Overview Enrichment & Budget Display (Completed 2026-02-22/23)
- CLI & Change Detection Fixes (Completed 2026-02-22)
- CI & Code Quality Housekeeping (Completed 2026-02-22)
- Test Infrastructure Sweep (Completed 2026-02-22)
- Fix always-skipped integration tests (#737)
- cli_helper global log suppression masks plugin errors in integration tests (#743)
- Make
TestGetProjectedCost_PartialDataorder-independent (#788) - Fix vacuous exit code 0 test in budget_scoped_test.go (#786)
- Close plugin clients in
TestNewClient_SuccessandTestClient_APIUsage(#785) -
stubHomeshould clearFINFOCUS_HOMEfor hermetic config tests (#784) - Deduplicate env setup and fix fragile assertion in plugin_validate_test.go (#782)
- Consolidate 5
TestGetPluginInfo_*tests into table-driven (#776) - Remove duplicate flat tests in
pulumi_plan_test.go, merge into table-driven (#775) - Consolidate 4 near-identical cost projected tests into table-driven (#774)
- Batch Bug Fixes (Completed 2026-02-22)
- Investigate intermittent $0.00 projected costs in TUI overview (#723)
- Recorder plugin returns nil summary on
GetRecommendations, flooding diagnostics (#747) - Analyzer JSON logs appear in
pulumi previewDiagnostics section (#748) - Analyzer install creates double-v version directory (#749)
- Registry
ListPluginssilently skips directory-level symlinks (#750) -
AnalyzerPlugin.Enabledconfig field is dead code — never read (#751) -
FINFOCUS_PLUGIN_DIRenv var documented but not implemented (#752) -
plugins.dirconfig key documented but excluded from YAML parsing (#753)
- Test Quality Improvements (Completed 2026-02-22)
- Post-v0.3.1 Fixes (Completed 2026-02-21)
- feat(tui): splash screen — figlet banner, phase checklist, passphrase prompt (#728)
- Parallelize per-row enrichment sub-calls (#694)
- Use lipgloss styles in
renderInitializingViewfor consistency (#719) - fix: applyPassphraseEnv uses process-wide
os.Setenv(not concurrency-safe) (#761) - fix: replace hardcoded “730h/mo” footnote with
engine.HoursPerMonthconstant (#763) - fix: TestDetectChanges_StatErrorSkipsFile fails on Windows (no symlink privilege guard) (#764)
- fix: missing
.Ctx(ctx)on log calls in changedetect.go loses trace_id propagation (#765) - fix: “Recs” table column width too narrow for N(-M) dismissed format (#766)
- Docs: Document that routing config does not apply in analyzer/policy-pack mode (#759)
- v0.3.1: Overview Performance & Docs Audit (Released 2026-02-18)
- Add timing instrumentation to overview command (#695)
- Launch TUI immediately with phase progress feedback (#689)
- Fix
resolveCacheDirglobal fallback places cache.db in wrong directory (#680) - Add provider/resource_type assertions to tag enrichment tests (#686)
- Documentation audit fixes for v0.3.0 features, plugin SDK, security (#702–#710)
- Install UX & Integrity (Completed 2026-02-16)
- Scale, Performance & Caching (Completed 2026-02-16)
-
--jobsflag and timing output for cost commands (#602) - Projected cost caching (#600)
- Benchmark PR reporting with benchstat regression detection (#657)
- Extract Cache interface and refactor FileStore (#541)
- Add caching to GetActualCost with 1-hour TTL (#542)
- Add caching to GetProjectedCost with SHA-based keys (#543)
- Transition persistent cache from JSON to BoltDB (bbolt) (#674) (Completed 2026-02-16)
-
- CLI Polish & Code Quality (Completed 2026-02-16)
- Router Wiring & Resource Filtering (Completed 2026-02-14)
- Config, CLI & Refactoring (Completed 2026-02-14)
- Scale & Testing (Completed 2026-02-14)
- Unified Overview & Analyzer Install (Completed 2026-02-14)
- GetPricingSpec Research & Code Quality (Completed 2026-02-14)
- Evaluate GetPricingSpec RPC usage in core (#465)
- Support GCP zone normalization in normalizeToRegion (#615, PR #631)
- Wrap errors from MapResources, MapStateResources, and resolveOverviewData (#609)
- Use comma-ok idiom for altMap assertions (#603, PR #630)
- CodeRabbit follow-up cleanup from auto-detect PR (#589)
- Deep copy CostBreakdown in appendActualCostResults to prevent source mutation (#614)
- Phantom $0 results from empty plugin responses (#595)
- Recorder plugin should not declare ACTUAL_COSTS capability (#596, PR #628)
- Bug Fixes & Stability (Completed 2026-02-14)
- Pulumi Auto-Detection (Completed 2026-02-13)
- Automatic Pulumi project detection for cost commands (#581, PR #586)
- TUI & Documentation Polish (Completed 2026-02-13)
- v0.3.0: Intelligence & Analysis (Completed)
- v0.2.6: Routing & Budget Enhancements (Released 2026-02-02)
- Intelligent Multi-Plugin Routing with feature-based plugin selection (#410, PR #507)
- Flexible budget scoping (per-provider, per-type, per-tag) (#221, PR #509)
- Sustainability metrics integration in Engine & TUI (#302)
- GreenOps carbon emission equivalency calculations (#303, PR #515)
- Tag-based budget filtering (#532, PR #535)
- v0.2.5: Testing & Stability (Released 2026-01-30)
- Multi-region E2E testing support (#185, PR #485)
- Pagination and NDJSON streaming for CI/CD integration (#225, PR #488)
- Exit codes for budget threshold violations (#219)
- Budget health calculation & threshold alerting (#267, PR #494)
- Provider filtering & summary aggregation for Budgets (#263, PR #494)
- v0.2.4: Final Polish (Released 2026-01-21)
- Dynamic Data Recording via Integration Plans (#275)
- Harden Nightly Analysis Workflow security and reliability (#325)
- Documentation for TUI features, budgets, and recommendations (#226)
- Budget status display in CLI (#217, PR #466)
- v0.2.1-v0.2.3: Polish & DX Improvements (Released 2026-01-17
through 2026-01-19)
- Add
--estimate-confidenceflag for actual cost transparency (#333) - Implement GetPluginInfo consumer-side requirements (#376)
- Parallel plugin metadata fetching in plugin list command (#408)
- Cross-Repository Integration Test Workflow (#236)
- Upgrade cost commands to enhanced TUI (#218)
- Plugin robustness: strict mode, config handlers, metadata fallback (#435, #434, #432, #431)
- Fallback to latest stable version when asset missing (#430)
- Budget filtering and summary aggregation logic (#446)
- Replace manual assertions with testify (#429)
- Plugin installer: remove old versions during install (#237)
- E2E test for actual cost command (#334)
- Set up AWS test account and infrastructure (#181)
- Fuzzing seeds, benchmarks, and validation improvements (#326)
- Documentation updates (#182, #349-#353, #454)
- Add
- v0.2.0: State-Based Costs & Plugin Maturity (Released 2026-01-16)
- State-based actual cost estimation for
cost actual(#380, #382) - Plugin info and dry-run discovery (#398)
- Ecosystem rebrand to FinFocus (#415)
- State-based actual cost estimation for
- v0.1.3-v0.1.4: Analyzer & Recommendations (Released 2025-12-27
through 2026-01-10)
- Core Analyzer implementation (#245, #229)
- E2E testing with Pulumi Automation API (#177, #238)
- Comprehensive E2E tests for Analyzer integration (#228)
- Add recommendations to analyzer diagnostics (#321)
- Shared TUI package with Bubble Tea (#222, #258)
- E2E and Conformance test reliability fixes (#323)
- AWS fallback scope and non-deterministic output fixes (#324)
2025-Q4
Section titled “2025-Q4”- v0.1.0-v0.1.2: Foundation & Observability (Released 2025-11-26
through 2025-12-03)
- Initial CLI & gRPC Plugin System (#163, #15)
- Standardized SDK & Interceptors (#188, #189, #191)
- Zerolog Integration & Structured Logging (#170, #206)
- Engine Test Coverage Completion (#202, #207)
- Plugin Ecosystem Maturity (#201, #215)
- Support for
Supports()gRPC handler (#160, #165) - CLI Filter Flag (#203)
- Test Infrastructure Hardening (#200)
Cross-Repository Feature Matrix
Section titled “Cross-Repository Feature Matrix”| Feature | spec | core | aws-public | aws-ce |
|---|---|---|---|---|
| Cost Time Machine | GrowthType | history collect/view | GrowthHint | Historical |
| YOLO Mode | BypassReason (missing) | —yolo flag | N/A | N/A |
| Blast Radius | Lineage | Impact Tree | Parent/child | N/A |
| GreenOps Receipt | CarbonFootprint | Converter | CCF Math | N/A |
| Spot Market Advisor | PricingTier | Cyan style | N/A | SpotHistory |
| Dev Mode | UsageProfile (v0.5.5) | —profile | Burstable | IOPS warn |
| What-If Analysis | EstimateCost | cost estimate | PropertyDelta | N/A |
| Rec Lifecycle | DismissRecommendation | dismiss/snooze | Dismiss | N/A |
| Auto-Detect | N/A | pulumi detect | N/A | N/A |
| Resource Filter | N/A | provider/component filter | N/A | N/A |
| Pricing Transparency | GetPricingSpec | —explain + fallback | PricingSpec | N/A |
Boundary Safeguards
Section titled “Boundary Safeguards”Sourced from CONTEXT.md — these are architectural hard no’s.
- No Direct Cloud API Calls: The core engine MUST NOT call cloud provider pricing or usage APIs directly. All provider-specific logic belongs in plugins.
- Minimal Persistent State: The tool is primarily stateless. Local persistence (config, dismissed.json, history DBs) is user-initiated and optional — never required for core command execution.
- Read-Only Infrastructure: FinFocus MUST NOT perform
pulumi up,pulumi destroy, or any operation that modifies cloud state. It reads infrastructure definitions only. - No Baked-in Provider Logic: The core engine MUST NOT contain hardcoded logic for specific cloud services. This logic is strictly delegated to plugins or YAML specs.
- No Financial Accounting: The tool handles cost estimation and projection. It is NOT a ledger, invoice matching system, or tax calculation engine.