You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

28 KiB

Tasks: Single Family Office Platform Transformation

Input: Design documents from /specs/001-family-office-transform/ Prerequisites: plan.md (required), spec.md (required), research.md, data-model.md, contracts/

Tests: Not explicitly requested in the feature specification. Test tasks are omitted.

Organization: Tasks are grouped by user story (US1-US8) to enable independent implementation and testing.

Format: [ID] [P?] [Story] Description

  • [P]: Can run in parallel (different files, no dependencies on incomplete tasks)
  • [Story]: Which user story this task belongs to (US1-US8)
  • Exact file paths included in all descriptions

Path Conventions

  • API: apps/api/src/
  • Client: apps/client/src/app/
  • Common lib: libs/common/src/lib/
  • UI lib: libs/ui/src/lib/
  • Prisma: prisma/

Phase 1: Setup (Shared Infrastructure)

Purpose: Extend Prisma schema with all family office models and generate migration

  • T001 Add 8 new enums (EntityType, PartnershipType, DistributionType, KDocumentType, KDocumentStatus, FamilyOfficeAssetType, ValuationSource, DocumentType) to prisma/schema.prisma per data-model.md
  • T002 Add 10 new models (Entity, Partnership, PartnershipMembership, Ownership, Distribution, KDocument, PartnershipAsset, AssetValuation, PartnershipValuation, Document) with all fields, relations, and unique constraints to prisma/schema.prisma per data-model.md
  • T003 Add back-references to existing User model (entities Entity[], partnerships Partnership[]) and Account model (ownerships Ownership[]) in prisma/schema.prisma
  • T004 Run npx prisma migrate dev --name added_family_office_models and npx prisma generate to apply migration and regenerate client

Phase 2: Foundational (Blocking Prerequisites)

Purpose: Shared types, DTOs, permissions, and Angular data service that ALL user stories depend on

⚠️ CRITICAL: No user story work can begin until this phase is complete

  • T005 [P] Create family office TypeScript enums mirroring Prisma enums in libs/common/src/lib/enums/family-office.ts — export EntityType, PartnershipType, DistributionType, KDocumentType, KDocumentStatus, FamilyOfficeAssetType, ValuationSource, DocumentType
  • T006 [P] Create entity and ownership interfaces (IEntity, IEntityWithRelations, IOwnership) in libs/common/src/lib/interfaces/entity.interface.ts per entity-api.md response shapes
  • T007 [P] Create partnership interfaces (IPartnership, IPartnershipMembership, IPartnershipAsset, IPartnershipValuation) in libs/common/src/lib/interfaces/partnership.interface.ts per partnership-api.md response shapes
  • T008 [P] Create distribution interfaces (IDistribution, IDistributionSummary) in libs/common/src/lib/interfaces/distribution.interface.ts per distribution-kdocument-fo-api.md response shapes
  • T009 [P] Create K1Data (20-field IRS box interface) and k-document interfaces (IKDocument, IKDocumentAllocation) in libs/common/src/lib/interfaces/k-document.interface.ts per data-model.md K1Data definition
  • T010 [P] Create family office interfaces (IFamilyOfficeDashboard, IFamilyOfficeReport, IPerformanceMetrics) in libs/common/src/lib/interfaces/family-office.interface.ts per distribution-kdocument-fo-api.md dashboard/report response shapes
  • T011 [P] Create CreateEntityDto and UpdateEntityDto with class-validator decorators in libs/common/src/lib/dtos/create-entity.dto.ts and libs/common/src/lib/dtos/update-entity.dto.ts per entity-api.md request bodies
  • T012 [P] Create CreatePartnershipDto, UpdatePartnershipDto, CreatePartnershipMembershipDto, CreatePartnershipValuationDto, and CreatePartnershipAssetDto in libs/common/src/lib/dtos/partnership.dto.ts per partnership-api.md request bodies
  • T013 [P] Create CreateDistributionDto with class-validator decorators in libs/common/src/lib/dtos/create-distribution.dto.ts per distribution-kdocument-fo-api.md request body
  • T014 [P] Create CreateKDocumentDto, UpdateKDocumentDto, and CreateOwnershipDto in libs/common/src/lib/dtos/k-document.dto.ts and libs/common/src/lib/dtos/create-ownership.dto.ts per contract request bodies
  • T015 Add family office permissions (createEntity, readEntity, updateEntity, deleteEntity, createPartnership, readPartnership, updatePartnership, deletePartnership, createDistribution, readDistribution, deleteDistribution, createKDocument, readKDocument, updateKDocument, uploadDocument, readDocument, readFamilyOfficeDashboard, readFamilyOfficeReport) to libs/common/src/lib/permissions.ts
  • T016 [P] Create FamilyOfficeDataService Angular HTTP client with methods for all family office API endpoints in apps/client/src/app/services/family-office-data.service.ts

