Dynamic Tax-Aware Withdrawal Sequencer — policy engine diagnostics. Read-only. Touches no Stage 5 file, no engine, no schema, no persistence.
All scenarios pass. Policy engine is stable, feature-flag isolation holds, defaults match governance.
✓ aggregator.active === false when flag is off ✓ aggregator.reason mentions feature flag ✓ no recommendations emitted ✓ every policy reports verdict === "inactive"
✓ aggregator.active === false when config.enabled === false ✓ aggregator.reason mentions config.enabled ✓ no recommendations emitted
✓ result shape valid ✓ verdict === "allow" ✓ no recommendations ✓ overshoot within tolerance
✓ result shape valid ✓ verdict === "caution" under if_net_positive ✓ exactly one recommendation ✓ recommendation action === "reduce_withdrawal" ✓ recommendation target === "ira" ✓ recommendation magnitude is a positive number
✓ result shape valid ✓ verdict === "block" under never ✓ one recommendation ✓ recommends reduce_withdrawal
✓ result shape valid ✓ verdict === "allow" under always ✓ no recommendations
✓ result shape valid ✓ verdict === "allow" ✓ no recommendations ✓ no tier change
✓ result shape valid ✓ verdict === "block" under strict_avoid ✓ one recommendation ✓ recommends reduce_withdrawal ✓ magnitude is positive ✓ tier 0 → 1 detected
✓ result shape valid ✓ verdict === "caution" under cost_aware ✓ one recommendation
✓ result shape valid ✓ verdict === "inactive" ✓ no recommendations
✓ result shape valid ✓ verdict === "caution" (protect Roth) ✓ one recommendation ✓ action === "preserve_source" ✓ target === "roth"
✓ result shape valid ✓ verdict === "allow" under tax pressure ✓ one recommendation ✓ action === "prefer_source" ✓ target === "roth"
✓ result shape valid ✓ verdict === "block" under aggressive ✓ action === "preserve_source"
✓ result shape valid ✓ verdict === "inactive"
✓ result shape valid ✓ verdict === "inactive" when heir data missing ✓ no recommendations
✓ result shape valid ✓ verdict === "allow" below materiality ✓ no recommendations ✓ diagnostics report canonical materiality pp
✓ result shape valid ✓ verdict === "caution" above materiality ✓ two recommendations (preserve + recommend-back) ✓ one preserve_source on roth ✓ one recommend_back_to_conversions on conversion_schedule
✓ result shape valid ✓ verdict === "inactive" when disabled ✓ no recommendations
✓ aggregator.active === true ✓ bracket policy → caution ✓ Roth policy → allow (taxPressure derived true) ✓ Roth recommendation: prefer_source on roth
✓ aggregator.active === true ✓ all recommendation keys are unique ✓ all recommendations have valid shape
✓ did not throw on null context ✓ aggregator.active === true ✓ no recommendations for empty context
✓ schemaVersion === 1 ✓ enabled === false ✓ bracketCeiling === 24 ✓ bracketFillTolerance === 2000 ✓ bracketCrossingPolicy === if_net_positive ✓ irmaaPolicy === strict_avoid ✓ rothPreservationStrength === balanced ✓ heirImpactBias === enabled ✓ clientPortalExposure === disabled ✓ conversionCoupling === read_only_recommend_back
✓ isStage6ASequencerEnabled() === false by default