alphacouncil-agent 0.9.2 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (493) hide show
  1. package/.claude/commands/alpha.md +22 -3
  2. package/.claude-plugin/marketplace.json +3 -3
  3. package/.claude-plugin/plugin.json +2 -2
  4. package/.codex-plugin/plugin.json +4 -4
  5. package/.grok/commands/alpha.md +22 -3
  6. package/.opencode/command/alpha.md +22 -3
  7. package/AGENTS.md +42 -4
  8. package/CHANGELOG.md +164 -0
  9. package/CLAUDE.md +59 -7
  10. package/README.ja.md +25 -11
  11. package/README.md +44 -12
  12. package/README.zh-CN.md +37 -12
  13. package/commands/alpha.md +22 -3
  14. package/data/authored/core-seats.mjs +808 -0
  15. package/data/authored/growth-seats.mjs +581 -0
  16. package/data/authored/index.mjs +114 -0
  17. package/data/authored/quant-seats.mjs +564 -0
  18. package/data/authored/value-seats.mjs +663 -0
  19. package/data/build-profile.v1.json +2 -1
  20. package/data/council-evaluation-protocol.v1.json +7 -4
  21. package/data/master-selector-method-locales.v1.mjs +296 -0
  22. package/data/persona-v3-ai-assisted-solo-profile.v1.json +2 -2
  23. package/data/persona-v3-build-specs.v1.mjs +60 -3
  24. package/docs/INSTALL.md +43 -6
  25. package/docs/personas.md +2 -1
  26. package/docs/plans/v1.0-roadmap.md +487 -0
  27. package/docs/releases/v0.9.3.md +86 -0
  28. package/docs/releases/v0.9.4.md +79 -0
  29. package/docs/releases/v0.9.5.md +96 -0
  30. package/docs/releases/v1.0.0.md +164 -0
  31. package/docs/report-contract.md +75 -2
  32. package/knowledge/ai-assisted-solo/experiments/runs/a.json +13 -13
  33. package/knowledge/ai-assisted-solo/experiments/runs/b.json +2 -2
  34. package/knowledge/ai-assisted-solo/experiments/runs/c.json +2 -2
  35. package/knowledge/ai-assisted-solo/experiments/runs/d13.json +126 -126
  36. package/knowledge/ai-assisted-solo/experiments/runs/d26.json +274 -254
  37. package/knowledge/ai-assisted-solo/experiments/runs/e-d13.json +129 -129
  38. package/knowledge/ai-assisted-solo/experiments/runs/e-d26.json +277 -257
  39. package/knowledge/ai-assisted-solo/experiments/runs/h_ai_reference.json +278 -258
  40. package/knowledge/ai-assisted-solo/experiments/simulation-input.json +7278 -556
  41. package/knowledge/ai-assisted-solo/experiments/simulation-manifest.json +22 -22
  42. 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
  43. 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
  44. 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
  45. 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
  46. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_asness/reviews/{crowding_cost_stress.ai-review.json → nominal_earnings_yield_gap.ai-review.json} +49 -49
  47. 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
  48. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_bogle/reviews/expected_return_over_long_bond.ai-review.json +277 -0
  49. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_bogle/reviews/fundamental_expected_return.ai-review.json +277 -0
  50. 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
  51. 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
  52. 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
  53. 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
  54. 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
  55. 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
  56. 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
  57. 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
  58. 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
  59. 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
  60. 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
  61. 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
  62. 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
  63. 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
  64. 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
  65. 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
  66. 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
  67. 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
  68. 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
  69. 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
  70. 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
  71. 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
  72. 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
  73. 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
  74. 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
  75. 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
  76. 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
  77. 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
  78. 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
  79. 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
  80. 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
  81. 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
  82. 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
  83. 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
  84. 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
  85. 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
  86. 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
  87. 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
  88. 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
  89. 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
  90. 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
  91. 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
  92. 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
  93. 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
  94. 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
  95. 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
  96. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/review-manifest.json +288 -270
  97. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-semantic-adjudications/index.json +2 -2
  98. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-semantic-extractions/index.json +2 -2
  99. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-semantic-skeptic-reviews/index.json +2 -2
  100. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-source-prereviews/index.json +6 -2
  101. package/knowledge/solo-test/masters/master_ackman/decision_policy.json +122 -11
  102. package/knowledge/solo-test/masters/master_ackman/doctrine.jsonl +2 -2
  103. package/knowledge/solo-test/masters/master_ackman/manifest.json +27 -10
  104. package/knowledge/solo-test/masters/master_ackman/provisional-index.json +3 -3
  105. package/knowledge/solo-test/masters/master_ackman/sources.jsonl +1 -1
  106. package/knowledge/solo-test/masters/master_ackman/tools.json +56 -30
  107. package/knowledge/solo-test/masters/master_aschenbrenner/decision_policy.json +101 -10
  108. package/knowledge/solo-test/masters/master_aschenbrenner/doctrine.jsonl +2 -2
  109. package/knowledge/solo-test/masters/master_aschenbrenner/manifest.json +26 -8
  110. package/knowledge/solo-test/masters/master_aschenbrenner/provisional-index.json +3 -3
  111. package/knowledge/solo-test/masters/master_aschenbrenner/sources.jsonl +1 -1
  112. package/knowledge/solo-test/masters/master_aschenbrenner/tools.json +56 -30
  113. package/knowledge/solo-test/masters/master_asness/decision_policy.json +89 -10
  114. package/knowledge/solo-test/masters/master_asness/doctrine.jsonl +2 -2
  115. package/knowledge/solo-test/masters/master_asness/manifest.json +25 -8
  116. package/knowledge/solo-test/masters/master_asness/provisional-index.json +3 -3
  117. package/knowledge/solo-test/masters/master_asness/sources.jsonl +1 -1
  118. package/knowledge/solo-test/masters/master_asness/tools.json +56 -30
  119. package/knowledge/solo-test/masters/master_bogle/counterfactuals.jsonl +0 -0
  120. package/knowledge/solo-test/masters/master_bogle/decision_cases.jsonl +0 -0
  121. package/knowledge/solo-test/masters/master_bogle/decision_policy.json +170 -0
  122. package/knowledge/solo-test/masters/master_bogle/doctrine.jsonl +14 -0
  123. package/knowledge/solo-test/masters/master_bogle/evaluation/calibration_cases.jsonl +0 -0
  124. package/knowledge/solo-test/masters/master_bogle/evaluation/experiments.json +5 -0
  125. package/knowledge/solo-test/masters/master_bogle/evaluation/golden_cases.jsonl +0 -0
  126. package/knowledge/solo-test/masters/master_bogle/evaluation/pairwise_cases.jsonl +0 -0
  127. package/knowledge/solo-test/masters/master_bogle/failures.jsonl +0 -0
  128. package/knowledge/solo-test/masters/master_bogle/manifest.json +141 -0
  129. package/knowledge/solo-test/masters/master_bogle/memory_policy.json +5 -0
  130. package/knowledge/solo-test/masters/master_bogle/provisional-index.json +41 -0
  131. package/knowledge/solo-test/masters/master_bogle/research_policy.json +11 -0
  132. package/knowledge/solo-test/masters/master_bogle/sources.jsonl +1 -0
  133. package/knowledge/solo-test/masters/master_bogle/tools.json +120 -0
  134. package/knowledge/solo-test/masters/master_bogle/voice.en.md +7 -0
  135. package/knowledge/solo-test/masters/master_bogle/voice.zh.md +7 -0
  136. package/knowledge/solo-test/masters/master_buffett/decision_policy.json +102 -11
  137. package/knowledge/solo-test/masters/master_buffett/doctrine.jsonl +2 -2
  138. package/knowledge/solo-test/masters/master_buffett/manifest.json +24 -8
  139. package/knowledge/solo-test/masters/master_buffett/provisional-index.json +3 -3
  140. package/knowledge/solo-test/masters/master_buffett/sources.jsonl +1 -1
  141. package/knowledge/solo-test/masters/master_buffett/tools.json +55 -29
  142. package/knowledge/solo-test/masters/master_burry/decision_policy.json +102 -12
  143. package/knowledge/solo-test/masters/master_burry/doctrine.jsonl +2 -2
  144. package/knowledge/solo-test/masters/master_burry/manifest.json +26 -10
  145. package/knowledge/solo-test/masters/master_burry/provisional-index.json +3 -3
  146. package/knowledge/solo-test/masters/master_burry/sources.jsonl +1 -1
  147. package/knowledge/solo-test/masters/master_burry/tools.json +56 -30
  148. package/knowledge/solo-test/masters/master_cathie_wood/decision_policy.json +74 -12
  149. package/knowledge/solo-test/masters/master_cathie_wood/doctrine.jsonl +2 -2
  150. package/knowledge/solo-test/masters/master_cathie_wood/manifest.json +26 -10
  151. package/knowledge/solo-test/masters/master_cathie_wood/provisional-index.json +3 -3
  152. package/knowledge/solo-test/masters/master_cathie_wood/sources.jsonl +1 -1
  153. package/knowledge/solo-test/masters/master_cathie_wood/tools.json +56 -30
  154. package/knowledge/solo-test/masters/master_dalio/decision_policy.json +123 -16
  155. package/knowledge/solo-test/masters/master_dalio/doctrine.jsonl +2 -2
  156. package/knowledge/solo-test/masters/master_dalio/manifest.json +24 -8
  157. package/knowledge/solo-test/masters/master_dalio/provisional-index.json +3 -3
  158. package/knowledge/solo-test/masters/master_dalio/sources.jsonl +1 -1
  159. package/knowledge/solo-test/masters/master_dalio/tools.json +56 -30
  160. package/knowledge/solo-test/masters/master_damodaran/decision_policy.json +58 -10
  161. package/knowledge/solo-test/masters/master_damodaran/doctrine.jsonl +2 -2
  162. package/knowledge/solo-test/masters/master_damodaran/manifest.json +23 -8
  163. package/knowledge/solo-test/masters/master_damodaran/provisional-index.json +3 -3
  164. package/knowledge/solo-test/masters/master_damodaran/sources.jsonl +1 -1
  165. package/knowledge/solo-test/masters/master_damodaran/tools.json +54 -28
  166. package/knowledge/solo-test/masters/master_druckenmiller/decision_policy.json +89 -10
  167. package/knowledge/solo-test/masters/master_druckenmiller/doctrine.jsonl +2 -2
  168. package/knowledge/solo-test/masters/master_druckenmiller/manifest.json +25 -8
  169. package/knowledge/solo-test/masters/master_druckenmiller/provisional-index.json +3 -3
  170. package/knowledge/solo-test/masters/master_druckenmiller/sources.jsonl +1 -1
  171. package/knowledge/solo-test/masters/master_druckenmiller/tools.json +55 -29
  172. package/knowledge/solo-test/masters/master_duan_yongping/decision_policy.json +138 -13
  173. package/knowledge/solo-test/masters/master_duan_yongping/doctrine.jsonl +2 -2
  174. package/knowledge/solo-test/masters/master_duan_yongping/manifest.json +31 -11
  175. package/knowledge/solo-test/masters/master_duan_yongping/provisional-index.json +3 -3
  176. package/knowledge/solo-test/masters/master_duan_yongping/sources.jsonl +1 -1
  177. package/knowledge/solo-test/masters/master_duan_yongping/tools.json +82 -30
  178. package/knowledge/solo-test/masters/master_fisher/decision_policy.json +102 -11
  179. package/knowledge/solo-test/masters/master_fisher/doctrine.jsonl +2 -2
  180. package/knowledge/solo-test/masters/master_fisher/manifest.json +27 -10
  181. package/knowledge/solo-test/masters/master_fisher/provisional-index.json +3 -3
  182. package/knowledge/solo-test/masters/master_fisher/sources.jsonl +1 -1
  183. package/knowledge/solo-test/masters/master_fisher/tools.json +58 -32
  184. package/knowledge/solo-test/masters/master_forensic_short/decision_policy.json +93 -14
  185. package/knowledge/solo-test/masters/master_forensic_short/doctrine.jsonl +2 -2
  186. package/knowledge/solo-test/masters/master_forensic_short/manifest.json +20 -8
  187. package/knowledge/solo-test/masters/master_forensic_short/provisional-index.json +3 -3
  188. package/knowledge/solo-test/masters/master_forensic_short/sources.jsonl +1 -1
  189. package/knowledge/solo-test/masters/master_forensic_short/tools.json +53 -27
  190. package/knowledge/solo-test/masters/master_graham/decision_policy.json +103 -12
  191. package/knowledge/solo-test/masters/master_graham/doctrine.jsonl +2 -2
  192. package/knowledge/solo-test/masters/master_graham/manifest.json +26 -8
  193. package/knowledge/solo-test/masters/master_graham/provisional-index.json +3 -3
  194. package/knowledge/solo-test/masters/master_graham/sources.jsonl +1 -1
  195. package/knowledge/solo-test/masters/master_graham/tools.json +67 -28
  196. package/knowledge/solo-test/masters/master_jhunjhunwala/decision_policy.json +77 -12
  197. package/knowledge/solo-test/masters/master_jhunjhunwala/doctrine.jsonl +2 -2
  198. package/knowledge/solo-test/masters/master_jhunjhunwala/manifest.json +25 -10
  199. package/knowledge/solo-test/masters/master_jhunjhunwala/provisional-index.json +3 -3
  200. package/knowledge/solo-test/masters/master_jhunjhunwala/sources.jsonl +1 -1
  201. package/knowledge/solo-test/masters/master_jhunjhunwala/tools.json +54 -28
  202. package/knowledge/solo-test/masters/master_klarman/decision_policy.json +105 -14
  203. package/knowledge/solo-test/masters/master_klarman/doctrine.jsonl +2 -2
  204. package/knowledge/solo-test/masters/master_klarman/manifest.json +22 -6
  205. package/knowledge/solo-test/masters/master_klarman/provisional-index.json +3 -3
  206. package/knowledge/solo-test/masters/master_klarman/sources.jsonl +1 -1
  207. package/knowledge/solo-test/masters/master_klarman/tools.json +55 -29
  208. package/knowledge/solo-test/masters/master_li_lu/decision_policy.json +101 -10
  209. package/knowledge/solo-test/masters/master_li_lu/doctrine.jsonl +2 -2
  210. package/knowledge/solo-test/masters/master_li_lu/manifest.json +27 -10
  211. package/knowledge/solo-test/masters/master_li_lu/provisional-index.json +3 -3
  212. package/knowledge/solo-test/masters/master_li_lu/sources.jsonl +1 -1
  213. package/knowledge/solo-test/masters/master_li_lu/tools.json +58 -32
  214. package/knowledge/solo-test/masters/master_lynch/decision_policy.json +127 -16
  215. package/knowledge/solo-test/masters/master_lynch/doctrine.jsonl +2 -2
  216. package/knowledge/solo-test/masters/master_lynch/manifest.json +28 -10
  217. package/knowledge/solo-test/masters/master_lynch/provisional-index.json +3 -3
  218. package/knowledge/solo-test/masters/master_lynch/sources.jsonl +1 -1
  219. package/knowledge/solo-test/masters/master_lynch/tools.json +67 -28
  220. package/knowledge/solo-test/masters/master_marks/decision_policy.json +71 -9
  221. package/knowledge/solo-test/masters/master_marks/doctrine.jsonl +2 -2
  222. package/knowledge/solo-test/masters/master_marks/manifest.json +25 -10
  223. package/knowledge/solo-test/masters/master_marks/provisional-index.json +3 -3
  224. package/knowledge/solo-test/masters/master_marks/sources.jsonl +1 -1
  225. package/knowledge/solo-test/masters/master_marks/tools.json +54 -28
  226. package/knowledge/solo-test/masters/master_munger/decision_policy.json +141 -16
  227. package/knowledge/solo-test/masters/master_munger/doctrine.jsonl +2 -2
  228. package/knowledge/solo-test/masters/master_munger/manifest.json +24 -10
  229. package/knowledge/solo-test/masters/master_munger/provisional-index.json +3 -3
  230. package/knowledge/solo-test/masters/master_munger/sources.jsonl +1 -1
  231. package/knowledge/solo-test/masters/master_munger/tools.json +52 -26
  232. package/knowledge/solo-test/masters/master_natenberg/decision_policy.json +59 -11
  233. package/knowledge/solo-test/masters/master_natenberg/doctrine.jsonl +2 -2
  234. package/knowledge/solo-test/masters/master_natenberg/manifest.json +23 -10
  235. package/knowledge/solo-test/masters/master_natenberg/provisional-index.json +3 -3
  236. package/knowledge/solo-test/masters/master_natenberg/sources.jsonl +1 -1
  237. package/knowledge/solo-test/masters/master_natenberg/tools.json +50 -24
  238. package/knowledge/solo-test/masters/master_pabrai/decision_policy.json +125 -14
  239. package/knowledge/solo-test/masters/master_pabrai/doctrine.jsonl +2 -2
  240. package/knowledge/solo-test/masters/master_pabrai/manifest.json +22 -6
  241. package/knowledge/solo-test/masters/master_pabrai/provisional-index.json +3 -3
  242. package/knowledge/solo-test/masters/master_pabrai/sources.jsonl +1 -1
  243. package/knowledge/solo-test/masters/master_pabrai/tools.json +55 -29
  244. package/knowledge/solo-test/masters/master_simons/decision_policy.json +59 -11
  245. package/knowledge/solo-test/masters/master_simons/doctrine.jsonl +2 -2
  246. package/knowledge/solo-test/masters/master_simons/manifest.json +22 -8
  247. package/knowledge/solo-test/masters/master_simons/provisional-index.json +3 -3
  248. package/knowledge/solo-test/masters/master_simons/sources.jsonl +1 -1
  249. package/knowledge/solo-test/masters/master_simons/tools.json +43 -30
  250. package/knowledge/solo-test/masters/master_sinclair/decision_policy.json +59 -11
  251. package/knowledge/solo-test/masters/master_sinclair/doctrine.jsonl +2 -2
  252. package/knowledge/solo-test/masters/master_sinclair/manifest.json +22 -10
  253. package/knowledge/solo-test/masters/master_sinclair/provisional-index.json +3 -3
  254. package/knowledge/solo-test/masters/master_sinclair/sources.jsonl +1 -1
  255. package/knowledge/solo-test/masters/master_sinclair/tools.json +54 -28
  256. package/knowledge/solo-test/masters/master_soros/decision_policy.json +98 -10
  257. package/knowledge/solo-test/masters/master_soros/doctrine.jsonl +2 -2
  258. package/knowledge/solo-test/masters/master_soros/manifest.json +24 -11
  259. package/knowledge/solo-test/masters/master_soros/provisional-index.json +3 -3
  260. package/knowledge/solo-test/masters/master_soros/sources.jsonl +1 -1
  261. package/knowledge/solo-test/masters/master_soros/tools.json +54 -28
  262. package/knowledge/solo-test/masters/master_taleb/decision_policy.json +124 -13
  263. package/knowledge/solo-test/masters/master_taleb/doctrine.jsonl +2 -2
  264. package/knowledge/solo-test/masters/master_taleb/manifest.json +23 -9
  265. package/knowledge/solo-test/masters/master_taleb/provisional-index.json +3 -3
  266. package/knowledge/solo-test/masters/master_taleb/sources.jsonl +1 -1
  267. package/knowledge/solo-test/masters/master_taleb/tools.json +50 -24
  268. package/knowledge/solo-test/masters/master_thorp/decision_policy.json +61 -13
  269. package/knowledge/solo-test/masters/master_thorp/doctrine.jsonl +2 -2
  270. package/knowledge/solo-test/masters/master_thorp/manifest.json +25 -10
  271. package/knowledge/solo-test/masters/master_thorp/provisional-index.json +3 -3
  272. package/knowledge/solo-test/masters/master_thorp/sources.jsonl +1 -1
  273. package/knowledge/solo-test/masters/master_thorp/tools.json +56 -30
  274. package/knowledge/solo-test/persona-v3-solo-test-formulas/compilation-manifest.json +290 -264
  275. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_ackman/components/tools.json +58 -32
  276. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_ackman/provisional-derivations/market_capitalisation.derived-proxy-evidence.json +76 -0
  277. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_ackman/provisional-derivations/owner_earnings_yield.derived-proxy-evidence.json +76 -0
  278. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_aschenbrenner/components/tools.json +58 -32
  279. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_aschenbrenner/provisional-derivations/market_capitalisation.derived-proxy-evidence.json +76 -0
  280. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_aschenbrenner/provisional-derivations/price_implied_cash_yield.derived-proxy-evidence.json +76 -0
  281. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_asness/components/tools.json +58 -32
  282. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_asness/provisional-derivations/nominal_earnings_yield_gap.derived-proxy-evidence.json +76 -0
  283. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_asness/provisional-derivations/real_earnings_yield_gap.derived-proxy-evidence.json +76 -0
  284. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_bogle/components/tools.json +120 -0
  285. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_bogle/provisional-derivations/expected_return_over_long_bond.derived-proxy-evidence.json +77 -0
  286. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_bogle/provisional-derivations/fundamental_expected_return.derived-proxy-evidence.json +76 -0
  287. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_buffett/components/tools.json +57 -31
  288. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_buffett/provisional-derivations/market_capitalisation.derived-proxy-evidence.json +76 -0
  289. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_buffett/provisional-derivations/owner_earnings_yield.derived-proxy-evidence.json +76 -0
  290. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_burry/components/tools.json +58 -32
  291. 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
  292. 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
  293. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_cathie_wood/components/tools.json +58 -32
  294. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_cathie_wood/provisional-derivations/current_cash_yield.derived-proxy-evidence.json +76 -0
  295. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_cathie_wood/provisional-derivations/market_capitalisation.derived-proxy-evidence.json +76 -0
  296. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_dalio/components/tools.json +58 -32
  297. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_dalio/provisional-derivations/policy_real_rate.derived-proxy-evidence.json +76 -0
  298. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_dalio/provisional-derivations/real_curve_slope.derived-proxy-evidence.json +76 -0
  299. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_damodaran/components/tools.json +56 -30
  300. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_damodaran/provisional-derivations/implied_equity_risk_premium.derived-proxy-evidence.json +76 -0
  301. 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
  302. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_druckenmiller/components/tools.json +57 -31
  303. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_druckenmiller/provisional-derivations/liquidity_curve_impulse.derived-proxy-evidence.json +76 -0
  304. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_druckenmiller/provisional-derivations/policy_real_rate.derived-proxy-evidence.json +76 -0
  305. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_duan_yongping/components/tools.json +84 -32
  306. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_duan_yongping/provisional-derivations/five_year_opportunity_cost.derived-proxy-evidence.json +102 -0
  307. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_duan_yongping/provisional-derivations/margin_retention.derived-proxy-evidence.json +76 -0
  308. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_fisher/components/tools.json +60 -34
  309. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_fisher/provisional-derivations/margin_retention.derived-proxy-evidence.json +76 -0
  310. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_fisher/provisional-derivations/reinvestment_spread.derived-proxy-evidence.json +76 -0
  311. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_forensic_short/components/tools.json +55 -29
  312. 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
  313. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_forensic_short/provisional-derivations/cash_cover_of_leverage.derived-proxy-evidence.json +76 -0
  314. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_graham/components/tools.json +69 -30
  315. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_graham/provisional-derivations/defensive_hurdle_base.derived-proxy-evidence.json +89 -0
  316. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_graham/provisional-derivations/half_normalised_earnings_yield.derived-proxy-evidence.json +76 -0
  317. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_jhunjhunwala/components/tools.json +56 -30
  318. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_jhunjhunwala/provisional-derivations/cash_quality_gap.derived-proxy-evidence.json +76 -0
  319. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_jhunjhunwala/provisional-derivations/real_structural_growth.derived-proxy-evidence.json +76 -0
  320. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_klarman/components/tools.json +57 -31
  321. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_klarman/provisional-derivations/downside_asset_coverage.derived-proxy-evidence.json +76 -0
  322. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_klarman/provisional-derivations/market_capitalisation.derived-proxy-evidence.json +76 -0
  323. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_li_lu/components/tools.json +60 -34
  324. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_li_lu/provisional-derivations/cash_backed_decade_return.derived-proxy-evidence.json +76 -0
  325. 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
  326. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_lynch/components/tools.json +69 -30
  327. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_lynch/provisional-derivations/growth_justified_capitalisation.derived-proxy-evidence.json +89 -0
  328. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_lynch/provisional-derivations/market_capitalisation.derived-proxy-evidence.json +76 -0
  329. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_marks/components/tools.json +56 -30
  330. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_marks/provisional-derivations/credit_cycle_position.derived-proxy-evidence.json +76 -0
  331. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_marks/provisional-derivations/equity_over_corporate_debt.derived-proxy-evidence.json +76 -0
  332. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_munger/components/tools.json +54 -28
  333. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_munger/provisional-derivations/debt_service_cushion.derived-proxy-evidence.json +76 -0
  334. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_munger/provisional-derivations/reported_earnings_cash_gap.derived-proxy-evidence.json +76 -0
  335. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_natenberg/components/tools.json +52 -26
  336. 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
  337. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_natenberg/provisional-derivations/round_trip_cost.derived-proxy-evidence.json +76 -0
  338. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_pabrai/components/tools.json +57 -31
  339. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_pabrai/provisional-derivations/downside_floor_coverage.derived-proxy-evidence.json +76 -0
  340. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_pabrai/provisional-derivations/market_capitalisation.derived-proxy-evidence.json +76 -0
  341. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_simons/components/tools.json +45 -32
  342. 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
  343. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_simons/provisional-derivations/session_move_over_implied.derived-proxy-evidence.json +77 -0
  344. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_sinclair/components/tools.json +56 -30
  345. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_sinclair/provisional-derivations/round_trip_cost.derived-proxy-evidence.json +76 -0
  346. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_sinclair/provisional-derivations/volatility_per_unit_of_width.derived-proxy-evidence.json +76 -0
  347. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_soros/components/tools.json +56 -30
  348. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_soros/provisional-derivations/credit_cycle_position.derived-proxy-evidence.json +76 -0
  349. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_soros/provisional-derivations/financing_burden.derived-proxy-evidence.json +76 -0
  350. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_taleb/components/tools.json +52 -26
  351. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_taleb/provisional-derivations/debt_service_cushion.derived-proxy-evidence.json +76 -0
  352. 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
  353. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_thorp/components/tools.json +58 -32
  354. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_thorp/provisional-derivations/edge_per_unit_of_volatility.derived-proxy-evidence.json +77 -0
  355. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_thorp/provisional-derivations/net_edge.derived-proxy-evidence.json +76 -0
  356. package/mcp/lib/breadth.mjs +122 -0
  357. package/mcp/lib/codex.mjs +3 -3
  358. package/mcp/lib/constants.mjs +76 -25
  359. package/mcp/lib/council-options.mjs +95 -40
  360. package/mcp/lib/council-selection.mjs +95 -9
  361. package/mcp/lib/damodaran.mjs +119 -0
  362. package/mcp/lib/fred.mjs +246 -0
  363. package/mcp/lib/fund-holdings-parsers.mjs +297 -0
  364. package/mcp/lib/fundamentals.mjs +801 -0
  365. package/mcp/lib/funds.mjs +750 -0
  366. package/mcp/lib/gates.mjs +149 -15
  367. package/mcp/lib/grounding.mjs +188 -36
  368. package/mcp/lib/index-aggregate.mjs +718 -0
  369. package/mcp/lib/insider-ownership.mjs +149 -0
  370. package/mcp/lib/instrument-facts.mjs +557 -0
  371. package/mcp/lib/instruments.mjs +191 -0
  372. package/mcp/lib/lang.mjs +109 -2
  373. package/mcp/lib/markdown.mjs +620 -138
  374. package/mcp/lib/master-catalog.mjs +32 -3
  375. package/mcp/lib/orchestrator.mjs +1121 -290
  376. package/mcp/lib/packets.mjs +227 -21
  377. package/mcp/lib/personas/engine.mjs +44 -31
  378. package/mcp/lib/personas-v3/compiler.mjs +2 -0
  379. package/mcp/lib/personas-v3/deterministic-executor.mjs +13 -2
  380. package/mcp/lib/personas-v3/ga-external-evidence.mjs +3 -2
  381. package/mcp/lib/personas-v3/ga-gate.mjs +2 -1
  382. package/mcp/lib/personas-v3/ga-package-evidence.mjs +5 -4
  383. package/mcp/lib/personas-v3/grounding-adapter.mjs +309 -2
  384. package/mcp/lib/personas-v3/loader.mjs +10 -7
  385. package/mcp/lib/personas-v3/production-root.mjs +5 -4
  386. package/mcp/lib/personas-v3/release-formula-evidence.mjs +14 -7
  387. package/mcp/lib/personas-v3/release-source-evidence.mjs +2 -1
  388. package/mcp/lib/personas-v3/releases.mjs +5 -4
  389. package/mcp/lib/personas-v3/runtime-release-integrity.mjs +6 -5
  390. package/mcp/lib/personas-v3/semantic-source-adjudication.mjs +2 -1
  391. package/mcp/lib/personas-v3/semantic-source-extraction.mjs +2 -1
  392. package/mcp/lib/personas-v3/semantic-source-skeptic-review.mjs +2 -1
  393. package/mcp/lib/personas-v3/source-acquisition.mjs +10 -3
  394. package/mcp/lib/personas-v3/source-review-operations.mjs +3 -2
  395. package/mcp/lib/personas-v3/staging.mjs +22 -3
  396. package/mcp/lib/prompts.mjs +119 -2
  397. package/mcp/lib/quotes.mjs +5 -0
  398. package/mcp/lib/rpc.mjs +101 -42
  399. package/mcp/lib/run-store.mjs +28 -3
  400. package/mcp/lib/sec.mjs +32 -0
  401. package/mcp/lib/tables.mjs +11 -0
  402. package/mcp/lib/voice.mjs +122 -0
  403. package/mcp/lib/xbrl-aggregates.mjs +153 -0
  404. package/mcp/lib/xbrl-series.mjs +339 -0
  405. package/mcp/lib/xlsx.mjs +155 -0
  406. package/package.json +5 -5
  407. package/personas/masters/masters-value/bogle.md +145 -0
  408. package/schemas/council-evaluation-protocol-v1.schema.json +2 -2
  409. package/schemas/persona-v3-ai-assisted-solo-profile-v1.schema.json +2 -2
  410. package/schemas/persona-v3-ai-machine-simulation-v1.schema.json +1 -1
  411. package/schemas/persona-v3-build-spec-v1.schema.json +3 -3
  412. package/schemas/persona-v3-release-formula-review-evidence-v1.schema.json +3 -3
  413. package/schemas/persona-v3-release-manifest-v1.schema.json +6 -6
  414. package/schemas/persona-v3-release-source-review-evidence-v1.schema.json +3 -3
  415. package/schemas/persona-v3-tool-graph-v1.schema.json +1 -1
  416. package/schemas/persona-v3.schema.json +37 -2
  417. package/schemas/source-review-batch-v1.schema.json +9 -9
  418. package/scripts/assemble-persona-v3-release.mjs +3 -2
  419. package/scripts/build-persona-v3-solo-test-packs.mjs +6 -8
  420. package/scripts/check-persona-v3-ga.mjs +1 -1
  421. package/scripts/check-persona-v3-production-candidates.mjs +1 -1
  422. package/scripts/compile-persona-v3-formulas.mjs +19 -18
  423. package/scripts/doctor.mjs +11 -9
  424. package/scripts/export-persona-source-review-batch.mjs +1 -1
  425. package/scripts/generate-persona-v3-drafts.mjs +2 -2
  426. package/scripts/lib/build-profile.mjs +24 -0
  427. package/scripts/lib/council-evaluation-protocol.mjs +7 -6
  428. package/scripts/lib/host-capabilities.mjs +2 -1
  429. package/scripts/lib/packaged-host-parity.mjs +63 -8
  430. package/scripts/lib/persona-v3-ai-assisted-solo-status.mjs +6 -4
  431. package/scripts/lib/persona-v3-ai-formula-review.mjs +6 -5
  432. package/scripts/lib/persona-v3-ai-machine-simulations.mjs +32 -4
  433. package/scripts/lib/persona-v3-build-specs.mjs +3 -2
  434. package/scripts/lib/persona-v3-draft-packs.mjs +2 -2
  435. package/scripts/lib/persona-v3-formula-pipeline.mjs +11 -10
  436. package/scripts/lib/persona-v3-production-candidates.mjs +10 -9
  437. package/scripts/lib/persona-v3-solo-formula-pipeline.mjs +182 -16
  438. package/scripts/lib/persona-v3-solo-test-packs.mjs +143 -16
  439. package/scripts/package-smoke.mjs +32 -12
  440. package/scripts/report-persona-corpus-gaps.mjs +4 -1
  441. package/scripts/review-persona-v3-solo-formulas.mjs +12 -8
  442. package/scripts/run-tests.mjs +23 -2
  443. package/scripts/scaffold-persona-v3-staging.mjs +1 -1
  444. package/skills/agent-skills-governance/SKILL.md +8 -2
  445. package/skills/alphacouncil-agent/SKILL.md +60 -9
  446. package/skills/public-equity-investing/SKILL.md +17 -0
  447. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_ackman/provisional-derivations/change_value_bridge.derived-proxy-evidence.json +0 -64
  448. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_ackman/provisional-derivations/power_map.derived-proxy-evidence.json +0 -64
  449. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_aschenbrenner/provisional-derivations/compute_power_bridge.derived-proxy-evidence.json +0 -64
  450. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_aschenbrenner/provisional-derivations/timeline_reverse_valuation.derived-proxy-evidence.json +0 -64
  451. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_asness/provisional-derivations/crowding_cost_stress.derived-proxy-evidence.json +0 -64
  452. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_asness/provisional-derivations/factor_decomposer.derived-proxy-evidence.json +0 -64
  453. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_buffett/provisional-derivations/incremental_returns.derived-proxy-evidence.json +0 -64
  454. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_buffett/provisional-derivations/owner_earnings_rebuilder.derived-proxy-evidence.json +0 -64
  455. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_burry/provisional-derivations/capital_structure_reader.derived-proxy-evidence.json +0 -64
  456. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_burry/provisional-derivations/mispricing_carry.derived-proxy-evidence.json +0 -64
  457. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_cathie_wood/provisional-derivations/capture_valuation_bridge.derived-proxy-evidence.json +0 -64
  458. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_cathie_wood/provisional-derivations/cost_adoption_curve.derived-proxy-evidence.json +0 -64
  459. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_dalio/provisional-derivations/debt_driver_stress.derived-proxy-evidence.json +0 -64
  460. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_dalio/provisional-derivations/regime_classifier.derived-proxy-evidence.json +0 -64
  461. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_damodaran/provisional-derivations/story_dcf.derived-proxy-evidence.json +0 -64
  462. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_druckenmiller/provisional-derivations/inflection_payoff.derived-proxy-evidence.json +0 -64
  463. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_druckenmiller/provisional-derivations/liquidity_revision_map.derived-proxy-evidence.json +0 -64
  464. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_duan_yongping/provisional-derivations/opportunity_cost.derived-proxy-evidence.json +0 -64
  465. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_duan_yongping/provisional-derivations/user_value_evidence.derived-proxy-evidence.json +0 -64
  466. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_fisher/provisional-derivations/research_productivity.derived-proxy-evidence.json +0 -64
  467. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_fisher/provisional-derivations/scuttlebutt_graph.derived-proxy-evidence.json +0 -64
  468. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_forensic_short/provisional-derivations/borrow_catalyst.derived-proxy-evidence.json +0 -64
  469. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_graham/provisional-derivations/asset_floor.derived-proxy-evidence.json +0 -64
  470. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_graham/provisional-derivations/normalized_earnings.derived-proxy-evidence.json +0 -64
  471. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_jhunjhunwala/provisional-derivations/penetration_liquidity.derived-proxy-evidence.json +0 -64
  472. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_jhunjhunwala/provisional-derivations/promoter_governance.derived-proxy-evidence.json +0 -64
  473. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_klarman/provisional-derivations/cash_catalyst_compare.derived-proxy-evidence.json +0 -64
  474. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_klarman/provisional-derivations/recovery_waterfall.derived-proxy-evidence.json +0 -64
  475. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_li_lu/provisional-derivations/promise_integrity_ledger.derived-proxy-evidence.json +0 -64
  476. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_li_lu/provisional-derivations/ten_year_return_bridge.derived-proxy-evidence.json +0 -64
  477. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_lynch/provisional-derivations/category_classifier.derived-proxy-evidence.json +0 -64
  478. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_lynch/provisional-derivations/story_numbers_check.derived-proxy-evidence.json +0 -64
  479. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_marks/provisional-derivations/cycle_temperature.derived-proxy-evidence.json +0 -64
  480. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_marks/provisional-derivations/implied_expectations.derived-proxy-evidence.json +0 -64
  481. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_munger/provisional-derivations/failure_path_graph.derived-proxy-evidence.json +0 -64
  482. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_munger/provisional-derivations/incentive_map.derived-proxy-evidence.json +0 -64
  483. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_pabrai/provisional-derivations/discrete_payoff.derived-proxy-evidence.json +0 -64
  484. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_pabrai/provisional-derivations/downside_floor.derived-proxy-evidence.json +0 -64
  485. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_simons/provisional-derivations/leakage_audit.derived-proxy-evidence.json +0 -64
  486. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_simons/provisional-derivations/oos_cost_test.derived-proxy-evidence.json +0 -64
  487. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_sinclair/provisional-derivations/net_edge_sizer.derived-proxy-evidence.json +0 -64
  488. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_sinclair/provisional-derivations/realized_vol_forecast.derived-proxy-evidence.json +0 -64
  489. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_soros/provisional-derivations/reflexivity_graph.derived-proxy-evidence.json +0 -64
  490. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_soros/provisional-derivations/reversal_monitor.derived-proxy-evidence.json +0 -64
  491. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_taleb/provisional-derivations/payoff_ruin.derived-proxy-evidence.json +0 -64
  492. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_thorp/provisional-derivations/edge_recalculator.derived-proxy-evidence.json +0 -64
  493. 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,12 @@ 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";