Checkpoint: Foundation ready — user story implementation can now begin in parallel


Phase 3: User Story 1 — Entity & Ownership Structure Management (Priority: P1) 🎯 MVP

Goal: Create and manage legal entities (trusts, LLCs, LPs, individuals) with ownership percentages over accounts, consolidated portfolio view per entity

Independent Test: Create entities, assign ownership of accounts with percentages, verify ownership tree and rolled-up values display correctly. Validate ownership % sum ≤ 100 per account.

Implementation for User Story 1

  • T017 [P] [US1] Create EntityService with CRUD (create, findAll, findById, update, delete with active-relationship guard), ownership assignment with 100% validation, and consolidated portfolio aggregation in apps/api/src/app/entity/entity.service.ts
  • T018 [P] [US1] Create entity-card standalone component (entity name, type icon, total value, ownership/membership counts) in libs/ui/src/lib/entity-card/entity-card.component.ts
  • T019 [US1] Create EntityController with 9 endpoints (POST/GET/GET:id/PUT/DELETE entity, GET entity/:id/portfolio, POST entity/:id/ownership, GET entity/:id/distributions, GET entity/:id/k-documents) per entity-api.md in apps/api/src/app/entity/entity.controller.ts
  • T020 [US1] Create EntityModule importing PrismaModule, register EntityModule in AppModule imports array in apps/api/src/app/entity/entity.module.ts and apps/api/src/app/app.module.ts
  • T021 [US1] Create entities-page standalone component (entity list with type filter, entity-card grid, create dialog) in apps/client/src/app/pages/entities/entities-page.component.ts
  • T022 [US1] Create entity-detail-page standalone component (entity info, ownership table with % and allocated values, membership list, edit/delete actions) in apps/client/src/app/pages/entity-detail/entity-detail-page.component.ts
  • T023 [US1] Add lazy-loaded routes for /entities → EntitiesPageComponent and /entities/:id → EntityDetailPageComponent in apps/client/src/app/app.routes.ts

Checkpoint: Entity CRUD, ownership assignment with validation, and consolidated portfolio view are functional. MVP delivers family wealth structure visibility.


Phase 4: User Story 2 — Partnership Tracking & Valuation (Priority: P1)

Goal: Create partnerships, manage members with ownership percentages and capital data, record NAV valuations, track partnership-level assets with appraisals

Independent Test: Create partnership, add member entities with %, record NAV statements, verify allocated NAV per member is correct. Add assets with valuations.

Implementation for User Story 2

  • T024 [P] [US2] Create PartnershipService with CRUD, membership management (add/update with 100% validation), NAV valuation recording, asset management with appraisals, and allocated NAV computation in apps/api/src/app/partnership/partnership.service.ts
  • T025 [P] [US2] Create partnership-table standalone component (member rows with ownership %, capital commitment, contributed, allocated NAV, class type) in libs/ui/src/lib/partnership-table/partnership-table.component.ts
  • T026 [US2] Create PartnershipController with 11 endpoints (CRUD partnership, POST/PUT member, POST/GET valuations, POST asset, POST asset valuation, GET performance) per partnership-api.md in apps/api/src/app/partnership/partnership.controller.ts
  • T027 [US2] Create PartnershipModule importing PrismaModule, register PartnershipModule in AppModule imports array in apps/api/src/app/partnership/partnership.module.ts and apps/api/src/app/app.module.ts
  • T028 [US2] Create partnerships-page standalone component (partnership list with type/currency, latest NAV, member count, asset count, create dialog) in apps/client/src/app/pages/partnerships/partnerships-page.component.ts
  • T029 [US2] Create partnership-detail-page standalone component (partnership info, partnership-table for members, assets list with valuations, NAV history timeline, add member/valuation/asset dialogs) in apps/client/src/app/pages/partnership-detail/partnership-detail-page.component.ts
  • T030 [US2] Add lazy-loaded routes for /partnerships → PartnershipsPageComponent and /partnerships/:id → PartnershipDetailPageComponent in apps/client/src/app/app.routes.ts

Checkpoint: Partnership CRUD with members, NAV valuations, assets, and allocated values per member are functional.


