{
  "_generated_by": "tools/build-prop-firm-rules-statistics.js — every block computed from rules/**, rules/freshness.json and research/rule-volatility-data.json; zero hand-typed figures.",
  "_data_boundary": "Structural/categorical counts and derived ratios only — no firm named, no firm ranked, no pass rate or outcome probability published.",
  "_license": "CC BY 4.0 — https://creativecommons.org/licenses/by/4.0/ — attribute PropSurvival and link https://propsurvival.com/research/prop-firm-rules-statistics",
  "_reproduce": "node tools/build-prop-firm-rules-statistics.js --check",
  "generated_at": "2026-09-27",
  "published": "2026-09-23",
  "corpus": {
    "firm_rule_set_count": 60,
    "account_size_configuration_count": 247,
    "coverage_date": "2026-07-16",
    "last_re_read": "2026-09-27",
    "corpus_hash": "d4f88249a5341090bfa137b0defd09ca4c314b2a8082ba31ac254de7418df7f6"
  },
  "method": {
    "summary": "Computed with the PropSurvival strategy-survival engine corpus (seeded, reproducible).",
    "page": "https://propsurvival.com/research-methodology"
  },
  "rule_volatility_source": {
    "dated": "2026-09-11",
    "url": "https://propsurvival.com/research/rule-volatility"
  },
  "blocks": [
    {
      "id": 1,
      "key": "drawdown_type_mix",
      "title": "Drawdown-type mix",
      "n": 247,
      "computed": "Counted from phases[0].max_drawdown.type across 247 account-size configurations in the live corpus; phases[0] is the first modeled phase, including direct-funded accounts.",
      "headline": "In the first modeled phase, 160 of 247 configs (64.8%) encode a trailing drawdown floor; 87 (35.2%) encode a static floor. These are recorded model types, including source approximations.",
      "corpus_date": "2026-07-16",
      "data": {
        "trailing": 160,
        "static": 87,
        "denominator": 247
      }
    },
    {
      "id": 2,
      "key": "lock_share",
      "title": "Recorded trailing-floor lock settings",
      "n": 160,
      "computed": "Counted from phases[0].max_drawdown.locks across the 160 trailing-floor configs; non-null settings record the modeled lock level (at, value). All percentages use the full trailing-floor denominator.",
      "headline": "In the first modeled phase, 97 of 160 trailing-floor configs (60.6%) have a lock setting recorded; 63 (39.4%) have no lock recorded. Of all trailing-floor configs: 73 (45.6%) record a lock at the starting balance; 24 (15.0%) record a lock above it. No lock recorded does not establish that a floor never locks; modeled settings can retain platform-specific source approximations. Excluded: 87 static-floor configs and 0 with another or unrecorded type.",
      "corpus_date": "2026-07-16",
      "data": {
        "lock_recorded": 97,
        "no_lock_recorded": 63,
        "locks_at_start": 73,
        "locks_above_start": 24,
        "locks_other": 0,
        "denominator": 160,
        "static_excluded": 87,
        "other_type_excluded": 0
      }
    },
    {
      "id": 3,
      "key": "basis_split",
      "title": "Recorded drawdown reference basis",
      "n": 244,
      "computed": "Counted from phases[0].max_drawdown.basis across the 244 of 247 configs that record it. This is the stored reference/ratchet category, not the breach-monitoring schedule.",
      "headline": "Among 244 configs with a recorded drawdown reference basis in the first modeled phase: end-of-day balance 110 (45.1%), intraday equity 112 (45.9%), and closed-trade balance 22 (9.0%). These reference/ratchet categories do not establish when breaches are monitored.",
      "corpus_date": "2026-07-16",
      "data": {
        "balance_eod": 110,
        "equity_intraday": 112,
        "balance_closed_trade": 22,
        "not_recorded": 3,
        "denominator": 244
      }
    },
    {
      "id": 4,
      "key": "daily_loss_cap_distribution",
      "title": "Recorded daily-loss percentage distribution",
      "n": 247,
      "computed": "Bucketed from phases[0].daily_loss.amount_pct across 247 configs. Explicit 0% is separate from missing data; a positive amount_abs without a positive percentage is counted separately. Positive percentages retain their own amount_basis and optional settings; no base conversion is performed.",
      "headline": "Recorded daily-loss values in the first modeled phase: 0% encoded 86 (34.8%); > 0–2% 29 (11.7%); > 2–3% 55 (22.3%); > 3–4% 42 (17.0%); > 4–5% 30 (12.1%); above 5% 5 (2.0%). Absolute cap without a positive percentage: 0; no percentage or positive absolute cap recorded: 0 (all percentages use n=247). Source-specific percentage bases and optional caps are retained, so these are not uniform mandatory limits; missing values do not establish no limit.",
      "corpus_date": "2026-07-16",
      "data": {
        "zero_recorded": 86,
        "le2": 29,
        "b2_3": 55,
        "b3_4": 42,
        "b4_5": 30,
        "gt5": 5,
        "absolute_only": 0,
        "not_recorded": 0,
        "positive_pct_basis_counts": {
          "day_start_balance": 94,
          "initial": 67
        },
        "optional_positive_pct": 3,
        "denominator": 247
      }
    },
    {
      "id": 5,
      "key": "consistency_rule_share_and_thresholds",
      "title": "Encoded consistency items + normalized thresholds",
      "n": 247,
      "computed": "Item presence counted from phases[0].consistency across 247 configs; thresholds are .limit values on items normalized as best_day_pct_of_total_profit. Threshold and other-metric counts count items, not distinct configs. Source profit denominators and enforcement stages can differ despite the shared normalized metric.",
      "headline": "63 of 247 configs (25.5%) have a consistency item encoded in the first modeled phase; 184 (74.5%) have no item encoded, which does not establish absence of a real-world rule. Among 60 items with the normalized best-day metric, recorded thresholds range 20%–55%, most commonly 40% (16 items) and 50% (13 items). A further 3 items use another normalized metric. These stored thresholds do not establish a shared source profit denominator or real-world enforcement stage.",
      "corpus_date": "2026-07-16",
      "data": {
        "item_encoded": 63,
        "no_item_encoded": 184,
        "normalized_best_day_item_n": 60,
        "normalized_best_day_limit_counts": {
          "20": 4,
          "30": 7,
          "33": 5,
          "34": 3,
          "35": 4,
          "40": 16,
          "50": 13,
          "55": 8
        },
        "other_item_n": 3,
        "denominator": 247
      }
    },
    {
      "id": 6,
      "key": "payout_cycle_distribution",
      "title": "Recorded payout-cycle day values",
      "n": 247,
      "computed": "Numeric buckets of payout.cycle_days across 247 configs. Null means no scalar cycle value recorded, including conditional choices or on-request arrangements; it does not establish an unknown payout policy.",
      "headline": "≤ 2 recorded days: 16 (6.5%). 3–9 recorded days: 42 (17.0%). 10–16 recorded days: 43 (17.4%). 17–35 recorded days: 11 (4.5%). > 35 recorded days: 0 (0.0%). No scalar cycle value recorded: 135 (54.7%). Source units include calendar, business, trading or qualifying days and conditions differ; these stored values cannot establish a uniform calendar payout cadence.",
      "corpus_date": "2026-07-16",
      "data": {
        "le2": 16,
        "b3_9": 42,
        "b10_16": 43,
        "b17_35": 11,
        "gt35": 0,
        "no_scalar_recorded": 135,
        "denominator": 247
      }
    },
    {
      "id": 7,
      "key": "min_trading_day_distribution",
      "title": "Minimum-trading-day distribution",
      "n": 247,
      "computed": "Counted from phases[0].min_trading_days across 247 configs, including direct-funded first phases; explicit zero is separate from an unrecorded value.",
      "headline": "Recorded minimum trading days in the first modeled phase: 0 days: 135 (54.7%); 1 day: 24 (9.7%); 2 days: 3 (1.2%); 3 days: 47 (19.0%); 4 days: 3 (1.2%); 5 days: 18 (7.3%); 10 days: 11 (4.5%); not recorded: 6 (2.4%).",
      "corpus_date": "2026-07-16",
      "data": {
        "0": 135,
        "1": 24,
        "2": 3,
        "3": 47,
        "4": 3,
        "5": 18,
        "10": 11,
        "not_recorded": 6,
        "denominator": 247
      }
    },
    {
      "id": 8,
      "key": "price_per_dollar_of_buffer",
      "title": "Recorded initial fee per $1 of initial modeled drawdown allowance",
      "n": 63,
      "computed": "Ratio of pricing.initial_fee to phases[0].max_drawdown.amount_abs, across the 63 of 247 configs where the fee and a positive initial modeled allowance are recorded; 184 excluded.",
      "headline": "Recorded initial fee per $1 of initial modeled drawdown allowance ranges 5.0¢–70.4¢, median 9.9¢ (n=63; 184 configs excluded). This uses the first modeled phase, including direct-funded plans; an initial fee is not necessarily an evaluation fee or a total lifetime cost.",
      "corpus_date": "2026-07-16",
      "data": {
        "denominator": 63,
        "excluded": 184,
        "min_ratio": 0.0495,
        "median_ratio": 0.099,
        "max_ratio": 0.704
      }
    },
    {
      "id": 9,
      "key": "rule_change_rate",
      "title": "Rule-change rate",
      "n": 60,
      "computed": "Read from research/rule-volatility-data.json findings (its own generator, its own dated snapshot) — canonical value-change and firm-rule-set counts, never recomputed here; rule sets are not a count of unique operators.",
      "headline": "11 canonical rule-value changes recorded across 60 firm rule sets, per the rule-volatility study dated 2026-09-11 (10 of 60 firm rule sets, 16.7%, show at least one; 0.058 value changes per raw touch).",
      "corpus_date": "2026-09-11",
      "data": {
        "total_value_changes": 11,
        "firm_count": 60,
        "firms_with_value_changes": 10,
        "firms_with_value_changes_pct": 16.7,
        "value_change_per_raw_touch": 0.058,
        "source_dated": "2026-09-11"
      }
    },
    {
      "id": 10,
      "key": "disconfirmation_signal_count",
      "title": "Recheck disconfirmation signal",
      "n": 60,
      "computed": "Read live from rules/freshness.json (dated 2026-10-15): a firm rule set is counted when its most recent recheck could not re-locate the previously-cited source sentence (last_disconfirmed set).",
      "headline": "41 of 60 firm rule sets (68.3%) carry a recheck signal that the last-cited source sentence could not be re-located (reasons: cited sentence no longer found: 21, page moved: 14, page gone: 4, site moved: 2). This is a source-stability signal, not a confirmed rule-value change — compare block 9’s 11 confirmed value changes across 10 firm rule sets. A disconfirmation prompts a re-read; it does not by itself mean the rule moved.",
      "corpus_date": "2026-10-15",
      "data": {
        "disconfirmed": 41,
        "denominator": 60,
        "reasons": {
          "cited_sentence_gone": 21,
          "path_moved": 14,
          "host_moved": 2,
          "dead": 4
        }
      }
    },
    {
      "id": 11,
      "key": "corpus_size",
      "title": "Corpus size",
      "n": 60,
      "computed": "Read from tools/corpus-sync.js computeCorpus(): firm-rule-set and account-size-configuration counts (not unique operators), plus the coverage-date guarantee (the oldest per-firm re-read anchor) and the most recent re-read.",
      "headline": "60 firm rule sets across 247 account-size configurations. Coverage date 2026-07-16 (every rule set re-read at least this recently); most recent re-read 2026-09-27.",
      "corpus_date": "2026-07-16",
      "data": {
        "firm_count": 60,
        "rule_set_count": 247,
        "coverage_date": "2026-07-16",
        "most_recent_re_read": "2026-09-27"
      }
    },
    {
      "id": 12,
      "key": "recheck_cadence",
      "title": "Gaps between recorded recheck entries",
      "n": 203,
      "computed": "Gaps in days between consecutive dated entries in each config’s own rechecks[] history, pooled across the 203 of 247 configs with 2+ dated rechecks.",
      "headline": "Median 30 days between recorded recheck entries on the same config (n=352 gap observations from 203 configs); range 1–74 days. Entries may be scoped rechecks and do not establish whole-plan verification cadence.",
      "corpus_date": "2026-07-16",
      "data": {
        "configs_with_multi_recheck": 203,
        "gap_observations": 352,
        "median_days": 30,
        "min_days": 1,
        "max_days": 74
      }
    }
  ]
}