26
+ import {
27
+ selectorBestForLocale,
28
+ selectorMethodLocale,
29
+ } from "../../data/master-selector-method-locales.v1.mjs";
30
+ import { selectorCard } from "../../mcp/lib/master-catalog.mjs";
24
31
  import { inspectPersonaAdmission } from "../../mcp/lib/personas-v3/admission.mjs";
25
32
  import {
26
33
  canonicalValue,
@@ -156,7 +163,7 @@ function loadFormulaTree(formulaRoot) {
156
163
  const errors = [];
157
164
  if (manifest.schema_version !== 1) errors.push("schema_version must be 1");
158
165
  if (manifest.artifact_kind !== "persona_v3_solo_test_formula_staging_tree") errors.push("artifact_kind is invalid");
159
- 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`);
160
167
  if (manifest.assurance_class !== SOLO_TEST_ASSURANCE_CLASS) errors.push("assurance_class must be provisional_derived_proxy");
161
168
  if (manifest.review_status !== "not_human_reviewed") errors.push("review_status must be not_human_reviewed");
162
169
  if (manifest.production_eligible !== false || manifest.method_model_eligible !== false) errors.push("formula tree must be production/method-model ineligible");
@@ -188,7 +195,7 @@ function loadFormulaTree(formulaRoot) {
188
195
  if (JSON.stringify(actualSeatEntries) !== JSON.stringify([...CANONICAL_MASTER_IDS].sort())) {
189
196
  fail("formula tree contains missing or unexpected top-level entries", { actual: actualSeatEntries });
190
197
  }
191
- 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}`);
192
199
  return { root, manifest, byPersona };
193
200
  }
