{
  "dynamic_return": {
    "definition": "Mean simulated future engagement/reward over a multi-chapter rollout after applying the method update.",
    "formula_pre": "DynamicReturn = E_t[ rating_t + 0.6*continue_t + 0.3*reread_t - 0.4*fast_swipe_t - 0.2*fatigue_t ]",
    "interpretation": "Higher is better; not bounded and should be compared across methods within the same scenario."
  },
  "expectation_alignment": {
    "definition": "How well the next direct-generation plan satisfies expectations created by earlier chapters and feedback.",
    "formula_pre": "ExpectationAlign = |matched_created_expectations| / (|created_expectations| + epsilon)",
    "interpretation": "Bounded [0,1]; higher means the planner used dynamic reader state rather than generic profile text."
  },
  "ncfu": {
    "definition": "Normalized causal future uplift against no-update and oracle-update controls.",
    "formula_pre": "NCFU = E[J(G(S_t ⊕ ΔS_model)) - J(G(S_t))] / (E[J(G(S_t ⊕ ΔS_gold)) - J(G(S_t))] + epsilon)",
    "interpretation": "Bounded [0,1] in this suite; higher means the update causes future improvement rather than just correlating with it."
  },
  "selectivity": {
    "definition": "Positive-probe uplift minus anti-probe harm/overgeneralization.",
    "formula_pre": "Selectivity = Uplift(Q_positive) - Harm(Q_anti_probe)",
    "interpretation": "Higher is better; a method can have high return but low selectivity if it overgeneralizes local feedback."
  },
  "regret_to_oracle": {
    "definition": "Regret-to-oracle: dynamic-return gap between method and hidden oracle state update.",
    "formula_pre": "RegretToOracle = DynamicReturn(oracle_update) - DynamicReturn(method)",
    "interpretation": "Lower is better; reports how much room remains before hidden-state upper bound."
  },
  "calibration_ece": {
    "definition": "Expected calibration error of simulator/user-state confidence bins.",
    "formula_pre": "ECE = Σ_b |B_b|/n · | accuracy(B_b) - confidence(B_b) |",
    "interpretation": "Lower is better; needed because implicit feedback and sarcasm are ambiguous."
  },
  "counterfactual_separation": {
    "definition": "Distance between outcomes under same text/different users and same user/different content axes.",
    "formula_pre": "CFS = E[ | f(u_i, x_a) - f(u_j, x_a) | + | f(u_i, x_a) - f(u_i, x_b) | ] / 2",
    "interpretation": "Higher means the simulator is not a static sentiment classifier."
  },
  "rollback_success": {
    "definition": "Fraction of corrected/retracted preference updates that are undone without harming later valid preferences.",
    "formula_pre": "RollbackSuccess = valid_retractions_repaired / (all_retractions + epsilon)",
    "interpretation": "Higher is better; requires TTL/provenance/scope in state diffs."
  },
  "behavioral_scar_rate": {
    "definition": "Rate at which an invalidated feedback update continues to affect future generation after rollback.",
    "formula_pre": "ScarRate = lingering_invalid_effects / (rollback_events + epsilon)",
    "interpretation": "Lower is better."
  },
  "contamination_leakage": {
    "definition": "Fraction of private user-preference updates that affect another user or global story state.",
    "formula_pre": "Leakage = cross_user_private_effects / (private_updates + epsilon)",
    "interpretation": "Lower is better; must be near zero for multi-user personalization."
  },
  "direct_generation_diversity": {
    "definition": "Diversity of direct chapter plans/excerpts produced under different reader states without reranking candidate sets.",
    "formula_pre": "Diversity = mean_pairwise_distance(plan_axes | same_story, different_user_state)",
    "interpretation": "Higher means the generator actually changes outputs with state; too high may hurt story coherence."
  },
  "no_reranking_compliance": {
    "definition": "Binary compliance flag that the method produced a direct plan/generation prompt rather than ranking K candidate chapters.",
    "formula_pre": "NoRerankingCompliance = 1[ no candidate_set and no reranked_candidates and uses_reranking=false ]",
    "interpretation": "Must be 1.0 for Lucian’s direct-generation research direction."
  }
}
