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
package/knowledge/solo-test/persona-v3-solo-test-formulas/master_thorp/components/tools.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
[
|
|
2
2
|
{
|
|
3
3
|
"assurance_class": "provisional_derived_proxy",
|
|
4
|
-
"derivation_evidence_hash": "sha256:
|
|
5
|
-
"derivation_spec_hash": "sha256:
|
|
6
|
-
"derivation_spec_id": "master_thorp.
|
|
4
|
+
"derivation_evidence_hash": "sha256:b85e21489b9a580f5bb3a2b8e7a537320277a23029675c607ae52d6d300a1657",
|
|
5
|
+
"derivation_spec_hash": "sha256:09e268a0fc88ee1fc5ece944be7ed8b15c1109eac01d6346cbf4452c9d380533",
|
|
6
|
+
"derivation_spec_id": "master_thorp.net_edge.prototype_v1.derived_proxy_v1",
|
|
7
7
|
"dsl_version": "1.1",
|
|
8
|
-
"id": "master_thorp.
|
|
8
|
+
"id": "master_thorp.net_edge",
|
|
9
9
|
"input_contracts": [
|
|
10
10
|
{
|
|
11
11
|
"on_missing": "fail",
|
|
@@ -14,44 +14,57 @@
|
|
|
14
14
|
"basis": "instant",
|
|
15
15
|
"window": null
|
|
16
16
|
},
|
|
17
|
-
"unit": "
|
|
18
|
-
"value_kind": "
|
|
17
|
+
"unit": "decimal",
|
|
18
|
+
"value_kind": "ratio"
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"on_missing": "fail",
|
|
22
|
+
"period": {
|
|
23
|
+
"alignment": "as_of",
|
|
24
|
+
"basis": "instant",
|
|
25
|
+
"window": null
|
|
26
|
+
},
|
|
27
|
+
"unit": "decimal_of_mid",
|
|
28
|
+
"value_kind": "ratio"
|
|
19
29
|
}
|
|
20
30
|
],
|
|
21
|
-
"input_schema_hash": "sha256:
|
|
31
|
+
"input_schema_hash": "sha256:1b2e9ab2dcebe05a8d4a1d93746ac0ec592cc0a156c36b818d261e11aeb00d53",
|
|
22
32
|
"inputs": [
|
|
23
33
|
{
|
|
24
|
-
"fact_id": "
|
|
34
|
+
"fact_id": "market.change_pct"
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"fact_id": "execution.bid_ask"
|
|
25
38
|
}
|
|
26
39
|
],
|
|
27
40
|
"intended_use": "local_test_only",
|
|
28
|
-
"kind": "
|
|
41
|
+
"kind": "recomputation",
|
|
29
42
|
"on_missing": "fail",
|
|
30
|
-
"operation": "
|
|
31
|
-
"output_id": "trade.
|
|
43
|
+
"operation": "subtract",
|
|
44
|
+
"output_id": "trade.net_edge.master_thorp",
|
|
32
45
|
"output_period": {
|
|
33
46
|
"alignment": "as_of",
|
|
34
47
|
"basis": "instant",
|
|
35
48
|
"window": null
|
|
36
49
|
},
|
|
37
|
-
"output_schema_hash": "sha256:
|
|
50
|
+
"output_schema_hash": "sha256:9f96e26d5e549ade4e9e7f680eafd0a33d546cba620cd79dd757ca7cce8816e5",
|
|
38
51
|
"production_eligible": false,
|
|
39
52
|
"review_status": "not_human_reviewed",
|
|
40
53
|
"schema_version": 1,
|
|
41
54
|
"source_ids": [
|
|
42
|
-
"derived_proxy:master_thorp.
|
|
55
|
+
"derived_proxy:master_thorp.net_edge.prototype_v1"
|
|
43
56
|
],
|
|
44
|
-
"unit": "
|
|
45
|
-
"value_kind": "
|
|
46
|
-
"version": "0.
|
|
57
|
+
"unit": "decimal",
|
|
58
|
+
"value_kind": "ratio",
|
|
59
|
+
"version": "0.2.0"
|
|
47
60
|
},
|
|
48
61
|
{
|
|
49
62
|
"assurance_class": "provisional_derived_proxy",
|
|
50
|
-
"derivation_evidence_hash": "sha256:
|
|
51
|
-
"derivation_spec_hash": "sha256:
|
|
52
|
-
"derivation_spec_id": "master_thorp.
|
|
63
|
+
"derivation_evidence_hash": "sha256:374b03940179a910863933294ea9670db249d921fb7e3249e0c6dd091d8af99a",
|
|
64
|
+
"derivation_spec_hash": "sha256:a6dd488d25efb31022335ad6f444940ca8def0a055f8c4ab720ddb82374a7cd1",
|
|
65
|
+
"derivation_spec_id": "master_thorp.edge_per_unit_of_volatility.prototype_v1.derived_proxy_v1",
|
|
53
66
|
"dsl_version": "1.1",
|
|
54
|
-
"id": "master_thorp.
|
|
67
|
+
"id": "master_thorp.edge_per_unit_of_volatility",
|
|
55
68
|
"input_contracts": [
|
|
56
69
|
{
|
|
57
70
|
"on_missing": "fail",
|
|
@@ -60,35 +73,48 @@
|
|
|
60
73
|
"basis": "instant",
|
|
61
74
|
"window": null
|
|
62
75
|
},
|
|
63
|
-
"unit": "
|
|
64
|
-
"value_kind": "
|
|
76
|
+
"unit": "decimal",
|
|
77
|
+
"value_kind": "ratio"
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"on_missing": "fail",
|
|
81
|
+
"period": {
|
|
82
|
+
"alignment": "as_of",
|
|
83
|
+
"basis": "instant",
|
|
84
|
+
"window": null
|
|
85
|
+
},
|
|
86
|
+
"unit": "decimal_annualized_volatility",
|
|
87
|
+
"value_kind": "ratio"
|
|
65
88
|
}
|
|
66
89
|
],
|
|
67
|
-
"input_schema_hash": "sha256:
|
|
90
|
+
"input_schema_hash": "sha256:589099421150597f448dad9a097aef60b96a8beb7e9eb7b1fef066305153690c",
|
|
68
91
|
"inputs": [
|
|
69
92
|
{
|
|
70
|
-
"
|
|
93
|
+
"output_id": "trade.net_edge.master_thorp"
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"fact_id": "options.implied_volatility"
|
|
71
97
|
}
|
|
72
98
|
],
|
|
73
99
|
"intended_use": "local_test_only",
|
|
74
|
-
"kind": "
|
|
100
|
+
"kind": "recomputation",
|
|
75
101
|
"on_missing": "fail",
|
|
76
|
-
"operation": "
|
|
77
|
-
"output_id": "
|
|
102
|
+
"operation": "divide",
|
|
103
|
+
"output_id": "trade.edge_per_unit_of_volatility.master_thorp",
|
|
78
104
|
"output_period": {
|
|
79
105
|
"alignment": "as_of",
|
|
80
106
|
"basis": "instant",
|
|
81
107
|
"window": null
|
|
82
108
|
},
|
|
83
|
-
"output_schema_hash": "sha256:
|
|
109
|
+
"output_schema_hash": "sha256:58d54e4438d5c1423d53dcbbfc391b7b70bcb41083f5df9230432bc419184a43",
|
|
84
110
|
"production_eligible": false,
|
|
85
111
|
"review_status": "not_human_reviewed",
|
|
86
112
|
"schema_version": 1,
|
|
87
113
|
"source_ids": [
|
|
88
|
-
"derived_proxy:master_thorp.
|
|
114
|
+
"derived_proxy:master_thorp.edge_per_unit_of_volatility.prototype_v1"
|
|
89
115
|
],
|
|
90
|
-
"unit": "
|
|
91
|
-
"value_kind": "
|
|
92
|
-
"version": "0.
|
|
116
|
+
"unit": "decimal",
|
|
117
|
+
"value_kind": "ratio",
|
|
118
|
+
"version": "0.2.0"
|
|
93
119
|
}
|
|
94
120
|
]
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
{
|
|
2
|
+
"artifact_kind": "persona_v3_provisional_formula_derivation_evidence",
|
|
3
|
+
"assurance_class": "provisional_derived_proxy",
|
|
4
|
+
"derivation_spec": {
|
|
5
|
+
"artifact_kind": "persona_v3_provisional_formula_derivation_spec",
|
|
6
|
+
"assurance_class": "provisional_derived_proxy",
|
|
7
|
+
"authoring_candidate_hash": "sha256:4d328d7bfb15575aad0df48c2431e55b692b96198230808c48b8d12e65bb145b",
|
|
8
|
+
"derivation_policy": "ai_authored_method_formula_v1",
|
|
9
|
+
"derivation_spec_id": "master_thorp.edge_per_unit_of_volatility.prototype_v1.derived_proxy_v1",
|
|
10
|
+
"formula": {
|
|
11
|
+
"inputs": [
|
|
12
|
+
{
|
|
13
|
+
"on_missing": "fail",
|
|
14
|
+
"operand": {
|
|
15
|
+
"output_id": "trade.net_edge.master_thorp"
|
|
16
|
+
},
|
|
17
|
+
"period": {
|
|
18
|
+
"alignment": "as_of",
|
|
19
|
+
"basis": "instant",
|
|
20
|
+
"window": null
|
|
21
|
+
},
|
|
22
|
+
"unit": "decimal",
|
|
23
|
+
"value_kind": "ratio"
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"on_missing": "fail",
|
|
27
|
+
"operand": {
|
|
28
|
+
"fact_id": "options.implied_volatility"
|
|
29
|
+
},
|
|
30
|
+
"period": {
|
|
31
|
+
"alignment": "as_of",
|
|
32
|
+
"basis": "instant",
|
|
33
|
+
"window": null
|
|
34
|
+
},
|
|
35
|
+
"unit": "decimal_annualized_volatility",
|
|
36
|
+
"value_kind": "ratio"
|
|
37
|
+
}
|
|
38
|
+
],
|
|
39
|
+
"kind": "recomputation",
|
|
40
|
+
"on_missing": "fail",
|
|
41
|
+
"operation": "divide",
|
|
42
|
+
"output": {
|
|
43
|
+
"output_id": "trade.edge_per_unit_of_volatility.master_thorp",
|
|
44
|
+
"period": {
|
|
45
|
+
"alignment": "as_of",
|
|
46
|
+
"basis": "instant",
|
|
47
|
+
"window": null
|
|
48
|
+
},
|
|
49
|
+
"unit": "decimal",
|
|
50
|
+
"value_kind": "ratio"
|
|
51
|
+
},
|
|
52
|
+
"version": "0.2.0"
|
|
53
|
+
},
|
|
54
|
+
"input_contract_source": "unknown_fact_fail_closed_proxy_scalar_v1",
|
|
55
|
+
"persona_id": "master_thorp",
|
|
56
|
+
"prototype_content_hash": "sha256:af33c7887d97bd0f25cec9a9d53be11efc3beb554952b2d280f45689f13baf8f",
|
|
57
|
+
"prototype_id": "master_thorp.edge_per_unit_of_volatility.prototype_v1",
|
|
58
|
+
"schema_version": 1,
|
|
59
|
+
"tool_id": "master_thorp.edge_per_unit_of_volatility"
|
|
60
|
+
},
|
|
61
|
+
"derivation_spec_hash": "sha256:a6dd488d25efb31022335ad6f444940ca8def0a055f8c4ab720ddb82374a7cd1",
|
|
62
|
+
"human_reviewer_ids": [],
|
|
63
|
+
"intended_use": "local_test_only",
|
|
64
|
+
"limitations": [
|
|
65
|
+
"ai_authored_candidate_formula_not_human_reviewed",
|
|
66
|
+
"thresholds_are_derived_from_published_method_writing_not_adjudicated",
|
|
67
|
+
"unknown_fact_proxy_scalar_unit_requires_a_local_test_adapter",
|
|
68
|
+
"no_human_formula_review_or_cryptographic_approval_exists",
|
|
69
|
+
"must_not_be_used_for_production_admission_release_or_method_model_claims"
|
|
70
|
+
],
|
|
71
|
+
"method_model_eligible": false,
|
|
72
|
+
"production_effect": "none",
|
|
73
|
+
"production_eligible": false,
|
|
74
|
+
"review_status": "not_human_reviewed",
|
|
75
|
+
"schema_version": 1,
|
|
76
|
+
"signature_count": 0
|
|
77
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
{
|
|
2
|
+
"artifact_kind": "persona_v3_provisional_formula_derivation_evidence",
|
|
3
|
+
"assurance_class": "provisional_derived_proxy",
|
|
4
|
+
"derivation_spec": {
|
|
5
|
+
"artifact_kind": "persona_v3_provisional_formula_derivation_spec",
|
|
6
|
+
"assurance_class": "provisional_derived_proxy",
|
|
7
|
+
"authoring_candidate_hash": "sha256:d3b8e93179f9c97e9fa5892910e77f45cb606ff7a85e7ae2ffe2a28ca546292a",
|
|
8
|
+
"derivation_policy": "ai_authored_method_formula_v1",
|
|
9
|
+
"derivation_spec_id": "master_thorp.net_edge.prototype_v1.derived_proxy_v1",
|
|
10
|
+
"formula": {
|
|
11
|
+
"inputs": [
|
|
12
|
+
{
|
|
13
|
+
"on_missing": "fail",
|
|
14
|
+
"operand": {
|
|
15
|
+
"fact_id": "market.change_pct"
|
|
16
|
+
},
|
|
17
|
+
"period": {
|
|
18
|
+
"alignment": "as_of",
|
|
19
|
+
"basis": "instant",
|
|
20
|
+
"window": null
|
|
21
|
+
},
|
|
22
|
+
"unit": "decimal",
|
|
23
|
+
"value_kind": "ratio"
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"on_missing": "fail",
|
|
27
|
+
"operand": {
|
|
28
|
+
"fact_id": "execution.bid_ask"
|
|
29
|
+
},
|
|
30
|
+
"period": {
|
|
31
|
+
"alignment": "as_of",
|
|
32
|
+
"basis": "instant",
|
|
33
|
+
"window": null
|
|
34
|
+
},
|
|
35
|
+
"unit": "decimal_of_mid",
|
|
36
|
+
"value_kind": "ratio"
|
|
37
|
+
}
|
|
38
|
+
],
|
|
39
|
+
"kind": "recomputation",
|
|
40
|
+
"on_missing": "fail",
|
|
41
|
+
"operation": "subtract",
|
|
42
|
+
"output": {
|
|
43
|
+
"output_id": "trade.net_edge.master_thorp",
|
|
44
|
+
"period": {
|
|
45
|
+
"alignment": "as_of",
|
|
46
|
+
"basis": "instant",
|
|
47
|
+
"window": null
|
|
48
|
+
},
|
|
49
|
+
"unit": "decimal",
|
|
50
|
+
"value_kind": "ratio"
|
|
51
|
+
},
|
|
52
|
+
"version": "0.2.0"
|
|
53
|
+
},
|
|
54
|
+
"input_contract_source": "grounding_adapter_canonical_contract_v1",
|
|
55
|
+
"persona_id": "master_thorp",
|
|
56
|
+
"prototype_content_hash": "sha256:af33c7887d97bd0f25cec9a9d53be11efc3beb554952b2d280f45689f13baf8f",
|
|
57
|
+
"prototype_id": "master_thorp.net_edge.prototype_v1",
|
|
58
|
+
"schema_version": 1,
|
|
59
|
+
"tool_id": "master_thorp.net_edge"
|
|
60
|
+
},
|
|
61
|
+
"derivation_spec_hash": "sha256:09e268a0fc88ee1fc5ece944be7ed8b15c1109eac01d6346cbf4452c9d380533",
|
|
62
|
+
"human_reviewer_ids": [],
|
|
63
|
+
"intended_use": "local_test_only",
|
|
64
|
+
"limitations": [
|
|
65
|
+
"ai_authored_candidate_formula_not_human_reviewed",
|
|
66
|
+
"thresholds_are_derived_from_published_method_writing_not_adjudicated",
|
|
67
|
+
"no_human_formula_review_or_cryptographic_approval_exists",
|
|
68
|
+
"must_not_be_used_for_production_admission_release_or_method_model_claims"
|
|
69
|
+
],
|
|
70
|
+
"method_model_eligible": false,
|
|
71
|
+
"production_effect": "none",
|
|
72
|
+
"production_eligible": false,
|
|
73
|
+
"review_status": "not_human_reviewed",
|
|
74
|
+
"schema_version": 1,
|
|
75
|
+
"signature_count": 0
|
|
76
|
+
}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Market breadth, computed from the basket rather than bought from a screener.
|
|
3
|
+
*
|
|
4
|
+
* "What fraction of the index is above its 200-day average" is the classic breadth reading,
|
|
5
|
+
* and every free source for it is either a screener whose robots.txt forbids the query or a
|
|
6
|
+
* vendor feed. But the question only ever concerns one basket at a time, and the holdings of
|
|
7
|
+
* that basket are already fetched -- so the honest way to get it is to compute it: one year of
|
|
8
|
+
* daily closes per constituent, one moving average each, count how many are above.
|
|
9
|
+
*
|
|
10
|
+
* That is a real cost, one request per name, which is why it is bounded and why the result
|
|
11
|
+
* always reports how much of the basket it actually measured. Breadth over 40% of the weights
|
|
12
|
+
* is a different claim from breadth over 95%, and a reader cannot tell them apart from the
|
|
13
|
+
* number alone.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import { LIMITS } from "./constants.mjs";
|
|
17
|
+
import { fetchText } from "./quotes.mjs";
|
|
18
|
+
|
|
19
|
+
/** A 200-day average needs 200 closes; a year of trading gives about 252. */
|
|
20
|
+
export const BREADTH_WINDOW_DAYS = 200;
|
|
21
|
+
export const BREADTH_MIN_CLOSES = 200;
|
|
22
|
+
export const BREADTH_MAX_SYMBOLS = 120;
|
|
23
|
+
export const BREADTH_MIN_COVERAGE = 0.5;
|
|
24
|
+
|
|
25
|
+
export const chartUrl = (symbol) => (
|
|
26
|
+
`https://query1.finance.yahoo.com/v8/finance/chart/${encodeURIComponent(symbol)}?range=1y&interval=1d`
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Closing prices from a Yahoo chart payload, nulls removed.
|
|
31
|
+
*
|
|
32
|
+
* A halted or untraded session is written as null, not as the previous close. Dropping it is
|
|
33
|
+
* correct for an average; carrying it forward would invent a print.
|
|
34
|
+
*/
|
|
35
|
+
export function parseDailyCloses(json) {
|
|
36
|
+
const result = json?.chart?.result?.[0];
|
|
37
|
+
const closes = result?.indicators?.quote?.[0]?.close;
|
|
38
|
+
if (!Array.isArray(closes)) return null;
|
|
39
|
+
const clean = closes.filter((value) => typeof value === "number" && Number.isFinite(value) && value > 0);
|
|
40
|
+
return clean.length ? clean : null;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** Simple moving average of the last `window` closes, or null when there is not enough history. */
|
|
44
|
+
export function movingAverage(closes, window = BREADTH_WINDOW_DAYS) {
|
|
45
|
+
if (!Array.isArray(closes) || closes.length < window) return null;
|
|
46
|
+
const tail = closes.slice(-window);
|
|
47
|
+
return tail.reduce((sum, value) => sum + value, 0) / tail.length;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export function isAboveAverage(closes, window = BREADTH_WINDOW_DAYS) {
|
|
51
|
+
const average = movingAverage(closes, window);
|
|
52
|
+
if (average === null) return null;
|
|
53
|
+
return closes.at(-1) > average;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Weighted share of a basket trading above its own 200-day average.
|
|
58
|
+
*
|
|
59
|
+
* Weighted, not counted: a breadth reading that treats the largest and smallest holding alike
|
|
60
|
+
* describes a portfolio nobody owns. The unweighted count is returned alongside it, because
|
|
61
|
+
* the gap between the two IS the concentration story -- a cap-weighted basket can be above its
|
|
62
|
+
* average on weight while most of its members are below.
|
|
63
|
+
*/
|
|
64
|
+
export async function fetchBasketBreadth(holdings, { signal, concurrency = 8 } = {}) {
|
|
65
|
+
const unavailable = [];
|
|
66
|
+
const ranked = [...(holdings || [])]
|
|
67
|
+
.filter((row) => row?.ticker && Number.isFinite(row.weight) && row.weight > 0)
|
|
68
|
+
.sort((left, right) => right.weight - left.weight)
|
|
69
|
+
.slice(0, BREADTH_MAX_SYMBOLS);
|
|
70
|
+
if (!ranked.length) {
|
|
71
|
+
return { available: false, unavailable: ["breadth: the basket published no weighted holdings"] };
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const measured = [];
|
|
75
|
+
const queue = [...ranked];
|
|
76
|
+
const worker = async () => {
|
|
77
|
+
for (let next = queue.shift(); next; next = queue.shift()) {
|
|
78
|
+
try {
|
|
79
|
+
const closes = parseDailyCloses(JSON.parse(await fetchText(chartUrl(next.ticker), LIMITS.QUOTE_FETCH_MS, signal)));
|
|
80
|
+
if (!closes || closes.length < BREADTH_MIN_CLOSES) {
|
|
81
|
+
unavailable.push(`breadth ${next.ticker}: fewer than ${BREADTH_MIN_CLOSES} daily closes in the last year`);
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
const above = isAboveAverage(closes);
|
|
85
|
+
if (above === null) continue;
|
|
86
|
+
measured.push({ ticker: next.ticker, weight: next.weight, above, close: closes.at(-1), units: next.units });
|
|
87
|
+
} catch (error) {
|
|
88
|
+
unavailable.push(`breadth ${next.ticker}: ${String(error?.message || error)}`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
await Promise.all(Array.from({ length: Math.min(concurrency, ranked.length) }, worker));
|
|
93
|
+
|
|
94
|
+
const coverage = measured.reduce((sum, row) => sum + row.weight, 0);
|
|
95
|
+
if (!measured.length || coverage < BREADTH_MIN_COVERAGE) {
|
|
96
|
+
unavailable.push(
|
|
97
|
+
`breadth: measured ${(coverage * 100).toFixed(1)}% of basket weight, below the ${BREADTH_MIN_COVERAGE * 100}% floor`,
|
|
98
|
+
);
|
|
99
|
+
return { available: false, coverage_weight: Number(coverage.toFixed(6)), measured: measured.length, unavailable };
|
|
100
|
+
}
|
|
101
|
+
const aboveWeight = measured.filter((row) => row.above).reduce((sum, row) => sum + row.weight, 0);
|
|
102
|
+
const aboveCount = measured.filter((row) => row.above).length;
|
|
103
|
+
// The same closes price the basket. An issuer that publishes unit counts but no assets
|
|
104
|
+
// under management -- which is the common case outside the two largest -- gets its size
|
|
105
|
+
// from the positions it disclosed, rather than staying an unexplained blank.
|
|
106
|
+
const priced = measured.filter((row) => Number.isFinite(row.units) && row.units > 0);
|
|
107
|
+
const pricedWeight = priced.reduce((sum, row) => sum + row.weight, 0);
|
|
108
|
+
const netAssets = priced.reduce((sum, row) => sum + (row.units * row.close), 0);
|
|
109
|
+
return Object.freeze({
|
|
110
|
+
available: true,
|
|
111
|
+
// The last close per constituent, already fetched to compute breadth. A market
|
|
112
|
+
// capitalisation is a share count times a price, and this is the price -- re-fetching it
|
|
113
|
+
// would be forty quotes for numbers that are in hand.
|
|
114
|
+
closes: Object.freeze(Object.fromEntries(measured.map((row) => [row.ticker, row.close]))),
|
|
115
|
+
// Only meaningful when nearly the whole basket was priced; a partial sum is not the fund.
|
|
116
|
+
net_assets: pricedWeight >= 0.95 && netAssets > 0 ? Number(netAssets.toFixed(2)) : null,
|
|
117
|
+
net_assets_coverage: Number(pricedWeight.toFixed(6)),
|
|
118
|
+
weighted_above: Number((aboveWeight / coverage).toFixed(6)),
|
|
119
|
+
counted_above: Number((aboveCount / measured.length).toFixed(6)),
|
|
120
|
+
coverage_weight: Number(coverage.toFixed(6)),
|
|
121
|
+
measured: measured.length,
|
|
122
|
+
window_days: BREADTH_WINDOW_DAYS,
|
|
123
|
+
method: "share_of_constituents_trading_above_their_own_200_day_simple_average",
|
|
124
|
+
unavailable,
|
|
125
|
+
});
|
|
126
|
+
}
|
package/mcp/lib/constants.mjs
CHANGED
|
@@ -58,6 +58,19 @@ export const OUTPUT_MODES = [
|
|
|
58
58
|
* section body must carry, calibrated against the manager fallback report, which emits
|
|
59
59
|
* several legitimately terse sections ("## Confidence\nmedium").
|
|
60
60
|
*/
|
|
61
|
+
/**
|
|
62
|
+
* Anchors for the system-owned publication sections.
|
|
63
|
+
*
|
|
64
|
+
* The quality gate must never locate these by heading text. A PM-authored section is
|
|
65
|
+
* relabelled rather than deleted, and several of those localized commentary titles legally
|
|
66
|
+
* contain a section alias -- the Japanese label "PMによるメソッド席の説明" contains the
|
|
67
|
+
* `master_bench` alias "メソッド席". Heading assignment keeps the richest body, so the
|
|
68
|
+
* commentary could win the assignment and every per-seat coverage check would then fail
|
|
69
|
+
* against PM prose, leaving the report permanently unpublishable in ja/ko.
|
|
70
|
+
*/
|
|
71
|
+
export const RECORDED_BENCH_MARKER_PREFIX = "alphacouncil:recorded-master-bench:v1:";
|
|
72
|
+
export const RECORDED_INSTRUMENT_MARKER_PREFIX = "alphacouncil:recorded-instrument-structure:v1:";
|
|
73
|
+
|
|
61
74
|
export const REPORT_SECTIONS = [
|
|
62
75
|
{ id: "conclusion", aliases: ["结论", "conclusion", "結論", "결론"], min_body: 6 },
|
|
63
76
|
{ id: "analyst_work_log", aliases: ["分析师工作记录", "analyst work log", "アナリスト作業記録", "分析担当作業記録", "분석가 작업 기록"], min_body: 12, per_task: true },
|
|
@@ -66,6 +79,7 @@ export const REPORT_SECTIONS = [
|
|
|
66
79
|
// then mentions none of them is the defect this entry exists to catch; a screen-only
|
|
67
80
|
// run that never selected one must not be failed for omitting it.
|
|
68
81
|
{ id: "master_bench", aliases: ["大师席", "master席位", "master bench", "master lens", "マスターベンチ", "マスター・ベンチ", "メソッド席", "마스터 벤치", "방법론 좌석"], min_body: 20, when_masters: true },
|
|
82
|
+
{ id: "instrument_structure", aliases: ["基金与指数结构", "ETF与指数结构", "资产结构与穿透", "fund and index structure", "instrument structure and look through", "ETF index structure", "ファンドと指数の構造", "資産構造とルックスルー", "펀드와 지수 구조", "자산 구조 및 룩스루"], min_body: 40, when_fund_or_index: true },
|
|
69
83
|
{ id: "market_expectations", aliases: ["市场预期", "market expectations", "市場予想", "市場期待", "시장 기대"], min_body: 8 },
|
|
70
84
|
{ id: "analyst_rating", aliases: ["分析师评级", "analyst rating", "target price", "アナリスト評価", "目標株価", "애널리스트 등급", "목표가"], min_body: 8 },
|
|
71
85
|
{ id: "earnings_call", aliases: ["电话会", "earnings call", "決算説明会", "실적 발표 콜"], min_body: 8 },
|
|
@@ -100,6 +114,7 @@ const QUICK_REPORT_SECTION_IDS = new Set([
|
|
|
100
114
|
"analyst_work_log",
|
|
101
115
|
"debate_record",
|
|
102
116
|
"master_bench",
|
|
117
|
+
"instrument_structure",
|
|
103
118
|
"earnings_call",
|
|
104
119
|
"news",
|
|
105
120
|
"valuation",
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Damodaran's monthly implied equity risk premium, with its history.
|
|
3
|
+
*
|
|
4
|
+
* The premium the market is actually pricing is the input a valuation method compares against,
|
|
5
|
+
* and it is the one number here that no other free source publishes. It also carries the
|
|
6
|
+
* history that makes a percentile meaningful: "the ERP is 4.2%" says nothing without "which is
|
|
7
|
+
* the Nth percentile since 2008".
|
|
8
|
+
*
|
|
9
|
+
* Published as an .xlsx, which is why this is readable at all -- see `xlsx.mjs`. Before that
|
|
10
|
+
* reader existed the whole series was an explicit gap with a URL attached.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { LIMITS } from "./constants.mjs";
|
|
14
|
+
import { excelSerialToIso, readWorkbook } from "./xlsx.mjs";
|
|
15
|
+
|
|
16
|
+
export const ERP_MONTHLY_URL = "https://pages.stern.nyu.edu/~adamodar/pc/implprem/ERPbymonth.xlsx";
|
|
17
|
+
|
|
18
|
+
/** Column headers, matched by text: the sheet gains columns between vintages. */
|
|
19
|
+
const COLUMNS = Object.freeze({
|
|
20
|
+
month: "Start of month",
|
|
21
|
+
index_level: "S&P 500",
|
|
22
|
+
bond_rate: "T.Bond Rate",
|
|
23
|
+
// The trailing-twelve-month premium is the headline series; the others are variants of it.
|
|
24
|
+
erp: "ERP (T12m)",
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
const numeric = (cell) => {
|
|
28
|
+
const value = Number(cell);
|
|
29
|
+
return Number.isFinite(value) ? value : null;
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
export function parseErpWorkbook(buffer) {
|
|
33
|
+
// Two sheets carry the series: a long history that lags, and a rolling last-twelve-months
|
|
34
|
+
// sheet that is current. Reading only the first makes an up-to-date dataset look years
|
|
35
|
+
// stale, so both are merged and the later observation wins on a shared month.
|
|
36
|
+
const { sheets, date1904 } = readWorkbook(buffer);
|
|
37
|
+
// Each sheet carries its own header; columns are resolved per sheet rather than once.
|
|
38
|
+
const byDate = new Map();
|
|
39
|
+
for (const sheet of sheets) {
|
|
40
|
+
const headerRow = sheet.rows.findIndex((row) => row?.[0] === COLUMNS.month || row?.[0] === "Date");
|
|
41
|
+
if (headerRow < 0) continue;
|
|
42
|
+
const header = sheet.rows[headerRow];
|
|
43
|
+
const columnOf = (...labels) => header.findIndex((cell) => labels.includes(String(cell || "").trim()));
|
|
44
|
+
const at = {
|
|
45
|
+
month: 0,
|
|
46
|
+
indexLevel: columnOf(COLUMNS.index_level),
|
|
47
|
+
bondRate: columnOf(COLUMNS.bond_rate, "10-year US Treasury"),
|
|
48
|
+
erp: columnOf(COLUMNS.erp, "ERP"),
|
|
49
|
+
};
|
|
50
|
+
if (at.erp < 0) continue;
|
|
51
|
+
for (const row of sheet.rows.slice(headerRow + 1)) {
|
|
52
|
+
const date = excelSerialToIso(row?.[at.month], { date1904 });
|
|
53
|
+
const erp = numeric(row?.[at.erp]);
|
|
54
|
+
// A month with no premium is dropped rather than interpolated: this is a published
|
|
55
|
+
// series, and a value nobody published is not an observation.
|
|
56
|
+
if (!date || erp === null) continue;
|
|
57
|
+
byDate.set(date, {
|
|
58
|
+
date,
|
|
59
|
+
erp,
|
|
60
|
+
bond_rate: at.bondRate >= 0 ? numeric(row?.[at.bondRate]) : null,
|
|
61
|
+
index_level: at.indexLevel >= 0 ? numeric(row?.[at.indexLevel]) : null,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
const observations = [...byDate.values()].sort((left, right) => left.date.localeCompare(right.date));
|
|
66
|
+
if (!observations.length) throw new Error("ERP workbook produced no dated observations");
|
|
67
|
+
return observations;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Where the latest premium sits in its own published history.
|
|
72
|
+
*
|
|
73
|
+
* Reported with the sample it ranked against, matching the contract the other feeds use: a
|
|
74
|
+
* percentile without its window is not a fact a method can act on.
|
|
75
|
+
*/
|
|
76
|
+
export function erpPercentile(observations, { sinceDays = 365 * 20 } = {}) {
|
|
77
|
+
if (!Array.isArray(observations) || observations.length < 24) return null;
|
|
78
|
+
const latest = observations.at(-1);
|
|
79
|
+
const cutoff = new Date(`${latest.date}T00:00:00Z`);
|
|
80
|
+
cutoff.setUTCDate(cutoff.getUTCDate() - sinceDays);
|
|
81
|
+
const start = cutoff.toISOString().slice(0, 10);
|
|
82
|
+
const sample = observations.filter((row) => row.date >= start);
|
|
83
|
+
if (sample.length < 24) return null;
|
|
84
|
+
const below = sample.filter((row) => row.erp < latest.erp).length;
|
|
85
|
+
return {
|
|
86
|
+
percentile: Number((below / sample.length).toFixed(4)),
|
|
87
|
+
sample_size: sample.length,
|
|
88
|
+
sample_start: sample[0].date,
|
|
89
|
+
sample_end: latest.date,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export async function fetchImpliedErp({ signal, asOf = null } = {}) {
|
|
94
|
+
const controller = new AbortController();
|
|
95
|
+
const timer = setTimeout(() => controller.abort(), LIMITS.QUOTE_FETCH_MS * 3);
|
|
96
|
+
if (signal) signal.addEventListener("abort", () => controller.abort(), { once: true });
|
|
97
|
+
try {
|
|
98
|
+
const response = await fetch(ERP_MONTHLY_URL, { signal: controller.signal });
|
|
99
|
+
if (!response.ok) throw new Error(`HTTP ${response.status}`);
|
|
100
|
+
const all = parseErpWorkbook(Buffer.from(await response.arrayBuffer()));
|
|
101
|
+
const visible = asOf ? all.filter((row) => row.date <= String(asOf).slice(0, 10)) : all;
|
|
102
|
+
if (!visible.length) throw new Error(`no ERP observation at or before ${asOf}`);
|
|
103
|
+
const latest = visible.at(-1);
|
|
104
|
+
return Object.freeze({
|
|
105
|
+
source: "damodaran_implied_erp_monthly",
|
|
106
|
+
source_url: ERP_MONTHLY_URL,
|
|
107
|
+
observations: visible,
|
|
108
|
+
latest: latest.erp,
|
|
109
|
+
bond_rate: latest.bond_rate,
|
|
110
|
+
observation_date: latest.date,
|
|
111
|
+
// The publication anchor is the month the observation belongs to, not the fetch time.
|
|
112
|
+
public_at: `${latest.date}T00:00:00.000Z`,
|
|
113
|
+
percentile: erpPercentile(visible),
|
|
114
|
+
basis: "damodaran_trailing_twelve_month_implied_erp",
|
|
115
|
+
});
|
|
116
|
+
} finally {
|
|
117
|
+
clearTimeout(timer);
|
|
118
|
+
}
|
|
119
|
+
}
|