Phase 5: User Story 3 — Distribution Tracking (Priority: P1)

Goal: Record distributions from partnerships to entities with type categorization, provide summaries grouped by period, type, partnership, and entity

Independent Test: Record distributions of various types from partnerships to entities, view summaries grouped by monthly/quarterly/yearly. Verify totals match sum of individual records.

Implementation for User Story 3

  • T031 [P] [US3] Create DistributionService with recording (date >= inception validation), deletion, listing with filters, and summary aggregation (byType, byPartnership, byPeriod with MONTHLY/QUARTERLY/YEARLY grouping, gross/net/taxWithheld totals) in apps/api/src/app/distribution/distribution.service.ts
  • T032 [P] [US3] Create distribution-chart standalone component (Chart.js bar chart showing distributions by period with type color coding) in libs/ui/src/lib/distribution-chart/distribution-chart.component.ts
  • T033 [US3] Create DistributionController with 3 endpoints (POST create, GET list with filters/grouping, DELETE) per distribution-kdocument-fo-api.md in apps/api/src/app/distribution/distribution.controller.ts
  • T034 [US3] Create DistributionModule importing PrismaModule, register DistributionModule in AppModule imports array in apps/api/src/app/distribution/distribution.module.ts and apps/api/src/app/app.module.ts
  • T035 [US3] Create distributions-page standalone component (distribution list with entity/partnership/type/date filters, summary cards for gross/net/tax, distribution-chart by period, record distribution dialog) in apps/client/src/app/pages/distributions/distributions-page.component.ts
  • T036 [US3] Add lazy-loaded route for /distributions → DistributionsPageComponent in apps/client/src/app/app.routes.ts

Checkpoint: Distribution recording, categorization, and period/type/entity summaries are functional.


Phase 6: User Story 4 — K-1/K-3 Document Management (Priority: P2)

Goal: Enter structured K-1 data per partnership per tax year, auto-allocate to members by ownership %, track filing status, upload and link PDF documents

Independent Test: Enter K-1 data for a partnership, verify allocated amounts match ownership percentages per member. Update status from ESTIMATED to FINAL. Upload PDF and link to K-1 record.

Depends on: US2 (partnership membership percentages for allocation calculation)

Implementation for User Story 4

  • T037 [P] [US4] Create UploadService with Multer local filesystem storage (configurable UPLOAD_DIR), file metadata persistence to Document model, and download stream serving in apps/api/src/app/upload/upload.service.ts
  • T038 [P] [US4] Create KDocumentService with CRUD (unique constraint on partnership+type+taxYear), auto-allocation computation (K-1 amounts × member ownership %), status transitions (DRAFT→ESTIMATED→FINAL), partial data merge on update, and document linking in apps/api/src/app/k-document/k-document.service.ts
  • T039 [P] [US4] Create k-document-form standalone component (Angular Material form with 20 K-1 box fields: ordinary income, net rental, guaranteed payments, interest, dividends, qualified dividends, royalties, short-term CG, long-term CG, Section 1250, Section 1231, other income, Section 179, other deductions, SE earnings, foreign taxes, AMT items, cash distributions, property distributions; plus filing status selector) in libs/ui/src/lib/k-document-form/k-document-form.component.ts
  • T040 [US4] Create UploadController with POST /upload (multipart/form-data with FileInterceptor) and GET /upload/:id/download endpoints in apps/api/src/app/upload/upload.controller.ts
  • T041 [US4] Create UploadModule with MulterModule.register configuration, register in AppModule in apps/api/src/app/upload/upload.module.ts and apps/api/src/app/app.module.ts
  • T042 [US4] Create KDocumentController with 5 endpoints (POST create, GET list with filters, PUT update data/status, POST link-document) per distribution-kdocument-fo-api.md in apps/api/src/app/k-document/k-document.controller.ts
  • T043 [US4] Create KDocumentModule importing PrismaModule and UploadModule, register in AppModule in apps/api/src/app/k-document/k-document.module.ts and apps/api/src/app/app.module.ts
  • T044 [US4] Create k-documents-page standalone component (K-document list with partnership/year/status filters, k-document-form for data entry, allocation preview table showing member amounts, status badge, PDF upload/link action) in apps/client/src/app/pages/k-documents/k-documents-page.component.ts
  • T045 [US4] Add lazy-loaded route for /k-documents → KDocumentsPageComponent in apps/client/src/app/app.routes.ts

Checkpoint: K-1 data entry, auto-allocation, status tracking, and PDF upload/linking are functional.


