alphacouncil-agent 0.9.4 → 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.
Files changed (478) 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 +22 -7
  5. package/CHANGELOG.md +97 -0
  6. package/CLAUDE.md +21 -3
  7. package/README.ja.md +9 -5
  8. package/README.md +15 -7
  9. package/README.zh-CN.md +12 -7
  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 +4 -4
  21. package/docs/personas.md +2 -1
  22. package/docs/plans/v1.0-roadmap.md +487 -0
  23. package/docs/releases/v0.9.5.md +96 -0
  24. package/docs/releases/v1.0.0.md +164 -0
  25. package/docs/report-contract.md +30 -6
  26. package/knowledge/ai-assisted-solo/experiments/runs/a.json +13 -13
  27. package/knowledge/ai-assisted-solo/experiments/runs/b.json +2 -2
  28. package/knowledge/ai-assisted-solo/experiments/runs/c.json +2 -2
  29. package/knowledge/ai-assisted-solo/experiments/runs/d13.json +126 -126
  30. package/knowledge/ai-assisted-solo/experiments/runs/d26.json +274 -254
  31. package/knowledge/ai-assisted-solo/experiments/runs/e-d13.json +129 -129
  32. package/knowledge/ai-assisted-solo/experiments/runs/e-d26.json +277 -257
  33. package/knowledge/ai-assisted-solo/experiments/runs/h_ai_reference.json +278 -258
  34. package/knowledge/ai-assisted-solo/experiments/simulation-input.json +7278 -556
  35. package/knowledge/ai-assisted-solo/experiments/simulation-manifest.json +22 -22
  36. 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
  37. 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
  38. 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
  39. 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
  40. 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
  41. 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
  42. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_bogle/reviews/expected_return_over_long_bond.ai-review.json +277 -0
  43. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_bogle/reviews/fundamental_expected_return.ai-review.json +277 -0
  44. 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
  45. 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
  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
  47. 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
  48. 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
  49. 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
  50. 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
  51. 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
  52. 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
  53. 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
  54. 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
  55. 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
  56. 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
  57. 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
  58. 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
  59. 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
  60. 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
  61. 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
  62. 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
  63. 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
  64. 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
  65. 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
  66. 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
  67. 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
  68. 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
  69. 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
  70. 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
  71. 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
  72. 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
  73. 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
  74. 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
  75. 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
  76. 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
  77. 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
  78. 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
  79. 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
  80. 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
  81. 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
  82. 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
  83. 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
  84. 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
  85. 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
  86. 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
  87. 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
  88. 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
  89. 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
  90. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/review-manifest.json +288 -270
  91. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-semantic-adjudications/index.json +2 -2
  92. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-semantic-extractions/index.json +2 -2
  93. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-semantic-skeptic-reviews/index.json +2 -2
  94. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-source-prereviews/index.json +6 -2
  95. package/knowledge/solo-test/masters/master_ackman/decision_policy.json +122 -11
  96. package/knowledge/solo-test/masters/master_ackman/doctrine.jsonl +2 -2
  97. package/knowledge/solo-test/masters/master_ackman/manifest.json +13 -6
  98. package/knowledge/solo-test/masters/master_ackman/provisional-index.json +3 -3
  99. package/knowledge/solo-test/masters/master_ackman/sources.jsonl +1 -1
  100. package/knowledge/solo-test/masters/master_ackman/tools.json +56 -30
  101. package/knowledge/solo-test/masters/master_aschenbrenner/decision_policy.json +101 -10
  102. package/knowledge/solo-test/masters/master_aschenbrenner/doctrine.jsonl +2 -2
  103. package/knowledge/solo-test/masters/master_aschenbrenner/manifest.json +12 -4
  104. package/knowledge/solo-test/masters/master_aschenbrenner/provisional-index.json +3 -3
  105. package/knowledge/solo-test/masters/master_aschenbrenner/sources.jsonl +1 -1
  106. package/knowledge/solo-test/masters/master_aschenbrenner/tools.json +56 -30
  107. package/knowledge/solo-test/masters/master_asness/decision_policy.json +89 -10
  108. package/knowledge/solo-test/masters/master_asness/doctrine.jsonl +2 -2
  109. package/knowledge/solo-test/masters/master_asness/manifest.json +11 -4
  110. package/knowledge/solo-test/masters/master_asness/provisional-index.json +3 -3
  111. package/knowledge/solo-test/masters/master_asness/sources.jsonl +1 -1
  112. package/knowledge/solo-test/masters/master_asness/tools.json +56 -30
  113. package/knowledge/solo-test/masters/master_bogle/counterfactuals.jsonl +0 -0
  114. package/knowledge/solo-test/masters/master_bogle/decision_cases.jsonl +0 -0
  115. package/knowledge/solo-test/masters/master_bogle/decision_policy.json +170 -0
  116. package/knowledge/solo-test/masters/master_bogle/doctrine.jsonl +14 -0
  117. package/knowledge/solo-test/masters/master_bogle/evaluation/calibration_cases.jsonl +0 -0
  118. package/knowledge/solo-test/masters/master_bogle/evaluation/experiments.json +5 -0
  119. package/knowledge/solo-test/masters/master_bogle/evaluation/golden_cases.jsonl +0 -0
  120. package/knowledge/solo-test/masters/master_bogle/evaluation/pairwise_cases.jsonl +0 -0
  121. package/knowledge/solo-test/masters/master_bogle/failures.jsonl +0 -0
  122. package/knowledge/solo-test/masters/master_bogle/manifest.json +141 -0
  123. package/knowledge/solo-test/masters/master_bogle/memory_policy.json +5 -0
  124. package/knowledge/solo-test/masters/master_bogle/provisional-index.json +41 -0
  125. package/knowledge/solo-test/masters/master_bogle/research_policy.json +11 -0
  126. package/knowledge/solo-test/masters/master_bogle/sources.jsonl +1 -0
  127. package/knowledge/solo-test/masters/master_bogle/tools.json +120 -0
  128. package/knowledge/solo-test/masters/master_bogle/voice.en.md +7 -0
  129. package/knowledge/solo-test/masters/master_bogle/voice.zh.md +7 -0
  130. package/knowledge/solo-test/masters/master_buffett/decision_policy.json +102 -11
  131. package/knowledge/solo-test/masters/master_buffett/doctrine.jsonl +2 -2
  132. package/knowledge/solo-test/masters/master_buffett/manifest.json +10 -4
  133. package/knowledge/solo-test/masters/master_buffett/provisional-index.json +3 -3
  134. package/knowledge/solo-test/masters/master_buffett/sources.jsonl +1 -1
  135. package/knowledge/solo-test/masters/master_buffett/tools.json +55 -29
  136. package/knowledge/solo-test/masters/master_burry/decision_policy.json +102 -12
  137. package/knowledge/solo-test/masters/master_burry/doctrine.jsonl +2 -2
  138. package/knowledge/solo-test/masters/master_burry/manifest.json +12 -6
  139. package/knowledge/solo-test/masters/master_burry/provisional-index.json +3 -3
  140. package/knowledge/solo-test/masters/master_burry/sources.jsonl +1 -1
  141. package/knowledge/solo-test/masters/master_burry/tools.json +56 -30
  142. package/knowledge/solo-test/masters/master_cathie_wood/decision_policy.json +74 -12
  143. package/knowledge/solo-test/masters/master_cathie_wood/doctrine.jsonl +2 -2
  144. package/knowledge/solo-test/masters/master_cathie_wood/manifest.json +12 -6
  145. package/knowledge/solo-test/masters/master_cathie_wood/provisional-index.json +3 -3
  146. package/knowledge/solo-test/masters/master_cathie_wood/sources.jsonl +1 -1
  147. package/knowledge/solo-test/masters/master_cathie_wood/tools.json +56 -30
  148. package/knowledge/solo-test/masters/master_dalio/decision_policy.json +123 -16
  149. package/knowledge/solo-test/masters/master_dalio/doctrine.jsonl +2 -2
  150. package/knowledge/solo-test/masters/master_dalio/manifest.json +10 -4
  151. package/knowledge/solo-test/masters/master_dalio/provisional-index.json +3 -3
  152. package/knowledge/solo-test/masters/master_dalio/sources.jsonl +1 -1
  153. package/knowledge/solo-test/masters/master_dalio/tools.json +56 -30
  154. package/knowledge/solo-test/masters/master_damodaran/decision_policy.json +58 -10
  155. package/knowledge/solo-test/masters/master_damodaran/doctrine.jsonl +2 -2
  156. package/knowledge/solo-test/masters/master_damodaran/manifest.json +9 -4
  157. package/knowledge/solo-test/masters/master_damodaran/provisional-index.json +3 -3
  158. package/knowledge/solo-test/masters/master_damodaran/sources.jsonl +1 -1
  159. package/knowledge/solo-test/masters/master_damodaran/tools.json +54 -28
  160. package/knowledge/solo-test/masters/master_druckenmiller/decision_policy.json +89 -10
  161. package/knowledge/solo-test/masters/master_druckenmiller/doctrine.jsonl +2 -2
  162. package/knowledge/solo-test/masters/master_druckenmiller/manifest.json +11 -4
  163. package/knowledge/solo-test/masters/master_druckenmiller/provisional-index.json +3 -3
  164. package/knowledge/solo-test/masters/master_druckenmiller/sources.jsonl +1 -1
  165. package/knowledge/solo-test/masters/master_druckenmiller/tools.json +55 -29
  166. package/knowledge/solo-test/masters/master_duan_yongping/decision_policy.json +138 -13
  167. package/knowledge/solo-test/masters/master_duan_yongping/doctrine.jsonl +2 -2
  168. package/knowledge/solo-test/masters/master_duan_yongping/manifest.json +17 -7
  169. package/knowledge/solo-test/masters/master_duan_yongping/provisional-index.json +3 -3
  170. package/knowledge/solo-test/masters/master_duan_yongping/sources.jsonl +1 -1
  171. package/knowledge/solo-test/masters/master_duan_yongping/tools.json +82 -30
  172. package/knowledge/solo-test/masters/master_fisher/decision_policy.json +102 -11
  173. package/knowledge/solo-test/masters/master_fisher/doctrine.jsonl +2 -2
  174. package/knowledge/solo-test/masters/master_fisher/manifest.json +13 -6
  175. package/knowledge/solo-test/masters/master_fisher/provisional-index.json +3 -3
  176. package/knowledge/solo-test/masters/master_fisher/sources.jsonl +1 -1
  177. package/knowledge/solo-test/masters/master_fisher/tools.json +58 -32
  178. package/knowledge/solo-test/masters/master_forensic_short/decision_policy.json +93 -14
  179. package/knowledge/solo-test/masters/master_forensic_short/doctrine.jsonl +2 -2
  180. package/knowledge/solo-test/masters/master_forensic_short/manifest.json +6 -4
  181. package/knowledge/solo-test/masters/master_forensic_short/provisional-index.json +3 -3
  182. package/knowledge/solo-test/masters/master_forensic_short/sources.jsonl +1 -1
  183. package/knowledge/solo-test/masters/master_forensic_short/tools.json +53 -27
  184. package/knowledge/solo-test/masters/master_graham/decision_policy.json +103 -12
  185. package/knowledge/solo-test/masters/master_graham/doctrine.jsonl +2 -2
  186. package/knowledge/solo-test/masters/master_graham/manifest.json +12 -4
  187. package/knowledge/solo-test/masters/master_graham/provisional-index.json +3 -3
  188. package/knowledge/solo-test/masters/master_graham/sources.jsonl +1 -1
  189. package/knowledge/solo-test/masters/master_graham/tools.json +67 -28
  190. package/knowledge/solo-test/masters/master_jhunjhunwala/decision_policy.json +77 -12
  191. package/knowledge/solo-test/masters/master_jhunjhunwala/doctrine.jsonl +2 -2
  192. package/knowledge/solo-test/masters/master_jhunjhunwala/manifest.json +11 -6
  193. package/knowledge/solo-test/masters/master_jhunjhunwala/provisional-index.json +3 -3
  194. package/knowledge/solo-test/masters/master_jhunjhunwala/sources.jsonl +1 -1
  195. package/knowledge/solo-test/masters/master_jhunjhunwala/tools.json +54 -28
  196. package/knowledge/solo-test/masters/master_klarman/decision_policy.json +105 -14
  197. package/knowledge/solo-test/masters/master_klarman/doctrine.jsonl +2 -2
  198. package/knowledge/solo-test/masters/master_klarman/manifest.json +8 -2
  199. package/knowledge/solo-test/masters/master_klarman/provisional-index.json +3 -3
  200. package/knowledge/solo-test/masters/master_klarman/sources.jsonl +1 -1
  201. package/knowledge/solo-test/masters/master_klarman/tools.json +55 -29
  202. package/knowledge/solo-test/masters/master_li_lu/decision_policy.json +101 -10
  203. package/knowledge/solo-test/masters/master_li_lu/doctrine.jsonl +2 -2
  204. package/knowledge/solo-test/masters/master_li_lu/manifest.json +13 -6
  205. package/knowledge/solo-test/masters/master_li_lu/provisional-index.json +3 -3
  206. package/knowledge/solo-test/masters/master_li_lu/sources.jsonl +1 -1
  207. package/knowledge/solo-test/masters/master_li_lu/tools.json +58 -32
  208. package/knowledge/solo-test/masters/master_lynch/decision_policy.json +127 -16
  209. package/knowledge/solo-test/masters/master_lynch/doctrine.jsonl +2 -2
  210. package/knowledge/solo-test/masters/master_lynch/manifest.json +14 -6
  211. package/knowledge/solo-test/masters/master_lynch/provisional-index.json +3 -3
  212. package/knowledge/solo-test/masters/master_lynch/sources.jsonl +1 -1
  213. package/knowledge/solo-test/masters/master_lynch/tools.json +67 -28
  214. package/knowledge/solo-test/masters/master_marks/decision_policy.json +71 -9
  215. package/knowledge/solo-test/masters/master_marks/doctrine.jsonl +2 -2
  216. package/knowledge/solo-test/masters/master_marks/manifest.json +11 -6
  217. package/knowledge/solo-test/masters/master_marks/provisional-index.json +3 -3
  218. package/knowledge/solo-test/masters/master_marks/sources.jsonl +1 -1
  219. package/knowledge/solo-test/masters/master_marks/tools.json +54 -28
  220. package/knowledge/solo-test/masters/master_munger/decision_policy.json +141 -16
  221. package/knowledge/solo-test/masters/master_munger/doctrine.jsonl +2 -2
  222. package/knowledge/solo-test/masters/master_munger/manifest.json +10 -6
  223. package/knowledge/solo-test/masters/master_munger/provisional-index.json +3 -3
  224. package/knowledge/solo-test/masters/master_munger/sources.jsonl +1 -1
  225. package/knowledge/solo-test/masters/master_munger/tools.json +52 -26
  226. package/knowledge/solo-test/masters/master_natenberg/decision_policy.json +59 -11
  227. package/knowledge/solo-test/masters/master_natenberg/doctrine.jsonl +2 -2
  228. package/knowledge/solo-test/masters/master_natenberg/manifest.json +9 -6
  229. package/knowledge/solo-test/masters/master_natenberg/provisional-index.json +3 -3
  230. package/knowledge/solo-test/masters/master_natenberg/sources.jsonl +1 -1
  231. package/knowledge/solo-test/masters/master_natenberg/tools.json +50 -24
  232. package/knowledge/solo-test/masters/master_pabrai/decision_policy.json +125 -14
  233. package/knowledge/solo-test/masters/master_pabrai/doctrine.jsonl +2 -2
  234. package/knowledge/solo-test/masters/master_pabrai/manifest.json +8 -2
  235. package/knowledge/solo-test/masters/master_pabrai/provisional-index.json +3 -3
  236. package/knowledge/solo-test/masters/master_pabrai/sources.jsonl +1 -1
  237. package/knowledge/solo-test/masters/master_pabrai/tools.json +55 -29
  238. package/knowledge/solo-test/masters/master_simons/decision_policy.json +59 -11
  239. package/knowledge/solo-test/masters/master_simons/doctrine.jsonl +2 -2
  240. package/knowledge/solo-test/masters/master_simons/manifest.json +8 -4
  241. package/knowledge/solo-test/masters/master_simons/provisional-index.json +3 -3
  242. package/knowledge/solo-test/masters/master_simons/sources.jsonl +1 -1
  243. package/knowledge/solo-test/masters/master_simons/tools.json +43 -30
  244. package/knowledge/solo-test/masters/master_sinclair/decision_policy.json +59 -11
  245. package/knowledge/solo-test/masters/master_sinclair/doctrine.jsonl +2 -2
  246. package/knowledge/solo-test/masters/master_sinclair/manifest.json +8 -6
  247. package/knowledge/solo-test/masters/master_sinclair/provisional-index.json +3 -3
  248. package/knowledge/solo-test/masters/master_sinclair/sources.jsonl +1 -1
  249. package/knowledge/solo-test/masters/master_sinclair/tools.json +54 -28
  250. package/knowledge/solo-test/masters/master_soros/decision_policy.json +98 -10
  251. package/knowledge/solo-test/masters/master_soros/doctrine.jsonl +2 -2
  252. package/knowledge/solo-test/masters/master_soros/manifest.json +10 -7
  253. package/knowledge/solo-test/masters/master_soros/provisional-index.json +3 -3
  254. package/knowledge/solo-test/masters/master_soros/sources.jsonl +1 -1
  255. package/knowledge/solo-test/masters/master_soros/tools.json +54 -28
  256. package/knowledge/solo-test/masters/master_taleb/decision_policy.json +124 -13
  257. package/knowledge/solo-test/masters/master_taleb/doctrine.jsonl +2 -2
  258. package/knowledge/solo-test/masters/master_taleb/manifest.json +9 -5
  259. package/knowledge/solo-test/masters/master_taleb/provisional-index.json +3 -3
  260. package/knowledge/solo-test/masters/master_taleb/sources.jsonl +1 -1
  261. package/knowledge/solo-test/masters/master_taleb/tools.json +50 -24
  262. package/knowledge/solo-test/masters/master_thorp/decision_policy.json +61 -13
  263. package/knowledge/solo-test/masters/master_thorp/doctrine.jsonl +2 -2
  264. package/knowledge/solo-test/masters/master_thorp/manifest.json +11 -6
  265. package/knowledge/solo-test/masters/master_thorp/provisional-index.json +3 -3
  266. package/knowledge/solo-test/masters/master_thorp/sources.jsonl +1 -1
  267. package/knowledge/solo-test/masters/master_thorp/tools.json +56 -30
  268. package/knowledge/solo-test/persona-v3-solo-test-formulas/compilation-manifest.json +290 -264
  269. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_ackman/components/tools.json +58 -32
  270. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_ackman/provisional-derivations/market_capitalisation.derived-proxy-evidence.json +76 -0
  271. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_ackman/provisional-derivations/owner_earnings_yield.derived-proxy-evidence.json +76 -0
  272. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_aschenbrenner/components/tools.json +58 -32
  273. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_aschenbrenner/provisional-derivations/market_capitalisation.derived-proxy-evidence.json +76 -0
  274. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_aschenbrenner/provisional-derivations/price_implied_cash_yield.derived-proxy-evidence.json +76 -0
  275. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_asness/components/tools.json +58 -32
  276. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_asness/provisional-derivations/nominal_earnings_yield_gap.derived-proxy-evidence.json +76 -0
  277. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_asness/provisional-derivations/real_earnings_yield_gap.derived-proxy-evidence.json +76 -0
  278. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_bogle/components/tools.json +120 -0
  279. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_bogle/provisional-derivations/expected_return_over_long_bond.derived-proxy-evidence.json +77 -0
  280. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_bogle/provisional-derivations/fundamental_expected_return.derived-proxy-evidence.json +76 -0
  281. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_buffett/components/tools.json +57 -31
  282. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_buffett/provisional-derivations/market_capitalisation.derived-proxy-evidence.json +76 -0
  283. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_buffett/provisional-derivations/owner_earnings_yield.derived-proxy-evidence.json +76 -0
  284. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_burry/components/tools.json +58 -32
  285. 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
  286. 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
  287. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_cathie_wood/components/tools.json +58 -32
  288. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_cathie_wood/provisional-derivations/current_cash_yield.derived-proxy-evidence.json +76 -0
  289. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_cathie_wood/provisional-derivations/market_capitalisation.derived-proxy-evidence.json +76 -0
  290. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_dalio/components/tools.json +58 -32
  291. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_dalio/provisional-derivations/policy_real_rate.derived-proxy-evidence.json +76 -0
  292. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_dalio/provisional-derivations/real_curve_slope.derived-proxy-evidence.json +76 -0
  293. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_damodaran/components/tools.json +56 -30
  294. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_damodaran/provisional-derivations/implied_equity_risk_premium.derived-proxy-evidence.json +76 -0
  295. 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
  296. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_druckenmiller/components/tools.json +57 -31
  297. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_druckenmiller/provisional-derivations/liquidity_curve_impulse.derived-proxy-evidence.json +76 -0
  298. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_druckenmiller/provisional-derivations/policy_real_rate.derived-proxy-evidence.json +76 -0
  299. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_duan_yongping/components/tools.json +84 -32
  300. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_duan_yongping/provisional-derivations/five_year_opportunity_cost.derived-proxy-evidence.json +102 -0
  301. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_duan_yongping/provisional-derivations/margin_retention.derived-proxy-evidence.json +76 -0
  302. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_fisher/components/tools.json +60 -34
  303. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_fisher/provisional-derivations/margin_retention.derived-proxy-evidence.json +76 -0
  304. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_fisher/provisional-derivations/reinvestment_spread.derived-proxy-evidence.json +76 -0
  305. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_forensic_short/components/tools.json +55 -29
  306. 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
  307. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_forensic_short/provisional-derivations/cash_cover_of_leverage.derived-proxy-evidence.json +76 -0
  308. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_graham/components/tools.json +69 -30
  309. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_graham/provisional-derivations/defensive_hurdle_base.derived-proxy-evidence.json +89 -0
  310. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_graham/provisional-derivations/half_normalised_earnings_yield.derived-proxy-evidence.json +76 -0
  311. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_jhunjhunwala/components/tools.json +56 -30
  312. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_jhunjhunwala/provisional-derivations/cash_quality_gap.derived-proxy-evidence.json +76 -0
  313. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_jhunjhunwala/provisional-derivations/real_structural_growth.derived-proxy-evidence.json +76 -0
  314. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_klarman/components/tools.json +57 -31
  315. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_klarman/provisional-derivations/downside_asset_coverage.derived-proxy-evidence.json +76 -0
  316. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_klarman/provisional-derivations/market_capitalisation.derived-proxy-evidence.json +76 -0
  317. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_li_lu/components/tools.json +60 -34
  318. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_li_lu/provisional-derivations/cash_backed_decade_return.derived-proxy-evidence.json +76 -0
  319. 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
  320. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_lynch/components/tools.json +69 -30
  321. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_lynch/provisional-derivations/growth_justified_capitalisation.derived-proxy-evidence.json +89 -0
  322. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_lynch/provisional-derivations/market_capitalisation.derived-proxy-evidence.json +76 -0
  323. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_marks/components/tools.json +56 -30
  324. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_marks/provisional-derivations/credit_cycle_position.derived-proxy-evidence.json +76 -0
  325. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_marks/provisional-derivations/equity_over_corporate_debt.derived-proxy-evidence.json +76 -0
  326. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_munger/components/tools.json +54 -28
  327. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_munger/provisional-derivations/debt_service_cushion.derived-proxy-evidence.json +76 -0
  328. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_munger/provisional-derivations/reported_earnings_cash_gap.derived-proxy-evidence.json +76 -0
  329. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_natenberg/components/tools.json +52 -26
  330. 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
  331. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_natenberg/provisional-derivations/round_trip_cost.derived-proxy-evidence.json +76 -0
  332. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_pabrai/components/tools.json +57 -31
  333. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_pabrai/provisional-derivations/downside_floor_coverage.derived-proxy-evidence.json +76 -0
  334. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_pabrai/provisional-derivations/market_capitalisation.derived-proxy-evidence.json +76 -0
  335. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_simons/components/tools.json +45 -32
  336. 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
  337. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_simons/provisional-derivations/session_move_over_implied.derived-proxy-evidence.json +77 -0
  338. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_sinclair/components/tools.json +56 -30
  339. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_sinclair/provisional-derivations/round_trip_cost.derived-proxy-evidence.json +76 -0
  340. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_sinclair/provisional-derivations/volatility_per_unit_of_width.derived-proxy-evidence.json +76 -0
  341. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_soros/components/tools.json +56 -30
  342. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_soros/provisional-derivations/credit_cycle_position.derived-proxy-evidence.json +76 -0
  343. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_soros/provisional-derivations/financing_burden.derived-proxy-evidence.json +76 -0
  344. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_taleb/components/tools.json +52 -26
  345. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_taleb/provisional-derivations/debt_service_cushion.derived-proxy-evidence.json +76 -0
  346. 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
  347. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_thorp/components/tools.json +58 -32
  348. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_thorp/provisional-derivations/edge_per_unit_of_volatility.derived-proxy-evidence.json +77 -0
  349. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_thorp/provisional-derivations/net_edge.derived-proxy-evidence.json +76 -0
  350. package/mcp/lib/breadth.mjs +122 -0
  351. package/mcp/lib/constants.mjs +15 -0
  352. package/mcp/lib/damodaran.mjs +119 -0
  353. package/mcp/lib/fred.mjs +246 -0
  354. package/mcp/lib/fund-holdings-parsers.mjs +297 -0
  355. package/mcp/lib/fundamentals.mjs +801 -0
  356. package/mcp/lib/funds.mjs +750 -0
  357. package/mcp/lib/gates.mjs +71 -4
  358. package/mcp/lib/grounding.mjs +188 -36
  359. package/mcp/lib/index-aggregate.mjs +718 -0
  360. package/mcp/lib/insider-ownership.mjs +149 -0
  361. package/mcp/lib/instrument-facts.mjs +557 -0
  362. package/mcp/lib/instruments.mjs +191 -0
  363. package/mcp/lib/markdown.mjs +216 -43
  364. package/mcp/lib/master-catalog.mjs +4 -0
  365. package/mcp/lib/orchestrator.mjs +173 -29
  366. package/mcp/lib/packets.mjs +59 -6
  367. package/mcp/lib/personas/engine.mjs +23 -10
  368. package/mcp/lib/personas-v3/deterministic-executor.mjs +13 -2
  369. package/mcp/lib/personas-v3/ga-external-evidence.mjs +3 -2
  370. package/mcp/lib/personas-v3/ga-gate.mjs +2 -1
  371. package/mcp/lib/personas-v3/ga-package-evidence.mjs +5 -4
  372. package/mcp/lib/personas-v3/grounding-adapter.mjs +309 -2
  373. package/mcp/lib/personas-v3/production-root.mjs +5 -4
  374. package/mcp/lib/personas-v3/release-formula-evidence.mjs +14 -7
  375. package/mcp/lib/personas-v3/release-source-evidence.mjs +2 -1
  376. package/mcp/lib/personas-v3/releases.mjs +5 -4
  377. package/mcp/lib/personas-v3/runtime-release-integrity.mjs +6 -5
  378. package/mcp/lib/personas-v3/semantic-source-adjudication.mjs +2 -1
  379. package/mcp/lib/personas-v3/semantic-source-extraction.mjs +2 -1
  380. package/mcp/lib/personas-v3/semantic-source-skeptic-review.mjs +2 -1
  381. package/mcp/lib/personas-v3/source-review-operations.mjs +3 -2
  382. package/mcp/lib/personas-v3/staging.mjs +22 -3
  383. package/mcp/lib/prompts.mjs +87 -3
  384. package/mcp/lib/quotes.mjs +5 -0
  385. package/mcp/lib/rpc.mjs +27 -10
  386. package/mcp/lib/run-store.mjs +5 -3
  387. package/mcp/lib/sec.mjs +32 -0
  388. package/mcp/lib/tables.mjs +11 -0
  389. package/mcp/lib/voice.mjs +122 -0
  390. package/mcp/lib/xbrl-aggregates.mjs +153 -0
  391. package/mcp/lib/xbrl-series.mjs +339 -0
  392. package/mcp/lib/xlsx.mjs +155 -0
  393. package/package.json +4 -4
  394. package/personas/masters/masters-value/bogle.md +145 -0
  395. package/schemas/council-evaluation-protocol-v1.schema.json +2 -2
  396. package/schemas/persona-v3-ai-assisted-solo-profile-v1.schema.json +2 -2
  397. package/schemas/persona-v3-ai-machine-simulation-v1.schema.json +1 -1
  398. package/schemas/persona-v3-build-spec-v1.schema.json +3 -3
  399. package/schemas/persona-v3-release-formula-review-evidence-v1.schema.json +3 -3
  400. package/schemas/persona-v3-release-manifest-v1.schema.json +6 -6
  401. package/schemas/persona-v3-release-source-review-evidence-v1.schema.json +3 -3
  402. package/schemas/persona-v3-tool-graph-v1.schema.json +1 -1
  403. package/schemas/source-review-batch-v1.schema.json +9 -9
  404. package/scripts/assemble-persona-v3-release.mjs +3 -2
  405. package/scripts/build-persona-v3-solo-test-packs.mjs +6 -8
  406. package/scripts/check-persona-v3-ga.mjs +1 -1
  407. package/scripts/check-persona-v3-production-candidates.mjs +1 -1
  408. package/scripts/compile-persona-v3-formulas.mjs +19 -18
  409. package/scripts/doctor.mjs +11 -9
  410. package/scripts/export-persona-source-review-batch.mjs +1 -1
  411. package/scripts/generate-persona-v3-drafts.mjs +2 -2
  412. package/scripts/lib/build-profile.mjs +24 -0
  413. package/scripts/lib/council-evaluation-protocol.mjs +7 -6
  414. package/scripts/lib/host-capabilities.mjs +2 -1
  415. package/scripts/lib/packaged-host-parity.mjs +9 -3
  416. package/scripts/lib/persona-v3-ai-assisted-solo-status.mjs +6 -4
  417. package/scripts/lib/persona-v3-ai-formula-review.mjs +6 -5
  418. package/scripts/lib/persona-v3-ai-machine-simulations.mjs +32 -4
  419. package/scripts/lib/persona-v3-build-specs.mjs +3 -2
  420. package/scripts/lib/persona-v3-draft-packs.mjs +2 -2
  421. package/scripts/lib/persona-v3-formula-pipeline.mjs +11 -10
  422. package/scripts/lib/persona-v3-production-candidates.mjs +10 -9
  423. package/scripts/lib/persona-v3-solo-formula-pipeline.mjs +182 -16
  424. package/scripts/lib/persona-v3-solo-test-packs.mjs +112 -11
  425. package/scripts/package-smoke.mjs +2 -1
  426. package/scripts/report-persona-corpus-gaps.mjs +4 -1
  427. package/scripts/review-persona-v3-solo-formulas.mjs +12 -8
  428. package/scripts/scaffold-persona-v3-staging.mjs +1 -1
  429. package/skills/agent-skills-governance/SKILL.md +8 -2
  430. package/skills/alphacouncil-agent/SKILL.md +12 -4
  431. package/skills/public-equity-investing/SKILL.md +17 -0
  432. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_ackman/provisional-derivations/change_value_bridge.derived-proxy-evidence.json +0 -64
  433. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_ackman/provisional-derivations/power_map.derived-proxy-evidence.json +0 -64
  434. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_aschenbrenner/provisional-derivations/compute_power_bridge.derived-proxy-evidence.json +0 -64
  435. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_aschenbrenner/provisional-derivations/timeline_reverse_valuation.derived-proxy-evidence.json +0 -64
  436. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_asness/provisional-derivations/crowding_cost_stress.derived-proxy-evidence.json +0 -64
  437. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_asness/provisional-derivations/factor_decomposer.derived-proxy-evidence.json +0 -64
  438. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_buffett/provisional-derivations/incremental_returns.derived-proxy-evidence.json +0 -64
  439. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_buffett/provisional-derivations/owner_earnings_rebuilder.derived-proxy-evidence.json +0 -64
  440. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_burry/provisional-derivations/capital_structure_reader.derived-proxy-evidence.json +0 -64
  441. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_burry/provisional-derivations/mispricing_carry.derived-proxy-evidence.json +0 -64
  442. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_cathie_wood/provisional-derivations/capture_valuation_bridge.derived-proxy-evidence.json +0 -64
  443. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_cathie_wood/provisional-derivations/cost_adoption_curve.derived-proxy-evidence.json +0 -64
  444. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_dalio/provisional-derivations/debt_driver_stress.derived-proxy-evidence.json +0 -64
  445. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_dalio/provisional-derivations/regime_classifier.derived-proxy-evidence.json +0 -64
  446. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_damodaran/provisional-derivations/story_dcf.derived-proxy-evidence.json +0 -64
  447. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_druckenmiller/provisional-derivations/inflection_payoff.derived-proxy-evidence.json +0 -64
  448. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_druckenmiller/provisional-derivations/liquidity_revision_map.derived-proxy-evidence.json +0 -64
  449. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_duan_yongping/provisional-derivations/opportunity_cost.derived-proxy-evidence.json +0 -64
  450. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_duan_yongping/provisional-derivations/user_value_evidence.derived-proxy-evidence.json +0 -64
  451. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_fisher/provisional-derivations/research_productivity.derived-proxy-evidence.json +0 -64
  452. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_fisher/provisional-derivations/scuttlebutt_graph.derived-proxy-evidence.json +0 -64
  453. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_forensic_short/provisional-derivations/borrow_catalyst.derived-proxy-evidence.json +0 -64
  454. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_graham/provisional-derivations/asset_floor.derived-proxy-evidence.json +0 -64
  455. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_graham/provisional-derivations/normalized_earnings.derived-proxy-evidence.json +0 -64
  456. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_jhunjhunwala/provisional-derivations/penetration_liquidity.derived-proxy-evidence.json +0 -64
  457. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_jhunjhunwala/provisional-derivations/promoter_governance.derived-proxy-evidence.json +0 -64
  458. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_klarman/provisional-derivations/cash_catalyst_compare.derived-proxy-evidence.json +0 -64
  459. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_klarman/provisional-derivations/recovery_waterfall.derived-proxy-evidence.json +0 -64
  460. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_li_lu/provisional-derivations/promise_integrity_ledger.derived-proxy-evidence.json +0 -64
  461. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_li_lu/provisional-derivations/ten_year_return_bridge.derived-proxy-evidence.json +0 -64
  462. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_lynch/provisional-derivations/category_classifier.derived-proxy-evidence.json +0 -64
  463. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_lynch/provisional-derivations/story_numbers_check.derived-proxy-evidence.json +0 -64
  464. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_marks/provisional-derivations/cycle_temperature.derived-proxy-evidence.json +0 -64
  465. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_marks/provisional-derivations/implied_expectations.derived-proxy-evidence.json +0 -64
  466. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_munger/provisional-derivations/failure_path_graph.derived-proxy-evidence.json +0 -64
  467. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_munger/provisional-derivations/incentive_map.derived-proxy-evidence.json +0 -64
  468. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_pabrai/provisional-derivations/discrete_payoff.derived-proxy-evidence.json +0 -64
  469. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_pabrai/provisional-derivations/downside_floor.derived-proxy-evidence.json +0 -64
  470. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_simons/provisional-derivations/leakage_audit.derived-proxy-evidence.json +0 -64
  471. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_simons/provisional-derivations/oos_cost_test.derived-proxy-evidence.json +0 -64
  472. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_sinclair/provisional-derivations/net_edge_sizer.derived-proxy-evidence.json +0 -64
  473. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_sinclair/provisional-derivations/realized_vol_forecast.derived-proxy-evidence.json +0 -64
  474. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_soros/provisional-derivations/reflexivity_graph.derived-proxy-evidence.json +0 -64
  475. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_soros/provisional-derivations/reversal_monitor.derived-proxy-evidence.json +0 -64
  476. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_taleb/provisional-derivations/payoff_ruin.derived-proxy-evidence.json +0 -64
  477. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_thorp/provisional-derivations/edge_recalculator.derived-proxy-evidence.json +0 -64
  478. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_thorp/provisional-derivations/fractional_kelly.derived-proxy-evidence.json +0 -64
