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
@@ -7,12 +7,14 @@
7
7
  * signature, approval bundle, or method-model claim and cannot satisfy production admission.
8
8
  */
9
9
 
10
+ import { PLANNED_TOOL_COUNT } from "../../data/persona-v3-build-specs.v1.mjs";
10
11
  import {
11
12
  existsSync,
12
13
  lstatSync,
13
14
  mkdirSync,
14
15
  readFileSync,
15
16
  readdirSync,
17
+ rmSync,
16
18
  realpathSync,
17
19
  statSync,
18
20
  writeFileSync,
@@ -21,6 +23,7 @@ import { basename, dirname, isAbsolute, relative, resolve, sep } from "node:path
21
23
 
22
24
  import { canonicalValue, sha256 } from "../../mcp/lib/personas-v3/canonical.mjs";
23
25
  import {
26
+ ANY_REPORTING_INTERVAL,
24
27
  PROVISIONAL_DERIVED_PROXY_ASSURANCE,
25
28
  deterministicToolSchemaHashes,
26
29
  } from "../../mcp/lib/personas-v3/deterministic-executor.mjs";
@@ -29,6 +32,7 @@ import {
29
32
  CANONICAL_MASTER_IDS,
30
33
  defaultStagingRoot,
31
34
  } from "../../mcp/lib/personas-v3/staging.mjs";
35
+ import { authoredMethods } from "../../data/authored/index.mjs";
32
36
  import {
33
37
  DEFAULT_FORMULA_CANDIDATE_ROOT,
34
38
  FORMULA_AUTHORING_STATUS,
@@ -52,6 +56,16 @@ export const SOLO_TEST_PROXY_UNIT = "derived_proxy_scalar";
52
56
 
53
57
  const INSTANT_AS_OF = Object.freeze({ basis: "instant", window: null, alignment: "as_of" });
54
58
 
59
+ /**
60
+ * Some facts genuinely cover a span rather than a moment: a five-year cash-flow total is not an
61
+ * observation taken on one day. Declaring those as instants made them unusable -- the executor
62
+ * rejects an instant contract against a fact that carries a reporting interval, so every seat
63
+ * whose method reads company fundamentals failed closed on live grounding.
64
+ */
65
+ function duration(window) {
66
+ return Object.freeze({ basis: "duration", window, alignment: "as_of" });
67
+ }
68
+
55
69
  /**
56
70
  * Typed-fact contracts currently emitted by grounding-adapter and safe to bind mechanically.
57
71
  * A fact whose physical period differs from this canonical instant snapshot still fails closed.
@@ -59,16 +73,59 @@ const INSTANT_AS_OF = Object.freeze({ basis: "instant", window: null, alignment:
59
73
  export const CANONICAL_SOLO_TEST_FACT_CONTRACTS = Object.freeze({
60
74
  "market.price": Object.freeze({ value_kind: "monetary", unit: "currency_units", period: INSTANT_AS_OF }),
61
75
  "market.change_pct": Object.freeze({ value_kind: "ratio", unit: "decimal", period: INSTANT_AS_OF }),
62
- "financial.return_on_equity_10y": Object.freeze({ value_kind: "ratio", unit: "decimal", period: INSTANT_AS_OF }),
63
- "financial.free_cash_flow_5y": Object.freeze({ value_kind: "monetary", unit: "currency_units", period: INSTANT_AS_OF }),
64
- "financial.interest_coverage": Object.freeze({ value_kind: "ratio", unit: "multiple", period: INSTANT_AS_OF }),
65
- "financial.gross_margin_5y": Object.freeze({ value_kind: "ratio", unit: "decimal", period: INSTANT_AS_OF }),
66
- "financial.net_margin_5y": Object.freeze({ value_kind: "ratio", unit: "decimal", period: INSTANT_AS_OF }),
67
- "accounting.cash_conversion": Object.freeze({ value_kind: "ratio", unit: "multiple", period: INSTANT_AS_OF }),
76
+ "financial.return_on_equity_10y": Object.freeze({ value_kind: "ratio", unit: "decimal", period: duration("P10Y") }),
77
+ "financial.free_cash_flow_5y": Object.freeze({ value_kind: "monetary", unit: "currency_units", period: duration("P5Y") }),
78
+ "financial.interest_coverage": Object.freeze({ value_kind: "ratio", unit: "multiple", period: duration(ANY_REPORTING_INTERVAL) }),
79
+ "financial.gross_margin_5y": Object.freeze({ value_kind: "ratio", unit: "decimal", period: duration("P5Y") }),
80
+ "financial.net_margin_5y": Object.freeze({ value_kind: "ratio", unit: "decimal", period: duration("P5Y") }),
81
+ "accounting.cash_conversion": Object.freeze({ value_kind: "ratio", unit: "multiple", period: duration("P5Y") }),
68
82
  "capital_allocation.share_count_change_5y": Object.freeze({ value_kind: "ratio", unit: "decimal", period: INSTANT_AS_OF }),
69
83
  "options.implied_volatility": Object.freeze({ value_kind: "ratio", unit: "decimal_annualized_volatility", period: INSTANT_AS_OF }),
70
84
  "options.skew_25d": Object.freeze({ value_kind: "ratio", unit: "decimal_volatility_difference", period: INSTANT_AS_OF }),
71
85
  "execution.bid_ask": Object.freeze({ value_kind: "ratio", unit: "decimal_of_mid", period: INSTANT_AS_OF }),
86
+
87
+ // Dated official series. These are what let a macro or cycle method have a direction at all,
88
+ // and their units are decimal fractions rather than the percent the sources publish.
89
+ "macro.long_bond_yield": Object.freeze({ value_kind: "ratio", unit: "decimal", period: INSTANT_AS_OF }),
90
+ "macro.short_bond_yield": Object.freeze({ value_kind: "ratio", unit: "decimal", period: INSTANT_AS_OF }),
91
+ "macro.term_structure_slope": Object.freeze({ value_kind: "ratio", unit: "decimal", period: INSTANT_AS_OF }),
92
+ "macro.real_rate": Object.freeze({ value_kind: "ratio", unit: "decimal", period: INSTANT_AS_OF }),
93
+ "macro.breakeven_inflation": Object.freeze({ value_kind: "ratio", unit: "decimal", period: INSTANT_AS_OF }),
94
+ "macro.aaa_corporate_yield": Object.freeze({ value_kind: "ratio", unit: "decimal", period: INSTANT_AS_OF }),
95
+ "macro.credit_spread": Object.freeze({ value_kind: "ratio", unit: "decimal", period: INSTANT_AS_OF }),
96
+ "macro.liquidity_impulse": Object.freeze({ value_kind: "ratio", unit: "decimal", period: duration("P3M") }),
97
+ // macro.growth_regime is deliberately absent. A tool contract accepts only monetary, ratio,
98
+ // count or scalar, so a text-valued fact cannot flow through the computation layer at all.
99
+ // It reaches a policy the other way: a condition compares it with `eq` against a state name.
100
+
101
+ // Company fundamentals derived from filings, beyond the seven the mechanical screen computes.
102
+ "financial.owner_earnings": Object.freeze({ value_kind: "monetary", unit: "currency_units", period: duration("P1Y") }),
103
+ "financial.net_current_asset_value": Object.freeze({ value_kind: "monetary", unit: "currency_units", period: INSTANT_AS_OF }),
104
+ "financial.incremental_return_on_capital": Object.freeze({ value_kind: "ratio", unit: "decimal", period: duration("P5Y") }),
105
+ "financial.leverage": Object.freeze({ value_kind: "ratio", unit: "decimal", period: INSTANT_AS_OF }),
106
+ "valuation.revenue_growth": Object.freeze({ value_kind: "ratio", unit: "decimal", period: duration(ANY_REPORTING_INTERVAL) }),
107
+ "valuation.downside_asset_value": Object.freeze({ value_kind: "monetary", unit: "currency_units", period: INSTANT_AS_OF }),
108
+ "valuation.downside_floor": Object.freeze({ value_kind: "monetary", unit: "currency_units", period: INSTANT_AS_OF }),
109
+ "capital_allocation.share_count": Object.freeze({ value_kind: "count", unit: "shares", period: duration("P1Y") }),
110
+
111
+ // Basket-level facts. Without these an index or fund method has nothing to reason about,
112
+ // which is why every seat abstained on an ETF regardless of how well it was written.
113
+ "index.aggregate_pe_ttm": Object.freeze({ value_kind: "ratio", unit: "multiple", period: INSTANT_AS_OF }),
114
+ "index.aggregate_pe_forward": Object.freeze({ value_kind: "ratio", unit: "multiple", period: INSTANT_AS_OF }),
115
+ "index.aggregate_earnings_yield": Object.freeze({ value_kind: "ratio", unit: "decimal", period: INSTANT_AS_OF }),
116
+ "index.dividend_yield": Object.freeze({ value_kind: "ratio", unit: "decimal", period: INSTANT_AS_OF }),
117
+ "fund.top_ten_weight": Object.freeze({ value_kind: "ratio", unit: "decimal", period: INSTANT_AS_OF }),
118
+ "fund.concentration_hhi": Object.freeze({ value_kind: "ratio", unit: "decimal", period: INSTANT_AS_OF }),
119
+ "valuation.implied_erp": Object.freeze({ value_kind: "ratio", unit: "decimal", period: INSTANT_AS_OF }),
120
+ "cycle.valuation_percentile": Object.freeze({ value_kind: "ratio", unit: "decimal", period: INSTANT_AS_OF }),
121
+ "index.breadth_above_200dma": Object.freeze({ value_kind: "ratio", unit: "decimal", period: INSTANT_AS_OF }),
122
+ "index.breadth_counted_above_200dma": Object.freeze({ value_kind: "ratio", unit: "decimal", period: INSTANT_AS_OF }),
123
+ "fund.aum": Object.freeze({ value_kind: "monetary", unit: "currency_units", period: INSTANT_AS_OF }),
124
+ "fund.expense_ratio": Object.freeze({ value_kind: "ratio", unit: "decimal", period: INSTANT_AS_OF }),
125
+
126
+ // The US has no promoter shareholding record. Section 16 ownership is the filed analogue,
127
+ // and it is what lets a governance-first method reach a number on this universe at all.
128
+ "governance.insider_ownership": Object.freeze({ value_kind: "ratio", unit: "decimal", period: INSTANT_AS_OF }),
72
129
  });
73
130
 
74
131
  const ID = /^[a-z][a-z0-9_.:-]{1,159}$/u;
@@ -153,6 +210,74 @@ function exactPendingCandidate(entry, candidateRoot) {
153
210
  return spec;
154
211
  }
155
212
 
213
+ /**
214
+ * The formula a seat's method actually needs, when one has been authored for it.
215
+ *
216
+ * Everything else in this module derives an identity proxy, which is executable and
217
+ * deliberately meaningless: it exists so the pipeline can be exercised before any method has
218
+ * been written. An authored formula replaces that with the seat's real arithmetic, still
219
+ * unreviewed and still barred from production, but no longer a placeholder pretending to be a
220
+ * computation. Both paths are validated identically downstream.
221
+ */
222
+ function authoredFormula(spec, authored) {
223
+ const tool = (authored?.tools || []).find((candidate) => candidate.tool_id === spec.tool_id);
224
+ if (!tool) return null;
225
+ // The per-tool candidate lists are a generated projection of the authored tools themselves,
226
+ // so checking one against the other proves nothing. What still has to hold is that every
227
+ // input names a real fact and the output is the one the spec was regenerated to expect --
228
+ // the meaningful contract check happens downstream, where the policy validator rejects any
229
+ // condition reading a fact the seat did not declare.
230
+ for (const operand of tool.inputs || []) {
231
+ if (operand?.fact_id && !ID.test(operand.fact_id)) {
232
+ fail(`${spec.tool_id}: authored input ${JSON.stringify(operand.fact_id)} is not a valid fact id`);
233
+ }
234
+ }
235
+ if (!ID.test(tool.output_id || "")) {
236
+ fail(`${spec.tool_id}: authored output ${JSON.stringify(tool.output_id)} is not a valid output id`);
237
+ }
238
+ const contractFor = (operand) => {
239
+ if (operand?.literal !== undefined) {
240
+ return { value_kind: "scalar", unit: SOLO_TEST_PROXY_UNIT, period: INSTANT_AS_OF };
241
+ }
242
+ if (operand?.fact_id) {
243
+ return CANONICAL_SOLO_TEST_FACT_CONTRACTS[operand.fact_id]
244
+ || { value_kind: "scalar", unit: SOLO_TEST_PROXY_UNIT, period: INSTANT_AS_OF };
245
+ }
246
+ // An output operand carries the PRODUCING tool's contract, not the consuming one's. The
247
+ // executor compares against what the producer declared, so reading the consumer's kind
248
+ // breaks every tool that divides a monetary numerator by a monetary denominator to make
249
+ // a ratio -- which is most of what a valuation method does.
250
+ if (operand?.output_id) {
251
+ const producer = (authored?.tools || []).find((candidate) => candidate.output_id === operand.output_id);
252
+ if (producer) return { value_kind: producer.value_kind, unit: producer.unit, period: INSTANT_AS_OF };
253
+ return { value_kind: "scalar", unit: SOLO_TEST_PROXY_UNIT, period: INSTANT_AS_OF };
254
+ }
255
+ return { value_kind: tool.value_kind, unit: tool.unit, period: INSTANT_AS_OF };
256
+ };
257
+ return canonicalValue({
258
+ version: "0.2.0",
259
+ kind: "recomputation",
260
+ operation: tool.operation,
261
+ on_missing: "fail",
262
+ inputs: (tool.inputs || []).map((operand) => {
263
+ const contract = contractFor(operand);
264
+ return {
265
+ operand,
266
+ value_kind: contract.value_kind,
267
+ unit: contract.unit,
268
+ period: contract.period,
269
+ on_missing: "fail",
270
+ };
271
+ }),
272
+ output: {
273
+ output_id: tool.output_id,
274
+ value_kind: tool.value_kind,
275
+ unit: tool.unit,
276
+ period: INSTANT_AS_OF,
277
+ },
278
+ });
279
+ }
280
+
156
281
  function proxyFormula(spec) {
157
282
  const inputFactId = spec.authorship_request.candidate_input_fact_types[0];
158
283
  const outputId = spec.authorship_request.candidate_output_fact_types[0];
@@ -186,11 +311,12 @@ function proxyFormula(spec) {
186
311
  }
187
312
 
188
313
  /** Create one explicitly non-reviewed derived proxy and its immutable local-test evidence. */
189
- export function deriveSoloTestFormula(entry, physicalCandidate) {
314
+ export function deriveSoloTestFormula(entry, physicalCandidate, authored = null) {
190
315
  if (physicalCandidate.formula_spec_id !== entry.formula_spec.formula_spec_id) {
191
316
  fail(`${entry.tool_id}: physical candidate identity does not match the current queue`);
192
317
  }
193
- const formula = proxyFormula(physicalCandidate);
318
+ const written = authoredFormula(physicalCandidate, authored);
319
+ const formula = written || proxyFormula(physicalCandidate);
194
320
  const derivationSpec = canonicalValue({
195
321
  schema_version: 1,
196
322
  artifact_kind: "persona_v3_provisional_formula_derivation_spec",
@@ -201,7 +327,9 @@ export function deriveSoloTestFormula(entry, physicalCandidate) {
201
327
  prototype_id: entry.prototype_id,
202
328
  prototype_content_hash: entry.source_prototype.content_hash,
203
329
  authoring_candidate_hash: sha256(physicalCandidate),
204
- derivation_policy: "first_declared_input_to_first_declared_output_identity_v1",
330
+ derivation_policy: written
331
+ ? "ai_authored_method_formula_v1"
332
+ : "first_declared_input_to_first_declared_output_identity_v1",
205
333
  input_contract_source: CANONICAL_SOLO_TEST_FACT_CONTRACTS[formula.inputs[0].operand.fact_id]
206
334
  ? "grounding_adapter_canonical_contract_v1"
207
335
  : "unknown_fact_fail_closed_proxy_scalar_v1",
@@ -222,8 +350,15 @@ export function deriveSoloTestFormula(entry, physicalCandidate) {
222
350
  derivation_spec: derivationSpec,
223
351
  derivation_spec_hash: derivationSpecHash,
224
352
  limitations: [
225
- "mechanical_identity_proxy_not_the_named_investor_method",
226
- "first_declared_input_and_output_are_test_contract_choices_not_human_adjudication",
353
+ ...(written
354
+ ? [
355
+ "ai_authored_candidate_formula_not_human_reviewed",
356
+ "thresholds_are_derived_from_published_method_writing_not_adjudicated",
357
+ ]
358
+ : [
359
+ "mechanical_identity_proxy_not_the_named_investor_method",
360
+ "first_declared_input_and_output_are_test_contract_choices_not_human_adjudication",
361
+ ]),
227
362
  ...(derivationSpec.input_contract_source === "unknown_fact_fail_closed_proxy_scalar_v1"
228
363
  ? ["unknown_fact_proxy_scalar_unit_requires_a_local_test_adapter"]
229
364
  : []),
@@ -280,7 +415,7 @@ export function planSoloTestFormulaCompilation({
280
415
  )).sort();
281
416
  const actualSpecFiles = collectFiles(resolve(candidate, "specs"));
282
417
  if (JSON.stringify(actualSpecFiles) !== JSON.stringify(expectedSpecFiles)) {
283
- fail("solo formula compilation requires exactly the 52 planned pending spec files", {
418
+ fail("solo formula compilation requires exactly the planned pending spec files, one per tool", {
284
419
  expected: expectedSpecFiles,
285
420
  actual: actualSpecFiles,
286
421
  });
@@ -294,14 +429,21 @@ export function planSoloTestFormulaCompilation({
294
429
 
295
430
  const records = authoring.inventory.entries.map((entry) => {
296
431
  const spec = exactPendingCandidate(entry, candidate);
297
- const derived = deriveSoloTestFormula(entry, spec);
432
+ const derived = deriveSoloTestFormula(entry, spec, authoredMethods[entry.persona_id] || null);
298
433
  return { entry, ...derived };
299
434
  });
300
435
  const tools = records.map((record) => record.tool);
301
436
  const ids = tools.map((tool) => tool.id);
302
437
  const outputs = tools.map((tool) => tool.output_id);
303
- if (tools.length !== 52 || new Set(ids).size !== 52 || new Set(outputs).size !== 52) {
304
- fail("solo formula compilation must produce 52 unique tools and outputs", {
438
+ // Derived from the authoring inventory rather than hardcoded, so a seat may declare a third
439
+ // tool without the guard reading it as drift. The property that matters is unchanged: one
440
+ // tool per planned entry, no id or output silently collapsing into another.
441
+ const expectedToolCount = authoring.inventory.entries.length;
442
+ if (tools.length !== expectedToolCount
443
+ || new Set(ids).size !== expectedToolCount
444
+ || new Set(outputs).size !== expectedToolCount) {
445
+ fail("solo formula compilation must produce one unique tool and output per planned entry", {
446
+ expected: expectedToolCount,
305
447
  tool_count: tools.length,
306
448
  unique_tool_count: new Set(ids).size,
307
449
  unique_output_count: new Set(outputs).size,
@@ -329,7 +471,7 @@ export function planSoloTestFormulaCompilation({
329
471
  production_eligible: false,
330
472
  method_model_eligible: false,
331
473
  canonical_seat_count: CANONICAL_MASTER_COUNT,
332
- planned_tool_count: 52,
474
+ planned_tool_count: PLANNED_TOOL_COUNT,
333
475
  compiled_tool_count: tools.length,
334
476
  provisional_derivation_count: records.length,
335
477
  formula_approval_binding_count: 0,
@@ -361,6 +503,25 @@ function writeStable(file, content, result) {
361
503
  result.written.push(file);
362
504
  }
363
505
 
506
+ /** Delete every regular file under `root` the compilation did not just account for. */
507
+ function pruneToWritten(root, keep) {
508
+ const removed = [];
509
+ const walk = (dir) => {
510
+ for (const entry of readdirSync(dir, { withFileTypes: true })) {
511
+ const path = resolve(dir, entry.name);
512
+ if (entry.isSymbolicLink()) fail(`unsafe solo formula entry: ${path}`);
513
+ if (entry.isDirectory()) {
514
+ walk(path);
515
+ if (!readdirSync(path).length) { rmSync(path, { recursive: false }); removed.push(path); }
516
+ continue;
517
+ }
518
+ if (!keep.has(path)) { rmSync(path); removed.push(path); }
519
+ }
520
+ };
521
+ walk(root);
522
+ return removed;
523
+ }
524
+
364
525
  function evidenceLeaf(personaId, toolId) {
365
526
  const prefix = `${personaId}.`;
366
527
  if (!toolId.startsWith(prefix)) fail(`tool id is not prefixed by ${personaId}`);
@@ -414,6 +575,11 @@ export function writeSoloTestFormulaCompilation({
414
575
  bindings: plan.bindings,
415
576
  });
416
577
  writeStable(resolve(root, "compilation-manifest.json"), `${JSON.stringify(manifest, null, 2)}\n`, result);
578
+ // A tool that is renamed leaves its old evidence file behind, and the downstream review binds
579
+ // the tree by exact file list -- so debris from a previous compilation reads as tampering
580
+ // rather than as staleness. The compilation owns this tree entirely; anything it did not just
581
+ // write does not belong in it.
582
+ result.removed = pruneToWritten(root, new Set([...result.written, ...result.unchanged]));
417
583
  return Object.freeze(canonicalValue({
418
584
  ...manifest,
419
585
  mode: "write_isolated_solo_test_compilation",
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Deterministic builder for the packaged 26-seat solo-test PersonaPack v3 tree.
2
+ * Deterministic builder for the packaged solo-test PersonaPack v3 tree.
3
3
  *
4
4
  * This is intentionally a separate assurance channel. It consumes only the isolated
5
5
  * provisional formula tree, writes manifests with build_profile=solo_test, uses pending
@@ -7,6 +7,7 @@
7
7
  * loader rejects every output. Normal admission therefore remains operator_lens.
8
8
  */
9
9
 
10
+ import { PLANNED_TOOL_COUNT } from "../../data/persona-v3-build-specs.v1.mjs";
10
11
  import {
11
12
  existsSync,
12
13
  lstatSync,
@@ -21,6 +22,7 @@ import { fileURLToPath } from "node:url";
21
22
  import { basename, dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
22
23
 
23
24
  import buildInventory from "../../data/persona-v3-build-specs.v1.mjs";
25
+ import { authoredMethods } from "../../data/authored/index.mjs";
24
26
  import {
25
27
  selectorBestForLocale,
26
28
  selectorMethodLocale,
@@ -161,7 +163,7 @@ function loadFormulaTree(formulaRoot) {
161
163
  const errors = [];
162
164
  if (manifest.schema_version !== 1) errors.push("schema_version must be 1");
163
165
  if (manifest.artifact_kind !== "persona_v3_solo_test_formula_staging_tree") errors.push("artifact_kind is invalid");
164
- if (manifest.canonical_seat_count !== 26 || manifest.compiled_tool_count !== 52) errors.push("manifest must bind exactly 26 seats and 52 tools");
166
+ if (manifest.canonical_seat_count !== CANONICAL_MASTER_COUNT || manifest.compiled_tool_count !== PLANNED_TOOL_COUNT) errors.push(`manifest must bind exactly ${CANONICAL_MASTER_COUNT} seats and ${PLANNED_TOOL_COUNT} tools`);
165
167
  if (manifest.assurance_class !== SOLO_TEST_ASSURANCE_CLASS) errors.push("assurance_class must be provisional_derived_proxy");
166
168
  if (manifest.review_status !== "not_human_reviewed") errors.push("review_status must be not_human_reviewed");
167
169
  if (manifest.production_eligible !== false || manifest.method_model_eligible !== false) errors.push("formula tree must be production/method-model ineligible");
@@ -193,7 +195,7 @@ function loadFormulaTree(formulaRoot) {
193
195
  if (JSON.stringify(actualSeatEntries) !== JSON.stringify([...CANONICAL_MASTER_IDS].sort())) {
194
196
  fail("formula tree contains missing or unexpected top-level entries", { actual: actualSeatEntries });
195
197
  }
196
- if (total !== 52) fail(`formula tree compiled ${total} tools instead of 52`);
198
+ if (total !== PLANNED_TOOL_COUNT) fail(`formula tree compiled ${total} tools instead of ${PLANNED_TOOL_COUNT}`);
197
199
  return { root, manifest, byPersona };
198
200
  }
199
201
 
@@ -296,6 +298,103 @@ function bindProxySource(tools, sourceId) {
296
298
  });
297
299
  }
298
300
 
301
+ /**
302
+ * A seat's real decision logic, when it has been authored.
303
+ *
304
+ * The generated fallback below scores every tool output against zero, which is executable and
305
+ * says nothing: it exists so the pipeline runs before a method is written. An authored policy
306
+ * replaces it with the seat's own judgement -- what it needs before it will speak at all
307
+ * (eligibility), what disqualifies a candidate outright (hard vetoes), and what it actually
308
+ * measures (scoring).
309
+ *
310
+ * The distinction between eligibility and scoring matters more than it looks. `min_coverage`
311
+ * is 1, so ONE uncomputable scoring rule collapses the whole seat to out_of_scope. That is
312
+ * precisely why twenty-five seats abstained on every symbol. A "can this method speak at all"
313
+ * test therefore belongs in eligibility, which has its own exit and its own explanation.
314
+ */
315
+ function authoredDecisionPolicy(seat, tools, authored) {
316
+ if (!authored?.scoring?.length || !authored?.bands?.length) return null;
317
+ const declaredStates = new Set(seat.native_decision_contract.states.map(executableNativeState));
318
+ const state = (value) => {
319
+ const resolved = executableNativeState(value);
320
+ if (!declaredStates.has(resolved)) {
321
+ fail(`${seat.persona_id}: authored policy uses undeclared native state ${JSON.stringify(value)}`, {
322
+ declared: [...declaredStates],
323
+ });
324
+ }
325
+ return resolved;
326
+ };
327
+ const outOfScopeHypothesis = seat.native_decision_contract.states
328
+ .find((candidate) => stanceForState(candidate) === "out_of_scope") || seat.native_decision_contract.states[0];
329
+ const outOfScope = executableNativeState(outOfScopeHypothesis);
330
+ const maxScore = authored.scoring.reduce((sum, rule) => sum + (rule.points || 0), 0);
331
+ return canonicalValue({
332
+ schema_version: 1,
333
+ dsl_version: "1.1",
334
+ native_decision_schema: seat.native_decision_contract.schema_id,
335
+ native_states: seat.native_decision_contract.states.map(executableNativeState),
336
+ abstention_policy: "fail_closed",
337
+ fact_gate: { on_missing_critical: { native_state: outOfScope, common_stance: "out_of_scope" } },
338
+ // Authoring supplies the judgement; the build supplies identity. Source ids are minted
339
+ // here because the loader rejects a source id that is not in the pack, and native states
340
+ // are mapped here because the authored form uses the raw name a build spec declares.
341
+ eligibility: {
342
+ all: (authored.eligibility?.all || []).map((entry) => ({
343
+ condition_id: entry.condition_id,
344
+ condition: entry.condition,
345
+ on_false: {
346
+ native_state: state(entry.on_false.native_state),
347
+ common_stance: entry.on_false.common_stance,
348
+ },
349
+ on_uncomputable: {
350
+ native_state: state((entry.on_uncomputable || entry.on_false).native_state),
351
+ common_stance: (entry.on_uncomputable || entry.on_false).common_stance,
352
+ },
353
+ source_ids: [authored.source_id],
354
+ })),
355
+ },
356
+ hard_vetoes: (authored.hard_vetoes || []).map((veto) => ({
357
+ veto_id: veto.veto_id,
358
+ condition: veto.condition,
359
+ on_trigger: {
360
+ native_state: state(veto.on_trigger.native_state),
361
+ common_stance: veto.on_trigger.common_stance,
362
+ },
363
+ // A veto whose condition cannot be evaluated must not read as "not triggered". An
364
+ // unmeasurable disqualifier is a reason to abstain, not a reason to proceed.
365
+ on_uncomputable: {
366
+ action: "abstain",
367
+ decision: {
368
+ native_state: state(veto.on_uncomputable?.native_state || outOfScopeHypothesis),
369
+ common_stance: veto.on_uncomputable?.common_stance || "out_of_scope",
370
+ },
371
+ },
372
+ source_ids: [authored.source_id],
373
+ })),
374
+ scoring: {
375
+ max_score: maxScore,
376
+ min_coverage: 1,
377
+ on_insufficient_coverage: { native_state: outOfScope, common_stance: "out_of_scope" },
378
+ rules: authored.scoring.map((rule) => ({
379
+ rule_id: rule.rule_id,
380
+ condition: rule.condition,
381
+ points: rule.points,
382
+ coverage_weight: rule.coverage_weight ?? 1,
383
+ source_ids: [authored.source_id],
384
+ })),
385
+ },
386
+ score_bands: authored.bands.map((band) => ({
387
+ min_ratio: band.min_ratio,
388
+ decision: { native_state: state(band.native_state), common_stance: band.common_stance },
389
+ })),
390
+ native_output_fields: tools.map((tool, index) => ({
391
+ field: `metric_${index + 1}`,
392
+ value: { output_id: tool.output_id },
393
+ on_missing: "fail",
394
+ })),
395
+ });
396
+ }
397
+
299
398
  function buildDecisionPolicy(seat, tools, sourceId) {
300
399
  const stateHypotheses = seat.native_decision_contract.states;
301
400
  const states = stateHypotheses.map(executableNativeState);
@@ -373,7 +472,9 @@ function buildDocuments({ seat, blueprint, rawTools, packVersion, formulaManifes
373
472
  const required = referencedFacts;
374
473
  const optional = seat.required_fact_types.filter((fact) => !required.includes(fact));
375
474
  if (!required.length) fail(`${seat.persona_id}: formula tools have no physical fact inputs`);
376
- const policy = buildDecisionPolicy(seat, tools, source.source_id);
475
+ const authored = authoredMethods[seat.persona_id] || null;
476
+ const policy = authoredDecisionPolicy(seat, tools, authored ? { ...authored, source_id: source.source_id } : null)
477
+ || buildDecisionPolicy(seat, tools, source.source_id);
377
478
  const policyErrors = validateDeterministicPolicyArtifacts({
378
479
  policy,
379
480
  tools,
@@ -525,7 +626,7 @@ function generationContext({ root = DEFAULT_SOLO_TEST_PACK_ROOT, formulaRoot = D
525
626
  const blueprints = canonicalMasterBlueprints({ personaDir });
526
627
  const byBlueprint = new Map(blueprints.map((blueprint) => [blueprint.persona_id, blueprint]));
527
628
  const bySeat = new Map(buildInventory.seats.map((seat) => [seat.persona_id, seat]));
528
- if (bySeat.size !== 26 || byBlueprint.size !== 26) fail("canonical solo-test inventory must contain exactly 26 unique seats");
629
+ if (bySeat.size !== CANONICAL_MASTER_COUNT || byBlueprint.size !== CANONICAL_MASTER_COUNT) fail(`canonical solo-test inventory must contain exactly ${CANONICAL_MASTER_COUNT} unique seats`);
529
630
  const output = resolve(root);
530
631
  if (basename(output) !== "masters" || basename(dirname(output)) !== "solo-test") {
531
632
  fail("solo-test pack root must end in knowledge/solo-test/masters (or an equivalent isolated solo-test/masters path)");
@@ -687,12 +788,12 @@ export function renderPersonaV3SoloTestPackReport(report) {
687
788
  "",
688
789
  "> These are packaged provisional operator lenses. They are not approved method models and the production loader rejects them.",
689
790
  "",
690
- `Physical packs: ${report.summary.physical_pack_count}/26`,
691
- `Solo loader valid: ${report.summary.solo_loader_valid_count}/26`,
692
- `Compiled: ${report.summary.compiler_valid_count}/26`,
693
- `Provisional operator lenses: ${report.summary.provisional_operator_lens_count}/26`,
694
- `Production loader rejected: ${report.summary.production_loader_rejection_count}/26`,
695
- `Tools: ${report.summary.tool_count}/52`,
791
+ `Physical packs: ${report.summary.physical_pack_count}/${CANONICAL_MASTER_COUNT}`,
792
+ `Solo loader valid: ${report.summary.solo_loader_valid_count}/${CANONICAL_MASTER_COUNT}`,
793
+ `Compiled: ${report.summary.compiler_valid_count}/${CANONICAL_MASTER_COUNT}`,
794
+ `Provisional operator lenses: ${report.summary.provisional_operator_lens_count}/${CANONICAL_MASTER_COUNT}`,
795
+ `Production loader rejected: ${report.summary.production_loader_rejection_count}/${CANONICAL_MASTER_COUNT}`,
796
+ `Tools: ${report.summary.tool_count}/${PLANNED_TOOL_COUNT}`,
696
797
  `Operational/method_model: ${report.summary.operational_count}/0`,
697
798
  `Ready for solo testing: ${report.summary.ready_for_solo_testing}`,
698
799
  `Readiness hash: \`${report.readiness_hash}\``,
@@ -8,6 +8,7 @@ import { mkdtempSync, rmSync } from "node:fs";
8
8
  import { tmpdir } from "node:os";
9
9
  import { join, resolve } from "node:path";
10
10
  import { fileURLToPath } from "node:url";
11
+ import { CANONICAL_MASTER_COUNT } from "../mcp/lib/personas-v3/staging.mjs";
11
12
 
12
13
  const root = fileURLToPath(new URL("..", import.meta.url));
13
14
  const serverEntry = join(root, "mcp", "server.mjs");
@@ -128,7 +129,7 @@ export async function runPackageSmoke() {
128
129
  host: "package-smoke",
129
130
  prompt: locale.prompt,
130
131
  }));
131
- assert.equal(catalog.masters.length, 26, `${locale.language} installed catalog must contain exactly 26 seats`);
132
+ assert.equal(catalog.masters.length, CANONICAL_MASTER_COUNT, `${locale.language} installed catalog must contain exactly ${CANONICAL_MASTER_COUNT} seats`);
132
133
  for (const master of catalog.masters) {
133
134
  for (const field of ["identity", "method", "best_for", "maturity_label"]) {
134
135
  assert.match(master[field], locale.script, `${locale.language} ${master.id}.${field}`);
@@ -6,6 +6,7 @@
6
6
  * Gaps are expected and do not make the command fail; malformed physical artifacts do.
7
7
  */
8
8
 
9
+ import { CANONICAL_MASTER_COUNT } from "../mcp/lib/personas-v3/staging.mjs";
9
10
  import { fileURLToPath } from "node:url";
10
11
  import { join, resolve } from "node:path";
11
12
  import { loadPersonas, defaultPersonaDir } from "../mcp/lib/personas/registry.mjs";
@@ -22,7 +23,9 @@ import {
22
23
  inspectPersonaAdmission,
23
24
  } from "../mcp/lib/personas-v3/admission.mjs";
24
25
 
25
- export const CANONICAL_MASTER_COUNT = 26;
26
+ // Re-exported rather than redeclared: two independent copies of the seat count is how a
27
+ // roster change passes one gate and fails another.
28
+ export { CANONICAL_MASTER_COUNT } from "../mcp/lib/personas-v3/staging.mjs";
26
29
 
27
30
  function invalidResult(personaId, promptPresent, error) {
28
31
  const counts = {};
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- /** Build or verify the isolated 52-tool AI-assisted formula cross-review tree. */
2
+ /** Build or verify the isolated AI-assisted formula cross-review tree. */
3
3
 
4
4
  import { resolve } from "node:path";
5
5
  import { fileURLToPath } from "node:url";
@@ -11,6 +11,10 @@ import {
11
11
  writeAIFormulaCrossReviews,
12
12
  } from "./lib/persona-v3-ai-formula-review.mjs";
13
13
  import { DEFAULT_SOLO_TEST_FORMULA_ROOT } from "./lib/persona-v3-solo-formula-pipeline.mjs";
14
+ import { PLANNED_TOOL_COUNT } from "../data/persona-v3-build-specs.v1.mjs";
15
+
16
+ /** The review profile gives every tool three independent machine roles. */
17
+ const INDEPENDENT_ROLES_PER_REVIEW = 3;
14
18
 
15
19
  export function parseArgs(argv) {
16
20
  const args = {
@@ -57,13 +61,13 @@ function compact(result) {
57
61
  return [
58
62
  "persona-v3-ai-formula-review:",
59
63
  `mode=${result.mode || "plan_ai_formula_cross_reviews"}`,
60
- `reviews=${result.review_count}/52`,
61
- `roles=${result.role_count}/156`,
64
+ `reviews=${result.review_count}/${PLANNED_TOOL_COUNT}`,
65
+ `roles=${result.role_count}/${PLANNED_TOOL_COUNT * INDEPENDENT_ROLES_PER_REVIEW}`,
62
66
  `vectors=${result.test_vector_count}`,
63
67
  `invariants=${result.invariant_count}`,
64
- `mechanical_pass=${result.mechanical_pass_count}/52`,
68
+ `mechanical_pass=${result.mechanical_pass_count}/${PLANNED_TOOL_COUNT}`,
65
69
  `disagreements=${result.disagreement_count}`,
66
- `semantic_unknown=${result.semantic_unknown_count}/52`,
70
+ `semantic_unknown=${result.semantic_unknown_count}/${PLANNED_TOOL_COUNT}`,
67
71
  `human_reviewers=${result.human_reviewer_count}`,
68
72
  `approvals=${result.approval_count}`,
69
73
  `production_eligible=${result.production_eligible}`,
@@ -88,11 +92,11 @@ export function main(argv = process.argv.slice(2)) {
88
92
  }
89
93
  if (args.json) process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
90
94
  else process.stdout.write(compact(result));
91
- const okay = result.review_count === 52
95
+ const okay = result.review_count === PLANNED_TOOL_COUNT
92
96
  && result.role_count === 156
93
- && result.mechanical_pass_count === 52
97
+ && result.mechanical_pass_count === PLANNED_TOOL_COUNT
94
98
  && result.disagreement_count === 0
95
- && result.semantic_unknown_count === 52
99
+ && result.semantic_unknown_count === PLANNED_TOOL_COUNT
96
100
  && result.human_reviewer_count === 0
97
101
  && result.approval_count === 0
98
102
  && result.production_eligible === false;
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- /** Create only missing PersonaPack v3 staging artifacts, then validate the full 26-seat tree. */
2
+ /** Create only missing PersonaPack v3 staging artifacts, then validate the full staging tree. */
3
3
 
4
4
  import { fileURLToPath } from "node:url";
5
5
  import { resolve } from "node:path";
@@ -37,7 +37,9 @@ Before giving a final investment answer, all gates below must be satisfied:
37
37
  when at least two completed and every failed role has a recorded diagnostic/data gap.
38
38
  5. Source gate: every material claim maps to scoped source IDs like `<task>:S1`; never cite bare `S1`.
39
39
  6. Master gate: every master named in the confirmed receipt has either reported or produced
40
- a deterministic `out_of_scope` result. An unexecuted selected seat keeps the run incomplete.
40
+ a deterministic `out_of_scope` result, every result has a readable final statement, and
41
+ every stable ID appears in the published Master Bench. An unexecuted or hidden selected
42
+ seat keeps the run incomplete or `needs_revision`.
41
43
  7. Debate gate: full requires all three bull/bear rounds, exact round-3 Q&A and PM. Quick
42
44
  requires one parallel statement round and PM; one degraded side is allowed only if the
43
45
  other side and PM completed, while two degraded sides or PM failure is incomplete.
@@ -53,7 +55,9 @@ Before giving a final investment answer, all gates below must be satisfied:
53
55
  winner, confidence, valuation/position, material gaps and saved file locations. Full
54
56
  also carries forward setup and invalidations. Quick names all four analyst statuses,
55
57
  selected method IDs/stances, dated recent company/industry news, every degraded item,
56
- and that it is not equivalent to full council.
58
+ and that it is not equivalent to full council. Full handoff ends with the exact selected
59
+ seat count and every per-seat method statement; use returned `user_response_markdown`
60
+ rather than an ACK-only recap.
57
61
  12. Deadline gate: plugin-managed quick uses headless `analyze_symbol`; `plan_visible_run`
58
62
  quick is rejected. Never extend its end-to-end deadline above 600000 ms or silently
59
63
  omit work to appear complete.
@@ -73,6 +77,8 @@ Before giving a final investment answer, all gates below must be satisfied:
73
77
  | "Quick report quality passed, so full passed." | Keep `full_council_equivalent=false`; only `quick_v1` passed. |
74
78
  | "The ten-minute clock expired, so skip a seat quietly." | Return the exact degraded/incomplete ledger; never extend the ceiling or invent evidence. |
75
79
  | "The master said this." | Call it a recorded method-seat result, never a quote from the named person. |
80
+ | "The PM ACK says complete, so I can summarize it." | Deliver the returned `user_response_markdown`; the final per-seat section is part of the contract. |
81
+ | "QQQ has an SEC CIK, so the company screen applies." | Classify first. ETF/fund/index company financial routes are not applicable; require look-through or aggregate evidence. |
76
82
 
77
83
  ## Exit Criteria
78
84