Skip to content
Ritesh FirodiyaGet in touch

Work / Chitragupt / Wiki / Decisions

2026-08-10-tax-wireframe-alignment

Decisioncanonicalverified 2026-08-10

DECISION.2026-08-10.TAX-WIREFRAME-ALIGNMENT

Tax pillar React implementation audited and rebuilt against all wireframe variants

Decision

Audited all 11 .context/designs/web/tax/*.html wireframe variants (tax-locked, tax-empty, tax-review, tax-ca-invited, tax-with-ca, tax-filed, tax-past-ay, tax-family, tax-family-locked, invite-ca modal, concern modal) against the live apps/website/src/app/(app)/tax/ implementation, matching the methodology and standard of 2026-08-07-expense-portfolio-wireframe-alignment — real derived data only, no fabricated numbers or AI copy, checked for the same bug classes (NaN-poisoned charts, wrong-formula ratios, null-returning empty states, unwired override paths).

Gaps found and fixed:

  1. Hardcoded fake data — FilingRecordTable.tsx's "Notices received" / "Tax-audit flags" rows were unconditionally "None ✓" regardless of actual data. Fixed to derive from real severity === "scrutiny" flags on the review.
  2. Past-AY page missing half its wireframe — tax-past-ay.html's composition donut, extended filing record, and past-AY-specific CA sidebar all existed as already-built, real-data components (WhereGrossWentCard.tsx, FilingRecordTable.tsx, past-ay/Sidebar.tsx) but were never imported into TaxPage.tsx after an earlier consolidation to a single data-driven page. Wired in; also fixed a copy bug showing the current-AY "Pick your path" CTA on an already-closed AY.
  3. CA-engagement chat drawer missing on the client — tax-with-ca.html/tax-filed.html/tax-past-ay.html show a floating chat drawer; the backend (postEngagementMessage, reportEngagementMessage) and EngagementThread.tsx already existed (used in the CA portal) but nothing rendered it on /tax. Added readOnly prop to EngagementThread, built TaxChatDrawer.tsx, wired into engaged/filed/past-AY-with-engagement states. No fabricated "unread" badge — omitted since no real read-receipt field backs it.
  4. Family (unlocked) page missing two of three widgets — built FamilyRefundDonut.tsx and FamilyRegimeCard.tsx, both computed purely from already-returned getFamilyTaxOverview fields, no backend change needed.
  5. Dead orphaned components deleted (pre-dated the single-page consolidation, unreferenced anywhere): PendingAyNotice.tsx, QuickCheck.tsx + quick-check/*, TaxReviewSidebar.tsx + sidebar/*, past-ay/PendingReviewNotice.tsx, review/DocumentsFedIn.tsx, utils/tax-review-variant.ts. Also removed duplicate formatter formatLakhsShort in favor of shared formatPaiseCompact.

Explicitly scoped out (flagged, not faked): filed-state star-rating widget (no rateEngagement callable exists); per-member ITR-form line in family breakdown table (field exists server-side via inferItrForm but getFamilyTaxOverview's TaxMemberSchema doesn't select it — small, well-understood backend addition, not built here per instruction to report rather than expand backend scope); tax-family-locked.html is byte-identical to tax-locked.html in the wireframe source itself, so the current shared-locked-teaser implementation is not a gap.

Why

Same driver as 2026-08-07-expense-portfolio-wireframe-alignment — this session extended that same systematic gap-audit discipline from Expense/Portfolio to Tax and Inbox, per explicit user request to align all 4 pillars with their wireframes and eliminate hardcodings.

Impact

  • apps/website/src/app/(app)/tax/components/TaxPage.tsx, apps/website/src/components/ca/EngagementThread.tsx, new apps/website/src/components/tax/TaxChatDrawer.tsx, apps/website/src/components/tax/family/{FamilyRefundDonut,FamilyRegimeCard}.tsx, apps/website/src/components/tax/past-ay/{FilingRecordTable,WhereGrossWentCard,_format}.tsx.
  • Deletions listed above — dead code removed, not deprecated-and-kept, per the repo's no-legacy rule.
  • pillar-tax — synced against these component/widget changes as part of 2026-08-10-inbox-wireframe-alignment's companion wiki resync pass.
  • yarn workspace website typecheck and scoped eslint on touched files: 0 errors.

Status

Active.

Sources

Every project of mine is written down like this.

Read the résumé