Skip to content

ADR-019 — Remove SOLVENCY Concentration Auto-Fallback (Concentration Controlled Only by Lens) ​

Date: 2026-06-23 Status: Accepted Related: 013-trim-concentration-override · 017-config-via-api · 018-dca-dip-reserve

Background ​

ADR-013 (2026-05-28) added Sanity check 4 to parse_cio_memo(): When SOLVENCY_BUFFER_LEVEL=strong (user has family fallback, investment account zeroing does not affect survival), it automatically rewrites TRIM_REASON=concentration position reductions to HOLD. Rationale: Sufficient fallback ⇒ high concentration within the account is not a "real wealth risk."

ADR-017 (2026-06-17) then added an explicit switch verdict.concentration_lens_enabled, allowing users to actively declare "don't bother me with concentration," without needing to fake emergency_buffer_cny to trigger strong.

Thus, the same question ("Should concentration constrain this money?") had two answers: solvency auto-inference vs. lens explicit declaration. This ruling: Remove the automatic system, keep only the explicit one.

Decision ​

Remove the solvency_strong trigger from Sanity check 4. Whether concentration constitutes a constraint is now determined solely by the explicit switch verdict.concentration_lens_enabled.

parse_cio_memo() no longer accepts the solvency_strong parameter; Sanity check 4 only force-HOLDs TRIM_REASON=concentration when the user turns off the lens (concentration_lens_enabled=False).

Why ​

  1. Hardcoded auto-fallback can mask real problems. The solvency auto-rewrite only acts post-hoc at the parse layer; the prompt layer is unaware: The CIO argues for a reduction (e.g., 81% concentration + downtrend), but the verdict is silently flipped to HOLD ¥0, leaving no trace of the original intent to "reduce by ¥40,000." The user sees a "risk-free HOLD" and cannot distinguish between "truly no risk" and "risk being hidden" — potentially obscuring real issues.
  2. Solvency ≠ Concentration. Family fallback addresses "will I go bankrupt?" (survival dimension), but does not address "is 81% of the portfolio in one declining asset?" (diversification dimension). Equating the two was a logical flaw in ADR-013.
  3. Explicit is better than implicit. Whether to ignore concentration should be a user declaration (lens), not a system-inferred guess (solvency). This follows the same philosophy as ADR-018: making fund semantics explicit config, not hardcoded assumptions.

Symmetry of the Two Designs (Why Lens is Better than Solvency) ​

Solvency Auto-Fallback (Removed)Concentration Lens (Retained)
TriggerSystem auto-infers from wealth_contextUser explicit switch (GUI/API/env)
Prompt LayerUnaware → CIO still argues for reductionWhen off, soft-inhibits synchronously; CIO no longer reduces for concentration
ConsistencyPost-hoc flip at parse layer → contradictoryPrompt + parse layers consistent
VisibilitySilently masks real reduction intentUser proactively disclaims, leaves auditable trace

Impact ​

  • Default behavior changes: Lens is ON by default. Real concentration-driven reductions will now be displayed truthfully, no longer silently suppressed to HOLD by solvency. Users wanting to immunize against concentration reductions must explicitly turn the lens OFF.
  • The _concentration_lens marker now only has disabled; the intervention counterfactual ledger rule only produces config_concentration_lens_off (historical jsonl sanity4_solvency_concentration is still merged into the trim_blocked bucket by rule_family(), aggregation is preserved).
  • Email rendering: When a reduction is blocked due to the lens being off, it shows "Reduction not executed (concentration lens is off)" + the CIO's original reduction amount is recorded, replacing the old wording "Concentration does not constitute real risk, fallback is sufficient."

How to Operate the Concentration Lens (Three-Tier Equivalence, ADR-017) ​

MethodHow To
GUIinvest-gui "Settings → Committee Config → Concentration Lens" switch
APIPUT /api/config body {"key":"verdict.concentration_lens_enabled","value":false}
CLI/agentskill config --set verdict.concentration_lens_enabled false
env (bootstrap default).env: INVEST_VERDICT_CONCENTRATION_LENS_ENABLED=false

Turning it off = Single asset / deliberate concentration / full investable pool will not be advised to reduce due to position concentration (stop-loss / drawdown / volatility / valuation risks are still monitored; CONCENTRATION_PCT numbers are still displayed truthfully, but reductions are not based on it).

Unchanged Parts ​

  • Stop-loss / bearish and other real-risk TRIMs are unaffected.
  • The hard fallback when the lens is off (Sanity 4 itself) is retained: Prevents the LLM from ignoring the prompt and relabeling an overweight position as bearish to secretly reduce it — but this only triggers when the user actively turns the lens off, executing the user's choice, not masking anything.
FileChange
core/committee/cio_parse.pyRemove solvency_strong parameter + Sanity 4 solvency trigger; marker fixed to disabled
core/committee/debate.py / core/runner/coordinator.pyNo longer calculate / pass solvency_strong
core/runner/intervention.pyConcentration interception rule fixed to config_concentration_lens_off
jobs/daily_report.py / jobs/daily_report_builder.pyEmail override wording changed to "Reduction not executed (lens is off)"
core/config/tunable.pyforced_hold_confidence_ceiling comment