You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Wave-D frontend findings from BUGHUNT-REPORT-2026-05-18.
D1 (P1-W5-18, L-02): the nav "Get token →" CTA pointed at /get-token, a
route that doesn't exist — the SPA catch-all silently redirected the
conversion funnel's headline button to /. Repointed at /login, the same
route MarketingPage's "Get a token" CTA already uses.
D2 (P2-W5-02): the footer "Security" link pointed at /security (no such
route → 404 → catch-all to /). Repointed at /docs/public/security.md, the
real security doc, matching how ChangelogPage links /docs/public/dpa.md.
D3 (P1-W4-10): ChangePlanModal and TierChangeModal each carried a private
TIER_RANK with the inverted order growth:4, pro:5 — the admin console
showed "DEMOTE" for a pro→growth upgrade. Added one canonical TIER_RANK
table (pro:4, growth:5) to src/api/index.ts, aligned with the backend's
common/plans/rank.go; both modals now import it. Added a unit test pinning
the ladder ordering.
D4 (P1-W4-09): listInvoices did a blind cast of the API response. The
invoices endpoint emits the Razorpay wire shape {id,amount,currency,
status,date,pdf_url} but the Invoice type expected Stripe-style
{period_start,period_end,plan,amount_cents}, so every row rendered
"Invalid Date"/"$NaN"/blank tier. Added an explicit mapInvoice mapper:
amount→amount_cents (direct copy — already smallest-unit, no ×100),
date→issued_at. period_start/period_end/plan are not on the wire and stay
optional; BillingPage renders only what is present.
D5 (P1-W2-06): BillingPage LIMITS had no growth row, so a growth-tier team
fell through to LIMITS.hobby and saw red over-quota bars on a plan they
were within. Added the growth row with api/plans.yaml values.
D6 (P2-W2-17/18): OverviewPage's hardcoded TIER_LIMIT_GB table drifted
from plans.yaml, and the storage tile mixed a decimal-MB numerator with a
binary-MiB denominator. Dropped TIER_LIMIT_GB in favour of summing the
server-supplied per-resource storage_limit_bytes; all storage math now
uses one binary base. MetricsPanel's formatBytes relabelled KB/MB/GB →
KiB/MiB/GiB to match its /1024 divisors.
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
0 commit comments