{
  "runtime_version": "3.0.0",
  "contract_version": "3.0",
  "state_schema_version": "3.0",
  "source_revision": "2026-09-17",
  "status": "current_for_new_sessions",
  "legacy_runtime": {
    "version": "2.x",
    "status": "supported_for_existing_sessions",
    "entry": "/ia/aventuras/sangre-y-poder/runtime-manifest.json",
    "rule": "Una sesión ya iniciada conserva su ruta, contrato y estado. No repite el probe ni cambia entre Free y Normal."
  },
  "capability": {
    "values": [
      "normal_ready",
      "free_ready",
      "unsupported",
      "not_evaluated"
    ],
    "evidence_values": [
      "externally_verified",
      "self_checked",
      "not_checked"
    ],
    "allowed_claim": "Se ha podido recuperar la documentación inicial requerida por esta ruta y resolver las comprobaciones de acceso y estado en este entorno.",
    "forbidden_claims": [
      "El agente puede completar toda Sangre y poder.",
      "Un plan o modelo comercial concreto garantiza la aventura.",
      "Un self_checked constituye certificación externa."
    ]
  },
  "legacy_adapter": {
    "PASS": {
      "historical_meaning": "Seleccionaba Free, también ante incertidumbre o lectura parcial.",
      "existing_session": "Preservar Free y la ruta bloqueada.",
      "new_session": "No traducir automáticamente. Evaluar los mínimos v3; si no pueden evaluarse, not_evaluated."
    },
    "NO_PASS": {
      "historical_meaning": "Seleccionaba Normal.",
      "existing_session": "Preservar Normal y la ruta bloqueada.",
      "new_session": "No autoriza por sí solo Normal; evaluar los mínimos v3."
    },
    "unknown": {
      "existing_session": "Preservar la ruta que ya conste en el estado.",
      "new_session": "not_evaluated"
    }
  },
  "resource_read_state": {
    "fields": [
      "resource_available",
      "header_read",
      "body_read",
      "body_verified"
    ],
    "rule": "Una cabecera o un marcador final no demuestra que se haya procesado el cuerpo.",
    "partial_read_rule": "Sin bloques autónomos expresamente autorizados, no resolver acciones significativas dependientes del cuerpo no leído."
  },
  "execution_order": [
    "resolve",
    "validate",
    "apply_effects",
    "persist_state",
    "record_event",
    "check_invariants",
    "authorize_transition"
  ],
  "invariants": [
    "state.dalma.vida.current <= state.dalma.vida.max",
    "state.economy.remaining_money >= 0",
    "null no se convierte en false sin evidencia",
    "event_id no se aplica dos veces",
    "unique_find_id no se concede dos veces",
    "terminal=true impide nuevas escenas con el mismo Dalma",
    "delivered_to_asher=true implica with_dalma=false",
    "scene_19_completed=true desactiva la variante A",
    "route_locked=true impide cambiar Free/Normal",
    "una transición requiere estado persistido y evento registrado"
  ],
  "state_aliases": {
    "equipo": "dalma.inventory.equipment",
    "equipment": "dalma.inventory.equipment",
    "dinero": "economy.remaining_money",
    "remaining_money": "economy.remaining_money",
    "vida": "dalma.vida.current",
    "PRI": "dalma.pri.current",
    "escena": "scene.current_id",
    "current_phase_id": "scene.current_id",
    "eventos": "events.applied_ids"
  },
  "scene_authority": {
    "registry": "/ia/aventuras/sangre-y-poder/v3/scene-registry.json",
    "rule": "Free y Normal proyectan la misma escena efectiva. Solo varían extensión, recuperación y contexto precargado."
  },
  "telemetry": {
    "tests_must_not_call": [
      "protocol_access",
      "adventure_start",
      "finish_success",
      "finish_death"
    ],
    "test_mode": "offline_deterministic",
    "fixtures_are_canon": false
  },
  "resume": {
    "required": [
      "session_id",
      "contract_version",
      "state_schema_version",
      "source_revision",
      "runtime_version",
      "route",
      "scene",
      "dalma",
      "economy",
      "events",
      "knowledge"
    ],
    "rule": "Recuperar estado, conservar la ruta bloqueada y pausar si falta información indispensable."
  }
}
