{
  "protocol_id": "ELECTION-01",
  "version": "v0.1.0-draft",
  "status": "PROPOSAL \u2014 pending independent Claude review; NOT fitting-authorized",
  "model_change": false,
  "srp_scoring_change": false,
  "l1_m1_score_authorized_untouched": true,
  "target": {
    "name": "US_presidential_national_D_minus_R_two_party_popular_vote_margin",
    "formula": "100*(D-R)/(D+R)",
    "unit": "percentage_points",
    "geography": "national",
    "not": [
      "Electoral College winner",
      "state margins",
      "congressional",
      "turnout"
    ]
  },
  "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,
    "min_training_cycles_proposed": 8,
    "eligible_cycles": "OPEN \u2014 freeze only after point-in-time coverage ledger",
    "split_unit": "whole_election_cycle",
    "fold_scheme": "expanding_chronological_training"
  },
  "feature_registry": {
    "status": "EMPTY_PENDING_COVERAGE \u2014 freeze before first fit",
    "families_inventory_only": [
      "national_polls_LV",
      "economic_fundamentals_ALFRED_vintages",
      "at_most_one_SRP_adjacent_construct_preregistered"
    ],
    "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"
    ]
  },
  "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/Pew only if contemporaneous availability proven",
    "elite": "Voteview historical vintage or frozen refit to then-available info"
  },
  "baselines_local_labels_NOT_SRP_M1": {
    "note": "M0-M4 below are LOCAL comparison labels for ELECTION-01 only. NOT canonical SRP M1 authorizations.",
    "M0": "prior-election two-party margin (then-known results only) OR historical mean \u2014 choose before fit",
    "M1_local": "transparent poll-only at exact T-60",
    "M2_local": "parsimonious fundamentals-only (cap 2-3 preregistered predictors)",
    "M3_local": "polls + fundamentals",
    "M4_local": "M3 + exactly one preregistered SRP-adjacent feature",
    "Baseline1_candidate_rule": "national LV polls in 30-day window ending at 60-day cutoff; one question per poll/sample; avg within pollster then equal across pollsters; <3 independent pollsters => MISSING"
  },
  "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"
  },
  "tuning_budget": {
    "rule": "equal predeclared budgets across compared models; no selectively weak comparator",
    "status": "UNFROZEN_PENDING_REVIEW"
  },
  "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"
  },
  "metrics": {
    "primary": "mean_absolute_vote_margin_error_by_election",
    "secondary": [
      "RMSE",
      "directional_bias",
      "paired_errors_same_cycles",
      "per_cycle_errors"
    ],
    "winner_accuracy": "descriptive_only",
    "probabilities": "forbidden until independently reviewed uncertainty/calibration model",
    "uncertainty_level": "election_cycle_not_poll_row"
  },
  "success_threshold": {
    "status": "UNFROZEN_PENDING_REVIEW",
    "proposed_interpretation_rule": "If local-M4 does not improve over local-M3 consistently enough under tiny-sample uncertainty, SRP-adjacent feature has NO demonstrated incremental election-forecast value; no rescue with another feature (that becomes ELECTION-02 exploratory)."
  },
  "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 review ACCEPT (or revised freeze)"
  ],
  "integrity_contract_sha256": "145046ff15faa3f6d71e07c817f1d68b4a8addcd7bafea6dbb98a44a0ba4227b",
  "hub_refs": {
    "proposal_comment": "80b724f8",
    "integrity_comment": "fb4c1bc0",
    "astra_conditional_relay_comment": "17924a21",
    "parent_hub_job": "b73c292a-16e2-4f11-9370-1337d0239791"
  },
  "executable_negative_controls": [
    "reject_released_after_cutoff",
    "reject_unavailable_revisions",
    "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"
  ],
  "independence": {
    "proposer_cannot_self_certify_REPLICATED": true,
    "independent_reviewer_required": "claude",
    "fit_eval_separation_required": true
  },
  "protocol_fields_sha256": "5833965da9b9790ebb657029ba69cb248ab51d2ea359ecc518451b504a5e584f"
}