@@ -0,0 +1,191 @@
1
+ /**
2
+ * Classify the security before choosing a research contract.
3
+ *
4
+ * Yahoo's chart metadata already distinguishes ETF, INDEX and EQUITY, but the quote
5
+ * adapter used to discard that field. As a result QQQ was sent through an operating-
6
+ * company Company Facts screen and a predictable HTTP 404 was reported as a research
7
+ * failure. Keep this module deterministic and deliberately small: it classifies the
8
+ * instrument; it does not pretend to provide holdings, index earnings or fund flows.
9
+ */
10
+
11
+ import { localized } from "./lang.mjs";
12
+
13
+ export const ASSET_TYPES = Object.freeze([
14
+ "equity",
15
+ "etf",
16
+ "index",
17
+ "mutual_fund",
18
+ "future",
19
+ "fx",
20
+ "crypto",
21
+ "unknown",
22
+ ]);
23
+
24
+ const YAHOO_TYPES = Object.freeze({
25
+ EQUITY: "equity",
26
+ ETF: "etf",
27
+ INDEX: "index",
28
+ MUTUALFUND: "mutual_fund",
29
+ FUTURE: "future",
30
+ CURRENCY: "fx",
31
+ CRYPTOCURRENCY: "crypto",
32
+ });
33
+
34
+ function normalizedRawType(value) {
35
+ return String(value || "").trim().toUpperCase().replace(/[\s-]+/gu, "_");
36
+ }
37
+
38
+ function symbolHeuristic(symbol) {
39
+ const text = String(symbol || "").trim().toUpperCase();
40
+ if (!text) return null;
41
+ if (text.startsWith("^")) return "index";
42
+ if (text.endsWith("=F")) return "future";
43
+ if (text.endsWith("=X")) return "fx";
44
+ if (/^[A-Z0-9]+-USD$/u.test(text)) return "crypto";
45
+ return null;
46
+ }
47
+
48
+ // A fund vehicle word anywhere in the name means the security is a pooled vehicle, not the
49
+ // cash index it tracks. Without this, "Vanguard Index Funds" matched the bare `index` token
50
+ // and VOO -- one of the most liquid optionable ETFs -- was routed as a cash index, which
51
+ // silently disables the option chain.
52
+ const FUND_VEHICLE = /\b(fund|funds|trust|etf|shares|portfolio|admiral|investor)\b/u;
53
+
54
+ function nameHeuristic(quote, filer) {
55
+ const name = `${quote?.short_name || ""} ${quote?.long_name || ""} ${filer?.name || filer?.title || ""}`.toLowerCase();
56
+ if (!name.trim()) return null;
57
+ if (/\b(etf|exchange[ -]traded fund)\b/u.test(name) || /\btrust,?\s+(series|units?)\b/u.test(name)) return "etf";
58
+ // Ordered before the bare `index` token on purpose: "index fund(s)" is a vehicle name.
59
+ if (/\b(mutual|investment|index)\s+funds?\b/u.test(name)) return "mutual_fund";
60
+ if (/\bindex\b/u.test(name) && !FUND_VEHICLE.test(name)) return "index";
61
+ return null;
62
+ }
63
+
64
+ // SEC Standard Industrial Classification codes filed by pooled investment vehicles. ETF and
65
+ // closed-end-fund registrants file 6722/6726, so a filed SIC is NOT positive evidence of an
66
+ // operating company -- the previous comment here asserted the opposite and sent the whole
67
+ // iShares family (registrant "iShares Trust", SIC 6726) through Company Facts.
68
+ // 6798 (REITs) is deliberately absent: a REIT is an operating company with real filings.
69
+ const FUND_SIC = Object.freeze(new Set(["6722", "6726", "6770"]));
70
+
71
+ export function classifyInstrument({ symbol, quote, filer } = {}) {
72
+ const rawType = normalizedRawType(quote?.instrument_type || quote?.quote_type);
73
+ let assetType = YAHOO_TYPES[rawType]
74
+ || symbolHeuristic(symbol || quote?.symbol)
75
+ || nameHeuristic(quote, filer);
76
+ let classificationSource = YAHOO_TYPES[rawType]
77
+ ? "yahoo_chart_metadata"
78
+ : symbolHeuristic(symbol || quote?.symbol)
79
+ ? "symbol_convention"
80
+ : nameHeuristic(quote, filer)
81
+ ? (filer?.name || filer?.title ? "sec_registrant_name_heuristic" : "quote_name_heuristic")
82
+ : "unresolved";
83
+
84
+ if (!assetType && filer?.sic) {
85
+ const sic = String(filer.sic).replace(/\D/gu, "").padStart(4, "0");
86
+ if (FUND_SIC.has(sic)) {
87
+ // This branch only fires when exchange metadata was unavailable, which in practice
88
+ // means the symbol came through the exchange-traded fallback feed; open-end mutual
89
+ // funds are not quoted there. Both map to fund_lookthrough regardless of the label.
90
+ assetType = "etf";
91
+ classificationSource = "sec_filer_sic_fund";
92
+ } else {
93
+ assetType = "equity";
94
+ classificationSource = "sec_filer_sic";
95
+ }
96
+ }
97
+ // Deliberately fail closed. A bare ticker shape tells us nothing: SPY, QQQ and VOO all
98
+ // match it, and the previous `equity` fallback sent them into an operating-company Company
99
+ // Facts screen whenever Yahoo metadata was missing -- the exact QQQ defect 0.9.5 set out to
100
+ // fix, reachable through the Stooq quote path which returns instrument_type: null.
101
+ // `unknown` withholds the screen instead of asserting a company that may not exist.
102
+ assetType ||= "unknown";
103
+
104
+ const fundLike = assetType === "etf" || assetType === "mutual_fund";
105
+ const indexLike = assetType === "index";
106
+ const operatingCompany = assetType === "equity";
107
+ const researchModel = fundLike
108
+ ? "fund_lookthrough"
109
+ : indexLike
110
+ ? "index_aggregate"
111
+ : operatingCompany
112
+ ? "operating_company"
113
+ : "market_instrument";
114
+
115
+ return Object.freeze({
116
+ symbol: String(symbol || quote?.symbol || "").trim(),
117
+ asset_type: assetType,
118
+ raw_instrument_type: rawType || null,
119
+ classification_source: classificationSource,
120
+ research_model: researchModel,
121
+ operating_company: operatingCompany,
122
+ fund_like: fundLike,
123
+ index_like: indexLike,
124
+ sec_companyfacts_applicable: operatingCompany,
125
+ });
126
+ }
127
+
128
+ export function isFundOrIndex(instrument) {
129
+ return instrument?.fund_like === true || instrument?.index_like === true
130
+ || ["etf", "mutual_fund", "index"].includes(instrument?.asset_type);
131
+ }
132
+
133
+ export function instrumentResearchChecklist(instrument, language = "English") {
134
+ if (!isFundOrIndex(instrument)) return "";
135
+ const pack = instrument.asset_type === "index" ? INDEX_CHECKLIST : FUND_CHECKLIST;
136
+ return localized(language, pack);
137
+ }
138
+
139
+ const INDEX_CHECKLIST = Object.freeze({
140
+ en: [
141
+ "## Index-specific research contract",
142
+ "- This is not an operating company. Do not look for index revenue, EPS, management guidance, Form 4 filings or company cash flow.",
143
+ "- Required: methodology, dated constituents and weights, concentration, sector/factor exposures, aggregate earnings and valuation methodology, breadth, rebalances, macro sensitivity, and futures/options positioning when available.",
144
+ "- Any aggregate EPS, P/E or price range needs a same-date methodology and coverage statement. If unavailable, record the gap; never add a few constituents together as index financials.",
145
+ ].join("\n"),
146
+ zh: [
147
+ "## 指数专用研究合同",
148
+ "- 这不是经营公司:不得寻找指数自身营收、EPS、管理层指引、Form 4 或公司式现金流。",
149
+ "- 必查:指数方法、成分与权重时点、集中度、行业/因子暴露、聚合盈利与估值口径、广度、再平衡、宏观敏感度,以及可用的期货/期权定位。",
150
+ "- 指数聚合盈利、P/E或目标区间必须给出同日口径和覆盖方法;取不到就列为数据缺口。不得把少数成分股相加成指数财报。",
151
+ ].join("\n"),
152
+ ja: [
153
+ "## 指数専用リサーチ契約",
154
+ "- これは事業会社ではありません。指数自体の売上・EPS・経営陣ガイダンス・Form 4・企業型キャッシュフローを探さないでください。",
155
+ "- 必須項目:指数methodology、日付入り構成銘柄とウエイト、集中度、セクター/ファクター・エクスポージャー、集計利益と評価基準、市場の広がり、リバランス、マクロ感応度、および入手可能な先物・オプションのポジショニング。",
156
+ "- 集計 EPS・PER・価格レンジには必ず同日基準とカバレッジの説明を付けてください。入手できない場合はギャップとして記録し、少数の構成銘柄を合算して指数の財務データを作ってはいけません。",
157
+ ].join("\n"),
158
+ ko: [
159
+ "## 지수 전용 리서치 계약",
160
+ "- 이것은 사업회사가 아닙니다. 지수 자체의 매출, EPS, 경영진 가이던스, Form 4, 기업형 현금흐름을 찾지 마십시오.",
161
+ "- 필수 항목: 지수 산출 방법론, 일자가 명시된 구성종목과 비중, 집중도, 섹터/팩터 익스포저, 집계 이익과 밸류에이션 기준, 시장 폭, 리밸런싱, 매크로 민감도, 이용 가능한 선물·옵션 포지셔닝.",
162
+ "- 집계 EPS·PER·가격 범위에는 반드시 동일 일자 기준과 커버리지 설명을 붙이십시오. 확보하지 못하면 갭으로 기록하고, 소수 구성종목을 합산해 지수 재무데이터를 만들지 마십시오.",
163
+ ].join("\n"),
164
+ });
165
+
166
+ const FUND_CHECKLIST = Object.freeze({
167
+ en: [
168
+ "## ETF/fund-specific research contract",
169
+ "- This is not an operating company. Do not seek fund revenue, company EPS or operating guidance, and do not label constituent Form 4 activity as fund insider trading.",
170
+ "- Required: tracked index and methodology, dated holdings/weights, top-ten and sector concentration, fee, AUM, liquidity, premium/discount or tracking difference, flows, securities lending/borrowings/derivatives, rebalances and tax structure.",
171
+ "- Fundamentals require look-through analysis: state the sample weight, keep issuer results separate, and never add them into ETF revenue or EPS. Aggregate valuation needs a same-date methodology and coverage statement.",
172
+ ].join("\n"),
173
+ zh: [
174
+ "## ETF/基金专用研究合同",
175
+ "- 这不是经营公司:不得寻找基金自身营收、公司EPS、管理层经营指引或把成分股Form 4写成基金内部人交易。",
176
+ "- 必查:跟踪指数与方法、持仓/权重时点、前十大与行业集中度、费用率、规模、流动性、溢折价/跟踪差、资金流、证券出借/借款/衍生品、再平衡和税务结构。",
177
+ "- 基本面必须做持仓穿透:明确样本覆盖权重,分开报告发行人结果,绝不可相加成ETF营收或EPS。聚合估值必须披露同日口径和覆盖方法。",
178
+ ].join("\n"),
179
+ ja: [
180
+ "## ETF/ファンド専用リサーチ契約",
181
+ "- これは事業会社ではありません。ファンド自体の売上・企業 EPS・経営ガイダンスを探さず、構成銘柄の Form 4 をファンドのインサイダー取引として扱わないでください。",
182
+ "- 必須項目:連動指数と算出方法、日付入り保有銘柄とウエイト、上位10銘柄・セクター集中度、信託報酬、純資産総額、流動性、プレミアム/ディスカウントまたはトラッキング差、資金フロー、証券貸借・借入・デリバティブ、リバランス、税制上の構造。",
183
+ "- ファンダメンタルズはルックスルー分析が必須です。サンプルのウエイトを明示し、発行体ごとの結果を分けて報告し、ETF の売上や EPS として合算してはいけません。集計バリュエーションには同日基準とカバレッジの説明が必要です。",
184
+ ].join("\n"),
185
+ ko: [
186
+ "## ETF/펀드 전용 리서치 계약",
187
+ "- 이것은 사업회사가 아닙니다. 펀드 자체의 매출, 기업 EPS, 경영 가이던스를 찾지 말고, 구성종목의 Form 4를 펀드 내부자 거래로 표기하지 마십시오.",
188
+ "- 필수 항목: 추종 지수와 방법론, 일자가 명시된 보유종목과 비중, 상위 10종목·섹터 집중도, 보수율, 순자산, 유동성, 프리미엄/디스카운트 또는 추적오차, 자금흐름, 증권대차·차입·파생상품, 리밸런싱, 세제 구조.",
189
+ "- 펀더멘털은 룩스루 분석이 필수입니다. 샘플 비중을 명시하고 발행인별 결과를 분리해 보고하며, ETF 매출이나 EPS로 합산하지 마십시오. 집계 밸류에이션에는 동일 일자 기준과 커버리지 설명이 필요합니다.",
190
+ ].join("\n"),
191
+ });
@@ -1,6 +1,6 @@
1
1
  import { writeFileSync } from "node:fs";