Phase 7: User Story 5 — Partnership & Asset Performance Calculation (Priority: P2)

Goal: Calculate XIRR (IRR), TVPI, DPI, RVPI for partnerships. Compute periodic returns (monthly/quarterly/yearly) using Modified Dietz method. Entity-level aggregate performance.

Independent Test: Create partnership with historical NAV entries, contributions, and distributions. Verify XIRR, TVPI (1.3x for $1M contributed/$400K distributed/$900K NAV), DPI, RVPI, and quarterly Modified Dietz returns match expected calculations.

Depends on: US2 (partnership NAV and member data), US3 (distribution data for DPI calculation)

Implementation for User Story 5

  • T046 [US5] Create FamilyOfficePerformanceCalculator standalone class with XIRR (Newton-Raphson iteration using big.js), TVPI (distributions+NAV/contributed), DPI (distributions/contributed), RVPI (NAV/contributed), and Modified Dietz periodic returns in apps/api/src/app/portfolio/calculator/family-office/performance-calculator.ts
  • T047 [US5] Integrate FamilyOfficePerformanceCalculator into PartnershipService performance endpoint — gather NAV history, contributions, distributions, compute metrics, support periodicity parameter (MONTHLY/QUARTERLY/YEARLY) in apps/api/src/app/partnership/partnership.service.ts
  • T048 [P] [US5] Create performance-metrics standalone component (display cards for IRR %, TVPI x, DPI x, RVPI x with color coding for positive/negative, period return chart) in libs/ui/src/lib/performance-metrics/performance-metrics.component.ts
  • T049 [US5] Create partnership-performance-page standalone component (performance-metrics display, period returns table with periodicity selector MONTHLY/QUARTERLY/YEARLY, cumulative return line chart using Chart.js) in apps/client/src/app/pages/partnership-performance/partnership-performance-page.component.ts
  • T050 [US5] Add lazy-loaded route for /partnerships/:id/performance → PartnershipPerformancePageComponent in apps/client/src/app/app.routes.ts

Checkpoint: Partnership performance metrics (XIRR, TVPI, DPI, RVPI) and periodic returns with selectable periodicity are functional.


Phase 8: User Story 6 — Benchmark Comparison (Priority: P2)

Goal: Compare partnership returns against S&P 500, bonds, real estate, and CPI benchmarks. Display excess return (alpha) and cumulative comparison charts.

Independent Test: Select a partnership with known performance, choose S&P 500 benchmark, verify benchmark returns are period-aligned and excess return calculation is accurate.

Depends on: US5 (performance calculation provides the partnership return series to compare against)

Implementation for User Story 6

  • T051 [US6] Create FamilyOfficeBenchmarkService composing existing BenchmarkService — configure pre-built benchmarks (SPY→S&P 500, AGG→US Agg Bond, VNQ→Real Estate, TIP→CPI proxy) in Property table, fetch historical data via DataProviderService, compute period-matched returns, excess return, and cumulative comparison data in apps/api/src/services/benchmark/family-office-benchmark.service.ts
  • T052 [US6] Integrate FamilyOfficeBenchmarkService into partnership performance endpoint — accept benchmarks query parameter (comma-separated IDs), return benchmarkComparisons array with period returns and excess return in apps/api/src/app/partnership/partnership.controller.ts
  • T053 [P] [US6] Create benchmark-comparison-chart standalone component (Chart.js multi-line chart with partnership + benchmark cumulative return lines on same time axis, legend, excess return annotation) in libs/ui/src/lib/benchmark-comparison-chart/benchmark-comparison-chart.component.ts
  • T054 [US6] Add benchmark multi-select dropdown and benchmark-comparison-chart to partnership-performance-page, wire benchmark IDs to performance API call in apps/client/src/app/pages/partnership-performance/partnership-performance-page.component.ts

Checkpoint: Benchmark comparison with S&P 500, bonds, real estate, CPI is functional with excess return display and cumulative charts.


Phase 9: User Story 7 — Periodic Performance Reporting (Priority: P3)

Goal: Generate consolidated reports for an entity or family-wide, over a chosen period (month/quarter/year), including value, allocation, performance, distributions, and benchmarks

Independent Test: Select an entity and Q4 2025, generate report, verify all sections (value change, allocation, partnership performance, distribution summary, benchmarks) contain accurate data.

Depends on: US1 (entities), US2 (partnerships), US3 (distributions), US5 (performance), US6 (benchmarks)

