alphacouncil-agent 0.9.4 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +3 -3
- package/.claude-plugin/plugin.json +2 -2
- package/.codex-plugin/plugin.json +4 -4
- package/AGENTS.md +22 -7
- package/CHANGELOG.md +97 -0
- package/CLAUDE.md +21 -3
- package/README.ja.md +9 -5
- package/README.md +15 -7
- package/README.zh-CN.md +12 -7
- 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 +10 -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 +4 -4
- package/docs/personas.md +2 -1
- package/docs/plans/v1.0-roadmap.md +487 -0
- package/docs/releases/v0.9.5.md +96 -0
- package/docs/releases/v1.0.0.md +164 -0
- package/docs/report-contract.md +30 -6
- 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 +13 -6
- 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 +12 -4
- 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 +11 -4
- 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 +10 -4
- 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 +12 -6
- 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 +12 -6
- 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 +10 -4
- 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 +9 -4
- 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 +11 -4
- 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 +17 -7
- 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 +13 -6
- 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 +6 -4
- 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 +12 -4
- 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 +11 -6
- 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 +8 -2
- 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 +13 -6
- 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 +14 -6
- 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 +11 -6
- 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 +10 -6
- 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 +9 -6
- 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 +8 -2
- 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 +8 -4
- 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 +8 -6
- 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 +10 -7
- 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 +9 -5
- 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 +11 -6
- 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/constants.mjs +15 -0
- 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 +71 -4
- 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/markdown.mjs +216 -43
- package/mcp/lib/master-catalog.mjs +4 -0
- package/mcp/lib/orchestrator.mjs +173 -29
- package/mcp/lib/packets.mjs +59 -6
- package/mcp/lib/personas/engine.mjs +23 -10
- 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/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-review-operations.mjs +3 -2
- package/mcp/lib/personas-v3/staging.mjs +22 -3
- package/mcp/lib/prompts.mjs +87 -3
- package/mcp/lib/quotes.mjs +5 -0
- package/mcp/lib/rpc.mjs +27 -10
- package/mcp/lib/run-store.mjs +5 -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 +4 -4
- 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/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 +9 -3
- 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 +112 -11
- package/scripts/package-smoke.mjs +2 -1
- package/scripts/report-persona-corpus-gaps.mjs +4 -1
- package/scripts/review-persona-v3-solo-formulas.mjs +12 -8
- package/scripts/scaffold-persona-v3-staging.mjs +1 -1
- package/skills/agent-skills-governance/SKILL.md +8 -2
- package/skills/alphacouncil-agent/SKILL.md +12 -4
- 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,7 @@ import { fileURLToPath } from "node:url";
|
|
|
21
22
|
import { basename, dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
22
23
|
|
|
23
24
|
import buildInventory from "../../data/persona-v3-build-specs.v1.mjs";
|
|
25
|
+
import { authoredMethods } from "../../data/authored/index.mjs";
|
|
24
26
|
import {
|
|
25
27
|
selectorBestForLocale,
|
|
26
28
|
selectorMethodLocale,
|
|
@@ -161,7 +163,7 @@ function loadFormulaTree(formulaRoot) {
|
|
|
161
163
|
const errors = [];
|
|
162
164
|
if (manifest.schema_version !== 1) errors.push("schema_version must be 1");
|
|
163
165
|
if (manifest.artifact_kind !== "persona_v3_solo_test_formula_staging_tree") errors.push("artifact_kind is invalid");
|
|
164
|
-
if (manifest.canonical_seat_count !==
|
|
166
|
+
if (manifest.canonical_seat_count !== CANONICAL_MASTER_COUNT || manifest.compiled_tool_count !== PLANNED_TOOL_COUNT) errors.push(`manifest must bind exactly ${CANONICAL_MASTER_COUNT} seats and ${PLANNED_TOOL_COUNT} tools`);
|
|
165
167
|
if (manifest.assurance_class !== SOLO_TEST_ASSURANCE_CLASS) errors.push("assurance_class must be provisional_derived_proxy");
|
|
166
168
|
if (manifest.review_status !== "not_human_reviewed") errors.push("review_status must be not_human_reviewed");
|
|
167
169
|
if (manifest.production_eligible !== false || manifest.method_model_eligible !== false) errors.push("formula tree must be production/method-model ineligible");
|
|
@@ -193,7 +195,7 @@ function loadFormulaTree(formulaRoot) {
|
|
|
193
195
|
if (JSON.stringify(actualSeatEntries) !== JSON.stringify([...CANONICAL_MASTER_IDS].sort())) {
|
|
194
196
|
fail("formula tree contains missing or unexpected top-level entries", { actual: actualSeatEntries });
|
|
195
197
|
}
|
|
196
|
-
if (total !==
|
|
198
|
+
if (total !== PLANNED_TOOL_COUNT) fail(`formula tree compiled ${total} tools instead of ${PLANNED_TOOL_COUNT}`);
|
|
197
199
|
return { root, manifest, byPersona };
|
|
198
200
|
}
|
|
199
201
|
|
|
@@ -296,6 +298,103 @@ function bindProxySource(tools, sourceId) {
|
|
|
296
298
|
});
|
|
297
299
|
}
|
|
298
300
|
|
|
301
|
+
/**
|
|
302
|
+
* A seat's real decision logic, when it has been authored.
|
|
303
|
+
*
|
|
304
|
+
* The generated fallback below scores every tool output against zero, which is executable and
|
|
305
|
+
* says nothing: it exists so the pipeline runs before a method is written. An authored policy
|
|
306
|
+
* replaces it with the seat's own judgement -- what it needs before it will speak at all
|
|
307
|
+
* (eligibility), what disqualifies a candidate outright (hard vetoes), and what it actually
|
|
308
|
+
* measures (scoring).
|
|
309
|
+
*
|
|
310
|
+
* The distinction between eligibility and scoring matters more than it looks. `min_coverage`
|
|
311
|
+
* is 1, so ONE uncomputable scoring rule collapses the whole seat to out_of_scope. That is
|
|
312
|
+
* precisely why twenty-five seats abstained on every symbol. A "can this method speak at all"
|
|
313
|
+
* test therefore belongs in eligibility, which has its own exit and its own explanation.
|
|
314
|
+
*/
|
|
315
|
+
function authoredDecisionPolicy(seat, tools, authored) {
|
|
316
|
+
if (!authored?.scoring?.length || !authored?.bands?.length) return null;
|
|
317
|
+
const declaredStates = new Set(seat.native_decision_contract.states.map(executableNativeState));
|
|
318
|
+
const state = (value) => {
|
|
319
|
+
const resolved = executableNativeState(value);
|
|
320
|
+
if (!declaredStates.has(resolved)) {
|
|
321
|
+
fail(`${seat.persona_id}: authored policy uses undeclared native state ${JSON.stringify(value)}`, {
|
|
322
|
+
declared: [...declaredStates],
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
return resolved;
|
|
326
|
+
};
|
|
327
|
+
const outOfScopeHypothesis = seat.native_decision_contract.states
|
|
328
|
+
.find((candidate) => stanceForState(candidate) === "out_of_scope") || seat.native_decision_contract.states[0];
|
|
329
|
+
const outOfScope = executableNativeState(outOfScopeHypothesis);
|
|
330
|
+
const maxScore = authored.scoring.reduce((sum, rule) => sum + (rule.points || 0), 0);
|
|
331
|
+
return canonicalValue({
|
|
332
|
+
schema_version: 1,
|
|
333
|
+
dsl_version: "1.1",
|
|
334
|
+
native_decision_schema: seat.native_decision_contract.schema_id,
|
|
335
|
+
native_states: seat.native_decision_contract.states.map(executableNativeState),
|
|
336
|
+
abstention_policy: "fail_closed",
|
|
337
|
+
fact_gate: { on_missing_critical: { native_state: outOfScope, common_stance: "out_of_scope" } },
|
|
338
|
+
// Authoring supplies the judgement; the build supplies identity. Source ids are minted
|
|
339
|
+
// here because the loader rejects a source id that is not in the pack, and native states
|
|
340
|
+
// are mapped here because the authored form uses the raw name a build spec declares.
|
|
341
|
+
eligibility: {
|
|
342
|
+
all: (authored.eligibility?.all || []).map((entry) => ({
|
|
343
|
+
condition_id: entry.condition_id,
|
|
344
|
+
condition: entry.condition,
|
|
345
|
+
on_false: {
|
|
346
|
+
native_state: state(entry.on_false.native_state),
|
|
347
|
+
common_stance: entry.on_false.common_stance,
|
|
348
|
+
},
|
|
349
|
+
on_uncomputable: {
|
|
350
|
+
native_state: state((entry.on_uncomputable || entry.on_false).native_state),
|
|
351
|
+
common_stance: (entry.on_uncomputable || entry.on_false).common_stance,
|
|
352
|
+
},
|
|
353
|
+
source_ids: [authored.source_id],
|
|
354
|
+
})),
|
|
355
|
+
},
|
|
356
|
+
hard_vetoes: (authored.hard_vetoes || []).map((veto) => ({
|
|
357
|
+
veto_id: veto.veto_id,
|
|
358
|
+
condition: veto.condition,
|
|
359
|
+
on_trigger: {
|
|
360
|
+
native_state: state(veto.on_trigger.native_state),
|
|
361
|
+
common_stance: veto.on_trigger.common_stance,
|
|
362
|
+
},
|
|
363
|
+
// A veto whose condition cannot be evaluated must not read as "not triggered". An
|
|
364
|
+
// unmeasurable disqualifier is a reason to abstain, not a reason to proceed.
|
|
365
|
+
on_uncomputable: {
|
|
366
|
+
action: "abstain",
|
|
367
|
+
decision: {
|
|
368
|
+
native_state: state(veto.on_uncomputable?.native_state || outOfScopeHypothesis),
|
|
369
|
+
common_stance: veto.on_uncomputable?.common_stance || "out_of_scope",
|
|
370
|
+
},
|
|
371
|
+
},
|
|
372
|
+
source_ids: [authored.source_id],
|
|
373
|
+
})),
|
|
374
|
+
scoring: {
|
|
375
|
+
max_score: maxScore,
|
|
376
|
+
min_coverage: 1,
|
|
377
|
+
on_insufficient_coverage: { native_state: outOfScope, common_stance: "out_of_scope" },
|
|
378
|
+
rules: authored.scoring.map((rule) => ({
|
|
379
|
+
rule_id: rule.rule_id,
|
|
380
|
+
condition: rule.condition,
|
|
381
|
+
points: rule.points,
|
|
382
|
+
coverage_weight: rule.coverage_weight ?? 1,
|
|
383
|
+
source_ids: [authored.source_id],
|
|
384
|
+
})),
|
|
385
|
+
},
|
|
386
|
+
score_bands: authored.bands.map((band) => ({
|
|
387
|
+
min_ratio: band.min_ratio,
|
|
388
|
+
decision: { native_state: state(band.native_state), common_stance: band.common_stance },
|
|
389
|
+
})),
|
|
390
|
+
native_output_fields: tools.map((tool, index) => ({
|
|
391
|
+
field: `metric_${index + 1}`,
|
|
392
|
+
value: { output_id: tool.output_id },
|
|
393
|
+
on_missing: "fail",
|
|
394
|
+
})),
|
|
395
|
+
});
|
|
396
|
+
}
|
|
397
|
+
|
|
299
398
|
function buildDecisionPolicy(seat, tools, sourceId) {
|
|
300
399
|
const stateHypotheses = seat.native_decision_contract.states;
|
|
301
400
|
const states = stateHypotheses.map(executableNativeState);
|
|
@@ -373,7 +472,9 @@ function buildDocuments({ seat, blueprint, rawTools, packVersion, formulaManifes
|
|
|
373
472
|
const required = referencedFacts;
|
|
374
473
|
const optional = seat.required_fact_types.filter((fact) => !required.includes(fact));
|
|
375
474
|
if (!required.length) fail(`${seat.persona_id}: formula tools have no physical fact inputs`);
|
|
376
|
-
const
|
|
475
|
+
const authored = authoredMethods[seat.persona_id] || null;
|
|
476
|
+
const policy = authoredDecisionPolicy(seat, tools, authored ? { ...authored, source_id: source.source_id } : null)
|
|
477
|
+
|| buildDecisionPolicy(seat, tools, source.source_id);
|
|
377
478
|
const policyErrors = validateDeterministicPolicyArtifacts({
|
|
378
479
|
policy,
|
|
379
480
|
tools,
|
|
@@ -525,7 +626,7 @@ function generationContext({ root = DEFAULT_SOLO_TEST_PACK_ROOT, formulaRoot = D
|
|
|
525
626
|
const blueprints = canonicalMasterBlueprints({ personaDir });
|
|
526
627
|
const byBlueprint = new Map(blueprints.map((blueprint) => [blueprint.persona_id, blueprint]));
|
|
527
628
|
const bySeat = new Map(buildInventory.seats.map((seat) => [seat.persona_id, seat]));
|
|
528
|
-
if (bySeat.size !==
|
|
629
|
+
if (bySeat.size !== CANONICAL_MASTER_COUNT || byBlueprint.size !== CANONICAL_MASTER_COUNT) fail(`canonical solo-test inventory must contain exactly ${CANONICAL_MASTER_COUNT} unique seats`);
|
|
529
630
|
const output = resolve(root);
|
|
530
631
|
if (basename(output) !== "masters" || basename(dirname(output)) !== "solo-test") {
|
|
531
632
|
fail("solo-test pack root must end in knowledge/solo-test/masters (or an equivalent isolated solo-test/masters path)");
|
|
@@ -687,12 +788,12 @@ export function renderPersonaV3SoloTestPackReport(report) {
|
|
|
687
788
|
"",
|
|
688
789
|
"> These are packaged provisional operator lenses. They are not approved method models and the production loader rejects them.",
|
|
689
790
|
"",
|
|
690
|
-
`Physical packs: ${report.summary.physical_pack_count}
|
|
691
|
-
`Solo loader valid: ${report.summary.solo_loader_valid_count}
|
|
692
|
-
`Compiled: ${report.summary.compiler_valid_count}
|
|
693
|
-
`Provisional operator lenses: ${report.summary.provisional_operator_lens_count}
|
|
694
|
-
`Production loader rejected: ${report.summary.production_loader_rejection_count}
|
|
695
|
-
`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}`,
|
|
696
797
|
`Operational/method_model: ${report.summary.operational_count}/0`,
|
|
697
798
|
`Ready for solo testing: ${report.summary.ready_for_solo_testing}`,
|
|
698
799
|
`Readiness hash: \`${report.readiness_hash}\``,
|
|
@@ -8,6 +8,7 @@ import { mkdtempSync, rmSync } from "node:fs";
|
|
|
8
8
|
import { tmpdir } from "node:os";
|
|
9
9
|
import { join, resolve } from "node:path";
|
|
10
10
|
import { fileURLToPath } from "node:url";
|
|
11
|
+
import { CANONICAL_MASTER_COUNT } from "../mcp/lib/personas-v3/staging.mjs";
|
|
11
12
|
|
|
12
13
|
const root = fileURLToPath(new URL("..", import.meta.url));
|
|
13
14
|
const serverEntry = join(root, "mcp", "server.mjs");
|
|
@@ -128,7 +129,7 @@ export async function runPackageSmoke() {
|
|
|
128
129
|
host: "package-smoke",
|
|
129
130
|
prompt: locale.prompt,
|
|
130
131
|
}));
|
|
131
|
-
assert.equal(catalog.masters.length,
|
|
132
|
+
assert.equal(catalog.masters.length, CANONICAL_MASTER_COUNT, `${locale.language} installed catalog must contain exactly ${CANONICAL_MASTER_COUNT} seats`);
|
|
132
133
|
for (const master of catalog.masters) {
|
|
133
134
|
for (const field of ["identity", "method", "best_for", "maturity_label"]) {
|
|
134
135
|
assert.match(master[field], locale.script, `${locale.language} ${master.id}.${field}`);
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
* Gaps are expected and do not make the command fail; malformed physical artifacts do.
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
+
import { CANONICAL_MASTER_COUNT } from "../mcp/lib/personas-v3/staging.mjs";
|
|
9
10
|
import { fileURLToPath } from "node:url";
|
|
10
11
|
import { join, resolve } from "node:path";
|
|
11
12
|
import { loadPersonas, defaultPersonaDir } from "../mcp/lib/personas/registry.mjs";
|
|
@@ -22,7 +23,9 @@ import {
|
|
|
22
23
|
inspectPersonaAdmission,
|
|
23
24
|
} from "../mcp/lib/personas-v3/admission.mjs";
|
|
24
25
|
|
|
25
|
-
|
|
26
|
+
// Re-exported rather than redeclared: two independent copies of the seat count is how a
|
|
27
|
+
// roster change passes one gate and fails another.
|
|
28
|
+
export { CANONICAL_MASTER_COUNT } from "../mcp/lib/personas-v3/staging.mjs";
|
|
26
29
|
|
|
27
30
|
function invalidResult(personaId, promptPresent, error) {
|
|
28
31
|
const counts = {};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
/** Build or verify the isolated
|
|
2
|
+
/** Build or verify the isolated AI-assisted formula cross-review tree. */
|
|
3
3
|
|
|
4
4
|
import { resolve } from "node:path";
|
|
5
5
|
import { fileURLToPath } from "node:url";
|
|
@@ -11,6 +11,10 @@ import {
|
|
|
11
11
|
writeAIFormulaCrossReviews,
|
|
12
12
|
} from "./lib/persona-v3-ai-formula-review.mjs";
|
|
13
13
|
import { DEFAULT_SOLO_TEST_FORMULA_ROOT } from "./lib/persona-v3-solo-formula-pipeline.mjs";
|
|
14
|
+
import { PLANNED_TOOL_COUNT } from "../data/persona-v3-build-specs.v1.mjs";
|
|
15
|
+
|
|
16
|
+
/** The review profile gives every tool three independent machine roles. */
|
|
17
|
+
const INDEPENDENT_ROLES_PER_REVIEW = 3;
|
|
14
18
|
|
|
15
19
|
export function parseArgs(argv) {
|
|
16
20
|
const args = {
|
|
@@ -57,13 +61,13 @@ function compact(result) {
|
|
|
57
61
|
return [
|
|
58
62
|
"persona-v3-ai-formula-review:",
|
|
59
63
|
`mode=${result.mode || "plan_ai_formula_cross_reviews"}`,
|
|
60
|
-
`reviews=${result.review_count}
|
|
61
|
-
`roles=${result.role_count}
|
|
64
|
+
`reviews=${result.review_count}/${PLANNED_TOOL_COUNT}`,
|
|
65
|
+
`roles=${result.role_count}/${PLANNED_TOOL_COUNT * INDEPENDENT_ROLES_PER_REVIEW}`,
|
|
62
66
|
`vectors=${result.test_vector_count}`,
|
|
63
67
|
`invariants=${result.invariant_count}`,
|
|
64
|
-
`mechanical_pass=${result.mechanical_pass_count}
|
|
68
|
+
`mechanical_pass=${result.mechanical_pass_count}/${PLANNED_TOOL_COUNT}`,
|
|
65
69
|
`disagreements=${result.disagreement_count}`,
|
|
66
|
-
`semantic_unknown=${result.semantic_unknown_count}
|
|
70
|
+
`semantic_unknown=${result.semantic_unknown_count}/${PLANNED_TOOL_COUNT}`,
|
|
67
71
|
`human_reviewers=${result.human_reviewer_count}`,
|
|
68
72
|
`approvals=${result.approval_count}`,
|
|
69
73
|
`production_eligible=${result.production_eligible}`,
|
|
@@ -88,11 +92,11 @@ export function main(argv = process.argv.slice(2)) {
|
|
|
88
92
|
}
|
|
89
93
|
if (args.json) process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
|
|
90
94
|
else process.stdout.write(compact(result));
|
|
91
|
-
const okay = result.review_count ===
|
|
95
|
+
const okay = result.review_count === PLANNED_TOOL_COUNT
|
|
92
96
|
&& result.role_count === 156
|
|
93
|
-
&& result.mechanical_pass_count ===
|
|
97
|
+
&& result.mechanical_pass_count === PLANNED_TOOL_COUNT
|
|
94
98
|
&& result.disagreement_count === 0
|
|
95
|
-
&& result.semantic_unknown_count ===
|
|
99
|
+
&& result.semantic_unknown_count === PLANNED_TOOL_COUNT
|
|
96
100
|
&& result.human_reviewer_count === 0
|
|
97
101
|
&& result.approval_count === 0
|
|
98
102
|
&& result.production_eligible === false;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
/** Create only missing PersonaPack v3 staging artifacts, then validate the full
|
|
2
|
+
/** Create only missing PersonaPack v3 staging artifacts, then validate the full staging tree. */
|
|
3
3
|
|
|
4
4
|
import { fileURLToPath } from "node:url";
|
|
5
5
|
import { resolve } from "node:path";
|
|
@@ -37,7 +37,9 @@ Before giving a final investment answer, all gates below must be satisfied:
|
|
|
37
37
|
when at least two completed and every failed role has a recorded diagnostic/data gap.
|
|
38
38
|
5. Source gate: every material claim maps to scoped source IDs like `<task>:S1`; never cite bare `S1`.
|
|
39
39
|
6. Master gate: every master named in the confirmed receipt has either reported or produced
|
|
40
|
-
a deterministic `out_of_scope` result
|
|
40
|
+
a deterministic `out_of_scope` result, every result has a readable final statement, and
|
|
41
|
+
every stable ID appears in the published Master Bench. An unexecuted or hidden selected
|
|
42
|
+
seat keeps the run incomplete or `needs_revision`.
|
|
41
43
|
7. Debate gate: full requires all three bull/bear rounds, exact round-3 Q&A and PM. Quick
|
|
42
44
|
requires one parallel statement round and PM; one degraded side is allowed only if the
|
|
43
45
|
other side and PM completed, while two degraded sides or PM failure is incomplete.
|
|
@@ -53,7 +55,9 @@ Before giving a final investment answer, all gates below must be satisfied:
|
|
|
53
55
|
winner, confidence, valuation/position, material gaps and saved file locations. Full
|
|
54
56
|
also carries forward setup and invalidations. Quick names all four analyst statuses,
|
|
55
57
|
selected method IDs/stances, dated recent company/industry news, every degraded item,
|
|
56
|
-
and that it is not equivalent to full council.
|
|
58
|
+
and that it is not equivalent to full council. Full handoff ends with the exact selected
|
|
59
|
+
seat count and every per-seat method statement; use returned `user_response_markdown`
|
|
60
|
+
rather than an ACK-only recap.
|
|
57
61
|
12. Deadline gate: plugin-managed quick uses headless `analyze_symbol`; `plan_visible_run`
|
|
58
62
|
quick is rejected. Never extend its end-to-end deadline above 600000 ms or silently
|
|
59
63
|
omit work to appear complete.
|
|
@@ -73,6 +77,8 @@ Before giving a final investment answer, all gates below must be satisfied:
|
|
|
73
77
|
| "Quick report quality passed, so full passed." | Keep `full_council_equivalent=false`; only `quick_v1` passed. |
|
|
74
78
|
| "The ten-minute clock expired, so skip a seat quietly." | Return the exact degraded/incomplete ledger; never extend the ceiling or invent evidence. |
|
|
75
79
|
| "The master said this." | Call it a recorded method-seat result, never a quote from the named person. |
|
|
80
|
+
| "The PM ACK says complete, so I can summarize it." | Deliver the returned `user_response_markdown`; the final per-seat section is part of the contract. |
|
|
81
|
+
| "QQQ has an SEC CIK, so the company screen applies." | Classify first. ETF/fund/index company financial routes are not applicable; require look-through or aggregate evidence. |
|
|
76
82
|
|
|
77
83
|
## Exit Criteria
|
|
78
84
|
|