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.
Files changed (481) hide show
  1. package/.claude-plugin/marketplace.json +3 -3
  2. package/.claude-plugin/plugin.json +2 -2
  3. package/.codex-plugin/plugin.json +4 -4
  4. package/AGENTS.md +25 -11
  5. package/CHANGELOG.md +146 -0
  6. package/CLAUDE.md +24 -7
  7. package/README.ja.md +15 -10
  8. package/README.md +21 -13
  9. package/README.zh-CN.md +17 -12
  10. package/data/authored/core-seats.mjs +808 -0
  11. package/data/authored/growth-seats.mjs +581 -0
  12. package/data/authored/index.mjs +114 -0
  13. package/data/authored/quant-seats.mjs +564 -0
  14. package/data/authored/value-seats.mjs +663 -0
  15. package/data/build-profile.v1.json +2 -1
  16. package/data/council-evaluation-protocol.v1.json +7 -4
  17. package/data/master-selector-method-locales.v1.mjs +10 -0
  18. package/data/persona-v3-ai-assisted-solo-profile.v1.json +2 -2
  19. package/data/persona-v3-build-specs.v1.mjs +60 -3
  20. package/docs/INSTALL.md +6 -10
  21. package/docs/personas.md +2 -1
  22. package/docs/plans/v1.0-roadmap.md +487 -0
  23. package/docs/plans/v1.1-basket-native-seats.md +267 -0
  24. package/docs/releases/v0.9.5.md +96 -0
  25. package/docs/releases/v1.0.0.md +164 -0
  26. package/docs/report-contract.md +30 -6
  27. package/knowledge/ai-assisted-solo/experiments/runs/a.json +13 -13
  28. package/knowledge/ai-assisted-solo/experiments/runs/b.json +2 -2
  29. package/knowledge/ai-assisted-solo/experiments/runs/c.json +2 -2
  30. package/knowledge/ai-assisted-solo/experiments/runs/d13.json +126 -126
  31. package/knowledge/ai-assisted-solo/experiments/runs/d26.json +274 -254
  32. package/knowledge/ai-assisted-solo/experiments/runs/e-d13.json +129 -129
  33. package/knowledge/ai-assisted-solo/experiments/runs/e-d26.json +277 -257
  34. package/knowledge/ai-assisted-solo/experiments/runs/h_ai_reference.json +278 -258
  35. package/knowledge/ai-assisted-solo/experiments/simulation-input.json +7278 -556
  36. package/knowledge/ai-assisted-solo/experiments/simulation-manifest.json +22 -22
  37. 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
  38. 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
  39. 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
  40. 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
  41. 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
  42. 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
  43. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_bogle/reviews/expected_return_over_long_bond.ai-review.json +277 -0
  44. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_bogle/reviews/fundamental_expected_return.ai-review.json +277 -0
  45. 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
  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
  47. 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
  48. 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
  49. 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
  50. 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
  51. 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
  52. 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
  53. 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
  54. 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
  55. 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
  56. 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
  57. 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
  58. 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
  59. 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
  60. 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
  61. 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
  62. 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
  63. 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
  64. 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
  65. 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
  66. 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
  67. 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
  68. 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
  69. 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
  70. 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
  71. 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
  72. 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
  73. 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
  74. 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
  75. 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
  76. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_munger/reviews/reported_earnings_cash_gap.ai-review.json +277 -0
  77. 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
  78. 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
  79. 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
  80. 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
  81. 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
  82. 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
  83. 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
  84. 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
  85. 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
  86. 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
  87. 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
  88. 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
  89. 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
  90. 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
  91. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/review-manifest.json +288 -270
  92. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-semantic-adjudications/index.json +2 -2
  93. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-semantic-extractions/index.json +2 -2
  94. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-semantic-skeptic-reviews/index.json +2 -2
  95. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-source-prereviews/index.json +6 -2
  96. package/knowledge/solo-test/masters/master_ackman/decision_policy.json +122 -11
  97. package/knowledge/solo-test/masters/master_ackman/doctrine.jsonl +2 -2
  98. package/knowledge/solo-test/masters/master_ackman/manifest.json +13 -6
  99. package/knowledge/solo-test/masters/master_ackman/provisional-index.json +3 -3
  100. package/knowledge/solo-test/masters/master_ackman/sources.jsonl +1 -1
  101. package/knowledge/solo-test/masters/master_ackman/tools.json +56 -30
  102. package/knowledge/solo-test/masters/master_aschenbrenner/decision_policy.json +101 -10
  103. package/knowledge/solo-test/masters/master_aschenbrenner/doctrine.jsonl +2 -2
  104. package/knowledge/solo-test/masters/master_aschenbrenner/manifest.json +12 -4
  105. package/knowledge/solo-test/masters/master_aschenbrenner/provisional-index.json +3 -3
  106. package/knowledge/solo-test/masters/master_aschenbrenner/sources.jsonl +1 -1
  107. package/knowledge/solo-test/masters/master_aschenbrenner/tools.json +56 -30
  108. package/knowledge/solo-test/masters/master_asness/decision_policy.json +89 -10
  109. package/knowledge/solo-test/masters/master_asness/doctrine.jsonl +2 -2
  110. package/knowledge/solo-test/masters/master_asness/manifest.json +11 -4
  111. package/knowledge/solo-test/masters/master_asness/provisional-index.json +3 -3
  112. package/knowledge/solo-test/masters/master_asness/sources.jsonl +1 -1
  113. package/knowledge/solo-test/masters/master_asness/tools.json +56 -30
  114. package/knowledge/solo-test/masters/master_bogle/counterfactuals.jsonl +0 -0
  115. package/knowledge/solo-test/masters/master_bogle/decision_cases.jsonl +0 -0
  116. package/knowledge/solo-test/masters/master_bogle/decision_policy.json +170 -0
  117. package/knowledge/solo-test/masters/master_bogle/doctrine.jsonl +14 -0
  118. package/knowledge/solo-test/masters/master_bogle/evaluation/calibration_cases.jsonl +0 -0
  119. package/knowledge/solo-test/masters/master_bogle/evaluation/experiments.json +5 -0
  120. package/knowledge/solo-test/masters/master_bogle/evaluation/golden_cases.jsonl +0 -0
  121. package/knowledge/solo-test/masters/master_bogle/evaluation/pairwise_cases.jsonl +0 -0
  122. package/knowledge/solo-test/masters/master_bogle/failures.jsonl +0 -0
  123. package/knowledge/solo-test/masters/master_bogle/manifest.json +141 -0
  124. package/knowledge/solo-test/masters/master_bogle/memory_policy.json +5 -0
  125. package/knowledge/solo-test/masters/master_bogle/provisional-index.json +41 -0
  126. package/knowledge/solo-test/masters/master_bogle/research_policy.json +11 -0
  127. package/knowledge/solo-test/masters/master_bogle/sources.jsonl +1 -0
  128. package/knowledge/solo-test/masters/master_bogle/tools.json +120 -0
  129. package/knowledge/solo-test/masters/master_bogle/voice.en.md +7 -0
  130. package/knowledge/solo-test/masters/master_bogle/voice.zh.md +7 -0
  131. package/knowledge/solo-test/masters/master_buffett/decision_policy.json +102 -11
  132. package/knowledge/solo-test/masters/master_buffett/doctrine.jsonl +2 -2
  133. package/knowledge/solo-test/masters/master_buffett/manifest.json +10 -4
  134. package/knowledge/solo-test/masters/master_buffett/provisional-index.json +3 -3
  135. package/knowledge/solo-test/masters/master_buffett/sources.jsonl +1 -1
  136. package/knowledge/solo-test/masters/master_buffett/tools.json +55 -29
  137. package/knowledge/solo-test/masters/master_burry/decision_policy.json +102 -12
  138. package/knowledge/solo-test/masters/master_burry/doctrine.jsonl +2 -2
  139. package/knowledge/solo-test/masters/master_burry/manifest.json +12 -6
  140. package/knowledge/solo-test/masters/master_burry/provisional-index.json +3 -3
  141. package/knowledge/solo-test/masters/master_burry/sources.jsonl +1 -1
  142. package/knowledge/solo-test/masters/master_burry/tools.json +56 -30
  143. package/knowledge/solo-test/masters/master_cathie_wood/decision_policy.json +74 -12
  144. package/knowledge/solo-test/masters/master_cathie_wood/doctrine.jsonl +2 -2
  145. package/knowledge/solo-test/masters/master_cathie_wood/manifest.json +12 -6
  146. package/knowledge/solo-test/masters/master_cathie_wood/provisional-index.json +3 -3
  147. package/knowledge/solo-test/masters/master_cathie_wood/sources.jsonl +1 -1
  148. package/knowledge/solo-test/masters/master_cathie_wood/tools.json +56 -30
  149. package/knowledge/solo-test/masters/master_dalio/decision_policy.json +123 -16
  150. package/knowledge/solo-test/masters/master_dalio/doctrine.jsonl +2 -2
  151. package/knowledge/solo-test/masters/master_dalio/manifest.json +10 -4
  152. package/knowledge/solo-test/masters/master_dalio/provisional-index.json +3 -3
  153. package/knowledge/solo-test/masters/master_dalio/sources.jsonl +1 -1
  154. package/knowledge/solo-test/masters/master_dalio/tools.json +56 -30
  155. package/knowledge/solo-test/masters/master_damodaran/decision_policy.json +58 -10
  156. package/knowledge/solo-test/masters/master_damodaran/doctrine.jsonl +2 -2
  157. package/knowledge/solo-test/masters/master_damodaran/manifest.json +9 -4
  158. package/knowledge/solo-test/masters/master_damodaran/provisional-index.json +3 -3
  159. package/knowledge/solo-test/masters/master_damodaran/sources.jsonl +1 -1
  160. package/knowledge/solo-test/masters/master_damodaran/tools.json +54 -28
  161. package/knowledge/solo-test/masters/master_druckenmiller/decision_policy.json +89 -10
  162. package/knowledge/solo-test/masters/master_druckenmiller/doctrine.jsonl +2 -2
  163. package/knowledge/solo-test/masters/master_druckenmiller/manifest.json +11 -4
  164. package/knowledge/solo-test/masters/master_druckenmiller/provisional-index.json +3 -3
  165. package/knowledge/solo-test/masters/master_druckenmiller/sources.jsonl +1 -1
  166. package/knowledge/solo-test/masters/master_druckenmiller/tools.json +55 -29
  167. package/knowledge/solo-test/masters/master_duan_yongping/decision_policy.json +138 -13
  168. package/knowledge/solo-test/masters/master_duan_yongping/doctrine.jsonl +2 -2
  169. package/knowledge/solo-test/masters/master_duan_yongping/manifest.json +17 -7
  170. package/knowledge/solo-test/masters/master_duan_yongping/provisional-index.json +3 -3
  171. package/knowledge/solo-test/masters/master_duan_yongping/sources.jsonl +1 -1
  172. package/knowledge/solo-test/masters/master_duan_yongping/tools.json +82 -30
  173. package/knowledge/solo-test/masters/master_fisher/decision_policy.json +102 -11
  174. package/knowledge/solo-test/masters/master_fisher/doctrine.jsonl +2 -2
  175. package/knowledge/solo-test/masters/master_fisher/manifest.json +13 -6
  176. package/knowledge/solo-test/masters/master_fisher/provisional-index.json +3 -3
  177. package/knowledge/solo-test/masters/master_fisher/sources.jsonl +1 -1
  178. package/knowledge/solo-test/masters/master_fisher/tools.json +58 -32
  179. package/knowledge/solo-test/masters/master_forensic_short/decision_policy.json +93 -14
  180. package/knowledge/solo-test/masters/master_forensic_short/doctrine.jsonl +2 -2
  181. package/knowledge/solo-test/masters/master_forensic_short/manifest.json +6 -4
  182. package/knowledge/solo-test/masters/master_forensic_short/provisional-index.json +3 -3
  183. package/knowledge/solo-test/masters/master_forensic_short/sources.jsonl +1 -1
  184. package/knowledge/solo-test/masters/master_forensic_short/tools.json +53 -27
  185. package/knowledge/solo-test/masters/master_graham/decision_policy.json +103 -12
  186. package/knowledge/solo-test/masters/master_graham/doctrine.jsonl +2 -2
  187. package/knowledge/solo-test/masters/master_graham/manifest.json +12 -4
  188. package/knowledge/solo-test/masters/master_graham/provisional-index.json +3 -3
  189. package/knowledge/solo-test/masters/master_graham/sources.jsonl +1 -1
  190. package/knowledge/solo-test/masters/master_graham/tools.json +67 -28
  191. package/knowledge/solo-test/masters/master_jhunjhunwala/decision_policy.json +77 -12
  192. package/knowledge/solo-test/masters/master_jhunjhunwala/doctrine.jsonl +2 -2
  193. package/knowledge/solo-test/masters/master_jhunjhunwala/manifest.json +11 -6
  194. package/knowledge/solo-test/masters/master_jhunjhunwala/provisional-index.json +3 -3
  195. package/knowledge/solo-test/masters/master_jhunjhunwala/sources.jsonl +1 -1
  196. package/knowledge/solo-test/masters/master_jhunjhunwala/tools.json +54 -28
  197. package/knowledge/solo-test/masters/master_klarman/decision_policy.json +105 -14
  198. package/knowledge/solo-test/masters/master_klarman/doctrine.jsonl +2 -2
  199. package/knowledge/solo-test/masters/master_klarman/manifest.json +8 -2
  200. package/knowledge/solo-test/masters/master_klarman/provisional-index.json +3 -3
  201. package/knowledge/solo-test/masters/master_klarman/sources.jsonl +1 -1
  202. package/knowledge/solo-test/masters/master_klarman/tools.json +55 -29
  203. package/knowledge/solo-test/masters/master_li_lu/decision_policy.json +101 -10
  204. package/knowledge/solo-test/masters/master_li_lu/doctrine.jsonl +2 -2
  205. package/knowledge/solo-test/masters/master_li_lu/manifest.json +13 -6
  206. package/knowledge/solo-test/masters/master_li_lu/provisional-index.json +3 -3
  207. package/knowledge/solo-test/masters/master_li_lu/sources.jsonl +1 -1
  208. package/knowledge/solo-test/masters/master_li_lu/tools.json +58 -32
  209. package/knowledge/solo-test/masters/master_lynch/decision_policy.json +127 -16
  210. package/knowledge/solo-test/masters/master_lynch/doctrine.jsonl +2 -2
  211. package/knowledge/solo-test/masters/master_lynch/manifest.json +14 -6
  212. package/knowledge/solo-test/masters/master_lynch/provisional-index.json +3 -3
  213. package/knowledge/solo-test/masters/master_lynch/sources.jsonl +1 -1
  214. package/knowledge/solo-test/masters/master_lynch/tools.json +67 -28
  215. package/knowledge/solo-test/masters/master_marks/decision_policy.json +71 -9
  216. package/knowledge/solo-test/masters/master_marks/doctrine.jsonl +2 -2
  217. package/knowledge/solo-test/masters/master_marks/manifest.json +11 -6
  218. package/knowledge/solo-test/masters/master_marks/provisional-index.json +3 -3
  219. package/knowledge/solo-test/masters/master_marks/sources.jsonl +1 -1
  220. package/knowledge/solo-test/masters/master_marks/tools.json +54 -28
  221. package/knowledge/solo-test/masters/master_munger/decision_policy.json +141 -16
  222. package/knowledge/solo-test/masters/master_munger/doctrine.jsonl +2 -2
  223. package/knowledge/solo-test/masters/master_munger/manifest.json +10 -6
  224. package/knowledge/solo-test/masters/master_munger/provisional-index.json +3 -3
  225. package/knowledge/solo-test/masters/master_munger/sources.jsonl +1 -1
  226. package/knowledge/solo-test/masters/master_munger/tools.json +52 -26
  227. package/knowledge/solo-test/masters/master_natenberg/decision_policy.json +59 -11
  228. package/knowledge/solo-test/masters/master_natenberg/doctrine.jsonl +2 -2
  229. package/knowledge/solo-test/masters/master_natenberg/manifest.json +9 -6
  230. package/knowledge/solo-test/masters/master_natenberg/provisional-index.json +3 -3
  231. package/knowledge/solo-test/masters/master_natenberg/sources.jsonl +1 -1
  232. package/knowledge/solo-test/masters/master_natenberg/tools.json +50 -24
  233. package/knowledge/solo-test/masters/master_pabrai/decision_policy.json +125 -14
  234. package/knowledge/solo-test/masters/master_pabrai/doctrine.jsonl +2 -2
  235. package/knowledge/solo-test/masters/master_pabrai/manifest.json +8 -2
  236. package/knowledge/solo-test/masters/master_pabrai/provisional-index.json +3 -3
  237. package/knowledge/solo-test/masters/master_pabrai/sources.jsonl +1 -1
  238. package/knowledge/solo-test/masters/master_pabrai/tools.json +55 -29
  239. package/knowledge/solo-test/masters/master_simons/decision_policy.json +59 -11
  240. package/knowledge/solo-test/masters/master_simons/doctrine.jsonl +2 -2
  241. package/knowledge/solo-test/masters/master_simons/manifest.json +8 -4
  242. package/knowledge/solo-test/masters/master_simons/provisional-index.json +3 -3
  243. package/knowledge/solo-test/masters/master_simons/sources.jsonl +1 -1
  244. package/knowledge/solo-test/masters/master_simons/tools.json +43 -30
  245. package/knowledge/solo-test/masters/master_sinclair/decision_policy.json +59 -11
  246. package/knowledge/solo-test/masters/master_sinclair/doctrine.jsonl +2 -2
  247. package/knowledge/solo-test/masters/master_sinclair/manifest.json +8 -6
  248. package/knowledge/solo-test/masters/master_sinclair/provisional-index.json +3 -3
  249. package/knowledge/solo-test/masters/master_sinclair/sources.jsonl +1 -1
  250. package/knowledge/solo-test/masters/master_sinclair/tools.json +54 -28
  251. package/knowledge/solo-test/masters/master_soros/decision_policy.json +98 -10
  252. package/knowledge/solo-test/masters/master_soros/doctrine.jsonl +2 -2
  253. package/knowledge/solo-test/masters/master_soros/manifest.json +10 -7
  254. package/knowledge/solo-test/masters/master_soros/provisional-index.json +3 -3
  255. package/knowledge/solo-test/masters/master_soros/sources.jsonl +1 -1
  256. package/knowledge/solo-test/masters/master_soros/tools.json +54 -28
  257. package/knowledge/solo-test/masters/master_taleb/decision_policy.json +124 -13
  258. package/knowledge/solo-test/masters/master_taleb/doctrine.jsonl +2 -2
  259. package/knowledge/solo-test/masters/master_taleb/manifest.json +9 -5
  260. package/knowledge/solo-test/masters/master_taleb/provisional-index.json +3 -3
  261. package/knowledge/solo-test/masters/master_taleb/sources.jsonl +1 -1
  262. package/knowledge/solo-test/masters/master_taleb/tools.json +50 -24
  263. package/knowledge/solo-test/masters/master_thorp/decision_policy.json +61 -13
  264. package/knowledge/solo-test/masters/master_thorp/doctrine.jsonl +2 -2
  265. package/knowledge/solo-test/masters/master_thorp/manifest.json +11 -6
  266. package/knowledge/solo-test/masters/master_thorp/provisional-index.json +3 -3
  267. package/knowledge/solo-test/masters/master_thorp/sources.jsonl +1 -1
  268. package/knowledge/solo-test/masters/master_thorp/tools.json +56 -30
  269. package/knowledge/solo-test/persona-v3-solo-test-formulas/compilation-manifest.json +290 -264
  270. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_ackman/components/tools.json +58 -32
  271. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_ackman/provisional-derivations/market_capitalisation.derived-proxy-evidence.json +76 -0
  272. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_ackman/provisional-derivations/owner_earnings_yield.derived-proxy-evidence.json +76 -0
  273. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_aschenbrenner/components/tools.json +58 -32
  274. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_aschenbrenner/provisional-derivations/market_capitalisation.derived-proxy-evidence.json +76 -0
  275. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_aschenbrenner/provisional-derivations/price_implied_cash_yield.derived-proxy-evidence.json +76 -0
  276. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_asness/components/tools.json +58 -32
  277. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_asness/provisional-derivations/nominal_earnings_yield_gap.derived-proxy-evidence.json +76 -0
  278. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_asness/provisional-derivations/real_earnings_yield_gap.derived-proxy-evidence.json +76 -0
  279. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_bogle/components/tools.json +120 -0
  280. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_bogle/provisional-derivations/expected_return_over_long_bond.derived-proxy-evidence.json +77 -0
  281. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_bogle/provisional-derivations/fundamental_expected_return.derived-proxy-evidence.json +76 -0
  282. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_buffett/components/tools.json +57 -31
  283. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_buffett/provisional-derivations/market_capitalisation.derived-proxy-evidence.json +76 -0
  284. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_buffett/provisional-derivations/owner_earnings_yield.derived-proxy-evidence.json +76 -0
  285. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_burry/components/tools.json +58 -32
  286. 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
  287. 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
  288. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_cathie_wood/components/tools.json +58 -32
  289. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_cathie_wood/provisional-derivations/current_cash_yield.derived-proxy-evidence.json +76 -0
  290. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_cathie_wood/provisional-derivations/market_capitalisation.derived-proxy-evidence.json +76 -0
  291. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_dalio/components/tools.json +58 -32
  292. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_dalio/provisional-derivations/policy_real_rate.derived-proxy-evidence.json +76 -0
  293. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_dalio/provisional-derivations/real_curve_slope.derived-proxy-evidence.json +76 -0
  294. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_damodaran/components/tools.json +56 -30
  295. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_damodaran/provisional-derivations/implied_equity_risk_premium.derived-proxy-evidence.json +76 -0
  296. 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
  297. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_druckenmiller/components/tools.json +57 -31
  298. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_druckenmiller/provisional-derivations/liquidity_curve_impulse.derived-proxy-evidence.json +76 -0
  299. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_druckenmiller/provisional-derivations/policy_real_rate.derived-proxy-evidence.json +76 -0
  300. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_duan_yongping/components/tools.json +84 -32
  301. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_duan_yongping/provisional-derivations/five_year_opportunity_cost.derived-proxy-evidence.json +102 -0
  302. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_duan_yongping/provisional-derivations/margin_retention.derived-proxy-evidence.json +76 -0
  303. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_fisher/components/tools.json +60 -34
  304. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_fisher/provisional-derivations/margin_retention.derived-proxy-evidence.json +76 -0
  305. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_fisher/provisional-derivations/reinvestment_spread.derived-proxy-evidence.json +76 -0
  306. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_forensic_short/components/tools.json +55 -29
  307. 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
  308. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_forensic_short/provisional-derivations/cash_cover_of_leverage.derived-proxy-evidence.json +76 -0
  309. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_graham/components/tools.json +69 -30
  310. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_graham/provisional-derivations/defensive_hurdle_base.derived-proxy-evidence.json +89 -0
  311. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_graham/provisional-derivations/half_normalised_earnings_yield.derived-proxy-evidence.json +76 -0
  312. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_jhunjhunwala/components/tools.json +56 -30
  313. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_jhunjhunwala/provisional-derivations/cash_quality_gap.derived-proxy-evidence.json +76 -0
  314. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_jhunjhunwala/provisional-derivations/real_structural_growth.derived-proxy-evidence.json +76 -0
  315. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_klarman/components/tools.json +57 -31
  316. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_klarman/provisional-derivations/downside_asset_coverage.derived-proxy-evidence.json +76 -0
  317. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_klarman/provisional-derivations/market_capitalisation.derived-proxy-evidence.json +76 -0
  318. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_li_lu/components/tools.json +60 -34
  319. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_li_lu/provisional-derivations/cash_backed_decade_return.derived-proxy-evidence.json +76 -0
  320. 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
  321. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_lynch/components/tools.json +69 -30
  322. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_lynch/provisional-derivations/growth_justified_capitalisation.derived-proxy-evidence.json +89 -0
  323. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_lynch/provisional-derivations/market_capitalisation.derived-proxy-evidence.json +76 -0
  324. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_marks/components/tools.json +56 -30
  325. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_marks/provisional-derivations/credit_cycle_position.derived-proxy-evidence.json +76 -0
  326. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_marks/provisional-derivations/equity_over_corporate_debt.derived-proxy-evidence.json +76 -0
  327. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_munger/components/tools.json +54 -28
  328. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_munger/provisional-derivations/debt_service_cushion.derived-proxy-evidence.json +76 -0
  329. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_munger/provisional-derivations/reported_earnings_cash_gap.derived-proxy-evidence.json +76 -0
  330. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_natenberg/components/tools.json +52 -26
  331. 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
  332. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_natenberg/provisional-derivations/round_trip_cost.derived-proxy-evidence.json +76 -0
  333. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_pabrai/components/tools.json +57 -31
  334. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_pabrai/provisional-derivations/downside_floor_coverage.derived-proxy-evidence.json +76 -0
  335. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_pabrai/provisional-derivations/market_capitalisation.derived-proxy-evidence.json +76 -0
  336. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_simons/components/tools.json +45 -32
  337. 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
  338. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_simons/provisional-derivations/session_move_over_implied.derived-proxy-evidence.json +77 -0
  339. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_sinclair/components/tools.json +56 -30
  340. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_sinclair/provisional-derivations/round_trip_cost.derived-proxy-evidence.json +76 -0
  341. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_sinclair/provisional-derivations/volatility_per_unit_of_width.derived-proxy-evidence.json +76 -0
  342. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_soros/components/tools.json +56 -30
  343. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_soros/provisional-derivations/credit_cycle_position.derived-proxy-evidence.json +76 -0
  344. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_soros/provisional-derivations/financing_burden.derived-proxy-evidence.json +76 -0
  345. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_taleb/components/tools.json +52 -26
  346. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_taleb/provisional-derivations/debt_service_cushion.derived-proxy-evidence.json +76 -0
  347. 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
  348. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_thorp/components/tools.json +58 -32
  349. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_thorp/provisional-derivations/edge_per_unit_of_volatility.derived-proxy-evidence.json +77 -0
  350. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_thorp/provisional-derivations/net_edge.derived-proxy-evidence.json +76 -0
  351. package/mcp/lib/breadth.mjs +126 -0
  352. package/mcp/lib/constants.mjs +15 -0
  353. package/mcp/lib/damodaran.mjs +119 -0
  354. package/mcp/lib/fred.mjs +246 -0
  355. package/mcp/lib/fund-holdings-parsers.mjs +297 -0
  356. package/mcp/lib/fund-observations.mjs +152 -0
  357. package/mcp/lib/fundamentals.mjs +806 -0
  358. package/mcp/lib/funds.mjs +785 -0
  359. package/mcp/lib/gates.mjs +71 -4
  360. package/mcp/lib/grounding.mjs +209 -36
  361. package/mcp/lib/index-aggregate.mjs +733 -0
  362. package/mcp/lib/insider-ownership.mjs +149 -0
  363. package/mcp/lib/instrument-facts.mjs +855 -0
  364. package/mcp/lib/instruments.mjs +216 -0
  365. package/mcp/lib/markdown.mjs +216 -43
  366. package/mcp/lib/master-catalog.mjs +4 -0
  367. package/mcp/lib/orchestrator.mjs +173 -29
  368. package/mcp/lib/packets.mjs +59 -6
  369. package/mcp/lib/personas/engine.mjs +23 -10
  370. package/mcp/lib/personas-v3/deterministic-executor.mjs +13 -2
  371. package/mcp/lib/personas-v3/ga-external-evidence.mjs +3 -2
  372. package/mcp/lib/personas-v3/ga-gate.mjs +2 -1
  373. package/mcp/lib/personas-v3/ga-package-evidence.mjs +5 -4
  374. package/mcp/lib/personas-v3/grounding-adapter.mjs +309 -2
  375. package/mcp/lib/personas-v3/production-root.mjs +5 -4
  376. package/mcp/lib/personas-v3/release-formula-evidence.mjs +14 -7
  377. package/mcp/lib/personas-v3/release-source-evidence.mjs +2 -1
  378. package/mcp/lib/personas-v3/releases.mjs +5 -4
  379. package/mcp/lib/personas-v3/runtime-release-integrity.mjs +6 -5
  380. package/mcp/lib/personas-v3/semantic-source-adjudication.mjs +2 -1
  381. package/mcp/lib/personas-v3/semantic-source-extraction.mjs +2 -1
  382. package/mcp/lib/personas-v3/semantic-source-skeptic-review.mjs +2 -1
  383. package/mcp/lib/personas-v3/source-review-operations.mjs +3 -2
  384. package/mcp/lib/personas-v3/staging.mjs +22 -3
  385. package/mcp/lib/prompts.mjs +87 -3
  386. package/mcp/lib/quotes.mjs +5 -0
  387. package/mcp/lib/rpc.mjs +27 -10
  388. package/mcp/lib/run-store.mjs +5 -3
  389. package/mcp/lib/sec.mjs +32 -0
  390. package/mcp/lib/tables.mjs +11 -0
  391. package/mcp/lib/voice.mjs +122 -0
  392. package/mcp/lib/xbrl-aggregates.mjs +153 -0
  393. package/mcp/lib/xbrl-series.mjs +341 -0
  394. package/mcp/lib/xlsx.mjs +155 -0
  395. package/package.json +5 -5
  396. package/personas/masters/masters-value/bogle.md +145 -0
  397. package/schemas/council-evaluation-protocol-v1.schema.json +2 -2
  398. package/schemas/persona-v3-ai-assisted-solo-profile-v1.schema.json +2 -2
  399. package/schemas/persona-v3-ai-machine-simulation-v1.schema.json +1 -1
  400. package/schemas/persona-v3-build-spec-v1.schema.json +3 -3
  401. package/schemas/persona-v3-release-formula-review-evidence-v1.schema.json +3 -3
  402. package/schemas/persona-v3-release-manifest-v1.schema.json +6 -6
  403. package/schemas/persona-v3-release-source-review-evidence-v1.schema.json +3 -3
  404. package/schemas/persona-v3-tool-graph-v1.schema.json +1 -1
  405. package/schemas/source-review-batch-v1.schema.json +9 -9
  406. package/scripts/assemble-persona-v3-release.mjs +3 -2
  407. package/scripts/build-persona-v3-solo-test-packs.mjs +6 -8
  408. package/scripts/check-persona-v3-ga.mjs +1 -1
  409. package/scripts/check-persona-v3-production-candidates.mjs +1 -1
  410. package/scripts/compile-persona-v3-formulas.mjs +19 -18
  411. package/scripts/doctor.mjs +11 -9
  412. package/scripts/export-persona-source-review-batch.mjs +1 -1
  413. package/scripts/generate-persona-v3-drafts.mjs +2 -2
  414. package/scripts/lib/build-profile.mjs +24 -0
  415. package/scripts/lib/council-evaluation-protocol.mjs +7 -6
  416. package/scripts/lib/host-capabilities.mjs +2 -1
  417. package/scripts/lib/packaged-host-parity.mjs +9 -3
  418. package/scripts/lib/persona-v3-ai-assisted-solo-status.mjs +6 -4
  419. package/scripts/lib/persona-v3-ai-formula-review.mjs +6 -5
  420. package/scripts/lib/persona-v3-ai-machine-simulations.mjs +32 -4
  421. package/scripts/lib/persona-v3-build-specs.mjs +3 -2
  422. package/scripts/lib/persona-v3-draft-packs.mjs +2 -2
  423. package/scripts/lib/persona-v3-formula-pipeline.mjs +11 -10
  424. package/scripts/lib/persona-v3-production-candidates.mjs +10 -9
  425. package/scripts/lib/persona-v3-solo-formula-pipeline.mjs +188 -16
  426. package/scripts/lib/persona-v3-solo-test-packs.mjs +112 -11
  427. package/scripts/package-smoke.mjs +2 -1
  428. package/scripts/report-persona-corpus-gaps.mjs +4 -1
  429. package/scripts/review-persona-v3-solo-formulas.mjs +12 -8
  430. package/scripts/scaffold-persona-v3-staging.mjs +1 -1
  431. package/skills/agent-skills-governance/SKILL.md +8 -2
  432. package/skills/alphacouncil-agent/SKILL.md +12 -4
  433. package/skills/public-equity-investing/SKILL.md +17 -0
  434. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_forensic_short/reviews/borrow_catalyst.ai-review.json +0 -277
  435. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_ackman/provisional-derivations/change_value_bridge.derived-proxy-evidence.json +0 -64
  436. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_ackman/provisional-derivations/power_map.derived-proxy-evidence.json +0 -64
  437. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_aschenbrenner/provisional-derivations/compute_power_bridge.derived-proxy-evidence.json +0 -64
  438. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_aschenbrenner/provisional-derivations/timeline_reverse_valuation.derived-proxy-evidence.json +0 -64
  439. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_asness/provisional-derivations/crowding_cost_stress.derived-proxy-evidence.json +0 -64
  440. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_asness/provisional-derivations/factor_decomposer.derived-proxy-evidence.json +0 -64
  441. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_buffett/provisional-derivations/incremental_returns.derived-proxy-evidence.json +0 -64
  442. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_buffett/provisional-derivations/owner_earnings_rebuilder.derived-proxy-evidence.json +0 -64
  443. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_burry/provisional-derivations/capital_structure_reader.derived-proxy-evidence.json +0 -64
  444. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_burry/provisional-derivations/mispricing_carry.derived-proxy-evidence.json +0 -64
  445. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_cathie_wood/provisional-derivations/capture_valuation_bridge.derived-proxy-evidence.json +0 -64
  446. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_cathie_wood/provisional-derivations/cost_adoption_curve.derived-proxy-evidence.json +0 -64
  447. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_dalio/provisional-derivations/debt_driver_stress.derived-proxy-evidence.json +0 -64
  448. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_dalio/provisional-derivations/regime_classifier.derived-proxy-evidence.json +0 -64
  449. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_damodaran/provisional-derivations/story_dcf.derived-proxy-evidence.json +0 -64
  450. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_druckenmiller/provisional-derivations/inflection_payoff.derived-proxy-evidence.json +0 -64
  451. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_druckenmiller/provisional-derivations/liquidity_revision_map.derived-proxy-evidence.json +0 -64
  452. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_duan_yongping/provisional-derivations/opportunity_cost.derived-proxy-evidence.json +0 -64
  453. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_duan_yongping/provisional-derivations/user_value_evidence.derived-proxy-evidence.json +0 -64
  454. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_fisher/provisional-derivations/research_productivity.derived-proxy-evidence.json +0 -64
  455. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_fisher/provisional-derivations/scuttlebutt_graph.derived-proxy-evidence.json +0 -64
  456. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_forensic_short/provisional-derivations/borrow_catalyst.derived-proxy-evidence.json +0 -64
  457. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_graham/provisional-derivations/asset_floor.derived-proxy-evidence.json +0 -64
  458. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_graham/provisional-derivations/normalized_earnings.derived-proxy-evidence.json +0 -64
  459. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_jhunjhunwala/provisional-derivations/penetration_liquidity.derived-proxy-evidence.json +0 -64
  460. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_jhunjhunwala/provisional-derivations/promoter_governance.derived-proxy-evidence.json +0 -64
  461. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_klarman/provisional-derivations/cash_catalyst_compare.derived-proxy-evidence.json +0 -64
  462. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_klarman/provisional-derivations/recovery_waterfall.derived-proxy-evidence.json +0 -64
  463. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_li_lu/provisional-derivations/promise_integrity_ledger.derived-proxy-evidence.json +0 -64
  464. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_li_lu/provisional-derivations/ten_year_return_bridge.derived-proxy-evidence.json +0 -64
  465. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_lynch/provisional-derivations/category_classifier.derived-proxy-evidence.json +0 -64
  466. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_lynch/provisional-derivations/story_numbers_check.derived-proxy-evidence.json +0 -64
  467. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_marks/provisional-derivations/cycle_temperature.derived-proxy-evidence.json +0 -64
  468. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_marks/provisional-derivations/implied_expectations.derived-proxy-evidence.json +0 -64
  469. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_munger/provisional-derivations/failure_path_graph.derived-proxy-evidence.json +0 -64
  470. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_munger/provisional-derivations/incentive_map.derived-proxy-evidence.json +0 -64
  471. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_pabrai/provisional-derivations/discrete_payoff.derived-proxy-evidence.json +0 -64
  472. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_pabrai/provisional-derivations/downside_floor.derived-proxy-evidence.json +0 -64
  473. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_simons/provisional-derivations/leakage_audit.derived-proxy-evidence.json +0 -64
  474. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_simons/provisional-derivations/oos_cost_test.derived-proxy-evidence.json +0 -64
  475. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_sinclair/provisional-derivations/net_edge_sizer.derived-proxy-evidence.json +0 -64
  476. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_sinclair/provisional-derivations/realized_vol_forecast.derived-proxy-evidence.json +0 -64
  477. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_soros/provisional-derivations/reflexivity_graph.derived-proxy-evidence.json +0 -64
  478. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_soros/provisional-derivations/reversal_monitor.derived-proxy-evidence.json +0 -64
  479. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_taleb/provisional-derivations/payoff_ruin.derived-proxy-evidence.json +0 -64
  480. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_thorp/provisional-derivations/edge_recalculator.derived-proxy-evidence.json +0 -64
  481. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_thorp/provisional-derivations/fractional_kelly.derived-proxy-evidence.json +0 -64