Implementation for User Story 7

  • T055 [P] [US7] Create FamilyOfficeService with report generation method — aggregate entity/family-wide value at period start/end, compute period and YTD change, compile asset allocation, partnership performance (IRR/TVPI/DPI/period return), distribution summary by type, benchmark comparisons using ExchangeRateDataService for multi-currency in apps/api/src/app/family-office/family-office.service.ts
  • T056 [US7] Create FamilyOfficeController with GET /family-office/report endpoint accepting entityId, period (MONTHLY/QUARTERLY/YEARLY), year, periodNumber, benchmarks query params per distribution-kdocument-fo-api.md in apps/api/src/app/family-office/family-office.controller.ts
  • T057 [US7] Create FamilyOfficeModule importing PrismaModule and required service modules, register in AppModule in apps/api/src/app/family-office/family-office.module.ts and apps/api/src/app/app.module.ts
  • T058 [US7] Create report-page standalone component (period selector with type/year/number, optional entity dropdown, benchmark multi-select, report sections: summary cards, asset allocation pie chart, partnership performance table, distribution summary, benchmark comparison chart) in apps/client/src/app/pages/reports/report-page.component.ts
  • T059 [US7] Add lazy-loaded route for /reports → ReportPageComponent in apps/client/src/app/app.routes.ts

Checkpoint: Periodic reports with all sections (value, allocation, performance, distributions, benchmarks) generate correctly for entity-scoped and family-wide views.


Phase 10: User Story 8 — Consolidated Family Dashboard (Priority: P3)

Goal: Single-pane dashboard showing total AUM, allocation by entity/asset class/structure, recent distributions, K-1 filing status

Independent Test: Navigate to dashboard with multiple entities, partnerships, and distributions recorded. Verify all widgets show correct aggregated data.

Depends on: US1 (entities), US2 (partnerships), US3 (distributions), US4 (K-1 status)

Implementation for User Story 8

  • T060 [US8] Add dashboard aggregation methods to FamilyOfficeService — compute total AUM (sum of entity-weighted holdings), allocation breakdowns (by entity, asset class, structure type), fetch recent 5 distributions, fetch K-1 status counts (draft/estimated/final) for current tax year in apps/api/src/app/family-office/family-office.service.ts
  • T061 [US8] Add GET /family-office/dashboard endpoint to FamilyOfficeController returning IFamilyOfficeDashboard response per distribution-kdocument-fo-api.md in apps/api/src/app/family-office/family-office.controller.ts
  • T062 [US8] Create dashboard-page standalone component (total AUM hero card, allocation-by-entity pie chart, allocation-by-asset-class pie chart, allocation-by-structure donut chart, recent distributions table, K-1 status progress widget with draft/estimated/final counts) in apps/client/src/app/pages/family-dashboard/dashboard-page.component.ts
  • T063 [US8] Add lazy-loaded route for /family-office → DashboardPageComponent in apps/client/src/app/app.routes.ts

Checkpoint: Dashboard displays accurate aggregated family office data across all entities and partnerships.


Phase 11: Polish & Cross-Cutting Concerns

Purpose: Navigation, configuration, consistency, and validation across all user stories

  • T064 [P] Add family office navigation items (Entities, Partnerships, Distributions, K-Documents, Reports, Dashboard) to sidebar/header layout in apps/client/src/app/ layout component
  • T065 [P] Add UPLOAD_DIR and MAX_UPLOAD_SIZE environment variable configuration with defaults to apps/api/src/ environment config and docker/docker-compose.dev.yml
  • T066 Consistent error handling (409 Conflict for duplicates, 400 for validation, 403 for permissions) and validation messages across all 6 new API modules
  • T067 Run quickstart.md validation — execute full flow: create entity → create partnership → add membership → record NAV → record distribution → enter K-1 → view performance → compare benchmarks → generate report → view dashboard

Dependencies & Execution Order

Phase Dependencies

  • Setup (Phase 1): No dependencies — can start immediately
  • Foundational (Phase 2): Depends on Phase 1 (Prisma client must be generated) — BLOCKS all user stories
  • User Stories (Phases 3-10): All depend on Phase 2 completion
    • US1 (Phase 3): No dependencies on other stories — can start first
    • US2 (Phase 4): No dependencies on other stories — can start in parallel with US1
    • US3 (Phase 5): No dependencies on other stories — can start in parallel with US1/US2
    • US4 (Phase 6): Depends on US2 (partnership membership % for K-1 allocation)
    • US5 (Phase 7): Depends on US2 (NAV data) and US3 (distribution data for DPI)
    • US6 (Phase 8): Depends on US5 (performance return series)
    • US7 (Phase 9): Depends on US1, US2, US3, US5, US6 (all data sources for report)
    • US8 (Phase 10): Depends on US1, US2, US3, US4 (all data sources for dashboard)
  • Polish (Phase 11): Depends on all user stories being complete

