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.
- package/.claude/commands/alpha.md +22 -3
- package/.claude-plugin/marketplace.json +3 -3
- package/.claude-plugin/plugin.json +2 -2
- package/.codex-plugin/plugin.json +4 -4
- package/.grok/commands/alpha.md +22 -3
- package/.opencode/command/alpha.md +22 -3
- package/AGENTS.md +42 -4
- package/CHANGELOG.md +164 -0
- package/CLAUDE.md +59 -7
- package/README.ja.md +25 -11
- package/README.md +44 -12
- package/README.zh-CN.md +37 -12
- package/commands/alpha.md +22 -3
- package/data/authored/core-seats.mjs +808 -0
- package/data/authored/growth-seats.mjs +581 -0
- package/data/authored/index.mjs +114 -0
- package/data/authored/quant-seats.mjs +564 -0
- package/data/authored/value-seats.mjs +663 -0
- package/data/build-profile.v1.json +2 -1
- package/data/council-evaluation-protocol.v1.json +7 -4
- package/data/master-selector-method-locales.v1.mjs +296 -0
- package/data/persona-v3-ai-assisted-solo-profile.v1.json +2 -2
- package/data/persona-v3-build-specs.v1.mjs +60 -3
- package/docs/INSTALL.md +43 -6
- package/docs/personas.md +2 -1
- package/docs/plans/v1.0-roadmap.md +487 -0
- package/docs/releases/v0.9.3.md +86 -0
- package/docs/releases/v0.9.4.md +79 -0
- package/docs/releases/v0.9.5.md +96 -0
- package/docs/releases/v1.0.0.md +164 -0
- package/docs/report-contract.md +75 -2
- package/knowledge/ai-assisted-solo/experiments/runs/a.json +13 -13
- package/knowledge/ai-assisted-solo/experiments/runs/b.json +2 -2
- package/knowledge/ai-assisted-solo/experiments/runs/c.json +2 -2
- package/knowledge/ai-assisted-solo/experiments/runs/d13.json +126 -126
- package/knowledge/ai-assisted-solo/experiments/runs/d26.json +274 -254
- package/knowledge/ai-assisted-solo/experiments/runs/e-d13.json +129 -129
- package/knowledge/ai-assisted-solo/experiments/runs/e-d26.json +277 -257
- package/knowledge/ai-assisted-solo/experiments/runs/h_ai_reference.json +278 -258
- package/knowledge/ai-assisted-solo/experiments/simulation-input.json +7278 -556
- package/knowledge/ai-assisted-solo/experiments/simulation-manifest.json +22 -22
- 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
- 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
- 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
- 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
- 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
- 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
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_bogle/reviews/expected_return_over_long_bond.ai-review.json +277 -0
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/master_bogle/reviews/fundamental_expected_return.ai-review.json +277 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-formula-reviews/review-manifest.json +288 -270
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-semantic-adjudications/index.json +2 -2
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-semantic-extractions/index.json +2 -2
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-semantic-skeptic-reviews/index.json +2 -2
- package/knowledge/ai-assisted-solo/reviews/persona-v3-ai-source-prereviews/index.json +6 -2
- package/knowledge/solo-test/masters/master_ackman/decision_policy.json +122 -11
- package/knowledge/solo-test/masters/master_ackman/doctrine.jsonl +2 -2
- package/knowledge/solo-test/masters/master_ackman/manifest.json +27 -10
- package/knowledge/solo-test/masters/master_ackman/provisional-index.json +3 -3
- package/knowledge/solo-test/masters/master_ackman/sources.jsonl +1 -1
- package/knowledge/solo-test/masters/master_ackman/tools.json +56 -30
- package/knowledge/solo-test/masters/master_aschenbrenner/decision_policy.json +101 -10
- package/knowledge/solo-test/masters/master_aschenbrenner/doctrine.jsonl +2 -2
- package/knowledge/solo-test/masters/master_aschenbrenner/manifest.json +26 -8
- package/knowledge/solo-test/masters/master_aschenbrenner/provisional-index.json +3 -3
- package/knowledge/solo-test/masters/master_aschenbrenner/sources.jsonl +1 -1
- package/knowledge/solo-test/masters/master_aschenbrenner/tools.json +56 -30
- package/knowledge/solo-test/masters/master_asness/decision_policy.json +89 -10
- package/knowledge/solo-test/masters/master_asness/doctrine.jsonl +2 -2
- package/knowledge/solo-test/masters/master_asness/manifest.json +25 -8
- package/knowledge/solo-test/masters/master_asness/provisional-index.json +3 -3
- package/knowledge/solo-test/masters/master_asness/sources.jsonl +1 -1
- package/knowledge/solo-test/masters/master_asness/tools.json +56 -30
- package/knowledge/solo-test/masters/master_bogle/counterfactuals.jsonl +0 -0
- package/knowledge/solo-test/masters/master_bogle/decision_cases.jsonl +0 -0
- package/knowledge/solo-test/masters/master_bogle/decision_policy.json +170 -0
- package/knowledge/solo-test/masters/master_bogle/doctrine.jsonl +14 -0
- package/knowledge/solo-test/masters/master_bogle/evaluation/calibration_cases.jsonl +0 -0
- package/knowledge/solo-test/masters/master_bogle/evaluation/experiments.json +5 -0
- package/knowledge/solo-test/masters/master_bogle/evaluation/golden_cases.jsonl +0 -0
- package/knowledge/solo-test/masters/master_bogle/evaluation/pairwise_cases.jsonl +0 -0
- package/knowledge/solo-test/masters/master_bogle/failures.jsonl +0 -0
- package/knowledge/solo-test/masters/master_bogle/manifest.json +141 -0
- package/knowledge/solo-test/masters/master_bogle/memory_policy.json +5 -0
- package/knowledge/solo-test/masters/master_bogle/provisional-index.json +41 -0
- package/knowledge/solo-test/masters/master_bogle/research_policy.json +11 -0
- package/knowledge/solo-test/masters/master_bogle/sources.jsonl +1 -0
- package/knowledge/solo-test/masters/master_bogle/tools.json +120 -0
- package/knowledge/solo-test/masters/master_bogle/voice.en.md +7 -0
- package/knowledge/solo-test/masters/master_bogle/voice.zh.md +7 -0
- package/knowledge/solo-test/masters/master_buffett/decision_policy.json +102 -11
- package/knowledge/solo-test/masters/master_buffett/doctrine.jsonl +2 -2
- package/knowledge/solo-test/masters/master_buffett/manifest.json +24 -8
- package/knowledge/solo-test/masters/master_buffett/provisional-index.json +3 -3
- package/knowledge/solo-test/masters/master_buffett/sources.jsonl +1 -1
- package/knowledge/solo-test/masters/master_buffett/tools.json +55 -29
- package/knowledge/solo-test/masters/master_burry/decision_policy.json +102 -12
- package/knowledge/solo-test/masters/master_burry/doctrine.jsonl +2 -2
- package/knowledge/solo-test/masters/master_burry/manifest.json +26 -10
- package/knowledge/solo-test/masters/master_burry/provisional-index.json +3 -3
- package/knowledge/solo-test/masters/master_burry/sources.jsonl +1 -1
- package/knowledge/solo-test/masters/master_burry/tools.json +56 -30
- package/knowledge/solo-test/masters/master_cathie_wood/decision_policy.json +74 -12
- package/knowledge/solo-test/masters/master_cathie_wood/doctrine.jsonl +2 -2
- package/knowledge/solo-test/masters/master_cathie_wood/manifest.json +26 -10
- package/knowledge/solo-test/masters/master_cathie_wood/provisional-index.json +3 -3
- package/knowledge/solo-test/masters/master_cathie_wood/sources.jsonl +1 -1
- package/knowledge/solo-test/masters/master_cathie_wood/tools.json +56 -30
- package/knowledge/solo-test/masters/master_dalio/decision_policy.json +123 -16
- package/knowledge/solo-test/masters/master_dalio/doctrine.jsonl +2 -2
- package/knowledge/solo-test/masters/master_dalio/manifest.json +24 -8
- package/knowledge/solo-test/masters/master_dalio/provisional-index.json +3 -3
- package/knowledge/solo-test/masters/master_dalio/sources.jsonl +1 -1
- package/knowledge/solo-test/masters/master_dalio/tools.json +56 -30
- package/knowledge/solo-test/masters/master_damodaran/decision_policy.json +58 -10
- package/knowledge/solo-test/masters/master_damodaran/doctrine.jsonl +2 -2
- package/knowledge/solo-test/masters/master_damodaran/manifest.json +23 -8
- package/knowledge/solo-test/masters/master_damodaran/provisional-index.json +3 -3
- package/knowledge/solo-test/masters/master_damodaran/sources.jsonl +1 -1
- package/knowledge/solo-test/masters/master_damodaran/tools.json +54 -28
- package/knowledge/solo-test/masters/master_druckenmiller/decision_policy.json +89 -10
- package/knowledge/solo-test/masters/master_druckenmiller/doctrine.jsonl +2 -2
- package/knowledge/solo-test/masters/master_druckenmiller/manifest.json +25 -8
- package/knowledge/solo-test/masters/master_druckenmiller/provisional-index.json +3 -3
- package/knowledge/solo-test/masters/master_druckenmiller/sources.jsonl +1 -1
- package/knowledge/solo-test/masters/master_druckenmiller/tools.json +55 -29
- package/knowledge/solo-test/masters/master_duan_yongping/decision_policy.json +138 -13
- package/knowledge/solo-test/masters/master_duan_yongping/doctrine.jsonl +2 -2
- package/knowledge/solo-test/masters/master_duan_yongping/manifest.json +31 -11
- package/knowledge/solo-test/masters/master_duan_yongping/provisional-index.json +3 -3
- package/knowledge/solo-test/masters/master_duan_yongping/sources.jsonl +1 -1
- package/knowledge/solo-test/masters/master_duan_yongping/tools.json +82 -30
- package/knowledge/solo-test/masters/master_fisher/decision_policy.json +102 -11
- package/knowledge/solo-test/masters/master_fisher/doctrine.jsonl +2 -2
- package/knowledge/solo-test/masters/master_fisher/manifest.json +27 -10
- package/knowledge/solo-test/masters/master_fisher/provisional-index.json +3 -3
- package/knowledge/solo-test/masters/master_fisher/sources.jsonl +1 -1
- package/knowledge/solo-test/masters/master_fisher/tools.json +58 -32
- package/knowledge/solo-test/masters/master_forensic_short/decision_policy.json +93 -14
- package/knowledge/solo-test/masters/master_forensic_short/doctrine.jsonl +2 -2
- package/knowledge/solo-test/masters/master_forensic_short/manifest.json +20 -8
- package/knowledge/solo-test/masters/master_forensic_short/provisional-index.json +3 -3
- package/knowledge/solo-test/masters/master_forensic_short/sources.jsonl +1 -1
- package/knowledge/solo-test/masters/master_forensic_short/tools.json +53 -27
- package/knowledge/solo-test/masters/master_graham/decision_policy.json +103 -12
- package/knowledge/solo-test/masters/master_graham/doctrine.jsonl +2 -2
- package/knowledge/solo-test/masters/master_graham/manifest.json +26 -8
- package/knowledge/solo-test/masters/master_graham/provisional-index.json +3 -3
- package/knowledge/solo-test/masters/master_graham/sources.jsonl +1 -1
- package/knowledge/solo-test/masters/master_graham/tools.json +67 -28
- package/knowledge/solo-test/masters/master_jhunjhunwala/decision_policy.json +77 -12
- package/knowledge/solo-test/masters/master_jhunjhunwala/doctrine.jsonl +2 -2
- package/knowledge/solo-test/masters/master_jhunjhunwala/manifest.json +25 -10
- package/knowledge/solo-test/masters/master_jhunjhunwala/provisional-index.json +3 -3
- package/knowledge/solo-test/masters/master_jhunjhunwala/sources.jsonl +1 -1
- package/knowledge/solo-test/masters/master_jhunjhunwala/tools.json +54 -28
- package/knowledge/solo-test/masters/master_klarman/decision_policy.json +105 -14
- package/knowledge/solo-test/masters/master_klarman/doctrine.jsonl +2 -2
- package/knowledge/solo-test/masters/master_klarman/manifest.json +22 -6
- package/knowledge/solo-test/masters/master_klarman/provisional-index.json +3 -3
- package/knowledge/solo-test/masters/master_klarman/sources.jsonl +1 -1
- package/knowledge/solo-test/masters/master_klarman/tools.json +55 -29
- package/knowledge/solo-test/masters/master_li_lu/decision_policy.json +101 -10
- package/knowledge/solo-test/masters/master_li_lu/doctrine.jsonl +2 -2
- package/knowledge/solo-test/masters/master_li_lu/manifest.json +27 -10
- package/knowledge/solo-test/masters/master_li_lu/provisional-index.json +3 -3
- package/knowledge/solo-test/masters/master_li_lu/sources.jsonl +1 -1
- package/knowledge/solo-test/masters/master_li_lu/tools.json +58 -32
- package/knowledge/solo-test/masters/master_lynch/decision_policy.json +127 -16
- package/knowledge/solo-test/masters/master_lynch/doctrine.jsonl +2 -2
- package/knowledge/solo-test/masters/master_lynch/manifest.json +28 -10
- package/knowledge/solo-test/masters/master_lynch/provisional-index.json +3 -3
- package/knowledge/solo-test/masters/master_lynch/sources.jsonl +1 -1
- package/knowledge/solo-test/masters/master_lynch/tools.json +67 -28
- package/knowledge/solo-test/masters/master_marks/decision_policy.json +71 -9
- package/knowledge/solo-test/masters/master_marks/doctrine.jsonl +2 -2
- package/knowledge/solo-test/masters/master_marks/manifest.json +25 -10
- package/knowledge/solo-test/masters/master_marks/provisional-index.json +3 -3
- package/knowledge/solo-test/masters/master_marks/sources.jsonl +1 -1
- package/knowledge/solo-test/masters/master_marks/tools.json +54 -28
- package/knowledge/solo-test/masters/master_munger/decision_policy.json +141 -16
- package/knowledge/solo-test/masters/master_munger/doctrine.jsonl +2 -2
- package/knowledge/solo-test/masters/master_munger/manifest.json +24 -10
- package/knowledge/solo-test/masters/master_munger/provisional-index.json +3 -3
- package/knowledge/solo-test/masters/master_munger/sources.jsonl +1 -1
- package/knowledge/solo-test/masters/master_munger/tools.json +52 -26
- package/knowledge/solo-test/masters/master_natenberg/decision_policy.json +59 -11
- package/knowledge/solo-test/masters/master_natenberg/doctrine.jsonl +2 -2
- package/knowledge/solo-test/masters/master_natenberg/manifest.json +23 -10
- package/knowledge/solo-test/masters/master_natenberg/provisional-index.json +3 -3
- package/knowledge/solo-test/masters/master_natenberg/sources.jsonl +1 -1
- package/knowledge/solo-test/masters/master_natenberg/tools.json +50 -24
- package/knowledge/solo-test/masters/master_pabrai/decision_policy.json +125 -14
- package/knowledge/solo-test/masters/master_pabrai/doctrine.jsonl +2 -2
- package/knowledge/solo-test/masters/master_pabrai/manifest.json +22 -6
- package/knowledge/solo-test/masters/master_pabrai/provisional-index.json +3 -3
- package/knowledge/solo-test/masters/master_pabrai/sources.jsonl +1 -1
- package/knowledge/solo-test/masters/master_pabrai/tools.json +55 -29
- package/knowledge/solo-test/masters/master_simons/decision_policy.json +59 -11
- package/knowledge/solo-test/masters/master_simons/doctrine.jsonl +2 -2
- package/knowledge/solo-test/masters/master_simons/manifest.json +22 -8
- package/knowledge/solo-test/masters/master_simons/provisional-index.json +3 -3
- package/knowledge/solo-test/masters/master_simons/sources.jsonl +1 -1
- package/knowledge/solo-test/masters/master_simons/tools.json +43 -30
- package/knowledge/solo-test/masters/master_sinclair/decision_policy.json +59 -11
- package/knowledge/solo-test/masters/master_sinclair/doctrine.jsonl +2 -2
- package/knowledge/solo-test/masters/master_sinclair/manifest.json +22 -10
- package/knowledge/solo-test/masters/master_sinclair/provisional-index.json +3 -3
- package/knowledge/solo-test/masters/master_sinclair/sources.jsonl +1 -1
- package/knowledge/solo-test/masters/master_sinclair/tools.json +54 -28
- package/knowledge/solo-test/masters/master_soros/decision_policy.json +98 -10
- package/knowledge/solo-test/masters/master_soros/doctrine.jsonl +2 -2
- package/knowledge/solo-test/masters/master_soros/manifest.json +24 -11
- package/knowledge/solo-test/masters/master_soros/provisional-index.json +3 -3
- package/knowledge/solo-test/masters/master_soros/sources.jsonl +1 -1
- package/knowledge/solo-test/masters/master_soros/tools.json +54 -28
- package/knowledge/solo-test/masters/master_taleb/decision_policy.json +124 -13
- package/knowledge/solo-test/masters/master_taleb/doctrine.jsonl +2 -2
- package/knowledge/solo-test/masters/master_taleb/manifest.json +23 -9
- package/knowledge/solo-test/masters/master_taleb/provisional-index.json +3 -3
- package/knowledge/solo-test/masters/master_taleb/sources.jsonl +1 -1
- package/knowledge/solo-test/masters/master_taleb/tools.json +50 -24
- package/knowledge/solo-test/masters/master_thorp/decision_policy.json +61 -13
- package/knowledge/solo-test/masters/master_thorp/doctrine.jsonl +2 -2
- package/knowledge/solo-test/masters/master_thorp/manifest.json +25 -10
- package/knowledge/solo-test/masters/master_thorp/provisional-index.json +3 -3
- package/knowledge/solo-test/masters/master_thorp/sources.jsonl +1 -1
- package/knowledge/solo-test/masters/master_thorp/tools.json +56 -30
- package/knowledge/solo-test/persona-v3-solo-test-formulas/compilation-manifest.json +290 -264
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_ackman/components/tools.json +58 -32
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_ackman/provisional-derivations/market_capitalisation.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_ackman/provisional-derivations/owner_earnings_yield.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_aschenbrenner/components/tools.json +58 -32
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_aschenbrenner/provisional-derivations/market_capitalisation.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_aschenbrenner/provisional-derivations/price_implied_cash_yield.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_asness/components/tools.json +58 -32
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_asness/provisional-derivations/nominal_earnings_yield_gap.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_asness/provisional-derivations/real_earnings_yield_gap.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_bogle/components/tools.json +120 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_bogle/provisional-derivations/expected_return_over_long_bond.derived-proxy-evidence.json +77 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_bogle/provisional-derivations/fundamental_expected_return.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_buffett/components/tools.json +57 -31
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_buffett/provisional-derivations/market_capitalisation.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_buffett/provisional-derivations/owner_earnings_yield.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_burry/components/tools.json +58 -32
- 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
- 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
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_cathie_wood/components/tools.json +58 -32
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_cathie_wood/provisional-derivations/current_cash_yield.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_cathie_wood/provisional-derivations/market_capitalisation.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_dalio/components/tools.json +58 -32
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_dalio/provisional-derivations/policy_real_rate.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_dalio/provisional-derivations/real_curve_slope.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_damodaran/components/tools.json +56 -30
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_damodaran/provisional-derivations/implied_equity_risk_premium.derived-proxy-evidence.json +76 -0
- 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
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_druckenmiller/components/tools.json +57 -31
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_druckenmiller/provisional-derivations/liquidity_curve_impulse.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_druckenmiller/provisional-derivations/policy_real_rate.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_duan_yongping/components/tools.json +84 -32
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_duan_yongping/provisional-derivations/five_year_opportunity_cost.derived-proxy-evidence.json +102 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_duan_yongping/provisional-derivations/margin_retention.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_fisher/components/tools.json +60 -34
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_fisher/provisional-derivations/margin_retention.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_fisher/provisional-derivations/reinvestment_spread.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_forensic_short/components/tools.json +55 -29
- 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
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_forensic_short/provisional-derivations/cash_cover_of_leverage.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_graham/components/tools.json +69 -30
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_graham/provisional-derivations/defensive_hurdle_base.derived-proxy-evidence.json +89 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_graham/provisional-derivations/half_normalised_earnings_yield.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_jhunjhunwala/components/tools.json +56 -30
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_jhunjhunwala/provisional-derivations/cash_quality_gap.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_jhunjhunwala/provisional-derivations/real_structural_growth.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_klarman/components/tools.json +57 -31
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_klarman/provisional-derivations/downside_asset_coverage.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_klarman/provisional-derivations/market_capitalisation.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_li_lu/components/tools.json +60 -34
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_li_lu/provisional-derivations/cash_backed_decade_return.derived-proxy-evidence.json +76 -0
- 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
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_lynch/components/tools.json +69 -30
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_lynch/provisional-derivations/growth_justified_capitalisation.derived-proxy-evidence.json +89 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_lynch/provisional-derivations/market_capitalisation.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_marks/components/tools.json +56 -30
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_marks/provisional-derivations/credit_cycle_position.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_marks/provisional-derivations/equity_over_corporate_debt.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_munger/components/tools.json +54 -28
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_munger/provisional-derivations/debt_service_cushion.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_munger/provisional-derivations/reported_earnings_cash_gap.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_natenberg/components/tools.json +52 -26
- 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
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_natenberg/provisional-derivations/round_trip_cost.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_pabrai/components/tools.json +57 -31
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_pabrai/provisional-derivations/downside_floor_coverage.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_pabrai/provisional-derivations/market_capitalisation.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_simons/components/tools.json +45 -32
- 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
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_simons/provisional-derivations/session_move_over_implied.derived-proxy-evidence.json +77 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_sinclair/components/tools.json +56 -30
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_sinclair/provisional-derivations/round_trip_cost.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_sinclair/provisional-derivations/volatility_per_unit_of_width.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_soros/components/tools.json +56 -30
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_soros/provisional-derivations/credit_cycle_position.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_soros/provisional-derivations/financing_burden.derived-proxy-evidence.json +76 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_taleb/components/tools.json +52 -26
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_taleb/provisional-derivations/debt_service_cushion.derived-proxy-evidence.json +76 -0
- 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
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_thorp/components/tools.json +58 -32
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_thorp/provisional-derivations/edge_per_unit_of_volatility.derived-proxy-evidence.json +77 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_thorp/provisional-derivations/net_edge.derived-proxy-evidence.json +76 -0
- package/mcp/lib/breadth.mjs +122 -0
- package/mcp/lib/codex.mjs +3 -3
- package/mcp/lib/constants.mjs +76 -25
- package/mcp/lib/council-options.mjs +95 -40
- package/mcp/lib/council-selection.mjs +95 -9
- package/mcp/lib/damodaran.mjs +119 -0
- package/mcp/lib/fred.mjs +246 -0
- package/mcp/lib/fund-holdings-parsers.mjs +297 -0
- package/mcp/lib/fundamentals.mjs +801 -0
- package/mcp/lib/funds.mjs +750 -0
- package/mcp/lib/gates.mjs +149 -15
- package/mcp/lib/grounding.mjs +188 -36
- package/mcp/lib/index-aggregate.mjs +718 -0
- package/mcp/lib/insider-ownership.mjs +149 -0
- package/mcp/lib/instrument-facts.mjs +557 -0
- package/mcp/lib/instruments.mjs +191 -0
- package/mcp/lib/lang.mjs +109 -2
- package/mcp/lib/markdown.mjs +620 -138
- package/mcp/lib/master-catalog.mjs +32 -3
- package/mcp/lib/orchestrator.mjs +1121 -290
- package/mcp/lib/packets.mjs +227 -21
- package/mcp/lib/personas/engine.mjs +44 -31
- package/mcp/lib/personas-v3/compiler.mjs +2 -0
- package/mcp/lib/personas-v3/deterministic-executor.mjs +13 -2
- package/mcp/lib/personas-v3/ga-external-evidence.mjs +3 -2
- package/mcp/lib/personas-v3/ga-gate.mjs +2 -1
- package/mcp/lib/personas-v3/ga-package-evidence.mjs +5 -4
- package/mcp/lib/personas-v3/grounding-adapter.mjs +309 -2
- package/mcp/lib/personas-v3/loader.mjs +10 -7
- package/mcp/lib/personas-v3/production-root.mjs +5 -4
- package/mcp/lib/personas-v3/release-formula-evidence.mjs +14 -7
- package/mcp/lib/personas-v3/release-source-evidence.mjs +2 -1
- package/mcp/lib/personas-v3/releases.mjs +5 -4
- package/mcp/lib/personas-v3/runtime-release-integrity.mjs +6 -5
- package/mcp/lib/personas-v3/semantic-source-adjudication.mjs +2 -1
- package/mcp/lib/personas-v3/semantic-source-extraction.mjs +2 -1
- package/mcp/lib/personas-v3/semantic-source-skeptic-review.mjs +2 -1
- package/mcp/lib/personas-v3/source-acquisition.mjs +10 -3
- package/mcp/lib/personas-v3/source-review-operations.mjs +3 -2
- package/mcp/lib/personas-v3/staging.mjs +22 -3
- package/mcp/lib/prompts.mjs +119 -2
- package/mcp/lib/quotes.mjs +5 -0
- package/mcp/lib/rpc.mjs +101 -42
- package/mcp/lib/run-store.mjs +28 -3
- package/mcp/lib/sec.mjs +32 -0
- package/mcp/lib/tables.mjs +11 -0
- package/mcp/lib/voice.mjs +122 -0
- package/mcp/lib/xbrl-aggregates.mjs +153 -0
- package/mcp/lib/xbrl-series.mjs +339 -0
- package/mcp/lib/xlsx.mjs +155 -0
- package/package.json +5 -5
- package/personas/masters/masters-value/bogle.md +145 -0
- package/schemas/council-evaluation-protocol-v1.schema.json +2 -2
- package/schemas/persona-v3-ai-assisted-solo-profile-v1.schema.json +2 -2
- package/schemas/persona-v3-ai-machine-simulation-v1.schema.json +1 -1
- package/schemas/persona-v3-build-spec-v1.schema.json +3 -3
- package/schemas/persona-v3-release-formula-review-evidence-v1.schema.json +3 -3
- package/schemas/persona-v3-release-manifest-v1.schema.json +6 -6
- package/schemas/persona-v3-release-source-review-evidence-v1.schema.json +3 -3
- package/schemas/persona-v3-tool-graph-v1.schema.json +1 -1
- package/schemas/persona-v3.schema.json +37 -2
- package/schemas/source-review-batch-v1.schema.json +9 -9
- package/scripts/assemble-persona-v3-release.mjs +3 -2
- package/scripts/build-persona-v3-solo-test-packs.mjs +6 -8
- package/scripts/check-persona-v3-ga.mjs +1 -1
- package/scripts/check-persona-v3-production-candidates.mjs +1 -1
- package/scripts/compile-persona-v3-formulas.mjs +19 -18
- package/scripts/doctor.mjs +11 -9
- package/scripts/export-persona-source-review-batch.mjs +1 -1
- package/scripts/generate-persona-v3-drafts.mjs +2 -2
- package/scripts/lib/build-profile.mjs +24 -0
- package/scripts/lib/council-evaluation-protocol.mjs +7 -6
- package/scripts/lib/host-capabilities.mjs +2 -1
- package/scripts/lib/packaged-host-parity.mjs +63 -8
- package/scripts/lib/persona-v3-ai-assisted-solo-status.mjs +6 -4
- package/scripts/lib/persona-v3-ai-formula-review.mjs +6 -5
- package/scripts/lib/persona-v3-ai-machine-simulations.mjs +32 -4
- package/scripts/lib/persona-v3-build-specs.mjs +3 -2
- package/scripts/lib/persona-v3-draft-packs.mjs +2 -2
- package/scripts/lib/persona-v3-formula-pipeline.mjs +11 -10
- package/scripts/lib/persona-v3-production-candidates.mjs +10 -9
- package/scripts/lib/persona-v3-solo-formula-pipeline.mjs +182 -16
- package/scripts/lib/persona-v3-solo-test-packs.mjs +143 -16
- package/scripts/package-smoke.mjs +32 -12
- package/scripts/report-persona-corpus-gaps.mjs +4 -1
- package/scripts/review-persona-v3-solo-formulas.mjs +12 -8
- package/scripts/run-tests.mjs +23 -2
- package/scripts/scaffold-persona-v3-staging.mjs +1 -1
- package/skills/agent-skills-governance/SKILL.md +8 -2
- package/skills/alphacouncil-agent/SKILL.md +60 -9
- package/skills/public-equity-investing/SKILL.md +17 -0
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_ackman/provisional-derivations/change_value_bridge.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_ackman/provisional-derivations/power_map.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_aschenbrenner/provisional-derivations/compute_power_bridge.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_aschenbrenner/provisional-derivations/timeline_reverse_valuation.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_asness/provisional-derivations/crowding_cost_stress.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_asness/provisional-derivations/factor_decomposer.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_buffett/provisional-derivations/incremental_returns.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_buffett/provisional-derivations/owner_earnings_rebuilder.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_burry/provisional-derivations/capital_structure_reader.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_burry/provisional-derivations/mispricing_carry.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_cathie_wood/provisional-derivations/capture_valuation_bridge.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_cathie_wood/provisional-derivations/cost_adoption_curve.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_dalio/provisional-derivations/debt_driver_stress.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_dalio/provisional-derivations/regime_classifier.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_damodaran/provisional-derivations/story_dcf.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_druckenmiller/provisional-derivations/inflection_payoff.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_druckenmiller/provisional-derivations/liquidity_revision_map.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_duan_yongping/provisional-derivations/opportunity_cost.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_duan_yongping/provisional-derivations/user_value_evidence.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_fisher/provisional-derivations/research_productivity.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_fisher/provisional-derivations/scuttlebutt_graph.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_forensic_short/provisional-derivations/borrow_catalyst.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_graham/provisional-derivations/asset_floor.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_graham/provisional-derivations/normalized_earnings.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_jhunjhunwala/provisional-derivations/penetration_liquidity.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_jhunjhunwala/provisional-derivations/promoter_governance.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_klarman/provisional-derivations/cash_catalyst_compare.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_klarman/provisional-derivations/recovery_waterfall.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_li_lu/provisional-derivations/promise_integrity_ledger.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_li_lu/provisional-derivations/ten_year_return_bridge.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_lynch/provisional-derivations/category_classifier.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_lynch/provisional-derivations/story_numbers_check.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_marks/provisional-derivations/cycle_temperature.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_marks/provisional-derivations/implied_expectations.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_munger/provisional-derivations/failure_path_graph.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_munger/provisional-derivations/incentive_map.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_pabrai/provisional-derivations/discrete_payoff.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_pabrai/provisional-derivations/downside_floor.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_simons/provisional-derivations/leakage_audit.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_simons/provisional-derivations/oos_cost_test.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_sinclair/provisional-derivations/net_edge_sizer.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_sinclair/provisional-derivations/realized_vol_forecast.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_soros/provisional-derivations/reflexivity_graph.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_soros/provisional-derivations/reversal_monitor.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_taleb/provisional-derivations/payoff_ruin.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_thorp/provisional-derivations/edge_recalculator.derived-proxy-evidence.json +0 -64
- package/knowledge/solo-test/persona-v3-solo-test-formulas/master_thorp/provisional-derivations/fractional_kelly.derived-proxy-evidence.json +0 -64
|
@@ -7,12 +7,14 @@
|
|
|
7
7
|
* signature, approval bundle, or method-model claim and cannot satisfy production admission.
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
+
import { PLANNED_TOOL_COUNT } from "../../data/persona-v3-build-specs.v1.mjs";
|
|
10
11
|
import {
|
|
11
12
|
existsSync,
|
|
12
13
|
lstatSync,
|
|
13
14
|
mkdirSync,
|
|
14
15
|
readFileSync,
|
|
15
16
|
readdirSync,
|
|
17
|
+
rmSync,
|
|
16
18
|
realpathSync,
|
|
17
19
|
statSync,
|
|
18
20
|
writeFileSync,
|
|
@@ -21,6 +23,7 @@ import { basename, dirname, isAbsolute, relative, resolve, sep } from "node:path
|
|
|
21
23
|
|
|
22
24
|
import { canonicalValue, sha256 } from "../../mcp/lib/personas-v3/canonical.mjs";
|
|
23
25
|
import {
|
|
26
|
+
ANY_REPORTING_INTERVAL,
|
|
24
27
|
PROVISIONAL_DERIVED_PROXY_ASSURANCE,
|
|
25
28
|
deterministicToolSchemaHashes,
|
|
26
29
|
} from "../../mcp/lib/personas-v3/deterministic-executor.mjs";
|
|
@@ -29,6 +32,7 @@ import {
|
|
|
29
32
|
CANONICAL_MASTER_IDS,
|
|
30
33
|
defaultStagingRoot,
|
|
31
34
|
} from "../../mcp/lib/personas-v3/staging.mjs";
|
|
35
|
+
import { authoredMethods } from "../../data/authored/index.mjs";
|
|
32
36
|
import {
|
|
33
37
|
DEFAULT_FORMULA_CANDIDATE_ROOT,
|
|
34
38
|
FORMULA_AUTHORING_STATUS,
|
|
@@ -52,6 +56,16 @@ export const SOLO_TEST_PROXY_UNIT = "derived_proxy_scalar";
|
|
|
52
56
|
|
|
53
57
|
const INSTANT_AS_OF = Object.freeze({ basis: "instant", window: null, alignment: "as_of" });
|
|
54
58
|
|
|
59
|
+
/**
|
|
60
|
+
* Some facts genuinely cover a span rather than a moment: a five-year cash-flow total is not an
|
|
61
|
+
* observation taken on one day. Declaring those as instants made them unusable -- the executor
|
|
62
|
+
* rejects an instant contract against a fact that carries a reporting interval, so every seat
|
|
63
|
+
* whose method reads company fundamentals failed closed on live grounding.
|
|
64
|
+
*/
|
|
65
|
+
function duration(window) {
|
|
66
|
+
return Object.freeze({ basis: "duration", window, alignment: "as_of" });
|
|
67
|
+
}
|
|
68
|
+
|
|
55
69
|
/**
|
|
56
70
|
* Typed-fact contracts currently emitted by grounding-adapter and safe to bind mechanically.
|
|
57
71
|
* A fact whose physical period differs from this canonical instant snapshot still fails closed.
|
|
@@ -59,16 +73,59 @@ const INSTANT_AS_OF = Object.freeze({ basis: "instant", window: null, alignment:
|
|
|
59
73
|
export const CANONICAL_SOLO_TEST_FACT_CONTRACTS = Object.freeze({
|
|
60
74
|
"market.price": Object.freeze({ value_kind: "monetary", unit: "currency_units", period: INSTANT_AS_OF }),
|
|
61
75
|
"market.change_pct": Object.freeze({ value_kind: "ratio", unit: "decimal", period: INSTANT_AS_OF }),
|
|
62
|
-
"financial.return_on_equity_10y": Object.freeze({ value_kind: "ratio", unit: "decimal", period:
|
|
63
|
-
"financial.free_cash_flow_5y": Object.freeze({ value_kind: "monetary", unit: "currency_units", period:
|
|
64
|
-
"financial.interest_coverage": Object.freeze({ value_kind: "ratio", unit: "multiple", period:
|
|
65
|
-
"financial.gross_margin_5y": Object.freeze({ value_kind: "ratio", unit: "decimal", period:
|
|
66
|
-
"financial.net_margin_5y": Object.freeze({ value_kind: "ratio", unit: "decimal", period:
|
|
67
|
-
"accounting.cash_conversion": Object.freeze({ value_kind: "ratio", unit: "multiple", period:
|
|
76
|
+
"financial.return_on_equity_10y": Object.freeze({ value_kind: "ratio", unit: "decimal", period: duration("P10Y") }),
|
|
77
|
+
"financial.free_cash_flow_5y": Object.freeze({ value_kind: "monetary", unit: "currency_units", period: duration("P5Y") }),
|
|
78
|
+
"financial.interest_coverage": Object.freeze({ value_kind: "ratio", unit: "multiple", period: duration(ANY_REPORTING_INTERVAL) }),
|
|
79
|
+
"financial.gross_margin_5y": Object.freeze({ value_kind: "ratio", unit: "decimal", period: duration("P5Y") }),
|
|
80
|
+
"financial.net_margin_5y": Object.freeze({ value_kind: "ratio", unit: "decimal", period: duration("P5Y") }),
|
|
81
|
+
"accounting.cash_conversion": Object.freeze({ value_kind: "ratio", unit: "multiple", period: duration("P5Y") }),
|
|
68
82
|
"capital_allocation.share_count_change_5y": Object.freeze({ value_kind: "ratio", unit: "decimal", period: INSTANT_AS_OF }),
|
|
69
83
|
"options.implied_volatility": Object.freeze({ value_kind: "ratio", unit: "decimal_annualized_volatility", period: INSTANT_AS_OF }),
|
|
70
84
|
"options.skew_25d": Object.freeze({ value_kind: "ratio", unit: "decimal_volatility_difference", period: INSTANT_AS_OF }),
|
|
71
85
|
"execution.bid_ask": Object.freeze({ value_kind: "ratio", unit: "decimal_of_mid", period: INSTANT_AS_OF }),
|
|
86
|
+
|
|
87
|
+
// Dated official series. These are what let a macro or cycle method have a direction at all,
|
|
88
|
+
// and their units are decimal fractions rather than the percent the sources publish.
|
|
89
|
+
"macro.long_bond_yield": Object.freeze({ value_kind: "ratio", unit: "decimal", period: INSTANT_AS_OF }),
|
|
90
|
+
"macro.short_bond_yield": Object.freeze({ value_kind: "ratio", unit: "decimal", period: INSTANT_AS_OF }),
|
|
91
|
+
"macro.term_structure_slope": Object.freeze({ value_kind: "ratio", unit: "decimal", period: INSTANT_AS_OF }),
|
|
92
|
+
"macro.real_rate": Object.freeze({ value_kind: "ratio", unit: "decimal", period: INSTANT_AS_OF }),
|
|
93
|
+
"macro.breakeven_inflation": Object.freeze({ value_kind: "ratio", unit: "decimal", period: INSTANT_AS_OF }),
|
|
94
|
+
"macro.aaa_corporate_yield": Object.freeze({ value_kind: "ratio", unit: "decimal", period: INSTANT_AS_OF }),
|
|
95
|
+
"macro.credit_spread": Object.freeze({ value_kind: "ratio", unit: "decimal", period: INSTANT_AS_OF }),
|
|
96
|
+
"macro.liquidity_impulse": Object.freeze({ value_kind: "ratio", unit: "decimal", period: duration("P3M") }),
|
|
97
|
+
// macro.growth_regime is deliberately absent. A tool contract accepts only monetary, ratio,
|
|
98
|
+
// count or scalar, so a text-valued fact cannot flow through the computation layer at all.
|
|
99
|
+
// It reaches a policy the other way: a condition compares it with `eq` against a state name.
|
|
100
|
+
|
|
101
|
+
// Company fundamentals derived from filings, beyond the seven the mechanical screen computes.
|
|
102
|
+
"financial.owner_earnings": Object.freeze({ value_kind: "monetary", unit: "currency_units", period: duration("P1Y") }),
|
|
103
|
+
"financial.net_current_asset_value": Object.freeze({ value_kind: "monetary", unit: "currency_units", period: INSTANT_AS_OF }),
|
|
104
|
+
"financial.incremental_return_on_capital": Object.freeze({ value_kind: "ratio", unit: "decimal", period: duration("P5Y") }),
|
|
105
|
+
"financial.leverage": Object.freeze({ value_kind: "ratio", unit: "decimal", period: INSTANT_AS_OF }),
|
|
106
|
+
"valuation.revenue_growth": Object.freeze({ value_kind: "ratio", unit: "decimal", period: duration(ANY_REPORTING_INTERVAL) }),
|
|
107
|
+
"valuation.downside_asset_value": Object.freeze({ value_kind: "monetary", unit: "currency_units", period: INSTANT_AS_OF }),
|
|
108
|
+
"valuation.downside_floor": Object.freeze({ value_kind: "monetary", unit: "currency_units", period: INSTANT_AS_OF }),
|
|
109
|
+
"capital_allocation.share_count": Object.freeze({ value_kind: "count", unit: "shares", period: duration("P1Y") }),
|
|
110
|
+
|
|
111
|
+
// Basket-level facts. Without these an index or fund method has nothing to reason about,
|
|
112
|
+
// which is why every seat abstained on an ETF regardless of how well it was written.
|
|
113
|
+
"index.aggregate_pe_ttm": Object.freeze({ value_kind: "ratio", unit: "multiple", period: INSTANT_AS_OF }),
|
|
114
|
+
"index.aggregate_pe_forward": Object.freeze({ value_kind: "ratio", unit: "multiple", period: INSTANT_AS_OF }),
|
|
115
|
+
"index.aggregate_earnings_yield": Object.freeze({ value_kind: "ratio", unit: "decimal", period: INSTANT_AS_OF }),
|
|
116
|
+
"index.dividend_yield": Object.freeze({ value_kind: "ratio", unit: "decimal", period: INSTANT_AS_OF }),
|
|
117
|
+
"fund.top_ten_weight": Object.freeze({ value_kind: "ratio", unit: "decimal", period: INSTANT_AS_OF }),
|
|
118
|
+
"fund.concentration_hhi": Object.freeze({ value_kind: "ratio", unit: "decimal", period: INSTANT_AS_OF }),
|
|
119
|
+
"valuation.implied_erp": Object.freeze({ value_kind: "ratio", unit: "decimal", period: INSTANT_AS_OF }),
|
|
120
|
+
"cycle.valuation_percentile": Object.freeze({ value_kind: "ratio", unit: "decimal", period: INSTANT_AS_OF }),
|
|
121
|
+
"index.breadth_above_200dma": Object.freeze({ value_kind: "ratio", unit: "decimal", period: INSTANT_AS_OF }),
|
|
122
|
+
"index.breadth_counted_above_200dma": Object.freeze({ value_kind: "ratio", unit: "decimal", period: INSTANT_AS_OF }),
|
|
123
|
+
"fund.aum": Object.freeze({ value_kind: "monetary", unit: "currency_units", period: INSTANT_AS_OF }),
|
|
124
|
+
"fund.expense_ratio": Object.freeze({ value_kind: "ratio", unit: "decimal", period: INSTANT_AS_OF }),
|
|
125
|
+
|
|
126
|
+
// The US has no promoter shareholding record. Section 16 ownership is the filed analogue,
|
|
127
|
+
// and it is what lets a governance-first method reach a number on this universe at all.
|
|
128
|
+
"governance.insider_ownership": Object.freeze({ value_kind: "ratio", unit: "decimal", period: INSTANT_AS_OF }),
|
|
72
129
|
});
|
|
73
130
|
|
|
74
131
|
const ID = /^[a-z][a-z0-9_.:-]{1,159}$/u;
|
|
@@ -153,6 +210,74 @@ function exactPendingCandidate(entry, candidateRoot) {
|
|
|
153
210
|
return spec;
|
|
154
211
|
}
|
|
155
212
|
|
|
213
|
+
/**
|
|
214
|
+
* The formula a seat's method actually needs, when one has been authored for it.
|
|
215
|
+
*
|
|
216
|
+
* Everything else in this module derives an identity proxy, which is executable and
|
|
217
|
+
* deliberately meaningless: it exists so the pipeline can be exercised before any method has
|
|
218
|
+
* been written. An authored formula replaces that with the seat's real arithmetic, still
|
|
219
|
+
* unreviewed and still barred from production, but no longer a placeholder pretending to be a
|
|
220
|
+
* computation. Both paths are validated identically downstream.
|
|
221
|
+
*/
|
|
222
|
+
function authoredFormula(spec, authored) {
|
|
223
|
+
const tool = (authored?.tools || []).find((candidate) => candidate.tool_id === spec.tool_id);
|
|
224
|
+
if (!tool) return null;
|
|
225
|
+
// The per-tool candidate lists are a generated projection of the authored tools themselves,
|
|
226
|
+
// so checking one against the other proves nothing. What still has to hold is that every
|
|
227
|
+
// input names a real fact and the output is the one the spec was regenerated to expect --
|
|
228
|
+
// the meaningful contract check happens downstream, where the policy validator rejects any
|
|
229
|
+
// condition reading a fact the seat did not declare.
|
|
230
|
+
for (const operand of tool.inputs || []) {
|
|
231
|
+
if (operand?.fact_id && !ID.test(operand.fact_id)) {
|
|
232
|
+
fail(`${spec.tool_id}: authored input ${JSON.stringify(operand.fact_id)} is not a valid fact id`);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
if (!ID.test(tool.output_id || "")) {
|
|
236
|
+
fail(`${spec.tool_id}: authored output ${JSON.stringify(tool.output_id)} is not a valid output id`);
|
|
237
|
+
}
|
|
238
|
+
const contractFor = (operand) => {
|
|
239
|
+
if (operand?.literal !== undefined) {
|
|
240
|
+
return { value_kind: "scalar", unit: SOLO_TEST_PROXY_UNIT, period: INSTANT_AS_OF };
|
|
241
|
+
}
|
|
242
|
+
if (operand?.fact_id) {
|
|
243
|
+
return CANONICAL_SOLO_TEST_FACT_CONTRACTS[operand.fact_id]
|
|
244
|
+
|| { value_kind: "scalar", unit: SOLO_TEST_PROXY_UNIT, period: INSTANT_AS_OF };
|
|
245
|
+
}
|
|
246
|
+
// An output operand carries the PRODUCING tool's contract, not the consuming one's. The
|
|
247
|
+
// executor compares against what the producer declared, so reading the consumer's kind
|
|
248
|
+
// breaks every tool that divides a monetary numerator by a monetary denominator to make
|
|
249
|
+
// a ratio -- which is most of what a valuation method does.
|
|
250
|
+
if (operand?.output_id) {
|
|
251
|
+
const producer = (authored?.tools || []).find((candidate) => candidate.output_id === operand.output_id);
|
|
252
|
+
if (producer) return { value_kind: producer.value_kind, unit: producer.unit, period: INSTANT_AS_OF };
|
|
253
|
+
return { value_kind: "scalar", unit: SOLO_TEST_PROXY_UNIT, period: INSTANT_AS_OF };
|
|
254
|
+
}
|
|
255
|
+
return { value_kind: tool.value_kind, unit: tool.unit, period: INSTANT_AS_OF };
|
|
256
|
+
};
|
|
257
|
+
return canonicalValue({
|
|
258
|
+
version: "0.2.0",
|
|
259
|
+
kind: "recomputation",
|
|
260
|
+
operation: tool.operation,
|
|
261
|
+
on_missing: "fail",
|
|
262
|
+
inputs: (tool.inputs || []).map((operand) => {
|
|
263
|
+
const contract = contractFor(operand);
|
|
264
|
+
return {
|
|
265
|
+
operand,
|
|
266
|
+
value_kind: contract.value_kind,
|
|
267
|
+
unit: contract.unit,
|
|
268
|
+
period: contract.period,
|
|
269
|
+
on_missing: "fail",
|
|
270
|
+
};
|
|
271
|
+
}),
|
|
272
|
+
output: {
|
|
273
|
+
output_id: tool.output_id,
|
|
274
|
+
value_kind: tool.value_kind,
|
|
275
|
+
unit: tool.unit,
|
|
276
|
+
period: INSTANT_AS_OF,
|
|
277
|
+
},
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
|
|
156
281
|
function proxyFormula(spec) {
|
|
157
282
|
const inputFactId = spec.authorship_request.candidate_input_fact_types[0];
|
|
158
283
|
const outputId = spec.authorship_request.candidate_output_fact_types[0];
|
|
@@ -186,11 +311,12 @@ function proxyFormula(spec) {
|
|
|
186
311
|
}
|
|
187
312
|
|
|
188
313
|
/** Create one explicitly non-reviewed derived proxy and its immutable local-test evidence. */
|
|
189
|
-
export function deriveSoloTestFormula(entry, physicalCandidate) {
|
|
314
|
+
export function deriveSoloTestFormula(entry, physicalCandidate, authored = null) {
|
|
190
315
|
if (physicalCandidate.formula_spec_id !== entry.formula_spec.formula_spec_id) {
|
|
191
316
|
fail(`${entry.tool_id}: physical candidate identity does not match the current queue`);
|
|
192
317
|
}
|
|
193
|
-
const
|
|
318
|
+
const written = authoredFormula(physicalCandidate, authored);
|
|
319
|
+
const formula = written || proxyFormula(physicalCandidate);
|
|
194
320
|
const derivationSpec = canonicalValue({
|
|
195
321
|
schema_version: 1,
|
|
196
322
|
artifact_kind: "persona_v3_provisional_formula_derivation_spec",
|
|
@@ -201,7 +327,9 @@ export function deriveSoloTestFormula(entry, physicalCandidate) {
|
|
|
201
327
|
prototype_id: entry.prototype_id,
|
|
202
328
|
prototype_content_hash: entry.source_prototype.content_hash,
|
|
203
329
|
authoring_candidate_hash: sha256(physicalCandidate),
|
|
204
|
-
derivation_policy:
|
|
330
|
+
derivation_policy: written
|
|
331
|
+
? "ai_authored_method_formula_v1"
|
|
332
|
+
: "first_declared_input_to_first_declared_output_identity_v1",
|
|
205
333
|
input_contract_source: CANONICAL_SOLO_TEST_FACT_CONTRACTS[formula.inputs[0].operand.fact_id]
|
|
206
334
|
? "grounding_adapter_canonical_contract_v1"
|
|
207
335
|
: "unknown_fact_fail_closed_proxy_scalar_v1",
|
|
@@ -222,8 +350,15 @@ export function deriveSoloTestFormula(entry, physicalCandidate) {
|
|
|
222
350
|
derivation_spec: derivationSpec,
|
|
223
351
|
derivation_spec_hash: derivationSpecHash,
|
|
224
352
|
limitations: [
|
|
225
|
-
|
|
226
|
-
|
|
353
|
+
...(written
|
|
354
|
+
? [
|
|
355
|
+
"ai_authored_candidate_formula_not_human_reviewed",
|
|
356
|
+
"thresholds_are_derived_from_published_method_writing_not_adjudicated",
|
|
357
|
+
]
|
|
358
|
+
: [
|
|
359
|
+
"mechanical_identity_proxy_not_the_named_investor_method",
|
|
360
|
+
"first_declared_input_and_output_are_test_contract_choices_not_human_adjudication",
|
|
361
|
+
]),
|
|
227
362
|
...(derivationSpec.input_contract_source === "unknown_fact_fail_closed_proxy_scalar_v1"
|
|
228
363
|
? ["unknown_fact_proxy_scalar_unit_requires_a_local_test_adapter"]
|
|
229
364
|
: []),
|
|
@@ -280,7 +415,7 @@ export function planSoloTestFormulaCompilation({
|
|
|
280
415
|
)).sort();
|
|
281
416
|
const actualSpecFiles = collectFiles(resolve(candidate, "specs"));
|
|
282
417
|
if (JSON.stringify(actualSpecFiles) !== JSON.stringify(expectedSpecFiles)) {
|
|
283
|
-
fail("solo formula compilation requires exactly the
|
|
418
|
+
fail("solo formula compilation requires exactly the planned pending spec files, one per tool", {
|
|
284
419
|
expected: expectedSpecFiles,
|
|
285
420
|
actual: actualSpecFiles,
|
|
286
421
|
});
|
|
@@ -294,14 +429,21 @@ export function planSoloTestFormulaCompilation({
|
|
|
294
429
|
|
|
295
430
|
const records = authoring.inventory.entries.map((entry) => {
|
|
296
431
|
const spec = exactPendingCandidate(entry, candidate);
|
|
297
|
-
const derived = deriveSoloTestFormula(entry, spec);
|
|
432
|
+
const derived = deriveSoloTestFormula(entry, spec, authoredMethods[entry.persona_id] || null);
|
|
298
433
|
return { entry, ...derived };
|
|
299
434
|
});
|
|
300
435
|
const tools = records.map((record) => record.tool);
|
|
301
436
|
const ids = tools.map((tool) => tool.id);
|
|
302
437
|
const outputs = tools.map((tool) => tool.output_id);
|
|
303
|
-
|
|
304
|
-
|
|
438
|
+
// Derived from the authoring inventory rather than hardcoded, so a seat may declare a third
|
|
439
|
+
// tool without the guard reading it as drift. The property that matters is unchanged: one
|
|
440
|
+
// tool per planned entry, no id or output silently collapsing into another.
|
|
441
|
+
const expectedToolCount = authoring.inventory.entries.length;
|
|
442
|
+
if (tools.length !== expectedToolCount
|
|
443
|
+
|| new Set(ids).size !== expectedToolCount
|
|
444
|
+
|| new Set(outputs).size !== expectedToolCount) {
|
|
445
|
+
fail("solo formula compilation must produce one unique tool and output per planned entry", {
|
|
446
|
+
expected: expectedToolCount,
|
|
305
447
|
tool_count: tools.length,
|
|
306
448
|
unique_tool_count: new Set(ids).size,
|
|
307
449
|
unique_output_count: new Set(outputs).size,
|
|
@@ -329,7 +471,7 @@ export function planSoloTestFormulaCompilation({
|
|
|
329
471
|
production_eligible: false,
|
|
330
472
|
method_model_eligible: false,
|
|
331
473
|
canonical_seat_count: CANONICAL_MASTER_COUNT,
|
|
332
|
-
planned_tool_count:
|
|
474
|
+
planned_tool_count: PLANNED_TOOL_COUNT,
|
|
333
475
|
compiled_tool_count: tools.length,
|
|
334
476
|
provisional_derivation_count: records.length,
|
|
335
477
|
formula_approval_binding_count: 0,
|
|
@@ -361,6 +503,25 @@ function writeStable(file, content, result) {
|
|
|
361
503
|
result.written.push(file);
|
|
362
504
|
}
|
|
363
505
|
|
|
506
|
+
/** Delete every regular file under `root` the compilation did not just account for. */
|
|
507
|
+
function pruneToWritten(root, keep) {
|
|
508
|
+
const removed = [];
|
|
509
|
+
const walk = (dir) => {
|
|
510
|
+
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
511
|
+
const path = resolve(dir, entry.name);
|
|
512
|
+
if (entry.isSymbolicLink()) fail(`unsafe solo formula entry: ${path}`);
|
|
513
|
+
if (entry.isDirectory()) {
|
|
514
|
+
walk(path);
|
|
515
|
+
if (!readdirSync(path).length) { rmSync(path, { recursive: false }); removed.push(path); }
|
|
516
|
+
continue;
|
|
517
|
+
}
|
|
518
|
+
if (!keep.has(path)) { rmSync(path); removed.push(path); }
|
|
519
|
+
}
|
|
520
|
+
};
|
|
521
|
+
walk(root);
|
|
522
|
+
return removed;
|
|
523
|
+
}
|
|
524
|
+
|
|
364
525
|
function evidenceLeaf(personaId, toolId) {
|
|
365
526
|
const prefix = `${personaId}.`;
|
|
366
527
|
if (!toolId.startsWith(prefix)) fail(`tool id is not prefixed by ${personaId}`);
|
|
@@ -414,6 +575,11 @@ export function writeSoloTestFormulaCompilation({
|
|
|
414
575
|
bindings: plan.bindings,
|
|
415
576
|
});
|
|
416
577
|
writeStable(resolve(root, "compilation-manifest.json"), `${JSON.stringify(manifest, null, 2)}\n`, result);
|
|
578
|
+
// A tool that is renamed leaves its old evidence file behind, and the downstream review binds
|
|
579
|
+
// the tree by exact file list -- so debris from a previous compilation reads as tampering
|
|
580
|
+
// rather than as staleness. The compilation owns this tree entirely; anything it did not just
|
|
581
|
+
// write does not belong in it.
|
|
582
|
+
result.removed = pruneToWritten(root, new Set([...result.written, ...result.unchanged]));
|
|
417
583
|
return Object.freeze(canonicalValue({
|
|
418
584
|
...manifest,
|
|
419
585
|
mode: "write_isolated_solo_test_compilation",
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Deterministic builder for the packaged
|
|
2
|
+
* Deterministic builder for the packaged solo-test PersonaPack v3 tree.
|
|
3
3
|
*
|
|
4
4
|
* This is intentionally a separate assurance channel. It consumes only the isolated
|
|
5
5
|
* provisional formula tree, writes manifests with build_profile=solo_test, uses pending
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
* loader rejects every output. Normal admission therefore remains operator_lens.
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
+
import { PLANNED_TOOL_COUNT } from "../../data/persona-v3-build-specs.v1.mjs";
|
|
10
11
|
import {
|
|
11
12
|
existsSync,
|
|
12
13
|
lstatSync,
|
|
@@ -21,6 +22,12 @@ import { fileURLToPath } from "node:url";
|
|
|
21
22
|
import { basename, dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
22
23
|
|
|
23
24
|
import buildInventory from "../../data/persona-v3-build-specs.v1.mjs";
|
|
25
|
+
import { authoredMethods } from "../../data/authored/index.mjs";
|
|
26
|
+
import {
|
|
27
|
+
selectorBestForLocale,
|
|
28
|
+
selectorMethodLocale,
|
|
29
|
+
} from "../../data/master-selector-method-locales.v1.mjs";
|
|
30
|
+
import { selectorCard } from "../../mcp/lib/master-catalog.mjs";
|
|
24
31
|
import { inspectPersonaAdmission } from "../../mcp/lib/personas-v3/admission.mjs";
|
|
25
32
|
import {
|
|
26
33
|
canonicalValue,
|
|
@@ -156,7 +163,7 @@ function loadFormulaTree(formulaRoot) {
|
|
|
156
163
|
const errors = [];
|
|
157
164
|
if (manifest.schema_version !== 1) errors.push("schema_version must be 1");
|
|
158
165
|
if (manifest.artifact_kind !== "persona_v3_solo_test_formula_staging_tree") errors.push("artifact_kind is invalid");
|
|
159
|
-
if (manifest.canonical_seat_count !==
|
|
166
|
+
if (manifest.canonical_seat_count !== CANONICAL_MASTER_COUNT || manifest.compiled_tool_count !== PLANNED_TOOL_COUNT) errors.push(`manifest must bind exactly ${CANONICAL_MASTER_COUNT} seats and ${PLANNED_TOOL_COUNT} tools`);
|
|
160
167
|
if (manifest.assurance_class !== SOLO_TEST_ASSURANCE_CLASS) errors.push("assurance_class must be provisional_derived_proxy");
|
|
161
168
|
if (manifest.review_status !== "not_human_reviewed") errors.push("review_status must be not_human_reviewed");
|
|
162
169
|
if (manifest.production_eligible !== false || manifest.method_model_eligible !== false) errors.push("formula tree must be production/method-model ineligible");
|
|
@@ -188,7 +195,7 @@ function loadFormulaTree(formulaRoot) {
|
|
|
188
195
|
if (JSON.stringify(actualSeatEntries) !== JSON.stringify([...CANONICAL_MASTER_IDS].sort())) {
|
|
189
196
|
fail("formula tree contains missing or unexpected top-level entries", { actual: actualSeatEntries });
|
|
190
197
|
}
|
|
191
|
-
if (total !==
|
|
198
|
+
if (total !== PLANNED_TOOL_COUNT) fail(`formula tree compiled ${total} tools instead of ${PLANNED_TOOL_COUNT}`);
|
|
192
199
|
return { root, manifest, byPersona };
|
|
193
200
|
}
|
|
194
201
|
|
|
@@ -291,6 +298,103 @@ function bindProxySource(tools, sourceId) {
|
|
|
291
298
|
});
|
|
292
299
|
}
|
|
293
300
|
|
|
301
|
+
/**
|
|
302
|
+
* A seat's real decision logic, when it has been authored.
|
|
303
|
+
*
|
|
304
|
+
* The generated fallback below scores every tool output against zero, which is executable and
|
|
305
|
+
* says nothing: it exists so the pipeline runs before a method is written. An authored policy
|
|
306
|
+
* replaces it with the seat's own judgement -- what it needs before it will speak at all
|
|
307
|
+
* (eligibility), what disqualifies a candidate outright (hard vetoes), and what it actually
|
|
308
|
+
* measures (scoring).
|
|
309
|
+
*
|
|
310
|
+
* The distinction between eligibility and scoring matters more than it looks. `min_coverage`
|
|
311
|
+
* is 1, so ONE uncomputable scoring rule collapses the whole seat to out_of_scope. That is
|
|
312
|
+
* precisely why twenty-five seats abstained on every symbol. A "can this method speak at all"
|
|
313
|
+
* test therefore belongs in eligibility, which has its own exit and its own explanation.
|
|
314
|
+
*/
|
|
315
|
+
function authoredDecisionPolicy(seat, tools, authored) {
|
|
316
|
+
if (!authored?.scoring?.length || !authored?.bands?.length) return null;
|
|
317
|
+
const declaredStates = new Set(seat.native_decision_contract.states.map(executableNativeState));
|
|
318
|
+
const state = (value) => {
|
|
319
|
+
const resolved = executableNativeState(value);
|
|
320
|
+
if (!declaredStates.has(resolved)) {
|
|
321
|
+
fail(`${seat.persona_id}: authored policy uses undeclared native state ${JSON.stringify(value)}`, {
|
|
322
|
+
declared: [...declaredStates],
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
return resolved;
|
|
326
|
+
};
|
|
327
|
+
const outOfScopeHypothesis = seat.native_decision_contract.states
|
|
328
|
+
.find((candidate) => stanceForState(candidate) === "out_of_scope") || seat.native_decision_contract.states[0];
|
|
329
|
+
const outOfScope = executableNativeState(outOfScopeHypothesis);
|
|
330
|
+
const maxScore = authored.scoring.reduce((sum, rule) => sum + (rule.points || 0), 0);
|
|
331
|
+
return canonicalValue({
|
|
332
|
+
schema_version: 1,
|
|
333
|
+
dsl_version: "1.1",
|
|
334
|
+
native_decision_schema: seat.native_decision_contract.schema_id,
|
|
335
|
+
native_states: seat.native_decision_contract.states.map(executableNativeState),
|
|
336
|
+
abstention_policy: "fail_closed",
|
|
337
|
+
fact_gate: { on_missing_critical: { native_state: outOfScope, common_stance: "out_of_scope" } },
|
|
338
|
+
// Authoring supplies the judgement; the build supplies identity. Source ids are minted
|
|
339
|
+
// here because the loader rejects a source id that is not in the pack, and native states
|
|
340
|
+
// are mapped here because the authored form uses the raw name a build spec declares.
|
|
341
|
+
eligibility: {
|
|
342
|
+
all: (authored.eligibility?.all || []).map((entry) => ({
|
|
343
|
+
condition_id: entry.condition_id,
|
|
344
|
+
condition: entry.condition,
|
|
345
|
+
on_false: {
|
|
346
|
+
native_state: state(entry.on_false.native_state),
|
|
347
|
+
common_stance: entry.on_false.common_stance,
|
|
348
|
+
},
|
|
349
|
+
on_uncomputable: {
|
|
350
|
+
native_state: state((entry.on_uncomputable || entry.on_false).native_state),
|
|
351
|
+
common_stance: (entry.on_uncomputable || entry.on_false).common_stance,
|
|
352
|
+
},
|
|
353
|
+
source_ids: [authored.source_id],
|
|
354
|
+
})),
|
|
355
|
+
},
|
|
356
|
+
hard_vetoes: (authored.hard_vetoes || []).map((veto) => ({
|
|
357
|
+
veto_id: veto.veto_id,
|
|
358
|
+
condition: veto.condition,
|
|
359
|
+
on_trigger: {
|
|
360
|
+
native_state: state(veto.on_trigger.native_state),
|
|
361
|
+
common_stance: veto.on_trigger.common_stance,
|
|
362
|
+
},
|
|
363
|
+
// A veto whose condition cannot be evaluated must not read as "not triggered". An
|
|
364
|
+
// unmeasurable disqualifier is a reason to abstain, not a reason to proceed.
|
|
365
|
+
on_uncomputable: {
|
|
366
|
+
action: "abstain",
|
|
367
|
+
decision: {
|
|
368
|
+
native_state: state(veto.on_uncomputable?.native_state || outOfScopeHypothesis),
|
|
369
|
+
common_stance: veto.on_uncomputable?.common_stance || "out_of_scope",
|
|
370
|
+
},
|
|
371
|
+
},
|
|
372
|
+
source_ids: [authored.source_id],
|
|
373
|
+
})),
|
|
374
|
+
scoring: {
|
|
375
|
+
max_score: maxScore,
|
|
376
|
+
min_coverage: 1,
|
|
377
|
+
on_insufficient_coverage: { native_state: outOfScope, common_stance: "out_of_scope" },
|
|
378
|
+
rules: authored.scoring.map((rule) => ({
|
|
379
|
+
rule_id: rule.rule_id,
|
|
380
|
+
condition: rule.condition,
|
|
381
|
+
points: rule.points,
|
|
382
|
+
coverage_weight: rule.coverage_weight ?? 1,
|
|
383
|
+
source_ids: [authored.source_id],
|
|
384
|
+
})),
|
|
385
|
+
},
|
|
386
|
+
score_bands: authored.bands.map((band) => ({
|
|
387
|
+
min_ratio: band.min_ratio,
|
|
388
|
+
decision: { native_state: state(band.native_state), common_stance: band.common_stance },
|
|
389
|
+
})),
|
|
390
|
+
native_output_fields: tools.map((tool, index) => ({
|
|
391
|
+
field: `metric_${index + 1}`,
|
|
392
|
+
value: { output_id: tool.output_id },
|
|
393
|
+
on_missing: "fail",
|
|
394
|
+
})),
|
|
395
|
+
});
|
|
396
|
+
}
|
|
397
|
+
|
|
294
398
|
function buildDecisionPolicy(seat, tools, sourceId) {
|
|
295
399
|
const stateHypotheses = seat.native_decision_contract.states;
|
|
296
400
|
const states = stateHypotheses.map(executableNativeState);
|
|
@@ -368,7 +472,9 @@ function buildDocuments({ seat, blueprint, rawTools, packVersion, formulaManifes
|
|
|
368
472
|
const required = referencedFacts;
|
|
369
473
|
const optional = seat.required_fact_types.filter((fact) => !required.includes(fact));
|
|
370
474
|
if (!required.length) fail(`${seat.persona_id}: formula tools have no physical fact inputs`);
|
|
371
|
-
const
|
|
475
|
+
const authored = authoredMethods[seat.persona_id] || null;
|
|
476
|
+
const policy = authoredDecisionPolicy(seat, tools, authored ? { ...authored, source_id: source.source_id } : null)
|
|
477
|
+
|| buildDecisionPolicy(seat, tools, source.source_id);
|
|
372
478
|
const policyErrors = validateDeterministicPolicyArtifacts({
|
|
373
479
|
policy,
|
|
374
480
|
tools,
|
|
@@ -381,14 +487,26 @@ function buildDocuments({ seat, blueprint, rawTools, packVersion, formulaManifes
|
|
|
381
487
|
if (policyErrors.length) fail(`${seat.persona_id}: generated deterministic policy is invalid`, { errors: policyErrors });
|
|
382
488
|
|
|
383
489
|
const publicTitle = blueprint.canonical_title;
|
|
490
|
+
const selectorPersona = { id: seat.persona_id, title: publicTitle };
|
|
491
|
+
const chineseMethod = selectorCard(selectorPersona, "zh-CN").method;
|
|
384
492
|
const manifest = canonicalValue({
|
|
385
493
|
schema_version: 3,
|
|
386
494
|
build_profile: "solo_test",
|
|
387
495
|
pack_version: packVersion,
|
|
388
496
|
identity: {
|
|
389
497
|
persona_id: seat.persona_id,
|
|
390
|
-
public_label: {
|
|
391
|
-
|
|
498
|
+
public_label: {
|
|
499
|
+
en: `${publicTitle.en} Solo Test`,
|
|
500
|
+
zh: `${publicTitle.zh}单人测试`,
|
|
501
|
+
ja: `${publicTitle.en} 単独テスト`,
|
|
502
|
+
ko: `${publicTitle.en} 단독 테스트`,
|
|
503
|
+
},
|
|
504
|
+
operator_label: {
|
|
505
|
+
en: `${publicTitle.en} Provisional Operator Lens`,
|
|
506
|
+
zh: `${publicTitle.zh}临时操作视角`,
|
|
507
|
+
ja: `${publicTitle.en} 暫定オペレーター・レンズ`,
|
|
508
|
+
ko: `${publicTitle.en} 임시 오퍼레이터 렌즈`,
|
|
509
|
+
},
|
|
392
510
|
maturity: "operator_lens",
|
|
393
511
|
source_cutoff: SOURCE_DATE,
|
|
394
512
|
},
|
|
@@ -396,11 +514,20 @@ function buildDocuments({ seat, blueprint, rawTools, packVersion, formulaManifes
|
|
|
396
514
|
identity: {
|
|
397
515
|
en: `${publicTitle.en}; project-derived and not human reviewed`,
|
|
398
516
|
zh: `${publicTitle.zh};项目派生、未经人工审定`,
|
|
517
|
+
ja: `${publicTitle.en}。プロジェクト派生で、方法帰属について人による審査を受けていない暫定オペレーター・レンズ。本人の発言や現在の見解ではない。`,
|
|
518
|
+
ko: `${publicTitle.en}. 프로젝트에서 파생되었고 방법 귀속에 대한 인적 심사를 거치지 않은 임시 오퍼레이터 렌즈다. 본인의 발언이나 현재 견해가 아니다.`,
|
|
519
|
+
},
|
|
520
|
+
method: {
|
|
521
|
+
en: seat.method_scope.planning_hypothesis,
|
|
522
|
+
zh: chineseMethod,
|
|
523
|
+
ja: selectorMethodLocale(seat.persona_id, "ja"),
|
|
524
|
+
ko: selectorMethodLocale(seat.persona_id, "ko"),
|
|
399
525
|
},
|
|
400
|
-
method: { en: seat.method_scope.planning_hypothesis, zh: seat.method_scope.planning_hypothesis },
|
|
401
526
|
best_for: {
|
|
402
|
-
en:
|
|
403
|
-
zh:
|
|
527
|
+
en: selectorBestForLocale(seat.persona_id, "en"),
|
|
528
|
+
zh: selectorBestForLocale(seat.persona_id, "zh"),
|
|
529
|
+
ja: selectorBestForLocale(seat.persona_id, "ja"),
|
|
530
|
+
ko: selectorBestForLocale(seat.persona_id, "ko"),
|
|
404
531
|
},
|
|
405
532
|
},
|
|
406
533
|
capability: {
|
|
@@ -499,7 +626,7 @@ function generationContext({ root = DEFAULT_SOLO_TEST_PACK_ROOT, formulaRoot = D
|
|
|
499
626
|
const blueprints = canonicalMasterBlueprints({ personaDir });
|
|
500
627
|
const byBlueprint = new Map(blueprints.map((blueprint) => [blueprint.persona_id, blueprint]));
|
|
501
628
|
const bySeat = new Map(buildInventory.seats.map((seat) => [seat.persona_id, seat]));
|
|
502
|
-
if (bySeat.size !==
|
|
629
|
+
if (bySeat.size !== CANONICAL_MASTER_COUNT || byBlueprint.size !== CANONICAL_MASTER_COUNT) fail(`canonical solo-test inventory must contain exactly ${CANONICAL_MASTER_COUNT} unique seats`);
|
|
503
630
|
const output = resolve(root);
|
|
504
631
|
if (basename(output) !== "masters" || basename(dirname(output)) !== "solo-test") {
|
|
505
632
|
fail("solo-test pack root must end in knowledge/solo-test/masters (or an equivalent isolated solo-test/masters path)");
|
|
@@ -661,12 +788,12 @@ export function renderPersonaV3SoloTestPackReport(report) {
|
|
|
661
788
|
"",
|
|
662
789
|
"> These are packaged provisional operator lenses. They are not approved method models and the production loader rejects them.",
|
|
663
790
|
"",
|
|
664
|
-
`Physical packs: ${report.summary.physical_pack_count}
|
|
665
|
-
`Solo loader valid: ${report.summary.solo_loader_valid_count}
|
|
666
|
-
`Compiled: ${report.summary.compiler_valid_count}
|
|
667
|
-
`Provisional operator lenses: ${report.summary.provisional_operator_lens_count}
|
|
668
|
-
`Production loader rejected: ${report.summary.production_loader_rejection_count}
|
|
669
|
-
`Tools: ${report.summary.tool_count}
|
|
791
|
+
`Physical packs: ${report.summary.physical_pack_count}/${CANONICAL_MASTER_COUNT}`,
|
|
792
|
+
`Solo loader valid: ${report.summary.solo_loader_valid_count}/${CANONICAL_MASTER_COUNT}`,
|
|
793
|
+
`Compiled: ${report.summary.compiler_valid_count}/${CANONICAL_MASTER_COUNT}`,
|
|
794
|
+
`Provisional operator lenses: ${report.summary.provisional_operator_lens_count}/${CANONICAL_MASTER_COUNT}`,
|
|
795
|
+
`Production loader rejected: ${report.summary.production_loader_rejection_count}/${CANONICAL_MASTER_COUNT}`,
|
|
796
|
+
`Tools: ${report.summary.tool_count}/${PLANNED_TOOL_COUNT}`,
|
|
670
797
|
`Operational/method_model: ${report.summary.operational_count}/0`,
|
|
671
798
|
`Ready for solo testing: ${report.summary.ready_for_solo_testing}`,
|
|
672
799
|
`Readiness hash: \`${report.readiness_hash}\``,
|
|
@@ -8,6 +8,7 @@ import { mkdtempSync, rmSync } from "node:fs";
|
|
|
8
8
|
import { tmpdir } from "node:os";
|
|
9
9
|
import { join, resolve } from "node:path";
|
|
10
10
|
import { fileURLToPath } from "node:url";
|
|
11
|
+
import { CANONICAL_MASTER_COUNT } from "../mcp/lib/personas-v3/staging.mjs";
|
|
11
12
|
|
|
12
13
|
const root = fileURLToPath(new URL("..", import.meta.url));
|
|
13
14
|
const serverEntry = join(root, "mcp", "server.mjs");
|
|
@@ -107,19 +108,38 @@ export async function runPackageSmoke() {
|
|
|
107
108
|
|
|
108
109
|
const listed = await server.request("tools/list", {});
|
|
109
110
|
const tools = listed.result?.tools || [];
|
|
111
|
+
assert.equal(tools.length, 31, "installed server must expose exactly 31 MCP tools");
|
|
110
112
|
const names = new Set(tools.map((tool) => tool.name));
|
|
111
113
|
for (const required of ["begin_council_selection", "confirm_master_selection", "plan_visible_run", "analyze_symbol"]) {
|
|
112
114
|
assert.ok(names.has(required), `installed server is missing ${required}`);
|
|
113
115
|
}
|
|
114
116
|
|
|
115
|
-
const
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
language: "
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
117
|
+
const localeCases = [
|
|
118
|
+
{ language: "en-US", prompt: "bounded installed-package smoke", script: /[A-Za-z]/u },
|
|
119
|
+
{ language: "zh-CN", prompt: "安装包有界烟雾测试", script: /\p{Script=Han}/u },
|
|
120
|
+
{ language: "ja-JP", prompt: "インストール済みパッケージの有界スモークテスト", script: /[\p{Script=Hiragana}\p{Script=Katakana}]/u },
|
|
121
|
+
{ language: "ko-KR", prompt: "설치 패키지의 제한된 스모크 테스트", script: /\p{Script=Hangul}/u },
|
|
122
|
+
];
|
|
123
|
+
let opened;
|
|
124
|
+
let prompt;
|
|
125
|
+
for (const locale of localeCases) {
|
|
126
|
+
const catalog = structured(await server.callTool("begin_council_selection", {
|
|
127
|
+
symbol: "AAPL",
|
|
128
|
+
language: locale.language,
|
|
129
|
+
host: "package-smoke",
|
|
130
|
+
prompt: locale.prompt,
|
|
131
|
+
}));
|
|
132
|
+
assert.equal(catalog.masters.length, CANONICAL_MASTER_COUNT, `${locale.language} installed catalog must contain exactly ${CANONICAL_MASTER_COUNT} seats`);
|
|
133
|
+
for (const master of catalog.masters) {
|
|
134
|
+
for (const field of ["identity", "method", "best_for", "maturity_label"]) {
|
|
135
|
+
assert.match(master[field], locale.script, `${locale.language} ${master.id}.${field}`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
if (locale.language === "zh-CN") {
|
|
139
|
+
opened = catalog;
|
|
140
|
+
prompt = locale.prompt;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
123
143
|
|
|
124
144
|
const confirmed = structured(await server.callTool("confirm_master_selection", {
|
|
125
145
|
selection_id: opened.selection_id,
|
|
@@ -132,7 +152,7 @@ export async function runPackageSmoke() {
|
|
|
132
152
|
const runId = `PACKAGE-SMOKE-${process.pid}`;
|
|
133
153
|
const planned = structured(await server.callTool("plan_visible_run", {
|
|
134
154
|
symbol: "AAPL",
|
|
135
|
-
language: "
|
|
155
|
+
language: "zh-CN",
|
|
136
156
|
prompt,
|
|
137
157
|
run_id: runId,
|
|
138
158
|
tasks: ["market_data"],
|
|
@@ -143,7 +163,7 @@ export async function runPackageSmoke() {
|
|
|
143
163
|
|
|
144
164
|
const replay = await server.callTool("plan_visible_run", {
|
|
145
165
|
symbol: "AAPL",
|
|
146
|
-
language: "
|
|
166
|
+
language: "zh-CN",
|
|
147
167
|
prompt,
|
|
148
168
|
run_id: `${runId}-REPLAY`,
|
|
149
169
|
tasks: ["market_data"],
|
|
@@ -152,8 +172,8 @@ export async function runPackageSmoke() {
|
|
|
152
172
|
});
|
|
153
173
|
assert.equal(replay.error?.data?.reason, "MASTER_SELECTION_REPLAYED");
|
|
154
174
|
|
|
155
|
-
process.stdout.write(`package-smoke: passed tools=${tools.length} catalog=26 selected=1 replay_rejected=true\n`);
|
|
156
|
-
return { tools: tools.length, catalog: 26, selected: 1, replay_rejected: true };
|
|
175
|
+
process.stdout.write(`package-smoke: passed tools=${tools.length} catalog=26 locales=4 selected=1 replay_rejected=true\n`);
|
|
176
|
+
return { tools: tools.length, catalog: 26, locales: 4, selected: 1, replay_rejected: true };
|
|
157
177
|
} finally {
|
|
158
178
|
if (!server.child.killed) await server.close().catch(() => server.child.kill());
|
|
159
179
|
rmSync(dataDir, { recursive: true, force: true });
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
* Gaps are expected and do not make the command fail; malformed physical artifacts do.
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
+
import { CANONICAL_MASTER_COUNT } from "../mcp/lib/personas-v3/staging.mjs";
|
|
9
10
|
import { fileURLToPath } from "node:url";
|
|
10
11
|
import { join, resolve } from "node:path";
|
|
11
12
|
import { loadPersonas, defaultPersonaDir } from "../mcp/lib/personas/registry.mjs";
|
|
@@ -22,7 +23,9 @@ import {
|
|
|
22
23
|
inspectPersonaAdmission,
|
|
23
24
|
} from "../mcp/lib/personas-v3/admission.mjs";
|
|
24
25
|
|
|
25
|
-
|
|
26
|
+
// Re-exported rather than redeclared: two independent copies of the seat count is how a
|
|
27
|
+
// roster change passes one gate and fails another.
|
|
28
|
+
export { CANONICAL_MASTER_COUNT } from "../mcp/lib/personas-v3/staging.mjs";
|
|
26
29
|
|
|
27
30
|
function invalidResult(personaId, promptPresent, error) {
|
|
28
31
|
const counts = {};
|