alphacouncil-agent 0.9.4 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (481) hide show
  1. package/.claude-plugin/marketplace.json +3 -3
  2. package/.claude-plugin/plugin.json +2 -2
  3. package/.codex-plugin/plugin.json +4 -4
  4. package/AGENTS.md +25 -11
  5. package/CHANGELOG.md +146 -0
  6. package/CLAUDE.md +24 -7
  7. package/README.ja.md +15 -10
  8. package/README.md +21 -13
  9. package/README.zh-CN.md +17 -12
  10. package/data/authored/core-seats.mjs +808 -0
  11. package/data/authored/growth-seats.mjs +581 -0
  12. package/data/authored/index.mjs +114 -0
  13. package/data/authored/quant-seats.mjs +564 -0
  14. package/data/authored/value-seats.mjs +663 -0
  15. package/data/build-profile.v1.json +2 -1
  16. package/data/council-evaluation-protocol.v1.json +7 -4
  17. package/data/master-selector-method-locales.v1.mjs +10 -0
  18. package/data/persona-v3-ai-assisted-solo-profile.v1.json +2 -2
  19. package/data/persona-v3-build-specs.v1.mjs +60 -3
  20. package/docs/INSTALL.md +6 -10
  21. package/docs/personas.md +2 -1
  22. package/docs/plans/v1.0-roadmap.md +487 -0
  23. package/docs/plans/v1.1-basket-native-seats.md +267 -0
  24. package/docs/releases/v0.9.5.md +96 -0
  25. package/docs/releases/v1.0.0.md +164 -0
  26. package/docs/report-contract.md +30 -6
  27. package/knowledge/ai-assisted-solo/experiments/runs/a.json +13 -13
  28. package/knowledge/ai-assisted-solo/experiments/runs/b.json +2 -2
  29. package/knowledge/ai-assisted-solo/experiments/runs/c.json +2 -2
  30. package/knowledge/ai-assisted-solo/experiments/runs/d13.json +126 -126
  31. package/knowledge/ai-assisted-solo/experiments/runs/d26.json +274 -254
  32. package/knowledge/ai-assisted-solo/experiments/runs/e-d13.json +129 -129
  33. package/knowledge/ai-assisted-solo/experiments/runs/e-d26.json +277 -257
  34. package/knowledge/ai-assisted-solo/experiments/runs/h_ai_reference.json +278 -258
  35. package/knowledge/ai-assisted-solo/experiments/simulation-input.json +7278 -556
  36. package/knowledge/ai-assisted-solo/experiments/simulation-manifest.json +22 -22
  37. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_ackman/reviews/{change_value_bridge.ai-review.json → market_capitalisation.ai-review.json} +46 -46
  38. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_ackman/reviews/{power_map.ai-review.json → owner_earnings_yield.ai-review.json} +46 -46
  39. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_aschenbrenner/reviews/{compute_power_bridge.ai-review.json → market_capitalisation.ai-review.json} +46 -46
  40. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_aschenbrenner/reviews/{timeline_reverse_valuation.ai-review.json → price_implied_cash_yield.ai-review.json} +46 -46
  41. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_asness/reviews/{crowding_cost_stress.ai-review.json → nominal_earnings_yield_gap.ai-review.json} +49 -49
  42. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_asness/reviews/{factor_decomposer.ai-review.json → real_earnings_yield_gap.ai-review.json} +49 -49
  43. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_bogle/reviews/expected_return_over_long_bond.ai-review.json +277 -0
  44. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_bogle/reviews/fundamental_expected_return.ai-review.json +277 -0
  45. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_buffett/reviews/{incremental_returns.ai-review.json → market_capitalisation.ai-review.json} +46 -46
  46. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_buffett/reviews/{owner_earnings_rebuilder.ai-review.json → owner_earnings_yield.ai-review.json} +46 -46
  47. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_burry/reviews/{mispricing_carry.ai-review.json → net_current_asset_surplus_per_share.ai-review.json} +49 -49
  48. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_burry/reviews/{capital_structure_reader.ai-review.json → net_current_asset_value_per_share.ai-review.json} +46 -46
  49. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_cathie_wood/reviews/{cost_adoption_curve.ai-review.json → current_cash_yield.ai-review.json} +46 -46
  50. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_cathie_wood/reviews/{capture_valuation_bridge.ai-review.json → market_capitalisation.ai-review.json} +46 -46
  51. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_dalio/reviews/{regime_classifier.ai-review.json → policy_real_rate.ai-review.json} +49 -49
  52. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/{master_munger/reviews/incentive_map.ai-review.json → master_dalio/reviews/real_curve_slope.ai-review.json} +51 -51
  53. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_damodaran/reviews/{reverse_valuation.ai-review.json → implied_equity_risk_premium.ai-review.json} +49 -49
  54. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_damodaran/reviews/{story_dcf.ai-review.json → premium_versus_long_run_average.ai-review.json} +49 -49
  55. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_druckenmiller/reviews/{liquidity_revision_map.ai-review.json → liquidity_curve_impulse.ai-review.json} +49 -49
  56. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_druckenmiller/reviews/{inflection_payoff.ai-review.json → policy_real_rate.ai-review.json} +49 -49
  57. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_duan_yongping/reviews/{user_value_evidence.ai-review.json → five_year_opportunity_cost.ai-review.json} +46 -46
  58. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_duan_yongping/reviews/{opportunity_cost.ai-review.json → margin_retention.ai-review.json} +46 -46
  59. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_fisher/reviews/{research_productivity.ai-review.json → margin_retention.ai-review.json} +46 -46
  60. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_fisher/reviews/{scuttlebutt_graph.ai-review.json → reinvestment_spread.ai-review.json} +49 -49
  61. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/{master_dalio/reviews/debt_driver_stress.ai-review.json → master_forensic_short/reviews/cash_conversion_gap.ai-review.json} +51 -51
  62. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_forensic_short/reviews/{accounting_rebuilder.ai-review.json → cash_cover_of_leverage.ai-review.json} +46 -46
  63. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_graham/reviews/{asset_floor.ai-review.json → defensive_hurdle_base.ai-review.json} +46 -46
  64. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_graham/reviews/{normalized_earnings.ai-review.json → half_normalised_earnings_yield.ai-review.json} +46 -46
  65. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_jhunjhunwala/reviews/{penetration_liquidity.ai-review.json → cash_quality_gap.ai-review.json} +49 -49
  66. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_jhunjhunwala/reviews/{promoter_governance.ai-review.json → real_structural_growth.ai-review.json} +49 -49
  67. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_klarman/reviews/{recovery_waterfall.ai-review.json → downside_asset_coverage.ai-review.json} +46 -46
  68. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_klarman/reviews/{cash_catalyst_compare.ai-review.json → market_capitalisation.ai-review.json} +46 -46
  69. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_li_lu/reviews/{promise_integrity_ledger.ai-review.json → cash_backed_decade_return.ai-review.json} +46 -46
  70. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_li_lu/reviews/{ten_year_return_bridge.ai-review.json → decade_return_over_long_bond.ai-review.json} +49 -49
  71. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_lynch/reviews/{story_numbers_check.ai-review.json → growth_justified_capitalisation.ai-review.json} +46 -46
  72. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_lynch/reviews/{category_classifier.ai-review.json → market_capitalisation.ai-review.json} +46 -46
  73. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_marks/reviews/{cycle_temperature.ai-review.json → credit_cycle_position.ai-review.json} +49 -49
  74. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_marks/reviews/{implied_expectations.ai-review.json → equity_over_corporate_debt.ai-review.json} +49 -49
  75. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_munger/reviews/{failure_path_graph.ai-review.json → debt_service_cushion.ai-review.json} +49 -49
  76. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_munger/reviews/reported_earnings_cash_gap.ai-review.json +277 -0
  77. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_natenberg/reviews/{surface_builder.ai-review.json → normalised_skew.ai-review.json} +46 -46
  78. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_natenberg/reviews/{greeks_payoff.ai-review.json → round_trip_cost.ai-review.json} +46 -46
  79. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_pabrai/reviews/{downside_floor.ai-review.json → downside_floor_coverage.ai-review.json} +46 -46
  80. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_pabrai/reviews/{discrete_payoff.ai-review.json → market_capitalisation.ai-review.json} +46 -46
  81. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_simons/reviews/{leakage_audit.ai-review.json → absolute_session_move.ai-review.json} +42 -42
  82. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_simons/reviews/{oos_cost_test.ai-review.json → session_move_over_implied.ai-review.json} +46 -46
  83. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_sinclair/reviews/{realized_vol_forecast.ai-review.json → round_trip_cost.ai-review.json} +46 -46
  84. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_sinclair/reviews/{net_edge_sizer.ai-review.json → volatility_per_unit_of_width.ai-review.json} +46 -46
  85. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_soros/reviews/{reflexivity_graph.ai-review.json → credit_cycle_position.ai-review.json} +49 -49
  86. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_soros/reviews/{reversal_monitor.ai-review.json → financing_burden.ai-review.json} +46 -46
  87. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_taleb/reviews/{tail_friction.ai-review.json → debt_service_cushion.ai-review.json} +49 -49
  88. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_taleb/reviews/{payoff_ruin.ai-review.json → normalised_skew.ai-review.json} +46 -46
  89. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_thorp/reviews/{fractional_kelly.ai-review.json → edge_per_unit_of_volatility.ai-review.json} +46 -46
  90. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_thorp/reviews/{edge_recalculator.ai-review.json → net_edge.ai-review.json} +49 -49
  91. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/review-manifest.json +288 -270
  92. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-semantic-adjudications/index.json +2 -2
  93. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-semantic-extractions/index.json +2 -2
  94. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-semantic-skeptic-reviews/index.json +2 -2
  95. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-source-prereviews/index.json +6 -2
  96. package/knowledge/solo-test/masters/master_ackman/decision_policy.json +122 -11
  97. package/knowledge/solo-test/masters/master_ackman/doctrine.jsonl +2 -2
  98. package/knowledge/solo-test/masters/master_ackman/manifest.json +13 -6
  99. package/knowledge/solo-test/masters/master_ackman/provisional-index.json +3 -3
  100. package/knowledge/solo-test/masters/master_ackman/sources.jsonl +1 -1
  101. package/knowledge/solo-test/masters/master_ackman/tools.json +56 -30
  102. package/knowledge/solo-test/masters/master_aschenbrenner/decision_policy.json +101 -10
  103. package/knowledge/solo-test/masters/master_aschenbrenner/doctrine.jsonl +2 -2
  104. package/knowledge/solo-test/masters/master_aschenbrenner/manifest.json +12 -4
  105. package/knowledge/solo-test/masters/master_aschenbrenner/provisional-index.json +3 -3
  106. package/knowledge/solo-test/masters/master_aschenbrenner/sources.jsonl +1 -1
  107. package/knowledge/solo-test/masters/master_aschenbrenner/tools.json +56 -30
  108. package/knowledge/solo-test/masters/master_asness/decision_policy.json +89 -10
  109. package/knowledge/solo-test/masters/master_asness/doctrine.jsonl +2 -2
  110. package/knowledge/solo-test/masters/master_asness/manifest.json +11 -4
  111. package/knowledge/solo-test/masters/master_asness/provisional-index.json +3 -3
  112. package/knowledge/solo-test/masters/master_asness/sources.jsonl +1 -1
  113. package/knowledge/solo-test/masters/master_asness/tools.json +56 -30
  114. package/knowledge/solo-test/masters/master_bogle/counterfactuals.jsonl +0 -0
  115. package/knowledge/solo-test/masters/master_bogle/decision_cases.jsonl +0 -0
  116. package/knowledge/solo-test/masters/master_bogle/decision_policy.json +170 -0
  117. package/knowledge/solo-test/masters/master_bogle/doctrine.jsonl +14 -0
  118. package/knowledge/solo-test/masters/master_bogle/evaluation/calibration_cases.jsonl +0 -0
  119. package/knowledge/solo-test/masters/master_bogle/evaluation/experiments.json +5 -0
  120. package/knowledge/solo-test/masters/master_bogle/evaluation/golden_cases.jsonl +0 -0
  121. package/knowledge/solo-test/masters/master_bogle/evaluation/pairwise_cases.jsonl +0 -0
  122. package/knowledge/solo-test/masters/master_bogle/failures.jsonl +0 -0
  123. package/knowledge/solo-test/masters/master_bogle/manifest.json +141 -0
  124. package/knowledge/solo-test/masters/master_bogle/memory_policy.json +5 -0
  125. package/knowledge/solo-test/masters/master_bogle/provisional-index.json +41 -0
  126. package/knowledge/solo-test/masters/master_bogle/research_policy.json +11 -0
  127. package/knowledge/solo-test/masters/master_bogle/sources.jsonl +1 -0
  128. package/knowledge/solo-test/masters/master_bogle/tools.json +120 -0
  129. package/knowledge/solo-test/masters/master_bogle/voice.en.md +7 -0
  130. package/knowledge/solo-test/masters/master_bogle/voice.zh.md +7 -0
  131. package/knowledge/solo-test/masters/master_buffett/decision_policy.json +102 -11
  132. package/knowledge/solo-test/masters/master_buffett/doctrine.jsonl +2 -2
  133. package/knowledge/solo-test/masters/master_buffett/manifest.json +10 -4
  134. package/knowledge/solo-test/masters/master_buffett/provisional-index.json +3 -3
  135. package/knowledge/solo-test/masters/master_buffett/sources.jsonl +1 -1
  136. package/knowledge/solo-test/masters/master_buffett/tools.json +55 -29
  137. package/knowledge/solo-test/masters/master_burry/decision_policy.json +102 -12
  138. package/knowledge/solo-test/masters/master_burry/doctrine.jsonl +2 -2
  139. package/knowledge/solo-test/masters/master_burry/manifest.json +12 -6
  140. package/knowledge/solo-test/masters/master_burry/provisional-index.json +3 -3
  141. package/knowledge/solo-test/masters/master_burry/sources.jsonl +1 -1
  142. package/knowledge/solo-test/masters/master_burry/tools.json +56 -30
  143. package/knowledge/solo-test/masters/master_cathie_wood/decision_policy.json +74 -12
  144. package/knowledge/solo-test/masters/master_cathie_wood/doctrine.jsonl +2 -2
  145. package/knowledge/solo-test/masters/master_cathie_wood/manifest.json +12 -6
  146. package/knowledge/solo-test/masters/master_cathie_wood/provisional-index.json +3 -3
  147. package/knowledge/solo-test/masters/master_cathie_wood/sources.jsonl +1 -1
  148. package/knowledge/solo-test/masters/master_cathie_wood/tools.json +56 -30
  149. package/knowledge/solo-test/masters/master_dalio/decision_policy.json +123 -16
  150. package/knowledge/solo-test/masters/master_dalio/doctrine.jsonl +2 -2
  151. package/knowledge/solo-test/masters/master_dalio/manifest.json +10 -4
  152. package/knowledge/solo-test/masters/master_dalio/provisional-index.json +3 -3
  153. package/knowledge/solo-test/masters/master_dalio/sources.jsonl +1 -1
  154. package/knowledge/solo-test/masters/master_dalio/tools.json +56 -30
  155. package/knowledge/solo-test/masters/master_damodaran/decision_policy.json +58 -10
  156. package/knowledge/solo-test/masters/master_damodaran/doctrine.jsonl +2 -2
  157. package/knowledge/solo-test/masters/master_damodaran/manifest.json +9 -4
  158. package/knowledge/solo-test/masters/master_damodaran/provisional-index.json +3 -3
  159. package/knowledge/solo-test/masters/master_damodaran/sources.jsonl +1 -1
  160. package/knowledge/solo-test/masters/master_damodaran/tools.json +54 -28
  161. package/knowledge/solo-test/masters/master_druckenmiller/decision_policy.json +89 -10
  162. package/knowledge/solo-test/masters/master_druckenmiller/doctrine.jsonl +2 -2
  163. package/knowledge/solo-test/masters/master_druckenmiller/manifest.json +11 -4
  164. package/knowledge/solo-test/masters/master_druckenmiller/provisional-index.json +3 -3
  165. package/knowledge/solo-test/masters/master_druckenmiller/sources.jsonl +1 -1
  166. package/knowledge/solo-test/masters/master_druckenmiller/tools.json +55 -29
  167. package/knowledge/solo-test/masters/master_duan_yongping/decision_policy.json +138 -13
  168. package/knowledge/solo-test/masters/master_duan_yongping/doctrine.jsonl +2 -2
  169. package/knowledge/solo-test/masters/master_duan_yongping/manifest.json +17 -7
  170. package/knowledge/solo-test/masters/master_duan_yongping/provisional-index.json +3 -3
  171. package/knowledge/solo-test/masters/master_duan_yongping/sources.jsonl +1 -1
  172. package/knowledge/solo-test/masters/master_duan_yongping/tools.json +82 -30
  173. package/knowledge/solo-test/masters/master_fisher/decision_policy.json +102 -11
  174. package/knowledge/solo-test/masters/master_fisher/doctrine.jsonl +2 -2
  175. package/knowledge/solo-test/masters/master_fisher/manifest.json +13 -6
  176. package/knowledge/solo-test/masters/master_fisher/provisional-index.json +3 -3
  177. package/knowledge/solo-test/masters/master_fisher/sources.jsonl +1 -1
  178. package/knowledge/solo-test/masters/master_fisher/tools.json +58 -32
  179. package/knowledge/solo-test/masters/master_forensic_short/decision_policy.json +93 -14
  180. package/knowledge/solo-test/masters/master_forensic_short/doctrine.jsonl +2 -2
  181. package/knowledge/solo-test/masters/master_forensic_short/manifest.json +6 -4
  182. package/knowledge/solo-test/masters/master_forensic_short/provisional-index.json +3 -3
  183. package/knowledge/solo-test/masters/master_forensic_short/sources.jsonl +1 -1
  184. package/knowledge/solo-test/masters/master_forensic_short/tools.json +53 -27
  185. package/knowledge/solo-test/masters/master_graham/decision_policy.json +103 -12
  186. package/knowledge/solo-test/masters/master_graham/doctrine.jsonl +2 -2
  187. package/knowledge/solo-test/masters/master_graham/manifest.json +12 -4
  188. package/knowledge/solo-test/masters/master_graham/provisional-index.json +3 -3
  189. package/knowledge/solo-test/masters/master_graham/sources.jsonl +1 -1
  190. package/knowledge/solo-test/masters/master_graham/tools.json +67 -28
  191. package/knowledge/solo-test/masters/master_jhunjhunwala/decision_policy.json +77 -12
  192. package/knowledge/solo-test/masters/master_jhunjhunwala/doctrine.jsonl +2 -2
  193. package/knowledge/solo-test/masters/master_jhunjhunwala/manifest.json +11 -6
  194. package/knowledge/solo-test/masters/master_jhunjhunwala/provisional-index.json +3 -3
  195. package/knowledge/solo-test/masters/master_jhunjhunwala/sources.jsonl +1 -1
  196. package/knowledge/solo-test/masters/master_jhunjhunwala/tools.json +54 -28
  197. package/knowledge/solo-test/masters/master_klarman/decision_policy.json +105 -14
  198. package/knowledge/solo-test/masters/master_klarman/doctrine.jsonl +2 -2
  199. package/knowledge/solo-test/masters/master_klarman/manifest.json +8 -2
  200. package/knowledge/solo-test/masters/master_klarman/provisional-index.json +3 -3
  201. package/knowledge/solo-test/masters/master_klarman/sources.jsonl +1 -1
  202. package/knowledge/solo-test/masters/master_klarman/tools.json +55 -29
  203. package/knowledge/solo-test/masters/master_li_lu/decision_policy.json +101 -10
  204. package/knowledge/solo-test/masters/master_li_lu/doctrine.jsonl +2 -2
  205. package/knowledge/solo-test/masters/master_li_lu/manifest.json +13 -6
  206. package/knowledge/solo-test/masters/master_li_lu/provisional-index.json +3 -3
  207. package/knowledge/solo-test/masters/master_li_lu/sources.jsonl +1 -1
  208. package/knowledge/solo-test/masters/master_li_lu/tools.json +58 -32
  209. package/knowledge/solo-test/masters/master_lynch/decision_policy.json +127 -16
  210. package/knowledge/solo-test/masters/master_lynch/doctrine.jsonl +2 -2
  211. package/knowledge/solo-test/masters/master_lynch/manifest.json +14 -6
  212. package/knowledge/solo-test/masters/master_lynch/provisional-index.json +3 -3
  213. package/knowledge/solo-test/masters/master_lynch/sources.jsonl +1 -1
  214. package/knowledge/solo-test/masters/master_lynch/tools.json +67 -28
  215. package/knowledge/solo-test/masters/master_marks/decision_policy.json +71 -9
  216. package/knowledge/solo-test/masters/master_marks/doctrine.jsonl +2 -2
  217. package/knowledge/solo-test/masters/master_marks/manifest.json +11 -6
  218. package/knowledge/solo-test/masters/master_marks/provisional-index.json +3 -3
  219. package/knowledge/solo-test/masters/master_marks/sources.jsonl +1 -1
  220. package/knowledge/solo-test/masters/master_marks/tools.json +54 -28
  221. package/knowledge/solo-test/masters/master_munger/decision_policy.json +141 -16
  222. package/knowledge/solo-test/masters/master_munger/doctrine.jsonl +2 -2
  223. package/knowledge/solo-test/masters/master_munger/manifest.json +10 -6
  224. package/knowledge/solo-test/masters/master_munger/provisional-index.json +3 -3
  225. package/knowledge/solo-test/masters/master_munger/sources.jsonl +1 -1
  226. package/knowledge/solo-test/masters/master_munger/tools.json +52 -26
  227. package/knowledge/solo-test/masters/master_natenberg/decision_policy.json +59 -11
  228. package/knowledge/solo-test/masters/master_natenberg/doctrine.jsonl +2 -2
  229. package/knowledge/solo-test/masters/master_natenberg/manifest.json +9 -6
  230. package/knowledge/solo-test/masters/master_natenberg/provisional-index.json +3 -3
  231. package/knowledge/solo-test/masters/master_natenberg/sources.jsonl +1 -1
  232. package/knowledge/solo-test/masters/master_natenberg/tools.json +50 -24
  233. package/knowledge/solo-test/masters/master_pabrai/decision_policy.json +125 -14
  234. package/knowledge/solo-test/masters/master_pabrai/doctrine.jsonl +2 -2
  235. package/knowledge/solo-test/masters/master_pabrai/manifest.json +8 -2
  236. package/knowledge/solo-test/masters/master_pabrai/provisional-index.json +3 -3
  237. package/knowledge/solo-test/masters/master_pabrai/sources.jsonl +1 -1
  238. package/knowledge/solo-test/masters/master_pabrai/tools.json +55 -29
  239. package/knowledge/solo-test/masters/master_simons/decision_policy.json +59 -11
  240. package/knowledge/solo-test/masters/master_simons/doctrine.jsonl +2 -2
  241. package/knowledge/solo-test/masters/master_simons/manifest.json +8 -4
  242. package/knowledge/solo-test/masters/master_simons/provisional-index.json +3 -3
  243. package/knowledge/solo-test/masters/master_simons/sources.jsonl +1 -1
  244. package/knowledge/solo-test/masters/master_simons/tools.json +43 -30
  245. package/knowledge/solo-test/masters/master_sinclair/decision_policy.json +59 -11
  246. package/knowledge/solo-test/masters/master_sinclair/doctrine.jsonl +2 -2
  247. package/knowledge/solo-test/masters/master_sinclair/manifest.json +8 -6
  248. package/knowledge/solo-test/masters/master_sinclair/provisional-index.json +3 -3
  249. package/knowledge/solo-test/masters/master_sinclair/sources.jsonl +1 -1
  250. package/knowledge/solo-test/masters/master_sinclair/tools.json +54 -28
  251. package/knowledge/solo-test/masters/master_soros/decision_policy.json +98 -10
  252. package/knowledge/solo-test/masters/master_soros/doctrine.jsonl +2 -2
  253. package/knowledge/solo-test/masters/master_soros/manifest.json +10 -7
  254. package/knowledge/solo-test/masters/master_soros/provisional-index.json +3 -3
  255. package/knowledge/solo-test/masters/master_soros/sources.jsonl +1 -1
  256. package/knowledge/solo-test/masters/master_soros/tools.json +54 -28
  257. package/knowledge/solo-test/masters/master_taleb/decision_policy.json +124 -13
  258. package/knowledge/solo-test/masters/master_taleb/doctrine.jsonl +2 -2
  259. package/knowledge/solo-test/masters/master_taleb/manifest.json +9 -5
  260. package/knowledge/solo-test/masters/master_taleb/provisional-index.json +3 -3
  261. package/knowledge/solo-test/masters/master_taleb/sources.jsonl +1 -1
  262. package/knowledge/solo-test/masters/master_taleb/tools.json +50 -24
  263. package/knowledge/solo-test/masters/master_thorp/decision_policy.json +61 -13
  264. package/knowledge/solo-test/masters/master_thorp/doctrine.jsonl +2 -2
  265. package/knowledge/solo-test/masters/master_thorp/manifest.json +11 -6
  266. package/knowledge/solo-test/masters/master_thorp/provisional-index.json +3 -3
  267. package/knowledge/solo-test/masters/master_thorp/sources.jsonl +1 -1
  268. package/knowledge/solo-test/masters/master_thorp/tools.json +56 -30
  269. package/knowledge/solo-test/persona-v3-solo-test-formulas/compilation-manifest.json +290 -264
  270. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_ackman/components/tools.json +58 -32
  271. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_ackman/provisional-derivations/market_capitalisation.derived-proxy-evidence.json +76 -0
  272. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_ackman/provisional-derivations/owner_earnings_yield.derived-proxy-evidence.json +76 -0
  273. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_aschenbrenner/components/tools.json +58 -32
  274. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_aschenbrenner/provisional-derivations/market_capitalisation.derived-proxy-evidence.json +76 -0
  275. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_aschenbrenner/provisional-derivations/price_implied_cash_yield.derived-proxy-evidence.json +76 -0
  276. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_asness/components/tools.json +58 -32
  277. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_asness/provisional-derivations/nominal_earnings_yield_gap.derived-proxy-evidence.json +76 -0
  278. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_asness/provisional-derivations/real_earnings_yield_gap.derived-proxy-evidence.json +76 -0
  279. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_bogle/components/tools.json +120 -0
  280. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_bogle/provisional-derivations/expected_return_over_long_bond.derived-proxy-evidence.json +77 -0
  281. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_bogle/provisional-derivations/fundamental_expected_return.derived-proxy-evidence.json +76 -0
  282. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_buffett/components/tools.json +57 -31
  283. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_buffett/provisional-derivations/market_capitalisation.derived-proxy-evidence.json +76 -0
  284. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_buffett/provisional-derivations/owner_earnings_yield.derived-proxy-evidence.json +76 -0
  285. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_burry/components/tools.json +58 -32
  286. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_burry/provisional-derivations/net_current_asset_surplus_per_share.derived-proxy-evidence.json +77 -0
  287. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_burry/provisional-derivations/net_current_asset_value_per_share.derived-proxy-evidence.json +76 -0
  288. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_cathie_wood/components/tools.json +58 -32
  289. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_cathie_wood/provisional-derivations/current_cash_yield.derived-proxy-evidence.json +76 -0
  290. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_cathie_wood/provisional-derivations/market_capitalisation.derived-proxy-evidence.json +76 -0
  291. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_dalio/components/tools.json +58 -32
  292. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_dalio/provisional-derivations/policy_real_rate.derived-proxy-evidence.json +76 -0
  293. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_dalio/provisional-derivations/real_curve_slope.derived-proxy-evidence.json +76 -0
  294. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_damodaran/components/tools.json +56 -30
  295. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_damodaran/provisional-derivations/implied_equity_risk_premium.derived-proxy-evidence.json +76 -0
  296. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_damodaran/provisional-derivations/{reverse_valuation.derived-proxy-evidence.json → premium_versus_long_run_average.derived-proxy-evidence.json} +29 -16
  297. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_druckenmiller/components/tools.json +57 -31
  298. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_druckenmiller/provisional-derivations/liquidity_curve_impulse.derived-proxy-evidence.json +76 -0
  299. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_druckenmiller/provisional-derivations/policy_real_rate.derived-proxy-evidence.json +76 -0
  300. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_duan_yongping/components/tools.json +84 -32
  301. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_duan_yongping/provisional-derivations/five_year_opportunity_cost.derived-proxy-evidence.json +102 -0
  302. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_duan_yongping/provisional-derivations/margin_retention.derived-proxy-evidence.json +76 -0
  303. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_fisher/components/tools.json +60 -34
  304. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_fisher/provisional-derivations/margin_retention.derived-proxy-evidence.json +76 -0
  305. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_fisher/provisional-derivations/reinvestment_spread.derived-proxy-evidence.json +76 -0
  306. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_forensic_short/components/tools.json +55 -29
  307. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_forensic_short/provisional-derivations/{accounting_rebuilder.derived-proxy-evidence.json → cash_conversion_gap.derived-proxy-evidence.json} +28 -15
  308. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_forensic_short/provisional-derivations/cash_cover_of_leverage.derived-proxy-evidence.json +76 -0
  309. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_graham/components/tools.json +69 -30
  310. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_graham/provisional-derivations/defensive_hurdle_base.derived-proxy-evidence.json +89 -0
  311. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_graham/provisional-derivations/half_normalised_earnings_yield.derived-proxy-evidence.json +76 -0
  312. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_jhunjhunwala/components/tools.json +56 -30
  313. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_jhunjhunwala/provisional-derivations/cash_quality_gap.derived-proxy-evidence.json +76 -0
  314. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_jhunjhunwala/provisional-derivations/real_structural_growth.derived-proxy-evidence.json +76 -0
  315. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_klarman/components/tools.json +57 -31
  316. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_klarman/provisional-derivations/downside_asset_coverage.derived-proxy-evidence.json +76 -0
  317. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_klarman/provisional-derivations/market_capitalisation.derived-proxy-evidence.json +76 -0
  318. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_li_lu/components/tools.json +60 -34
  319. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_li_lu/provisional-derivations/cash_backed_decade_return.derived-proxy-evidence.json +76 -0
  320. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_li_lu/provisional-derivations/decade_return_over_long_bond.derived-proxy-evidence.json +76 -0
  321. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_lynch/components/tools.json +69 -30
  322. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_lynch/provisional-derivations/growth_justified_capitalisation.derived-proxy-evidence.json +89 -0
  323. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_lynch/provisional-derivations/market_capitalisation.derived-proxy-evidence.json +76 -0
  324. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_marks/components/tools.json +56 -30
  325. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_marks/provisional-derivations/credit_cycle_position.derived-proxy-evidence.json +76 -0
  326. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_marks/provisional-derivations/equity_over_corporate_debt.derived-proxy-evidence.json +76 -0
  327. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_munger/components/tools.json +54 -28
  328. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_munger/provisional-derivations/debt_service_cushion.derived-proxy-evidence.json +76 -0
  329. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_munger/provisional-derivations/reported_earnings_cash_gap.derived-proxy-evidence.json +76 -0
  330. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_natenberg/components/tools.json +52 -26
  331. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_natenberg/provisional-derivations/{surface_builder.derived-proxy-evidence.json → normalised_skew.derived-proxy-evidence.json} +27 -14
  332. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_natenberg/provisional-derivations/round_trip_cost.derived-proxy-evidence.json +76 -0
  333. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_pabrai/components/tools.json +57 -31
  334. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_pabrai/provisional-derivations/downside_floor_coverage.derived-proxy-evidence.json +76 -0
  335. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_pabrai/provisional-derivations/market_capitalisation.derived-proxy-evidence.json +76 -0
  336. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_simons/components/tools.json +45 -32
  337. package/knowledge/solo-test/persona-v3-solo-test-formulas/{master_natenberg/provisional-derivations/greeks_payoff.derived-proxy-evidence.json → master_simons/provisional-derivations/absolute_session_move.derived-proxy-evidence.json} +17 -17
  338. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_simons/provisional-derivations/session_move_over_implied.derived-proxy-evidence.json +77 -0
  339. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_sinclair/components/tools.json +56 -30
  340. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_sinclair/provisional-derivations/round_trip_cost.derived-proxy-evidence.json +76 -0
  341. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_sinclair/provisional-derivations/volatility_per_unit_of_width.derived-proxy-evidence.json +76 -0
  342. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_soros/components/tools.json +56 -30
  343. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_soros/provisional-derivations/credit_cycle_position.derived-proxy-evidence.json +76 -0
  344. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_soros/provisional-derivations/financing_burden.derived-proxy-evidence.json +76 -0
  345. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_taleb/components/tools.json +52 -26
  346. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_taleb/provisional-derivations/debt_service_cushion.derived-proxy-evidence.json +76 -0
  347. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_taleb/provisional-derivations/{tail_friction.derived-proxy-evidence.json → normalised_skew.derived-proxy-evidence.json} +27 -14
  348. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_thorp/components/tools.json +58 -32
  349. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_thorp/provisional-derivations/edge_per_unit_of_volatility.derived-proxy-evidence.json +77 -0
  350. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_thorp/provisional-derivations/net_edge.derived-proxy-evidence.json +76 -0
  351. package/mcp/lib/breadth.mjs +126 -0
  352. package/mcp/lib/constants.mjs +15 -0
  353. package/mcp/lib/damodaran.mjs +119 -0
  354. package/mcp/lib/fred.mjs +246 -0
  355. package/mcp/lib/fund-holdings-parsers.mjs +297 -0
  356. package/mcp/lib/fund-observations.mjs +152 -0
  357. package/mcp/lib/fundamentals.mjs +806 -0
  358. package/mcp/lib/funds.mjs +785 -0
  359. package/mcp/lib/gates.mjs +71 -4
  360. package/mcp/lib/grounding.mjs +209 -36
  361. package/mcp/lib/index-aggregate.mjs +733 -0
  362. package/mcp/lib/insider-ownership.mjs +149 -0
  363. package/mcp/lib/instrument-facts.mjs +855 -0
  364. package/mcp/lib/instruments.mjs +216 -0
  365. package/mcp/lib/markdown.mjs +216 -43
  366. package/mcp/lib/master-catalog.mjs +4 -0
  367. package/mcp/lib/orchestrator.mjs +173 -29
  368. package/mcp/lib/packets.mjs +59 -6
  369. package/mcp/lib/personas/engine.mjs +23 -10
  370. package/mcp/lib/personas-v3/deterministic-executor.mjs +13 -2
  371. package/mcp/lib/personas-v3/ga-external-evidence.mjs +3 -2
  372. package/mcp/lib/personas-v3/ga-gate.mjs +2 -1
  373. package/mcp/lib/personas-v3/ga-package-evidence.mjs +5 -4
  374. package/mcp/lib/personas-v3/grounding-adapter.mjs +309 -2
  375. package/mcp/lib/personas-v3/production-root.mjs +5 -4
  376. package/mcp/lib/personas-v3/release-formula-evidence.mjs +14 -7
  377. package/mcp/lib/personas-v3/release-source-evidence.mjs +2 -1
  378. package/mcp/lib/personas-v3/releases.mjs +5 -4
  379. package/mcp/lib/personas-v3/runtime-release-integrity.mjs +6 -5
  380. package/mcp/lib/personas-v3/semantic-source-adjudication.mjs +2 -1
  381. package/mcp/lib/personas-v3/semantic-source-extraction.mjs +2 -1
  382. package/mcp/lib/personas-v3/semantic-source-skeptic-review.mjs +2 -1
  383. package/mcp/lib/personas-v3/source-review-operations.mjs +3 -2
  384. package/mcp/lib/personas-v3/staging.mjs +22 -3
  385. package/mcp/lib/prompts.mjs +87 -3
  386. package/mcp/lib/quotes.mjs +5 -0
  387. package/mcp/lib/rpc.mjs +27 -10
  388. package/mcp/lib/run-store.mjs +5 -3
  389. package/mcp/lib/sec.mjs +32 -0
  390. package/mcp/lib/tables.mjs +11 -0
  391. package/mcp/lib/voice.mjs +122 -0
  392. package/mcp/lib/xbrl-aggregates.mjs +153 -0
  393. package/mcp/lib/xbrl-series.mjs +341 -0
  394. package/mcp/lib/xlsx.mjs +155 -0
  395. package/package.json +5 -5
  396. package/personas/masters/masters-value/bogle.md +145 -0
  397. package/schemas/council-evaluation-protocol-v1.schema.json +2 -2
  398. package/schemas/persona-v3-ai-assisted-solo-profile-v1.schema.json +2 -2
  399. package/schemas/persona-v3-ai-machine-simulation-v1.schema.json +1 -1
  400. package/schemas/persona-v3-build-spec-v1.schema.json +3 -3
  401. package/schemas/persona-v3-release-formula-review-evidence-v1.schema.json +3 -3
  402. package/schemas/persona-v3-release-manifest-v1.schema.json +6 -6
  403. package/schemas/persona-v3-release-source-review-evidence-v1.schema.json +3 -3
  404. package/schemas/persona-v3-tool-graph-v1.schema.json +1 -1
  405. package/schemas/source-review-batch-v1.schema.json +9 -9
  406. package/scripts/assemble-persona-v3-release.mjs +3 -2
  407. package/scripts/build-persona-v3-solo-test-packs.mjs +6 -8
  408. package/scripts/check-persona-v3-ga.mjs +1 -1
  409. package/scripts/check-persona-v3-production-candidates.mjs +1 -1
  410. package/scripts/compile-persona-v3-formulas.mjs +19 -18
  411. package/scripts/doctor.mjs +11 -9
  412. package/scripts/export-persona-source-review-batch.mjs +1 -1
  413. package/scripts/generate-persona-v3-drafts.mjs +2 -2
  414. package/scripts/lib/build-profile.mjs +24 -0
  415. package/scripts/lib/council-evaluation-protocol.mjs +7 -6
  416. package/scripts/lib/host-capabilities.mjs +2 -1
  417. package/scripts/lib/packaged-host-parity.mjs +9 -3
  418. package/scripts/lib/persona-v3-ai-assisted-solo-status.mjs +6 -4
  419. package/scripts/lib/persona-v3-ai-formula-review.mjs +6 -5
  420. package/scripts/lib/persona-v3-ai-machine-simulations.mjs +32 -4
  421. package/scripts/lib/persona-v3-build-specs.mjs +3 -2
  422. package/scripts/lib/persona-v3-draft-packs.mjs +2 -2
  423. package/scripts/lib/persona-v3-formula-pipeline.mjs +11 -10
  424. package/scripts/lib/persona-v3-production-candidates.mjs +10 -9
  425. package/scripts/lib/persona-v3-solo-formula-pipeline.mjs +188 -16
  426. package/scripts/lib/persona-v3-solo-test-packs.mjs +112 -11
  427. package/scripts/package-smoke.mjs +2 -1
  428. package/scripts/report-persona-corpus-gaps.mjs +4 -1
  429. package/scripts/review-persona-v3-solo-formulas.mjs +12 -8
  430. package/scripts/scaffold-persona-v3-staging.mjs +1 -1
  431. package/skills/agent-skills-governance/SKILL.md +8 -2
  432. package/skills/alphacouncil-agent/SKILL.md +12 -4
  433. package/skills/public-equity-investing/SKILL.md +17 -0
  434. package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_forensic_short/reviews/borrow_catalyst.ai-review.json +0 -277
  435. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_ackman/provisional-derivations/change_value_bridge.derived-proxy-evidence.json +0 -64
  436. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_ackman/provisional-derivations/power_map.derived-proxy-evidence.json +0 -64
  437. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_aschenbrenner/provisional-derivations/compute_power_bridge.derived-proxy-evidence.json +0 -64
  438. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_aschenbrenner/provisional-derivations/timeline_reverse_valuation.derived-proxy-evidence.json +0 -64
  439. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_asness/provisional-derivations/crowding_cost_stress.derived-proxy-evidence.json +0 -64
  440. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_asness/provisional-derivations/factor_decomposer.derived-proxy-evidence.json +0 -64
  441. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_buffett/provisional-derivations/incremental_returns.derived-proxy-evidence.json +0 -64
  442. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_buffett/provisional-derivations/owner_earnings_rebuilder.derived-proxy-evidence.json +0 -64
  443. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_burry/provisional-derivations/capital_structure_reader.derived-proxy-evidence.json +0 -64
  444. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_burry/provisional-derivations/mispricing_carry.derived-proxy-evidence.json +0 -64
  445. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_cathie_wood/provisional-derivations/capture_valuation_bridge.derived-proxy-evidence.json +0 -64
  446. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_cathie_wood/provisional-derivations/cost_adoption_curve.derived-proxy-evidence.json +0 -64
  447. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_dalio/provisional-derivations/debt_driver_stress.derived-proxy-evidence.json +0 -64
  448. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_dalio/provisional-derivations/regime_classifier.derived-proxy-evidence.json +0 -64
  449. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_damodaran/provisional-derivations/story_dcf.derived-proxy-evidence.json +0 -64
  450. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_druckenmiller/provisional-derivations/inflection_payoff.derived-proxy-evidence.json +0 -64
  451. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_druckenmiller/provisional-derivations/liquidity_revision_map.derived-proxy-evidence.json +0 -64
  452. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_duan_yongping/provisional-derivations/opportunity_cost.derived-proxy-evidence.json +0 -64
  453. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_duan_yongping/provisional-derivations/user_value_evidence.derived-proxy-evidence.json +0 -64
  454. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_fisher/provisional-derivations/research_productivity.derived-proxy-evidence.json +0 -64
  455. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_fisher/provisional-derivations/scuttlebutt_graph.derived-proxy-evidence.json +0 -64
  456. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_forensic_short/provisional-derivations/borrow_catalyst.derived-proxy-evidence.json +0 -64
  457. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_graham/provisional-derivations/asset_floor.derived-proxy-evidence.json +0 -64
  458. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_graham/provisional-derivations/normalized_earnings.derived-proxy-evidence.json +0 -64
  459. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_jhunjhunwala/provisional-derivations/penetration_liquidity.derived-proxy-evidence.json +0 -64
  460. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_jhunjhunwala/provisional-derivations/promoter_governance.derived-proxy-evidence.json +0 -64
  461. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_klarman/provisional-derivations/cash_catalyst_compare.derived-proxy-evidence.json +0 -64
  462. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_klarman/provisional-derivations/recovery_waterfall.derived-proxy-evidence.json +0 -64
  463. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_li_lu/provisional-derivations/promise_integrity_ledger.derived-proxy-evidence.json +0 -64
  464. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_li_lu/provisional-derivations/ten_year_return_bridge.derived-proxy-evidence.json +0 -64
  465. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_lynch/provisional-derivations/category_classifier.derived-proxy-evidence.json +0 -64
  466. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_lynch/provisional-derivations/story_numbers_check.derived-proxy-evidence.json +0 -64
  467. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_marks/provisional-derivations/cycle_temperature.derived-proxy-evidence.json +0 -64
  468. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_marks/provisional-derivations/implied_expectations.derived-proxy-evidence.json +0 -64
  469. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_munger/provisional-derivations/failure_path_graph.derived-proxy-evidence.json +0 -64
  470. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_munger/provisional-derivations/incentive_map.derived-proxy-evidence.json +0 -64
  471. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_pabrai/provisional-derivations/discrete_payoff.derived-proxy-evidence.json +0 -64
  472. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_pabrai/provisional-derivations/downside_floor.derived-proxy-evidence.json +0 -64
  473. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_simons/provisional-derivations/leakage_audit.derived-proxy-evidence.json +0 -64
  474. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_simons/provisional-derivations/oos_cost_test.derived-proxy-evidence.json +0 -64
  475. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_sinclair/provisional-derivations/net_edge_sizer.derived-proxy-evidence.json +0 -64
  476. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_sinclair/provisional-derivations/realized_vol_forecast.derived-proxy-evidence.json +0 -64
  477. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_soros/provisional-derivations/reflexivity_graph.derived-proxy-evidence.json +0 -64
  478. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_soros/provisional-derivations/reversal_monitor.derived-proxy-evidence.json +0 -64
  479. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_taleb/provisional-derivations/payoff_ruin.derived-proxy-evidence.json +0 -64
  480. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_thorp/provisional-derivations/edge_recalculator.derived-proxy-evidence.json +0 -64
  481. package/knowledge/solo-test/persona-v3-solo-test-formulas/master_thorp/provisional-derivations/fractional_kelly.derived-proxy-evidence.json +0 -64
