POC Implementation Status — Wave 2

37 use cases implemented, 15 out of scope, 2 stubbed — all one-time (recurring/future-dated excluded)

37
Implemented
2
Stubbed
15
Out of Scope
6
New Rule Services
Pipeline coverage: the 10-step AvAchService pipeline in cam-movemoney-process-api is exercised end-to-end. EligibilityService widened from 3 account codes (BBK/BFL/BMM) to 32 codes covering all Q*/R* retirement codes plus HSA. Six new inline rule services are wired between Eligibility and Compliance: ContributionLimitService, PriorYearCodingService, RolloverRuleService, ConversionService, HsaEligibilityService, and ExcessContributionService. Recurring / future-dated routing remains unreachable (no scheduler present).

Full Use Case Matrix

All 54 use cases (17 deposit/withdrawal + 37 retirement). Status badges: implemented, stubbed, out of scope.

IDCategoryDescriptionStatusCode File TouchedSample cURL
UC-D1DepositOne-time brokerage deposit✓ ImplementedControllers/DepositController.cs, AvAchService.cscurl -X POST http://localhost:5001/ach/deposit -H 'Content-Type: application/json' -d '{"transactionRequest":{"acctId":10000001,"amount":2500}}'
UC-D2DepositFuture-dated deposit✗ Out of scope
UC-D3DepositAdvisor-initiated deposit✓ ImplementedDepositController.cs, ActorContext.cscurl -X POST http://localhost:5001/ach/deposit -H 'Content-Type: application/json' -d '{"transactionRequest":{"acctId":10000001,"amount":2500},"actor":{"type":"Advisor","repId":"R12345"}}'
UC-D4DepositQueued after-hours deposit⚠ StubbedQueueStubController.cs
UC-W1WithdrawalOne-time withdrawal✓ Implemented (Wave 1)WithdrawalController.cs, AvAchService.cscurl -X POST http://localhost:5001/ach/withdrawal -H 'Content-Type: application/json' -d '{"transactionRequest":{"acctId":10000002,"amount":5000}}'
UC-W2WithdrawalWithdrawal with reason codes (RMD, excess)✓ ImplementedWithdrawalController.cs, TransferReason.cscurl -X POST http://localhost:5001/ach/withdrawal/with-reason -H 'Content-Type: application/json' -d '{"transactionRequest":{"acctId":10000002,"amount":5000},"transferReason":"RMD"}'
UC-W3WithdrawalAdvisor-initiated withdrawal✓ ImplementedWithdrawalController.cs, ActorContext.cscurl -X POST http://localhost:5001/ach/withdrawal -H 'Content-Type: application/json' -d '{"transactionRequest":{"acctId":10000002,"amount":5000},"actor":{"type":"Advisor","repId":"R12345"}}'
UC-W4WithdrawalCancel queued withdrawal⚠ StubbedQueueStubController.cscurl -X DELETE http://localhost:5001/ach/queued/ABC-123
UC-RD1Recurring DepositSet up recurring deposit✗ Out of scope (recurring)
UC-RD2Recurring DepositModify active recurring deposit✗ Out of scope (recurring)
UC-RD3Recurring DepositCancel recurring deposit✗ Out of scope (recurring)
UC-RD4Recurring DepositAuto-execute recurring deposit✗ Out of scope (recurring)
UC-RD5Recurring DepositSkip holiday/weekend✗ Out of scope (recurring)
UC-RW1Recurring WithdrawalSet up recurring withdrawal✗ Out of scope (recurring)
UC-RW2Recurring WithdrawalModify/cancel recurring withdrawal✗ Out of scope (recurring)
UC-RW3Recurring WithdrawalAuto-execute recurring withdrawal✗ Out of scope (recurring)
UC-RW4Recurring WithdrawalTax withholding on recurring✗ Out of scope (recurring)
UC-RW5Recurring WithdrawalNIGO notify + retry✗ Out of scope (recurring)
UC-RC1IRATraditional IRA current-year contribution✓ ImplementedContributionController.cs, EligibilityService.cscurl -X POST http://localhost:5001/ach/contribution -H 'Content-Type: application/json' -d '{"transactionRequest":{"acctId":10000013,"amount":7000},"contributionMetadata":{"contributionYear":2026,"contributionType":"Regular","actorType":"Investor"}}'
UC-RC2IRARoth IRA current-year✓ ImplementedContributionController.cs
UC-RC3IRAPrior-year contribution (Jan 1–Apr 15)✓ ImplementedPriorYearCodingService.cs
UC-RC4IRACatch-up contribution (50+)✓ ImplementedContributionLimitService.cs
UC-RC5IRAAdvisor-initiated IRA contribution✓ ImplementedContributionController.cs, ActorContext.cs
UC-RC6IRASpousal IRA contribution✓ ImplementedContributionLimitService.cs
UC-RC7SEPEmployer SEP-IRA contribution✓ ImplementedContributionController.cs, EligibilityService.cs
UC-RC8SEPSelf-employed SEP-IRA✓ ImplementedContributionLimitService.cs
UC-RC9SIMPLESIMPLE IRA salary deferral✓ ImplementedContributionController.cs
UC-RC10SIMPLESIMPLE IRA employer match✓ ImplementedContributionController.cs
UC-RC11SEP/SIMPLEPrior-year SEP/profit-sharing✓ ImplementedPriorYearCodingService.cs
UC-RC12RolloverDirect 401(k) → Traditional IRA✓ ImplementedRolloverRuleService.cscurl -X POST http://localhost:5001/ach/rollover -H 'Content-Type: application/json' -d '{"transactionRequest":{"acctId":10000013,"amount":150000},"rolloverMetadata":{"rolloverType":"Direct","sourcePlan":"401k"}}'
UC-RC13RolloverRoth 401(k) → Roth IRA✓ ImplementedRolloverRuleService.cs
UC-RC14RolloverIndirect 60-day rollover✓ ImplementedRolloverRuleService.cs
UC-RC15RolloverIRA-to-IRA rollover (once-per-12mo)✓ ImplementedRolloverRuleService.cs
UC-RC16RolloverSpousal beneficiary rollover✓ ImplementedRolloverRuleService.cs
UC-RC17RolloverInherited IRA setup (non-spouse)✓ ImplementedEligibilityService.cs
UC-RC18ConversionFull Traditional → Roth conversion✓ ImplementedConversionService.cscurl -X POST http://localhost:5001/ach/conversion -H 'Content-Type: application/json' -d '{"sourceAcctId":10000013,"targetAcctId":10000023,"amount":50000,"conversionType":"Full"}'
UC-RC19ConversionPartial Roth conversion✓ ImplementedConversionService.cs
UC-RC20ConversionBackdoor Roth (pro-rata check)✓ ImplementedConversionService.cs
UC-RC21RecharacterizationRecharacterize regular contribution✓ ImplementedConversionService.cs
UC-RC22HSAHSA contribution✓ ImplementedHsaEligibilityService.cscurl -X POST http://localhost:5001/ach/hsa -H 'Content-Type: application/json' -d '{"transactionRequest":{"acctId":10000045,"amount":1100},"hsaMetadata":{"hdhpCovered":true,"coverageType":"Single"}}'
UC-RC23HSAHSA catch-up (55+)✓ ImplementedHsaEligibilityService.cs
UC-RC24HSAEmployer HSA contribution✓ ImplementedHsaEligibilityService.cs
UC-RC25Recurring RetirementMonthly DCA contribution✗ Out of scope (recurring)
UC-RC26Recurring RetirementAuto-stop at limit✗ Out of scope (recurring)
UC-RC27Recurring RetirementModify/cancel recurring✗ Out of scope (recurring)
UC-RC28Recurring RetirementAuto-execute recurring retirement✗ Out of scope (recurring)
UC-RC29SystemEnforce IRS limit by type/age✓ ImplementedContributionLimitService.cs
UC-RC30SystemPrior-year coding window✓ ImplementedPriorYearCodingService.cs
UC-RC31System5498 reporting code assignment✓ ImplementedForm5498CodeMapper.cs
UC-RC32SystemYTD aggregation across accounts✓ ImplementedContributionLimitService.cs
UC-RC33SystemOnce-per-12-months rollover rule✓ ImplementedRolloverRuleService.cs
UC-RC34SystemHSA HDHP eligibility check✓ ImplementedHsaEligibilityService.cs
UC-RC35ExcessReturn excess before deadline✓ ImplementedExcessContributionService.cscurl -X POST http://localhost:5001/ach/excess-return -H 'Content-Type: application/json' -d '{"acctId":10000014,"excessAmount":1000,"earningsAmount":25.00,"beforeDeadline":true}'
UC-RC36ExcessReturn excess after deadline (6% penalty)✓ ImplementedExcessContributionService.cs
UC-RC37ExcessAbsorb prior-year excess✓ ImplementedExcessContributionService.cs

