alphacouncil-agent 0.9.4 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +3 -3
- package/.claude-plugin/plugin.json +2 -2
- package/.codex-plugin/plugin.json +4 -4
- package/AGENTS.md +25 -11
- package/CHANGELOG.md +146 -0
- package/CLAUDE.md +24 -7
- package/README.ja.md +15 -10
- package/README.md +21 -13
- package/README.zh-CN.md +17 -12
- package/data/authored/core-seats.mjs +808 -0
- package/data/authored/growth-seats.mjs +581 -0
- package/data/authored/index.mjs +114 -0
- package/data/authored/quant-seats.mjs +564 -0
- package/data/authored/value-seats.mjs +663 -0
- package/data/build-profile.v1.json +2 -1
- package/data/council-evaluation-protocol.v1.json +7 -4
- package/data/master-selector-method-locales.v1.mjs +10 -0
- package/data/persona-v3-ai-assisted-solo-profile.v1.json +2 -2
- package/data/persona-v3-build-specs.v1.mjs +60 -3
- package/docs/INSTALL.md +6 -10
- package/docs/personas.md +2 -1
- package/docs/plans/v1.0-roadmap.md +487 -0
- package/docs/plans/v1.1-basket-native-seats.md +267 -0
- package/docs/releases/v0.9.5.md +96 -0
- package/docs/releases/v1.0.0.md +164 -0
- package/docs/report-contract.md +30 -6
- package/knowledge/ai-assisted-solo/experiments/runs/a.json +13 -13
- package/knowledge/ai-assisted-solo/experiments/runs/b.json +2 -2
- package/knowledge/ai-assisted-solo/experiments/runs/c.json +2 -2
- package/knowledge/ai-assisted-solo/experiments/runs/d13.json +126 -126
- package/knowledge/ai-assisted-solo/experiments/runs/d26.json +274 -254
- package/knowledge/ai-assisted-solo/experiments/runs/e-d13.json +129 -129
- package/knowledge/ai-assisted-solo/experiments/runs/e-d26.json +277 -257
- package/knowledge/ai-assisted-solo/experiments/runs/h_ai_reference.json +278 -258
- package/knowledge/ai-assisted-solo/experiments/simulation-input.json +7278 -556
- package/knowledge/ai-assisted-solo/experiments/simulation-manifest.json +22 -22
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_ackman/reviews/{change_value_bridge.ai-review.json → market_capitalisation.ai-review.json} +46 -46
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_ackman/reviews/{power_map.ai-review.json → owner_earnings_yield.ai-review.json} +46 -46
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_aschenbrenner/reviews/{compute_power_bridge.ai-review.json → market_capitalisation.ai-review.json} +46 -46
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_aschenbrenner/reviews/{timeline_reverse_valuation.ai-review.json → price_implied_cash_yield.ai-review.json} +46 -46
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_asness/reviews/{crowding_cost_stress.ai-review.json → nominal_earnings_yield_gap.ai-review.json} +49 -49
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_asness/reviews/{factor_decomposer.ai-review.json → real_earnings_yield_gap.ai-review.json} +49 -49
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_bogle/reviews/expected_return_over_long_bond.ai-review.json +277 -0
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_bogle/reviews/fundamental_expected_return.ai-review.json +277 -0
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_buffett/reviews/{incremental_returns.ai-review.json → market_capitalisation.ai-review.json} +46 -46
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_buffett/reviews/{owner_earnings_rebuilder.ai-review.json → owner_earnings_yield.ai-review.json} +46 -46
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_burry/reviews/{mispricing_carry.ai-review.json → net_current_asset_surplus_per_share.ai-review.json} +49 -49
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_burry/reviews/{capital_structure_reader.ai-review.json → net_current_asset_value_per_share.ai-review.json} +46 -46
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_cathie_wood/reviews/{cost_adoption_curve.ai-review.json → current_cash_yield.ai-review.json} +46 -46
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_cathie_wood/reviews/{capture_valuation_bridge.ai-review.json → market_capitalisation.ai-review.json} +46 -46
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_dalio/reviews/{regime_classifier.ai-review.json → policy_real_rate.ai-review.json} +49 -49
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/{master_munger/reviews/incentive_map.ai-review.json → master_dalio/reviews/real_curve_slope.ai-review.json} +51 -51
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_damodaran/reviews/{reverse_valuation.ai-review.json → implied_equity_risk_premium.ai-review.json} +49 -49
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_damodaran/reviews/{story_dcf.ai-review.json → premium_versus_long_run_average.ai-review.json} +49 -49
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_druckenmiller/reviews/{liquidity_revision_map.ai-review.json → liquidity_curve_impulse.ai-review.json} +49 -49
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_druckenmiller/reviews/{inflection_payoff.ai-review.json → policy_real_rate.ai-review.json} +49 -49
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_duan_yongping/reviews/{user_value_evidence.ai-review.json → five_year_opportunity_cost.ai-review.json} +46 -46
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_duan_yongping/reviews/{opportunity_cost.ai-review.json → margin_retention.ai-review.json} +46 -46
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_fisher/reviews/{research_productivity.ai-review.json → margin_retention.ai-review.json} +46 -46
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_fisher/reviews/{scuttlebutt_graph.ai-review.json → reinvestment_spread.ai-review.json} +49 -49
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/{master_dalio/reviews/debt_driver_stress.ai-review.json → master_forensic_short/reviews/cash_conversion_gap.ai-review.json} +51 -51
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_forensic_short/reviews/{accounting_rebuilder.ai-review.json → cash_cover_of_leverage.ai-review.json} +46 -46
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_graham/reviews/{asset_floor.ai-review.json → defensive_hurdle_base.ai-review.json} +46 -46
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_graham/reviews/{normalized_earnings.ai-review.json → half_normalised_earnings_yield.ai-review.json} +46 -46
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_jhunjhunwala/reviews/{penetration_liquidity.ai-review.json → cash_quality_gap.ai-review.json} +49 -49
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_jhunjhunwala/reviews/{promoter_governance.ai-review.json → real_structural_growth.ai-review.json} +49 -49
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_klarman/reviews/{recovery_waterfall.ai-review.json → downside_asset_coverage.ai-review.json} +46 -46
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_klarman/reviews/{cash_catalyst_compare.ai-review.json → market_capitalisation.ai-review.json} +46 -46
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_li_lu/reviews/{promise_integrity_ledger.ai-review.json → cash_backed_decade_return.ai-review.json} +46 -46
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_li_lu/reviews/{ten_year_return_bridge.ai-review.json → decade_return_over_long_bond.ai-review.json} +49 -49
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_lynch/reviews/{story_numbers_check.ai-review.json → growth_justified_capitalisation.ai-review.json} +46 -46
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_lynch/reviews/{category_classifier.ai-review.json → market_capitalisation.ai-review.json} +46 -46
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_marks/reviews/{cycle_temperature.ai-review.json → credit_cycle_position.ai-review.json} +49 -49
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_marks/reviews/{implied_expectations.ai-review.json → equity_over_corporate_debt.ai-review.json} +49 -49
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_munger/reviews/{failure_path_graph.ai-review.json → debt_service_cushion.ai-review.json} +49 -49
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_munger/reviews/reported_earnings_cash_gap.ai-review.json +277 -0
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_natenberg/reviews/{surface_builder.ai-review.json → normalised_skew.ai-review.json} +46 -46
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_natenberg/reviews/{greeks_payoff.ai-review.json → round_trip_cost.ai-review.json} +46 -46
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_pabrai/reviews/{downside_floor.ai-review.json → downside_floor_coverage.ai-review.json} +46 -46
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_pabrai/reviews/{discrete_payoff.ai-review.json → market_capitalisation.ai-review.json} +46 -46
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_simons/reviews/{leakage_audit.ai-review.json → absolute_session_move.ai-review.json} +42 -42
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_simons/reviews/{oos_cost_test.ai-review.json → session_move_over_implied.ai-review.json} +46 -46
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_sinclair/reviews/{realized_vol_forecast.ai-review.json → round_trip_cost.ai-review.json} +46 -46
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_sinclair/reviews/{net_edge_sizer.ai-review.json → volatility_per_unit_of_width.ai-review.json} +46 -46
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_soros/reviews/{reflexivity_graph.ai-review.json → credit_cycle_position.ai-review.json} +49 -49
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_soros/reviews/{reversal_monitor.ai-review.json → financing_burden.ai-review.json} +46 -46
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_taleb/reviews/{tail_friction.ai-review.json → debt_service_cushion.ai-review.json} +49 -49
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_taleb/reviews/{payoff_ruin.ai-review.json → normalised_skew.ai-review.json} +46 -46
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_thorp/reviews/{fractional_kelly.ai-review.json → edge_per_unit_of_volatility.ai-review.json} +46 -46
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_thorp/reviews/{edge_recalculator.ai-review.json → net_edge.ai-review.json} +49 -49
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/review-manifest.json +288 -270
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-semantic-adjudications/index.json +2 -2
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-semantic-extractions/index.json +2 -2
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-semantic-skeptic-reviews/index.json +2 -2
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-source-prereviews/index.json +6 -2
- package/knowledge/solo-test/masters/master_ackman/decision_policy.json +122 -11
- package/knowledge/solo-test/masters/master_ackman/doctrine.jsonl +2 -2
- package/knowledge/solo-test/masters/master_ackman/manifest.json +13 -6
- package/knowledge/solo-test/masters/master_ackman/provisional-index.json +3 -3
- package/knowledge/solo-test/masters/master_ackman/sources.jsonl +1 -1
- package/knowledge/solo-test/masters/master_ackman/tools.json +56 -30
- package/knowledge/solo-test/masters/master_aschenbrenner/decision_policy.json +101 -10
- package/knowledge/solo-test/masters/master_aschenbrenner/doctrine.jsonl +2 -2
- package/knowledge/solo-test/masters/master_aschenbrenner/manifest.json +12 -4
- package/knowledge/solo-test/masters/master_aschenbrenner/provisional-index.json +3 -3
- package/knowledge/solo-test/masters/master_aschenbrenner/sources.jsonl +1 -1
- package/knowledge/solo-test/masters/master_aschenbrenner/tools.json +56 -30
- package/knowledge/solo-test/masters/master_asness/decision_policy.json +89 -10
- package/knowledge/solo-test/masters/master_asness/doctrine.jsonl +2 -2
- package/knowledge/solo-test/masters/master_asness/manifest.json +11 -4
- package/knowledge/solo-test/masters/master_asness/provisional-index.json +3 -3
- package/knowledge/solo-test/masters/master_asness/sources.jsonl +1 -1
- package/knowledge/solo-test/masters/master_asness/tools.json +56 -30
- package/knowledge/solo-test/masters/master_bogle/counterfactuals.jsonl +0 -0
- package/knowledge/solo-test/masters/master_bogle/decision_cases.jsonl +0 -0
- package/knowledge/solo-test/masters/master_bogle/decision_policy.json +170 -0
- package/knowledge/solo-test/masters/master_bogle/doctrine.jsonl +14 -0
- package/knowledge/solo-test/masters/master_bogle/evaluation/calibration_cases.jsonl +0 -0
- package/knowledge/solo-test/masters/master_bogle/evaluation/experiments.json +5 -0
- package/knowledge/solo-test/masters/master_bogle/evaluation/golden_cases.jsonl +0 -0
- package/knowledge/solo-test/masters/master_bogle/evaluation/pairwise_cases.jsonl +0 -0
- package/knowledge/solo-test/masters/master_bogle/failures.jsonl +0 -0
- package/knowledge/solo-test/masters/master_bogle/manifest.json +141 -0
- package/knowledge/solo-test/masters/master_bogle/memory_policy.json +5 -0
- package/knowledge/solo-test/masters/master_bogle/provisional-index.json +41 -0
- package/knowledge/solo-test/masters/master_bogle/research_policy.json +11 -0
- package/knowledge/solo-test/masters/master_bogle/sources.jsonl +1 -0
- package/knowledge/solo-test/masters/master_bogle/tools.json +120 -0
- package/knowledge/solo-test/masters/master_bogle/voice.en.md +7 -0
- package/knowledge/solo-test/masters/master_bogle/voice.zh.md +7 -0
- package/knowledge/solo-test/masters/master_buffett/decision_policy.json +102 -11
- package/knowledge/solo-test/masters/master_buffett/doctrine.jsonl +2 -2
- package/knowledge/solo-test/masters/master_buffett/manifest.json +10 -4
- package/knowledge/solo-test/masters/master_buffett/provisional-index.json +3 -3
- package/knowledge/solo-test/masters/master_buffett/sources.jsonl +1 -1
- package/knowledge/solo-test/masters/master_buffett/tools.json +55 -29
- package/knowledge/solo-test/masters/master_burry/decision_policy.json +102 -12
- package/knowledge/solo-test/masters/master_burry/doctrine.jsonl +2 -2
- package/knowledge/solo-test/masters/master_burry/manifest.json +12 -6
- package/knowledge/solo-test/masters/master_burry/provisional-index.json +3 -3
- package/knowledge/solo-test/masters/master_burry/sources.jsonl +1 -1
- package/knowledge/solo-test/masters/master_burry/tools.json +56 -30
- package/knowledge/solo-test/masters/master_cathie_wood/decision_policy.json +74 -12
- package/knowledge/solo-test/masters/master_cathie_wood/doctrine.jsonl +2 -2
- package/knowledge/solo-test/masters/master_cathie_wood/manifest.json +12 -6
- package/knowledge/solo-test/masters/master_cathie_wood/provisional-index.json +3 -3
- package/knowledge/solo-test/masters/master_cathie_wood/sources.jsonl +1 -1
- package/knowledge/solo-test/masters/master_cathie_wood/tools.json +56 -30
- package/knowledge/solo-test/masters/master_dalio/decision_policy.json +123 -16
- package/knowledge/solo-test/masters/master_dalio/doctrine.jsonl +2 -2
- package/knowledge/solo-test/masters/master_dalio/manifest.json +10 -4
- package/knowledge/solo-test/masters/master_dalio/provisional-index.json +3 -3
- package/knowledge/solo-test/masters/master_dalio/sources.jsonl +1 -1
- package/knowledge/solo-test/masters/master_dalio/tools.json +56 -30
- package/knowledge/solo-test/masters/master_damodaran/decision_policy.json +58 -10
- package/knowledge/solo-test/masters/master_damodaran/doctrine.jsonl +2 -2
- package/knowledge/solo-test/masters/master_damodaran/manifest.json +9 -4
- package/knowledge/solo-test/masters/master_damodaran/provisional-index.json +3 -3
- package/knowledge/solo-test/masters/master_damodaran/sources.jsonl +1 -1
- package/knowledge/solo-test/masters/master_damodaran/tools.json +54 -28
- package/knowledge/solo-test/masters/master_druckenmiller/decision_policy.json +89 -10
- package/knowledge/solo-test/masters/master_druckenmiller/doctrine.jsonl +2 -2
- package/knowledge/solo-test/masters/master_druckenmiller/manifest.json +11 -4
- package/knowledge/solo-test/masters/master_druckenmiller/provisional-index.json +3 -3
- package/knowledge/solo-test/masters/master_druckenmiller/sources.jsonl +1 -1
- package/knowledge/solo-test/masters/master_druckenmiller/tools.json +55 -29
- package/knowledge/solo-test/masters/master_duan_yongping/decision_policy.json +138 -13
- package/knowledge/solo-test/masters/master_duan_yongping/doctrine.jsonl +2 -2
- package/knowledge/solo-test/masters/master_duan_yongping/manifest.json +17 -7
- package/knowledge/solo-test/masters/master_duan_yongping/provisional-index.json +3 -3
- package/knowledge/solo-test/masters/master_duan_yongping/sources.jsonl +1 -1
- package/knowledge/solo-test/masters/master_duan_yongping/tools.json +82 -30
- package/knowledge/solo-test/masters/master_fisher/decision_policy.json +102 -11
- package/knowledge/solo-test/masters/master_fisher/doctrine.jsonl +2 -2
- package/knowledge/solo-test/masters/master_fisher/manifest.json +13 -6
- package/knowledge/solo-test/masters/master_fisher/provisional-index.json +3 -3
- package/knowledge/solo-test/masters/master_fisher/sources.jsonl +1 -1
- package/knowledge/solo-test/masters/master_fisher/tools.json +58 -32
- package/knowledge/solo-test/masters/master_forensic_short/decision_policy.json +93 -14
- package/knowledge/solo-test/masters/master_forensic_short/doctrine.jsonl +2 -2
- package/knowledge/solo-test/masters/master_forensic_short/manifest.json +6 -4
- package/knowledge/solo-test/masters/master_forensic_short/provisional-index.json +3 -3
- package/knowledge/solo-test/masters/master_forensic_short/sources.jsonl +1 -1
- package/knowledge/solo-test/masters/master_forensic_short/tools.json +53 -27
- package/knowledge/solo-test/masters/master_graham/decision_policy.json +103 -12
- package/knowledge/solo-test/masters/master_graham/doctrine.jsonl +2 -2
- package/knowledge/solo-test/masters/master_graham/manifest.json +12 -4
- package/knowledge/solo-test/masters/master_graham/provisional-index.json +3 -3
- package/knowledge/solo-test/masters/master_graham/sources.jsonl +1 -1
- package/knowledge/solo-test/masters/master_graham/tools.json +67 -28
- package/knowledge/solo-test/masters/master_jhunjhunwala/decision_policy.json +77 -12
- package/knowledge/solo-test/masters/master_jhunjhunwala/doctrine.jsonl +2 -2
- package/knowledge/solo-test/masters/master_jhunjhunwala/manifest.json +11 -6
- package/knowledge/solo-test/masters/master_jhunjhunwala/provisional-index.json +3 -3
- package/knowledge/solo-test/masters/master_jhunjhunwala/sources.jsonl +1 -1
- package/knowledge/solo-test/masters/master_jhunjhunwala/tools.json +54 -28
- package/knowledge/solo-test/masters/master_klarman/decision_policy.json +105 -14
- package/knowledge/solo-test/masters/master_klarman/doctrine.jsonl +2 -2
- package/knowledge/solo-test/masters/master_klarman/manifest.json +8 -2
- package/knowledge/solo-test/masters/master_klarman/provisional-index.json +3 -3
- package/knowledge/solo-test/masters/master_klarman/sources.jsonl +1 -1
- package/knowledge/solo-test/masters/master_klarman/tools.json +55 -29
- package/knowledge/solo-test/masters/master_li_lu/decision_policy.json +101 -10
- package/knowledge/solo-test/masters/master_li_lu/doctrine.jsonl +2 -2
- package/knowledge/solo-test/masters/master_li_lu/manifest.json +13 -6
- package/knowledge/solo-test/masters/master_li_lu/provisional-index.json +3 -3
- package/knowledge/solo-test/masters/master_li_lu/sources.jsonl +1 -1
- package/knowledge/solo-test/masters/master_li_lu/tools.json +58 -32
- package/knowledge/solo-test/masters/master_lynch/decision_policy.json +127 -16
- package/knowledge/solo-test/masters/master_lynch/doctrine.jsonl +2 -2
- package/knowledge/solo-test/masters/master_lynch/manifest.json +14 -6
- package/knowledge/solo-test/masters/master_lynch/provisional-index.json +3 -3
- package/knowledge/solo-test/masters/master_lynch/sources.jsonl +1 -1
- package/knowledge/solo-test/masters/master_lynch/tools.json +67 -28
- package/knowledge/solo-test/masters/master_marks/decision_policy.json +71 -9
- package/knowledge/solo-test/masters/master_marks/doctrine.jsonl +2 -2
- package/knowledge/solo-test/masters/master_marks/manifest.json +11 -6
- package/knowledge/solo-test/masters/master_marks/provisional-index.json +3 -3
- package/knowledge/solo-test/masters/master_marks/sources.jsonl +1 -1
- package/knowledge/solo-test/masters/master_marks/tools.json +54 -28
- package/knowledge/solo-test/masters/master_munger/decision_policy.json +141 -16
- package/knowledge/solo-test/masters/master_munger/doctrine.jsonl +2 -2
- package/knowledge/solo-test/masters/master_munger/manifest.json +10 -6
- package/knowledge/solo-test/masters/master_munger/provisional-index.json +3 -3
- package/knowledge/solo-test/masters/master_munger/sources.jsonl +1 -1
- package/knowledge/solo-test/masters/master_munger/tools.json +52 -26
- package/knowledge/solo-test/masters/master_natenberg/decision_policy.json +59 -11
- package/knowledge/solo-test/masters/master_natenberg/doctrine.jsonl +2 -2
- package/knowledge/solo-test/masters/master_natenberg/manifest.json +9 -6
- package/knowledge/solo-test/masters/master_natenberg/provisional-index.json +3 -3
- package/knowledge/solo-test/masters/master_natenberg/sources.jsonl +1 -1
- package/knowledge/solo-test/masters/master_natenberg/tools.json +50 -24
- package/knowledge/solo-test/masters/master_pabrai/decision_policy.json +125 -14
- package/knowledge/solo-test/masters/master_pabrai/doctrine.jsonl +2 -2
- package/knowledge/solo-test/masters/master_pabrai/manifest.json +8 -2
- package/knowledge/solo-test/masters/master_pabrai/provisional-index.json +3 -3
- package/knowledge/solo-test/masters/master_pabrai/sources.jsonl +1 -1
- package/knowledge/solo-test/masters/master_pabrai/tools.json +55 -29
- package/knowledge/solo-test/masters/master_simons/decision_policy.json +59 -11
- package/knowledge/solo-test/masters/master_simons/doctrine.jsonl +2 -2
- package/knowledge/solo-test/masters/master_simons/manifest.json +8 -4
- package/knowledge/solo-test/masters/master_simons/provisional-index.json +3 -3
- package/knowledge/solo-test/masters/master_simons/sources.jsonl +1 -1
- package/knowledge/solo-test/masters/master_simons/tools.json +43 -30
- package/knowledge/solo-test/masters/master_sinclair/decision_policy.json +59 -11
- package/knowledge/solo-test/masters/master_sinclair/doctrine.jsonl +2 -2
- package/knowledge/solo-test/masters/master_sinclair/manifest.json +8 -6
- package/knowledge/solo-test/masters/master_sinclair/provisional-index.json +3 -3
- package/knowledge/solo-test/masters/master_sinclair/sources.jsonl +1 -1
- package/knowledge/solo-test/masters/master_sinclair/tools.json +54 -28
- package/knowledge/solo-test/masters/master_soros/decision_policy.json +98 -10
- package/knowledge/solo-test/masters/master_soros/doctrine.jsonl +2 -2
- package/knowledge/solo-test/masters/master_soros/manifest.json +10 -7
- package/knowledge/solo-test/masters/master_soros/provisional-index.json +3 -3
- package/knowledge/solo-test/masters/master_soros/sources.jsonl +1 -1
- package/knowledge/solo-test/masters/master_soros/tools.json +54 -28
- package/knowledge/solo-test/masters/master_taleb/decision_policy.json +124 -13
- package/knowledge/solo-test/masters/master_taleb/doctrine.jsonl +2 -2
- package/knowledge/solo-test/masters/master_taleb/manifest.json +9 -5
- package/knowledge/solo-test/masters/master_taleb/provisional-index.json +3 -3
- package/knowledge/solo-test/masters/master_taleb/sources.jsonl +1 -1
- package/knowledge/solo-test/masters/master_taleb/tools.json +50 -24
- package/knowledge/solo-test/masters/master_thorp/decision_policy.json +61 -13
- package/knowledge/solo-test/masters/master_thorp/doctrine.jsonl +2 -2
- package/knowledge/solo-test/masters/master_thorp/manifest.json +11 -6
- package/knowledge/solo-test/masters/master_thorp/provisional-index.json +3 -3
- package/knowledge/solo-test/masters/master_thorp/sources.jsonl +1 -1
- package/knowledge/solo-test/masters/master_thorp/tools.json +56 -30
- package/knowledge/solo-test/persona-v3-solo-test-formulas/compilation-manifest.json +290 -264
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_ackman/components/tools.json +58 -32
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_ackman/provisional-derivations/market_capitalisation.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_ackman/provisional-derivations/owner_earnings_yield.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_aschenbrenner/components/tools.json +58 -32
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_aschenbrenner/provisional-derivations/market_capitalisation.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_aschenbrenner/provisional-derivations/price_implied_cash_yield.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_asness/components/tools.json +58 -32
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_asness/provisional-derivations/nominal_earnings_yield_gap.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_asness/provisional-derivations/real_earnings_yield_gap.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_bogle/components/tools.json +120 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_bogle/provisional-derivations/expected_return_over_long_bond.derived-proxy-evidence.json +77 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_bogle/provisional-derivations/fundamental_expected_return.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_buffett/components/tools.json +57 -31
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_buffett/provisional-derivations/market_capitalisation.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_buffett/provisional-derivations/owner_earnings_yield.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_burry/components/tools.json +58 -32
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_burry/provisional-derivations/net_current_asset_surplus_per_share.derived-proxy-evidence.json +77 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_burry/provisional-derivations/net_current_asset_value_per_share.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_cathie_wood/components/tools.json +58 -32
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_cathie_wood/provisional-derivations/current_cash_yield.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_cathie_wood/provisional-derivations/market_capitalisation.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_dalio/components/tools.json +58 -32
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_dalio/provisional-derivations/policy_real_rate.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_dalio/provisional-derivations/real_curve_slope.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_damodaran/components/tools.json +56 -30
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_damodaran/provisional-derivations/implied_equity_risk_premium.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_damodaran/provisional-derivations/{reverse_valuation.derived-proxy-evidence.json → premium_versus_long_run_average.derived-proxy-evidence.json} +29 -16
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_druckenmiller/components/tools.json +57 -31
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_druckenmiller/provisional-derivations/liquidity_curve_impulse.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_druckenmiller/provisional-derivations/policy_real_rate.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_duan_yongping/components/tools.json +84 -32
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_duan_yongping/provisional-derivations/five_year_opportunity_cost.derived-proxy-evidence.json +102 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_duan_yongping/provisional-derivations/margin_retention.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_fisher/components/tools.json +60 -34
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_fisher/provisional-derivations/margin_retention.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_fisher/provisional-derivations/reinvestment_spread.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_forensic_short/components/tools.json +55 -29
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_forensic_short/provisional-derivations/{accounting_rebuilder.derived-proxy-evidence.json → cash_conversion_gap.derived-proxy-evidence.json} +28 -15
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_forensic_short/provisional-derivations/cash_cover_of_leverage.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_graham/components/tools.json +69 -30
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_graham/provisional-derivations/defensive_hurdle_base.derived-proxy-evidence.json +89 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_graham/provisional-derivations/half_normalised_earnings_yield.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_jhunjhunwala/components/tools.json +56 -30
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_jhunjhunwala/provisional-derivations/cash_quality_gap.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_jhunjhunwala/provisional-derivations/real_structural_growth.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_klarman/components/tools.json +57 -31
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_klarman/provisional-derivations/downside_asset_coverage.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_klarman/provisional-derivations/market_capitalisation.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_li_lu/components/tools.json +60 -34
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_li_lu/provisional-derivations/cash_backed_decade_return.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_li_lu/provisional-derivations/decade_return_over_long_bond.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_lynch/components/tools.json +69 -30
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_lynch/provisional-derivations/growth_justified_capitalisation.derived-proxy-evidence.json +89 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_lynch/provisional-derivations/market_capitalisation.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_marks/components/tools.json +56 -30
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_marks/provisional-derivations/credit_cycle_position.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_marks/provisional-derivations/equity_over_corporate_debt.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_munger/components/tools.json +54 -28
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_munger/provisional-derivations/debt_service_cushion.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_munger/provisional-derivations/reported_earnings_cash_gap.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_natenberg/components/tools.json +52 -26
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_natenberg/provisional-derivations/{surface_builder.derived-proxy-evidence.json → normalised_skew.derived-proxy-evidence.json} +27 -14
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_natenberg/provisional-derivations/round_trip_cost.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_pabrai/components/tools.json +57 -31
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_pabrai/provisional-derivations/downside_floor_coverage.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_pabrai/provisional-derivations/market_capitalisation.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_simons/components/tools.json +45 -32
- package/knowledge/solo-test/persona-v3-solo-test-formulas/{master_natenberg/provisional-derivations/greeks_payoff.derived-proxy-evidence.json → master_simons/provisional-derivations/absolute_session_move.derived-proxy-evidence.json} +17 -17
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_simons/provisional-derivations/session_move_over_implied.derived-proxy-evidence.json +77 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_sinclair/components/tools.json +56 -30
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_sinclair/provisional-derivations/round_trip_cost.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_sinclair/provisional-derivations/volatility_per_unit_of_width.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_soros/components/tools.json +56 -30
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_soros/provisional-derivations/credit_cycle_position.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_soros/provisional-derivations/financing_burden.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_taleb/components/tools.json +52 -26
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_taleb/provisional-derivations/debt_service_cushion.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_taleb/provisional-derivations/{tail_friction.derived-proxy-evidence.json → normalised_skew.derived-proxy-evidence.json} +27 -14
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_thorp/components/tools.json +58 -32
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_thorp/provisional-derivations/edge_per_unit_of_volatility.derived-proxy-evidence.json +77 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_thorp/provisional-derivations/net_edge.derived-proxy-evidence.json +76 -0
- package/mcp/lib/breadth.mjs +126 -0
- package/mcp/lib/constants.mjs +15 -0
- package/mcp/lib/damodaran.mjs +119 -0
- package/mcp/lib/fred.mjs +246 -0
- package/mcp/lib/fund-holdings-parsers.mjs +297 -0
- package/mcp/lib/fund-observations.mjs +152 -0
- package/mcp/lib/fundamentals.mjs +806 -0
- package/mcp/lib/funds.mjs +785 -0
- package/mcp/lib/gates.mjs +71 -4
- package/mcp/lib/grounding.mjs +209 -36
- package/mcp/lib/index-aggregate.mjs +733 -0
- package/mcp/lib/insider-ownership.mjs +149 -0
- package/mcp/lib/instrument-facts.mjs +855 -0
- package/mcp/lib/instruments.mjs +216 -0
- package/mcp/lib/markdown.mjs +216 -43
- package/mcp/lib/master-catalog.mjs +4 -0
- package/mcp/lib/orchestrator.mjs +173 -29
- package/mcp/lib/packets.mjs +59 -6
- package/mcp/lib/personas/engine.mjs +23 -10
- package/mcp/lib/personas-v3/deterministic-executor.mjs +13 -2
- package/mcp/lib/personas-v3/ga-external-evidence.mjs +3 -2
- package/mcp/lib/personas-v3/ga-gate.mjs +2 -1
- package/mcp/lib/personas-v3/ga-package-evidence.mjs +5 -4
- package/mcp/lib/personas-v3/grounding-adapter.mjs +309 -2
- package/mcp/lib/personas-v3/production-root.mjs +5 -4
- package/mcp/lib/personas-v3/release-formula-evidence.mjs +14 -7
- package/mcp/lib/personas-v3/release-source-evidence.mjs +2 -1
- package/mcp/lib/personas-v3/releases.mjs +5 -4
- package/mcp/lib/personas-v3/runtime-release-integrity.mjs +6 -5
- package/mcp/lib/personas-v3/semantic-source-adjudication.mjs +2 -1
- package/mcp/lib/personas-v3/semantic-source-extraction.mjs +2 -1
- package/mcp/lib/personas-v3/semantic-source-skeptic-review.mjs +2 -1
- package/mcp/lib/personas-v3/source-review-operations.mjs +3 -2
- package/mcp/lib/personas-v3/staging.mjs +22 -3
- package/mcp/lib/prompts.mjs +87 -3
- package/mcp/lib/quotes.mjs +5 -0
- package/mcp/lib/rpc.mjs +27 -10
- package/mcp/lib/run-store.mjs +5 -3
- package/mcp/lib/sec.mjs +32 -0
- package/mcp/lib/tables.mjs +11 -0
- package/mcp/lib/voice.mjs +122 -0
- package/mcp/lib/xbrl-aggregates.mjs +153 -0
- package/mcp/lib/xbrl-series.mjs +341 -0
- package/mcp/lib/xlsx.mjs +155 -0
- package/package.json +5 -5
- package/personas/masters/masters-value/bogle.md +145 -0
- package/schemas/council-evaluation-protocol-v1.schema.json +2 -2
- package/schemas/persona-v3-ai-assisted-solo-profile-v1.schema.json +2 -2
- package/schemas/persona-v3-ai-machine-simulation-v1.schema.json +1 -1
- package/schemas/persona-v3-build-spec-v1.schema.json +3 -3
- package/schemas/persona-v3-release-formula-review-evidence-v1.schema.json +3 -3
- package/schemas/persona-v3-release-manifest-v1.schema.json +6 -6
- package/schemas/persona-v3-release-source-review-evidence-v1.schema.json +3 -3
- package/schemas/persona-v3-tool-graph-v1.schema.json +1 -1
- package/schemas/source-review-batch-v1.schema.json +9 -9
- package/scripts/assemble-persona-v3-release.mjs +3 -2
- package/scripts/build-persona-v3-solo-test-packs.mjs +6 -8
- package/scripts/check-persona-v3-ga.mjs +1 -1
- package/scripts/check-persona-v3-production-candidates.mjs +1 -1
- package/scripts/compile-persona-v3-formulas.mjs +19 -18
- package/scripts/doctor.mjs +11 -9
- package/scripts/export-persona-source-review-batch.mjs +1 -1
- package/scripts/generate-persona-v3-drafts.mjs +2 -2
- package/scripts/lib/build-profile.mjs +24 -0
- package/scripts/lib/council-evaluation-protocol.mjs +7 -6
- package/scripts/lib/host-capabilities.mjs +2 -1
- package/scripts/lib/packaged-host-parity.mjs +9 -3
- package/scripts/lib/persona-v3-ai-assisted-solo-status.mjs +6 -4
- package/scripts/lib/persona-v3-ai-formula-review.mjs +6 -5
- package/scripts/lib/persona-v3-ai-machine-simulations.mjs +32 -4
- package/scripts/lib/persona-v3-build-specs.mjs +3 -2
- package/scripts/lib/persona-v3-draft-packs.mjs +2 -2
- package/scripts/lib/persona-v3-formula-pipeline.mjs +11 -10
- package/scripts/lib/persona-v3-production-candidates.mjs +10 -9
- package/scripts/lib/persona-v3-solo-formula-pipeline.mjs +188 -16
- package/scripts/lib/persona-v3-solo-test-packs.mjs +112 -11
- package/scripts/package-smoke.mjs +2 -1
- package/scripts/report-persona-corpus-gaps.mjs +4 -1
- package/scripts/review-persona-v3-solo-formulas.mjs +12 -8
- package/scripts/scaffold-persona-v3-staging.mjs +1 -1
- package/skills/agent-skills-governance/SKILL.md +8 -2
- package/skills/alphacouncil-agent/SKILL.md +12 -4
- package/skills/public-equity-investing/SKILL.md +17 -0
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_forensic_short/reviews/borrow_catalyst.ai-review.json +0 -277
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_ackman/provisional-derivations/change_value_bridge.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_ackman/provisional-derivations/power_map.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_aschenbrenner/provisional-derivations/compute_power_bridge.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_aschenbrenner/provisional-derivations/timeline_reverse_valuation.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_asness/provisional-derivations/crowding_cost_stress.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_asness/provisional-derivations/factor_decomposer.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_buffett/provisional-derivations/incremental_returns.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_buffett/provisional-derivations/owner_earnings_rebuilder.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_burry/provisional-derivations/capital_structure_reader.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_burry/provisional-derivations/mispricing_carry.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_cathie_wood/provisional-derivations/capture_valuation_bridge.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_cathie_wood/provisional-derivations/cost_adoption_curve.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_dalio/provisional-derivations/debt_driver_stress.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_dalio/provisional-derivations/regime_classifier.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_damodaran/provisional-derivations/story_dcf.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_druckenmiller/provisional-derivations/inflection_payoff.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_druckenmiller/provisional-derivations/liquidity_revision_map.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_duan_yongping/provisional-derivations/opportunity_cost.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_duan_yongping/provisional-derivations/user_value_evidence.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_fisher/provisional-derivations/research_productivity.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_fisher/provisional-derivations/scuttlebutt_graph.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_forensic_short/provisional-derivations/borrow_catalyst.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_graham/provisional-derivations/asset_floor.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_graham/provisional-derivations/normalized_earnings.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_jhunjhunwala/provisional-derivations/penetration_liquidity.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_jhunjhunwala/provisional-derivations/promoter_governance.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_klarman/provisional-derivations/cash_catalyst_compare.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_klarman/provisional-derivations/recovery_waterfall.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_li_lu/provisional-derivations/promise_integrity_ledger.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_li_lu/provisional-derivations/ten_year_return_bridge.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_lynch/provisional-derivations/category_classifier.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_lynch/provisional-derivations/story_numbers_check.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_marks/provisional-derivations/cycle_temperature.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_marks/provisional-derivations/implied_expectations.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_munger/provisional-derivations/failure_path_graph.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_munger/provisional-derivations/incentive_map.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_pabrai/provisional-derivations/discrete_payoff.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_pabrai/provisional-derivations/downside_floor.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_simons/provisional-derivations/leakage_audit.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_simons/provisional-derivations/oos_cost_test.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_sinclair/provisional-derivations/net_edge_sizer.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_sinclair/provisional-derivations/realized_vol_forecast.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_soros/provisional-derivations/reflexivity_graph.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_soros/provisional-derivations/reversal_monitor.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_taleb/provisional-derivations/payoff_ruin.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_thorp/provisional-derivations/edge_recalculator.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_thorp/provisional-derivations/fractional_kelly.derived-proxy-evidence.json +0 -64
|
@@ -0,0 +1,808 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authored method logic, keyed by persona id.
|
|
3
|
+
*
|
|
4
|
+
* A seat listed here gets its real formulas and its real decision policy. A seat absent from
|
|
5
|
+
* this file keeps the mechanical identity proxy, which is executable and deliberately says
|
|
6
|
+
* nothing -- so this file can be filled in one seat at a time without the build ever being in
|
|
7
|
+
* a half-written state.
|
|
8
|
+
*
|
|
9
|
+
* Everything here is AI-authored and unreviewed. It is barred from production admission by
|
|
10
|
+
* the same gates that bar the proxies; what changes is only that the arithmetic is now the
|
|
11
|
+
* method's own rather than a placeholder. Each seat names its published source in
|
|
12
|
+
* `provenance`, and every veto and scoring rule says in `rationale` what the person actually
|
|
13
|
+
* claimed. Where a published method gives a direction but no number, the rationale says so and
|
|
14
|
+
* labels the cut-off as this project's reading rather than the author's.
|
|
15
|
+
*
|
|
16
|
+
* ---------------------------------------------------------------------------------------
|
|
17
|
+
* Contract notes for the pipeline that consumes this file
|
|
18
|
+
* ---------------------------------------------------------------------------------------
|
|
19
|
+
*
|
|
20
|
+
* 1. `native_state` values are the RAW state names from each seat's
|
|
21
|
+
* `native_decision_contract.states`. They are mapped through `executableNativeState()`,
|
|
22
|
+
* which adds the `provisional_` prefix. Do not pre-prefix them here or they double-prefix
|
|
23
|
+
* and stop matching the declared state set.
|
|
24
|
+
*
|
|
25
|
+
* 2. `eligibility.all[]` entries carry the executor's own record shape
|
|
26
|
+
* (`condition_id` / `condition` / `on_false` / `on_uncomputable`) but omit `source_ids`,
|
|
27
|
+
* because the source id is minted at build time. The pipeline must inject `source_ids` the
|
|
28
|
+
* way it already does for hard vetoes and scoring rules, and must map the two mapping
|
|
29
|
+
* states through `executableNativeState()`.
|
|
30
|
+
*
|
|
31
|
+
* 3. `purpose` on tools and `rationale` on vetoes and rules are authoring metadata. The
|
|
32
|
+
* executor rejects unknown fields, so neither may be copied into the physical policy or
|
|
33
|
+
* tool records.
|
|
34
|
+
*
|
|
35
|
+
* 4. Chained tools: a tool that consumes another tool's `output_id` must take the PRODUCER's
|
|
36
|
+
* `value_kind` and `unit` as its input contract, not its own. Buffett and Graham both
|
|
37
|
+
* divide a monetary numerator by a monetary market capitalisation to produce a ratio, so a
|
|
38
|
+
* consumer-derived input contract fails `does not match producer ... output contract`.
|
|
39
|
+
*
|
|
40
|
+
* 5. Shared `output_id`s across seats are deliberate and denote the same number built the same
|
|
41
|
+
* way:
|
|
42
|
+
* valuation.market_capitalisation Buffett, Graham price x share count
|
|
43
|
+
* macro.policy_real_rate Dalio, Druckenmiller 2y yield - 5y breakeven
|
|
44
|
+
* index.implied_equity_risk_premium Damodaran, Asness index E/P - 10y Treasury
|
|
45
|
+
*
|
|
46
|
+
* 6. `master_bogle` has no build-spec entry yet. Its proposed native decision contract is
|
|
47
|
+
* carried on the seat as `proposed_native_decision_contract` so it can be lifted verbatim.
|
|
48
|
+
*/
|
|
49
|
+
export const coreSeats = Object.freeze({
|
|
50
|
+
master_buffett: {
|
|
51
|
+
provenance:
|
|
52
|
+
"Warren Buffett, \"Mr. Buffett on the Stock Market\", Fortune, 22 November 1999, which argues equity value against the long bond yield; the owner-earnings definition in the appendix to the 1986 annual report; the 1987 chairman's letter endorsing Fortune's 1988 Investor's Guide study, in which only 25 of the 1,000 largest companies averaged over 20% return on equity across 1977-1986 with no single year below 15%; and the 1984 letter on repurchases. The leverage cut-off is this project's conservative reading of his stated refusal to depend on borrowed money, not a ratio he published.",
|
|
53
|
+
tools: [
|
|
54
|
+
{
|
|
55
|
+
tool_id: "master_buffett.market_capitalisation",
|
|
56
|
+
operation: "multiply",
|
|
57
|
+
inputs: [{ fact_id: "market.price" }, { fact_id: "capital_allocation.share_count" }],
|
|
58
|
+
output_id: "valuation.market_capitalisation",
|
|
59
|
+
value_kind: "monetary",
|
|
60
|
+
unit: "currency_units",
|
|
61
|
+
purpose:
|
|
62
|
+
"Owner earnings are an absolute currency amount and mean nothing until they are set against what the whole business costs. Price times share count is that denominator.",
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
tool_id: "master_buffett.owner_earnings_yield",
|
|
66
|
+
operation: "divide",
|
|
67
|
+
inputs: [{ fact_id: "financial.owner_earnings" }, { output_id: "valuation.market_capitalisation" }],
|
|
68
|
+
output_id: "valuation.owner_earnings_yield",
|
|
69
|
+
value_kind: "ratio",
|
|
70
|
+
unit: "decimal",
|
|
71
|
+
purpose:
|
|
72
|
+
"The rate an owner earns on the purchase price, which is the only figure the 1999 Fortune argument can set against a bond.",
|
|
73
|
+
},
|
|
74
|
+
],
|
|
75
|
+
eligibility: {
|
|
76
|
+
all: [
|
|
77
|
+
// Buffett's competence boundary. If you cannot say what incremental capital earns inside
|
|
78
|
+
// the business you cannot state its economics, and it belongs in the "too hard" pile.
|
|
79
|
+
{
|
|
80
|
+
condition_id: "master_buffett.incremental_returns_measurable",
|
|
81
|
+
condition: { op: "exists", value: { fact_id: "financial.incremental_return_on_capital" } },
|
|
82
|
+
on_false: { native_state: "too_hard", common_stance: "out_of_scope" },
|
|
83
|
+
on_uncomputable: { native_state: "too_hard", common_stance: "out_of_scope" },
|
|
84
|
+
},
|
|
85
|
+
],
|
|
86
|
+
},
|
|
87
|
+
hard_vetoes: [
|
|
88
|
+
{
|
|
89
|
+
veto_id: "master_buffett.leverage_dependency",
|
|
90
|
+
rationale:
|
|
91
|
+
"Buffett rejects returns that rest on borrowed money rather than operating economics. The 1987 letter notes that the economic superstars it describes carried little debt, and the 2010 letter states Berkshire will never be dependent on the kindness of strangers. Debt above three times equity is this project's conservative reading of that refusal; Buffett published no ratio.",
|
|
92
|
+
condition: { op: "gt", left: { fact_id: "financial.leverage" }, right: { literal: 3 } },
|
|
93
|
+
on_trigger: { common_stance: "opposed", native_state: "reject" },
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
veto_id: "master_buffett.owner_earnings_unreliable",
|
|
97
|
+
rationale:
|
|
98
|
+
"The 1986 owner-earnings appendix defines the figure as reported earnings plus non-cash charges less the maintenance investment the business actually requires. A business that does not throw off positive owner earnings has nothing an owner can take out, so no purchase price is defensible.",
|
|
99
|
+
condition: { op: "lte", left: { fact_id: "financial.owner_earnings" }, right: { literal: 0 } },
|
|
100
|
+
on_trigger: { common_stance: "opposed", native_state: "reject" },
|
|
101
|
+
},
|
|
102
|
+
],
|
|
103
|
+
scoring: [
|
|
104
|
+
{
|
|
105
|
+
rule_id: "buffett_owner_yield_beats_long_bond",
|
|
106
|
+
points: 1,
|
|
107
|
+
coverage_weight: 1,
|
|
108
|
+
rationale:
|
|
109
|
+
"The whole argument of the 1999 Fortune article: what an equity is worth is governed by interest rates, so the rate an owner earns on the purchase price must beat what the long government bond pays for no business risk at all.",
|
|
110
|
+
condition: { op: "gt", left: { output_id: "valuation.owner_earnings_yield" }, right: { fact_id: "macro.long_bond_yield" } },
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
rule_id: "buffett_decade_return_on_equity",
|
|
114
|
+
points: 1,
|
|
115
|
+
coverage_weight: 1,
|
|
116
|
+
rationale:
|
|
117
|
+
"The 1987 letter endorsed Fortune's test of economic excellence: an average return on equity above 20% across the decade 1977-1986. Only 25 of 1,000 companies passed, which is the point - the bar is meant to exclude almost everything.",
|
|
118
|
+
condition: { op: "gt", left: { fact_id: "financial.return_on_equity_10y" }, right: { literal: 0.2 } },
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
rule_id: "buffett_share_count_not_diluted",
|
|
122
|
+
points: 1,
|
|
123
|
+
coverage_weight: 1,
|
|
124
|
+
rationale:
|
|
125
|
+
"The 1984 letter on repurchases and the 2011 letter both argue that management serves continuing shareholders by shrinking the share count below intrinsic value and injures them by issuing shares cheaply. A share count that has not grown over five years is the observable form of that test.",
|
|
126
|
+
condition: { op: "lte", left: { fact_id: "capital_allocation.share_count_change_5y" }, right: { literal: 0 } },
|
|
127
|
+
},
|
|
128
|
+
],
|
|
129
|
+
bands: [
|
|
130
|
+
{ min_ratio: 0, common_stance: "opposed", native_state: "reject" },
|
|
131
|
+
{ min_ratio: 0.5, common_stance: "cautious", native_state: "watch" },
|
|
132
|
+
{ min_ratio: 1, common_stance: "constructive", native_state: "own_at_price" },
|
|
133
|
+
],
|
|
134
|
+
},
|
|
135
|
+
|
|
136
|
+
master_graham: {
|
|
137
|
+
provenance:
|
|
138
|
+
"Benjamin Graham, The Intelligent Investor, revised edition 1973: chapter 14's defensive criterion that price should not exceed fifteen times average earnings; chapter 11's minimum fixed-charge coverage of five times before income taxes for industrial issues; chapter 15 and Security Analysis on buying below two-thirds of net current asset value; and the simplified criterion he repeated in his later writing and interviews that the earnings yield should be at least twice the high-grade corporate bond yield. A five-year average free cash flow stands in for Graham's multi-year average earnings, because this pack carries no averaged reported-earnings fact.",
|
|
139
|
+
tools: [
|
|
140
|
+
{
|
|
141
|
+
tool_id: "master_graham.defensive_hurdle_base",
|
|
142
|
+
operation: "multiply",
|
|
143
|
+
// Market capitalisation times the five years the cash-flow series covers, times the
|
|
144
|
+
// two that his criterion demands. Both multipliers are folded in here because the
|
|
145
|
+
// condition layer cannot do arithmetic, and because financial.free_cash_flow_5y is a
|
|
146
|
+
// five-year CUMULATIVE total (screen.mjs) -- dividing it by a single year's market
|
|
147
|
+
// capitalisation would overstate the yield fivefold.
|
|
148
|
+
inputs: [
|
|
149
|
+
{ fact_id: "market.price" },
|
|
150
|
+
{ fact_id: "capital_allocation.share_count" },
|
|
151
|
+
{ literal: 10 },
|
|
152
|
+
],
|
|
153
|
+
output_id: "valuation.graham_hurdle_base",
|
|
154
|
+
value_kind: "monetary",
|
|
155
|
+
unit: "currency_units",
|
|
156
|
+
purpose: "Five years of market capitalisation at twice the defensive hurdle.",
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
tool_id: "master_graham.half_normalised_earnings_yield",
|
|
160
|
+
operation: "divide",
|
|
161
|
+
// Half the annualised earnings yield, so that comparing it against the Aaa yield IS
|
|
162
|
+
// his "earnings yield at least twice the high-grade bond yield" -- exactly, with no
|
|
163
|
+
// arithmetic left for a condition that cannot perform it.
|
|
164
|
+
inputs: [
|
|
165
|
+
{ fact_id: "financial.free_cash_flow_5y" },
|
|
166
|
+
{ output_id: "valuation.graham_hurdle_base" },
|
|
167
|
+
],
|
|
168
|
+
output_id: "valuation.graham_half_earnings_yield",
|
|
169
|
+
value_kind: "ratio",
|
|
170
|
+
unit: "decimal",
|
|
171
|
+
purpose: "Half the annualised normalised earnings yield.",
|
|
172
|
+
},
|
|
173
|
+
],
|
|
174
|
+
eligibility: {
|
|
175
|
+
all: [
|
|
176
|
+
// Graham ranks the common stock behind every prior claim. Without a leverage figure the
|
|
177
|
+
// equity's position in the capital structure is unknown, so there is no floor to measure.
|
|
178
|
+
{
|
|
179
|
+
condition_id: "master_graham.balance_sheet_claims_resolvable",
|
|
180
|
+
condition: { op: "exists", value: { fact_id: "financial.leverage" } },
|
|
181
|
+
on_false: { native_state: "insufficient_floor", common_stance: "out_of_scope" },
|
|
182
|
+
on_uncomputable: { native_state: "insufficient_floor", common_stance: "out_of_scope" },
|
|
183
|
+
},
|
|
184
|
+
],
|
|
185
|
+
},
|
|
186
|
+
hard_vetoes: [
|
|
187
|
+
{
|
|
188
|
+
veto_id: "master_graham.no_asset_floor",
|
|
189
|
+
rationale:
|
|
190
|
+
"Graham's floor is what the owners would have left once the current liabilities are paid. When net current assets are zero or negative there is no asset floor at all, and the defensive method has nothing to say about the security at any price (The Intelligent Investor ch. 15; Security Analysis on net current asset value).",
|
|
191
|
+
condition: { op: "lte", left: { fact_id: "financial.net_current_asset_value" }, right: { literal: 0 } },
|
|
192
|
+
on_trigger: { common_stance: "out_of_scope", native_state: "insufficient_floor" },
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
veto_id: "master_graham.fixed_charge_coverage_failure",
|
|
196
|
+
rationale:
|
|
197
|
+
"The Intelligent Investor ch. 11 sets the minimum acceptable fixed-charge coverage for an industrial issue at five times before income taxes on a seven-year average. The common stock stands behind those same fixed charges, so an equity that fails the bondholder's financial-strength test cannot carry a margin of safety.",
|
|
198
|
+
condition: { op: "lt", left: { fact_id: "financial.interest_coverage" }, right: { literal: 5 } },
|
|
199
|
+
on_trigger: { common_stance: "opposed", native_state: "reject" },
|
|
200
|
+
},
|
|
201
|
+
],
|
|
202
|
+
scoring: [
|
|
203
|
+
{
|
|
204
|
+
rule_id: "graham_earnings_yield_twice_aaa",
|
|
205
|
+
points: 1,
|
|
206
|
+
coverage_weight: 1,
|
|
207
|
+
rationale:
|
|
208
|
+
"Graham's simplified criterion: an equity is only worth owning when its earnings yield is at least twice the yield on high-grade corporate bonds, because that gap is what pays for taking equity risk instead of lending.",
|
|
209
|
+
condition: { op: "gte", left: { output_id: "valuation.graham_half_earnings_yield" }, right: { fact_id: "macro.aaa_corporate_yield" } },
|
|
210
|
+
},
|
|
211
|
+
{
|
|
212
|
+
rule_id: "graham_defensive_price_to_earnings",
|
|
213
|
+
points: 1,
|
|
214
|
+
coverage_weight: 1,
|
|
215
|
+
rationale:
|
|
216
|
+
"The Intelligent Investor ch. 14 defensive criterion: current price should not be more than fifteen times average earnings. Fifteen times is an earnings yield of one fifteenth; measured on the half-yield the tool emits, that is 0.03335.",
|
|
217
|
+
condition: { op: "gte", left: { output_id: "valuation.graham_half_earnings_yield" }, right: { literal: 0.03335 } },
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
rule_id: "graham_working_capital_floor",
|
|
221
|
+
points: 1,
|
|
222
|
+
coverage_weight: 1,
|
|
223
|
+
rationale:
|
|
224
|
+
"The separate asset floor Graham describes in ch. 15 and in Security Analysis. Compressed to its precondition -- working capital exceeding all liabilities at all -- because the two-tool budget is spent on the earnings criterion, and the two-thirds-of-NCAV price test needs a third tool to divide by market capitalisation. This project's reading; the published test is stricter.",
|
|
225
|
+
condition: { op: "gt", left: { fact_id: "financial.net_current_asset_value" }, right: { literal: 0 } },
|
|
226
|
+
},
|
|
227
|
+
],
|
|
228
|
+
bands: [
|
|
229
|
+
{ min_ratio: 0, common_stance: "opposed", native_state: "reject" },
|
|
230
|
+
{ min_ratio: 0.5, common_stance: "cautious", native_state: "watch" },
|
|
231
|
+
{ min_ratio: 1, common_stance: "constructive", native_state: "margin_of_safety" },
|
|
232
|
+
],
|
|
233
|
+
},
|
|
234
|
+
|
|
235
|
+
master_bogle: {
|
|
236
|
+
provenance:
|
|
237
|
+
"John C. Bogle, \"The Occam's Razor Approach to Estimating Stock Market Returns\" (Journal of Portfolio Management, 1991) and Common Sense on Mutual Funds (1999) ch. 2: the expected stock return is the initial dividend yield plus subsequent earnings growth plus or minus the change in the price-earnings multiple, with a long-run mean multiple of about fifteen times. The Little Book of Common Sense Investing (2007) supplies the cost-matters hypothesis and the insistence on owning the entire market rather than a narrow slice of it. The top-ten-weight line is this project's reading of that instruction, not a number Bogle published. This seat has no build-spec entry yet; the proposed contract below follows the naming pattern of the other twenty-six seats and is intended to be lifted verbatim.",
|
|
238
|
+
proposed_native_decision_contract: {
|
|
239
|
+
schema_id: "expected_market_return_v1",
|
|
240
|
+
eligibility_facts: ["basket dividend yield", "basket earnings growth", "long bond yield", "holdings concentration"],
|
|
241
|
+
states: ["insufficient_return_inputs", "overpriced_market", "fair_expected_return", "low_cost_index_candidate"],
|
|
242
|
+
required_outputs: ["fundamental expected return", "expected return over the long bond", "valuation component", "breadth of the holding"],
|
|
243
|
+
fail_closed_reasons: ["no basket-level yield", "no earnings growth input", "no holdings breakdown"],
|
|
244
|
+
},
|
|
245
|
+
tools: [
|
|
246
|
+
{
|
|
247
|
+
tool_id: "master_bogle.fundamental_expected_return",
|
|
248
|
+
operation: "add",
|
|
249
|
+
inputs: [{ fact_id: "index.dividend_yield" }, { fact_id: "valuation.revenue_growth" }],
|
|
250
|
+
output_id: "index.fundamental_expected_return",
|
|
251
|
+
value_kind: "ratio",
|
|
252
|
+
unit: "decimal",
|
|
253
|
+
purpose:
|
|
254
|
+
"Bogle's investment return: the initial dividend yield plus the growth of the underlying businesses. Revenue growth stands in for earnings growth on his own argument that earnings cannot outrun sales for long.",
|
|
255
|
+
},
|
|
256
|
+
{
|
|
257
|
+
tool_id: "master_bogle.expected_return_over_long_bond",
|
|
258
|
+
operation: "subtract",
|
|
259
|
+
inputs: [{ output_id: "index.fundamental_expected_return" }, { fact_id: "macro.long_bond_yield" }],
|
|
260
|
+
output_id: "index.expected_return_over_long_bond",
|
|
261
|
+
value_kind: "ratio",
|
|
262
|
+
unit: "decimal",
|
|
263
|
+
purpose:
|
|
264
|
+
"The stock-versus-bond comparison Bogle used to set an allocation: what the market can reasonably be expected to deliver, less what the long bond pays outright.",
|
|
265
|
+
},
|
|
266
|
+
],
|
|
267
|
+
eligibility: {
|
|
268
|
+
all: [
|
|
269
|
+
// The method is about owning the whole market. Without a holdings breakdown you cannot
|
|
270
|
+
// tell whether the fund is the market or a concentrated bet dressed as an index.
|
|
271
|
+
{
|
|
272
|
+
condition_id: "master_bogle.holdings_breadth_visible",
|
|
273
|
+
condition: { op: "exists", value: { fact_id: "fund.top_ten_weight" } },
|
|
274
|
+
on_false: { native_state: "insufficient_return_inputs", common_stance: "out_of_scope" },
|
|
275
|
+
on_uncomputable: { native_state: "insufficient_return_inputs", common_stance: "out_of_scope" },
|
|
276
|
+
},
|
|
277
|
+
],
|
|
278
|
+
},
|
|
279
|
+
hard_vetoes: [
|
|
280
|
+
{
|
|
281
|
+
veto_id: "master_bogle.expected_return_below_inflation",
|
|
282
|
+
rationale:
|
|
283
|
+
"Bogle stated reasonable expectations in real terms (Common Sense on Mutual Funds ch. 2). When the dividend yield plus business growth does not exceed expected inflation, the index cannot preserve purchasing power, and no reduction in cost rescues a gross return that is already negative in real terms.",
|
|
284
|
+
condition: { op: "lte", left: { output_id: "index.fundamental_expected_return" }, right: { fact_id: "macro.breakeven_inflation" } },
|
|
285
|
+
on_trigger: { common_stance: "opposed", native_state: "overpriced_market" },
|
|
286
|
+
},
|
|
287
|
+
],
|
|
288
|
+
scoring: [
|
|
289
|
+
{
|
|
290
|
+
rule_id: "bogle_fundamental_return_beats_long_bond",
|
|
291
|
+
points: 1,
|
|
292
|
+
coverage_weight: 1,
|
|
293
|
+
rationale:
|
|
294
|
+
"The Occam's razor model exists to answer one question: is the market's reasonable expected return better than the yield already on offer from bonds. When it is not, Bogle's own arithmetic says hold the bonds.",
|
|
295
|
+
condition: { op: "gt", left: { output_id: "index.expected_return_over_long_bond" }, right: { literal: 0 } },
|
|
296
|
+
},
|
|
297
|
+
{
|
|
298
|
+
rule_id: "bogle_multiple_at_or_below_long_run_norm",
|
|
299
|
+
points: 1,
|
|
300
|
+
coverage_weight: 1,
|
|
301
|
+
rationale:
|
|
302
|
+
"The third term of Bogle's model is the speculative return, the change in the price-earnings multiple, and he took the long-run mean multiple to be about fifteen times. Above that, reversion subtracts from return rather than adding to it. An aggregate earnings yield of 0.0667 is that fifteen-times mean written as a yield.",
|
|
303
|
+
condition: { op: "gte", left: { fact_id: "index.aggregate_earnings_yield" }, right: { literal: 0.0667 } },
|
|
304
|
+
},
|
|
305
|
+
{
|
|
306
|
+
rule_id: "bogle_owns_the_whole_market",
|
|
307
|
+
points: 1,
|
|
308
|
+
coverage_weight: 1,
|
|
309
|
+
rationale:
|
|
310
|
+
"The Little Book of Common Sense Investing objects that many funds calling themselves index funds are narrow bets, and insists on owning the entire market. A top-ten weight of half the fund or more means the holding is a bet on a handful of names; the one-half line is this project's reading of that instruction.",
|
|
311
|
+
condition: { op: "lte", left: { fact_id: "fund.top_ten_weight" }, right: { literal: 0.5 } },
|
|
312
|
+
},
|
|
313
|
+
],
|
|
314
|
+
bands: [
|
|
315
|
+
{ min_ratio: 0, common_stance: "opposed", native_state: "overpriced_market" },
|
|
316
|
+
{ min_ratio: 0.5, common_stance: "cautious", native_state: "fair_expected_return" },
|
|
317
|
+
{ min_ratio: 1, common_stance: "constructive", native_state: "low_cost_index_candidate" },
|
|
318
|
+
],
|
|
319
|
+
},
|
|
320
|
+
|
|
321
|
+
master_marks: {
|
|
322
|
+
provenance:
|
|
323
|
+
"Howard Marks, Mastering the Market Cycle (2018), especially the chapters on taking the market's temperature and calibrating aggressiveness, and the Oaktree memos \"Yet Again?\" (September 2017) and \"There They Go Again - Again\" (July 2018), which read the high-yield spread against its roughly five-hundred-basis-point long-run average as the cycle thermometer. `macro.credit_spread` is the ICE BofA US High Yield option-adjusted spread, so five hundred basis points is 0.05 in decimal form.",
|
|
324
|
+
tools: [
|
|
325
|
+
{
|
|
326
|
+
tool_id: "master_marks.credit_cycle_position",
|
|
327
|
+
operation: "subtract",
|
|
328
|
+
inputs: [{ fact_id: "macro.credit_spread" }, { literal: 0.05 }],
|
|
329
|
+
output_id: "macro.credit_spread_gap",
|
|
330
|
+
value_kind: "ratio",
|
|
331
|
+
unit: "decimal",
|
|
332
|
+
purpose:
|
|
333
|
+
"Where the high-yield spread sits relative to its long-run average. Marks's claim is not that spreads predict anything, but that they tell you whether investors are currently being paid to bear risk.",
|
|
334
|
+
},
|
|
335
|
+
{
|
|
336
|
+
tool_id: "master_marks.equity_over_corporate_debt",
|
|
337
|
+
operation: "subtract",
|
|
338
|
+
inputs: [{ fact_id: "index.aggregate_earnings_yield" }, { fact_id: "macro.aaa_corporate_yield" }],
|
|
339
|
+
output_id: "index.equity_over_corporate_debt_premium",
|
|
340
|
+
value_kind: "ratio",
|
|
341
|
+
unit: "decimal",
|
|
342
|
+
purpose:
|
|
343
|
+
"What the equity market pays over the safest corporate debt. The second thermometer: equities yielding less than investment-grade bonds means the cycle has run a long way toward the risk-tolerant end.",
|
|
344
|
+
},
|
|
345
|
+
],
|
|
346
|
+
eligibility: {
|
|
347
|
+
all: [
|
|
348
|
+
// "Where do we stand" needs the market's own valuation. Without an aggregate multiple the
|
|
349
|
+
// seat can describe credit conditions but cannot place the cycle.
|
|
350
|
+
{
|
|
351
|
+
condition_id: "master_marks.market_valuation_observable",
|
|
352
|
+
condition: { op: "exists", value: { fact_id: "index.aggregate_pe_ttm" } },
|
|
353
|
+
on_false: { native_state: "cycle_unknown", common_stance: "out_of_scope" },
|
|
354
|
+
on_uncomputable: { native_state: "cycle_unknown", common_stance: "out_of_scope" },
|
|
355
|
+
},
|
|
356
|
+
],
|
|
357
|
+
},
|
|
358
|
+
hard_vetoes: [
|
|
359
|
+
{
|
|
360
|
+
veto_id: "master_marks.euphoria",
|
|
361
|
+
rationale:
|
|
362
|
+
"Marks's description of the risk-tolerant end of the cycle: investors accept less than the historical average compensation for credit risk at the same moment as equities yield less than investment-grade corporate debt. When risk is not being priced at all, calibration says defence regardless of how any individual security looks.",
|
|
363
|
+
condition: {
|
|
364
|
+
op: "all",
|
|
365
|
+
conditions: [
|
|
366
|
+
{ op: "lt", left: { output_id: "macro.credit_spread_gap" }, right: { literal: 0 } },
|
|
367
|
+
{ op: "lt", left: { fact_id: "index.aggregate_earnings_yield" }, right: { fact_id: "macro.aaa_corporate_yield" } },
|
|
368
|
+
],
|
|
369
|
+
},
|
|
370
|
+
on_trigger: { common_stance: "opposed", native_state: "defensive" },
|
|
371
|
+
},
|
|
372
|
+
],
|
|
373
|
+
scoring: [
|
|
374
|
+
{
|
|
375
|
+
rule_id: "marks_credit_spread_above_long_run_average",
|
|
376
|
+
points: 1,
|
|
377
|
+
coverage_weight: 1,
|
|
378
|
+
rationale:
|
|
379
|
+
"The cycle thermometer. A high-yield spread wider than its long-run average means lenders are demanding more than usual for risk, which is the condition in which Marks argues an investor should be leaning in rather than out.",
|
|
380
|
+
condition: { op: "gt", left: { output_id: "macro.credit_spread_gap" }, right: { literal: 0 } },
|
|
381
|
+
},
|
|
382
|
+
{
|
|
383
|
+
rule_id: "marks_equity_paid_over_corporate_debt",
|
|
384
|
+
points: 1,
|
|
385
|
+
coverage_weight: 1,
|
|
386
|
+
rationale:
|
|
387
|
+
"The second-level question Marks insists on: not whether the asset is good, but whether the price pays you for the risk relative to the alternatives. Equities yielding more than the safest corporate debt is the minimum form of that compensation.",
|
|
388
|
+
condition: { op: "gt", left: { output_id: "index.equity_over_corporate_debt_premium" }, right: { literal: 0 } },
|
|
389
|
+
},
|
|
390
|
+
],
|
|
391
|
+
bands: [
|
|
392
|
+
{ min_ratio: 0, common_stance: "opposed", native_state: "defensive" },
|
|
393
|
+
{ min_ratio: 0.5, common_stance: "cautious", native_state: "balanced" },
|
|
394
|
+
{ min_ratio: 1, common_stance: "constructive", native_state: "aggressive" },
|
|
395
|
+
],
|
|
396
|
+
},
|
|
397
|
+
|
|
398
|
+
master_damodaran: {
|
|
399
|
+
provenance:
|
|
400
|
+
"Aswath Damodaran's monthly implied equity risk premium updates on damodaran.com and the annual paper \"Equity Risk Premiums: Determinants, Estimation and Implications\": the implied premium is the expected return embedded in current index prices less the risk-free rate, and the US implied premium has averaged roughly 4.2% since 1960, which is the historical anchor he judges the current reading against. This seat uses the index earnings yield less the ten-year Treasury as a tractable stand-in for his full cash-flow-implied expected return; it is a simplification of his method, not his method.",
|
|
401
|
+
tools: [
|
|
402
|
+
{
|
|
403
|
+
tool_id: "master_damodaran.implied_equity_risk_premium",
|
|
404
|
+
operation: "subtract",
|
|
405
|
+
inputs: [{ fact_id: "index.aggregate_earnings_yield" }, { fact_id: "macro.long_bond_yield" }],
|
|
406
|
+
output_id: "index.implied_equity_risk_premium",
|
|
407
|
+
value_kind: "ratio",
|
|
408
|
+
unit: "decimal",
|
|
409
|
+
purpose:
|
|
410
|
+
"What the market is currently paying for equity risk over the risk-free rate. Damodaran's argument is that this number, not a historical average, is what a valuation should discount at.",
|
|
411
|
+
},
|
|
412
|
+
{
|
|
413
|
+
tool_id: "master_damodaran.premium_versus_long_run_average",
|
|
414
|
+
operation: "subtract",
|
|
415
|
+
inputs: [{ output_id: "index.implied_equity_risk_premium" }, { literal: 0.042 }],
|
|
416
|
+
output_id: "index.implied_premium_gap",
|
|
417
|
+
value_kind: "ratio",
|
|
418
|
+
unit: "decimal",
|
|
419
|
+
purpose:
|
|
420
|
+
"The current implied premium against its own long-run average of about 4.2%, which is how he judges whether the market as a whole is cheap or rich.",
|
|
421
|
+
},
|
|
422
|
+
],
|
|
423
|
+
eligibility: {
|
|
424
|
+
all: [
|
|
425
|
+
// His valuation is a forecast, not an accounting summary. Without a forward earnings view
|
|
426
|
+
// there is nothing to discount and the seat has not valued anything.
|
|
427
|
+
{
|
|
428
|
+
condition_id: "master_damodaran.forward_earnings_available",
|
|
429
|
+
condition: { op: "exists", value: { fact_id: "index.aggregate_pe_forward" } },
|
|
430
|
+
on_false: { native_state: "unvalued", common_stance: "out_of_scope" },
|
|
431
|
+
on_uncomputable: { native_state: "unvalued", common_stance: "out_of_scope" },
|
|
432
|
+
},
|
|
433
|
+
],
|
|
434
|
+
},
|
|
435
|
+
hard_vetoes: [
|
|
436
|
+
{
|
|
437
|
+
veto_id: "master_damodaran.no_premium_over_riskfree",
|
|
438
|
+
rationale:
|
|
439
|
+
"The implied premium is by construction the extra return investors demand for holding equities instead of the risk-free asset. A premium of zero or below means the market is asking investors to take equity risk for no compensation, which no growth story or terminal assumption repairs.",
|
|
440
|
+
condition: { op: "lte", left: { output_id: "index.implied_equity_risk_premium" }, right: { literal: 0 } },
|
|
441
|
+
on_trigger: { common_stance: "opposed", native_state: "overvalued" },
|
|
442
|
+
},
|
|
443
|
+
],
|
|
444
|
+
scoring: [
|
|
445
|
+
{
|
|
446
|
+
rule_id: "damodaran_premium_above_long_run_average",
|
|
447
|
+
points: 1,
|
|
448
|
+
coverage_weight: 1,
|
|
449
|
+
rationale:
|
|
450
|
+
"His own test for whether the market is cheap: an implied premium above the roughly 4.2% it has averaged since 1960 means investors are being paid more than usual for equity risk.",
|
|
451
|
+
condition: { op: "gt", left: { output_id: "index.implied_premium_gap" }, right: { literal: 0 } },
|
|
452
|
+
},
|
|
453
|
+
{
|
|
454
|
+
rule_id: "damodaran_equity_out_yields_corporate_debt",
|
|
455
|
+
points: 1,
|
|
456
|
+
coverage_weight: 1,
|
|
457
|
+
rationale:
|
|
458
|
+
"The cross-check that the cost of equity must exceed the cost of debt for the same claim. An index earnings yield below the seasoned Aaa corporate yield inverts that ordering and makes the junior claim the worse deal.",
|
|
459
|
+
condition: { op: "gt", left: { fact_id: "index.aggregate_earnings_yield" }, right: { fact_id: "macro.aaa_corporate_yield" } },
|
|
460
|
+
},
|
|
461
|
+
],
|
|
462
|
+
bands: [
|
|
463
|
+
{ min_ratio: 0, common_stance: "opposed", native_state: "overvalued" },
|
|
464
|
+
{ min_ratio: 0.5, common_stance: "cautious", native_state: "fair_range" },
|
|
465
|
+
{ min_ratio: 1, common_stance: "constructive", native_state: "undervalued" },
|
|
466
|
+
],
|
|
467
|
+
},
|
|
468
|
+
|
|
469
|
+
master_dalio: {
|
|
470
|
+
provenance:
|
|
471
|
+
"Ray Dalio, \"How the Economic Machine Works\" (2013) and Bridgewater's published All Weather material (\"The All Weather Story\"; \"Engineering Targeted Returns and Risks\", 2009), in which asset returns are driven by growth and inflation coming in above or below what was already discounted, giving four environments; and Principles for Navigating Big Debt Crises (2018), whose template for the top of a short-term debt cycle is a central bank tightening real rates at the front end until the curve inverts and debt service outruns incomes. `macro.growth_regime` is the four-state text fact built from the direction of the ten-year-minus-three-month slope and the five-year breakeven, so it can only be compared with `eq`.",
|
|
472
|
+
tools: [
|
|
473
|
+
{
|
|
474
|
+
tool_id: "master_dalio.policy_real_rate",
|
|
475
|
+
operation: "subtract",
|
|
476
|
+
inputs: [{ fact_id: "macro.short_bond_yield" }, { fact_id: "macro.breakeven_inflation" }],
|
|
477
|
+
output_id: "macro.policy_real_rate",
|
|
478
|
+
value_kind: "ratio",
|
|
479
|
+
unit: "decimal",
|
|
480
|
+
purpose:
|
|
481
|
+
"The real rate at the front end, which is the measure of whether money is tight or easy. A nominal policy rate says nothing until inflation expectations are taken out of it.",
|
|
482
|
+
},
|
|
483
|
+
{
|
|
484
|
+
tool_id: "master_dalio.real_curve_slope",
|
|
485
|
+
operation: "subtract",
|
|
486
|
+
inputs: [{ fact_id: "macro.real_rate" }, { output_id: "macro.policy_real_rate" }],
|
|
487
|
+
output_id: "macro.real_curve_slope",
|
|
488
|
+
value_kind: "ratio",
|
|
489
|
+
unit: "decimal",
|
|
490
|
+
purpose:
|
|
491
|
+
"The long real rate less the policy real rate. Positive means the front end is easier than the market's long-run real rate; negative is the tightening configuration the debt-crisis template describes.",
|
|
492
|
+
},
|
|
493
|
+
],
|
|
494
|
+
eligibility: {
|
|
495
|
+
all: [
|
|
496
|
+
// The four boxes are the whole method. Without the growth and inflation state the seat
|
|
497
|
+
// cannot place the environment at all, and should say so rather than score anything.
|
|
498
|
+
{
|
|
499
|
+
condition_id: "master_dalio.growth_inflation_state_known",
|
|
500
|
+
condition: { op: "exists", value: { fact_id: "macro.growth_regime" } },
|
|
501
|
+
on_false: { native_state: "regime_unknown", common_stance: "out_of_scope" },
|
|
502
|
+
on_uncomputable: { native_state: "regime_unknown", common_stance: "out_of_scope" },
|
|
503
|
+
},
|
|
504
|
+
],
|
|
505
|
+
},
|
|
506
|
+
hard_vetoes: [
|
|
507
|
+
{
|
|
508
|
+
veto_id: "master_dalio.short_term_debt_cycle_top",
|
|
509
|
+
rationale:
|
|
510
|
+
"The top template in Principles for Navigating Big Debt Crises: the central bank pushes the short real rate above the long real rate and the nominal curve inverts. The claim is that this configuration precedes the break, because debt service then rises faster than the incomes servicing it, so no allocation is resilient while both hold.",
|
|
511
|
+
condition: {
|
|
512
|
+
op: "all",
|
|
513
|
+
conditions: [
|
|
514
|
+
{ op: "lt", left: { fact_id: "macro.term_structure_slope" }, right: { literal: 0 } },
|
|
515
|
+
{ op: "lt", left: { output_id: "macro.real_curve_slope" }, right: { literal: 0 } },
|
|
516
|
+
],
|
|
517
|
+
},
|
|
518
|
+
on_trigger: { common_stance: "opposed", native_state: "fragile" },
|
|
519
|
+
},
|
|
520
|
+
],
|
|
521
|
+
scoring: [
|
|
522
|
+
{
|
|
523
|
+
rule_id: "dalio_growth_axis_rising",
|
|
524
|
+
points: 1,
|
|
525
|
+
coverage_weight: 1,
|
|
526
|
+
rationale:
|
|
527
|
+
"The first axis of the four boxes. Growth surprising upward is the environment in which growth-sensitive assets carry the portfolio; the All Weather argument is that you must know which box you are in before you can say anything about balance.",
|
|
528
|
+
condition: {
|
|
529
|
+
op: "any",
|
|
530
|
+
conditions: [
|
|
531
|
+
{ op: "eq", left: { fact_id: "macro.growth_regime" }, right: { literal: "rising_growth_rising_inflation" } },
|
|
532
|
+
{ op: "eq", left: { fact_id: "macro.growth_regime" }, right: { literal: "rising_growth_falling_inflation" } },
|
|
533
|
+
],
|
|
534
|
+
},
|
|
535
|
+
},
|
|
536
|
+
{
|
|
537
|
+
rule_id: "dalio_inflation_axis_falling",
|
|
538
|
+
points: 1,
|
|
539
|
+
coverage_weight: 1,
|
|
540
|
+
rationale:
|
|
541
|
+
"The second axis. Falling inflation is the half of the grid in which nominal bonds and equities can rise together, so a portfolio built on the usual stock-bond relationship is not being asked to survive the environment that breaks it.",
|
|
542
|
+
condition: {
|
|
543
|
+
op: "any",
|
|
544
|
+
conditions: [
|
|
545
|
+
{ op: "eq", left: { fact_id: "macro.growth_regime" }, right: { literal: "rising_growth_falling_inflation" } },
|
|
546
|
+
{ op: "eq", left: { fact_id: "macro.growth_regime" }, right: { literal: "falling_growth_falling_inflation" } },
|
|
547
|
+
],
|
|
548
|
+
},
|
|
549
|
+
},
|
|
550
|
+
{
|
|
551
|
+
rule_id: "dalio_policy_not_restrictive",
|
|
552
|
+
points: 1,
|
|
553
|
+
coverage_weight: 1,
|
|
554
|
+
rationale:
|
|
555
|
+
"The policy lever, stated in real terms as the machine model insists. A policy real rate below the market's long-run real rate means the central bank is not yet squeezing the debt cycle, which is the condition under which the machine keeps running.",
|
|
556
|
+
condition: { op: "gt", left: { output_id: "macro.real_curve_slope" }, right: { literal: 0 } },
|
|
557
|
+
},
|
|
558
|
+
],
|
|
559
|
+
bands: [
|
|
560
|
+
{ min_ratio: 0, common_stance: "opposed", native_state: "fragile" },
|
|
561
|
+
{ min_ratio: 0.5, common_stance: "cautious", native_state: "unbalanced" },
|
|
562
|
+
{ min_ratio: 1, common_stance: "constructive", native_state: "regime_resilient" },
|
|
563
|
+
],
|
|
564
|
+
},
|
|
565
|
+
|
|
566
|
+
master_druckenmiller: {
|
|
567
|
+
provenance:
|
|
568
|
+
"Stanley Druckenmiller's public remarks, principally the Lost Tree Club speech of January 2015 and his repeated statement that earnings do not move the overall market - central banks and the movement of liquidity do - together with his insistence that he will not fight the tape and needs price to confirm a macro thesis before sizing up. `macro.liquidity_impulse` is the ninety-one-day change in Federal Reserve net liquidity (total assets less the overnight reverse repo facility less the Treasury General Account) and `macro.term_structure_slope` is the ten-year minus three-month Treasury spread. `market.change_pct` is a single session's move, which is a thin proxy for price confirmation and is treated as such.",
|
|
569
|
+
tools: [
|
|
570
|
+
{
|
|
571
|
+
tool_id: "master_druckenmiller.liquidity_curve_impulse",
|
|
572
|
+
operation: "mean",
|
|
573
|
+
inputs: [{ fact_id: "macro.liquidity_impulse" }, { fact_id: "macro.term_structure_slope" }],
|
|
574
|
+
output_id: "macro.liquidity_curve_impulse",
|
|
575
|
+
value_kind: "ratio",
|
|
576
|
+
unit: "decimal",
|
|
577
|
+
purpose:
|
|
578
|
+
"The pair he says he watches, averaged into one reading: is liquidity being added, and is the curve telling the same story. Either one alone is half a signal.",
|
|
579
|
+
},
|
|
580
|
+
{
|
|
581
|
+
tool_id: "master_druckenmiller.policy_real_rate",
|
|
582
|
+
operation: "subtract",
|
|
583
|
+
inputs: [{ fact_id: "macro.short_bond_yield" }, { fact_id: "macro.breakeven_inflation" }],
|
|
584
|
+
output_id: "macro.policy_real_rate",
|
|
585
|
+
value_kind: "ratio",
|
|
586
|
+
unit: "decimal",
|
|
587
|
+
purpose:
|
|
588
|
+
"The real cost of money at the front end, which decides whether the central bank is adding to or draining the liquidity he trades off.",
|
|
589
|
+
},
|
|
590
|
+
],
|
|
591
|
+
eligibility: {
|
|
592
|
+
all: [
|
|
593
|
+
// He does not act on a macro view the tape contradicts. With no price action there is
|
|
594
|
+
// nothing to confirm against, so there is no inflection to trade.
|
|
595
|
+
{
|
|
596
|
+
condition_id: "master_druckenmiller.price_action_available",
|
|
597
|
+
condition: { op: "exists", value: { fact_id: "market.change_pct" } },
|
|
598
|
+
on_false: { native_state: "no_inflection", common_stance: "out_of_scope" },
|
|
599
|
+
on_uncomputable: { native_state: "no_inflection", common_stance: "out_of_scope" },
|
|
600
|
+
},
|
|
601
|
+
],
|
|
602
|
+
},
|
|
603
|
+
hard_vetoes: [
|
|
604
|
+
{
|
|
605
|
+
veto_id: "master_druckenmiller.liquidity_draining_into_inversion",
|
|
606
|
+
rationale:
|
|
607
|
+
"Liquidity contracting while the curve is inverted is the configuration in which he says there is nothing to do on the long side. The method exists to find an asymmetric setup, and when both primary drivers point the same way against risk there is no inflection to probe.",
|
|
608
|
+
condition: {
|
|
609
|
+
op: "all",
|
|
610
|
+
conditions: [
|
|
611
|
+
{ op: "lt", left: { fact_id: "macro.liquidity_impulse" }, right: { literal: 0 } },
|
|
612
|
+
{ op: "lt", left: { fact_id: "macro.term_structure_slope" }, right: { literal: 0 } },
|
|
613
|
+
],
|
|
614
|
+
},
|
|
615
|
+
on_trigger: { common_stance: "out_of_scope", native_state: "no_inflection" },
|
|
616
|
+
},
|
|
617
|
+
],
|
|
618
|
+
scoring: [
|
|
619
|
+
{
|
|
620
|
+
rule_id: "druckenmiller_liquidity_and_curve_impulse_positive",
|
|
621
|
+
points: 1,
|
|
622
|
+
coverage_weight: 1,
|
|
623
|
+
rationale:
|
|
624
|
+
"The Lost Tree Club claim in testable form: liquidity, not earnings, moves the market. Net liquidity expanding while the curve is not inverted is the condition under which he says the tide is coming in.",
|
|
625
|
+
condition: { op: "gt", left: { output_id: "macro.liquidity_curve_impulse" }, right: { literal: 0 } },
|
|
626
|
+
},
|
|
627
|
+
{
|
|
628
|
+
rule_id: "druckenmiller_policy_real_rate_not_restrictive",
|
|
629
|
+
points: 1,
|
|
630
|
+
coverage_weight: 1,
|
|
631
|
+
rationale:
|
|
632
|
+
"His stated focus on the central bank rather than the economy. A negative real policy rate is unambiguously stimulative and needs no threshold to be chosen; zero is the boundary between paying and being paid to hold cash.",
|
|
633
|
+
condition: { op: "lt", left: { output_id: "macro.policy_real_rate" }, right: { literal: 0 } },
|
|
634
|
+
},
|
|
635
|
+
{
|
|
636
|
+
rule_id: "druckenmiller_price_confirms",
|
|
637
|
+
points: 1,
|
|
638
|
+
coverage_weight: 1,
|
|
639
|
+
rationale:
|
|
640
|
+
"He will not put the position on while the tape disagrees with the thesis. Price rising is the weakest possible form of that confirmation, and it is the only price-action fact this pack carries.",
|
|
641
|
+
condition: { op: "gt", left: { fact_id: "market.change_pct" }, right: { literal: 0 } },
|
|
642
|
+
},
|
|
643
|
+
],
|
|
644
|
+
bands: [
|
|
645
|
+
{ min_ratio: 0, common_stance: "cautious", native_state: "watch" },
|
|
646
|
+
{ min_ratio: 0.5, common_stance: "cautious", native_state: "probing" },
|
|
647
|
+
{ min_ratio: 1, common_stance: "constructive", native_state: "asymmetric_setup" },
|
|
648
|
+
],
|
|
649
|
+
},
|
|
650
|
+
|
|
651
|
+
master_asness: {
|
|
652
|
+
provenance:
|
|
653
|
+
"Clifford Asness, \"Fight the Fed Model\" (Journal of Portfolio Management, Fall 2003), which argues that setting a real earnings yield against a nominal bond yield is money illusion and that the comparison belongs against the real yield; Asness, Moskowitz and Pedersen, \"Value and Momentum Everywhere\" (Journal of Finance, 2013), whose result is that value and momentum together dominate either alone; and AQR's published capital market assumptions, which compare expected equity premia against credit premia rather than treating equities in isolation. `macro.real_rate` is the ten-year TIPS yield.",
|
|
654
|
+
tools: [
|
|
655
|
+
{
|
|
656
|
+
tool_id: "master_asness.real_earnings_yield_gap",
|
|
657
|
+
operation: "subtract",
|
|
658
|
+
inputs: [{ fact_id: "index.aggregate_earnings_yield" }, { fact_id: "macro.real_rate" }],
|
|
659
|
+
output_id: "index.real_earnings_yield_gap",
|
|
660
|
+
value_kind: "ratio",
|
|
661
|
+
unit: "decimal",
|
|
662
|
+
purpose:
|
|
663
|
+
"The comparison \"Fight the Fed Model\" says is the correct one: an earnings yield is a real quantity, so it belongs against the real bond yield.",
|
|
664
|
+
},
|
|
665
|
+
{
|
|
666
|
+
tool_id: "master_asness.nominal_earnings_yield_gap",
|
|
667
|
+
operation: "subtract",
|
|
668
|
+
inputs: [{ fact_id: "index.aggregate_earnings_yield" }, { fact_id: "macro.long_bond_yield" }],
|
|
669
|
+
output_id: "index.implied_equity_risk_premium",
|
|
670
|
+
value_kind: "ratio",
|
|
671
|
+
unit: "decimal",
|
|
672
|
+
purpose:
|
|
673
|
+
"The Fed model's own comparison, computed only so the seat can detect when it disagrees with the real one. Same construction as the Damodaran seat, deliberately sharing the output id.",
|
|
674
|
+
},
|
|
675
|
+
],
|
|
676
|
+
eligibility: {
|
|
677
|
+
all: [
|
|
678
|
+
// Value without momentum is the half of the published result that does not stand alone.
|
|
679
|
+
// Without a price trend the seat cannot say which exposure it is actually looking at.
|
|
680
|
+
{
|
|
681
|
+
condition_id: "master_asness.price_trend_observable",
|
|
682
|
+
condition: { op: "exists", value: { fact_id: "market.change_pct" } },
|
|
683
|
+
on_false: { native_state: "unidentified_exposure", common_stance: "out_of_scope" },
|
|
684
|
+
on_uncomputable: { native_state: "unidentified_exposure", common_stance: "out_of_scope" },
|
|
685
|
+
},
|
|
686
|
+
],
|
|
687
|
+
},
|
|
688
|
+
hard_vetoes: [
|
|
689
|
+
{
|
|
690
|
+
veto_id: "master_asness.fed_model_illusion",
|
|
691
|
+
rationale:
|
|
692
|
+
"The exact error named in \"Fight the Fed Model\". When the nominal comparison says equities are cheap and the real comparison says they are not, the apparent premium is inflation being counted twice rather than an identified exposure, and the seat should decline instead of scoring the illusion.",
|
|
693
|
+
condition: {
|
|
694
|
+
op: "all",
|
|
695
|
+
conditions: [
|
|
696
|
+
{ op: "gt", left: { output_id: "index.implied_equity_risk_premium" }, right: { literal: 0 } },
|
|
697
|
+
{ op: "lte", left: { output_id: "index.real_earnings_yield_gap" }, right: { literal: 0 } },
|
|
698
|
+
],
|
|
699
|
+
},
|
|
700
|
+
on_trigger: { common_stance: "out_of_scope", native_state: "unidentified_exposure" },
|
|
701
|
+
},
|
|
702
|
+
],
|
|
703
|
+
scoring: [
|
|
704
|
+
{
|
|
705
|
+
rule_id: "asness_real_yield_gap_positive",
|
|
706
|
+
points: 1,
|
|
707
|
+
coverage_weight: 1,
|
|
708
|
+
rationale:
|
|
709
|
+
"The value leg, stated the way \"Fight the Fed Model\" insists it must be: the index earnings yield above the real bond yield, so the comparison is real against real.",
|
|
710
|
+
condition: { op: "gt", left: { output_id: "index.real_earnings_yield_gap" }, right: { literal: 0 } },
|
|
711
|
+
},
|
|
712
|
+
{
|
|
713
|
+
rule_id: "asness_momentum_confirms_value",
|
|
714
|
+
points: 1,
|
|
715
|
+
coverage_weight: 1,
|
|
716
|
+
rationale:
|
|
717
|
+
"\"Value and Momentum Everywhere\" reports that the two signals are negatively correlated and that combining them beats either alone. A cheap market that is still falling is exactly the case the paper says value handles badly on its own.",
|
|
718
|
+
condition: { op: "gt", left: { fact_id: "market.change_pct" }, right: { literal: 0 } },
|
|
719
|
+
},
|
|
720
|
+
{
|
|
721
|
+
rule_id: "asness_equity_premium_beats_credit_premium",
|
|
722
|
+
points: 1,
|
|
723
|
+
coverage_weight: 1,
|
|
724
|
+
rationale:
|
|
725
|
+
"AQR's practice of setting expected equity premia against credit premia. An equity premium smaller than the compensation available for high-yield credit risk means the equity exposure is not the efficient way to buy that risk.",
|
|
726
|
+
condition: { op: "gt", left: { output_id: "index.real_earnings_yield_gap" }, right: { fact_id: "macro.credit_spread" } },
|
|
727
|
+
},
|
|
728
|
+
],
|
|
729
|
+
bands: [
|
|
730
|
+
{ min_ratio: 0, common_stance: "cautious", native_state: "factor_replication" },
|
|
731
|
+
{ min_ratio: 0.5, common_stance: "cautious", native_state: "mixed" },
|
|
732
|
+
{ min_ratio: 1, common_stance: "constructive", native_state: "residual_candidate" },
|
|
733
|
+
],
|
|
734
|
+
},
|
|
735
|
+
|
|
736
|
+
master_natenberg: {
|
|
737
|
+
provenance:
|
|
738
|
+
"Sheldon Natenberg, Option Volatility and Pricing, 2nd edition (2015): the chapters on volatility spreads and the volatility surface, in which skew is judged relative to the level of implied volatility rather than in absolute volatility points and equity options normally price out-of-the-money puts above calls; and the practical-considerations material, in which a theoretical edge only exists after the width of the market has been paid twice, once to get in and once to get out. The ten-per-cent round-trip cut-off and the five-per-cent skew materiality line are this project's readings; the book gives the tests but not the numbers.",
|
|
739
|
+
tools: [
|
|
740
|
+
{
|
|
741
|
+
tool_id: "master_natenberg.normalised_skew",
|
|
742
|
+
operation: "divide",
|
|
743
|
+
inputs: [{ fact_id: "options.skew_25d" }, { fact_id: "options.implied_volatility" }],
|
|
744
|
+
output_id: "options.normalised_skew",
|
|
745
|
+
value_kind: "ratio",
|
|
746
|
+
unit: "decimal",
|
|
747
|
+
purpose:
|
|
748
|
+
"The twenty-five-delta put-minus-call skew as a fraction of the at-the-money volatility level. Four volatility points of skew mean something very different on a twelve-volatility name than on an eighty-volatility one.",
|
|
749
|
+
},
|
|
750
|
+
{
|
|
751
|
+
tool_id: "master_natenberg.round_trip_cost",
|
|
752
|
+
operation: "multiply",
|
|
753
|
+
inputs: [{ fact_id: "execution.bid_ask" }, { literal: 2 }],
|
|
754
|
+
output_id: "execution.round_trip_cost",
|
|
755
|
+
value_kind: "ratio",
|
|
756
|
+
unit: "decimal_of_mid",
|
|
757
|
+
purpose:
|
|
758
|
+
"The quoted width is paid on the way in and again on the way out, so the cost any theoretical edge has to clear is twice the spread, not once.",
|
|
759
|
+
},
|
|
760
|
+
],
|
|
761
|
+
eligibility: {
|
|
762
|
+
all: [
|
|
763
|
+
// A relative-value volatility trade is a trade between points on a surface. One
|
|
764
|
+
// expiration is a price, not a surface, and there is nothing relative left to value.
|
|
765
|
+
{
|
|
766
|
+
condition_id: "master_natenberg.term_structure_available",
|
|
767
|
+
condition: { op: "exists", value: { fact_id: "options.term_structure" } },
|
|
768
|
+
on_false: { native_state: "surface_unavailable", common_stance: "out_of_scope" },
|
|
769
|
+
on_uncomputable: { native_state: "surface_unavailable", common_stance: "out_of_scope" },
|
|
770
|
+
},
|
|
771
|
+
],
|
|
772
|
+
},
|
|
773
|
+
hard_vetoes: [
|
|
774
|
+
{
|
|
775
|
+
veto_id: "master_natenberg.untradeable_spread",
|
|
776
|
+
rationale:
|
|
777
|
+
"The practical constraint the book keeps returning to: an edge smaller than the cost of crossing the market twice is not an edge, it is a fee. A round trip costing a tenth of the option's mid price or more consumes any realistic volatility edge, which is this project's reading of a bound Natenberg states qualitatively.",
|
|
778
|
+
condition: { op: "gte", left: { output_id: "execution.round_trip_cost" }, right: { literal: 0.1 } },
|
|
779
|
+
on_trigger: { common_stance: "opposed", native_state: "mispriced_untradeable" },
|
|
780
|
+
},
|
|
781
|
+
],
|
|
782
|
+
scoring: [
|
|
783
|
+
{
|
|
784
|
+
rule_id: "natenberg_volatility_exceeds_round_trip_friction",
|
|
785
|
+
points: 1,
|
|
786
|
+
coverage_weight: 1,
|
|
787
|
+
rationale:
|
|
788
|
+
"The sanity check before any volatility spread: the volatility being traded has to be larger than what it costs to get into and out of the position. The two quantities are not dimensionally identical - one is an annualised volatility, the other a fraction of the option's mid price - so this is a friction screen, not an edge calculation.",
|
|
789
|
+
condition: { op: "gt", left: { fact_id: "options.implied_volatility" }, right: { output_id: "execution.round_trip_cost" } },
|
|
790
|
+
},
|
|
791
|
+
{
|
|
792
|
+
rule_id: "natenberg_skew_material_versus_level",
|
|
793
|
+
points: 1,
|
|
794
|
+
coverage_weight: 1,
|
|
795
|
+
rationale:
|
|
796
|
+
"Equity options normally price out-of-the-money puts above calls, and a surface with essentially no skew relative to its own volatility level offers nothing to spread against. Five per cent of the at-the-money level is this project's reading of what counts as a shape rather than noise.",
|
|
797
|
+
condition: { op: "gt", left: { output_id: "options.normalised_skew" }, right: { literal: 0.05 } },
|
|
798
|
+
},
|
|
799
|
+
],
|
|
800
|
+
bands: [
|
|
801
|
+
{ min_ratio: 0, common_stance: "opposed", native_state: "mispriced_untradeable" },
|
|
802
|
+
{ min_ratio: 0.5, common_stance: "cautious", native_state: "fair" },
|
|
803
|
+
{ min_ratio: 1, common_stance: "constructive", native_state: "relative_value" },
|
|
804
|
+
],
|
|
805
|
+
},
|
|
806
|
+
});
|
|
807
|
+
|
|
808
|
+
export default coreSeats;
|