# Fallback register (engine) Every silent substitution found in the valuation path, classified. UNSAFE items were removed: missing data now stays missing (status UNAVAILABLE / UNVERIFIED) and, where material, blocks publication. | Location | Pattern | Class | Action | |---|---|---|---| | `calculate_fair_value` risk-free | `_rf = … if treasury else 0.045` | UNSAFE (market input) | removed — `rf=None` ⇒ no per-share value; Stage A A17 blocks | | story context | `rf=_dm.get("rf") or 0.045` | UNSAFE | removed — story returns None with reason | | `story_dcf.story_fcff` | `rf or 0.045` | UNSAFE | removed | | `_median_roe` | `else 0.12` | UNSAFE (through-cycle ROE) | returns None ⇒ book-value model withheld | | mechanical DCF growth | `pred_fund.get("eps_growth", 0.08)` | UNSAFE | removed — no growth input ⇒ no value | | persona prose | `sector_pe … or 20.0` | UNSAFE (fabricated benchmark) | line skipped when missing | | consensus anchor | FY fields with 0 contributors | UNSAFE | N=0 ⇒ no consensus; quarterly-sum fallback labelled non-consensus; A8b | | bank statement revenue | provider gross `totalRevenue` | UNSAFE (wrong concept) | canonicalised to NET_REVENUE upstream; gross quarantined | | ADS ratio | inferred from per-share ratios | SAFE only as cross-check | sourced from the 20-F (A18) when available; inference retained as consistency check | | ERP | `_DAMODARAN_ERP = 0.0428` | SAFE (documented model constant, not a data substitute) | labelled in A17 | | confidence defaults | `eps_confidence … 0.40` etc. | SAFE (model weights, not financial facts) | kept | | stage weights / caps | `_STAGE_WEIGHTS`, sanity caps | SAFE (methodology constants) | disclosed in the composite audit | | beta | bottom-up sector beta when raw beta missing | SAFE (documented methodology) | shown in assumptions | | segment margins | LLM-recalled segment brief | SAFE only as story context | never used for a canonical value; SOTP requires filing-sourced profits |