@@ -80,6 +80,15 @@ function secCompanyFactsIdentity(id) {
80
80
  };
81
81
  }
82
82
 
83
+ /**
84
+ * Keep an interval only when the value genuinely covers a span. A single-ended interval is not
85
+ * a shorter interval -- it is an observation date wearing the wrong field.
86
+ */
87
+ function pointInTimeOrInterval(periodStart, periodEnd) {
88
+ if (!periodStart) return { period_start: null, period_end: null };
89
+ return { period_start: periodStart, period_end: periodEnd };
90
+ }
91
+
83
92
  function baseFact({
84
93
  factId,
85
94
  valueKind,
@@ -108,8 +117,12 @@ function baseFact({
108
117
  currency,
109
118
  scale,
110
119
  ...(ratioDenominator ? { ratio_denominator: ratioDenominator } : {}),
111
- period_start: periodStart,
112
- period_end: periodEnd,
120
+ // `period_start`/`period_end` describe the span a value COVERS, not when it was observed --
121
+ // that is what `as_of` and `public_at` are for. A point-in-time observation with only an end
122
+ // date satisfies neither contract basis: the executor rejects it as an instant because the
123
+ // interval is non-null, and as a duration because a window needs both ends. Facts in that
124
+ // shape were unusable by any tool, which is most of what kept live seats silent.
125
+ ...pointInTimeOrInterval(periodStart, periodEnd),
113
126
  fiscal_year: fiscalYear,
114
127
  as_of: asOf,
115
128
  public_at: publicAt,
@@ -350,6 +363,293 @@ function optionsFacts(grounding, context) {
350
363
  }
351
364
  }
352
365
 
366
+ /**
367
+ * FRED observations carry their own publication date, so unlike the market snapshot they can
368
+ * be converted without stamping the run time onto them. That is the whole reason the macro
369
+ * block could not be converted before: it had readings but no lineage.
370
+ */
371
+ function macroSeriesFacts(grounding, context) {
372
+ const macro = grounding?.macro_series;
373
+ if (!macro?.series) return;
374
+ for (const [id, series] of Object.entries(macro.series)) {
375
+ if (!series?.fact || !finite(series.latest)) continue;
376
+ const publicAt = timestampAtOrBefore(series.public_at, context.cutoff);
377
+ if (!publicAt) {
378
+ context.diagnostics.push({ code: "missing_public_at", source: `fred.${id}`, action: "not_converted" });
379
+ continue;
380
+ }
381
+ const sourceIdValue = sourceId("fred", id, series.observation_date);
382
+ if (!registerSource(context, {
383
+ source_id: sourceIdValue,
384
+ source_kind: "official_statistic",
385
+ title: `FRED ${id}: ${series.label}`,
386
+ url: series.source_url,
387
+ public_at: publicAt,
388
+ retrieved_at: grounding.gathered_at || publicAt,
389
+ locator: { series_id: id, observation_date: series.observation_date },
390
+ })) continue;
391
+ // Every FRED series mapped here is quoted in percent; the typed-fact contract is decimal.
392
+ addUnique(context.facts, context.diagnostics, baseFact({
393
+ factId: series.fact,
394
+ valueKind: "ratio",
395
+ value: series.latest / 100,
396
+ unit: "decimal",
397
+ ratioDenominator: "annualized_rate",
398
+ periodEnd: series.observation_date,
399
+ asOf: context.asOf,
400
+ publicAt,
401
+ sources: [sourceIdValue],
402
+ confidence: 0.95,
403
+ }));
404
+ }
405
+
406
+ const impulse = macro.liquidity_impulse;
407
+ const liquidity = macro.net_liquidity;
408
+ if (impulse && finite(impulse.value) && liquidity) {
409
+ const publicAt = timestampAtOrBefore(liquidity.public_at, context.cutoff);
410
+ const inputIds = (liquidity.derived_from || []).map((id) => sourceId("fred", id, macro.series?.[id]?.observation_date));
411
+ const registered = publicAt && (liquidity.derived_from || []).every((id) => {
412
+ const series = macro.series?.[id];
413
+ return series && registerSource(context, {
414
+ source_id: sourceId("fred", id, series.observation_date),
415
+ source_kind: "official_statistic",
416
+ title: `FRED ${id}: ${series.label}`,
417
+ url: series.source_url,
418
+ public_at: series.public_at,
419
+ retrieved_at: grounding.gathered_at || series.public_at,
420
+ locator: { series_id: id, observation_date: series.observation_date },
421
+ });
422
+ });
423
+ if (registered) {
424
+ addUnique(context.facts, context.diagnostics, baseFact({
425
+ factId: "macro.liquidity_impulse",
426
+ valueKind: "ratio",
427
+ value: impulse.value,
428
+ unit: "decimal",
429
+ ratioDenominator: `net_liquidity_change_over_${impulse.window_days}_days`,
430
+ periodStart: impulse.from_date,
431
+ periodEnd: impulse.to_date,
432
+ asOf: context.asOf,
433
+ publicAt,
434
+ sources: inputIds,
435
+ confidence: 0.8,
436
+ derivation: "rederived",
437
+ derivationToolId: `${ADAPTER_ID}:macro:net_liquidity_impulse`,
438
+ derivationInput: {
439
+ window_days: impulse.window_days,
440
+ from: { date: impulse.from_date, value: impulse.from_value },
441
+ to: { date: impulse.to_date, value: impulse.to_value },
442
+ construction: "WALCL - RRPONTSYD*1000 - WTREGEN, in usd_millions",
443
+ },
444
+ }));
445
+ } else {
446
+ context.diagnostics.push({ code: "missing_source_lineage", source: "fred.net_liquidity", action: "not_converted" });
447
+ }
448
+ }
449
+
450
+ const regime = macro.regime;
451
+ if (regime?.state) {
452
+ const slope = macro.series?.T10Y3M;
453
+ const breakeven = macro.series?.T5YIE;
454
+ const publicAt = slope && breakeven
455
+ ? timestampAtOrBefore([slope.public_at, breakeven.public_at].sort()[0], context.cutoff)
456
+ : null;
457
+ const sources = [slope, breakeven].filter(Boolean).map((series) => sourceId("fred", series.id, series.observation_date));
458
+ if (publicAt && sources.length === 2) {
459
+ addUnique(context.facts, context.diagnostics, baseFact({
460
+ factId: "macro.growth_regime",
461
+ valueKind: "text",
462
+ value: regime.state,
463
+ unit: null,
464
+ periodEnd: slope.observation_date,
465
+ asOf: context.asOf,
466
+ publicAt,
467
+ sources,
468
+ confidence: 0.7,
469
+ derivation: "rederived",
470
+ derivationToolId: `${ADAPTER_ID}:macro:growth_inflation_quadrant`,
471
+ derivationInput: {
472
+ window_days: regime.window_days,
473
+ growth_axis: regime.growth_axis,
474
+ inflation_axis: regime.inflation_axis,
475
+ },
476
+ }));
477
+ } else {
478
+ context.diagnostics.push({ code: "missing_source_lineage", source: "fred.regime", action: "not_converted" });
479
+ }
480
+ }
481
+ }
482
+
483
+ /**
484
+ * Company fundamentals derived from XBRL, already shaped as typed-fact candidates.
485
+ *
486
+ * `deriveFundamentals` computes the period, the filing date and the source records, so this
487
+ * function's only job is registration and unit passthrough. It deliberately does not repair
488
+ * anything: a metric that arrives null arrived null for a reason the deriver already named.
489
+ */
490
+ function fundamentalFacts(grounding, context) {
491
+ const metrics = grounding?.fundamentals?.metrics;
492
+ if (!metrics || typeof metrics !== "object") return;
493
+ const cik = grounding.fundamentals.cik || grounding.screen?.cik;
494
+ const digits = String(cik || "").replace(/\D/gu, "");
495
+ const companyFactsUrl = digits
496
+ ? `https://data.sec.gov/api/xbrl/companyfacts/CIK${digits.padStart(10, "0")}.json`
497
+ : null;
498
+ for (const [factId, metric] of Object.entries(metrics)) {
499
+ if (!metric || !finite(metric.value)) continue;
500
+ const publicAt = timestampAtOrBefore(metric.public_at, context.cutoff);
501
+ const sources = Array.isArray(metric.source_ids) ? metric.source_ids.filter(Boolean) : [];
502
+ if (!publicAt || !sources.length) {
503
+ context.diagnostics.push({ code: "missing_source_lineage", source: `fundamentals.${factId}`, action: "not_converted" });
504
+ continue;
505
+ }
506
+ // Register each filing record from ITS OWN filing date, not from the date of whichever
507
+ // metric happens to consume it. Several metrics legitimately share one XBRL record, and
508
+ // stamping the consumer's period onto the shared source made the second registration
509
+ // collide with the first -- which silently dropped the fact rather than the duplicate.
510
+ // Match on the identity the id already encodes rather than rebuilding the id, so a change
511
+ // in CIK zero-padding cannot quietly break the lookup and reintroduce the collision.
512
+ const recordFor = (id) => {
513
+ const [, , , tag, accession, periodEnd] = String(id).split(":");
514
+ return (metric.source_records || []).find((record) => (
515
+ record?.tag === tag && record?.accession === accession && record?.period_end === periodEnd
516
+ ));
517
+ };
518
+ const registered = sources.every((id) => {
519
+ // The mechanical screen reads the same filings and may already have registered this
520
+ // record. First registration wins: both paths describe the same SEC document, and
521
+ // re-asserting it under a second consumer's period is what produced the collision that
522
+ // silently dropped every fundamentals fact sharing a record with the screen.
523
+ if (context.sourceRecords.has(id)) return true;
524
+ const identity = secCompanyFactsIdentity(id);
525
+ const record = recordFor(id);
526
+ const filedAt = record?.filed ? `${record.filed}T00:00:00.000Z` : publicAt;
527
+ return registerSource(context, {
528
+ source_id: id,
529
+ source_kind: "regulatory_filing_data",
530
+ title: identity.title,
531
+ url: companyFactsUrl,
532
+ public_at: filedAt,
533
+ retrieved_at: grounding.gathered_at || context.asOf,
534
+ locator: identity.locator,
535
+ });
536
+ });
537
+ if (!registered) continue;
538
+ addUnique(context.facts, context.diagnostics, baseFact({
539
+ factId,
540
+ valueKind: metric.value_kind,
541
+ value: metric.value,
542
+ unit: metric.unit,
543
+ currency: metric.currency ?? null,
544
+ scale: metric.scale ?? null,
545
+ ratioDenominator: metric.ratio_denominator,
546
+ periodStart: metric.period_start || null,
547
+ periodEnd: metric.period_end || null,
548
+ fiscalYear: Number.isInteger(metric.fiscal_year) ? metric.fiscal_year : null,
549
+ asOf: context.asOf,
550
+ publicAt,
551
+ sources,
552
+ confidence: finite(metric.confidence) ? metric.confidence : 0.85,
553
+ derivation: metric.derivation || "rederived",
554
+ derivationToolId: `${ADAPTER_ID}:fundamentals:${factId}`,
555
+ // The maintenance-capex split is an assumption, so it travels with the fact rather
556
+ // than living only in a comment nobody reads at decision time.
557
+ derivationInput: metric.assumptions?.length ? { assumptions: metric.assumptions } : null,
558
+ }));
559
+ }
560
+ }
561
+
562
+ /**
563
+ * Fund and index aggregates, including the look-through metrics that let an operating-company
564
+ * method run against a basket. Coverage weight is carried on every look-through fact: a
565
+ * portfolio number computed over 8% of the weights is not the same claim as one over 95%.
566
+ */
567
+ /**
568
+ * Section 16 insider ownership as one typed fact.
569
+ *
570
+ * The value is `estimated` rather than `reported`: no filing states this number: it is summed
571
+ * across the newest ownership document per reporting owner, and the coverage limits of Section
572
+ * 16 are real. Labelling it reported would claim a document that does not exist.
573
+ */
574
+ function insiderOwnershipFacts(grounding, context) {
575
+ const owned = grounding?.insider_ownership;
576
+ if (!owned || !finite(owned.value)) return;
577
+ const publicAt = timestampAtOrBefore(owned.public_at, context.cutoff);
578
+ if (!publicAt || !owned.source_url || !owned.source_ids?.length) {
579
+ context.diagnostics.push({ code: "missing_source_lineage", source: "insider_ownership", action: "not_converted" });
580
+ return;
581
+ }
582
+ const sourceIdValue = sourceId("sec", "section16_ownership", owned.as_of || publicAt);
583
+ if (!registerSource(context, {
584
+ source_id: sourceIdValue,
585
+ source_kind: "regulatory_filing_data",
586
+ title: "Section 16 ownership filings (Forms 3, 4 and 5)",
587
+ url: owned.source_url,
588
+ public_at: publicAt,
589
+ retrieved_at: grounding.gathered_at || publicAt,
590
+ locator: { filing_count: owned.source_ids.length, reporting_owners: owned.owner_count },
591
+ })) return;
592
+ addUnique(context.facts, context.diagnostics, baseFact({
593
+ factId: "governance.insider_ownership",
594
+ valueKind: "ratio",
595
+ value: owned.value,
596
+ unit: "decimal",
597
+ ratioDenominator: "shares_outstanding",
598
+ asOf: context.asOf,
599
+ publicAt,
600
+ sources: [sourceIdValue],
601
+ confidence: 0.7,
602
+ derivation: "estimated",
603
+ derivationToolId: `${ADAPTER_ID}:section16:insider_ownership`,
604
+ derivationInput: { method: owned.method, reporting_owners: owned.owner_count },
605
+ }));
606
+ }
607
+
608
+ function instrumentAggregateFacts(grounding, context) {
609
+ const aggregates = grounding?.instrument_aggregate?.facts;
610
+ if (!Array.isArray(aggregates)) return;
611
+ for (const entry of aggregates) {
612
+ if (!entry?.fact_id || !finite(entry.value)) continue;
613
+ const publicAt = timestampAtOrBefore(entry.public_at, context.cutoff);
614
+ if (!publicAt || !/^https?:\/\//u.test(entry.source_url || "")) {
615
+ context.diagnostics.push({ code: "missing_source_lineage", source: `instrument.${entry.fact_id}`, action: "not_converted" });
616
+ continue;
617
+ }
618
+ const sourceIdValue = sourceId(entry.source_kind || "instrument", entry.fact_id, entry.observation_date || publicAt.slice(0, 10));
619
+ if (!registerSource(context, {
620
+ source_id: sourceIdValue,
621
+ source_kind: entry.source_kind || "market_snapshot",
622
+ title: entry.title || `instrument aggregate ${entry.fact_id}`,
623
+ url: entry.source_url,
624
+ public_at: publicAt,
625
+ retrieved_at: grounding.gathered_at || publicAt,
626
+ locator: entry.locator || { fact_id: entry.fact_id },
627
+ })) continue;
628
+ addUnique(context.facts, context.diagnostics, baseFact({
629
+ factId: entry.fact_id,
630
+ valueKind: entry.value_kind || "ratio",
631
+ value: entry.value,
632
+ unit: entry.unit || "decimal",
633
+ // A monetary fact carries a currency and a scale; forwarding only the ratio fields
634
+ // rejected the whole pack the moment a basket published its size in dollars.
635
+ currency: entry.currency ?? null,
636
+ scale: entry.scale ?? null,
637
+ ratioDenominator: entry.ratio_denominator,
638
+ periodStart: entry.period_start || null,
639
+ periodEnd: entry.period_end || entry.observation_date || null,
640
+ asOf: context.asOf,
641
+ publicAt,
642
+ sources: [sourceIdValue],
643
+ confidence: finite(entry.confidence) ? entry.confidence : 0.75,
644
+ derivation: entry.derivation || "rederived",
645
+ derivationToolId: `${ADAPTER_ID}:instrument:${entry.fact_id}`,
646
+ derivationInput: entry.method
647
+ ? { method: entry.method, coverage_weight: entry.coverage_weight ?? null, basis: entry.basis ?? null }
648
+ : null,
649
+ }));
650
+ }
651
+ }
652
+
353
653
  /** Return both the immutable pack and an explicit list of fields skipped for missing lineage. */
354
654
  export function adaptGroundingToTypedFacts(grounding, { asOf, knowledgeAsOf = asOf } = {}) {
355
655
  const resolvedAsOf = asOf || grounding?.as_of || grounding?.gathered_at;
@@ -365,9 +665,16 @@ export function adaptGroundingToTypedFacts(grounding, { asOf, knowledgeAsOf = as
365
665
  quoteFacts(grounding, context);
366
666
  optionsFacts(grounding, context);
367
667
  screenFacts(grounding, context);
668
+ macroSeriesFacts(grounding, context);
669
+ fundamentalFacts(grounding, context);
670
+ instrumentAggregateFacts(grounding, context);
671
+ insiderOwnershipFacts(grounding, context);
368
672
  for (const family of ["screen", "macro", "market"]) {
369
673
  if (grounding?.[family] && !grounding[family].public_at) {
370
674
  if (family === "screen" && context.diagnostics.some((item) => String(item.source || "").startsWith("screen."))) continue;
675
+ // The market-priced macro block still has no lineage of its own, but the dated FRED
676
+ // series now cover the same ground; reporting both would read as a gap that is filled.
677
+ if (family === "macro" && grounding.macro_series?.series) continue;
371
678
  context.diagnostics.push({ code: "missing_source_lineage", source: family, action: "not_converted" });
372
679
  }
373
680
  }
@@ -1,3 +1,4 @@
1
+ import { CANONICAL_MASTER_COUNT } from "./staging.mjs";
1
2
  import {
2
3
  existsSync,
3
4
  lstatSync,
@@ -188,11 +189,11 @@ function validateReleaseManifest(manifest, pointer) {
188
189
  }
189
190
  if (manifest.release_id !== pointer.release_id) fail("active release manifest id does not match the pointer");
190
191
  if (manifest.release_status !== "assembled_immutable") fail("active release is not immutable");
191
- if (manifest.canonical_master_count !== 26
192
+ if (manifest.canonical_master_count !== CANONICAL_MASTER_COUNT
192
193
  || !Array.isArray(manifest.canonical_master_ids)
193
- || manifest.canonical_master_ids.length !== 26
194
- || new Set(manifest.canonical_master_ids).size !== 26) {
195
- fail("active release manifest does not contain exactly 26 canonical seats");
194
+ || manifest.canonical_master_ids.length !== CANONICAL_MASTER_COUNT
195
+ || new Set(manifest.canonical_master_ids).size !== CANONICAL_MASTER_COUNT) {
196
+ fail(`active release manifest does not contain exactly ${CANONICAL_MASTER_COUNT} canonical seats`);
196
197
  }
197
198
  if (manifest.masters_directory !== "masters") fail("active release masters directory is invalid");
198
199
  if (!isObject(manifest.source_review_evidence)
@@ -1,5 +1,12 @@
1
- /** Self-contained, immutable release evidence for all 52 deterministic formula tools. */
1
+ /** Self-contained, immutable release evidence for every deterministic formula tool. */
2
2
 
3
+ import { PLANNED_TOOL_COUNT } from "../../../data/persona-v3-build-specs.v1.mjs";
4
+ import { CANONICAL_MASTER_COUNT } from "./staging.mjs";
5
+
6
+ // Two planned tools per canonical seat; the seat count is the single source of truth.
7
+ // Evaluated lazily: this module participates in an import cycle with the staging roster, so a
8
+ // module-level constant reads the binding before it is initialised.
9
+ const plannedToolCount = () => PLANNED_TOOL_COUNT;
3
10
  import { existsSync, lstatSync, readFileSync, realpathSync } from "node:fs";
4
11
  import { isAbsolute, join, relative, resolve, sep } from "node:path";
5
12
 
@@ -76,7 +83,7 @@ function expectedToolMap() {
76
83
  seat.planned_dedicated_tools.map((tool) => tool.tool_id),
77
84
  ]));
78
85
  const count = [...byPersona.values()].reduce((total, ids) => total + ids.length, 0);
79
- if (count !== 52) fail(`release formula inventory must contain exactly 52 planned tools, found ${count}`);
86
+ if (count !== plannedToolCount()) fail(`release formula inventory must contain exactly ${plannedToolCount()} planned tools, found ${count}`);
80
87
  return byPersona;
81
88
  }
82
89
 
@@ -147,8 +154,8 @@ function bindingsFromPacks({ packsRoot, trustedKeys, verifiedAt }) {
147
154
  bindings.push(verifyToolBinding({ tool, bundle, personaId, trustedKeys, now: verifiedAt }));
148
155
  }
149
156
  }
150
- if (bindings.length !== 52 || new Set(bindings.map((binding) => binding.tool_id)).size !== 52) {
151
- fail("release formula evidence must contain exactly 52 unique bindings");
157
+ if (bindings.length !== plannedToolCount() || new Set(bindings.map((binding) => binding.tool_id)).size !== plannedToolCount()) {
158
+ fail(`release formula evidence must contain exactly ${plannedToolCount()} unique bindings`);
152
159
  }
153
160
  return canonicalValue(bindings);
154
161
  }
@@ -169,7 +176,7 @@ function buildDocument({ packsRoot, trustedFormulaReviewerKeys, verifiedAt }) {
169
176
  artifact_kind: "persona_v3_release_formula_review_evidence",
170
177
  verified_at: verifiedDate.toISOString(),
171
178
  canonical_master_count: CANONICAL_MASTER_IDS.length,
172
- planned_tool_count: 52,
179
+ planned_tool_count: plannedToolCount(),
173
180
  trusted_formula_reviewer_keys: publicKeys,
174
181
  trusted_key_registry_hash: sha256(publicKeys),
175
182
  formula_binding_inventory_hash: sha256(bindings),
@@ -220,7 +227,7 @@ export function verifyReleaseFormulaReviewEvidence({
220
227
  const expected = [...EVIDENCE_FIELDS].sort();
221
228
  if (canonicalJson(actual) !== canonicalJson(expected)) fail("formula-review evidence bundle fields are invalid", { actual, expected });
222
229
  if (evidence.schema_version !== 1 || evidence.artifact_kind !== "persona_v3_release_formula_review_evidence") fail("formula-review evidence bundle header is invalid");
223
- if (evidence.canonical_master_count !== 26 || evidence.planned_tool_count !== 52) fail("formula-review evidence coverage is not exact");
230
+ if (evidence.canonical_master_count !== CANONICAL_MASTER_COUNT || evidence.planned_tool_count !== plannedToolCount()) fail("formula-review evidence coverage is not exact");
224
231
  for (const field of ["trusted_key_registry_hash", "formula_binding_inventory_hash"]) {
225
232
  if (!HASH.test(evidence[field] || "")) fail(`formula-review evidence ${field} is invalid`);
226
233
  }
@@ -237,7 +244,7 @@ export function verifyReleaseFormulaReviewEvidence({
237
244
  trustedFormulaReviewerKeys: externallyTrustedSnapshot,
238
245
  verifiedAt: evidence.verified_at,
239
246
  });
240
- if (canonicalJson(rebuilt) !== canonicalJson(evidence)) fail("formula-review evidence no longer matches the 52 physical tool bindings");
247
+ if (canonicalJson(rebuilt) !== canonicalJson(evidence)) fail("formula-review evidence no longer matches the physical tool bindings");
241
248
  return Object.freeze(rebuilt);
242
249
  }
243
250
 
@@ -7,6 +7,7 @@
7
7
  * self-contained bundle is copied into the release and hash-bound by release-manifest.json.
8
8
  */
9
9
 
10
+ import { CANONICAL_MASTER_COUNT } from "./staging.mjs";
10
11
  import {
11
12
  existsSync,
12
13
  lstatSync,
@@ -164,7 +165,7 @@ function normalizePackSources(packSourcesByPersona) {
164
165
  const actualIds = [...byPersona.keys()].sort();
165
166
  const expectedIds = [...CANONICAL_MASTER_IDS].sort();
166
167
  if (canonicalJson(actualIds) !== canonicalJson(expectedIds)) {
167
- fail("source-review evidence requires source collections for exactly 26 canonical masters", {
168
+ fail(`source-review evidence requires source collections for exactly ${CANONICAL_MASTER_COUNT} canonical masters`, {
168
169
  actual_ids: actualIds,
169
170
  expected_ids: expectedIds,
170
171
  });
@@ -2,12 +2,13 @@
2
2
  * PersonaPack v3 immutable release assembly and current-pointer lifecycle.
3
3
  *
4
4
  * Release assembly is deliberately separate from the production loader root. A caller
5
- * supplies one complete 26-seat source tree; this module validates it, copies it into a
5
+ * supplies one complete source tree for the canonical roster; this module validates it, copies it into a
6
6
  * same-filesystem transaction, fsyncs it, and publishes one immutable release directory by
7
7
  * atomic rename. Cutover changes only a versioned JSON pointer. Existing releases are never
8
8
  * modified or deleted by this API.
9
9
  */
10
10
 
11
+ import { PLANNED_TOOL_COUNT } from "../../../data/persona-v3-build-specs.v1.mjs";
11
12
  import { randomUUID } from "node:crypto";
12
13
  import {
13
14
  closeSync,
@@ -727,7 +728,7 @@ function validateReleaseManifestDocument(manifest, releaseId) {
727
728
  if (manifest.release_id !== releaseId) errors.push("release manifest.release_id does not match its directory");
728
729
  if (manifest.release_status !== "assembled_immutable") errors.push("release manifest.release_status is invalid");
729
730
  if (!Number.isFinite(Date.parse(manifest.assembled_at))) errors.push("release manifest.assembled_at is invalid");
730
- if (manifest.canonical_master_count !== CANONICAL_MASTER_COUNT) errors.push("release manifest count is not 26");
731
+ if (manifest.canonical_master_count !== CANONICAL_MASTER_COUNT) errors.push(`release manifest count is not ${CANONICAL_MASTER_COUNT}`);
731
732
  try { validateCanonicalReleaseEntries(manifest.canonical_master_ids); } catch (error) { errors.push(error.message); }
732
733
  if (!SHA256.test(manifest.canonical_catalog_hash || "") || !SHA256.test(manifest.source_inventory_hash || "")) errors.push("release manifest inventory hashes are invalid");
733
734
  if (!isObject(manifest.source_review_evidence)) errors.push("release manifest source_review_evidence is required");
@@ -763,8 +764,8 @@ function validateReleaseManifestDocument(manifest, releaseId) {
763
764
  errors.push(`release manifest formula_review_evidence.${field} is invalid`);
764
765
  }
765
766
  }
766
- if (manifest.formula_review_evidence.planned_tool_count !== 52) {
767
- errors.push("release manifest formula-review evidence must bind exactly 52 tools");
767
+ if (manifest.formula_review_evidence.planned_tool_count !== PLANNED_TOOL_COUNT) {
768
+ errors.push(`release manifest formula-review evidence must bind exactly ${PLANNED_TOOL_COUNT} tools`);
768
769
  }
769
770
  }
770
771
  if (manifest.masters_directory !== PERSONA_RELEASE_RULES.masters_directory) errors.push("release manifest masters directory is invalid");
@@ -1,5 +1,6 @@
1
1
  /** Fail-closed, dependency-light verification for an activated PersonaPack v3 release. */
2
2
 
3
+ import { CANONICAL_MASTER_COUNT } from "./staging.mjs";
3
4
  import {
4
5
  existsSync,
5
6
  lstatSync,
@@ -285,7 +286,7 @@ function verifySourceEvidence({ manifest, evidence, packSources, trustedReviewer
285
286
  if (evidence.schema_version !== 1 || evidence.artifact_kind !== "persona_v3_release_source_review_evidence") {
286
287
  fail("source-review evidence bundle header is invalid");
287
288
  }
288
- if (evidence.canonical_master_count !== 26 || !Array.isArray(evidence.ledgers) || evidence.ledgers.length !== 26) {
289
+ if (evidence.canonical_master_count !== CANONICAL_MASTER_COUNT || !Array.isArray(evidence.ledgers) || evidence.ledgers.length !== CANONICAL_MASTER_COUNT) {
289
290
  fail("source-review evidence bundle does not cover 26 masters");
290
291
  }
291
292
  if (!Array.isArray(evidence.trusted_reviewer_keys)
@@ -349,13 +350,13 @@ export function verifyRuntimePersonaRelease({
349
350
  trustedFormulaReviewerKeys,
350
351
  } = {}) {
351
352
  const physicalRelease = plainDirectory(resolve(releaseDir), "active release directory");
352
- if (!Array.isArray(manifest?.canonical_master_ids) || manifest.canonical_master_ids.length !== 26
353
- || new Set(manifest.canonical_master_ids).size !== 26
354
- || !Array.isArray(manifest.packs) || manifest.packs.length !== 26) {
353
+ if (!Array.isArray(manifest?.canonical_master_ids) || manifest.canonical_master_ids.length !== CANONICAL_MASTER_COUNT
354
+ || new Set(manifest.canonical_master_ids).size !== CANONICAL_MASTER_COUNT
355
+ || !Array.isArray(manifest.packs) || manifest.packs.length !== CANONICAL_MASTER_COUNT) {
355
356
  fail("active release manifest must contain 26 unique physical packs");
356
357
  }
357
358
  const packEntries = new Map(manifest.packs.map((entry) => [entry?.persona_id, entry]));
358
- if (packEntries.size !== 26
359
+ if (packEntries.size !== CANONICAL_MASTER_COUNT
359
360
  || canonicalJson([...packEntries.keys()].sort()) !== canonicalJson([...manifest.canonical_master_ids].sort())) {
360
361
  fail("active release pack inventory does not match its canonical master ids");
361
362
  }
@@ -1,5 +1,6 @@
1
1
  /** Round-3, machine-only adjudication of extractor and skeptic semantic source reviews. */
2
2
 
3
+ import { CANONICAL_MASTER_COUNT } from "./staging.mjs";
3
4
  import {
4
5
  existsSync, lstatSync, mkdirSync, readFileSync, readdirSync, statSync, writeFileSync,
5
6
  } from "node:fs";
@@ -403,7 +404,7 @@ function buildIndex(entries) {
403
404
  human_reviewed_count: 0,
404
405
  method_attribution_approved_count: 0,
405
406
  production_effect: "none",
406
- canonical_master_count: 26,
407
+ canonical_master_count: CANONICAL_MASTER_COUNT,
407
408
  seats_with_candidates: new Set(entries.map((entry) => entry.record.persona_id)).size,
408
409
  candidate_count: entries.length,
409
410
  proposition_adjudication_count: reviews.length,
@@ -1,5 +1,6 @@
1
1
  /** Round-1, machine-labelled semantic extraction from archived source bytes. */
2
2
 
3
+ import { CANONICAL_MASTER_COUNT } from "./staging.mjs";
3
4
  import { spawnSync } from "node:child_process";
4
5
  import {
5
6
  existsSync, lstatSync, mkdirSync, readFileSync, readdirSync, statSync, writeFileSync,
@@ -277,7 +278,7 @@ function buildIndex(entries) {
277
278
  human_reviewed_count: 0,
278
279
  method_attribution_approved_count: 0,
279
280
  production_effect: "none",
280
- canonical_master_count: 26,
281
+ canonical_master_count: CANONICAL_MASTER_COUNT,
281
282
  seats_with_candidates: new Set(entries.map((entry) => entry.record.persona_id)).size,
282
283
  candidate_count: entries.length,
283
284
  readability_counts: Object.fromEntries(["readable", "partial", "unreadable"].map((status) => [status, entries.filter((entry) => entry.artifact.readability.status === status).length])),
@@ -1,5 +1,6 @@
1
1
  /** Round-2, machine-only skeptic review of round-1 semantic source extractions. */
2
2
 
3
+ import { CANONICAL_MASTER_COUNT } from "./staging.mjs";
3
4
  import {
4
5
  existsSync, lstatSync, mkdirSync, readFileSync, readdirSync, statSync, writeFileSync,
5
6
  } from "node:fs";
@@ -366,7 +367,7 @@ function buildIndex(entries) {
366
367
  human_reviewed_count: 0,
367
368
  method_attribution_approved_count: 0,
368
369
  production_effect: "none",
369
- canonical_master_count: 26,
370
+ canonical_master_count: CANONICAL_MASTER_COUNT,
370
371
  seats_with_candidates: new Set(entries.map((entry) => entry.record.persona_id)).size,
371
372
  candidate_count: entries.length,
372
373
  proposition_review_count: reviews.length,
@@ -1,5 +1,6 @@
1
1
  /** Read-only operational views for PersonaPack v3 human source review. */
2
2
 
3
+ import { CANONICAL_MASTER_COUNT } from "./staging.mjs";
3
4
  import { canonicalValue, sha256 } from "./canonical.mjs";
4
5
  import { defaultKnowledgeDir } from "./admission.mjs";
5
6
  import { inspectSourceAcquisitions } from "./source-acquisition.mjs";
@@ -226,11 +227,11 @@ export function buildSourceReviewBatch({
226
227
  prepared_source_count: prepared.length,
227
228
  trusted_quorum_source_count: prepared.filter((item) => item.trusted_quorum.satisfied).length,
228
229
  invalid_seat_count: personas.filter((seat) => seat.errors.length).length,
229
- all_26_seats_acquired: personas.length === 26 && personas.every((seat) => seat.candidate_count > 0),
230
+ all_seats_acquired: personas.length === CANONICAL_MASTER_COUNT && personas.every((seat) => seat.candidate_count > 0),
230
231
  all_candidates_prepared: candidates.length > 0 && prepared.length === candidates.length,
231
232
  all_prepared_sources_have_two_distinct_trusted_principals: prepared.length > 0
232
233
  && prepared.every((item) => item.trusted_quorum.satisfied),
233
- all_26_seats_have_a_two_principal_quorum_source: personas.length === 26
234
+ all_seats_have_a_two_principal_quorum_source: personas.length === CANONICAL_MASTER_COUNT
234
235
  && personas.every((seat) => seat.candidates.some((item) => item.trusted_quorum.satisfied)),
235
236
  production_write_count: 0,
236
237
  },
@@ -25,7 +25,6 @@ import { canonicalJson, canonicalValue, sha256 } from "./canonical.mjs";
25
25
  import { canDefineMethodRule, validateSourceAnchor } from "./source-anchor.mjs";
26
26
  import { defaultKnowledgeDir } from "./admission.mjs";
27
27
 
28
- export const CANONICAL_MASTER_COUNT = 26;
29
28
  export const CANONICAL_MASTER_IDS = Object.freeze([
30
29
  "master_aschenbrenner",
31
30
  "master_buffett",
@@ -53,8 +52,12 @@ export const CANONICAL_MASTER_IDS = Object.freeze([
53
52
  "master_taleb",
54
53
  "master_natenberg",
55
54
  "master_sinclair",
55
+ "master_bogle",
56
56
  ]);
57
57
 
58
+ /** Derived, never written twice: the roster above is the only place a seat is added. */
59
+ export const CANONICAL_MASTER_COUNT = CANONICAL_MASTER_IDS.length;
60
+
58
61
  export const STAGING_COMPONENTS = Object.freeze([
59
62
  "sources",
60
63
  "doctrine",
@@ -316,6 +319,22 @@ function writeNew(file, content, created, existing) {
316
319
  created.push(file);
317
320
  }
318
321
 
322
+ /**
323
+ * The seat index is derived from the canonical roster, not authored, so refusing to overwrite
324
+ * it -- which is the right rule for every other file here -- would leave a seat addition
325
+ * permanently unrepresentable without a manual delete.
326
+ */
327
+ function writeDerived(file, content, created, existing) {
328
+ mkdirSync(dirname(file), { recursive: true });
329
+ const present = existsSync(file);
330
+ if (present && readFileSync(file, "utf8") === content) {
331
+ existing.push(file);
332
+ return;
333
+ }
334
+ writeFileSync(file, content, "utf8");
335
+ (present ? existing : created).push(file);
336
+ }
337
+
319
338
  function prettyJson(value) {
320
339
  return `${JSON.stringify(value, null, 2)}\n`;
321
340
  }
@@ -329,7 +348,7 @@ export function scaffoldPersonaV3Staging({
329
348
  const blueprints = canonicalMasterBlueprints({ personaDir });
330
349
  const created = [];
331
350
  const existing = [];
332
- writeNew(join(stagingRoot, INDEX_FILE), prettyJson(createStagingIndex(blueprints)), created, existing);
351
+ writeDerived(join(stagingRoot, INDEX_FILE), prettyJson(createStagingIndex(blueprints)), created, existing);
333
352
  writeNew(join(stagingRoot, TEMPLATE_DIR, "source-adjudication-record.template.json"), prettyJson(sourceRecordTemplate()), created, existing);
334
353
  writeNew(join(stagingRoot, TEMPLATE_DIR, "human-review-checklist.md"), reviewChecklist(), created, existing);
335
354
  for (const blueprint of blueprints) {
@@ -520,7 +539,7 @@ export function inspectPersonaV3Staging({
520
539
  else {
521
540
  const actualIndex = parseJson(indexFile, INDEX_FILE);
522
541
  const expectedIndex = createStagingIndex(blueprints);
523
- if (canonicalJson(actualIndex) !== canonicalJson(expectedIndex)) globalErrors.push(`${INDEX_FILE} does not match the canonical 26-seat registry`);
542
+ if (canonicalJson(actualIndex) !== canonicalJson(expectedIndex)) globalErrors.push(`${INDEX_FILE} does not match the canonical seat registry`);
524
543
  }
525
544
 
526
545
  const expectedIds = new Set(CANONICAL_MASTER_IDS);