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