Subchapter 25.36
references/phases/estimate/estimate.mdMarkdown12 KBView on GitHub
Price the design, and price it twice.
Dual output is the default shape, not an option. A non-optimized 1:1 lift and a right-sized target are both reported, with the delta between them stated. The 1:1 number is what a naive migration costs and it is what the customer will otherwise assume; the right-sized number is the recommendation. Showing only one of them either overstates the bill or hides the work that produced the saving.
estimation-infra.schema.json has no additionalProperties: false and already
carries cost_comparison and optimization_opportunities, so this needs no schema
change — which matters, because that schema is vendored into several skills and
drift-allowlisted.
A reserved VM shows up at $0 in consumption data. It is not free: it was
pre-paid. Pricing the Azure baseline from the literal figure understates current
spend, which makes the AWS comparison look worse than it is and can invert the
recommendation. Every reserved resource is priced from its pay-as-you-go rate
instead, and the substitution is recorded so the report can show its work.
Not reachable yet. A $0 consumption figure only appears in Cost Management
or RDfA data, and both of those sources are deferred — so on a Terraform-only
estate reservation_substitutions is an empty array and this rule is a contract
for when the billing source lands, not something a run has tested. The empty array
is written rather than omitted so that its emptiness is visible.
Read the actual metrics window from the report metadata rather than assuming 31
days. Below confidence_rules.min_window_days in
knowledge/estimate/rightsizing-thresholds.json, hold right-sizing confidence at
inferred — a P95 over a short window is not a measurement.
Stated up front, because three of these look like bugs otherwise and a reader who assumes otherwise will misread the output.
| Constraint | Consequence |
|---|---|
| No billing or metrics source is built | The Azure baseline is the user’s stated figure or nothing — see estimate-infra.md Part 1. Rungs 1, 2 and 4 cannot fire |
The reservation $0 rule needs consumption data | It is a contract for later, not something a Terraform-only run exercises. reservation_substitutions is legitimately an empty array |
| Utilization-based right-sizing needs metrics | The right-sizing delta comes from declared waste only, and may legitimately be $0. When it is, the artifact must say why |
The pricing cache is us-east-1 | Most Azure estates map to another AWS region, so the region mismatch fires on most runs and must be stated rather than absorbed |
| Three services have no rates anywhere | DocumentDB, FSx for Windows, and the Windows licence adder. Their lines are unavailable or partial, and both totals then become floors |
None of these is a reason to produce a number anyway. A floor that says it is a floor is useful; a total that quietly omits the most expensive line is not.
references/vendored/estimate/pricing-mode.md as Step 0 — including
its region check and its rate-row check, which is the one that fires here._trigger holds.estimate-assemble.md, which reconciles the totals, presents the decision
gate, and writes run_mode._postconditions. On all-pass emit HANDOFF_OK; on any failure emit
GATE_FAIL and stop. Never edit the artifact to make a gate pass.Financial analysis only. No mapping changes (those belong to Design), no Terraform, no runbooks, no week-by-week schedule — the decision gate’s one-line timeline band is the single allowed exception — and no staffing or people-time in any dollar column.