194
201
 
@@ -291,6 +298,103 @@ function bindProxySource(tools, sourceId) {
291
298
  });
292
299
  }
293
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
+
294
398
  function buildDecisionPolicy(seat, tools, sourceId) {
295
399
  const stateHypotheses = seat.native_decision_contract.states;
296
400
  const states = stateHypotheses.map(executableNativeState);
@@ -368,7 +472,9 @@ function buildDocuments({ seat, blueprint, rawTools, packVersion, formulaManifes
368
472
  const required = referencedFacts;
369
473
  const optional = seat.required_fact_types.filter((fact) => !required.includes(fact));
370
474
  if (!required.length) fail(`${seat.persona_id}: formula tools have no physical fact inputs`);
371
- 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);
372
478
  const policyErrors = validateDeterministicPolicyArtifacts({
373
479
  policy,
374
480
  tools,
@@ -381,14 +487,26 @@ function buildDocuments({ seat, blueprint, rawTools, packVersion, formulaManifes
381
487
  if (policyErrors.length) fail(`${seat.persona_id}: generated deterministic policy is invalid`, { errors: policyErrors });
382
488
 
383
489
  const publicTitle = blueprint.canonical_title;
490
+ const selectorPersona = { id: seat.persona_id, title: publicTitle };
491
+ const chineseMethod = selectorCard(selectorPersona, "zh-CN").method;
384
492
  const manifest = canonicalValue({
385
493
  schema_version: 3,
386
494
  build_profile: "solo_test",
387
495
  pack_version: packVersion,
388
496
  identity: {
389
497
  persona_id: seat.persona_id,
390
- public_label: { en: `${publicTitle.en} Solo Test`, zh: `${publicTitle.zh}单人测试` },
391
- operator_label: { en: `${publicTitle.en} Provisional Operator Lens`, zh: `${publicTitle.zh}临时操作视角` },
498
+ public_label: {
499
+ en: `${publicTitle.en} Solo Test`,
500
+ zh: `${publicTitle.zh}单人测试`,
501
+ ja: `${publicTitle.en} 単独テスト`,
502
+ ko: `${publicTitle.en} 단독 테스트`,
503
+ },
504
+ operator_label: {
505
+ en: `${publicTitle.en} Provisional Operator Lens`,
506
+ zh: `${publicTitle.zh}临时操作视角`,
507
+ ja: `${publicTitle.en} 暫定オペレーター・レンズ`,
508
+ ko: `${publicTitle.en} 임시 오퍼레이터 렌즈`,
509
+ },
392
510
  maturity: "operator_lens",
393
511
  source_cutoff: SOURCE_DATE,
394
512
  },
@@ -396,11 +514,20 @@ function buildDocuments({ seat, blueprint, rawTools, packVersion, formulaManifes
396
514
  identity: {
397
515
  en: `${publicTitle.en}; project-derived and not human reviewed`,
398
516
  zh: `${publicTitle.zh};项目派生、未经人工审定`,
517
+ ja: `${publicTitle.en}。プロジェクト派生で、方法帰属について人による審査を受けていない暫定オペレーター・レンズ。本人の発言や現在の見解ではない。`,
518
+ ko: `${publicTitle.en}. 프로젝트에서 파생되었고 방법 귀속에 대한 인적 심사를 거치지 않은 임시 오퍼레이터 렌즈다. 본인의 발언이나 현재 견해가 아니다.`,
519
+ },
520
+ method: {
521
+ en: seat.method_scope.planning_hypothesis,
522
+ zh: chineseMethod,
523
+ ja: selectorMethodLocale(seat.persona_id, "ja"),
524
+ ko: selectorMethodLocale(seat.persona_id, "ko"),
399
525
  },
400
- method: { en: seat.method_scope.planning_hypothesis, zh: seat.method_scope.planning_hypothesis },
401
526
  best_for: {
402
- en: `Testing deterministic behavior in ${seat.method_scope.applicable_domains.join(", ")}`,
403
- zh: `用于测试确定性行为:${seat.method_scope.applicable_domains.join("")}`,
527
+ en: selectorBestForLocale(seat.persona_id, "en"),
528
+ zh: selectorBestForLocale(seat.persona_id, "zh"),
529
+ ja: selectorBestForLocale(seat.persona_id, "ja"),
530
+ ko: selectorBestForLocale(seat.persona_id, "ko"),
404
531
  },
405
532
  },
406
533
  capability: {
@@ -499,7 +626,7 @@ function generationContext({ root = DEFAULT_SOLO_TEST_PACK_ROOT, formulaRoot = D
499
626
  const blueprints = canonicalMasterBlueprints({ personaDir });
500
627
  const byBlueprint = new Map(blueprints.map((blueprint) => [blueprint.persona_id, blueprint]));
501
628
  const bySeat = new Map(buildInventory.seats.map((seat) => [seat.persona_id, seat]));
502
- 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`);
503
630
  const output = resolve(root);
504
631
  if (basename(output) !== "masters" || basename(dirname(output)) !== "solo-test") {
505
632
  fail("solo-test pack root must end in knowledge/solo-test/masters (or an equivalent isolated solo-test/masters path)");
@@ -661,12 +788,12 @@ export function renderPersonaV3SoloTestPackReport(report) {
661
788
  "",
662
789
  "> These are packaged provisional operator lenses. They are not approved method models and the production loader rejects them.",
663
790
  "",
664
- `Physical packs: ${report.summary.physical_pack_count}/26`,
665
- `Solo loader valid: ${report.summary.solo_loader_valid_count}/26`,
666
- `Compiled: ${report.summary.compiler_valid_count}/26`,
667
- `Provisional operator lenses: ${report.summary.provisional_operator_lens_count}/26`,
668
- `Production loader rejected: ${report.summary.production_loader_rejection_count}/26`,
669
- `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}`,
670
797
  `Operational/method_model: ${report.summary.operational_count}/0`,
671
798
  `Ready for solo testing: ${report.summary.ready_for_solo_testing}`,
672
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");
@@ -107,19 +108,38 @@ export async function runPackageSmoke() {
107
108
 
108
109
  const listed = await server.request("tools/list", {});
109
110
  const tools = listed.result?.tools || [];
111
+ assert.equal(tools.length, 31, "installed server must expose exactly 31 MCP tools");
110
112
  const names = new Set(tools.map((tool) => tool.name));
111
113
  for (const required of ["begin_council_selection", "confirm_master_selection", "plan_visible_run", "analyze_symbol"]) {
112
114
  assert.ok(names.has(required), `installed server is missing ${required}`);
113
115
  }
114
116
 
115
- const prompt = "bounded installed-package smoke";
116
- const opened = structured(await server.callTool("begin_council_selection", {
117
- symbol: "AAPL",
118
- language: "English",
119
- host: "package-smoke",
120
- prompt,
121
- }));
122
- assert.equal(opened.masters.length, 26, "installed catalog must contain exactly 26 seats");
117
+ const localeCases = [
118
+ { language: "en-US", prompt: "bounded installed-package smoke", script: /[A-Za-z]/u },
119
+ { language: "zh-CN", prompt: "安装包有界烟雾测试", script: /\p{Script=Han}/u },
120
+ { language: "ja-JP", prompt: "インストール済みパッケージの有界スモークテスト", script: /[\p{Script=Hiragana}\p{Script=Katakana}]/u },
121
+ { language: "ko-KR", prompt: "설치 패키지의 제한된 스모크 테스트", script: /\p{Script=Hangul}/u },
122
+ ];
123
+ let opened;
124
+ let prompt;
125
+ for (const locale of localeCases) {
126
+ const catalog = structured(await server.callTool("begin_council_selection", {
127
+ symbol: "AAPL",
128
+ language: locale.language,
129
+ host: "package-smoke",
130
+ prompt: locale.prompt,
131
+ }));
132
+ assert.equal(catalog.masters.length, CANONICAL_MASTER_COUNT, `${locale.language} installed catalog must contain exactly ${CANONICAL_MASTER_COUNT} seats`);
133
+ for (const master of catalog.masters) {
134
+ for (const field of ["identity", "method", "best_for", "maturity_label"]) {
135
+ assert.match(master[field], locale.script, `${locale.language} ${master.id}.${field}`);
136
+ }
137
+ }
138
+ if (locale.language === "zh-CN") {
139
+ opened = catalog;
140
+ prompt = locale.prompt;
141
+ }
142
+ }
123
143
 
124
144
  const confirmed = structured(await server.callTool("confirm_master_selection", {
125
145
  selection_id: opened.selection_id,
@@ -132,7 +152,7 @@ export async function runPackageSmoke() {
132
152
  const runId = `PACKAGE-SMOKE-${process.pid}`;
133
153
  const planned = structured(await server.callTool("plan_visible_run", {
134
154
  symbol: "AAPL",
135
- language: "English",
155
+ language: "zh-CN",
136
156
  prompt,
137
157
  run_id: runId,
138
158
  tasks: ["market_data"],
@@ -143,7 +163,7 @@ export async function runPackageSmoke() {
143
163
 
144
164
  const replay = await server.callTool("plan_visible_run", {
145
165
  symbol: "AAPL",
146
- language: "English",
166
+ language: "zh-CN",
147
167
  prompt,
148
168
  run_id: `${runId}-REPLAY`,
149
169
  tasks: ["market_data"],
@@ -152,8 +172,8 @@ export async function runPackageSmoke() {
152
172
  });
153
173
  assert.equal(replay.error?.data?.reason, "MASTER_SELECTION_REPLAYED");
154
174
 
155
- process.stdout.write(`package-smoke: passed tools=${tools.length} catalog=26 selected=1 replay_rejected=true\n`);
156
- return { tools: tools.length, catalog: 26, selected: 1, replay_rejected: true };
175
+ process.stdout.write(`package-smoke: passed tools=${tools.length} catalog=26 locales=4 selected=1 replay_rejected=true\n`);
176
+ return { tools: tools.length, catalog: 26, locales: 4, selected: 1, replay_rejected: true };
157
177
  } finally {
158
178
  if (!server.child.killed) await server.close().catch(() => server.child.kill());
159
179
  rmSync(dataDir, { recursive: true, force: true });
@@ -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 = {};