2
2
  import { join } from "node:path";
3
- import { DEBATE_ROLES, REPORT_SECTIONS } from "./constants.mjs";
3
+ import { DEBATE_ROLES, RECORDED_BENCH_MARKER_PREFIX, RECORDED_INSTRUMENT_MARKER_PREFIX, REPORT_SECTIONS } from "./constants.mjs";
4
4
  import { writeJson } from "./fsutil.mjs";
5
5
  import { headingIncludesAlias, normalizeHeading, parseHeadings } from "./headings.mjs";
6
6
  import { isChineseLanguage, languageKey, localized } from "./lang.mjs";
@@ -8,6 +8,8 @@ import { sha256 } from "./personas-v3/canonical.mjs";
8
8
  import { compiledPersonaPacks } from "./personas-v3/registry.mjs";
9
9
  import { bullets, clip, clipAtBoundary, fence } from "./text.mjs";
10
10
  import { completenessStatus, validateFinalReport, verificationStatus, withCompletenessBanner, withDisclaimer, withVerificationBanner } from "./gates.mjs";
11
+ import { isFundOrIndex } from "./instruments.mjs";
12
+ import { intentLabel, VOICE_FIELDS, voiceDisclaimer, voiceFieldLabel } from "./voice.mjs";
11
13
  import { agentState, appendEvent, artifactPaths, runPath, taskState } from "./run-store.mjs";
