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
@@ -18,6 +18,8 @@ import {
18
18
  } from "../mcp/lib/personas-v3/registry.mjs";
19
19
  import { scanPersonaCorpusGaps } from "./report-persona-corpus-gaps.mjs";
20
20
  import { auditHostAdapterFreshness, validateHostCapabilities } from "./lib/host-capabilities.mjs";
21
+ import { CANONICAL_MASTER_COUNT } from "../mcp/lib/personas-v3/staging.mjs";
22
+ import { PLANNED_TOOL_COUNT } from "../data/persona-v3-build-specs.v1.mjs";
21
23
 
22
24
  const ROOT = fileURLToPath(new URL("..", import.meta.url));
23
25
  const problems = [];
@@ -95,20 +97,20 @@ try {
95
97
  const registry = loadCompiledPersonaPacks({ buildProfile });
96
98
  const operatorCount = registry.packs.filter((pack) => pack.admission.level === "operator_lens").length;
97
99
  const toolCount = registry.packs.reduce((sum, pack) => sum + pack.components.tools.length, 0);
98
- const validSoloCut = registry.packs.length === 26
99
- && operatorCount === 26
100
- && toolCount === 52
100
+ const validSoloCut = registry.packs.length === CANONICAL_MASTER_COUNT
101
+ && operatorCount === CANONICAL_MASTER_COUNT
102
+ && toolCount === PLANNED_TOOL_COUNT
101
103
  && registry.packs.every((pack) => pack.build_profile === "solo_test");
102
104
  if (validSoloCut) {
103
- ok("solo-test runtime", "26 physical provisional operator_lens; 52 derived-proxy tools; 0 method_model");
105
+ ok("solo-test runtime", `${CANONICAL_MASTER_COUNT} physical provisional operator_lens; ${PLANNED_TOOL_COUNT} derived-proxy tools; 0 method_model`);
104
106
  notes.push("Formal PersonaPack v3 production GA is not passed; human source/formula review, signed experiments, and live four-host E2E remain absent");
105
107
  } else {
106
- warn("solo-test runtime incomplete", `${registry.packs.length}/26 packs, ${operatorCount}/26 operator_lens, ${toolCount}/52 tools`);
108
+ warn("solo-test runtime incomplete", `${registry.packs.length}/${CANONICAL_MASTER_COUNT} packs, ${operatorCount}/${CANONICAL_MASTER_COUNT} operator_lens, ${toolCount}/${PLANNED_TOOL_COUNT} tools`);
107
109
  }
108
- } else if (/^0\.9\./.test(VERSION) && report.summary.operational_or_higher !== 26) {
109
- warn("0.9 v3 cutover incomplete", `${report.summary.operational_or_higher}/26 seats operational or higher`);
110
- } else if (report.summary.operational_or_higher !== 26) {
111
- notes.push(`PersonaPack v3 migration remains in development: ${report.summary.operational_or_higher}/26 operational or higher`);
110
+ } else if (/^0\.9\./.test(VERSION) && report.summary.operational_or_higher !== CANONICAL_MASTER_COUNT) {
111
+ warn("0.9 v3 cutover incomplete", `${report.summary.operational_or_higher}/${CANONICAL_MASTER_COUNT} seats operational or higher`);
112
+ } else if (report.summary.operational_or_higher !== CANONICAL_MASTER_COUNT) {
113
+ notes.push(`PersonaPack v3 migration remains in development: ${report.summary.operational_or_higher}/${CANONICAL_MASTER_COUNT} operational or higher`);
112
114
  }
