# TorbatYar Frontend — Refactor Risk Analysis **Date:** 2026-07-26 **Scope:** Risk assessment for proposed architectural improvements **Audience:** Engineering leads planning frontend refactors --- ## 1. Risk Matrix Overview | Refactor area | Impact | Effort | Risk | Priority | |---------------|--------|--------|------|----------| | Fix Button type error | Low | S | 🟢 Low | P0 — immediate | | Delete dead files | Low | S | 🟢 Low | P0 | | Remove unused npm deps | Low | S | 🟢 Low | P0 | | ESLint boundary rules | Medium | M | 🟢 Low | P1 | | Unify ui/ → ds/ | Medium | M | 🟡 Medium | P1 | | Merge beauty owner routes | Medium | M | 🟡 Medium | P1 | | Extract portal infrastructure | High | L | 🟡 Medium | P2 | | Split API client monoliths | High | L | 🟡 Medium | P2 | | Extract accounting route logic | High | XL | 🔴 High | P3 | | Add middleware.ts | Medium | M | 🟡 Medium | P3 | | Split accounting screen aggregators | High | L | 🔴 High | P3 | | Adopt TanStack Table | Medium | M | 🟡 Medium | P4 — defer | | Implement Recharts analytics | Medium | L | 🟢 Low | P4 — defer | | Extract module to separate app | Very High | XL | 🔴 Very High | Defer | **Legend:** S = days, M = 1–2 weeks, L = 2–4 weeks, XL = 1–2 months --- ## 2. P0 — Stabilization Risks ### 2.1 Fix DS Button `loading` prop | Factor | Assessment | |--------|-------------| | **Change** | Add `loading?: boolean` to `ds/Button.tsx` OR replace `loading` with `disabled` + spinner in accounting | | **Files affected** | 1–5 (grep for `loading=` on Button) | | **Regression risk** | 🟢 Low — localized UI change | | **Test coverage** | None — manual verify submit buttons | | **Rollback** | Trivial | **Recommendation:** Add `loading` prop to DS Button (matches ui/Button API). Lower risk than changing all accounting call sites. ### 2.2 Delete dead files | File | Risk if deleted | |------|-----------------| | `lib/api-client.ts` | 🟢 None — zero imports | | `lib/optional-sso.ts` | 🟢 None — zero imports | | `lib/beauty-business-nav.ts` | 🟢 None — superseded | | `components/HealthStatus.tsx` | 🟢 None — zero imports | | `components/beauty/pages/mobile.tsx` | 🟢 None — zero imports | **Caution:** Run full grep before delete — dynamic imports would not appear in static analysis. ### 2.3 Remove unused npm packages | Package | Risk | |---------|------| | `@tanstack/react-table` | 🟢 Safe if zero imports confirmed | | `recharts` | 🟡 Check if planned for current sprint | --- ## 3. P1 — Boundary & UI Unification Risks ### 3.1 ESLint cross-domain import rules | Factor | Assessment | |--------|-------------| | **Regression risk** | 🟢 Low — additive enforcement | | **False positives** | Platform admin importing admin components — needs override config | | **Migration** | Zero code changes if currently compliant | ### 3.2 Unify `components/ui/` → `components/ds/` | Factor | Assessment | |--------|-------------| | **Files to migrate** | ~10 | | **Risk** | 🟡 Medium — visual regression on marketing pages | | **Button API diff** | ui uses `variant`; ds uses CVA variants — prop mapping needed | | **Mitigation** | Migrate one page at a time; visual QA on login/dashboard/home | ### 3.3 Merge beauty `(owner)/` and `owner/` routes | Factor | Assessment | |--------|-------------| | **Current state** | Two URL trees for same portal | | **Risk** | 🟡 Medium — bookmark/URL breakage | | **Affected URLs** | `/beauty/owner/analytics` vs `/beauty/organizations` (different trees) | | **Mitigation** | Add redirects from old paths; merge into single `(owner)/` group | | **SEO impact** | Low — authenticated app routes | **Note:** These are NOT duplicate URLs — they serve different pages. The issue is organizational (two folders for one portal), not URL collision. Risk is developer confusion, not user-facing breakage. --- ## 4. P2 — Infrastructure Extraction Risks ### 4.1 Shared portal infrastructure | Factor | Assessment | |--------|-------------| | **Scope** | Merge 2× createPortalLayout, 2× portal shell, 2× public layout, 2× shared.tsx | | **Regression risk** | 🟡 Medium — touches all beauty AND healthcare portals (~200 routes) | | **Testing burden** | High — 7 beauty portals + 8 healthcare portals | | **Mitigation** | Extract base first without changing behavior; swap one portal at a time | | **Rollback** | Keep old files until all portals migrated | **Highest-risk portal migrations:** 1. Healthcare patient portal (uses `useHealthcarePatientContext`) 2. Healthcare doctor portal (uses `useHealthcareDoctorContext`) 3. Beauty owner portal (split across two route trees) ### 4.2 API client decomposition | Factor | Assessment | |--------|-------------| | **Scope** | 3 files, ~4,600 lines, ~470 methods, 72 import sites | | **Regression risk** | 🟡 Medium — import path changes only if barrel maintained | | **Strategy risk** | 🟢 Low if deprecated barrels re-export everything | | **Mitigation** | One subdomain per PR; keep `accountingApi.method()` surface stable | **Danger:** Partial migration leaving two import paths for same method. --- ## 5. P3 — Accounting Refactor Risks ### 5.1 Extract route logic to components | Factor | Assessment | |--------|-------------| | **Scope** | ~130 route files, many 200–660 lines | | **Regression risk** | 🔴 High — accounting is largest module with complex forms | | **Business criticality** | 🔴 Very high — financial data | | **Test coverage** | None — no frontend test suite detected | | **Mitigation** | Extract one page at a time; start with read-only pages (reports, monitoring) | **Safest extraction order:** 1. Monitoring pages (read-only, ~22 lines each) 2. Compliance pages (delegate to DomainScreens already) 3. Integration pages (delegate to DomainScreens already) 4. Settings pages (moderate complexity) 5. Core CRUD (chart-of-accounts, vouchers, treasury) — last **Most dangerous extractions:** 1. `vouchers/[id]/page.tsx` (550 lines, useFieldArray, posting logic) 2. `chart-of-accounts/page.tsx` (644 lines, tree manipulation) 3. `purchase/returns/page.tsx` (417 lines, current build failure location) ### 5.2 Split screen aggregators | File | Lines | Split risk | |------|------:|------------| | `BusinessDocsPage.tsx` | 1,328 | 🔴 High — many document types interleaved | | `WorkflowScreens.tsx` | 1,132 | 🔴 High — shared state between workflows | | `DomainScreens.tsx` | 652 | 🟡 Medium — already parameterized | | `OperationalDocumentPage.tsx` | 996 | 🔴 High — voucher editing core | **Recommendation:** Split DomainScreens first (lowest coupling); defer BusinessDocsPage until accounting tests exist. ### 5.3 Add middleware.ts | Factor | Assessment | |--------|-------------| | **Risk** | 🟡 Medium — can break auth flows if misconfigured | | **Complexity** | Public routes (`/beauty/site/*`, `/healthcare/site/*`, `/login`) need allowlist | | **Duplication** | Currently AuthGuard in layouts — middleware replaces client-side redirect with edge redirect | | **Mitigation** | Start with logging-only middleware; enable redirects after validation | --- ## 6. P4 — Deferred Changes ### 6.1 Adopt TanStack Table | Factor | Assessment | |--------|-------------| | **Need** | Current DataTable lacks sorting, filtering, pagination | | **Risk** | 🟡 Medium — visual/behavior change across 50+ tables | | **Recommendation** | Defer until explicit product requirement for sortable columns | ### 6.2 Implement Recharts | Factor | Assessment | |--------|-------------| | **Need** | Analytics routes exist without charts | | **Risk** | 🟢 Low — additive feature | | **Recommendation** | Implement per-page when analytics data available | ### 6.3 Module extraction to separate Next.js app | Factor | Assessment | |--------|-------------| | **Risk** | 🔴 Very High | | **Reasons to defer** | Shared auth, tenant, theme, DS; build already monolithic; team size | | **Trigger to revisit** | Build > 3 min, independent release cycles needed, 5+ modules | --- ## 7. Risk by Module | Module | Refactor sensitivity | Reason | |--------|---------------------|--------| | **Accounting** | 🔴 Very High | Financial data, complex forms, no tests, inline route logic | | **Healthcare patient/doctor** | 🟡 Medium | Context hooks, PHI display | | **Beauty owner CRUD** | 🟡 Medium | Active development, form mutations | | **Beauty/healthcare portals (display)** | 🟢 Low | Thin routes, TanStack Query | | **Platform admin** | 🟡 Medium | Tenant management | | **Public sites** | 🟢 Low | Mostly static display | --- ## 8. Regression Testing Gaps | Area | Current state | Risk implication | |------|---------------|------------------| | Unit tests | None detected in frontend | All refactors are manual QA | | Integration tests | None | API client splits untested | | E2E tests | None | Portal extraction untested | | Visual regression | None | UI unification untested | | Type checking | Failing | Cannot catch prop mismatches in CI | **Recommendation:** Before P3 accounting refactors, establish at minimum: 1. Green `npm run build` 2. Smoke test checklist per module (manual) 3. Consider Playwright for top 10 critical flows --- ## 9. Change Blast Radius ### Single PR safe changes (< 10 files, low risk) - Button loading prop fix - Dead file deletion - Unused npm removal - ESLint config addition - Single accounting page extraction (read-only) ### Multi-PR required (medium risk) - Portal infrastructure extraction - API client splitting - ui/ → ds/ migration - Middleware addition ### Program-level effort (high risk — dedicated sprint) - Full accounting route extraction - Screen aggregator splitting - Beauty owner route consolidation --- ## 10. Decision Framework Before any refactor, answer: ``` 1. Does it fix a build blocker or security issue? → YES: Do immediately (P0) 2. Does it reduce duplication without changing behavior? → YES: Extract with snapshot tests / manual QA (P2) 3. Does it move business logic between layers? → YES: One file at a time, start with read-only (P3) 4. Does it change user-visible URLs or auth flows? → YES: Add redirects, test all portals (P1–P3) 5. Does it introduce new abstractions? → YES: Wait until 3rd module needs it (Rule of Three) ``` --- ## 11. Recommended Execution Order (Risk-Adjusted) ``` Week 1: P0 fixes (build green, dead code removed) Week 2: P1 ESLint boundaries + Button unification Week 3: P1 beauty owner organization (no URL changes) Week 4–6: P2 portal base extraction (beauty admin first — simplest) Week 7–8: P2 portal extraction (remaining portals, one per PR) Week 9–12: P2 API client split (accounting vouchers first) Week 13+: P3 accounting extraction (monitoring → settings → core CRUD) Ongoing: P3 middleware + error boundaries Defer: P4 table/charts, module extraction ``` --- ## 12. Summary | Category | Count | |----------|------:| | 🔴 High/Very High risk refactors | 4 | | 🟡 Medium risk refactors | 7 | | 🟢 Low risk refactors | 5 | | Current build blockers | 1 | | Dead files safe to delete | 5 | | Modules with zero test coverage | All | The codebase is **safe to maintain and extend** within existing patterns. **Large-scale refactoring** (especially accounting) carries significant regression risk without automated tests. Prioritize stabilization (P0) and boundary enforcement (P1) before structural changes (P2–P3). --- ## Related Documents - [frontend-migration-plan.md](./frontend-migration-plan.md) - [frontend-architecture-audit.md](./frontend-architecture-audit.md) - [module-boundaries.md](./module-boundaries.md) - [dependency-report.md](./dependency-report.md)