12
14
  import { personaTitle, registry } from "./personas/registry.mjs";
13
15
 
@@ -72,10 +74,10 @@ export function renderMasterMarkdown(opinion, lang) {
72
74
  if (!opinion) return "";
73
75
  const title = masterTitle(opinion.master, lang);
74
76
  const labels = {
75
- zh: { statement: "本轮专属方法席发言(不是大师本人引语)", stance: "立场", verdict: "冻结判断", confidence: "置信度", worker: "专属 worker", summary: "方法席说明", findings: "关键发现", disagreements: "与分析师的分歧", disqualifiers: "触发的排除条件", change: "改变判断所需证据", sources: "来源" },
76
- en: { statement: "Dedicated Method-Seat Statement (not a quote from the named person)", stance: "Stance", verdict: "Frozen verdict", confidence: "Confidence", worker: "Dedicated worker", summary: "Method-seat explanation", findings: "Key Findings", disagreements: "Disagreements With The Analysts", disqualifiers: "Disqualifiers Triggered", change: "What Would Change The View", sources: "Sources" },
77
- ja: { statement: "専用メソッド席の発言(本人の発言・引用ではありません)", stance: "スタンス", verdict: "凍結済み判定", confidence: "信頼度", worker: "専用ワーカー", summary: "メソッド席の説明", findings: "主な所見", disagreements: "分析担当との相違", disqualifiers: "発動した除外条件", change: "判断が変わる条件", sources: "出典" },
78
- ko: { statement: "전용 방법론 좌석 발언(본인의 실제 발언이나 인용이 아님)", stance: "입장", verdict: "동결된 판단", confidence: "신뢰도", worker: "전용 워커", summary: "방법론 좌석 설명", findings: "핵심 발견", disagreements: "분석가와의 이견", disqualifiers: "발동된 제외 조건", change: "판단 변경 조건", sources: "출처" },
77
+ zh: { statement: "本轮方法席终局陈词(不是大师本人引语)", stance: "立场", verdict: "冻结判断", confidence: "置信度", worker: "陈词来源", summary: "方法席说明", findings: "关键发现", disagreements: "与分析师的分歧", disqualifiers: "触发的排除条件", change: "改变判断所需证据", sources: "来源" },
78
+ en: { statement: "Final Method-Seat Statement (not a quote from the named person)", stance: "Stance", verdict: "Frozen verdict", confidence: "Confidence", worker: "Statement source", summary: "Method-seat explanation", findings: "Key Findings", disagreements: "Disagreements With The Analysts", disqualifiers: "Disqualifiers Triggered", change: "What Would Change The View", sources: "Sources" },
79
+ ja: { statement: "メソッド席の最終見解(本人の発言・引用ではありません)", stance: "スタンス", verdict: "凍結済み判定", confidence: "信頼度", worker: "見解の生成元", summary: "メソッド席の説明", findings: "主な所見", disagreements: "分析担当との相違", disqualifiers: "発動した除外条件", change: "判断が変わる条件", sources: "出典" },
80
+ ko: { statement: "방법론 좌석 최종 발언(본인의 실제 발언이나 인용이 아님)", stance: "입장", verdict: "동결된 판단", confidence: "신뢰도", worker: "발언 출처", summary: "방법론 좌석 설명", findings: "핵심 발견", disagreements: "분석가와의 이견", disqualifiers: "발동된 제외 조건", change: "판단 변경 조건", sources: "출처" },
79
81
  }[languageKey(lang)];
80
82
  return [
81
83
  `## ${title}`,
@@ -110,27 +112,85 @@ export function renderMasterMarkdown(opinion, lang) {
110
112
  ].filter((line) => line !== "").join("\n");
111
113
  }
112
114
 
115
+ /** Reader-facing labels for the method-seat section, one entry per supported run language. */
116
+ const MASTER_STATEMENT_COPY = Object.freeze({
117
+ zh: {
118
+ heading: "\u9010\u5e2d\u65b9\u6cd5\u8f93\u51fa", acted: "\u6709\u5224\u65ad\u7684\u5e2d\u4f4d", abstained: "\u8bf4\u8fd9\u4e0d\u5f52\u5b83\u7ba1\u7684\u5e2d\u4f4d",
119
+ stance: "\u7acb\u573a", intent: "\u610f\u5411", origin: "\u9648\u8bcd\u6765\u6e90", statement: "\u672c\u8f6e\u53d1\u8a00\uff08\u4e0d\u662f\u672c\u4eba\u5f15\u8bed\uff09",
120
+ findings: "\u5173\u952e\u53d1\u73b0", disagreements: "\u4e0e\u5206\u6790\u5e08\u5206\u6b67", change: "\u6539\u53d8\u5224\u65ad\u6761\u4ef6", sources: "\u6765\u6e90\u6216\u660e\u786e\u7f3a\u53e3",
121
+ abstainLead: (n) => `\u53e6\u6709 ${n} \u5e2d\u5728\u672c\u8f6e\u4e0d\u7ed9\u65b9\u5411\uff0c\u5404\u81ea\u7f3a\u7684\u662f\u65b9\u6cd5\u5fc5\u9700\u7684\u8f93\u5165\uff0c\u8fd9\u4e0d\u662f\u770b\u7a7a\u7968\uff1a`,
122
+ },
123
+ en: {
124
+ heading: "Method-Seat Outputs", acted: "Seats with a view", abstained: "Seats that say this is not theirs to call",
125
+ stance: "Stance", intent: "Intent", origin: "Statement source", statement: "Recorded statement (not a quote)",
126
+ findings: "Key findings", disagreements: "Disagreements", change: "What would change the view", sources: "Sources or explicit gaps",
127
+ abstainLead: (n) => `A further ${n} seat(s) issue no direction this round, each missing a method-critical input. These are not bearish votes:`,
128
+ },
129
+ ja: {
130
+ heading: "\u30e1\u30bd\u30c3\u30c9\u5e2d\u3054\u3068\u306e\u51fa\u529b", acted: "\u5224\u65ad\u3092\u793a\u3057\u305f\u5e2d", abstained: "\u81ea\u5206\u306e\u62c5\u5f53\u3067\u306f\u306a\u3044\u3068\u3057\u305f\u5e2d",
131
+ stance: "\u30b9\u30bf\u30f3\u30b9", intent: "\u610f\u5411", origin: "\u898b\u89e3\u306e\u751f\u6210\u5143", statement: "\u4eca\u56de\u306e\u767a\u8a00\uff08\u672c\u4eba\u306e\u5f15\u7528\u3067\u306f\u3042\u308a\u307e\u305b\u3093\uff09",
132
+ findings: "\u4e3b\u306a\u6240\u898b", disagreements: "\u5206\u6790\u62c5\u5f53\u3068\u306e\u76f8\u9055", change: "\u5224\u65ad\u304c\u5909\u308f\u308b\u6761\u4ef6", sources: "\u51fa\u5178\u307e\u305f\u306f\u660e\u793a\u7684\u306a\u6b20\u843d",
133
+ abstainLead: (n) => `\u4ed6\u306b ${n} \u5e2d\u306f\u4eca\u56de\u65b9\u5411\u6027\u3092\u793a\u3057\u307e\u305b\u3093\u3002\u3044\u305a\u308c\u3082\u30e1\u30bd\u30c3\u30c9\u306b\u5fc5\u8981\u306a\u5165\u529b\u3092\u6b20\u3044\u3066\u304a\u308a\u3001\u5f31\u6c17\u7968\u3067\u306f\u3042\u308a\u307e\u305b\u3093\uff1a`,
134
+ },
135
+ ko: {
136
+ heading: "\ubc29\ubc95\ub860 \uc88c\uc11d\ubcc4 \ucd9c\ub825", acted: "\ud310\ub2e8\uc744 \ub0b8 \uc88c\uc11d", abstained: "\uc790\uae30 \uc18c\uad00\uc774 \uc544\ub2c8\ub77c\uace0 \ubc1d\ud78c \uc88c\uc11d",
137
+ stance: "\uc785\uc7a5", intent: "\uc758\ud5a5", origin: "\ubc1c\uc5b8 \ucd9c\ucc98", statement: "\uc774\ubc88 \ubc1c\uc5b8(\ubcf8\uc778 \uc778\uc6a9\uc774 \uc544\ub2d8)",
138
+ findings: "\ud575\uc2ec \ubc1c\uacac", disagreements: "\ubd84\uc11d\uac00\uc640\uc758 \uc774\uacac", change: "\ud310\ub2e8 \ubcc0\uacbd \uc870\uac74", sources: "\ucd9c\ucc98 \ub610\ub294 \uba85\uc2dc\uc801 \ub370\uc774\ud130 \uacf5\ubc31",
139
+ abstainLead: (n) => `\uadf8 \uc678 ${n}\uac1c \uc88c\uc11d\uc740 \uc774\ubc88 \ud68c\ucc28\uc5d0 \ubc29\ud5a5\uc744 \uc81c\uc2dc\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. \uac01\uac01 \ubc29\ubc95\ub860\uc5d0 \ud544\uc694\ud55c \uc785\ub825\uc774 \uc5c6\uc73c\uba70 \uc57d\uc138 \ud22c\ud45c\uac00 \uc544\ub2d9\ub2c8\ub2e4:`,
140
+ },
141
+ });
142
+
143
+ /**
144
+ * Seats that reached a decision are what a reader came for; seats that could not are context.
145
+ *
146
+ * The previous layout gave both the same weight, so a run where twenty-five seats abstained
147
+ * printed twenty-five near-identical rows and buried the one seat that had a view. Deciding
148
+ * seats now get room to speak and abstaining seats collapse into one readable paragraph.
149
+ * Every selected stable ID still appears in this section: the publication gate checks for
150
+ * exactly that, and it is also the honest requirement -- no seat may quietly vanish.
151
+ */
113
152
  function renderMasterStatements(run) {
114
153
  const key = languageKey(run?.language);
115
- const heading = { zh: "逐席专属方法输出", en: "Dedicated Method-Seat Outputs", ja: "専用メソッド席ごとの出力", ko: "전용 방법론 좌석별 출력" }[key];
116
- const statementLabel = { zh: "本轮发言(不是本人引语)", en: "Recorded statement (not a quote)", ja: "今回の発言(本人の引用ではありません)", ko: "이번 발언(본인 인용이 아님)" }[key];
117
- const findingsLabel = { zh: "关键发现", en: "Key findings", ja: "主な所見", ko: "핵심 발견" }[key];
118
- const disagreementsLabel = { zh: "与分析师分歧", en: "Disagreements", ja: "分析担当との相違", ko: "분석가와의 이견" }[key];
119
- const changeLabel = { zh: "改变判断条件", en: "What would change the view", ja: "判断が変わる条件", ko: "판단 변경 조건" }[key];
120
- const sourcesLabel = { zh: "来源或明确缺口", en: "Sources or explicit gaps", ja: "出典または明示的な欠落", ko: "출처 또는 명시적 데이터 공백" }[key];
154
+ const copy = MASTER_STATEMENT_COPY[key] || MASTER_STATEMENT_COPY.en;
121
155
  const voiced = (run?.master_opinions || []).filter((opinion) => Boolean(opinion.voice_statement));
122
156
  if (!voiced.length) return "";
123
- const items = voiced.map((opinion) => [
124
- `### ${masterTitle(opinion.master, run.language)} (\`${opinion.master}\`)`,
125
- `- ${key === "zh" ? "立场" : key === "ja" ? "スタンス" : key === "ko" ? "입장" : "Stance"}: ${opinion.stance || "unknown"}`,
126
- `- ${key === "zh" ? "专属 worker" : key === "ja" ? "専用ワーカー" : key === "ko" ? "전용 워커" : "Dedicated worker"}: ${opinion.dedicated_worker?.status || opinion.voice_status || "not_recorded"}`,
127
- `- ${statementLabel}: ${opinion.voice_statement || opinion.verdict || opinion.summary || ""}`,
128
- `- ${findingsLabel}: ${(opinion.key_findings || []).slice(0, 4).join(";") || "—"}`,
129
- `- ${disagreementsLabel}: ${(opinion.disagreements || []).slice(0, 3).join(";") || "—"}`,
130
- `- ${changeLabel}: ${(opinion.what_would_change_my_mind || []).slice(0, 3).join("") || ""}`,
131
- `- ${sourcesLabel}: ${(opinion.source_ids || []).join(", ") || (opinion.disqualifiers_triggered || []).join(", ") || "—"}`,
132
- ].join("\n")).join("\n\n");
133
- return `### ${heading}\n\n${items}`;
157
+ const acted = voiced.filter((opinion) => opinion.stance && opinion.stance !== "out_of_scope");
158
+ const abstained = voiced.filter((opinion) => !opinion.stance || opinion.stance === "out_of_scope");
159
+
160
+ const seatBlock = (opinion) => {
161
+ const intent = opinion.position_intent ? intentLabel(opinion.position_intent, run.language) : null;
162
+ const lines = [
163
+ `##### ${masterTitle(opinion.master, run.language)} (\`${opinion.master}\`)`,
164
+ `- ${copy.stance}: ${opinion.stance || "unknown"}${intent ? ` \u2014 ${copy.intent}: *${intent}*` : ""}`,
165
+ `- ${copy.origin}: ${opinion.dedicated_worker?.status || opinion.voice_status || "not_recorded"}`,
166
+ ];
167
+ // The five-field voice reads as prose; a legacy flat statement keeps its single line.
168
+ if (opinion.voice && typeof opinion.voice === "object") {
169
+ for (const field of VOICE_FIELDS) {
170
+ const text = String(opinion.voice[field] ?? "").trim();
171
+ if (text) lines.push(`- **${voiceFieldLabel(field, run.language)}**: ${text}`);
172
+ }
173
+ } else {
174
+ lines.push(`- ${copy.statement}: ${opinion.voice_statement || opinion.verdict || opinion.summary || ""}`);
175
+ }
176
+ lines.push(`- ${copy.findings}: ${(opinion.key_findings || []).slice(0, 4).join("\uFF1B") || "\u2014"}`);
177
+ lines.push(`- ${copy.disagreements}: ${(opinion.disagreements || []).slice(0, 3).join("\uFF1B") || "\u2014"}`);
178
+ lines.push(`- ${copy.change}: ${(opinion.what_would_change_my_mind || []).slice(0, 3).join("\uFF1B") || "\u2014"}`);
179
+ lines.push(`- ${copy.sources}: ${(opinion.source_ids || []).join(", ") || (opinion.disqualifiers_triggered || []).join(", ") || "\u2014"}`);
180
+ return lines.join("\n");
181
+ };
182
+
183
+ const sections = [`### ${copy.heading}`, voiceDisclaimer(run.language)];
184
+ if (acted.length) sections.push(`#### ${copy.acted}`, acted.map(seatBlock).join("\n\n"));
185
+ if (abstained.length) {
186
+ // One paragraph, not one row per seat. The stable IDs stay visible so the gate and the
187
+ // reader can both account for every selected seat without twenty-five identical lines.
188
+ const merged = abstained
189
+ .map((opinion) => `${masterTitle(opinion.master, run.language)} (\`${opinion.master}\`) \u2014 ${opinion.voice_statement}`)
190
+ .join(" ");
191
+ sections.push(`#### ${copy.abstained}`, `${copy.abstainLead(abstained.length)}\n\n${merged}`);
192
+ }
193
+ return sections.join("\n\n");
134
194
  }
135
195
 
136
196
  /**
@@ -267,15 +327,32 @@ export function renderDecisionTable(decisions, lang) {
267
327
  }
268
328
 
269
329
  /** Registry title when the persona resolves, the raw id when it does not. */
330
+ /**
331
+ * Maturity vocabulary belongs in metadata, not in a heading a reader has to parse.
332
+ *
333
+ * `admitted_label` carries the governance suffix ("... Provisional Operator Lens") so that an
334
+ * internal artifact can never be mistaken for a validated method model. A reader scanning a
335
+ * report does not need that phrase repeated on all twenty-six headings; the section already
336
+ * carries a disclaimer and the admission level travels with the pack. Strip it for display
337
+ * only -- the label itself, and every hash over it, is untouched.
338
+ */
339
+ const MATURITY_SUFFIX = /[\s\u3000]*(provisional operator lens|\u4e34\u65f6\u64cd\u4f5c\u89c6\u89d2|\u66ab\u5b9a\u30aa\u30da\u30ec\u30fc\u30bf\u30fc\u30ec\u30f3\u30ba|\uc784\uc2dc \uc624\ud37c\ub808\uc774\ud130 \ub80c\uc988)[\s\u3000]*$/iu;
340
+
341
+ export function displayMasterLabel(label) {
342
+ const text = String(label || "").trim();
343
+ const stripped = text.replace(MATURITY_SUFFIX, "").trim();
344
+ return stripped || text;
345
+ }
346
+
270
347
  function masterTitle(id, lang) {
271
348
  if (!id) return "Master";
272
349
  try {
273
350
  const v3 = compiledPersonaPacks().get(id);
274
351
  const v3Title = v3?.admitted_label?.[languageKey(lang)];
275
- if (v3Title) return `${v3Title} (${id})`;
352
+ if (v3Title) return displayMasterLabel(v3Title);
276
353
  const persona = registry().get(id);
277
354
  const title = personaTitle(persona, lang);
278
- return title && title !== id ? `${title} (${id})` : id;
355
+ return title && title !== id ? title : id;
279
356
  } catch {
280
357
  return id;
281
358
  }
@@ -469,7 +546,8 @@ export function writeReportQuality(run, markdown) {
469
546
  return quality;
470
547
  }
471
548
 
472
- const RECORDED_BENCH_MARKER_PREFIX = "alphacouncil:recorded-master-bench:v1:";
549
+ // Shared with the quality gate through constants so the gate can find the system-owned
550
+ // section by anchor instead of by heading text. See the note next to the constants.
473
551
 
474
552
  function recordedBenchMarker(run) {
475
553
  const subject = (run?.master_opinions || []).map((opinion) => ({
@@ -490,6 +568,91 @@ function isMasterBenchHeading(title) {
490
568
  return Boolean(normalized && section?.aliases.some((alias) => headingIncludesAlias(title, alias)));
491
569
  }
492
570
 
571
+ function isInstrumentStructureHeading(title) {
572
+ const normalized = normalizeHeading(title);
573
+ const section = REPORT_SECTIONS.find(({ id }) => id === "instrument_structure");
574
+ return Boolean(normalized && section?.aliases.some((alias) => headingIncludesAlias(title, alias)));
575
+ }
576
+
577
+ /**
578
+ * Own the ETF/index structure section at the deterministic system boundary.
579
+ *
580
+ * PM prose may discuss a fund, but it cannot turn a fund into an operating company. The
581
+ * classifier owns the research route and any PM-authored section is retained as commentary.
582
+ */
583
+ function withRecordedInstrumentStructure(run, markdown) {
584
+ const instrument = run?.grounding?.instrument;
585
+ if (!isFundOrIndex(instrument)) return String(markdown || "");
586
+ const body = String(markdown || "");
587
+ const lines = body.split(/\r?\n/);
588
+ const headings = parseHeadings(body);
589
+ const removals = [];
590
+ const commentaryTitle = localized(run.language, {
591
+ zh: "PM 对资产研究路径的叙述(非系统记录)",
592
+ en: "PM Commentary on the Instrument Research Path (non-authoritative)",
593
+ ja: "PMによる銘柄調査経路の説明(非公式記録)",
594
+ ko: "PM의 종목 조사 경로 설명(비공식 기록)",
595
+ });
596
+ for (const [index, heading] of headings.entries()) {
597
+ if (heading.level > 2 || !isInstrumentStructureHeading(heading.title)) continue;
598
+ const next = headings.slice(index + 1).find((candidate) => candidate.level <= heading.level);
599
+ const start = heading.line - 1;
600
+ const end = next ? next.line - 1 : lines.length;
601
+ if (heading.body.includes(`<!-- ${RECORDED_INSTRUMENT_MARKER_PREFIX}`)) removals.push([start, end]);
602
+ else lines[start] = `${"#".repeat(heading.level)} ${commentaryTitle}`;
603
+ }
604
+ for (const [start, end] of removals.sort((left, right) => right[0] - left[0])) {
605
+ lines.splice(start, end - start);
606
+ }
607
+
608
+ const copy = {
609
+ zh: {
610
+ heading: "## 基金与指数结构", asset: "资产类型", model: "研究模型", source: "分类依据", raw: "数据源原始类型", company: "经营公司财务路径", noCompany: "不适用;不得把基金或指数当作经营公司读取营收、公司 EPS、管理层指引或 Form 4", required: "强制研究项目", requirements: instrument.index_like
611
+ ? "指数方法、带时点的成分与权重、集中度、行业/因子暴露、广度、再平衡、聚合盈利与估值口径、宏观敏感度,以及可用的衍生品定位"
612
+ : "跟踪指数与方法、带时点的持仓和权重、前十大及行业集中度、费用率、规模、流动性、溢折价或跟踪差、资金流、借贷/衍生品、再平衡、税务结构与持仓穿透基本面",
613
+ aggregation: "聚合纪律", aggregationRule: "必须披露同日口径和覆盖权重;不得把少数成分股相加成基金或指数自身的营收、EPS或现金流", notApplicable: "明确不适用项",
614
+ },
615
+ en: {
616
+ heading: "## Fund and Index Structure", asset: "Asset type", model: "Research model", source: "Classification source", raw: "Raw feed type", company: "Operating-company financial route", noCompany: "not applicable; do not treat a fund or index as a company with its own revenue, company EPS, management guidance or Form 4 activity", required: "Required research", requirements: instrument.index_like
617
+ ? "index methodology, dated constituents and weights, concentration, sector/factor exposures, breadth, rebalances, aggregate earnings and valuation methodology, macro sensitivity, and listed-derivative positioning when available"
618
+ : "tracked index and methodology, dated holdings and weights, top-ten and sector concentration, fee, AUM, liquidity, premium/discount or tracking difference, flows, lending/derivatives, rebalances, tax structure, and holdings-level fundamental look-through",
619
+ aggregation: "Aggregation discipline", aggregationRule: "state one-date methodology and coverage weight; never add a few constituents into fund or index revenue, EPS, or cash flow", notApplicable: "Explicitly not applicable",
620
+ },
621
+ ja: {
622
+ heading: "## ファンドと指数の構造", asset: "資産タイプ", model: "調査モデル", source: "分類根拠", raw: "データ源の原分類", company: "事業会社の財務経路", noCompany: "適用外。ファンドや指数を、固有の売上高・企業EPS・経営陣ガイダンス・Form 4を持つ事業会社として扱わない", required: "必須調査項目", requirements: instrument.index_like
623
+ ? "指数算出方法、基準日付き構成銘柄とウェイト、集中度、業種・ファクター、ブレッドス、リバランス、集計利益・評価方法、マクロ感応度、利用可能なデリバティブ需給"
624
+ : "連動指数と方法、基準日付き保有銘柄とウェイト、上位10銘柄・業種集中度、経費率、純資産、流動性、乖離・トラッキング差、資金フロー、貸株・デリバティブ、リバランス、税制、保有銘柄ルックスルー",
625
+ aggregation: "集計規律", aggregationRule: "同一基準日の方法とカバーウェイトを明記し、一部構成銘柄を足してファンド・指数固有の売上高、EPS、CFにしない", notApplicable: "明示的な適用外項目",
626
+ },
627
+ ko: {
628
+ heading: "## 펀드와 지수 구조", asset: "자산 유형", model: "조사 모델", source: "분류 근거", raw: "데이터 소스 원본 유형", company: "영업회사 재무 경로", noCompany: "적용되지 않음. 펀드나 지수를 자체 매출, 기업 EPS, 경영진 가이던스 또는 Form 4가 있는 영업회사로 취급하지 않음", required: "필수 조사 항목", requirements: instrument.index_like
629
+ ? "지수 방법론, 기준일이 있는 구성 종목과 비중, 집중도, 섹터·팩터 노출, 시장 폭, 리밸런싱, 집계 이익·밸류에이션 방법, 거시 민감도 및 가능한 파생상품 포지셔닝"
630
+ : "추종 지수와 방법론, 기준일이 있는 보유 종목과 비중, 상위 10개·섹터 집중도, 보수, AUM, 유동성, 괴리율·추적 차이, 자금 흐름, 대차·파생상품, 리밸런싱, 세금 구조 및 보유 종목 룩스루",
631
+ aggregation: "집계 원칙", aggregationRule: "동일 기준일 방법론과 커버 비중을 밝히며 일부 구성 종목을 더해 펀드·지수 자체 매출, EPS 또는 현금흐름으로 만들지 않음", notApplicable: "명시적 적용 제외",
632
+ },
633
+ }[languageKey(run.language)];
634
+ const notApplicable = (run?.grounding?.not_applicable || []).length
635
+ ? run.grounding.not_applicable.map((item) => ` - ${item}`).join("\n")
636
+ : " - —";
637
+ const marker = `<!-- ${RECORDED_INSTRUMENT_MARKER_PREFIX}${sha256({ instrument, not_applicable: run?.grounding?.not_applicable || [] })} -->`;
638
+ const systemSection = [
639
+ copy.heading,
640
+ "",
641
+ marker,
642
+ `- ${copy.asset}: ${instrument.asset_type}`,
643
+ `- ${copy.model}: ${instrument.research_model}`,
644
+ `- ${copy.source}: ${instrument.classification_source}`,
645
+ `- ${copy.raw}: ${instrument.raw_instrument_type || "unknown"}`,
646
+ `- ${copy.company}: ${copy.noCompany}`,
647
+ `- ${copy.required}: ${copy.requirements}`,
648
+ `- ${copy.aggregation}: ${copy.aggregationRule}`,
649
+ `- ${copy.notApplicable}:`,
650
+ notApplicable,
651
+ ].join("\n");
652
+ const cleaned = lines.join("\n").trimEnd();
653
+ return `${cleaned ? `${cleaned}\n\n` : ""}${systemSection}\n`;
654
+ }
655
+
493
656
  /**
494
657
  * Make the recorded Master Bench a system-owned section.
495
658
  *
@@ -641,9 +804,12 @@ function withQuickScope(run, markdown) {
641
804
  export function finalReportMarkdown(run, manager) {
642
805
  const gate = verificationStatus(run);
643
806
  const completeness = completenessStatus(run);
644
- const reportBody = withRecordedPriceSnapshot(
807
+ const reportBody = withRecordedMasterBench(
645
808
  run,
646
- withRecordedMasterBench(run, manager.report_markdown || manager.summary),
809
+ withRecordedInstrumentStructure(
810
+ run,
811
+ withRecordedPriceSnapshot(run, manager.report_markdown || manager.summary),
812
+ ),
647
813
  );
648
814
  return withDisclaimer(
649
815
  withCompletenessBanner(
@@ -886,21 +1052,21 @@ function handoffCopy(language) {
886
1052
  return {
887
1053
  zh: {
888
1054
  title: "AlphaCouncil 运行摘要", status: "运行状态与时限", statusLabel: "状态", contract: "报告契约", scope: "执行范围", elapsed: "耗时", deadline: "硬截止时间", deadlineMet: "是否在截止前落盘",
889
- fullScope: "full_v2:8 个证据席、每个已选方法席的专属 worker、三轮多空交叉问答和 PM;插件托管运行硬上限 30 分钟。", quickScope: "quick_v1:4 个证据席、1–4 个方法席、单轮多空和短 PM;不等同 full council。",
890
- price: "系统记录价格", noPrice: "未取得可验证报价;没有补造价格。", delayed: "延迟行情", conclusion: "结论", rating: "评级", winner: "多空胜负", confidence: "置信度", judgment: "判断", noDecision: "NEEDS_MANAGER_REVIEW;工具或 PM 失败不能转换成投资评级。",
891
- masters: "逐席大神方法输出(不是本人引语)", analysts: "分析师逐席内容", worker: "专属代理", key: "关键内容", earnings: "最新财报", forward: "前瞻门槛", news: "新闻/行业信号", recentNews: "近期公司与行业新闻", newsSummary: "新闻席摘要", noDatedNews: "本轮没有取得 as_of 之前 120 天内且带日期的新闻来源。", newsExcluded: "新闻时间门禁排除", valuation: "估值/价位", position: "仓位", gaps: "数据缺口与失败席", invalidation: "失效条件", files: "文件位置", report: "完整报告", index: "代理工件索引", trace: "全部代理追踪", quality: "报告质量检查", missing: "未覆盖。", noGaps: "未记录额外缺口。", noInvalidation: "没有正式失效条件。",
1055
+ fullScope: "full_v2:8 个证据席、全部已选方法席的可审计终局陈词、三轮多空交叉问答和 PM;插件托管运行硬上限 30 分钟。", quickScope: "quick_v1:4 个证据席、1–4 个方法席、单轮多空和短 PM;不等同 full council。",
1056
+ price: "系统记录价格", noPrice: "未取得可验证报价;没有补造价格。", delayed: "延迟行情", instrument: "资产识别与研究路径", assetType: "资产类型", researchModel: "研究模型", classifiedBy: "识别来源", conclusion: "结论", rating: "评级", winner: "多空胜负", confidence: "置信度", judgment: "判断", noDecision: "NEEDS_MANAGER_REVIEW;工具或 PM 失败不能转换成投资评级。",
1057
+ masters: "结尾:逐席方法陈词(不是本人引语)", analysts: "分析师逐席内容", worker: "陈词来源", record: "冻结记录", key: "关键内容", earnings: "最新财报", forward: "前瞻门槛", news: "新闻/行业信号", recentNews: "近期公司与行业新闻", newsSummary: "新闻席摘要", noDatedNews: "本轮没有取得 as_of 之前 120 天内且带日期的新闻来源。", newsExcluded: "新闻时间门禁排除", valuation: "估值/价位", position: "仓位", gaps: "数据缺口与失败席", invalidation: "失效条件", files: "文件位置", report: "完整报告", index: "代理工件索引", trace: "全部代理追踪", quality: "报告质量检查", missing: "未覆盖。", noGaps: "未记录额外缺口。", noInvalidation: "没有正式失效条件。",
892
1058
  },
893
1059
  en: {
894
1060
  title: "AlphaCouncil Run Summary", status: "Run Status and Deadline", statusLabel: "Status", contract: "Report contract", scope: "Execution scope", elapsed: "Elapsed", deadline: "Hard deadline", deadlineMet: "Persisted before deadline",
895
- fullScope: "full_v2: eight evidence seats, one dedicated worker per selected method, three-round cross-examination and PM; plugin-managed runs have a hard thirty-minute ceiling.", quickScope: "quick_v1: four evidence seats, one to four method seats, one debate round and short PM; not equivalent to full council.",
896
- price: "System-Recorded Price", noPrice: "No verifiable quote was retrieved; no price was invented.", delayed: "delayed quote", conclusion: "Conclusion", rating: "Rating", winner: "Debate winner", confidence: "Confidence", judgment: "Judgment", noDecision: "NEEDS_MANAGER_REVIEW; a tool or PM failure cannot be converted into an investment rating.",
897
- masters: "Recorded Method-Seat Statements (not quotes from the named people)", analysts: "Analyst Views by Seat", worker: "dedicated worker", key: "Key Content", earnings: "Latest earnings", forward: "Forward thresholds", news: "News / industry signal", recentNews: "Recent Company and Industry News", newsSummary: "News-seat summary", noDatedNews: "No dated news source inside the 120 days through as_of was retrieved.", newsExcluded: "Recent-news gate excluded", valuation: "Valuation / price range", position: "Position", gaps: "Data Gaps and Failed Seats", invalidation: "Invalidation", files: "File Locations", report: "Full report", index: "Agent artifact index", trace: "Full agent trace", quality: "Report quality check", missing: "Not covered.", noGaps: "No additional gap was recorded.", noInvalidation: "No formal invalidation conditions are available.",
1061
+ fullScope: "full_v2: eight evidence seats, an auditable final statement for every selected method seat, three-round cross-examination and PM; plugin-managed runs have a hard thirty-minute ceiling.", quickScope: "quick_v1: four evidence seats, one to four method seats, one debate round and short PM; not equivalent to full council.",
1062
+ price: "System-Recorded Price", noPrice: "No verifiable quote was retrieved; no price was invented.", delayed: "delayed quote", instrument: "Instrument Classification and Research Path", assetType: "Asset type", researchModel: "Research model", classifiedBy: "Classified by", conclusion: "Conclusion", rating: "Rating", winner: "Debate winner", confidence: "Confidence", judgment: "Judgment", noDecision: "NEEDS_MANAGER_REVIEW; a tool or PM failure cannot be converted into an investment rating.",
1063
+ masters: "Final Per-Seat Method Statements (not quotes from the named people)", analysts: "Analyst Views by Seat", worker: "statement source", record: "Frozen record", key: "Key Content", earnings: "Latest earnings", forward: "Forward thresholds", news: "News / industry signal", recentNews: "Recent Company and Industry News", newsSummary: "News-seat summary", noDatedNews: "No dated news source inside the 120 days through as_of was retrieved.", newsExcluded: "Recent-news gate excluded", valuation: "Valuation / price range", position: "Position", gaps: "Data Gaps and Failed Seats", invalidation: "Invalidation", files: "File Locations", report: "Full report", index: "Agent artifact index", trace: "Full agent trace", quality: "Report quality check", missing: "Not covered.", noGaps: "No additional gap was recorded.", noInvalidation: "No formal invalidation conditions are available.",
898
1064
  },
899
1065
  ja: {
900
- title: "AlphaCouncil 実行サマリー", status: "実行状況と期限", statusLabel: "状態", contract: "レポート契約", scope: "実行範囲", elapsed: "所要時間", deadline: "ハード期限", deadlineMet: "期限内に保存", fullScope: "full_v2:8つの証拠席、選択した各メソッド専用ワーカー、3ラウンドの多空質疑、PM。プラグイン管理実行は30分で必ず終端状態になります。", quickScope: "quick_v1:4つの証拠席、1–4のメソッド席、1ラウンドの多空議論、短いPM。full council相当ではありません。", price: "システム記録価格", noPrice: "検証可能な価格を取得できず、価格は補完していません。", delayed: "遅延価格", conclusion: "結論", rating: "評価", winner: "勝者", confidence: "信頼度", judgment: "判断", noDecision: "NEEDS_MANAGER_REVIEW。ツールまたはPMの失敗を投資評価に変換できません。", masters: "メソッド席ごとの記録(本人の発言・引用ではありません)", analysts: "分析担当ごとの内容", worker: "専用ワーカー", key: "主要内容", earnings: "直近決算", forward: "先行条件", news: "ニュース・業界シグナル", recentNews: "直近の企業・業界ニュース", newsSummary: "ニュース席の要約", noDatedNews: "as_of までの120日間にある日付付きニュース出典を取得できませんでした。", newsExcluded: "ニュース時刻ゲートで除外", valuation: "評価レンジ・価格条件", position: "ポジション", gaps: "データ欠落と失敗した席", invalidation: "無効化条件", files: "ファイル", report: "完全レポート", index: "代理成果物一覧", trace: "全代理トレース", quality: "レポート品質検査", missing: "未取得。", noGaps: "追加の欠落は記録されていません。", noInvalidation: "正式な無効化条件はありません。",
1066
+ title: "AlphaCouncil 実行サマリー", status: "実行状況と期限", statusLabel: "状態", contract: "レポート契約", scope: "実行範囲", elapsed: "所要時間", deadline: "ハード期限", deadlineMet: "期限内に保存", fullScope: "full_v2:8つの証拠席、選択された全メソッド席の監査可能な最終見解、3ラウンドの多空質疑、PM。プラグイン管理実行は30分で必ず終端状態になります。", quickScope: "quick_v1:4つの証拠席、1–4のメソッド席、1ラウンドの多空議論、短いPM。full council相当ではありません。", price: "システム記録価格", noPrice: "検証可能な価格を取得できず、価格は補完していません。", delayed: "遅延価格", instrument: "銘柄分類と調査経路", assetType: "資産タイプ", researchModel: "調査モデル", classifiedBy: "分類根拠", conclusion: "結論", rating: "評価", winner: "勝者", confidence: "信頼度", judgment: "判断", noDecision: "NEEDS_MANAGER_REVIEW。ツールまたはPMの失敗を投資評価に変換できません。", masters: "最後:メソッド席ごとの最終見解(本人の発言・引用ではありません)", analysts: "分析担当ごとの内容", worker: "見解の生成元", record: "凍結済み記録", key: "主要内容", earnings: "直近決算", forward: "先行条件", news: "ニュース・業界シグナル", recentNews: "直近の企業・業界ニュース", newsSummary: "ニュース席の要約", noDatedNews: "as_of までの120日間にある日付付きニュース出典を取得できませんでした。", newsExcluded: "ニュース時刻ゲートで除外", valuation: "評価レンジ・価格条件", position: "ポジション", gaps: "データ欠落と失敗した席", invalidation: "無効化条件", files: "ファイル", report: "完全レポート", index: "代理成果物一覧", trace: "全代理トレース", quality: "レポート品質検査", missing: "未取得。", noGaps: "追加の欠落は記録されていません。", noInvalidation: "正式な無効化条件はありません。",
901
1067
  },
902
1068
  ko: {
903
- title: "AlphaCouncil 실행 요약", status: "실행 상태 및 기한", statusLabel: "상태", contract: "보고서 계약", scope: "실행 범위", elapsed: "소요 시간", deadline: "하드 기한", deadlineMet: "기한 내 저장", fullScope: "full_v2: 8개 증거 좌석, 선택된 방법론 전용 워커, 3라운드 롱/숏 질의응답, PM. 플러그인 관리 실행은 30분 안에 반드시 종단 상태가 됩니다.", quickScope: "quick_v1: 4개 증거 좌석, 1–4개 방법론 좌석, 단일 롱/숏 라운드, 짧은 PM. full council과 동등하지 않습니다.", price: "시스템 기록 가격", noPrice: "검증 가능한 시세를 가져오지 못했으며 가격을 임의로 만들지 않았습니다.", delayed: "지연 시세", conclusion: "결론", rating: "등급", winner: "토론 승자", confidence: "신뢰도", judgment: "판단", noDecision: "NEEDS_MANAGER_REVIEW. 도구 또는 PM 실패를 투자 등급으로 바꿀 수 없습니다.", masters: "방법론 좌석별 기록(본인의 실제 발언이나 인용이 아님)", analysts: "분석가 좌석별 내용", worker: "전용 워커", key: "핵심 내용", earnings: "최근 실적", forward: "선행 조건", news: "뉴스·산업 신호", recentNews: "최근 기업 및 산업 뉴스", newsSummary: "뉴스 좌석 요약", noDatedNews: "as_of까지 120일 이내의 날짜가 있는 뉴스 출처를 확보하지 못했습니다.", newsExcluded: "뉴스 시간 게이트에서 제외", valuation: "가치평가 범위·가격 조건", position: "포지션", gaps: "데이터 공백 및 실패 좌석", invalidation: "무효화 조건", files: "파일 위치", report: "전체 보고서", index: "에이전트 산출물 색인", trace: "전체 에이전트 추적", quality: "보고서 품질 검사", missing: "미확보.", noGaps: "추가 공백이 기록되지 않았습니다.", noInvalidation: "공식 무효화 조건이 없습니다.",
1069
+ title: "AlphaCouncil 실행 요약", status: "실행 상태 및 기한", statusLabel: "상태", contract: "보고서 계약", scope: "실행 범위", elapsed: "소요 시간", deadline: "하드 기한", deadlineMet: "기한 내 저장", fullScope: "full_v2: 8개 증거 좌석, 선택된 모든 방법론 좌석의 감사 가능한 최종 발언, 3라운드 롱/숏 질의응답, PM. 플러그인 관리 실행은 30분 안에 반드시 종단 상태가 됩니다.", quickScope: "quick_v1: 4개 증거 좌석, 1–4개 방법론 좌석, 단일 롱/숏 라운드, 짧은 PM. full council과 동등하지 않습니다.", price: "시스템 기록 가격", noPrice: "검증 가능한 시세를 가져오지 못했으며 가격을 임의로 만들지 않았습니다.", delayed: "지연 시세", instrument: "종목 분류 및 조사 경로", assetType: "자산 유형", researchModel: "조사 모델", classifiedBy: "분류 근거", conclusion: "결론", rating: "등급", winner: "토론 승자", confidence: "신뢰도", judgment: "판단", noDecision: "NEEDS_MANAGER_REVIEW. 도구 또는 PM 실패를 투자 등급으로 바꿀 수 없습니다.", masters: "마지막: 방법론 좌석별 최종 발언(본인의 실제 발언이나 인용이 아님)", analysts: "분석가 좌석별 내용", worker: "발언 출처", record: "동결 기록", key: "핵심 내용", earnings: "최근 실적", forward: "선행 조건", news: "뉴스·산업 신호", recentNews: "최근 기업 및 산업 뉴스", newsSummary: "뉴스 좌석 요약", noDatedNews: "as_of까지 120일 이내의 날짜가 있는 뉴스 출처를 확보하지 못했습니다.", newsExcluded: "뉴스 시간 게이트에서 제외", valuation: "가치평가 범위·가격 조건", position: "포지션", gaps: "데이터 공백 및 실패 좌석", invalidation: "무효화 조건", files: "파일 위치", report: "전체 보고서", index: "에이전트 산출물 색인", trace: "전체 에이전트 추적", quality: "보고서 품질 검사", missing: "미확보.", noGaps: "추가 공백이 기록되지 않았습니다.", noInvalidation: "공식 무효화 조건이 없습니다.",
904
1070
  },
905
1071
  }[languageKey(language)];
906
1072
  }
@@ -948,10 +1114,10 @@ function localizedDisplayValue(value, language) {
948
1114
  const key = languageKey(language);
949
1115
  const token = value === true ? "true" : value === false ? "false" : String(value || "unknown");
950
1116
  const maps = {
951
- zh: { unknown: "未知", unavailable: "不可用", true: "是", false: "否", pending: "待运行", running: "运行中", waiting: "等待中", completed: "已完成", complete: "完整", failed: "失败", degraded: "降级", incomplete: "不完整", skipped: "未运行", declined: "不适用", constructive: "建设性", cautious: "谨慎", opposed: "反对", out_of_scope: "证据范围外", high: "高", medium: "中", low: "低", Buy: "买入", Overweight: "增持", Hold: "持有", Underweight: "减持", Sell: "卖出", bull: "多方", bear: "空方", balanced: "平衡" },
952
- en: { unknown: "unknown", unavailable: "unavailable", true: "yes", false: "no" },
953
- ja: { unknown: "不明", unavailable: "取得不可", true: "はい", false: "いいえ", pending: "待機中", running: "実行中", waiting: "待機中", completed: "完了", complete: "完了", failed: "失敗", degraded: "縮退", incomplete: "不完全", skipped: "未実行", declined: "適用外", constructive: "前向き", cautious: "慎重", opposed: "反対", out_of_scope: "証拠範囲外", high: "高", medium: "中", low: "低", Buy: "買い", Overweight: "オーバーウェイト", Hold: "中立", Underweight: "アンダーウェイト", Sell: "売り", bull: "強気", bear: "弱気", balanced: "均衡" },
954
- ko: { unknown: "알 수 없음", unavailable: "확인 불가", true: "예", false: "아니요", pending: "대기 중", running: "실행 중", waiting: "대기 중", completed: "완료", complete: "완료", failed: "실패", degraded: "성능 저하", incomplete: "불완전", skipped: "미실행", declined: "적용 범위 밖", constructive: "긍정적", cautious: "신중", opposed: "반대", out_of_scope: "증거 범위 밖", high: "높음", medium: "중간", low: "낮음", Buy: "매수", Overweight: "비중 확대", Hold: "보유", Underweight: "비중 축소", Sell: "매도", bull: "강세", bear: "약세", balanced: "균형" },
1117
+ zh: { unknown: "未知", unavailable: "不可用", true: "是", false: "否", pending: "待运行", running: "运行中", waiting: "等待中", completed: "已完成", complete: "完整", failed: "失败", degraded: "降级", incomplete: "不完整", skipped: "未运行", declined: "不适用", constructive: "建设性", cautious: "谨慎", opposed: "反对", out_of_scope: "证据范围外", deterministic_fallback: "确定性方法规则", completed_worker: "隔离方法席代理", recorded: "已记录", high: "高", medium: "中", low: "低", Buy: "买入", Overweight: "增持", Hold: "持有", Underweight: "减持", Sell: "卖出", bull: "多方", bear: "空方", balanced: "平衡" },
1118
+ en: { unknown: "unknown", unavailable: "unavailable", true: "yes", false: "no", deterministic_fallback: "deterministic method policy", completed_worker: "isolated method-seat worker", recorded: "recorded" },
1119
+ ja: { unknown: "不明", unavailable: "取得不可", true: "はい", false: "いいえ", pending: "待機中", running: "実行中", waiting: "待機中", completed: "完了", complete: "完了", failed: "失敗", degraded: "縮退", incomplete: "不完全", skipped: "未実行", declined: "適用外", constructive: "前向き", cautious: "慎重", opposed: "反対", out_of_scope: "証拠範囲外", deterministic_fallback: "決定論的メソッド規則", completed_worker: "分離メソッド席ワーカー", recorded: "記録済み", high: "高", medium: "中", low: "低", Buy: "買い", Overweight: "オーバーウェイト", Hold: "中立", Underweight: "アンダーウェイト", Sell: "売り", bull: "強気", bear: "弱気", balanced: "均衡" },
1120
+ ko: { unknown: "알 수 없음", unavailable: "확인 불가", true: "예", false: "아니요", pending: "대기 중", running: "실행 중", waiting: "대기 중", completed: "완료", complete: "완료", failed: "실패", degraded: "성능 저하", incomplete: "불완전", skipped: "미실행", declined: "적용 범위 밖", constructive: "긍정적", cautious: "신중", opposed: "반대", out_of_scope: "증거 범위 밖", deterministic_fallback: "결정론적 방법 규칙", completed_worker: "격리 방법론 좌석 워커", recorded: "기록됨", high: "높음", medium: "중간", low: "낮음", Buy: "매수", Overweight: "비중 확대", Hold: "보유", Underweight: "비중 축소", Sell: "매도", bull: "강세", bear: "약세", balanced: "균형" },
955
1121
  };
956
1122
  return maps[key]?.[token] || token;
957
1123
  }
@@ -969,7 +1135,9 @@ export function userResponseMarkdown(run, manager) {
969
1135
  const opinion = (run.master_opinions || []).find((item) => item.master === id);
970
1136
  const state = run.master_status?.[id] || { status: "pending" };
971
1137
  if (!opinion) return `- ${masterTitle(id, run.language)} (\`${id}\`) [${localizedDisplayValue(state.status, run.language)}]: ${localizedFailure(state.error, run.language) || copy.missing}`;
972
- return `- ${masterTitle(id, run.language)} (\`${id}\`) [${localizedDisplayValue(opinion.stance, run.language)}/${localizedDisplayValue(opinion.confidence || "low", run.language)}; ${copy.worker}=${localizedDisplayValue(opinion.dedicated_worker?.status || opinion.voice_status || "unknown", run.language)}]: ${clipAtBoundary(opinion.voice_statement || opinion.summary || opinion.verdict, 520)}`;
1138
+ const statementSource = opinion.dedicated_worker?.status || opinion.voice_status || "unknown";
1139
+ const frozenRecord = opinion.statement_origin || opinion.reason || opinion.engine || "recorded";
1140
+ return `- ${masterTitle(id, run.language)} (\`${id}\`) — ${clipAtBoundary(opinion.voice_statement || opinion.summary || opinion.verdict, 520)} [${copy.record}: ${localizedDisplayValue(opinion.stance, run.language)}/${localizedDisplayValue(opinion.confidence || "low", run.language)}; ${copy.worker}: ${localizedDisplayValue(statementSource, run.language)}; ${frozenRecord}]`;
973
1141
  }).join("\n") || `- ${copy.missing}`;
974
1142
  const analystLines = (run.tasks || []).map((task) => {
975
1143
  const packet = (run.packets || []).find((item) => item.task === task);
@@ -1003,15 +1171,17 @@ export function userResponseMarkdown(run, manager) {
1003
1171
  `## ${copy.price}`,
1004
1172
  `- ${priceLine}`,
1005
1173
  "",
1174
+ `## ${copy.instrument}`,
1175
+ `- ${copy.assetType}: ${run?.grounding?.instrument?.asset_type || localizedDisplayValue("unknown", run.language)}`,
1176
+ `- ${copy.researchModel}: ${run?.grounding?.instrument?.research_model || localizedDisplayValue("unknown", run.language)}`,
1177
+ `- ${copy.classifiedBy}: ${run?.grounding?.instrument?.classification_source || localizedDisplayValue("unknown", run.language)}`,
1178
+ "",
1006
1179
  `## ${copy.conclusion}`,
1007
1180
  `- ${copy.rating}: ${localizedDisplayValue(decisionAvailable ? manager.rating : "unavailable", run.language)}`,
1008
1181
  `- ${copy.winner}: ${localizedDisplayValue(decisionAvailable ? (manager.winner || "unknown") : "unavailable", run.language)}`,
1009
1182
  `- ${copy.confidence}: ${localizedDisplayValue(decisionAvailable ? (manager.confidence || "low") : "unavailable", run.language)}`,
1010
1183
  `- ${copy.judgment}: ${decisionAvailable ? clipAtBoundary(manager.verdict || manager.summary, 720) : copy.noDecision}`,
1011
1184
  "",
1012
- `## ${copy.masters}`,
1013
- masterLines,
1014
- "",
1015
1185
  `## ${copy.analysts}`,
1016
1186
  analystLines,
1017
1187
  "",
@@ -1038,6 +1208,9 @@ export function userResponseMarkdown(run, manager) {
1038
1208
  `- ${copy.index}: ${artifacts.artifact_index_md}`,
1039
1209
  `- ${copy.trace}: ${artifacts.all_agents_md}`,
1040
1210
  `- ${copy.quality}: ${artifacts.report_quality_json}`,
1211
+ "",
1212
+ `## ${copy.masters} — ${(run.masters || []).length}`,
1213
+ masterLines,
1041
1214
  ].join("\n");
1042
1215
  }
1043
1216