113
115
  } catch (error) {
114
116
  warn("PersonaPack v3 corpus inventory failed", error.message.split("\n")[0]);
@@ -82,7 +82,7 @@ function helpText() {
82
82
  " node scripts/export-persona-source-review-batch.mjs --output FILE --write [--trusted-reviewer-keys FILE] [--json]",
83
83
  "",
84
84
  "Default/check mode is read-only. --write creates one new audit batch and never overwrites it.",
85
- "The batch includes all 26 seats, raw acquisition bindings, human-only proposal templates, hashes, locator gaps, and strict trusted-principal quorum progress.",
85
+ "The batch includes every canonical seat, raw acquisition bindings, human-only proposal templates, hashes, locator gaps, and strict trusted-principal quorum progress.",
86
86
  "It never prepares, reviews, approves, promotes, or writes production knowledge.",
87
87
  "",
88
88
  ].join("\n");
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- /** Generate or verify all 26 non-production PersonaPack v3 editorial draft slices. */
2
+ /** Generate or verify every non-production PersonaPack v3 editorial draft slices. */
3
3
 
4
4
  import { fileURLToPath } from "node:url";
5
5
  import { resolve } from "node:path";
@@ -55,7 +55,7 @@ export function main(argv = process.argv.slice(2)) {
55
55
  "Usage: node scripts/generate-persona-v3-drafts.mjs [--check|--write] [--json|--markdown]",
56
56
  "",
57
57
  " --check verify only (default; never writes)",
58
- " --write deterministically write all 26 editorial draft slices, then verify",
58
+ " --write deterministically write every editorial draft slice, then verify",
59
59
  " --json emit the machine-readable inventory",
60
60
  " --markdown emit the full Markdown inventory report",
61
61
  " --root PATH override the staging root",
@@ -0,0 +1,24 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { resolve } from "node:path";
3
+
4
+ export function loadBuildProfile(repoRoot) {
5
+ const file = resolve(repoRoot, "data/build-profile.v1.json");
6
+ const profile = JSON.parse(readFileSync(file, "utf8"));
7
+ if (profile?.schema_version !== 1) throw new Error(`unsupported build profile at ${file}`);
8
+ return Object.freeze(profile);
9
+ }
10
+
11
+ /**
12
+ * Runtime releases and PersonaPack revisions are independent version axes.
13
+ *
14
+ * Falling back to package_version keeps older packaged trees readable, while current trees
15
+ * pin persona_pack_version so a routing-only release cannot invalidate pack review evidence.
16
+ */
17
+ export function resolvePersonaPackVersion(repoRoot) {
18
+ const profile = loadBuildProfile(repoRoot);
19
+ const version = profile.persona_pack_version || profile.package_version;
20
+ if (typeof version !== "string" || !version.trim()) {
21
+ throw new Error("build profile must declare persona_pack_version or package_version");
22
+ }
23
+ return version;
24
+ }
@@ -1,3 +1,4 @@
1
+ import { CANONICAL_MASTER_COUNT } from "../../mcp/lib/personas-v3/staging.mjs";
1
2
  import { readFileSync } from "node:fs";
2
3
  import { dirname, resolve } from "node:path";
3
4
  import { fileURLToPath } from "node:url";
@@ -122,7 +123,7 @@ function liveSnapshot() {
122
123
  reg,
123
124
  default_analyst_ids: [...DEFAULT_TASKS],
124
125
  verifier_ids: verifiers,
125
- canonical_26_master_ids: masters,
126
+ canonical_master_ids: masters,
126
127
  };
127
128
  }
128
129
 
@@ -232,7 +233,7 @@ function validateMetrics(protocol, errors) {
232
233
 
233
234
  function expectedArm(id, live) {
234
235
  const defaultAnalysts = live.default_analyst_ids;
235
- const masters = live.canonical_26_master_ids;
236
+ const masters = live.canonical_master_ids;
236
237
  const common = { verifier_ids: [], bounded_repair: null, human_reference: null };
237
238
  if (id === "A") return { execution_mode: "single_agent_baseline", analyst_ids: [], master_ids: [], base_arm_ids: [], master_execution_mode: "none", ...common };
238
239
  if (id === "B") return { execution_mode: "machine_council", analyst_ids: defaultAnalysts, master_ids: [], base_arm_ids: [], master_execution_mode: "none", ...common };
@@ -298,12 +299,12 @@ export function validateCouncilEvaluationProtocol(protocol = loadCouncilEvaluati
298
299
  exactValue(protocol.canonical_arm_order, CANONICAL_ARM_IDS, "canonical_arm_order", errors);
299
300
 
300
301
  const live = liveSnapshot();
301
- exactFields(protocol.registry_snapshot, ["default_analyst_ids", "verifier_ids", "priority_13_master_ids", "canonical_26_master_ids"], "registry_snapshot", errors);
302
+ exactFields(protocol.registry_snapshot, ["default_analyst_ids", "verifier_ids", "priority_13_master_ids", "canonical_master_ids"], "registry_snapshot", errors);
302
303
  exactValue(protocol.registry_snapshot?.default_analyst_ids, live.default_analyst_ids, "registry_snapshot.default_analyst_ids vs live DEFAULT_TASKS", errors);
303
304
  exactValue(protocol.registry_snapshot?.verifier_ids, live.verifier_ids, "registry_snapshot.verifier_ids vs live verify roster", errors);
304
305
  exactValue(protocol.registry_snapshot?.priority_13_master_ids, PRIORITY_13_MASTER_IDS, "registry_snapshot.priority_13_master_ids", errors);
305
- exactValue(protocol.registry_snapshot?.canonical_26_master_ids, live.canonical_26_master_ids, "registry_snapshot.canonical_26_master_ids vs live master registry", errors);
306
- if (live.canonical_26_master_ids.length !== 26) errors.push(`live master registry must contain exactly 26 enabled seats, got ${live.canonical_26_master_ids.length}`);
306
+ exactValue(protocol.registry_snapshot?.canonical_master_ids, live.canonical_master_ids, "registry_snapshot.canonical_master_ids vs live master registry", errors);
307
+ if (live.canonical_master_ids.length !== CANONICAL_MASTER_COUNT) errors.push(`live master registry must contain exactly ${CANONICAL_MASTER_COUNT} enabled seats, got ${live.canonical_master_ids.length}`);
307
308
  if (live.verifier_ids.length !== 3) errors.push(`live verify roster must contain exactly 3 verifiers, got ${live.verifier_ids.length}`);
308
309
  for (const id of live.default_analyst_ids) {
309
310
  const persona = live.reg.get(id);
@@ -327,7 +328,7 @@ export function validateCouncilEvaluationProtocol(protocol = loadCouncilEvaluati
327
328
  live: {
328
329
  default_analyst_ids: live.default_analyst_ids,
329
330
  verifier_ids: live.verifier_ids,
330
- canonical_26_master_ids: live.canonical_26_master_ids,
331
+ canonical_master_ids: live.canonical_master_ids,
331
332
  },
332
333
  };
333
334
  }
@@ -1,3 +1,4 @@
1
+ import { CANONICAL_MASTER_COUNT } from "../../mcp/lib/personas-v3/staging.mjs";
1
2
  import { createHash } from "node:crypto";
2
3
  import { existsSync, readFileSync } from "node:fs";
3
4
  import os from "node:os";
@@ -216,7 +217,7 @@ export function validateHostCapabilities(contract = loadHostCapabilities(), { ro
216
217
  }
217
218
 
218
219
  const catalog = catalogSnapshot("English");
219
- if (catalog.count !== 26 || !arraysEqual(catalog.all_master_ids, registry().ids("master"))) errors.push("runtime selector catalog is not the canonical 26-seat registry order");
220
+ if (catalog.count !== CANONICAL_MASTER_COUNT || !arraysEqual(catalog.all_master_ids, registry().ids("master"))) errors.push(`runtime selector catalog is not the canonical ${CANONICAL_MASTER_COUNT}-seat registry order`);
220
221
  if (!/^[a-f0-9]{64}$/.test(catalog.catalog_hash)) errors.push("runtime catalog hash is not sha256 hex");
221
222
  for (const [index, seat] of catalog.masters.entries()) {
222
223
  if (seat.index !== index + 1 || seat.id !== catalog.all_master_ids[index]) errors.push(`runtime selector index/id drift at ${index + 1}`);
@@ -6,6 +6,7 @@
6
6
  * PersonaPack v3 decision comparison while the production package contains zero v3 packs.
7
7
  */
8
8
 
9
+ import { CANONICAL_MASTER_COUNT } from "../../mcp/lib/personas-v3/staging.mjs";
9
10
  import { createHash } from "node:crypto";
10
11
  import { once } from "node:events";
11
12
  import {
@@ -29,7 +30,12 @@ import { isDeepStrictEqual } from "node:util";
29
30
  const HERE = dirname(fileURLToPath(import.meta.url));
30
31
  export const PACKAGED_PARITY_REPO_ROOT = resolve(HERE, "../..");
31
32
  export const PACKAGED_HOST_IDS = Object.freeze(["claude_code", "codex", "opencode", "grok"]);
32
- export const PACKAGED_SELECTION_INPUT = "2,23-24,26";
33
+ export const PACKAGED_SELECTION_INPUT = Object.freeze([
34
+ "master_buffett",
35
+ "master_damodaran",
36
+ "master_taleb",
37
+ "master_sinclair",
38
+ ]);
33
39
 
34
40
  const TEMP_PREFIX = "alphacouncil-packaged-parity-";
35
41
  const SYMBOL = "NOK";
@@ -39,6 +45,13 @@ const PROMPT = "packaged adapter parity fixture";
39
45
  const TASKS = Object.freeze(["market_data"]);
40
46
  const REQUEST_TIMEOUT_MS = 30_000;
41
47
  const PROCESS_TIMEOUT_MS = 120_000;
48
+ const EXPECTED_TOOL_COUNT = 31;
49
+ const INSTALLED_LOCALE_CASES = Object.freeze([
50
+ Object.freeze({ language: "en-US", prompt: "installed package locale smoke", key: "en", script: /[A-Za-z]/u }),
51
+ Object.freeze({ language: "zh-CN", prompt: "安装包语言烟雾测试", key: "zh", script: /\p{Script=Han}/u }),
52
+ Object.freeze({ language: "ja-JP", prompt: "インストール済みパッケージの言語スモークテスト", key: "ja", script: /[\p{Script=Hiragana}\p{Script=Katakana}]/u }),
53
+ Object.freeze({ language: "ko-KR", prompt: "설치 패키지 언어 스모크 테스트", key: "ko", script: /\p{Script=Hangul}/u }),
54
+ ]);
42
55
  const REQUIRED_PACKAGE_FILES = Object.freeze([
43
56
  "mcp/server.mjs",
44
57
  "data/host-capabilities.v1.json",
@@ -310,8 +323,13 @@ function validatePackagedSurfaces(pack) {
310
323
  }
311
324
  const reviewPrefix = "knowledge/ai-assisted-solo/reviews/";
312
325
  const packagedReviews = pack.tarFiles.filter((path) => path.startsWith(reviewPrefix) && path.endsWith(".json"));
313
- if (packagedReviews.length !== 185) {
314
- fail(`installed AI-assisted review capsule must contain exactly 185 JSON files; got ${packagedReviews.length}`);
326
+ // The capsule is complete when the package carries every review the repository holds. Pinning
327
+ // a number instead would only restate the roster size, and would have to be edited on the
328
+ // day a seat is added -- which is exactly when the check should still be meaningful.
329
+ const repoReviews = walkFiles(resolve(PACKAGED_PARITY_REPO_ROOT, reviewPrefix))
330
+ .filter((entry) => entry.path.endsWith(".json"));
331
+ if (packagedReviews.length !== repoReviews.length) {
332
+ fail(`installed AI-assisted review capsule must contain every one of the ${repoReviews.length} repository review files; got ${packagedReviews.length}`);
315
333
  }
316
334
  if (pack.tarFiles.some((path) => path.startsWith("knowledge/ai-assisted-solo/host-e2e/"))) {
317
335
  fail("local external-host failure evidence must not ship in the npm package");
@@ -570,21 +588,33 @@ function errorReason(response, label) {
570
588
  }
571
589
 
572
590
  function assertCompleteCatalog(opened, text, hostId) {
573
- if (opened.maximum !== 26 || opened.masters?.length !== 26) fail(`${hostId}: packaged selector is not 26 seats`);
591
+ if (opened.maximum !== CANONICAL_MASTER_COUNT || opened.masters?.length !== CANONICAL_MASTER_COUNT) fail(`${hostId}: packaged selector is not ${CANONICAL_MASTER_COUNT} seats`);
574
592
  const seen = new Set();
575
593
  for (const [offset, master] of opened.masters.entries()) {
576
594
  if (master.index !== offset + 1 || seen.has(master.id)) fail(`${hostId}: catalog order or IDs are invalid`);
577
595
  seen.add(master.id);
578
- for (const field of ["identity", "method", "best_for", "maturity", "pack_hash"]) {
596
+ for (const field of ["identity", "method", "best_for", "maturity", "maturity_label", "pack_hash"]) {
579
597
  if (typeof master[field] !== "string" || !master[field]) fail(`${hostId}: catalog seat ${master.id} lacks ${field}`);
580
598
  }
581
599
  if (!/^sha256:[a-f0-9]{64}$/u.test(master.pack_hash)) fail(`${hostId}: ${master.id} pack hash is invalid`);
582
- for (const visible of [`${master.index}. `, `[${master.id}]`, master.identity, master.method, master.best_for, master.maturity]) {
600
+ for (const visible of [`${master.index}. `, `[${master.id}]`, master.identity, master.method, master.best_for, master.maturity, master.maturity_label]) {
583
601
  if (!text.includes(visible)) fail(`${hostId}: returned text did not display ${master.id} field ${visible}`);
584
602
  }
585
603
  }
586
604
  }
587
605
 
606
+ function assertLocalizedCatalog(opened, text, locale) {
607
+ assertCompleteCatalog(opened, text, `installed-${locale.key}`);
608
+ for (const master of opened.masters) {
609
+ for (const field of ["identity", "method", "best_for", "maturity_label"]) {
610
+ if (!locale.script.test(master[field])) fail(`installed-${locale.key}: ${master.id}.${field} lacks requested-locale prose`);
611
+ if (locale.key !== "en" && /\b[a-z]+(?:_[a-z0-9]+)+\b/u.test(master[field])) {
612
+ fail(`installed-${locale.key}: ${master.id}.${field} leaked a machine domain id into reader-facing prose`);
613
+ }
614
+ }
615
+ }
616
+ }
617
+
588
618
  function normalizedReceiptBinding(record) {
589
619
  return {
590
620
  symbol: record.symbol,
@@ -624,7 +654,27 @@ async function executePackagedAdapters({ pack, surfaces, tempRoot }) {
624
654
  networkSentinel,
625
655
  });
626
656
  await server.request("initialize", {});
627
- sessions.push({ hostId, dataDir, server });
657
+ const listed = await server.request("tools/list", {});
658
+ const tools = listed.result?.tools || [];
659
+ if (tools.length !== EXPECTED_TOOL_COUNT) fail(`${hostId}: installed server exposed ${tools.length} tools, expected ${EXPECTED_TOOL_COUNT}`);
660
+ sessions.push({ hostId, dataDir, server, toolCount: tools.length });
661
+ }
662
+
663
+ const localeCases = process.env.ALPHACOUNCIL_PERSONA_BUILD_PROFILE === "production"
664
+ ? INSTALLED_LOCALE_CASES.slice(0, 1)
665
+ : INSTALLED_LOCALE_CASES;
666
+ const localeCatalogHashes = {};
667
+ for (const locale of localeCases) {
668
+ const response = await sessions[0].server.callTool("begin_council_selection", {
669
+ symbol: SYMBOL,
670
+ as_of: AS_OF,
671
+ language: locale.language,
672
+ prompt: locale.prompt,
673
+ host: "installed-package-locale-smoke",
674
+ });
675
+ const opened = structured(response, `installed ${locale.language} begin_council_selection`);
676
+ assertLocalizedCatalog(opened, response.result.content?.[0]?.text || "", locale);
677
+ localeCatalogHashes[locale.key] = opened.catalog_hash;
628
678
  }
629
679
 
630
680
  for (const session of sessions) {
@@ -642,7 +692,7 @@ async function executePackagedAdapters({ pack, surfaces, tempRoot }) {
642
692
  selection_id: opened.selection_id,
643
693
  catalog_hash: opened.catalog_hash,
644
694
  display_ack: true,
645
- selection: PACKAGED_SELECTION_INPUT,
695
+ selected_master_ids: PACKAGED_SELECTION_INPUT,
646
696
  }), `${session.hostId} confirm_master_selection`);
647
697
  session.opened = opened;
648
698
  session.confirmed = confirmed;
@@ -744,11 +794,15 @@ async function executePackagedAdapters({ pack, surfaces, tempRoot }) {
744
794
  evidence_scope: "installed_npm_tarball_mcp_stdio_adapters_only",
745
795
  host_order: PACKAGED_HOST_IDS,
746
796
  host_count: sessions.length,
797
+ tool_count: EXPECTED_TOOL_COUNT,
798
+ locale_count: localeCases.length,
799
+ locale_catalog_hashes: localeCatalogHashes,
747
800
  catalog_count: baseline.catalog.length,
748
801
  catalog_hash: baseline.catalog_hash,
749
802
  catalog_order_hash: sha256(baseline.catalog),
750
803
  maturity_counts: maturityCounts,
751
804
  selection_input: PACKAGED_SELECTION_INPUT,
805
+ selection_input_type: "stable_ids",
752
806
  selected_master_ids: baseline.selected_master_ids,
753
807
  selected_master_pack_hashes: baseline.selected_master_pack_hashes,
754
808
  receipt_binding_hash: sha256(baseline.receipt_binding),
@@ -774,6 +828,7 @@ async function executePackagedAdapters({ pack, surfaces, tempRoot }) {
774
828
  host_id: session.hostId,
775
829
  server_entry: "mcp/server.mjs",
776
830
  adapter_status: "passed",
831
+ tool_count: session.toolCount,
777
832
  catalog_count: session.catalog.length,
778
833
  catalog_hash: session.opened.catalog_hash,
779
834
  selected_master_ids: session.confirmed.selected_master_ids,
@@ -7,6 +7,8 @@
7
7
  * approval, production admission, method_model, or formal-GA claim.
8
8
  */
9
9
 
10
+ import { PLANNED_TOOL_COUNT } from "../../data/persona-v3-build-specs.v1.mjs";
11
+ import { CANONICAL_MASTER_COUNT } from "../../mcp/lib/personas-v3/staging.mjs";
10
12
  import { createHash } from "node:crypto";
11
13
  import {
12
14
  closeSync,
@@ -28,6 +30,7 @@ import {
28
30
  } from "../../mcp/lib/personas-v3/ai-source-pre-review.mjs";
29
31
  import { assessErrorNeff } from "../../mcp/lib/personas-v3/n-eff.mjs";
30
32
  import { inspectPersonaV3SoloTestPacks } from "./persona-v3-solo-test-packs.mjs";
33
+ import { resolvePersonaPackVersion } from "./build-profile.mjs";
31
34
  import {
32
35
  AI_MACHINE_SIMULATION_RUN_IDS,
33
36
  verifyAIMachineSimulationTree,
@@ -748,12 +751,12 @@ export function loadAiAssistedSoloProfile(file = DEFAULT_AI_ASSISTED_SOLO_PROFIL
748
751
  if (profile[field] !== expected) errors.push(`${field} must be ${JSON.stringify(expected)}`);
749
752
  }
750
753
  const expectedRequirements = {
751
- physical_solo_packs: 26,
754
+ physical_solo_packs: CANONICAL_MASTER_COUNT,
752
755
  ai_source_prereviews: 32,
753
756
  ai_semantic_extractions: 32,
754
757
  ai_semantic_skeptic_reviews: 32,
755
758
  ai_semantic_adjudications: 32,
756
- ai_formula_cross_reviews: 52,
759
+ ai_formula_cross_reviews: PLANNED_TOOL_COUNT,
757
760
  independent_roles_per_review: 3,
758
761
  automated_experiment_runs: 8,
759
762
  live_hosts: 4,
@@ -775,12 +778,11 @@ export function inspectAiAssistedSoloStatus(options = {}) {
775
778
 
776
779
  let packReport = null;
777
780
  try {
778
- const packageVersion = physicalJson(resolve(repoRoot, "package.json"), "package metadata").value.version;
779
781
  const packOptions = Object.fromEntries(Object.entries({
780
782
  root: options.packRoot || paths.solo_pack_root,
781
783
  formulaRoot: options.formulaRoot,
782
784
  personaDir: options.personaDir,
783
- packVersion: options.packVersion || packageVersion,
785
+ packVersion: options.packVersion || resolvePersonaPackVersion(repoRoot),
784
786
  }).filter(([, value]) => value !== undefined));
785
787
  packReport = inspectPersonaV3SoloTestPacks(packOptions);
786
788
  } catch (error) { integrityErrors.push(`solo packs: ${error.message}`); }
@@ -1,11 +1,12 @@
1
1
  /**
2
- * Isolated AI-assisted cross-review lane for the 52 solo-test derived proxies.
2
+ * Isolated AI-assisted cross-review lane for the solo-test derived proxies.
3
3
  *
4
4
  * This lane reviews mechanical reproducibility only. Its three reviewers are explicitly
5
5
  * machine principals. It cannot emit a human approval, make a tool production eligible,
6
6
  * or satisfy the formal formula-review compiler/GA path.
7
7
  */
8
8
 
9
+ import { PLANNED_TOOL_COUNT } from "../../data/persona-v3-build-specs.v1.mjs";
9
10
  import {
10
11
  existsSync,
11
12
  lstatSync,
@@ -217,7 +218,7 @@ function physicalFormulaRecords(formulaRoot) {
217
218
  const plan = planSoloTestFormulaCompilation({ outputRoot: formulaRoot });
218
219
  const manifest = readPlainJson(root, "compilation-manifest.json", "solo formula manifest");
219
220
  if (manifest.compilation_hash !== plan.compilation_hash) {
220
- fail("physical solo formula manifest is not bound to the current 52-tool compilation", {
221
+ fail("physical solo formula manifest is not bound to the current compilation", {
221
222
  expected: plan.compilation_hash,
222
223
  actual: manifest.compilation_hash,
223
224
  });
@@ -567,14 +568,14 @@ export function validateAIFormulaReviewArtifact(artifact, { reviewSchemaHash = s
567
568
  return errors;
568
569
  }
569
570
 
570
- /** Plan all 52 records without mutating the physical review tree. */
571
+ /** Plan every record without mutating the physical review tree. */
571
572
  export function planAIFormulaCrossReviews({ formulaRoot = DEFAULT_SOLO_TEST_FORMULA_ROOT } = {}) {
572
573
  const schema = parsedReviewSchema();
573
574
  const reviewSchemaHash = sha256(schema);
574
575
  const input = physicalFormulaRecords(formulaRoot);
575
576
  const reviews = input.records.map((record) => reviewOne(record, input.compilationHash, reviewSchemaHash));
576
- if (reviews.length !== 52 || new Set(reviews.map((review) => review.tool_id)).size !== 52) {
577
- fail("AI formula cross-review must cover exactly 52 unique tools");
577
+ if (reviews.length !== PLANNED_TOOL_COUNT || new Set(reviews.map((review) => review.tool_id)).size !== PLANNED_TOOL_COUNT) {
578
+ fail(`AI formula cross-review must cover exactly ${PLANNED_TOOL_COUNT} unique tools`);
578
579
  }
579
580
  const invalid = reviews.flatMap((review) => validateAIFormulaReviewArtifact(review, { reviewSchemaHash })
580
581
  .map((message) => `${review.tool_id}: ${message}`));
@@ -19,7 +19,7 @@ import { executeDeterministicPersonaPolicy } from "../../mcp/lib/personas-v3/det
19
19
  import { loadCompiledPersonaPacks } from "../../mcp/lib/personas-v3/registry.mjs";
20
20
  import { buildAnonymousPreDecision } from "../../mcp/lib/personas-v3/runtime.mjs";
21
21
  import { buildFactPack } from "../../mcp/lib/personas-v3/typed-facts.mjs";
22
- import { CANONICAL_MASTER_IDS } from "../../mcp/lib/personas-v3/staging.mjs";
22
+ import { CANONICAL_MASTER_COUNT, CANONICAL_MASTER_IDS } from "../../mcp/lib/personas-v3/staging.mjs";
23
23
  import { PRIORITY_13_MASTER_IDS } from "./council-evaluation-protocol.mjs";
24
24
 
25
25
  export const AI_MACHINE_SIMULATION_RUN_IDS = Object.freeze([
@@ -105,6 +105,16 @@ function factPackFor(pack) {
105
105
  }
106
106
  });
107
107
  }
108
+ // Everything the seat declares it reads, not only what its tools consume. An authored
109
+ // policy gates eligibility on a fact outside its tool inputs on purpose, so a fixture built
110
+ // from tool inputs alone leaves every such seat correctly -- and uselessly -- out of scope,
111
+ // and the simulation would then demonstrate nothing.
112
+ for (const factId of [
113
+ ...(pack.manifest.capability.required_fact_types || []),
114
+ ...(pack.manifest.capability.optional_fact_types || []),
115
+ ]) {
116
+ if (!byFact.has(factId)) byFact.set(factId, { value_kind: "ratio", unit: "decimal" });
117
+ }
108
118
  const facts = [...byFact].map(([factId, contract]) => canonicalValue({
109
119
  schema_version: 1,
110
120
  fact_id: factId,
@@ -114,8 +124,10 @@ function factPackFor(pack) {
114
124
  currency: contract.value_kind === "monetary" ? "USD" : null,
115
125
  scale: contract.value_kind === "monetary" ? 1 : null,
116
126
  ...(contract.value_kind === "ratio" ? { ratio_denominator: "synthetic_denominator" } : {}),
117
- period_start: null,
118
- period_end: null,
127
+ // A fixture whose facts are all instants cannot exercise a method that reads a reporting
128
+ // interval -- the contract check rejects the fact before any arithmetic runs. The synthetic
129
+ // fact therefore carries whatever span its own contract asks for.
130
+ ...syntheticInterval(contract.period),
119
131
  fiscal_year: null,
120
132
  as_of: AS_OF,
121
133
  public_at: AS_OF,
@@ -128,6 +140,22 @@ function factPackFor(pack) {
128
140
  return buildFactPack(facts, { asOf: AS_OF });
129
141
  }
130
142
 
143
+ /** Build an interval that satisfies the contract's declared window, or none for an instant. */
144
+ function syntheticInterval(period) {
145
+ if (period?.basis !== "duration" && period?.basis !== "forecast_horizon") {
146
+ return { period_start: null, period_end: null };
147
+ }
148
+ const end = Date.parse(`${AS_OF}T00:00:00.000Z`);
149
+ const match = /^P([1-9]\d*)([DMY])$/u.exec(period.window || "");
150
+ const days = period.window === "ANY" ? 365
151
+ : match ? Number(match[1]) * ({ D: 1, M: 30, Y: 365 })[match[2]]
152
+ : 365;
153
+ return {
154
+ period_start: new Date(end - days * 86_400_000).toISOString().slice(0, 10),
155
+ period_end: AS_OF,
156
+ };
157
+ }
158
+
131
159
  function buildInput(registry) {
132
160
  const protocol = boundFile("data/council-evaluation-protocol.v1.json");
133
161
  const protocolValue = readJson(resolve(REPO_ROOT, protocol.path));
@@ -224,7 +252,7 @@ function configs() {
224
252
  { run_id: "B", formal_arm_id: "B", ids: [], scope: "frozen-input control digest only; eight LLM analyst outputs are not simulated", checks: false },
225
253
  { run_id: "C", formal_arm_id: "C", ids: [], scope: "prompt-catalog binding only; prompt-only LLM outputs are not simulated", checks: false },
226
254
  { run_id: "D13", formal_arm_id: "D13", ids: [...PRIORITY_13_MASTER_IDS], scope: "13 physical provisional deterministic seats on frozen synthetic typed facts", checks: false },
227
- { run_id: "D26", formal_arm_id: "D26", ids: [...CANONICAL_MASTER_IDS], scope: "26 physical provisional deterministic seats on frozen synthetic typed facts", checks: false },
255
+ { run_id: "D26", formal_arm_id: "D26", ids: [...CANONICAL_MASTER_IDS], scope: `${CANONICAL_MASTER_COUNT} physical provisional deterministic seats on frozen synthetic typed facts`, checks: false },
228
256
  { run_id: "E:D13", formal_arm_id: "E", ids: [...PRIORITY_13_MASTER_IDS], scope: "D13 deterministic seats plus machine-only hash, rederivation and fail-closed checks", checks: true },
229
257
  { run_id: "E:D26", formal_arm_id: "E", ids: [...CANONICAL_MASTER_IDS], scope: "D26 deterministic seats plus machine-only hash, rederivation and fail-closed checks", checks: true },
230
258
  { run_id: "H_ai_reference", formal_arm_id: "H", ids: [...CANONICAL_MASTER_IDS], scope: "AI deterministic reference digest only; no human analysts or blinded human adjudicator", checks: true },
@@ -1,3 +1,4 @@
1
+ import { CANONICAL_MASTER_COUNT } from "../../mcp/lib/personas-v3/staging.mjs";
1
2
  import { existsSync, readFileSync, realpathSync } from "node:fs";
2
3
  import { dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
3
4
  import { fileURLToPath } from "node:url";
@@ -234,7 +235,7 @@ export function validatePersonaV3BuildSpecs(inventory = personaV3BuildSpecs) {
234
235
  if (inventory.inventory_id !== "personapack-v3-build-specs") add(errors, null, "inventory_id is invalid");
235
236
  if (inventory.inventory_status !== "non_production_planning_only") add(errors, null, "inventory must remain non-production");
236
237
  if (inventory.canonical_catalog_source !== "mcp/lib/personas/registry.mjs") add(errors, null, "canonical catalog source changed");
237
- if (inventory.seat_count !== 26) add(errors, null, "seat_count must be 26");
238
+ if (inventory.seat_count !== CANONICAL_MASTER_COUNT) add(errors, null, `seat_count must be ${CANONICAL_MASTER_COUNT}`);
238
239
 
239
240
  const policy = inventory.adjudication_policy || {};
240
241
  exactKeys(policy, ["method_attribution", "source_grading", "case_labels", "veto_thresholds", "reviewer_approvals", "experiments", "promotion_effect"], "adjudication_policy", null, errors);
@@ -247,7 +248,7 @@ export function validatePersonaV3BuildSpecs(inventory = personaV3BuildSpecs) {
247
248
 
248
249
  const catalogIds = registry().ids("master");
249
250
  const selectorIds = knownSelectorCardIds();
250
- if (catalogIds.length !== 26) add(errors, null, `canonical registry has ${catalogIds.length} masters, expected 26`);
251
+ if (catalogIds.length !== CANONICAL_MASTER_COUNT) add(errors, null, `canonical registry has ${catalogIds.length} masters, expected ${CANONICAL_MASTER_COUNT}`);
251
252
  const missingCards = catalogIds.filter((id) => !selectorIds.includes(id));
252
253
  const extraCards = selectorIds.filter((id) => !catalogIds.includes(id));
253
254
  if (missingCards.length || extraCards.length) add(errors, null, `selector cards differ from registry; missing=${missingCards.join(",") || "none"}; extra=${extraCards.join(",") || "none"}`);
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Deterministic PersonaPack v3 editorial-prototype factory.
3
3
  *
4
- * These artifacts make every one of the 26 planned seats physically inspectable without
4
+ * These artifacts make every planned seat physically inspectable without
5
5
  * pretending that source adjudication, case labeling, experiments, or production promotion
6
6
  * happened. The production loader does not read this tree and a draft never contains a
7
7
  * `manifest.json`.
@@ -472,7 +472,7 @@ function generationContext(options = {}) {
472
472
  const byBlueprint = new Map(blueprints.map((blueprint) => [blueprint.persona_id, blueprint]));
473
473
  const bySource = new Map(acquisition.personas.map((persona) => [persona.persona_id, persona]));
474
474
  const bySpec = new Map(inventory.seats.map((seat) => [seat.persona_id, seat]));
475
- if (bySpec.size !== CANONICAL_MASTER_COUNT) fail("canonical build-spec inventory is not exactly 26 unique seats");
475
+ if (bySpec.size !== CANONICAL_MASTER_COUNT) fail("canonical build-spec inventory does not cover the canonical roster exactly once");
476
476
  return { root, productionRoot, personaDir, staging, acquisition, byBlueprint, bySource, bySpec };
477
477
  }
478
478
 
@@ -2,11 +2,12 @@
2
2
  * Fail-closed PersonaPack v3 formula authoring and DSL 1.1 compilation pipeline.
3
3
  *
4
4
  * Inventory construction and compilation are pure functions. Filesystem helpers only read
5
- * the 26 canonical staging prototypes or, after an explicit caller action, write isolated
5
+ * the canonical staging prototypes or, after an explicit caller action, write isolated
6
6
  * non-production formula-candidate artifacts. Nothing here writes knowledge/masters,
7
7
  * manifests, release evidence, or production registrations.
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,
@@ -316,7 +317,7 @@ function pendingFormulaSpec(prototype, prototypePath) {
316
317
  });
317
318
  }
318
319
 
319
- /** Build the 52-entry authoring queue from already-read prototype documents. */
320
+ /** Build the authoring queue from already-read prototype documents. */
320
321
  export function buildFormulaAuthoringInventory(prototypeArtifacts) {
321
322
  if (!Array.isArray(prototypeArtifacts)) fail("prototypeArtifacts must be an array");
322
323
  const byPersona = new Map(prototypeArtifacts.map((artifact) => [artifact?.document?.persona_id, artifact]));
@@ -523,7 +524,7 @@ function collectJsonFiles(root, dir, prefix = "") {
523
524
  return result;
524
525
  }
525
526
 
526
- /** Read and verify all 52 human-authored specs and dual-signed bundles without writing. */
527
+ /** Read and verify every human-authored spec and dual-signed bundles without writing. */
527
528
  export function planApprovedFormulaCompilation({
528
529
  candidateRoot = DEFAULT_FORMULA_CANDIDATE_ROOT,
529
530
  root = defaultStagingRoot(),
@@ -556,10 +557,10 @@ export function planApprovedFormulaCompilation({
556
557
  const actualSpecFiles = collectJsonFiles(candidate, resolve(candidate, "specs"));
557
558
  const actualApprovalFiles = collectJsonFiles(candidate, resolve(candidate, "approvals"));
558
559
  if (JSON.stringify(actualSpecFiles) !== JSON.stringify(expectedSpecFiles.sort())) {
559
- fail("approved formula compilation requires exactly the 52 planned spec files", { expected: expectedSpecFiles.sort(), actual: actualSpecFiles });
560
+ fail("approved formula compilation requires exactly the planned spec files, one per tool", { expected: expectedSpecFiles.sort(), actual: actualSpecFiles });
560
561
  }
561
562
  if (JSON.stringify(actualApprovalFiles) !== JSON.stringify(expectedApprovalFiles.sort())) {
562
- fail("approved formula compilation requires exactly the 52 planned approval bundles", { expected: expectedApprovalFiles.sort(), actual: actualApprovalFiles });
563
+ fail("approved formula compilation requires exactly the planned approval bundles, one per tool", { expected: expectedApprovalFiles.sort(), actual: actualApprovalFiles });
563
564
  }
564
565
  const prototypeDocuments = Object.fromEntries(readFormulaPrototypeArtifacts({ root })
565
566
  .map((artifact) => [artifact.relative_path, artifact.document]));
@@ -571,9 +572,9 @@ export function planApprovedFormulaCompilation({
571
572
  });
572
573
  const expectedIds = authoring.inventory.entries.map((entry) => entry.tool_id);
573
574
  const actualIds = tools.map((tool) => tool.id);
574
- if (actualIds.length !== 52 || new Set(actualIds).size !== 52
575
+ if (actualIds.length !== PLANNED_TOOL_COUNT || new Set(actualIds).size !== PLANNED_TOOL_COUNT
575
576
  || JSON.stringify([...actualIds].sort()) !== JSON.stringify([...expectedIds].sort())) {
576
- fail("approved compilation must produce exactly the 52 planned unique tool ids", { expected_ids: expectedIds, actual_ids: actualIds });
577
+ fail("approved compilation must produce exactly the planned unique tool ids, one per tool", { expected_ids: expectedIds, actual_ids: actualIds });
577
578
  }
578
579
  const bindings = tools.map((tool) => canonicalValue({
579
580
  persona_id: tool.id.split(".")[0],
@@ -591,7 +592,7 @@ export function planApprovedFormulaCompilation({
591
592
  mode: "check_only",
592
593
  production_effect: "none",
593
594
  canonical_seat_count: CANONICAL_MASTER_COUNT,
594
- planned_tool_count: 52,
595
+ planned_tool_count: PLANNED_TOOL_COUNT,
595
596
  compiled_tool_count: tools.length,
596
597
  formula_approval_binding_count: bindings.length,
597
598
  tool_ids: actualIds,
@@ -669,7 +670,7 @@ export function planPersonaV3FormulaPipeline(options = {}) {
669
670
  const expected = buildInventory.seats.reduce((total, seat) => total + seat.planned_dedicated_tools.length, 0);
670
671
  const errors = [...inventory.global_errors];
671
672
  if (inventory.canonical_seat_count !== buildInventory.seat_count) errors.push("canonical seat count drifted");
672
- if (inventory.prototype_count !== expected || expected !== 52) errors.push(`prototype inventory must be exactly 52, got ${inventory.prototype_count}/${expected}`);
673
+ if (inventory.prototype_count !== expected || expected !== PLANNED_TOOL_COUNT) errors.push(`prototype inventory must be exactly ${PLANNED_TOOL_COUNT}, got ${inventory.prototype_count}/${expected}`);
673
674
  if (inventory.entries.some((entry) => entry.validation_errors.length)) errors.push("one or more generated formula specs are invalid");
674
675
  if (inventory.executable_candidate_count !== 0 || inventory.dedicated_tool_count !== 0) errors.push("unreviewed prototypes must not become executable or dedicated tools");
675
676
  return Object.freeze(canonicalValue({ mode: "check_plan", errors, inventory }));
@@ -732,7 +733,7 @@ export function renderFormulaAuthoringPlan(plan) {
732
733
  "# PersonaPack v3 formula authoring queue",
733
734
  "",
734
735
  `Seats: ${plan.inventory.canonical_seat_count}`,
735
- `Prototypes: ${plan.inventory.prototype_count}/52`,
736
+ `Prototypes: ${plan.inventory.prototype_count}/${PLANNED_TOOL_COUNT}`,
736
737
  `Needs formula authorship: ${plan.inventory.needs_formula_authorship_count}`,
737
738
  `Executable staging candidates: ${plan.inventory.executable_candidate_count}`,
738
739
  `Dedicated production tools: ${plan.inventory.dedicated_tool_count}`,
@@ -3,11 +3,12 @@
3
3
  *
4
4
  * This layer deliberately does not manufacture manifests or promote editorial drafts. A
5
5
  * candidate exists only after a real schema-v3 directory has been authored on disk. The
6
- * inspector then proves loader/compiler validity, computed admission and coverage of the 52
6
+ * inspector then proves loader/compiler validity, computed admission and coverage of every
7
7
  * planned seat-specific tools. Immutable release assembly remains a later, separately signed
8
8
  * operation.
9
9
  */
10
10
 
11
+ import { PLANNED_TOOL_COUNT } from "../../data/persona-v3-build-specs.v1.mjs";
11
12
  import {
12
13
  existsSync,
13
14
  lstatSync,
@@ -401,7 +402,7 @@ export function inspectPersonaV3ProductionCandidates({
401
402
  const inventoryErrors = [];
402
403
  if (buildInventory.seat_count !== CANONICAL_MASTER_COUNT) inventoryErrors.push("build-spec seat count is not 26");
403
404
  const expectedToolCount = [...expectedByPersona.values()].reduce((total, ids) => total + ids.length, 0);
404
- if (expectedToolCount !== 52) inventoryErrors.push(`build-spec tool count is not 52: ${expectedToolCount}`);
405
+ if (expectedToolCount !== PLANNED_TOOL_COUNT) inventoryErrors.push(`build-spec tool count is not ${PLANNED_TOOL_COUNT}: ${expectedToolCount}`);
405
406
 
406
407
  const actualEntries = candidateRoot.exists
407
408
  ? readdirSync(candidateRoot.root, { withFileTypes: true })
@@ -474,13 +475,13 @@ export function renderPersonaV3ProductionCandidateReadiness(report) {
474
475
  "",
475
476
  "> Read-only staging report. Physical presence is not source approval, experiment passage, release assembly or production promotion.",
476
477
  "",
477
- `Physical candidates: ${report.summary.physical_candidate_count}/26`,
478
- `Loader-valid candidates: ${report.summary.loader_valid_count}/26`,
479
- `Operational candidates: ${report.summary.operational_candidate_count}/26`,
480
- `Candidate admissions: ${report.summary.candidate_admission_count}/26`,
481
- `Method models: ${report.summary.method_model_count}/26`,
482
- `Planned tool coverage: ${report.summary.planned_tool_coverage_count}/52`,
483
- `Verified formula approvals: ${report.summary.formula_approval_evidence_count}/52`,
478
+ `Physical candidates: ${report.summary.physical_candidate_count}/${CANONICAL_MASTER_COUNT}`,
479
+ `Loader-valid candidates: ${report.summary.loader_valid_count}/${CANONICAL_MASTER_COUNT}`,
480
+ `Operational candidates: ${report.summary.operational_candidate_count}/${CANONICAL_MASTER_COUNT}`,
481
+ `Candidate admissions: ${report.summary.candidate_admission_count}/${CANONICAL_MASTER_COUNT}`,
482
+ `Method models: ${report.summary.method_model_count}/${CANONICAL_MASTER_COUNT}`,
483
+ `Planned tool coverage: ${report.summary.planned_tool_coverage_count}/${PLANNED_TOOL_COUNT}`,
484
+ `Verified formula approvals: ${report.summary.formula_approval_evidence_count}/${PLANNED_TOOL_COUNT}`,
484
485
  `Required admission: ${report.required_admission}`,
485
486
  `Gate clear: ${report.summary.gate_clear}`,
486
487
  `Readiness hash: \`${report.readiness_hash}\``,