Within Each User Story

  • API service before controller (controller imports service)
  • Controller before module (module declares controller + service)
  • Module registration before client pages (API must be available)
  • UI components marked [P] can be built in parallel with API work
  • Page components after both API and UI components are ready
  • Route registration last (depends on page components)

Parallel Opportunities

  • All Phase 2 tasks marked [P] can run simultaneously (12 independent files)
  • US1, US2, US3 can all start in parallel after Phase 2 (independent P1 stories)
  • Within each story: API service [P] with UI component (different projects)
  • US4 can start as soon as US2 is complete
  • US5 can start as soon as US2 and US3 are complete
  • US6 can start as soon as US5 is complete
  • US7 and US8 can proceed in parallel once their dependencies are met

Parallel Example: Phase 2 (Foundational)

# Launch all interface files together:
Task T006: "Create entity interfaces in libs/common/src/lib/interfaces/entity.interface.ts"
Task T007: "Create partnership interfaces in libs/common/src/lib/interfaces/partnership.interface.ts"
Task T008: "Create distribution interfaces in libs/common/src/lib/interfaces/distribution.interface.ts"
Task T009: "Create K1Data interface in libs/common/src/lib/interfaces/k-document.interface.ts"
Task T010: "Create family office interfaces in libs/common/src/lib/interfaces/family-office.interface.ts"

# Launch all DTO files together:
Task T011: "Create entity DTOs in libs/common/src/lib/dtos/"
Task T012: "Create partnership DTOs in libs/common/src/lib/dtos/"
Task T013: "Create distribution DTO in libs/common/src/lib/dtos/"
Task T014: "Create k-document and ownership DTOs in libs/common/src/lib/dtos/"

Parallel Example: User Story 1

# Launch API service and UI component together:
Task T017: "Create EntityService in apps/api/src/app/entity/entity.service.ts"
Task T018: "Create entity-card component in libs/ui/src/lib/entity-card/"

# Then sequentially:
Task T019: "Create EntityController"
Task T020: "Create EntityModule + register"
Task T021: "Create entities-page"
Task T022: "Create entity-detail-page"
Task T023: "Add routes"

Implementation Strategy

MVP First (User Stories 1-3 Only)

  1. Complete Phase 1: Setup (schema + migration)
  2. Complete Phase 2: Foundational (interfaces, DTOs, permissions)
  3. Complete Phase 3: User Story 1 — Entity & Ownership
  4. STOP and VALIDATE: Test entity CRUD and ownership independently
  5. Complete Phase 4: User Story 2 — Partnership Tracking
  6. Complete Phase 5: User Story 3 — Distribution Tracking
  7. MVP COMPLETE: Family structure, partnerships, and distributions are functional

Incremental Delivery

  1. Setup + Foundational → Foundation ready
  2. Add US1 → Test entities independently → MVP v1 (family structure)
  3. Add US2 → Test partnerships independently → MVP v2 (+ partnerships)
  4. Add US3 → Test distributions independently → MVP v3 (+ cash flow tracking)
  5. Add US4 → Test K-1 independently → Tax season ready
  6. Add US5 + US6 → Test performance + benchmarks → Performance analysis ready
  7. Add US7 + US8 → Test reporting + dashboard → Full family office platform

Parallel Team Strategy

With 2+ developers after Phase 2 completion:

  • Developer A: US1 (entities) → US4 (K-1, needs US2) → US7 (reporting)
  • Developer B: US2 (partnerships) → US3 (distributions) → US5 (performance) → US6 (benchmarks) → US8 (dashboard)

Notes

  • [P] tasks = different files, no dependencies on incomplete tasks
  • [Story] label maps task to specific user story for traceability
  • Each user story is independently testable at its checkpoint
  • No test tasks included — tests not explicitly requested in specification
  • Commit after each task or logical group
  • All new API endpoints follow existing pattern: AuthGuard('jwt') + HasPermissionGuard + @HasPermission() decorator
  • All new Angular components are standalone (no NgModules), use takeUntilDestroyed for cleanup
  • All financial math uses big.js for decimal precision (consistent with existing calculators)
  • All currency conversions use existing ExchangeRateDataService.toCurrencyAtDate()