What the POC proves

What's NOT included and WHY

  • Recurring / periodic (14 use cases): requires cam-mm-backgroundservice-api timer + the CmPeriodicInstruction schema wired up. Out of scope for this POC — separate wave.
  • Future-dated (1 use case, UC-D2): requires the same scheduler; out of scope.
  • External reporting (5498 / 1099-R emission): requires Tax Ops integration and yearly filing cadence; POC emits correct codes but does not file forms.
  • TaxWithholdingService: federal/state tax calculation for withdrawals — separate wave (depends on TaxOps rate tables).
  • Bridge BFF routing: investor-cash-mgmt-process-api is not part of the POC; we drive cam-movemoney-process-api directly.
  • SCA channel: ScaAchService was left untouched — POC only exercises AvAchService.

Canonical Mock Account Reference

12 illustrative accounts reconciled against the fixture cam-mm-mock-api/api/1-Api/camMMmockApis.Api/Data/Fixtures/accounts.json (60 accounts total, source of truth). Use these AcctIds for smoke tests and demo cURLs. Earlier drafts referenced 10000055 as R1H and 10000040/10000050 as HSA — fixture actually maps 10000055 to RMO profit sharing, R1H to 10000041/10000042, and HSA to the 10000045–10000048 block.

AcctIdClass CodeCategoryClientIdKey IraDataUse for
10000001BBKBrokerageCLT-001IraData=nullUC-D1 / UC-W1 brokerage happy-path
10000013QMMTraditional IRACLT-013age 51, YTD $3,500UC-RC1 happy-path Traditional IRA contribution
10000014QMMTraditional IRACLT-014age 63, YTD $8,000UC-RC35 excess-return trigger (over $7,000 limit)
10000016RMMTraditional IRACLT-016age 68, YTD $7,200, RMD ageUC-W2 RMD withdrawal illustration
10000023RRHRoth IRACLT-023age 37, YTD $5,500UC-RC2 Roth happy-path + UC-RC18 conversion destination
10000024RRHRoth IRACLT-024age 65, YTD $7,800, catch-up eligibleUC-RC4 catch-up near $8,000 combined limit
10000031QOISEP-IRACLT-031age 54, YTD $35,000UC-RC7 SEP contribution (under $70,000 limit)
10000037QISSIMPLE IRACLT-037age 43, YTD $8,000UC-RC9 SIMPLE deferral
10000041R1HInherited IRA (spouse)CLT-041age 54, inherited from spouse d. 2022-09-11UC-RC17 rollover-in + contribution NIGO
10000045HBKHSACLT-045age 41, YTD $3,200, IsHdhpCovered=trueUC-RC22 HSA happy-path (headroom $1,100 single)
10000047HMMHSACLT-047age 34, YTD $1,800, IsHdhpCovered=falseUC-RC22 / UC-RC34 NIGO-HsaNoHdhp rejection
10000055RMOOther qualified (profit sharing)CLT-055age 56, YTD $23,500UC-RC29 RMO allow-list check (not inherited)

Further reading

See WAVE2-IMPLEMENTATION-STATUS.md in ~/code/ach-poc/ for the engineering log, diff summary per service, and verification commands.