diff --git a/.github/workflows/pricing-staleness.yml b/.github/workflows/pricing-staleness.yml new file mode 100644 index 00000000..32fef033 --- /dev/null +++ b/.github/workflows/pricing-staleness.yml @@ -0,0 +1,31 @@ +# Scheduled freshness gate for the migration-to-aws pricing caches. +# +# The estimate phases price from vendored caches whose freshness contracts +# (_meta.last_updated + staleness_days, or a "Last updated" line with a +# documented 30-day window) were previously unenforced — caches quietly crossed +# their own thresholds and every estimate silently degraded to fallback +# accuracy. `mise run build` reports staleness warn-only (a stale cache must +# not fail unrelated PRs); this weekly job runs the same tool with --strict so +# staleness becomes a visible failure someone owns, prompting a data-refresh PR +# (see #131 for the pattern). +name: Pricing cache staleness +on: + schedule: + - cron: "23 14 * * 1" # weekly, Monday + workflow_dispatch: {} +permissions: + actions: none + contents: none +jobs: + staleness: + permissions: + contents: read + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + with: + node-version: 24 + # Zero-dep TS tool (Node 24 native type-stripping) — no install step. + - name: Check pricing cache freshness (strict) + run: node migrate/plugins/migration-to-aws/tools/pricing-staleness.ts --strict diff --git a/migrate/plugins/migration-to-aws/skills/heroku-to-aws/references/shared/heroku-pricing-cache.md b/migrate/plugins/migration-to-aws/skills/heroku-to-aws/references/shared/heroku-pricing-cache.md index e6c0bb40..d66eb6a0 100644 --- a/migrate/plugins/migration-to-aws/skills/heroku-to-aws/references/shared/heroku-pricing-cache.md +++ b/migrate/plugins/migration-to-aws/skills/heroku-to-aws/references/shared/heroku-pricing-cache.md @@ -1,6 +1,6 @@ # Heroku Pricing Cache -**Last updated:** 2026-06-15 +**Last updated:** 2026-07-19 (dyno rates re-verified against devcenter.heroku.com/articles/dyno-types — Eco $5 flat, Basic $7, Standard-1X $25, Standard-2X $50, Performance-M $250, Performance-L/L-RAM $500 all unchanged; no rate changes this refresh) **Source:** https://elements.heroku.com/addons/heroku-postgresql, https://elements.heroku.com/addons/heroku-redis, https://elements.heroku.com/addons/heroku-kafka, https://devcenter.heroku.com/articles/dyno-sizes **Currency:** USD **Accuracy:** ±5% for dynos (published flat rates); ±10% for data services (Elements "Max of" pricing, actual may vary by usage pattern) diff --git a/migrate/plugins/migration-to-aws/skills/heroku-to-aws/references/vendored/pricing/aws-infra-pricing.json b/migrate/plugins/migration-to-aws/skills/heroku-to-aws/references/vendored/pricing/aws-infra-pricing.json index b297f909..1f483c78 100644 --- a/migrate/plugins/migration-to-aws/skills/heroku-to-aws/references/vendored/pricing/aws-infra-pricing.json +++ b/migrate/plugins/migration-to-aws/skills/heroku-to-aws/references/vendored/pricing/aws-infra-pricing.json @@ -7,7 +7,8 @@ "accuracy": "\u00b15-10% infrastructure", "hours_per_month": 730, "staleness_days": 30, - "staleness_note": "If more than staleness_days past last_updated, infrastructure rates remain reliable; set pricing_source=cached_stale and note it. AI-model rates (not used for heroku->aws) may have drifted." + "staleness_note": "If more than staleness_days past last_updated, infrastructure rates remain reliable; set pricing_source=cached_stale and note it. AI-model rates (not used for heroku->aws) may have drifted.", + "last_verification": "2026-07-19 spot-check against published pricing pages: Fargate Linux/x86 us-east-1 ($0.000011244/vCPU-s = $0.04048/hr; $0.000001235/GB-s = the published $0.004445/hr GB rate) matches, and Heroku dyno flat rates match devcenter; no rate changes applied this refresh." }, "_multi_az_convention": { "_comment": "THE TRAP: a design's multi_az:true means different things per service. Each service rate below carries multi_az_handling so the formula applies the RIGHT adjustment, never a blanket multiplier.", diff --git a/migrate/plugins/migration-to-aws/skills/shared/pricing/aws-infra-pricing.json b/migrate/plugins/migration-to-aws/skills/shared/pricing/aws-infra-pricing.json index b297f909..1f483c78 100644 --- a/migrate/plugins/migration-to-aws/skills/shared/pricing/aws-infra-pricing.json +++ b/migrate/plugins/migration-to-aws/skills/shared/pricing/aws-infra-pricing.json @@ -7,7 +7,8 @@ "accuracy": "\u00b15-10% infrastructure", "hours_per_month": 730, "staleness_days": 30, - "staleness_note": "If more than staleness_days past last_updated, infrastructure rates remain reliable; set pricing_source=cached_stale and note it. AI-model rates (not used for heroku->aws) may have drifted." + "staleness_note": "If more than staleness_days past last_updated, infrastructure rates remain reliable; set pricing_source=cached_stale and note it. AI-model rates (not used for heroku->aws) may have drifted.", + "last_verification": "2026-07-19 spot-check against published pricing pages: Fargate Linux/x86 us-east-1 ($0.000011244/vCPU-s = $0.04048/hr; $0.000001235/GB-s = the published $0.004445/hr GB rate) matches, and Heroku dyno flat rates match devcenter; no rate changes applied this refresh." }, "_multi_az_convention": { "_comment": "THE TRAP: a design's multi_az:true means different things per service. Each service rate below carries multi_az_handling so the formula applies the RIGHT adjustment, never a blanket multiplier.", diff --git a/migrate/plugins/migration-to-aws/skills/vercel-to-aws/references/vendored/pricing/aws-infra-pricing.json b/migrate/plugins/migration-to-aws/skills/vercel-to-aws/references/vendored/pricing/aws-infra-pricing.json index b297f909..1f483c78 100644 --- a/migrate/plugins/migration-to-aws/skills/vercel-to-aws/references/vendored/pricing/aws-infra-pricing.json +++ b/migrate/plugins/migration-to-aws/skills/vercel-to-aws/references/vendored/pricing/aws-infra-pricing.json @@ -7,7 +7,8 @@ "accuracy": "\u00b15-10% infrastructure", "hours_per_month": 730, "staleness_days": 30, - "staleness_note": "If more than staleness_days past last_updated, infrastructure rates remain reliable; set pricing_source=cached_stale and note it. AI-model rates (not used for heroku->aws) may have drifted." + "staleness_note": "If more than staleness_days past last_updated, infrastructure rates remain reliable; set pricing_source=cached_stale and note it. AI-model rates (not used for heroku->aws) may have drifted.", + "last_verification": "2026-07-19 spot-check against published pricing pages: Fargate Linux/x86 us-east-1 ($0.000011244/vCPU-s = $0.04048/hr; $0.000001235/GB-s = the published $0.004445/hr GB rate) matches, and Heroku dyno flat rates match devcenter; no rate changes applied this refresh." }, "_multi_az_convention": { "_comment": "THE TRAP: a design's multi_az:true means different things per service. Each service rate below carries multi_az_handling so the formula applies the RIGHT adjustment, never a blanket multiplier.",