@@ -1,11 +1,13 @@
1
1
  import { join } from "node:path";
2
- import { isChineseLanguage, resolveLanguage } from "./lang.mjs";
2
+ import { isChineseLanguage, localized, resolveLanguage } from "./lang.mjs";
3
3
  import { runPath } from "./run-store.mjs";
4
4
  import { compactDebateContext, compactEvidence, compactMasterOpinions, compactQuickEvidence } from "./packets.mjs";
5
5
  import { outputModeInstruction } from "./output-modes.mjs";
6
6
  import { resolveSeatWeights, weightTableMarkdown } from "./weights.mjs";
7
7
  import { groundingBlock } from "./grounding.mjs";
8
+ import { isFundOrIndex } from "./instruments.mjs";
8
9
  import { personaPrompt, personaTitle, registry, selectRoster } from "./personas/registry.mjs";
10
+ import { intentsForStance } from "./voice.mjs";
9
11
 
10
12
  /**
11
13
  * Prompt text lives in personas/, not here.
@@ -22,6 +24,73 @@ function render(template, values) {
22
24
  (Object.prototype.hasOwnProperty.call(values, key) ? String(values[key] ?? "") : match));
23
25
  }
24
26
 
27
+ function fundOrIndexTaskInstruction(task, instrument, language) {
28
+ if (!isFundOrIndex(instrument)) return "";
29
+ const type = instrument.asset_type || "fund_or_index";
30
+ const details = {
31
+ market_data: {
32
+ en: "Establish the tracked index or calculation methodology, holdings/constituent as-of date, weights, top-ten and sector concentration, fee or index rules, AUM where applicable, liquidity/spread, premium-discount or tracking difference, and dated flows. Separate missing fields.",
33
+ zh: "查清跟踪指数或计算方法、持仓/成分时点、权重、前十大和行业集中度、费率或指数规则、适用时的规模、流动性/点差、溢折价或跟踪差及带日期资金流;逐项列出缺失数据。",
34
+ ja: "連動指数または算出方法、保有銘柄・構成銘柄の基準日とウェイト、上位10銘柄・業種集中度、経費率または指数ルール、該当する純資産、流動性・スプレッド、乖離・トラッキング差、日付付き資金フローを確認し、欠落項目を分けて示す。",
35
+ ko: "추종 지수 또는 산출 방법, 보유·구성 종목 기준일과 비중, 상위 10개·섹터 집중도, 보수 또는 지수 규칙, 해당 시 AUM, 유동성·스프레드, 괴리율·추적 차이, 날짜가 있는 자금 흐름을 확인하고 누락 항목을 분리해 기록한다.",
36
+ },
37
+ earnings_deep_dive: {
38
+ en: "Perform holdings-level earnings look-through. State the covered portfolio weight and one-date aggregation method; keep issuer results separate. Never report fund/index revenue, EPS, cash flow, or an earnings call as though the instrument were an operating company.",
39
+ zh: "做持仓层盈利穿透,披露覆盖的组合权重与同日聚合方法,并分开记录各发行人结果。不得编造基金/指数自身营收、EPS、现金流或把成分公司电话会写成基金电话会。",
40
+ ja: "保有銘柄レベルの利益ルックスルーを行い、カバーしたポートフォリオウェイトと同一基準日の集計方法を示し、発行体ごとの結果を分離する。ファンド・指数固有の売上高、EPS、CF、決算説明会を作らない。",
41
+ ko: "보유 종목 수준 이익 룩스루를 수행하고 커버한 포트폴리오 비중과 동일 기준일 집계 방법을 밝히며 발행사 결과를 분리한다. 펀드·지수 자체 매출, EPS, 현금흐름 또는 실적 발표 콜을 만들지 않는다.",
42
+ },
43
+ forward_expectations: {
44
+ en: "Use weighted constituent or provider-published aggregate expectations with one date and a coverage percentage. Analyse top-constituent, sector, factor and macro expectation changes; never label a few issuer estimates as the fund's own guidance.",
45
+ zh: "只使用同一时点、披露覆盖权重的加权成分预期或指数提供方聚合预期;分析头部成分、行业、因子与宏观预期变化,不得把少数公司预测称为基金自身指引。",
46
+ ja: "同一基準日とカバーウェイトを示す加重構成銘柄予想または提供者公表の集計予想を使い、上位銘柄・業種・ファクター・マクロ予想の変化を分析する。一部発行体予想をファンド固有ガイダンスと呼ばない。",
47
+ ko: "동일 기준일과 커버 비중을 밝힌 가중 구성 종목 전망 또는 제공자 공개 집계 전망을 사용하고 상위 종목·섹터·팩터·거시 전망 변화를 분석한다. 일부 발행사 전망을 펀드 자체 가이던스로 부르지 않는다.",
48
+ },
49
+ quant_factor: {
50
+ en: "Measure total and relative return, breadth, factor/sector exposure, volatility, correlation, drawdown, tracking behaviour, liquidity and flows where available. Distinguish the tradable fund from the cash index and from any derivative proxy.",
51
+ zh: "衡量总收益与相对收益、市场广度、因子/行业暴露、波动、相关性、回撤、跟踪表现、流动性及可得的资金流;分开可交易基金、现金指数与衍生品代理。",
52
+ ja: "トータル・相対リターン、ブレッドス、ファクター・業種エクスポージャー、ボラティリティ、相関、ドローダウン、トラッキング、流動性、利用可能な資金フローを測り、上場ファンド、現物指数、デリバティブ代理を分ける。",
53
+ ko: "총수익·상대수익, 시장 폭, 팩터·섹터 노출, 변동성, 상관, 낙폭, 추적 성과, 유동성 및 가능한 자금 흐름을 측정하고 거래 펀드, 현물 지수, 파생상품 대용물을 구분한다.",
54
+ },
55
+ valuation_long_short: {
56
+ en: "Use same-date aggregate P/E, P/B, cash-flow yield or other portfolio metrics only with the provider/methodology and covered weight. Compare concentration and factor exposures. Never add a handful of constituent financial statements into portfolio financials.",
57
+ zh: "聚合 P/E、P/B、现金流收益率等组合指标必须同日、说明数据提供方/方法及覆盖权重,并比较集中度与因子暴露;不得把少数成分财报相加成组合财报。",
58
+ ja: "集計P/E、P/B、CF利回り等は同一基準日、提供者・方法、カバーウェイトを示し、集中度とファクターを比較する。一部構成銘柄の財務諸表を足してポートフォリオ財務にしない。",
59
+ ko: "집계 P/E, P/B, 현금흐름 수익률 등은 동일 기준일, 제공자·방법, 커버 비중을 밝히고 집중도와 팩터 노출을 비교한다. 일부 구성 종목 재무제표를 더해 포트폴리오 재무로 만들지 않는다.",
60
+ },
61
+ news_industry_management: {
62
+ en: "Cover sponsor and index-provider changes, methodology/rebalance notices, regulation and market-structure news, plus material dated news from top holdings and dominant sectors. Do not invent fund management guidance.",
63
+ zh: "覆盖基金管理人/指数提供方变化、方法与再平衡公告、监管和市场结构新闻,以及头部持仓和主导行业的重大带日期新闻;不得编造基金经营层指引。",
64
+ ja: "運用会社・指数提供者の変更、方法・リバランス通知、規制・市場構造ニュース、上位保有銘柄と主要業種の重要な日付付きニュースを扱い、ファンド経営ガイダンスを作らない。",
65
+ ko: "운용사·지수 제공자 변경, 방법론·리밸런싱 공지, 규제·시장 구조 뉴스와 상위 보유 종목·주요 섹터의 중요한 날짜가 있는 뉴스를 다루며 펀드 경영진 가이던스를 만들지 않는다.",
66
+ },
67
+ insider_sec: {
68
+ en: "Review applicable fund/index filings, prospectus and methodology changes, holdings reports, lending/derivative disclosures and sponsor conflicts. Constituent Form 4 filings are issuer activity, not fund insider trading.",
69
+ zh: "检查适用的基金/指数申报、招募说明书和方法变更、持仓报告、证券出借/衍生品披露及管理人冲突;成分股 Form 4 属于发行人活动,不是基金内部人交易。",
70
+ ja: "適用するファンド・指数届出、目論見書・方法変更、保有報告、貸株・デリバティブ開示、運用会社の利益相反を確認する。構成銘柄のForm 4は発行体の活動であり、ファンドの内部者取引ではない。",
71
+ ko: "적용 가능한 펀드·지수 신고, 투자설명서·방법론 변경, 보유 보고, 대차·파생상품 공시, 운용사 이해상충을 검토한다. 구성 종목 Form 4는 발행사 활동이지 펀드 내부자 거래가 아니다.",
72
+ },
73
+ ib_event_analysis: {
74
+ en: "Treat reconstitution, rebalances, methodology/provider changes, fee or sponsor changes, closures/mergers/splits and capital-market plumbing as instrument events. Constituent M&A matters only through explicit weight, replacement and flow effects.",
75
+ zh: "把指数重构/再平衡、方法或提供方变化、费率或管理人变化、清盘/合并/拆分及资本市场机制视为资产事件;成分股并购只通过明确的权重、替换与资金流影响纳入。",
76
+ ja: "入替・リバランス、方法・提供者変更、経費率・運用会社変更、償還・合併・分割、資本市場の仕組みを銘柄イベントとして扱う。構成銘柄M&Aは明示したウェイト、置換、フロー効果だけで反映する。",
77
+ ko: "지수 재구성·리밸런싱, 방법론·제공자 변경, 보수·운용사 변경, 청산·합병·분할 및 자본시장 구조를 종목 이벤트로 다룬다. 구성 종목 M&A는 명시한 비중·교체·자금 흐름 효과로만 반영한다.",
78
+ },
79
+ }[task];
80
+ const generic = {
81
+ en: "Use the fund/index research contract and record unavailable fields explicitly.",
82
+ zh: "使用基金/指数研究合同,并逐项记录不可得数据。",
83
+ ja: "ファンド・指数調査契約を使い、取得できない項目を明記する。",
84
+ ko: "펀드·지수 조사 계약을 사용하고 확보하지 못한 항목을 명시한다.",
85
+ };
86
+ return localized(language, {
87
+ en: `## ${type} task override\n${(details || generic).en}`,
88
+ zh: `## ${type} 专用任务改写\n${(details || generic).zh}`,
89
+ ja: `## ${type} 専用タスク\n${(details || generic).ja}`,
90
+ ko: `## ${type} 전용 작업\n${(details || generic).ko}`,
91
+ });
92
+ }
93
+
25
94
  export function taskPrompt(task, symbol, asOfDate, userPrompt = "", language = "auto", grounding = null) {
26
95
  const resolvedLanguage = resolveLanguage({ language, prompt: userPrompt });
27
96
  const chinese = isChineseLanguage(resolvedLanguage);
@@ -41,8 +110,9 @@ export function taskPrompt(task, symbol, asOfDate, userPrompt = "", language = "
41
110
 
42
111
  // Grounding goes AFTER the role brief: the analyst must know its job before it is told
43
112
  // which facts are already settled, or it reads them as the whole assignment.
113
+ const instrumentOverride = fundOrIndexTaskInstruction(task, grounding?.instrument, resolvedLanguage);
44
114
  const grounded = groundingBlock(grounding, resolvedLanguage);
45
- return [`${base}\n\n${chinese ? "任务:" : "Task: "}${task}\n${body}`, grounded].filter(Boolean).join("\n\n");
115
+ return [`${base}\n\n${chinese ? "任务:" : "Task: "}${task}\n${body}`, instrumentOverride, grounded].filter(Boolean).join("\n\n");
46
116
  }
47
117
 
48
118
  export function debatePrompt(role, run, context = {}) {
@@ -83,6 +153,11 @@ export function debatePrompt(role, run, context = {}) {
83
153
  ? "这是快速委员会的唯一多空陈述轮。只给最有信息量的 4–6 条论点,使用已提供来源 ID,明确回应方法席分歧;不要生成第二/第三轮问题,也不要写长报告。"
84
154
  : "This is the quick council's only bull/bear statement round. Give only the 4-6 highest-information arguments, use supplied source IDs, and engage with method-seat disagreements. Do not create round-2/3 questions or a long report.")
85
155
  : "";
156
+ const instrumentReportInstruction = role === "portfolio_manager" && isFundOrIndex(run?.grounding?.instrument)
157
+ ? (chinese
158
+ ? "这是ETF、基金或大盘指数研究。报告必须新增真实 Markdown 标题 `## 基金与指数结构`,明确资产类型、跟踪方法、持仓/成分权重时点、集中度、费用或指数规则、流动性/溢折价/跟踪差/资金流(适用时)、聚合盈利与估值口径,以及每项未取得的数据。不得写基金或指数自身营收/EPS,也不得把少数成分股相加成组合财报。"
159
+ : "This is ETF, fund or broad-index research. Add a real Markdown heading `## Fund and Index Structure` covering asset type, tracking methodology, dated holdings/constituent weights, concentration, fee or index rules, liquidity/premium-discount/tracking difference/flows when applicable, aggregate earnings and valuation methodology, and every unavailable item. Do not invent fund/index revenue or EPS and never add a few constituents into portfolio financials.")
160
+ : "";
86
161
 
87
162
  return [
88
163
  // The original spread the preamble's lines as separate array elements, so they are
@@ -90,6 +165,7 @@ export function debatePrompt(role, run, context = {}) {
90
165
  ...base.split("\n"),
91
166
  roleText,
92
167
  quickInstruction,
168
+ instrumentReportInstruction,
93
169
  roundTwoInstruction,
94
170
  roundThreeInstruction,
95
171
  context.round ? `Debate round: ${context.round}` : "",
@@ -184,7 +260,15 @@ export function masterVoicePrompt(masterId, run, frozenOpinion) {
184
260
  frozen_decision_hash: frozenOpinion?.frozen_decision_hash || null,
185
261
  })}`,
186
262
  `Method instructions (for explanation only):\n${render(personaPrompt(persona, language), values)}`,
187
- "Return ONLY one valid JSON object, no Markdown fence. Schema: {\"master\":\"stable id\",\"acknowledged_stance\":\"constructive|cautious|opposed|out_of_scope\",\"statement\":\"reader-facing explanation\",\"key_findings\":[\"string\"],\"disagreements\":[\"string\"],\"what_would_change_my_mind\":[\"string\"],\"source_ids\":[\"task:S1\"],\"confidence\":\"high|medium|low\"}.",
263
+ [
264
+ "Write the five `voice` fields in the first person, as the METHOD speaks -- \"I look for X, here the number is Y, so I would Z\".",
265
+ "First person is the voice of the method, never a claim about what the living person currently thinks: write \"this standard asks for...\", never \"he now believes...\".",
266
+ "Every figure you cite must already appear in the evidence or the frozen result, with its source ID. Cite the number, not an adjective about the number.",
267
+ "`what_changes_my_mind` must name a threshold or an observation that would flip the reading, not a wish for more research.",
268
+ "If the frozen stance is out_of_scope, say plainly and in the method's own voice which input it needs and why its absence is not a bearish view.",
269
+ ].join(" "),
270
+ `\`position_intent\` MUST be one of: ${intentsForStance(frozenOpinion?.stance).join(" | ")}. Those are the only intents the frozen stance admits; anything else is rejected without changing run state.`,
271
+ "Return ONLY one valid JSON object, no Markdown fence. Schema: {\"master\":\"stable id\",\"acknowledged_stance\":\"constructive|cautious|opposed|out_of_scope\",\"position_intent\":\"one of the allowed intents above\",\"voice\":{\"what_i_see\":\"string\",\"how_my_method_reads_it\":\"string\",\"would_i_act\":\"string\",\"what_changes_my_mind\":\"string\",\"where_i_disagree\":\"string\"},\"key_findings\":[\"string\"],\"disagreements\":[\"string\"],\"what_would_change_my_mind\":[\"string\"],\"source_ids\":[\"task:S1\"],\"confidence\":\"high|medium|low\"}.",
188
272
  `Bounded shared evidence JSON: ${evidence}`,
189
273
  ].join("\n\n");
190
274
  }
@@ -45,6 +45,10 @@ export function parseYahooChart(json, requested) {
45
45
  change_pct: changePct != null ? Number(changePct.toFixed(2)) : null,
46
46
  currency: meta.currency || null,
47
47
  exchange: meta.exchangeName || null,
48
+ instrument_type: meta.instrumentType || null,
49
+ short_name: meta.shortName || null,
50
+ long_name: meta.longName || null,
51
+ exchange_timezone: meta.exchangeTimezoneName || null,
48
52
  market_state: meta.marketState || null,
49
53
  quote_time: meta.regularMarketTime ? new Date(meta.regularMarketTime * 1000).toISOString() : null,
50
54
  source: "yahoo",
@@ -62,6 +66,7 @@ export function parseStooqCsv(csv, requested) {
62
66
  query: requested, symbol: cols[0] || requested, price: close,
63
67
  previous_close: null, change: null, change_pct: null,
64
68
  currency: null, exchange: "stooq", market_state: null,
69
+ instrument_type: null, short_name: null, long_name: null, exchange_timezone: null,
65
70
  quote_time: (cols[1] && cols[2]) ? `${cols[1]}T${cols[2]}` : null,
66
71
  source: "stooq", note: "delayed / EOD fallback, not real-time",
67
72
  };
package/mcp/lib/rpc.mjs CHANGED
@@ -446,7 +446,7 @@ export function tools() {
446
446
  { required: ["selection"], not: { anyOf: [{ required: ["selected_master_ids"] }, { required: ["select_all"] }] } },
447
447
  ],
448
448
  }, { readOnlyHint: false, destructiveHint: false, openWorldHint: false }),
449
- tool("plan_visible_run", "Create the visible-host-thread AlphaCouncil run after a confirmed master selection. Requires a one-time selection_receipt. Does NOT execute. You MUST then run every planned evidence agent and every selected master, record bull_researcher and bear_researcher, and only then record the portfolio_manager decision.", {
449
+ tool("plan_visible_run", "Create the visible-host-thread AlphaCouncil run after a confirmed master selection. Requires a one-time selection_receipt. Does NOT execute. Run every returned evidence_agent, then every returned master_agent. Physical v3 master agents explain a frozen deterministic stance and may not change it. Record all required bull/bear rounds before the portfolio_manager decision; PM rejects any returned master_agent that was not recorded.", {
450
450
  type: "object",
451
451
  properties: {
452
452
  symbol: common.symbol,
@@ -501,7 +501,7 @@ export function tools() {
501
501
  properties: common,
502
502
  required: ["symbol", "selection_receipt"],
503
503
  }),
504
- tool("analyze_symbol", "Collect evidence and write a manager-style decision summary. Set council_mode=quick for the bounded news-inclusive quick_v1 path; the default remains the full council.", {
504
+ tool("analyze_symbol", "Research an operating company, ETF, mutual fund or market index and write a manager-style decision summary. The instrument is classified before evidence routing: funds use holdings look-through, indices use aggregate methodology, and Company Facts screens apply only to operating companies. Set council_mode=quick for the bounded news-inclusive quick_v1 path; the default remains the full council.", {
505
505
  type: "object",
506
506
  properties: {
507
507
  ...common,
@@ -543,15 +543,27 @@ export function tools() {
543
543
  type: "object",
544
544
  properties: { language: common.language },
545
545
  }, { readOnlyHint: true, destructiveHint: false, openWorldHint: false }),
546
- tool("record_master_opinion", "Record one completed selected master-seat opinion into a planned visible run. Every reader-facing field must use the run language or the opinion is rejected without changing run state. Masters run AFTER every evidence packet is recorded and BEFORE the bull/bear debate, so the debate has their disagreements to argue with. A master may return stance=out_of_scope, which is a recorded conclusion rather than an abstention. Every selected seat must either report or be settled deterministically before the run can be complete.", {
546
+ tool("record_master_opinion", "Record one returned visible method-seat worker after evidence and before debate. For physical v3 seats, submit the method-voice schema from plan_visible_run: master, acknowledged_stance, statement, key_findings, disagreements, what_would_change_my_mind, source_ids and confidence. acknowledged_stance must equal the frozen stance; the worker cannot vote again. Legacy packets may use stance/verdict/summary. Reader-facing fields in the wrong run language are rejected without changing state. Every returned selected seat must be recorded before PM.", {
547
547
  type: "object",
548
548
  properties: {
549
549
  run_id: { type: "string" },
550
550
  master: { type: "string", enum: masterIds },
551
551
  packet: {
552
552
  type: "object",
553
- description: `The master_opinion packet. stance MUST be one of ${MASTER_STANCES.join(" | ")} -- anything else is recorded as out_of_scope and carries zero weight, so a seat whose stance does not survive normalization silently stops voting. Common synonyms (long/bullish, neutral/hold, short/bearish/avoid, n/a/abstain) are mapped for you.`,
554
- properties: { stance: { type: "string", enum: MASTER_STANCES } },
553
+ description: `Current physical v3 seats use acknowledged_stance + statement; acknowledged_stance MUST be one of ${MASTER_STANCES.join(" | ")} and match the frozen stance returned by plan_visible_run. The legacy stance/verdict/summary shape remains accepted only for a legacy seat.`,
554
+ properties: {
555
+ master: { type: "string", enum: masterIds },
556
+ acknowledged_stance: { type: "string", enum: MASTER_STANCES },
557
+ statement: { type: "string", minLength: 1 },
558
+ key_findings: { type: "array", items: { type: "string" } },
559
+ disagreements: { type: "array", items: { type: "string" } },
560
+ what_would_change_my_mind: { type: "array", items: { type: "string" } },
561
+ source_ids: { type: "array", items: { type: "string" } },
562
+ confidence: { type: "string", enum: ["high", "medium", "low"] },
563
+ stance: { type: "string", enum: MASTER_STANCES },
564
+ verdict: { type: "string" },
565
+ summary: { type: "string" },
566
+ },
555
567
  },
556
568
  thread_id: { type: "string" },
557
569
  },
@@ -651,7 +663,7 @@ export function tools() {
651
663
  properties: { symbols: { type: "array", items: { type: "string" } } },
652
664
  required: ["symbols"],
653
665
  }, { readOnlyHint: true, destructiveHint: false, openWorldHint: false }),
654
- tool("compose_research_brief", "Assemble the hard facts BEFORE the analysts search: quote, SEC filer profile, the mechanical screen with every computed metric, macro readings, and the industry chain map. Returns both the structured data and a prompt block that tells an analyst these numbers are already established and that its search exists to explain, extend and challenge them -- with the rule that a searched number never silently overwrites a filed one. Pass the returned `grounding` object to plan_visible_run so every analyst prompt carries it.", {
666
+ tool("compose_research_brief", "Classify the instrument and assemble hard facts BEFORE analysts search. Operating companies may receive SEC Company Facts or local-market financials; ETFs and funds receive a holdings look-through contract; indices receive an aggregate-index contract. The result also carries quote, applicable filer profile, options/macro/industry context, explicit not-applicable routes, typed facts, and a prompt block. A searched number never silently overwrites a filed one. Pass the returned `grounding` object to plan_visible_run so every analyst prompt carries it.", {
655
667
  type: "object",
656
668
  properties: {
657
669
  symbol: common.symbol,
@@ -679,7 +691,7 @@ export function tools() {
679
691
  type: "object",
680
692
  properties: {},
681
693
  }, { readOnlyHint: true, destructiveHint: false, openWorldHint: false }),
682
- tool("screen_ticker", "Run the mechanical elimination screen against a company's own SEC filings. No language model is involved: seven hard rules (10y ROE, 5y cumulative FCF, interest cover, gross margin, OCF/NI, net margin, dilution) with three exemptions, and every rejection names the metric, the measured value and the threshold. Rules whose inputs are missing from the filings are reported as skipped, never as passes. Surviving is not a recommendation -- it means the name is worth research time. US filers only; other markets need their own regulator feed.", {
694
+ tool("screen_ticker", "Run the mechanical elimination screen against an operating company's own SEC filings. It is not applicable to ETFs, funds or indices; use compose_research_brief so those instruments are classified and routed correctly. No language model is involved: seven hard rules (10y ROE, 5y cumulative FCF, interest cover, gross margin, OCF/NI, net margin, dilution) with three exemptions, and every rejection names the metric, value and threshold. Missing rules are skipped, never passes. Surviving is not a recommendation. US operating-company filers only.", {
683
695
  type: "object",
684
696
  properties: {
685
697
  cik: { type: "string", description: "SEC CIK. Use list_us_universe to resolve a ticker." },
@@ -761,7 +773,7 @@ export async function handleToolCall(id, params) {
761
773
  // no macro, and nothing in the output says so. Same reasoning as the preflight below:
762
774
  // the host that skips the optional step is exactly the host whose seats fail quietly.
763
775
  if (!run.grounding) {
764
- run.grounding = await gatherGrounding({ symbol: run.symbol, asOf: run.as_of })
776
+ run.grounding = await gatherGrounding({ symbol: run.symbol, asOf: run.as_of, language: run.language })
765
777
  .catch((error) => ({ error: String(error?.message || error), facts_unavailable: true }));
766
778
  saveRun(run);
767
779
  }
@@ -815,6 +827,10 @@ export async function handleToolCall(id, params) {
815
827
  idempotent_replay: result.idempotent_replay === true,
816
828
  report_quality: result.report_quality?.status,
817
829
  missing_report_items: result.report_quality?.missing || [],
830
+ ...(args.role === "portfolio_manager" ? {
831
+ handoff_contract: "inline_user_response_v1",
832
+ user_response_markdown: result.user_response_markdown || "",
833
+ } : {}),
818
834
  }),
819
835
  ));
820
836
  return;
@@ -886,10 +902,11 @@ export async function handleToolCall(id, params) {
886
902
  if (name === "compose_research_brief") {
887
903
  const grounding = await gatherGrounding({
888
904
  symbol: args.symbol, cik: args.cik, industry: args.industry,
889
- macro: args.macro !== false, asOf: args.as_of,
905
+ macro: args.macro !== false, asOf: args.as_of, language: resolveLanguage(args),
890
906
  });
891
907
  const block = groundingBlock(grounding, resolveLanguage(args));
892
908
  const facts = [
909
+ grounding.instrument ? `instrument (${grounding.instrument.asset_type}/${grounding.instrument.research_model})` : null,
893
910
  grounding.quote ? "quote" : null,
894
911
  grounding.filer ? "filer profile" : null,
895
912
  grounding.screen ? `screen (${grounding.screen.rules_computed}/${grounding.screen.rules_total} rules)` : null,
@@ -898,7 +915,7 @@ export async function handleToolCall(id, params) {
898
915
  ].filter(Boolean);
899
916
  sendResult(id, jsonContent(
900
917
  groundingDashboard(grounding, resolveLanguage(args)),
901
- { grounding, prompt_block: block, dashboard: groundingDashboard(grounding, resolveLanguage(args)) },
918
+ { grounding, prompt_block: block, facts_available: facts, dashboard: groundingDashboard(grounding, resolveLanguage(args)) },
902
919
  ));
903
920
  return;
904
921
  }
@@ -4,7 +4,7 @@ import { join } from "node:path";
4
4
  import { DEBATE_ROLES, RUNS_DIR } from "./constants.mjs";
5
5
  import { invalidParams } from "./errors.mjs";
6
6
  import { readJson, writeJson } from "./fsutil.mjs";
7
- import { agentState, completenessStatus, sourceManifest, taskState, verificationStatus } from "./gates.mjs";
7
+ import { agentState, completenessStatus, masterSeatIncomplete, sourceManifest, taskState, verificationStatus } from "./gates.mjs";
8
8
 
9
9
  export { agentState, taskState };
10
10
 
@@ -52,8 +52,7 @@ export function statusSnapshot(run) {
52
52
  const verifierVerdicts = Array.isArray(run.verifier_verdicts) ? run.verifier_verdicts : [];
53
53
  const selectedMasters = Array.isArray(run.masters) ? run.masters : [];
54
54
  const recordedMasters = (run.master_opinions || []).map((opinion) => opinion.master);
55
- const recordedSet = new Set(recordedMasters);
56
- const pendingMasters = selectedMasters.filter((master) => !recordedSet.has(master));
55
+ const pendingMasters = selectedMasters.filter((master) => masterSeatIncomplete(run, master));
57
56
  const visibleDebate = run.execution_mode === "visible_host_threads" ? run.visible_debate : null;
58
57
  const visibleDebateRounds = visibleDebate
59
58
  ? Object.fromEntries(["bull_researcher", "bear_researcher"].map((role) => [
@@ -64,6 +63,9 @@ export function statusSnapshot(run) {
64
63
  return {
65
64
  run_id: run.run_id,
66
65
  symbol: run.symbol,
66
+ asset_type: run.grounding?.instrument?.asset_type || "unknown",
67
+ research_model: run.grounding?.instrument?.research_model || "unknown",
68
+ instrument_classification_source: run.grounding?.instrument?.classification_source || "unknown",
67
69
  as_of: run.as_of,
68
70
  language: run.language,
69
71
  execution_mode: run.execution_mode,
package/mcp/lib/sec.mjs CHANGED
@@ -48,6 +48,38 @@ async function secJson(url, timeoutMs = LIMITS.QUOTE_FETCH_MS * 2, upstreamSigna
48
48
  }
49
49
  }
50
50
 
51
+ /** Raw filing index for one registrant. Callers that need form types read this, not `fetchSubmissions`. */
52
+ export async function fetchFilingIndex(cik, { signal } = {}) {
53
+ const padded = String(cik).replace(/\D/gu, "").padStart(10, "0");
54
+ if (padded.length !== 10) throw invalidParams(`invalid CIK: ${cik}`);
55
+ const data = await secJson(`https://data.sec.gov/submissions/CIK${padded}.json`, LIMITS.QUOTE_FETCH_MS * 2, signal);
56
+ const recent = data?.filings?.recent || {};
57
+ const rows = (recent.form || []).map((form, index) => ({
58
+ form,
59
+ accession: recent.accessionNumber?.[index] || null,
60
+ primary_document: recent.primaryDocument?.[index] || null,
61
+ filing_date: recent.filingDate?.[index] || null,
62
+ report_date: recent.reportDate?.[index] || null,
63
+ })).filter((row) => row.accession && row.primary_document);
64
+ return { cik: padded, name: data?.name || null, filings: rows };
65
+ }
66
+
67
+ /** One filing document, fetched as text. Same throttle and User-Agent as every other call. */
68
+ export async function fetchFilingDocument(cik, accession, document, { signal } = {}) {
69
+ await throttle();
70
+ const stripped = String(cik).replace(/\D/gu, "").replace(/^0+/u, "");
71
+ const folder = String(accession).replace(/-/gu, "");
72
+ const url = `https://www.sec.gov/Archives/edgar/data/${stripped}/${folder}/${document}`;
73
+ const abort = linkedAbort(LIMITS.QUOTE_FETCH_MS * 2, signal);
74
+ try {
75
+ const res = await fetch(url, { signal: abort.signal, headers: { "User-Agent": UA } });
76
+ if (!res.ok) throw new Error(`HTTP ${res.status} for ${url}`);
77
+ return { url, text: await res.text() };
78
+ } finally {
79
+ abort.cleanup();
80
+ }
81
+ }
82
+
51
83
  /** The full US listed universe: ~10k entries of {cik, ticker, title}. */
