{
  "protocol_id": "ELECTION-01",
  "version": "v0.1.1-draft",
  "status": "PROPOSAL \u2014 addresses Claude c5df4c74 CHANGES_REQUESTED_BEFORE_FIT; NOT fitting-authorized; Claude re-review required",
  "parent_version": "v0.1.0-draft",
  "claude_review_comment_id": "c5df4c74-32f1-4b0b-8ada-b1af47acdcfb",
  "model_change": false,
  "srp_scoring_change": false,
  "l1_m1_score_authorized_untouched": true,
  "fitting_authorized": false,
  "target": {
    "name": "US_presidential_national_D_minus_R_two_party_popular_vote_margin",
    "formula": "100*(D-R)/(D+R)",
    "unit": "percentage_points",
    "geography": "national",
    "vote_basis": "TWO_PARTY_ONLY \u2014 D and R exclude third-party ballots; third_party_share_of_total reported per cycle alongside margin",
    "third_party_share_formula": "100*(Total-D-R)/Total",
    "not": [
      "Electoral College winner",
      "state margins",
      "congressional",
      "turnout",
      "D-R share of TOTAL vote"
    ]
  },
  "cutoff": {
    "primary_horizon_calendar_days_before_election_day": 60,
    "sensitivity_horizon_calendar_days_before_election_day": 30,
    "sensitivity_label": "SENSITIVITY_ONLY \u2014 cannot replace primary after results",
    "timezone": "America/New_York",
    "cutoff_rule": "end_of_day_inclusive_at_T_minus_horizon in America/New_York; frozen in executable spec",
    "election_day_definition": "US presidential election day (first Tuesday after first Monday in November)"
  },
  "cycles": {
    "metadata_universe": [
      1968,
      1972,
      1976,
      1980,
      1984,
      1988,
      1992,
      1996,
      2000,
      2004,
      2008,
      2012,
      2016,
      2020,
      2024
    ],
    "n_cycles_max": 15,
    "start_year_rationale": "Fixed a priori at 1968 (NOT coverage-informed): (1) FEC-grade national popular-vote totals with consistent two-party accounting through the modern era; (2) national poll archival density adequate for Baseline1 (\u22653 pollsters rule is testable); (3) first cycle in universe includes a large third-party (Wallace) so third-party reporting rule is exercised from the start. Do not revisit to exclude/include based on later coverage results.",
    "min_training_cycles_proposed": 8,
    "eligible_cycles": "OBJECTIVE RULE ONLY \u2014 see cycle_eligibility; freeze after ledger fill; no analyst case-by-case",
    "split_unit": "whole_election_cycle",
    "fold_scheme": "expanding_chronological_training"
  },
  "cycle_eligibility": {
    "rule": "cycle C is ELIGIBLE iff ALL required families are AVAILABLE_AT_T_MINUS_60 with content hash and hard release_date \u2264 cutoff; else INELIGIBLE",
    "required_families_at_T_minus_60": [
      "FEC_or_authoritative_two_party_outcome_for_PRIOR_cycles_only_in_training",
      "national_polls_Baseline1_inputs",
      "baseline_M0_prior_margin_known",
      "M2_fundamentals_preregistered_set",
      "M4_srp_adjacent_feature_trust_fed_gov_precutoff_level"
    ],
    "release_date_unknown": "INELIGIBLE_FOR_STRICT_BACKTEST \u2014 fieldwork-only without hard release_date does NOT fall through to included",
    "marginal_fail": "INELIGIBLE \u2014 no case-by-case rescue",
    "post_hoc_exclusion": "FORBIDDEN"
  },
  "feature_registry": {
    "status": "PARTIAL_PREREGISTER \u2014 M4 feature named before coverage freeze; remaining M2 list still freezes before first fit",
    "M4_local_srp_adjacent_feature": {
      "id": "trust_fed_gov_precutoff_level",
      "definition": "Most recent national mean of trust-in-federal-government (ANES trust-in-federal-government item, or GSS confidence-in-executive/federal-gov nearest equivalent if ANES wave unavailable) whose RELEASE DATE is \u2264 T\u221260 of the target cycle.",
      "timing": "pre-cutoff release only; prior-wave allowed; same-election ANES microdata forbidden unless release\u2264T\u221260 proven",
      "missingness": "if unavailable at cutoff \u2192 M4_local ineligible for that cycle (do not impute; do not substitute another SRP feature)",
      "frozen_before_coverage_matrix": true,
      "rationale": "Claude c5df item 1 \u2014 name before coverage freeze to block coverage-informed feature selection"
    },
    "families_inventory": [
      "national_polls_LV",
      "economic_fundamentals_ALFRED_vintages",
      "trust_fed_gov_precutoff_level"
    ],
    "forbidden_until_availability_proven": [
      "ANES_same_election_microdata",
      "publisher_pollster_ratings_using_later_elections",
      "retrospective_538_averages_without_release_proof",
      "FRED_today_revisions_as_historical",
      "Voteview_career_estimates_without_historical_vintage",
      "Exp002_recovery_machine_outputs"
    ]
  },
  "sources_vintages": {
    "outcome_authoritative": "FEC final presidential results",
    "outcome_crosscheck": "MIT Election Lab presidential returns (version TBD)",
    "polls": "publisher archives / original releases with release-date proof; NOT HTML-as-CSV",
    "macro": "ALFRED vintages",
    "survey_affect": "ANES/GSS only if contemporaneous availability proven via release_date",
    "elite": "Voteview historical vintage or frozen refit to then-available info"
  },
  "baselines_local_labels_NOT_SRP_M1": {
    "note": "M0-M4 are LOCAL comparison labels for ELECTION-01 only. NOT canonical SRP M1 authorizations.",
    "M0": "prior-election two-party margin (then-known results only) \u2014 LOCKED choice (not historical mean)",
    "M1_local": "transparent poll-only at exact T-60 (Baseline1)",
    "M2_local": "parsimonious fundamentals-only (cap 2-3 preregistered predictors; list freezes before fit)",
    "M3_local": "polls + fundamentals",
    "M4_local": "M3 + trust_fed_gov_precutoff_level ONLY",
    "Baseline1_candidate_rule": {
      "window": "national polls in 30-day window ending at 60-day cutoff",
      "population_select_order": [
        "LV",
        "RV",
        "All_Adults"
      ],
      "question_rule": "one selected question per poll/sample \u2014 two-party share renormalized to 100 excluding minor parties/undecided per predeclared parser",
      "aggregation": "average within pollster then equally across pollsters",
      "min_pollsters": 3,
      "below_min": "MISSING (do not silently widen window or drop to RV after seeing LV sparse)"
    }
  },
  "availability_semantics": {
    "fieldwork_date_and_release_date_both_required": true,
    "reject_released_after_cutoff_even_if_fieldwork_earlier": true,
    "reject_release_date_unknown": true,
    "negative_control_added": "reject_release_date_unknown_even_if_fieldwork_present"
  },
  "model": {
    "form": "UNFROZEN \u2014 freeze after coverage review and before any label join/fit",
    "max_srp_adjacent_features_at_first": 1,
    "selection_basis": "construct validity + pre-cutoff availability \u2014 NOT election correlations"
  },
  "metrics": {
    "primary_accuracy": "mean_absolute_error_of_predicted_margin_vs_actual_across_eligible_cycles",
    "primary_calibration": "PIT uniformity (PIT-KS) on predictive distributions when present; else omit calibration claim",
    "secondary": [
      "RMSE",
      "directional_bias",
      "paired_errors_same_cycles",
      "per_cycle_errors",
      "third_party_share_per_cycle"
    ],
    "winner_accuracy": "descriptive_only",
    "report_both_accuracy_and_calibration": true,
    "pit_alone_insufficient_for_success": true
  },
  "success_threshold": {
    "status": "FROZEN_V011",
    "X_pp": 1.5,
    "rule": "Success for Mk vs M0 requires (a) MAE improvement \u2265 1.5 percentage points AND (b) paired-cycle bootstrap 90% CI for MAE_M0\u2212MAE_Mk excludes 0 AND (c) if probabilistic, PIT-KS not rejected at \u03b1=0.05. Accuracy and calibration are both required when probabilistic outputs exist; point-only models report (a)+(b) only.",
    "null_path": "INSUFFICIENT_TO_DEMONSTRATE_IMPROVEMENT is the expected majority outcome at n\u224815; do not manufacture power via poll-row or state pooling"
  },
  "multiple_testing": {
    "family": [
      "M1_vs_M0",
      "M2_vs_M0",
      "M3_vs_M0",
      "M4_vs_M0",
      "M4_vs_M3"
    ],
    "procedure": "Benjamini-Hochberg FDR",
    "alpha": 0.05,
    "not": [
      "per-pair p<0.05 uncorrected",
      "Bonferroni FWER"
    ]
  },
  "attempt_ledger": {
    "path_hub": "/docs/election01-attempt-ledger.json",
    "path_repo": "src/docs/election01-attempt-ledger.json",
    "enforcement": "append-only; each entry includes prior_entry_sha256 chain; deploy publishes ledger; amendments that change protocol bump version"
  },
  "tuning_budget": {
    "rule": "equal predeclared budgets across compared models; no selectively weak comparator",
    "status": "UNFROZEN_PENDING_COVERAGE"
  },
  "folds": {
    "unit": "election_cycle",
    "scheme": "expanding_chronological",
    "forbidden": [
      "row-random CV",
      "splitting poll rows/states/counties across train/test for same election"
    ]
  },
  "seeds": {
    "status": "UNFROZEN \u2014 declare before first fit if any stochastic component",
    "default_policy": "deterministic preferred; if stochastic, fixed seeds in protocol hash"
  },
  "stopping_rules": [
    "If vintages/cycle counts cannot support design: publish FAILED_GATE + bounded descriptive benchmark; do not label retrospective search as predictive validation",
    "No outcome-guided source/feature/horizon changes; amendments version prior plan and mark already-seen outcomes",
    "Preserve null/negative findings path",
    "No fitting until Claude independent protocol re-review ACCEPT on v0.1.1 (or revised freeze)",
    "No coverage-matrix eligibility decisions until v0.1.1 accepted"
  ],
  "integrity_contract_sha256": "145046ff15faa3f6d71e07c817f1d68b4a8addcd7bafea6dbb98a44a0ba4227b",
  "hub_refs": {
    "proposal_comment": "80b724f8",
    "integrity_comment": "fb4c1bc0",
    "astra_conditional_relay_comment": "17924a21",
    "claude_v010_review_comment": "c5df4c74-32f1-4b0b-8ada-b1af47acdcfb",
    "parent_hub_job": "9f1440b8-fbb0-4e7e-864c-1f9acb6848ad",
    "srp_parent_job": "b73c292a-16e2-4f11-9370-1337d0239791"
  },
  "executable_negative_controls": [
    "reject_released_after_cutoff",
    "reject_unavailable_revisions",
    "reject_release_date_unknown_even_if_fieldwork_present",
    "held_out_label_permutation_cannot_change_predictions_or_feature_selection",
    "no_election_crosses_train_test_boundary",
    "overlapping_samples_not_counted_independent",
    "identical_eligible_test_cycles_for_comparisons",
    "reject_html_served_as_csv"
  ],
  "reporting_requirements": [
    "every_test_election_prediction_and_error",
    "all_exclusions_and_missingness",
    "all_attempted_models_in_attempt_ledger",
    "source_script_protocol_hashes",
    "availability_evidence_per_predictor_per_cutoff",
    "third_party_share_per_cycle",
    "MAE_and_PIT_both_when_probabilistic"
  ],
  "independence": {
    "proposer_cannot_self_certify_REPLICATED": true,
    "independent_reviewer_required": "claude",
    "fit_eval_separation_required": true,
    "codex_crosscheck_items": [
      3,
      5,
      7
    ],
    "astra_final_review_before_fit_or_coverage_freeze": true
  },
  "protocol_fields_sha256": "492a32342c47a582a763baeed0fa7aacc36f311b77cb83f78df4d3df93f4f2ec"
}
