Post

Y-IaC: Product Planning

Y-IaC's roadmap as six milestones, an MVP cut from the risk order, a backlog split into six tracks, and change control for shared interfaces.

Y-IaC: Product Planning

Y-IaC already works: there are 684 commits since April 2025, a v1.0.0 tag and 19 consumer backends configured. So product planning here isn’t about getting to a first release. It’s about deciding what “mature” means for a shared platform and sequencing the work so that state safety and governance never wait behind a shiny feature.

Product roadmap

I run the backlog as six tracks. Each one has a different kind of owner and a different definition of done:

TrackExamples of workDone means
Module coverageNew resource types, missing GCP and AWS modules (AWS has 5, GCP 4)Module, unit template, README, import example, validator passes
CLI and toolingStack generation, import, visualization, error catalogTests, docs, no change to generated output unless intended
Workflow automationReusable workflows, drift, summaries, notificationsA consumer template update and release note
Security and complianceOPA policies, Wiz and Trivy config, exception processPolicy tests, evidence documented
DocumentationPersona guides, module reference, troubleshootingLinked from the getting-started index
Operational maturityLock recovery, dashboards, runbooks, DRRunbook exercised at least once

The roadmap is the order in which these tracks get attention, and that comes from the milestones below rather than from whoever asks loudest.

MVP definition

The guide’s MVP is the line below which the platform isn’t safe to hand to a new consumer:

  • a documented onboarding path;
  • a supported module catalog with consistent Terragrunt integration;
  • the shared CLI for validation, environment setup and Terragrunt dispatch;
  • PR plan and approval-based apply workflows;
  • Terraform/Terragrunt validation and Python tests;
  • required security and policy gates with an exception process;
  • state backend conventions, import guidance and basic troubleshooting;
  • ownership, release and support documentation.

Most of this exists in the repo today. The pieces I’d call unfinished are the exception process (the override flags exist, the procedure around them isn’t written) and ownership and support documentation (the guide lists roles, not names). Those two are the MVP’s remaining work, and they’re not code.

Release milestones

MilestoneOutcomeWhere Y-IaC is
FoundationConventions, ownership, supported providers, local setup, baseline testsLargely there; ownership not named
Consumer scaleOnboarding, config references, workflow templates, support paths stableTemplate and config reference exist; 19 backends configured
Module maturityCoverage, examples, validation, compatibility plans, upgrade guidanceValidator exists; coverage uneven across clouds
Governance maturityPolicy, security, cost, evidence, drift and exceptions are measurableGates exist; measurement and exceptions missing
Operational maturityReliability targets, dashboards, runbooks, DR drills, cost reportingNot started as a programme
Continuous improvementRoadmap driven by usage data, feedback and failuresNot started

Estimated targets, assuming the DevOps team keeps its current capacity: Governance maturity within two quarters of adopting this plan (measurement, exceptions and evidence export), and Operational maturity within four (dashboards, SLOs, DR drills). The release calendar lines up with these.

Backlog structure

Every backlog item, whatever the track, carries the same fields. The guide lists them and I’d make them the issue template:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
### Provider / module
cloud/azure/terraform/azurerm_key_vault

### Consumer impact
Which consumers use this module? Will their plan change?

### Acceptance criteria
- ...

### Test evidence
Validator output, pytest names, scratch consumer plan

### Documentation impact
README, import example, getting-started guide

### Security impact
New permissions, new data exposure, policy changes

### Rollback plan
Pin consumers to the previous ref, or revert and re-sync

The “consumer impact” field is the one people skip, and it’s the one that matters most on a shared platform. A grep for the resource type across consumer resources.yaml files answers it in seconds.

Prioritization approach

The ordering rule is the risk order from Requirements: state safety and security first, convenience last. Inside a level I’d break ties by number of consumers affected, then by effort.

Two practical rules on top of that:

  • Bugs in shared paths beat features. A bug in root.hcl or stack_generator.py hits every consumer; a bug in one module hits the consumers that use it.
  • Pending Verification is not done. The CHANGELOG marks several recent changes (Jira drift tickets, Wiz scanning, k3d node taints) as “Pending Verification”. I’d keep those at the top of the queue until someone has watched them work in a real consumer.

Budget and resource planning

The guide names the capacity this platform needs: module maintainers, Python maintainers, workflow owners, security reviewers, cloud administrators and technical writers. It doesn’t say how many of each exist.

Costs to plan for, beyond people:

CostDriver
GitHub Actions minutesPlan matrix per changed stack, plan-after-apply, weekly drift scan per consumer
Self-hosted runners (if used)infra-aws has tried both a self-hosted runner and ubuntu-latest
State storageAzure Blob, S3 and GCS, small but with versioning
Wiz and Infracost licencesOnly if those gates are enabled

Y-IaC is built and run by the DevOps team; it covers all the roles above rather than having separate module, Python and workflow teams. Wiz and Infracost should be budgeted with the security tooling, since they serve the security and FinOps owners as much as the platform.

Risk and dependency management

The risks I’d put on the register first:

RiskImpactMitigation
A shared change breaks many consumers at onceHighCompatibility workflow, consumers pin iac_shared_module_ref
A provider bump forces resource replacementHighoverride_versions per resource, plan review before the global bump
Stale lock released while a live apply holds itHighAge guard (LOCK_MIN_AGE_MINUTES), opt-in AUTO_RELEASE_LOCK
Long-lived client secrets for CIMediumMove to OIDC federated credentials (see Security)
Knowledge concentrated in few maintainersMediumPersona guides, ADRs, pairing on releases
External tools change behavior (Terragrunt stack, Wiz CLI)MediumPin tool versions in setup-environment

Dependencies: Terragrunt’s stack feature, provider registries, GitHub Actions, the state backends, and the gate tools.

Change-control process

Changes to these need explicit impact analysis and release notes before merge:

  • shared interfaces (module variables and outputs, YAML shapes);
  • generated workflow behavior (template/terragrunt-cicd.yaml);
  • backend handling and state operations;
  • policy and gate defaults;
  • provider versions in config/providers.yaml.

For each, the PR description says which consumers are affected, what their next plan will show, and how to roll back. Emergency changes are allowed, but they get recorded afterwards with the reason, the approver, the affected consumers and the follow-up work. I’d keep that record in the CHANGELOG under a separate heading, so it can’t be lost among normal entries.

Checklist

  • Six backlog tracks exist as labels or projects, each with an owner
  • The issue template includes consumer impact and rollback plan
  • Exception process for gate overrides is written (closes the MVP)
  • Owners and support contacts are named (closes the MVP)
  • “Pending Verification” CHANGELOG items are verified in a real consumer or reverted
  • Risk register is reviewed monthly
  • Target quarters exist for Governance and Operational maturity
  • Change-control rules are linked from CONTRIBUTING or AGENTS.md

This post is licensed under CC BY 4.0 by the author.