52
84
  export async function fetchUniverse({ signal } = {}) {
53
85
  const raw = await secJson("https://www.sec.gov/files/company_tickers.json", LIMITS.QUOTE_FETCH_MS * 2, signal);
@@ -93,6 +93,12 @@ export function groundingDashboard(g, language = "English") {
93
93
  out.push(`# ${t("Research dashboard", "研究总览")}${g.quote?.symbol ? ` — ${g.quote.symbol}` : ""}`);
94
94
 
95
95
  const facts = [];
96
+ if (g.instrument) facts.push([
97
+ t("Instrument", "资产类型"),
98
+ g.instrument.asset_type,
99
+ g.instrument.research_model,
100
+ g.instrument.classification_source,
101
+ ]);
96
102
  if (g.filer) facts.push([t("Filer", "主体"), `${g.filer.name} (SIC ${g.filer.sic ?? "?"})`, g.filer.sic_description ?? "-", "SEC"]);
97
103
  if (g.quote) {
98
104
  facts.push([t("Quote", "行情"), `${g.quote.price}${g.quote.currency ? " " + g.quote.currency : ""}`,
@@ -146,5 +152,10 @@ export function groundingDashboard(g, language = "English") {
146
152
  ...g.unavailable.map((u) => `- ${u}`));
147
153
  }
148
154
 
155
+ if (g.not_applicable?.length) {
156
+ out.push("", `**${t("Not applicable for this instrument", "本资产不适用项")}**`, "",
157
+ ...g.not_applicable.map((item) => `- ${item}`));
158
+ }
159
+
149
160
  return out.join("\n");
150
161
  }
@@ -0,0 +1,122 @@
1
+ /**
2
+ * The reader-facing shape of a method seat's statement.
3
+ *
4
+ * A frozen stance plus a paragraph of machine diagnostics is technically complete and
5
+ * practically useless: "master_buffett: no_required_fact_types_present" tells a reader that
6
+ * something broke, not what the method concluded. This module defines the five things a
7
+ * reader actually wants -- what the method saw, how its own standard reads that, whether it
8
+ * would act, what would change it, and where it disagrees with the room -- and the vocabulary
9
+ * for the one field that expresses intent.
10
+ *
11
+ * The stance stays frozen and deterministic. Intent is a NARROWING of the stance, never a
12
+ * second vote: each stance admits only intents that mean the same thing, so a worker can pick
13
+ * the honest shade without being able to convert an `opposed` into a `would_buy`.
14
+ */
15
+
16
+ import { localized } from "./lang.mjs";
17
+
18
+ export const POSITION_INTENTS = Object.freeze([
19
+ "would_buy",
20
+ "would_add",
21
+ "would_hold",
22
+ "would_watch",
23
+ "would_pass",
24
+ "would_avoid",
25
+ "not_in_my_circle",
26
+ ]);
27
+
28
+ /**
29
+ * Which intents each frozen stance admits. Enforced server-side on the way in, exactly like
30
+ * the acknowledged-stance check, so a persuasive narrative cannot widen its own mandate.
31
+ */
32
+ const INTENTS_BY_STANCE = Object.freeze({
33
+ constructive: Object.freeze(["would_buy", "would_add"]),
34
+ cautious: Object.freeze(["would_hold", "would_watch"]),
35
+ opposed: Object.freeze(["would_pass", "would_avoid"]),
36
+ out_of_scope: Object.freeze(["not_in_my_circle"]),
37
+ });
38
+
39
+ export function intentsForStance(stance) {
40
+ return INTENTS_BY_STANCE[String(stance || "")] || INTENTS_BY_STANCE.out_of_scope;
41
+ }
42
+
43
+ export function defaultIntentForStance(stance) {
44
+ return intentsForStance(stance)[0];
45
+ }
46
+
47
+ export function isIntentAllowed(intent, stance) {
48
+ return intentsForStance(stance).includes(String(intent || ""));
49
+ }
50
+
51
+ /** The five reader-facing fields, in the order a reader wants them. */
52
+ export const VOICE_FIELDS = Object.freeze([
53
+ "what_i_see",
54
+ "how_my_method_reads_it",
55
+ "would_i_act",
56
+ "what_changes_my_mind",
57
+ "where_i_disagree",
58
+ ]);
59
+
60
+ const FIELD_LABELS = Object.freeze({
61
+ what_i_see: { en: "What I see", zh: "我看到的", ja: "私が見ているもの", ko: "내가 보는 것" },
62
+ how_my_method_reads_it: {
63
+ en: "How my standard reads it", zh: "用我的标准怎么看", ja: "私の基準での読み方", ko: "내 기준으로 본 해석",
64
+ },
65
+ would_i_act: { en: "Would I act", zh: "我会不会动手", ja: "私なら動くか", ko: "나라면 움직이는가" },
66
+ what_changes_my_mind: {
67
+ en: "What would change my mind", zh: "什么会让我改主意", ja: "何があれば考えを変えるか", ko: "무엇이 내 생각을 바꾸는가",
68
+ },
69
+ where_i_disagree: { en: "Where I disagree", zh: "我和谁分歧", ja: "どこで意見が分かれるか", ko: "어디서 의견이 갈리는가" },
70
+ });
71
+
72
+ export function voiceFieldLabel(field, language) {
73
+ return localized(language, FIELD_LABELS[field] || {}) || field;
74
+ }
75
+
76
+ const INTENT_LABELS = Object.freeze({
77
+ would_buy: { en: "would buy", zh: "会买", ja: "買う", ko: "매수한다" },
78
+ would_add: { en: "would add", zh: "会加仓", ja: "買い増す", ko: "추가 매수한다" },
79
+ would_hold: { en: "would hold", zh: "会持有", ja: "保有する", ko: "보유한다" },
80
+ would_watch: { en: "would watch", zh: "会观望", ja: "様子を見る", ko: "지켜본다" },
81
+ would_pass: { en: "would pass", zh: "会放弃", ja: "見送る", ko: "보류한다" },
82
+ would_avoid: { en: "would avoid", zh: "会回避", ja: "回避する", ko: "회피한다" },
83
+ not_in_my_circle: {
84
+ en: "outside my circle of competence",
85
+ zh: "在我的能力圈之外",
86
+ ja: "私の能力の輪の外",
87
+ ko: "내 능력 범위 밖",
88
+ },
89
+ });
90
+
91
+ export function intentLabel(intent, language) {
92
+ return localized(language, INTENT_LABELS[intent] || {}) || intent;
93
+ }
94
+
95
+ /**
96
+ * The disclaimer that must accompany first-person method prose.
97
+ *
98
+ * First person is what makes the output readable, and it is also exactly what could be
99
+ * mistaken for a quotation. The wording is deliberate: it describes what the METHOD concludes,
100
+ * and never asserts what the living person currently thinks.
101
+ */
102
+ export function voiceDisclaimer(language) {
103
+ return localized(language, {
104
+ en: "First-person reasoning by a project-derived method model. Not a quotation, endorsement, or current view of the named person.",
105
+ zh: "以下为项目派生方法模型的第一人称推演,非本人言论、授权或当前观点。",
106
+ ja: "以下はプロジェクト由来のメソッドモデルによる一人称の推論です。本人の発言・承認・現在の見解ではありません。",
107
+ ko: "아래는 프로젝트 파생 방법론 모델의 1인칭 추론입니다. 본인의 발언·승인·현재 견해가 아닙니다.",
108
+ });
109
+ }
110
+
111
+ /**
112
+ * Compose the five fields into one continuous statement for surfaces that carry a single
113
+ * line per seat. Empty fields are dropped rather than rendered as an empty heading.
114
+ */
115
+ export function composeVoiceStatement(voice, language) {
116
+ if (!voice || typeof voice !== "object") return "";
117
+ return VOICE_FIELDS
118
+ .map((field) => [field, String(voice[field] ?? "").trim()])
119
+ .filter(([, text]) => text.length > 0)
120
+ .map(([field, text]) => `${voiceFieldLabel(field, language)}: ${text}`)
121
+ .join(" ");
122
+ }