feat: wire monthly income reinvest — recommendation-only default (S6-001)#101
Merged
Conversation
…default (S6-001) The reinvest timer was a TODO stub logging "complete" — its first live firing 2026-07-01 would have silently done nothing. It now delegates to a new IIncomeReinvestService (S5-001 thin-timer shape, null-tolerant resolve per ADR-024) that reuses the existing IncomeSleeveManager plan generator — the 10%/40% caps stay enforced in one place, never duplicated. Locked decision 1 is the contract: IncomeSleeve:OrderPlacementEnabled defaults FALSE in code, example config, and tests — the default run computes the plan and sends a neutral Discord digest (own named client DiscordIncomeReport, 8s bound) but NEVER touches IExecutionService. The first-trading-weekday gate lives in code (Default D3) because NCRONTAB DOM/DOW semantics cannot be trusted to fire exactly once. Broker connect failure reuses the S5-003 operational-alert degrade; report failure can never fail the run. Empty sleeve still reports "no buys proposed" as proof the timer ran (Default D8). Suite: 632 passing (596 -> 632, 36 RED-first). Host-boot smoke: PASS on port 7188 with throwaway Azurite — all 4 timers register, no TypeLoadException (the new bare IncomeConfig/ExecutionConfig factory registrations are the S5-004r boot-crash class this gate exists for). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What / Why
Wires the
IncomeSleeve_MonthlyReinvesttimer to a newIIncomeReinvestServicepipeline. Without this, the income sleeve (70% of the portfolio) would never produce gate evidence during the paper-validation run — the timer existed but did nothing. The first real firing is July 1, 2026 (first trading weekday of the month), ahead of the sprint deadline.IncomeSleeveManager(issuer/category caps reused, never duplicated).DiscordIncomeReportService(named client, 8s timeout); report failure can never fail the run.Locked posture
IncomeSleeveConfig.OrderPlacementEnableddefaults to false — recommendation-only. The run produces a plan + Discord report and places no orders unless the owner explicitly flips the flag. This PR does not change that default, and the review fixes were deliberately constrained to comments/strings/one additive log field so the verified flag-off invariant needs no re-proof.Test plan
IExecutionServiceis never called.host-boot-smokejob must pass before merge.Notes
Judge verdict: PASS with 5 fix-now items (comment/string/log-field clarity), applied in
fix(review): log clarity + triage pointers for the reinvest path (S6-001). The judge-deferred A2 pattern question — optional-null ctor dependencies vs fail-fast boot failure — is recorded for DECISIONS.md Known Debt and will be added in a later item, not this PR.🤖 Generated with Claude Code