What β Opening the compute-extras / units pricing tab crashes the page.
Why β The default pack items use an old data shape the pricing card no longer understands, so the card throws on render.
Scope β src/modules/billing/config/billing.static-content.js packs (~L152) ships legacy { packId, label, priceUsd, meterUnits, featureSections }; billing.card.component.vue (used by billing.packs.component.vue resolvedItems) requires the V4 unified schema { id, title, subtitle, price:{amount,period}, cta, features, ... } and renders item.price.amount unguarded β Cannot read properties of undefined (reading 'amount'). plans were migrated to V4 (commit 53ec9819); packs were not. Also item.id is undefined (packs use packId) so the CTA no-ops. Reachable via /pricing#units CTAs. Note billing.subscriptions.component.vue extrasPacks still feeds the OLD shape to BillingExtrasCheckoutModalComponent β reconcile both consumers on one schema.
Also (same file, ~L134): stale docstrings tell downstream to replace billing.static-content.js directly, contradicting the billing.resolveStaticContent.js config-driven contract (config.billing.staticContent) β customization lost on /update-stack --theirs. Update the docstrings to the resolver contract.
Fix: migrate packs to the V4 card schema (or map at the resolver boundary so both the card and the extras-modal consumers get their required shapes); test against the REAL static-content export, not a hand-written V4 mock; fix the docstrings.
Refs: internal audit cycle-1 2026-07-16 (C4 + M9); commits 53ec981 / 7f5dd41 / e95d944.
Created via /dev:issue
What β Opening the compute-extras / units pricing tab crashes the page.
Why β The default pack items use an old data shape the pricing card no longer understands, so the card throws on render.
Scope β
src/modules/billing/config/billing.static-content.jspacks(~L152) ships legacy{ packId, label, priceUsd, meterUnits, featureSections };billing.card.component.vue(used bybilling.packs.component.vueresolvedItems) requires the V4 unified schema{ id, title, subtitle, price:{amount,period}, cta, features, ... }and rendersitem.price.amountunguarded βCannot read properties of undefined (reading 'amount').planswere migrated to V4 (commit53ec9819);packswere not. Alsoitem.idis undefined (packs usepackId) so the CTA no-ops. Reachable via/pricing#unitsCTAs. Notebilling.subscriptions.component.vueextrasPacksstill feeds the OLD shape toBillingExtrasCheckoutModalComponentβ reconcile both consumers on one schema.Also (same file, ~L134): stale docstrings tell downstream to replace
billing.static-content.jsdirectly, contradicting thebilling.resolveStaticContent.jsconfig-driven contract (config.billing.staticContent) β customization lost on/update-stack --theirs. Update the docstrings to the resolver contract.Fix: migrate
packsto the V4 card schema (or map at the resolver boundary so both the card and the extras-modal consumers get their required shapes); test against the REAL static-content export, not a hand-written V4 mock; fix the docstrings.Refs: internal audit cycle-1 2026-07-16 (C4 + M9); commits 53ec981 / 7f5dd41 / e95d944.
Created via /dev:issue