alphacouncil-agent 0.9.2 → 1.0.0
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/commands/alpha.md +22 -3
- package/.claude-plugin/marketplace.json +3 -3
- package/.claude-plugin/plugin.json +2 -2
- package/.codex-plugin/plugin.json +4 -4
- package/.grok/commands/alpha.md +22 -3
- package/.opencode/command/alpha.md +22 -3
- package/AGENTS.md +42 -4
- package/CHANGELOG.md +164 -0
- package/CLAUDE.md +59 -7
- package/README.ja.md +25 -11
- package/README.md +44 -12
- package/README.zh-CN.md +37 -12
- package/commands/alpha.md +22 -3
- 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 +296 -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 +43 -6
- package/docs/personas.md +2 -1
- package/docs/plans/v1.0-roadmap.md +487 -0
- package/docs/releases/v0.9.3.md +86 -0
- package/docs/releases/v0.9.4.md +79 -0
- package/docs/releases/v0.9.5.md +96 -0
- package/docs/releases/v1.0.0.md +164 -0
- package/docs/report-contract.md +75 -2
- 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/{debt_driver_stress.ai-review.json → policy_real_rate.ai-review.json} +49 -49
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_dalio/reviews/{regime_classifier.ai-review.json → real_curve_slope.ai-review.json} +49 -49
- 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/{opportunity_cost.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/{user_value_evidence.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_forensic_short/reviews/{borrow_catalyst.ai-review.json → cash_conversion_gap.ai-review.json} +49 -49
- 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/{incentive_map.ai-review.json → reported_earnings_cash_gap.ai-review.json} +49 -49
- 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/{oos_cost_test.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/{leakage_audit.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/{reversal_monitor.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/{reflexivity_graph.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/{edge_recalculator.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/{fractional_kelly.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 +27 -10
- 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 +26 -8
- 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 +25 -8
- 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 +24 -8
- 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 +26 -10
- 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 +26 -10
- 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 +24 -8
- 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 +23 -8
- 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 +25 -8
- 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 +31 -11
- 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 +27 -10
- 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 +20 -8
- 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 +26 -8
- 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 +25 -10
- 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 +22 -6
- 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 +27 -10
- 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 +28 -10
- 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 +25 -10
- 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 +24 -10
- 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 +23 -10
- 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 +22 -6
- 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 +22 -8
- 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 +22 -10
- 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 +24 -11
- 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 +23 -9
- 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 +25 -10
- 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 +122 -0
- package/mcp/lib/codex.mjs +3 -3
- package/mcp/lib/constants.mjs +76 -25
- package/mcp/lib/council-options.mjs +95 -40
- package/mcp/lib/council-selection.mjs +95 -9
- 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/fundamentals.mjs +801 -0
- package/mcp/lib/funds.mjs +750 -0
- package/mcp/lib/gates.mjs +149 -15
- package/mcp/lib/grounding.mjs +188 -36
- package/mcp/lib/index-aggregate.mjs +718 -0
- package/mcp/lib/insider-ownership.mjs +149 -0
- package/mcp/lib/instrument-facts.mjs +557 -0
- package/mcp/lib/instruments.mjs +191 -0
- package/mcp/lib/lang.mjs +109 -2
- package/mcp/lib/markdown.mjs +620 -138
- package/mcp/lib/master-catalog.mjs +32 -3
- package/mcp/lib/orchestrator.mjs +1121 -290
- package/mcp/lib/packets.mjs +227 -21
- package/mcp/lib/personas/engine.mjs +44 -31
- package/mcp/lib/personas-v3/compiler.mjs +2 -0
- 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/loader.mjs +10 -7
- 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-acquisition.mjs +10 -3
- 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 +119 -2
- package/mcp/lib/quotes.mjs +5 -0
- package/mcp/lib/rpc.mjs +101 -42
- package/mcp/lib/run-store.mjs +28 -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 +339 -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/persona-v3.schema.json +37 -2
- 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 +63 -8
- 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 +182 -16
- package/scripts/lib/persona-v3-solo-test-packs.mjs +143 -16
- package/scripts/package-smoke.mjs +32 -12
- package/scripts/report-persona-corpus-gaps.mjs +4 -1
- package/scripts/review-persona-v3-solo-formulas.mjs +12 -8
- package/scripts/run-tests.mjs +23 -2
- package/scripts/scaffold-persona-v3-staging.mjs +1 -1
- package/skills/agent-skills-governance/SKILL.md +8 -2
- package/skills/alphacouncil-agent/SKILL.md +60 -9
- package/skills/public-equity-investing/SKILL.md +17 -0
- 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
|
@@ -4,6 +4,7 @@ import { loadPacks } from "./personas-v2/loader.mjs";
|
|
|
4
4
|
import { compiledPersonaPacks } from "./personas-v3/registry.mjs";
|
|
5
5
|
import { sha256 } from "./personas-v3/canonical.mjs";
|
|
6
6
|
import { selectorCard } from "./master-catalog.mjs";
|
|
7
|
+
import { languageKey, localized } from "./lang.mjs";
|
|
7
8
|
|
|
8
9
|
/**
|
|
9
10
|
* The menu a host shows before a run starts.
|
|
@@ -42,7 +43,8 @@ const estimateSelectionRange = ({ analysts = 0, allMasters = 1, verifiers = 0, d
|
|
|
42
43
|
};
|
|
43
44
|
|
|
44
45
|
export function councilOptions({ language = "English" } = {}) {
|
|
45
|
-
const
|
|
46
|
+
const locale = languageKey(language);
|
|
47
|
+
const copy = (messages) => localized(language, messages);
|
|
46
48
|
const reg = registry();
|
|
47
49
|
const packs = loadPacks();
|
|
48
50
|
const v3Packs = compiledPersonaPacks();
|
|
@@ -59,15 +61,6 @@ export function councilOptions({ language = "English" } = {}) {
|
|
|
59
61
|
covers: (p.tags || []).join(", "),
|
|
60
62
|
}));
|
|
61
63
|
|
|
62
|
-
const rosterChoices = masterRosters.map((roster) => {
|
|
63
|
-
const members = selectRoster(reg, { kind: "master", roster });
|
|
64
|
-
return {
|
|
65
|
-
roster,
|
|
66
|
-
count: members.length,
|
|
67
|
-
members: members.map((m) => ({ id: m.id, title: personaTitle(m, language) })),
|
|
68
|
-
};
|
|
69
|
-
});
|
|
70
|
-
|
|
71
64
|
// A flattened, stable-order catalog is the selection source of truth. Rosters remain
|
|
72
65
|
// useful shortcuts, but a user may choose any 1..N individual methods across schools.
|
|
73
66
|
const masterChoices = reg.ids("master").map((id, offset) => {
|
|
@@ -77,7 +70,13 @@ export function councilOptions({ language = "English" } = {}) {
|
|
|
77
70
|
const v3Selection = v3?.manifest?.selection;
|
|
78
71
|
const v3Label = v3?.admitted_label;
|
|
79
72
|
const provisionalV3 = v3?.build_profile === "solo_test";
|
|
80
|
-
const
|
|
73
|
+
const field = (value, label) => {
|
|
74
|
+
const selected = value?.[locale];
|
|
75
|
+
if (typeof selected !== "string" || !selected.trim()) {
|
|
76
|
+
throw new Error(`${id}: missing ${locale} selector ${label}`);
|
|
77
|
+
}
|
|
78
|
+
return selected;
|
|
79
|
+
};
|
|
81
80
|
// Until a physical v3 pack exists, bind the receipt to the exact v2 pack or prompt
|
|
82
81
|
// persona rather than publishing a null hash. A prompt edit must invalidate a catalog
|
|
83
82
|
// the user saw before that edit just as a v3 policy edit does.
|
|
@@ -94,13 +93,19 @@ export function councilOptions({ language = "English" } = {}) {
|
|
|
94
93
|
return {
|
|
95
94
|
index: offset + 1,
|
|
96
95
|
id,
|
|
97
|
-
title:
|
|
96
|
+
title: v3Label ? field(v3Label, "title") : personaTitle(persona, language),
|
|
98
97
|
...(v3Selection ? {
|
|
99
|
-
identity:
|
|
100
|
-
method:
|
|
101
|
-
best_for:
|
|
98
|
+
identity: field(v3Selection.identity, "identity"),
|
|
99
|
+
method: field(v3Selection.method, "method"),
|
|
100
|
+
best_for: field(v3Selection.best_for, "best_for"),
|
|
102
101
|
} : selectorCard(persona, language)),
|
|
103
102
|
maturity: v3?.maturity || pack?.kind || "prompt_lens",
|
|
103
|
+
maturity_label: copy({
|
|
104
|
+
en: v3?.maturity === "method_model" ? "Validated method model" : v3?.maturity === "candidate" ? "Candidate method" : "Provisional operator lens",
|
|
105
|
+
zh: v3?.maturity === "method_model" ? "已验证方法模型" : v3?.maturity === "candidate" ? "候选方法" : "临时操作视角",
|
|
106
|
+
ja: v3?.maturity === "method_model" ? "検証済みメソッドモデル" : v3?.maturity === "candidate" ? "候補メソッド" : "暫定オペレーター・レンズ",
|
|
107
|
+
ko: v3?.maturity === "method_model" ? "검증된 방법론 모델" : v3?.maturity === "candidate" ? "후보 방법론" : "임시 오퍼레이터 렌즈",
|
|
108
|
+
}),
|
|
104
109
|
runtime_level: v3?.admission?.level || (pack ? "v2_operator" : "v1_prompt"),
|
|
105
110
|
admission_level: v3?.admission?.level || (pack ? "operator_lens" : "prompt_lens"),
|
|
106
111
|
pack_format: v3 ? provisionalV3 ? "schema_v3_solo_test" : "schema_v3_physical" : pack ? "schema_v2_legacy" : "prompt_v1_legacy",
|
|
@@ -119,15 +124,31 @@ export function councilOptions({ language = "English" } = {}) {
|
|
|
119
124
|
};
|
|
120
125
|
});
|
|
121
126
|
|
|
127
|
+
const masterById = new Map(masterChoices.map((master) => [master.id, master]));
|
|
128
|
+
const rosterChoices = masterRosters.map((roster) => {
|
|
129
|
+
const members = selectRoster(reg, { kind: "master", roster });
|
|
130
|
+
return {
|
|
131
|
+
roster,
|
|
132
|
+
count: members.length,
|
|
133
|
+
members: members.map((member) => ({
|
|
134
|
+
id: member.id,
|
|
135
|
+
title: masterById.get(member.id)?.title || personaTitle(member, language),
|
|
136
|
+
})),
|
|
137
|
+
};
|
|
138
|
+
});
|
|
139
|
+
|
|
122
140
|
const allMasters = masterChoices.length;
|
|
123
141
|
const verifiers = reg.ids("verifier");
|
|
124
142
|
|
|
125
143
|
const presets = [
|
|
126
144
|
{
|
|
127
145
|
id: "quick",
|
|
128
|
-
label:
|
|
129
|
-
|
|
130
|
-
: "
|
|
146
|
+
label: copy({
|
|
147
|
+
en: "Quick: 4 core analysts in parallel + up to 4 masters + one parallel bull/bear round + short synthesis",
|
|
148
|
+
zh: "快速:4 位核心分析师并行 + 最多 4 位大师 + 单轮并行多空 + 短综合",
|
|
149
|
+
ja: "クイック:中核アナリスト4席を並列実行 + マスター最大4席 + 1回の並列Bull/Bear + 短い総合判断",
|
|
150
|
+
ko: "퀵: 핵심 분석가 4개 좌석 병렬 + 마스터 최대 4개 좌석 + 1회 병렬 Bull/Bear + 짧은 종합 판단",
|
|
151
|
+
}),
|
|
131
152
|
analysts: QUICK_TASKS,
|
|
132
153
|
master_selection: "required_1_to_N",
|
|
133
154
|
master_selection_maximum: 4,
|
|
@@ -139,33 +160,52 @@ export function councilOptions({ language = "English" } = {}) {
|
|
|
139
160
|
debate_rounds: 1,
|
|
140
161
|
report_contract: "quick_v1",
|
|
141
162
|
full_council_equivalent: false,
|
|
142
|
-
good_for:
|
|
143
|
-
|
|
144
|
-
: "
|
|
163
|
+
good_for: copy({
|
|
164
|
+
en: "A bounded directional read retaining masters, core analysts and recent company/industry news; no three-round cross-exam or adversarial verification.",
|
|
165
|
+
zh: "十分钟级方向性初读:保留大师、核心分析师和近期公司/行业新闻;不做三轮交叉问答或对抗核验",
|
|
166
|
+
ja: "短時間の方向性確認。マスター、中核アナリスト、直近の企業・業界ニュースを含むが、3ラウンドの反対尋問や対抗検証は行わない。",
|
|
167
|
+
ko: "짧은 방향성 검토. 마스터, 핵심 분석가, 최근 기업·산업 뉴스를 포함하지만 3라운드 교차 질문이나 적대적 검증은 수행하지 않는다.",
|
|
168
|
+
}),
|
|
145
169
|
},
|
|
146
170
|
{
|
|
147
171
|
id: "standard",
|
|
148
|
-
label:
|
|
172
|
+
label: copy({
|
|
173
|
+
en: "Standard: 8 analysts + selected masters + debate",
|
|
174
|
+
zh: "标准:8 位分析师 + 所选大师 + 辩论",
|
|
175
|
+
ja: "標準:アナリスト8席 + 選択したマスター + 討論",
|
|
176
|
+
ko: "표준: 분석가 8개 좌석 + 선택한 마스터 + 토론",
|
|
177
|
+
}),
|
|
149
178
|
analysts: DEFAULT_TASKS,
|
|
150
179
|
master_selection: "required_1_to_N",
|
|
151
180
|
suggested_masters_roster: "masters-core",
|
|
152
181
|
verify: false,
|
|
153
182
|
...estimateSelectionRange({ analysts: DEFAULT_TASKS.length, allMasters }),
|
|
154
|
-
good_for:
|
|
155
|
-
|
|
156
|
-
: "
|
|
183
|
+
good_for: copy({
|
|
184
|
+
en: "The recommended default: full evidence coverage plus this run's confirmed methods.",
|
|
185
|
+
zh: "默认推荐。覆盖完整证据面,并运行用户本次确认的方法席",
|
|
186
|
+
ja: "推奨される標準設定。証拠範囲を完全にカバーし、この実行で確定したメソッド席を動かす。",
|
|
187
|
+
ko: "권장 기본값. 전체 증거 범위를 다루고 이번 실행에서 확정한 방법론 좌석을 실행한다.",
|
|
188
|
+
}),
|
|
157
189
|
},
|
|
158
190
|
{
|
|
159
191
|
id: "deep",
|
|
160
|
-
label:
|
|
192
|
+
label: copy({
|
|
193
|
+
en: "Deep: every analyst + selected masters + verification + debate",
|
|
194
|
+
zh: "深度:全部分析师 + 所选大师 + 交叉验证 + 辩论",
|
|
195
|
+
ja: "詳細:全アナリスト + 選択したマスター + 交差検証 + 討論",
|
|
196
|
+
ko: "심층: 전체 분석가 + 선택한 마스터 + 교차 검증 + 토론",
|
|
197
|
+
}),
|
|
161
198
|
analysts: allAnalysts.map((p) => p.id),
|
|
162
199
|
master_selection: "required_1_to_N",
|
|
163
200
|
suggested_masters_roster: "masters-core",
|
|
164
201
|
verify: true,
|
|
165
202
|
...estimateSelectionRange({ analysts: allAnalysts.length, allMasters, verifiers: verifiers.length * 3 }),
|
|
166
|
-
good_for:
|
|
167
|
-
|
|
168
|
-
: "
|
|
203
|
+
good_for: copy({
|
|
204
|
+
en: "For a decision with real money behind it. Every load-bearing claim is re-sourced, re-derived and attacked.",
|
|
205
|
+
zh: "要下真钱的时候用。每条承重论断都会被回源、独立重算和反面检索",
|
|
206
|
+
ja: "実資金を伴う判断向け。重要な主張をすべて原典確認、独立再計算、反証検索にかける。",
|
|
207
|
+
ko: "실제 자금이 걸린 판단용. 핵심 주장을 모두 원출처 확인, 독립 재계산, 반증 검색에 부친다.",
|
|
208
|
+
}),
|
|
169
209
|
},
|
|
170
210
|
];
|
|
171
211
|
|
|
@@ -179,16 +219,31 @@ export function councilOptions({ language = "English" } = {}) {
|
|
|
179
219
|
all_master_ids: masterChoices.map((m) => m.id),
|
|
180
220
|
all_masters_count: allMasters,
|
|
181
221
|
verifiers: verifiers.map((id) => ({ id, title: personaTitle(reg.get(id), language) })),
|
|
182
|
-
how_to_ask:
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
222
|
+
how_to_ask: copy({
|
|
223
|
+
en: [
|
|
224
|
+
"Before every new council run, show the individual catalog and require at least one master selection. The user may pick one, any combination, or all.",
|
|
225
|
+
"If the request already names masters, preselect them, but still show the catalog and require a submission for this run. Never reuse an old run's selection silently.",
|
|
226
|
+
"Prefer a host-native multi-select. If it cannot hold the full catalog, show the stable numbered table and accept numbers, stable IDs, or all.",
|
|
227
|
+
"Submitting the selection is the confirmation. Do not add another confirmation question, but do not start research without a selection receipt.",
|
|
228
|
+
],
|
|
229
|
+
zh: [
|
|
230
|
+
"每次新的委员会运行都先展示逐席名单,并要求用户选择至少 1 位大师;可以单选、任意多选或全选。",
|
|
231
|
+
"用户已经点名时,把这些席位预选出来,但仍要展示名单并让用户提交本次选择。旧运行的选择不能自动复用。",
|
|
232
|
+
"优先使用宿主原生多选;容纳不了完整名单时,展示固定编号表,并接受编号、稳定 ID 或 all。",
|
|
233
|
+
"选择提交本身就是确认。不要再追加第二个确认问题,但没有 selection receipt 就不能开始研究。",
|
|
234
|
+
],
|
|
235
|
+
ja: [
|
|
236
|
+
"新しい委員会実行の前に必ず席ごとの一覧を表示し、少なくとも1つのマスター席を選んでもらう。単独、複数、全選択が可能。",
|
|
237
|
+
"依頼文でマスターが指定済みでも、事前選択として表示したうえで今回の選択送信を求める。以前の実行の選択を黙って再利用しない。",
|
|
238
|
+
"ホストの複数選択を優先し、一覧を収められない場合は固定番号表を示して番号、stable ID、allを受け付ける。",
|
|
239
|
+
"選択の送信自体を確定とする。二重確認は追加しないが、selection receiptなしで調査を開始しない。",
|
|
240
|
+
],
|
|
241
|
+
ko: [
|
|
242
|
+
"새 위원회 실행 전에는 좌석별 목록을 모두 보여 주고 최소 1개 마스터 좌석을 선택받는다. 단일, 복수, 전체 선택이 가능하다.",
|
|
243
|
+
"요청에 마스터가 이미 지정되어 있어도 사전 선택으로 표시한 뒤 이번 실행의 선택 제출을 받아야 한다. 이전 실행의 선택을 조용히 재사용하지 않는다.",
|
|
244
|
+
"호스트의 다중 선택 기능을 우선하고, 전체 목록을 담을 수 없으면 고정 번호표를 보여 준 뒤 번호, stable ID 또는 all을 받는다.",
|
|
245
|
+
"선택 제출 자체가 확정이다. 두 번째 확인 질문은 추가하지 않지만 selection receipt 없이는 조사를 시작하지 않는다.",
|
|
246
|
+
],
|
|
247
|
+
}),
|
|
193
248
|
};
|
|
194
249
|
}
|
|
@@ -5,6 +5,7 @@ import { COUNCIL_MODES, LIMITS, SELECTIONS_DIR } from "./constants.mjs";
|
|
|
5
5
|
import { councilOptions } from "./council-options.mjs";
|
|
6
6
|
import { invalidParams } from "./errors.mjs";
|
|
7
7
|
import { readJson, writeJson } from "./fsutil.mjs";
|
|
8
|
+
import { resolveLanguage } from "./lang.mjs";
|
|
8
9
|
import { safeSymbol } from "./run-store.mjs";
|
|
9
10
|
import { cleanupSelectionStore } from "./selection-cleanup.mjs";
|
|
10
11
|
import { ensureSelectionLockStore, withSelectionLock } from "./selection-locks.mjs";
|
|
@@ -12,11 +13,34 @@ import { ensureSelectionLockStore, withSelectionLock } from "./selection-locks.m
|
|
|
12
13
|
const SELECTION_ID = /^SEL-[0-9a-f-]{36}$/i;
|
|
13
14
|
const RECEIPT_ID = /^RCP-[0-9a-f-]{36}$/i;
|
|
14
15
|
const QUICK_MASTER_MAX = 4;
|
|
16
|
+
const SUPPORTED_SELECTION_LANGUAGES = Object.freeze(["中文", "English", "日本語", "한국어"]);
|
|
15
17
|
|
|
16
18
|
function digest(value) {
|
|
17
19
|
return createHash("sha256").update(JSON.stringify(value)).digest("hex");
|
|
18
20
|
}
|
|
19
21
|
|
|
22
|
+
function sameJson(left, right) {
|
|
23
|
+
return JSON.stringify(left) === JSON.stringify(right);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function receiptSelectionHash(receipt) {
|
|
27
|
+
return digest({
|
|
28
|
+
schema_version: receipt.schema_version,
|
|
29
|
+
selection_receipt: receipt.selection_receipt,
|
|
30
|
+
selection_id: receipt.selection_id,
|
|
31
|
+
symbol: receipt.symbol,
|
|
32
|
+
council_mode: receipt.council_mode,
|
|
33
|
+
catalog_hash: receipt.catalog_hash,
|
|
34
|
+
request_hash: receipt.request_hash,
|
|
35
|
+
intent_hash: receipt.intent_hash,
|
|
36
|
+
selected_master_ids: receipt.selected_master_ids,
|
|
37
|
+
selected_master_pack_hashes: receipt.selected_master_pack_hashes,
|
|
38
|
+
selection_mode: receipt.selection_mode,
|
|
39
|
+
created_at: receipt.created_at,
|
|
40
|
+
expires_at: receipt.expires_at,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
|
|
20
44
|
function councilMode(value) {
|
|
21
45
|
const mode = value === undefined ? "full" : String(value);
|
|
22
46
|
if (!COUNCIL_MODES.includes(mode)) {
|
|
@@ -27,6 +51,21 @@ function councilMode(value) {
|
|
|
27
51
|
return mode;
|
|
28
52
|
}
|
|
29
53
|
|
|
54
|
+
function selectionLanguage(args = {}) {
|
|
55
|
+
const language = resolveLanguage({ language: args.language, prompt: args.prompt });
|
|
56
|
+
if (!SUPPORTED_SELECTION_LANGUAGES.includes(language)) {
|
|
57
|
+
throw invalidParams(
|
|
58
|
+
`Selection language ${JSON.stringify(language)} is unsupported. Use zh-CN, en-US, ja-JP or ko-KR.`,
|
|
59
|
+
{
|
|
60
|
+
reason: "UNSUPPORTED_SELECTION_LANGUAGE",
|
|
61
|
+
requested_language: args.language ?? null,
|
|
62
|
+
supported_languages: ["zh-CN", "en-US", "ja-JP", "ko-KR"],
|
|
63
|
+
},
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
return language;
|
|
67
|
+
}
|
|
68
|
+
|
|
30
69
|
function ensureStore() {
|
|
31
70
|
ensureSelectionLockStore(SELECTIONS_DIR);
|
|
32
71
|
}
|
|
@@ -76,7 +115,8 @@ function markExpired(record) {
|
|
|
76
115
|
}
|
|
77
116
|
|
|
78
117
|
export function catalogSnapshot(language = "English") {
|
|
79
|
-
const
|
|
118
|
+
const effectiveLanguage = selectionLanguage({ language });
|
|
119
|
+
const options = councilOptions({ language: effectiveLanguage });
|
|
80
120
|
const catalog = {
|
|
81
121
|
schema_version: 1,
|
|
82
122
|
language: options.language,
|
|
@@ -94,8 +134,8 @@ export function beginCouncilSelection(args = {}, { now = Date.now() } = {}) {
|
|
|
94
134
|
// performed before the new record exists and never follows symlinks or unknown names.
|
|
95
135
|
cleanupSelectionStore({ selectionsDir: SELECTIONS_DIR, now });
|
|
96
136
|
const symbol = safeSymbol(args.symbol);
|
|
97
|
-
const language = String(args.language || "English");
|
|
98
137
|
const prompt = typeof args.prompt === "string" ? args.prompt : "";
|
|
138
|
+
const language = selectionLanguage({ language: args.language, prompt });
|
|
99
139
|
const mode = councilMode(args.council_mode);
|
|
100
140
|
const catalog = catalogSnapshot(language);
|
|
101
141
|
const preselected = args.preselected_master_ids === undefined
|
|
@@ -349,12 +389,6 @@ function confirmCouncilSelectionUnlocked(args = {}, { now = Date.now() } = {}) {
|
|
|
349
389
|
catalog_hash: record.catalog_hash,
|
|
350
390
|
request_hash: record.request_hash,
|
|
351
391
|
intent_hash: record.intent_hash,
|
|
352
|
-
selection_hash: digest({
|
|
353
|
-
selection_id: record.selection_id,
|
|
354
|
-
catalog_hash: record.catalog_hash,
|
|
355
|
-
council_mode: record.council_mode || "full",
|
|
356
|
-
selected_master_ids: record.selected_master_ids,
|
|
357
|
-
}),
|
|
358
392
|
selected_master_ids: record.selected_master_ids,
|
|
359
393
|
selected_master_pack_hashes: selectedPackHashes,
|
|
360
394
|
selection_mode: record.selection_mode,
|
|
@@ -363,6 +397,7 @@ function confirmCouncilSelectionUnlocked(args = {}, { now = Date.now() } = {}) {
|
|
|
363
397
|
consumed_at: null,
|
|
364
398
|
consumed_by_run_id: null,
|
|
365
399
|
};
|
|
400
|
+
receiptRecord.selection_hash = receiptSelectionHash(receiptRecord);
|
|
366
401
|
writeJson(selectionPath(record.selection_id), record);
|
|
367
402
|
writeJson(receiptPath(receipt), receiptRecord);
|
|
368
403
|
return confirmationResult(record);
|
|
@@ -388,6 +423,7 @@ function confirmationResult(record) {
|
|
|
388
423
|
selection_receipt: record.selection_receipt,
|
|
389
424
|
status: record.status,
|
|
390
425
|
symbol: record.symbol,
|
|
426
|
+
language: record.language,
|
|
391
427
|
council_mode: record.council_mode || "full",
|
|
392
428
|
catalog_hash: record.catalog_hash,
|
|
393
429
|
intent_hash: record.intent_hash,
|
|
@@ -406,7 +442,50 @@ function confirmationResult(record) {
|
|
|
406
442
|
function consumeCouncilSelectionUnlocked(args = {}, { now = Date.now() } = {}) {
|
|
407
443
|
ensureStore();
|
|
408
444
|
const receipt = readReceipt(args.selection_receipt);
|
|
445
|
+
if (receipt.selection_receipt !== args.selection_receipt) {
|
|
446
|
+
throw invalidParams("The selection receipt file does not match its requested receipt id.", {
|
|
447
|
+
reason: "MASTER_SELECTION_RECORD_MISMATCH",
|
|
448
|
+
mismatched_fields: ["selection_receipt"],
|
|
449
|
+
});
|
|
450
|
+
}
|
|
409
451
|
const selection = readSelection(receipt.selection_id);
|
|
452
|
+
const expectedPackHashes = Object.fromEntries(
|
|
453
|
+
selection.catalog.masters
|
|
454
|
+
.filter((master) => selection.selected_master_ids.includes(master.id))
|
|
455
|
+
.map((master) => [master.id, master.pack_hash]),
|
|
456
|
+
);
|
|
457
|
+
const recordBindings = [
|
|
458
|
+
["schema_version", receipt.schema_version, selection.schema_version],
|
|
459
|
+
["selection_id", receipt.selection_id, selection.selection_id],
|
|
460
|
+
["selection_receipt", receipt.selection_receipt, selection.selection_receipt],
|
|
461
|
+
["symbol", receipt.symbol, selection.symbol],
|
|
462
|
+
["council_mode", receipt.council_mode || "full", selection.council_mode || "full"],
|
|
463
|
+
["catalog_hash", receipt.catalog_hash, selection.catalog_hash],
|
|
464
|
+
["request_hash", receipt.request_hash, selection.request_hash],
|
|
465
|
+
["intent_hash", receipt.intent_hash, selection.intent_hash],
|
|
466
|
+
["selected_master_ids", receipt.selected_master_ids, selection.selected_master_ids],
|
|
467
|
+
["selection_mode", receipt.selection_mode, selection.selection_mode],
|
|
468
|
+
["created_at", receipt.created_at, selection.confirmed_at],
|
|
469
|
+
["expires_at", receipt.expires_at, selection.expires_at],
|
|
470
|
+
];
|
|
471
|
+
const mismatchedBindings = recordBindings
|
|
472
|
+
.filter(([, receiptValue, selectionValue]) => !sameJson(receiptValue, selectionValue))
|
|
473
|
+
.map(([field]) => field);
|
|
474
|
+
if (mismatchedBindings.length) {
|
|
475
|
+
throw invalidParams("The selection receipt does not match its confirmed selection record.", {
|
|
476
|
+
reason: "MASTER_SELECTION_RECORD_MISMATCH",
|
|
477
|
+
mismatched_fields: mismatchedBindings,
|
|
478
|
+
});
|
|
479
|
+
}
|
|
480
|
+
if (!sameJson(receipt.selected_master_pack_hashes, expectedPackHashes)) {
|
|
481
|
+
throw invalidParams("The selected persona pack hashes do not match the confirmed selection record.", {
|
|
482
|
+
reason: "MASTER_SELECTION_PACK_HASH_MISMATCH",
|
|
483
|
+
mismatched_master_ids: [...new Set([
|
|
484
|
+
...selection.selected_master_ids,
|
|
485
|
+
...Object.keys(receipt.selected_master_pack_hashes || {}),
|
|
486
|
+
])].filter((id) => receipt.selected_master_pack_hashes?.[id] !== expectedPackHashes[id]),
|
|
487
|
+
});
|
|
488
|
+
}
|
|
410
489
|
const symbol = safeSymbol(args.symbol);
|
|
411
490
|
if (receipt.symbol !== symbol || selection.symbol !== symbol) {
|
|
412
491
|
throw invalidParams(`Selection receipt is for ${receipt.symbol}, not ${symbol}.`, {
|
|
@@ -434,8 +513,15 @@ function consumeCouncilSelectionUnlocked(args = {}, { now = Date.now() } = {}) {
|
|
|
434
513
|
mismatched_master_ids: mismatchedPackHashes,
|
|
435
514
|
});
|
|
436
515
|
}
|
|
437
|
-
const
|
|
516
|
+
const expectedSelectionHash = receiptSelectionHash(receipt);
|
|
517
|
+
if (receipt.selection_hash !== expectedSelectionHash) {
|
|
518
|
+
throw invalidParams("The selection receipt hash is invalid.", {
|
|
519
|
+
reason: "MASTER_SELECTION_HASH_MISMATCH",
|
|
520
|
+
expected_selection_hash: expectedSelectionHash,
|
|
521
|
+
});
|
|
522
|
+
}
|
|
438
523
|
const prompt = typeof args.prompt === "string" ? args.prompt : "";
|
|
524
|
+
const language = selectionLanguage({ language: args.language, prompt });
|
|
439
525
|
const mode = councilMode(args.council_mode);
|
|
440
526
|
if ((receipt.council_mode || "full") !== mode || (selection.council_mode || "full") !== mode) {
|
|
441
527
|
throw invalidParams("The selection receipt belongs to a different council mode.", {
|
|
@@ -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
|
+
}
|