[
  {
    "id": "QA01",
    "title": "Compilación de producción del frontend",
    "layer": "Build",
    "role": "N/A",
    "status": "FAIL",
    "expected": "npm run build termina con código 0",
    "actual": "Código 2: cuatro errores TypeScript relacionados con FeedPost/Post/ACTION_LOG",
    "evidence": "frontend-build.log"
  },
  {
    "id": "QA02A",
    "title": "Catálogo sin sesión",
    "layer": "API + PostgreSQL",
    "role": "ANONYMOUS",
    "status": "PASS",
    "expected": "HTTP 401",
    "actual": "HTTP 401",
    "method": "GET",
    "path": "/api/v1/actions/",
    "request": null,
    "response": {
      "detail": "Authentication credentials were not provided."
    },
    "before": {
      "profiles": [
        {
          "user__first_name": "Ana",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Laura",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Diego",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        }
      ],
      "clans": [
        {
          "name": "Ingeniería QA",
          "total_points": 0,
          "deleted_at": null
        },
        {
          "name": "Ecoequipo QA",
          "total_points": 0,
          "deleted_at": null
        }
      ],
      "logs": [],
      "missions": [],
      "participants": 1,
      "badges": [],
      "notifications": [],
      "posts": 1
    },
    "after": {
      "profiles": [
        {
          "user__first_name": "Ana",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Laura",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Diego",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        }
      ],
      "clans": [
        {
          "name": "Ingeniería QA",
          "total_points": 0,
          "deleted_at": null
        },
        {
          "name": "Ecoequipo QA",
          "total_points": 0,
          "deleted_at": null
        }
      ],
      "logs": [],
      "missions": [],
      "participants": 1,
      "badges": [],
      "notifications": [],
      "posts": 1
    },
    "executedAt": "2026-10-02T05:12:21.702Z",
    "evidence": "evidence/QA02A.json"
  },
  {
    "id": "QA03",
    "title": "Catálogo UI con backend real",
    "layer": "UI → API",
    "role": "STUDENT",
    "status": "PASS",
    "expected": "Muestra tres acciones sintéticas de PostgreSQL",
    "actual": "Bicicleta 10, limpieza 20, termo 5; validación y factores visibles",
    "evidence": "evidence/01-catalogo.png"
  },
  {
    "id": "QA04",
    "title": "Registro UI persiste una acción",
    "layer": "UI → API → PostgreSQL",
    "role": "STUDENT",
    "status": "FAIL",
    "expected": "POST de registro y nuevo ActionLog",
    "actual": "Vista previa; 0 POST action-logs y 0 registros nuevos",
    "before": {
      "profiles": [
        {
          "user__first_name": "Ana",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Laura",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Diego",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        }
      ],
      "clans": [
        {
          "name": "Ingeniería QA",
          "total_points": 0,
          "deleted_at": null
        },
        {
          "name": "Ecoequipo QA",
          "total_points": 0,
          "deleted_at": null
        }
      ],
      "logs": [],
      "missions": [],
      "participants": 1,
      "badges": [],
      "notifications": [],
      "posts": 1
    },
    "after": {
      "profiles": [
        {
          "user__first_name": "Ana",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Laura",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Diego",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        }
      ],
      "clans": [
        {
          "name": "Ingeniería QA",
          "total_points": 0,
          "deleted_at": null
        },
        {
          "name": "Ecoequipo QA",
          "total_points": 0,
          "deleted_at": null
        }
      ],
      "logs": [],
      "missions": [],
      "participants": 1,
      "badges": [],
      "notifications": [],
      "posts": 1
    },
    "evidence": "evidence/02-registro-preview.png"
  },
  {
    "id": "QA05A",
    "title": "Acción sin fotografía acredita puntos",
    "layer": "API + PostgreSQL",
    "role": "student",
    "status": "PASS",
    "expected": "HTTP 201",
    "actual": "HTTP 201",
    "method": "POST",
    "path": "/api/v1/action-logs/",
    "request": {
      "action_id": "97ae8884-cdb7-4f7e-b9be-89147ce2ddc8",
      "idempotency_key": "class-qa-bike-1",
      "is_shared_publicly": true
    },
    "response": {
      "message": "Action logged successfully.",
      "status": "APPROVED",
      "log_id": "74f38290-7805-443a-9110-aafef9d88232"
    },
    "before": {
      "profiles": [
        {
          "user__first_name": "Ana",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Laura",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Diego",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        }
      ],
      "clans": [
        {
          "name": "Ingeniería QA",
          "total_points": 0,
          "deleted_at": null
        },
        {
          "name": "Ecoequipo QA",
          "total_points": 0,
          "deleted_at": null
        }
      ],
      "logs": [],
      "missions": [],
      "participants": 1,
      "badges": [],
      "notifications": [],
      "posts": 1
    },
    "after": {
      "profiles": [
        {
          "user__first_name": "Ana",
          "total_points": 10,
          "available_points": 10,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Laura",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Diego",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        }
      ],
      "clans": [
        {
          "name": "Ingeniería QA",
          "total_points": 10,
          "deleted_at": null
        },
        {
          "name": "Ecoequipo QA",
          "total_points": 10,
          "deleted_at": null
        }
      ],
      "logs": [
        {
          "id": "74f38290-7805-443a-9110-aafef9d88232",
          "status": "APPROVED",
          "points_awarded": 10,
          "co2_kg_factor_snapshot": "1.250",
          "idempotency_key": "class-qa-bike-1"
        }
      ],
      "missions": [
        {
          "mission__action__name": "Llegué en bicicleta",
          "current_count": 1,
          "is_completed": false
        }
      ],
      "participants": 1,
      "badges": [
        {
          "user__first_name": "Ana",
          "badge__name": "Primer paso QA"
        }
      ],
      "notifications": [
        {
          "title": "¡Nueva medalla desbloqueada!",
          "notification_type": "BADGE_EARNED",
          "is_read": false
        }
      ],
      "posts": 2
    },
    "executedAt": "2026-10-02T05:12:45.081Z",
    "evidence": "evidence/QA05A.json"
  },
  {
    "id": "QA05B",
    "title": "Reintento idempotente de acción",
    "layer": "API + PostgreSQL",
    "role": "student",
    "status": "FAIL",
    "expected": "Respuesta controlada y estado consistente",
    "actual": "HTTP 500",
    "method": "POST",
    "path": "/api/v1/action-logs/",
    "request": {
      "action_id": "97ae8884-cdb7-4f7e-b9be-89147ce2ddc8",
      "idempotency_key": "class-qa-bike-1",
      "is_shared_publicly": true
    },
    "response": {
      "detail": "Respuesta HTML HTTP 500. Se excluye la página de depuración para no exponer configuración."
    },
    "before": {
      "profiles": [
        {
          "user__first_name": "Ana",
          "total_points": 10,
          "available_points": 10,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Laura",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Diego",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        }
      ],
      "clans": [
        {
          "name": "Ingeniería QA",
          "total_points": 10,
          "deleted_at": null
        },
        {
          "name": "Ecoequipo QA",
          "total_points": 10,
          "deleted_at": null
        }
      ],
      "logs": [
        {
          "id": "74f38290-7805-443a-9110-aafef9d88232",
          "status": "APPROVED",
          "points_awarded": 10,
          "co2_kg_factor_snapshot": "1.250",
          "idempotency_key": "class-qa-bike-1"
        }
      ],
      "missions": [
        {
          "mission__action__name": "Llegué en bicicleta",
          "current_count": 1,
          "is_completed": false
        }
      ],
      "participants": 1,
      "badges": [
        {
          "user__first_name": "Ana",
          "badge__name": "Primer paso QA"
        }
      ],
      "notifications": [
        {
          "title": "¡Nueva medalla desbloqueada!",
          "notification_type": "BADGE_EARNED",
          "is_read": false
        }
      ],
      "posts": 2
    },
    "after": {
      "profiles": [
        {
          "user__first_name": "Ana",
          "total_points": 10,
          "available_points": 10,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Laura",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Diego",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        }
      ],
      "clans": [
        {
          "name": "Ingeniería QA",
          "total_points": 10,
          "deleted_at": null
        },
        {
          "name": "Ecoequipo QA",
          "total_points": 10,
          "deleted_at": null
        }
      ],
      "logs": [
        {
          "id": "74f38290-7805-443a-9110-aafef9d88232",
          "status": "APPROVED",
          "points_awarded": 10,
          "co2_kg_factor_snapshot": "1.250",
          "idempotency_key": "class-qa-bike-1"
        }
      ],
      "missions": [
        {
          "mission__action__name": "Llegué en bicicleta",
          "current_count": 1,
          "is_completed": false
        }
      ],
      "participants": 1,
      "badges": [
        {
          "user__first_name": "Ana",
          "badge__name": "Primer paso QA"
        }
      ],
      "notifications": [
        {
          "title": "¡Nueva medalla desbloqueada!",
          "notification_type": "BADGE_EARNED",
          "is_read": false
        }
      ],
      "posts": 2
    },
    "executedAt": "2026-10-02T05:12:46.129Z",
    "evidence": "evidence/QA05B.json"
  },
  {
    "id": "QA06A",
    "title": "Referencia PHOTO queda pendiente sin acreditar",
    "layer": "API + PostgreSQL",
    "role": "student",
    "status": "PASS",
    "expected": "HTTP 201",
    "actual": "HTTP 201",
    "method": "POST",
    "path": "/api/v1/action-logs/",
    "request": {
      "action_id": "40252720-2a6c-4873-a031-3cebbc92b0a8",
      "idempotency_key": "class-qa-photo-1",
      "evidence_object_key": "synthetic-qa/no-real-upload.jpg"
    },
    "response": {
      "message": "Action logged successfully.",
      "status": "PENDING_AUDIT",
      "log_id": "67970d97-5bb4-4804-9b93-8df76040ac4e"
    },
    "before": {
      "profiles": [
        {
          "user__first_name": "Ana",
          "total_points": 10,
          "available_points": 10,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Laura",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Diego",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        }
      ],
      "clans": [
        {
          "name": "Ingeniería QA",
          "total_points": 10,
          "deleted_at": null
        },
        {
          "name": "Ecoequipo QA",
          "total_points": 10,
          "deleted_at": null
        }
      ],
      "logs": [
        {
          "id": "74f38290-7805-443a-9110-aafef9d88232",
          "status": "APPROVED",
          "points_awarded": 10,
          "co2_kg_factor_snapshot": "1.250",
          "idempotency_key": "class-qa-bike-1"
        }
      ],
      "missions": [
        {
          "mission__action__name": "Llegué en bicicleta",
          "current_count": 1,
          "is_completed": false
        }
      ],
      "participants": 1,
      "badges": [
        {
          "user__first_name": "Ana",
          "badge__name": "Primer paso QA"
        }
      ],
      "notifications": [
        {
          "title": "¡Nueva medalla desbloqueada!",
          "notification_type": "BADGE_EARNED",
          "is_read": false
        }
      ],
      "posts": 2
    },
    "after": {
      "profiles": [
        {
          "user__first_name": "Ana",
          "total_points": 10,
          "available_points": 10,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Laura",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Diego",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        }
      ],
      "clans": [
        {
          "name": "Ingeniería QA",
          "total_points": 10,
          "deleted_at": null
        },
        {
          "name": "Ecoequipo QA",
          "total_points": 10,
          "deleted_at": null
        }
      ],
      "logs": [
        {
          "id": "74f38290-7805-443a-9110-aafef9d88232",
          "status": "APPROVED",
          "points_awarded": 10,
          "co2_kg_factor_snapshot": "1.250",
          "idempotency_key": "class-qa-bike-1"
        },
        {
          "id": "67970d97-5bb4-4804-9b93-8df76040ac4e",
          "status": "PENDING_AUDIT",
          "points_awarded": 20,
          "co2_kg_factor_snapshot": "0.100",
          "idempotency_key": "class-qa-photo-1"
        }
      ],
      "missions": [
        {
          "mission__action__name": "Llegué en bicicleta",
          "current_count": 1,
          "is_completed": false
        }
      ],
      "participants": 1,
      "badges": [
        {
          "user__first_name": "Ana",
          "badge__name": "Primer paso QA"
        }
      ],
      "notifications": [
        {
          "title": "¡Nueva medalla desbloqueada!",
          "notification_type": "BADGE_EARNED",
          "is_read": false
        }
      ],
      "posts": 2
    },
    "executedAt": "2026-10-02T05:12:47.337Z",
    "evidence": "evidence/QA06A.json"
  },
  {
    "id": "QA06B",
    "title": "Estudiante no puede auditar",
    "layer": "API + PostgreSQL",
    "role": "student",
    "status": "PASS",
    "expected": "HTTP 403",
    "actual": "HTTP 403",
    "method": "PATCH",
    "path": "/api/v1/action-logs/67970d97-5bb4-4804-9b93-8df76040ac4e/audit/",
    "request": {
      "status": "APPROVED"
    },
    "response": {
      "detail": "You do not have permission to perform this action."
    },
    "before": {
      "profiles": [
        {
          "user__first_name": "Ana",
          "total_points": 10,
          "available_points": 10,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Laura",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Diego",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        }
      ],
      "clans": [
        {
          "name": "Ingeniería QA",
          "total_points": 10,
          "deleted_at": null
        },
        {
          "name": "Ecoequipo QA",
          "total_points": 10,
          "deleted_at": null
        }
      ],
      "logs": [
        {
          "id": "74f38290-7805-443a-9110-aafef9d88232",
          "status": "APPROVED",
          "points_awarded": 10,
          "co2_kg_factor_snapshot": "1.250",
          "idempotency_key": "class-qa-bike-1"
        },
        {
          "id": "67970d97-5bb4-4804-9b93-8df76040ac4e",
          "status": "PENDING_AUDIT",
          "points_awarded": 20,
          "co2_kg_factor_snapshot": "0.100",
          "idempotency_key": "class-qa-photo-1"
        }
      ],
      "missions": [
        {
          "mission__action__name": "Llegué en bicicleta",
          "current_count": 1,
          "is_completed": false
        }
      ],
      "participants": 1,
      "badges": [
        {
          "user__first_name": "Ana",
          "badge__name": "Primer paso QA"
        }
      ],
      "notifications": [
        {
          "title": "¡Nueva medalla desbloqueada!",
          "notification_type": "BADGE_EARNED",
          "is_read": false
        }
      ],
      "posts": 2
    },
    "after": {
      "profiles": [
        {
          "user__first_name": "Ana",
          "total_points": 10,
          "available_points": 10,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Laura",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Diego",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        }
      ],
      "clans": [
        {
          "name": "Ingeniería QA",
          "total_points": 10,
          "deleted_at": null
        },
        {
          "name": "Ecoequipo QA",
          "total_points": 10,
          "deleted_at": null
        }
      ],
      "logs": [
        {
          "id": "74f38290-7805-443a-9110-aafef9d88232",
          "status": "APPROVED",
          "points_awarded": 10,
          "co2_kg_factor_snapshot": "1.250",
          "idempotency_key": "class-qa-bike-1"
        },
        {
          "id": "67970d97-5bb4-4804-9b93-8df76040ac4e",
          "status": "PENDING_AUDIT",
          "points_awarded": 20,
          "co2_kg_factor_snapshot": "0.100",
          "idempotency_key": "class-qa-photo-1"
        }
      ],
      "missions": [
        {
          "mission__action__name": "Llegué en bicicleta",
          "current_count": 1,
          "is_completed": false
        }
      ],
      "participants": 1,
      "badges": [
        {
          "user__first_name": "Ana",
          "badge__name": "Primer paso QA"
        }
      ],
      "notifications": [
        {
          "title": "¡Nueva medalla desbloqueada!",
          "notification_type": "BADGE_EARNED",
          "is_read": false
        }
      ],
      "posts": 2
    },
    "executedAt": "2026-10-02T05:12:48.419Z",
    "evidence": "evidence/QA06B.json"
  },
  {
    "id": "QA06C",
    "title": "Bandeja UI de auditoría carga pendientes",
    "layer": "UI → API",
    "role": "ADMIN",
    "status": "FAIL",
    "expected": "Lista el registro PHOTO pendiente",
    "actual": "GET de pendientes → HTTP 405",
    "evidence": "evidence/QA06C.json",
    "response": {
      "detail": "Method \"GET\" not allowed."
    },
    "method": "GET",
    "path": "/api/v1/action-logs/?status=PENDING_AUDIT",
    "screenshot": "evidence/QA06C.json"
  },
  {
    "id": "QA06D",
    "title": "Administrador aprueba PHOTO por API",
    "layer": "API + PostgreSQL",
    "role": "admin",
    "status": "PASS",
    "expected": "HTTP 200",
    "actual": "HTTP 200",
    "method": "PATCH",
    "path": "/api/v1/action-logs/67970d97-5bb4-4804-9b93-8df76040ac4e/audit/",
    "request": {
      "status": "APPROVED"
    },
    "response": {
      "message": "Action log approved successfully."
    },
    "before": {
      "profiles": [
        {
          "user__first_name": "Ana",
          "total_points": 10,
          "available_points": 10,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Laura",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Diego",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        }
      ],
      "clans": [
        {
          "name": "Ingeniería QA",
          "total_points": 10,
          "deleted_at": null
        },
        {
          "name": "Ecoequipo QA",
          "total_points": 10,
          "deleted_at": null
        }
      ],
      "logs": [
        {
          "id": "74f38290-7805-443a-9110-aafef9d88232",
          "status": "APPROVED",
          "points_awarded": 10,
          "co2_kg_factor_snapshot": "1.250",
          "idempotency_key": "class-qa-bike-1"
        },
        {
          "id": "67970d97-5bb4-4804-9b93-8df76040ac4e",
          "status": "PENDING_AUDIT",
          "points_awarded": 20,
          "co2_kg_factor_snapshot": "0.100",
          "idempotency_key": "class-qa-photo-1"
        }
      ],
      "missions": [
        {
          "mission__action__name": "Llegué en bicicleta",
          "current_count": 1,
          "is_completed": false
        }
      ],
      "participants": 1,
      "badges": [
        {
          "user__first_name": "Ana",
          "badge__name": "Primer paso QA"
        }
      ],
      "notifications": [
        {
          "title": "¡Nueva medalla desbloqueada!",
          "notification_type": "BADGE_EARNED",
          "is_read": false
        }
      ],
      "posts": 2
    },
    "after": {
      "profiles": [
        {
          "user__first_name": "Ana",
          "total_points": 30,
          "available_points": 30,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Laura",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Diego",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        }
      ],
      "clans": [
        {
          "name": "Ingeniería QA",
          "total_points": 30,
          "deleted_at": null
        },
        {
          "name": "Ecoequipo QA",
          "total_points": 30,
          "deleted_at": null
        }
      ],
      "logs": [
        {
          "id": "74f38290-7805-443a-9110-aafef9d88232",
          "status": "APPROVED",
          "points_awarded": 10,
          "co2_kg_factor_snapshot": "1.250",
          "idempotency_key": "class-qa-bike-1"
        },
        {
          "id": "67970d97-5bb4-4804-9b93-8df76040ac4e",
          "status": "APPROVED",
          "points_awarded": 20,
          "co2_kg_factor_snapshot": "0.100",
          "idempotency_key": "class-qa-photo-1"
        }
      ],
      "missions": [
        {
          "mission__action__name": "Llegué en bicicleta",
          "current_count": 1,
          "is_completed": false
        },
        {
          "mission__action__name": "Participé en limpieza",
          "current_count": 1,
          "is_completed": true
        }
      ],
      "participants": 1,
      "badges": [
        {
          "user__first_name": "Ana",
          "badge__name": "Primer paso QA"
        }
      ],
      "notifications": [
        {
          "title": "¡Misión completada!",
          "notification_type": "MISSION_COMPLETED",
          "is_read": false
        },
        {
          "title": "¡Nueva medalla desbloqueada!",
          "notification_type": "BADGE_EARNED",
          "is_read": false
        }
      ],
      "posts": 2
    },
    "executedAt": "2026-10-02T05:12:56.656Z",
    "evidence": "evidence/QA06D.json"
  },
  {
    "id": "QA06E",
    "title": "Revocación revierte puntos y misión",
    "layer": "API + PostgreSQL",
    "role": "admin",
    "status": "PASS",
    "expected": "HTTP 200",
    "actual": "HTTP 200",
    "method": "PATCH",
    "path": "/api/v1/action-logs/67970d97-5bb4-4804-9b93-8df76040ac4e/audit/",
    "request": {
      "status": "REJECTED",
      "rejection_reason": "Prueba QA: referencia sintética; no se cargó fotografía real."
    },
    "response": {
      "message": "Action log rejected successfully."
    },
    "before": {
      "profiles": [
        {
          "user__first_name": "Ana",
          "total_points": 30,
          "available_points": 30,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Laura",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Diego",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        }
      ],
      "clans": [
        {
          "name": "Ingeniería QA",
          "total_points": 30,
          "deleted_at": null
        },
        {
          "name": "Ecoequipo QA",
          "total_points": 30,
          "deleted_at": null
        }
      ],
      "logs": [
        {
          "id": "74f38290-7805-443a-9110-aafef9d88232",
          "status": "APPROVED",
          "points_awarded": 10,
          "co2_kg_factor_snapshot": "1.250",
          "idempotency_key": "class-qa-bike-1"
        },
        {
          "id": "67970d97-5bb4-4804-9b93-8df76040ac4e",
          "status": "APPROVED",
          "points_awarded": 20,
          "co2_kg_factor_snapshot": "0.100",
          "idempotency_key": "class-qa-photo-1"
        }
      ],
      "missions": [
        {
          "mission__action__name": "Llegué en bicicleta",
          "current_count": 1,
          "is_completed": false
        },
        {
          "mission__action__name": "Participé en limpieza",
          "current_count": 1,
          "is_completed": true
        }
      ],
      "participants": 1,
      "badges": [
        {
          "user__first_name": "Ana",
          "badge__name": "Primer paso QA"
        }
      ],
      "notifications": [
        {
          "title": "¡Misión completada!",
          "notification_type": "MISSION_COMPLETED",
          "is_read": false
        },
        {
          "title": "¡Nueva medalla desbloqueada!",
          "notification_type": "BADGE_EARNED",
          "is_read": false
        }
      ],
      "posts": 2
    },
    "after": {
      "profiles": [
        {
          "user__first_name": "Ana",
          "total_points": 10,
          "available_points": 10,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Laura",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Diego",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        }
      ],
      "clans": [
        {
          "name": "Ingeniería QA",
          "total_points": 10,
          "deleted_at": null
        },
        {
          "name": "Ecoequipo QA",
          "total_points": 10,
          "deleted_at": null
        }
      ],
      "logs": [
        {
          "id": "74f38290-7805-443a-9110-aafef9d88232",
          "status": "APPROVED",
          "points_awarded": 10,
          "co2_kg_factor_snapshot": "1.250",
          "idempotency_key": "class-qa-bike-1"
        },
        {
          "id": "67970d97-5bb4-4804-9b93-8df76040ac4e",
          "status": "REJECTED",
          "points_awarded": 20,
          "co2_kg_factor_snapshot": "0.100",
          "idempotency_key": "class-qa-photo-1"
        }
      ],
      "missions": [
        {
          "mission__action__name": "Llegué en bicicleta",
          "current_count": 1,
          "is_completed": false
        },
        {
          "mission__action__name": "Participé en limpieza",
          "current_count": 0,
          "is_completed": false
        }
      ],
      "participants": 1,
      "badges": [
        {
          "user__first_name": "Ana",
          "badge__name": "Primer paso QA"
        }
      ],
      "notifications": [
        {
          "title": "Evidencia Rechazada",
          "notification_type": "AUDIT_REJECT",
          "is_read": false
        },
        {
          "title": "¡Misión completada!",
          "notification_type": "MISSION_COMPLETED",
          "is_read": false
        },
        {
          "title": "¡Nueva medalla desbloqueada!",
          "notification_type": "BADGE_EARNED",
          "is_read": false
        }
      ],
      "posts": 2
    },
    "executedAt": "2026-10-02T05:12:57.749Z",
    "evidence": "evidence/QA06E.json"
  },
  {
    "id": "QA07A",
    "title": "Progreso de misión derivado de acción aprobada",
    "layer": "API + PostgreSQL",
    "role": "student",
    "status": "PASS",
    "expected": "HTTP 200",
    "actual": "HTTP 200",
    "method": "GET",
    "path": "/api/v1/missions/625185de-8019-49ec-bcf3-3199f68bd6d0/progress/",
    "request": null,
    "response": {
      "mission": "625185de-8019-49ec-bcf3-3199f68bd6d0",
      "current_count": 1,
      "is_completed": false,
      "target_count": 2,
      "progress_percentage": 50
    },
    "before": {
      "profiles": [
        {
          "user__first_name": "Ana",
          "total_points": 10,
          "available_points": 10,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Laura",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Diego",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        }
      ],
      "clans": [
        {
          "name": "Ingeniería QA",
          "total_points": 10,
          "deleted_at": null
        },
        {
          "name": "Ecoequipo QA",
          "total_points": 10,
          "deleted_at": null
        }
      ],
      "logs": [
        {
          "id": "74f38290-7805-443a-9110-aafef9d88232",
          "status": "APPROVED",
          "points_awarded": 10,
          "co2_kg_factor_snapshot": "1.250",
          "idempotency_key": "class-qa-bike-1"
        },
        {
          "id": "67970d97-5bb4-4804-9b93-8df76040ac4e",
          "status": "REJECTED",
          "points_awarded": 20,
          "co2_kg_factor_snapshot": "0.100",
          "idempotency_key": "class-qa-photo-1"
        }
      ],
      "missions": [
        {
          "mission__action__name": "Llegué en bicicleta",
          "current_count": 1,
          "is_completed": false
        },
        {
          "mission__action__name": "Participé en limpieza",
          "current_count": 0,
          "is_completed": false
        }
      ],
      "participants": 1,
      "badges": [
        {
          "user__first_name": "Ana",
          "badge__name": "Primer paso QA"
        }
      ],
      "notifications": [
        {
          "title": "Evidencia Rechazada",
          "notification_type": "AUDIT_REJECT",
          "is_read": false
        },
        {
          "title": "¡Misión completada!",
          "notification_type": "MISSION_COMPLETED",
          "is_read": false
        },
        {
          "title": "¡Nueva medalla desbloqueada!",
          "notification_type": "BADGE_EARNED",
          "is_read": false
        }
      ],
      "posts": 2
    },
    "after": {
      "profiles": [
        {
          "user__first_name": "Ana",
          "total_points": 10,
          "available_points": 10,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Laura",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Diego",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        }
      ],
      "clans": [
        {
          "name": "Ingeniería QA",
          "total_points": 10,
          "deleted_at": null
        },
        {
          "name": "Ecoequipo QA",
          "total_points": 10,
          "deleted_at": null
        }
      ],
      "logs": [
        {
          "id": "74f38290-7805-443a-9110-aafef9d88232",
          "status": "APPROVED",
          "points_awarded": 10,
          "co2_kg_factor_snapshot": "1.250",
          "idempotency_key": "class-qa-bike-1"
        },
        {
          "id": "67970d97-5bb4-4804-9b93-8df76040ac4e",
          "status": "REJECTED",
          "points_awarded": 20,
          "co2_kg_factor_snapshot": "0.100",
          "idempotency_key": "class-qa-photo-1"
        }
      ],
      "missions": [
        {
          "mission__action__name": "Llegué en bicicleta",
          "current_count": 1,
          "is_completed": false
        },
        {
          "mission__action__name": "Participé en limpieza",
          "current_count": 0,
          "is_completed": false
        }
      ],
      "participants": 1,
      "badges": [
        {
          "user__first_name": "Ana",
          "badge__name": "Primer paso QA"
        }
      ],
      "notifications": [
        {
          "title": "Evidencia Rechazada",
          "notification_type": "AUDIT_REJECT",
          "is_read": false
        },
        {
          "title": "¡Misión completada!",
          "notification_type": "MISSION_COMPLETED",
          "is_read": false
        },
        {
          "title": "¡Nueva medalla desbloqueada!",
          "notification_type": "BADGE_EARNED",
          "is_read": false
        }
      ],
      "posts": 2
    },
    "executedAt": "2026-10-02T05:12:58.732Z",
    "evidence": "evidence/QA07A.json"
  },
  {
    "id": "QA07B",
    "title": "Inscripción a campaña desde UI",
    "layer": "UI → API → PostgreSQL",
    "role": "STUDENT",
    "status": "PASS",
    "expected": "Una nueva participación persistida",
    "actual": "2 participaciones totales; inició con 1",
    "evidence": "evidence/04-campanas.png"
  },
  {
    "id": "QA08A",
    "title": "Ranking de usuarios",
    "layer": "API + PostgreSQL",
    "role": "student",
    "status": "PASS",
    "expected": "HTTP 200",
    "actual": "HTTP 200",
    "method": "GET",
    "path": "/api/v1/rankings/users/",
    "request": null,
    "response": {
      "count": 3,
      "next": null,
      "previous": null,
      "results": [
        {
          "id": "a9282d7c-96ed-49dd-ad56-4923c5b3d2e0",
          "rank": 1,
          "display_name": "Ana QA",
          "total_points": 10
        },
        {
          "id": "68ca513f-feb3-46a2-b766-e4c18ff2ffd0",
          "rank": 2,
          "display_name": "Laura QA",
          "total_points": 0
        },
        {
          "id": "cac7c272-e9ef-4942-8ec8-bd640d752e4f",
          "rank": 2,
          "display_name": "Diego QA",
          "total_points": 0
        }
      ]
    },
    "before": {
      "profiles": [
        {
          "user__first_name": "Ana",
          "total_points": 10,
          "available_points": 10,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Laura",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Diego",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        }
      ],
      "clans": [
        {
          "name": "Ingeniería QA",
          "total_points": 10,
          "deleted_at": null
        },
        {
          "name": "Ecoequipo QA",
          "total_points": 10,
          "deleted_at": null
        }
      ],
      "logs": [
        {
          "id": "74f38290-7805-443a-9110-aafef9d88232",
          "status": "APPROVED",
          "points_awarded": 10,
          "co2_kg_factor_snapshot": "1.250",
          "idempotency_key": "class-qa-bike-1"
        },
        {
          "id": "67970d97-5bb4-4804-9b93-8df76040ac4e",
          "status": "REJECTED",
          "points_awarded": 20,
          "co2_kg_factor_snapshot": "0.100",
          "idempotency_key": "class-qa-photo-1"
        }
      ],
      "missions": [
        {
          "mission__action__name": "Llegué en bicicleta",
          "current_count": 1,
          "is_completed": false
        },
        {
          "mission__action__name": "Participé en limpieza",
          "current_count": 0,
          "is_completed": false
        }
      ],
      "participants": 2,
      "badges": [
        {
          "user__first_name": "Ana",
          "badge__name": "Primer paso QA"
        }
      ],
      "notifications": [
        {
          "title": "Evidencia Rechazada",
          "notification_type": "AUDIT_REJECT",
          "is_read": false
        },
        {
          "title": "¡Misión completada!",
          "notification_type": "MISSION_COMPLETED",
          "is_read": false
        },
        {
          "title": "¡Nueva medalla desbloqueada!",
          "notification_type": "BADGE_EARNED",
          "is_read": false
        }
      ],
      "posts": 2
    },
    "after": {
      "profiles": [
        {
          "user__first_name": "Ana",
          "total_points": 10,
          "available_points": 10,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Laura",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Diego",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        }
      ],
      "clans": [
        {
          "name": "Ingeniería QA",
          "total_points": 10,
          "deleted_at": null
        },
        {
          "name": "Ecoequipo QA",
          "total_points": 10,
          "deleted_at": null
        }
      ],
      "logs": [
        {
          "id": "74f38290-7805-443a-9110-aafef9d88232",
          "status": "APPROVED",
          "points_awarded": 10,
          "co2_kg_factor_snapshot": "1.250",
          "idempotency_key": "class-qa-bike-1"
        },
        {
          "id": "67970d97-5bb4-4804-9b93-8df76040ac4e",
          "status": "REJECTED",
          "points_awarded": 20,
          "co2_kg_factor_snapshot": "0.100",
          "idempotency_key": "class-qa-photo-1"
        }
      ],
      "missions": [
        {
          "mission__action__name": "Llegué en bicicleta",
          "current_count": 1,
          "is_completed": false
        },
        {
          "mission__action__name": "Participé en limpieza",
          "current_count": 0,
          "is_completed": false
        }
      ],
      "participants": 2,
      "badges": [
        {
          "user__first_name": "Ana",
          "badge__name": "Primer paso QA"
        }
      ],
      "notifications": [
        {
          "title": "Evidencia Rechazada",
          "notification_type": "AUDIT_REJECT",
          "is_read": false
        },
        {
          "title": "¡Misión completada!",
          "notification_type": "MISSION_COMPLETED",
          "is_read": false
        },
        {
          "title": "¡Nueva medalla desbloqueada!",
          "notification_type": "BADGE_EARNED",
          "is_read": false
        }
      ],
      "posts": 2
    },
    "executedAt": "2026-10-02T05:13:12.556Z",
    "evidence": "evidence/QA08A.json"
  },
  {
    "id": "QA08B",
    "title": "Ranking de equipos disponible en UI",
    "layer": "UI → API",
    "role": "STUDENT",
    "status": "FAIL",
    "expected": "Lista de clanes ordenados",
    "actual": "GET de ranking de clanes → HTTP 404",
    "evidence": "evidence/QA08B.json",
    "method": "GET",
    "path": "/api/v1/rankings/clans/",
    "screenshot": "evidence/QA08B.json",
    "response": {
      "detail": "HTTP 404; ruta no disponible; HTML de depuración excluido"
    }
  },
  {
    "id": "QA09A",
    "title": "Crear publicación propia en feed",
    "layer": "API + PostgreSQL",
    "role": "student",
    "status": "PASS",
    "expected": "HTTP 201",
    "actual": "HTTP 201",
    "method": "POST",
    "path": "/api/v1/feed/",
    "request": {
      "post_type": "SHARED_EVIDENCE",
      "content": "Prueba QA: reutilicé mi termo en el campus. Datos sintéticos."
    },
    "response": {
      "id": 3,
      "author": {
        "id": "a9282d7c-96ed-49dd-ad56-4923c5b3d2e0",
        "first_name": "Ana",
        "last_name": "QA"
      },
      "author_id": "a9282d7c-96ed-49dd-ad56-4923c5b3d2e0",
      "post_type": "SHARED_EVIDENCE",
      "content": "Prueba QA: reutilicé mi termo en el campus. Datos sintéticos.",
      "image_url": "",
      "badge_info": null,
      "relative_time": "hace un momento",
      "created_at": "2026-10-01T23:13:22.221581-06:00",
      "updated_at": "2026-10-01T23:13:22.221615-06:00"
    },
    "before": {
      "profiles": [
        {
          "user__first_name": "Ana",
          "total_points": 10,
          "available_points": 10,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Laura",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Diego",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        }
      ],
      "clans": [
        {
          "name": "Ingeniería QA",
          "total_points": 10,
          "deleted_at": null
        },
        {
          "name": "Ecoequipo QA",
          "total_points": 10,
          "deleted_at": null
        }
      ],
      "logs": [
        {
          "id": "74f38290-7805-443a-9110-aafef9d88232",
          "status": "APPROVED",
          "points_awarded": 10,
          "co2_kg_factor_snapshot": "1.250",
          "idempotency_key": "class-qa-bike-1"
        },
        {
          "id": "67970d97-5bb4-4804-9b93-8df76040ac4e",
          "status": "REJECTED",
          "points_awarded": 20,
          "co2_kg_factor_snapshot": "0.100",
          "idempotency_key": "class-qa-photo-1"
        }
      ],
      "missions": [
        {
          "mission__action__name": "Llegué en bicicleta",
          "current_count": 1,
          "is_completed": false
        },
        {
          "mission__action__name": "Participé en limpieza",
          "current_count": 0,
          "is_completed": false
        }
      ],
      "participants": 2,
      "badges": [
        {
          "user__first_name": "Ana",
          "badge__name": "Primer paso QA"
        }
      ],
      "notifications": [
        {
          "title": "Evidencia Rechazada",
          "notification_type": "AUDIT_REJECT",
          "is_read": false
        },
        {
          "title": "¡Misión completada!",
          "notification_type": "MISSION_COMPLETED",
          "is_read": false
        },
        {
          "title": "¡Nueva medalla desbloqueada!",
          "notification_type": "BADGE_EARNED",
          "is_read": false
        }
      ],
      "posts": 2
    },
    "after": {
      "profiles": [
        {
          "user__first_name": "Ana",
          "total_points": 10,
          "available_points": 10,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Laura",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Diego",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        }
      ],
      "clans": [
        {
          "name": "Ingeniería QA",
          "total_points": 10,
          "deleted_at": null
        },
        {
          "name": "Ecoequipo QA",
          "total_points": 10,
          "deleted_at": null
        }
      ],
      "logs": [
        {
          "id": "74f38290-7805-443a-9110-aafef9d88232",
          "status": "APPROVED",
          "points_awarded": 10,
          "co2_kg_factor_snapshot": "1.250",
          "idempotency_key": "class-qa-bike-1"
        },
        {
          "id": "67970d97-5bb4-4804-9b93-8df76040ac4e",
          "status": "REJECTED",
          "points_awarded": 20,
          "co2_kg_factor_snapshot": "0.100",
          "idempotency_key": "class-qa-photo-1"
        }
      ],
      "missions": [
        {
          "mission__action__name": "Llegué en bicicleta",
          "current_count": 1,
          "is_completed": false
        },
        {
          "mission__action__name": "Participé en limpieza",
          "current_count": 0,
          "is_completed": false
        }
      ],
      "participants": 2,
      "badges": [
        {
          "user__first_name": "Ana",
          "badge__name": "Primer paso QA"
        }
      ],
      "notifications": [
        {
          "title": "Evidencia Rechazada",
          "notification_type": "AUDIT_REJECT",
          "is_read": false
        },
        {
          "title": "¡Misión completada!",
          "notification_type": "MISSION_COMPLETED",
          "is_read": false
        },
        {
          "title": "¡Nueva medalla desbloqueada!",
          "notification_type": "BADGE_EARNED",
          "is_read": false
        }
      ],
      "posts": 3
    },
    "executedAt": "2026-10-02T05:13:21.609Z",
    "evidence": "evidence/QA09A.json"
  },
  {
    "id": "QA09B",
    "title": "Otro usuario no edita publicación ajena",
    "layer": "API + PostgreSQL",
    "role": "outsider",
    "status": "PASS",
    "expected": "HTTP 403",
    "actual": "HTTP 403",
    "method": "PATCH",
    "path": "/api/v1/feed/3/",
    "request": {
      "content": "Intento no autorizado QA"
    },
    "response": {
      "detail": "You do not have permission to perform this action."
    },
    "before": {
      "profiles": [
        {
          "user__first_name": "Ana",
          "total_points": 10,
          "available_points": 10,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Laura",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Diego",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        }
      ],
      "clans": [
        {
          "name": "Ingeniería QA",
          "total_points": 10,
          "deleted_at": null
        },
        {
          "name": "Ecoequipo QA",
          "total_points": 10,
          "deleted_at": null
        }
      ],
      "logs": [
        {
          "id": "74f38290-7805-443a-9110-aafef9d88232",
          "status": "APPROVED",
          "points_awarded": 10,
          "co2_kg_factor_snapshot": "1.250",
          "idempotency_key": "class-qa-bike-1"
        },
        {
          "id": "67970d97-5bb4-4804-9b93-8df76040ac4e",
          "status": "REJECTED",
          "points_awarded": 20,
          "co2_kg_factor_snapshot": "0.100",
          "idempotency_key": "class-qa-photo-1"
        }
      ],
      "missions": [
        {
          "mission__action__name": "Llegué en bicicleta",
          "current_count": 1,
          "is_completed": false
        },
        {
          "mission__action__name": "Participé en limpieza",
          "current_count": 0,
          "is_completed": false
        }
      ],
      "participants": 2,
      "badges": [
        {
          "user__first_name": "Ana",
          "badge__name": "Primer paso QA"
        }
      ],
      "notifications": [
        {
          "title": "Evidencia Rechazada",
          "notification_type": "AUDIT_REJECT",
          "is_read": false
        },
        {
          "title": "¡Misión completada!",
          "notification_type": "MISSION_COMPLETED",
          "is_read": false
        },
        {
          "title": "¡Nueva medalla desbloqueada!",
          "notification_type": "BADGE_EARNED",
          "is_read": false
        }
      ],
      "posts": 3
    },
    "after": {
      "profiles": [
        {
          "user__first_name": "Ana",
          "total_points": 10,
          "available_points": 10,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Laura",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Diego",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        }
      ],
      "clans": [
        {
          "name": "Ingeniería QA",
          "total_points": 10,
          "deleted_at": null
        },
        {
          "name": "Ecoequipo QA",
          "total_points": 10,
          "deleted_at": null
        }
      ],
      "logs": [
        {
          "id": "74f38290-7805-443a-9110-aafef9d88232",
          "status": "APPROVED",
          "points_awarded": 10,
          "co2_kg_factor_snapshot": "1.250",
          "idempotency_key": "class-qa-bike-1"
        },
        {
          "id": "67970d97-5bb4-4804-9b93-8df76040ac4e",
          "status": "REJECTED",
          "points_awarded": 20,
          "co2_kg_factor_snapshot": "0.100",
          "idempotency_key": "class-qa-photo-1"
        }
      ],
      "missions": [
        {
          "mission__action__name": "Llegué en bicicleta",
          "current_count": 1,
          "is_completed": false
        },
        {
          "mission__action__name": "Participé en limpieza",
          "current_count": 0,
          "is_completed": false
        }
      ],
      "participants": 2,
      "badges": [
        {
          "user__first_name": "Ana",
          "badge__name": "Primer paso QA"
        }
      ],
      "notifications": [
        {
          "title": "Evidencia Rechazada",
          "notification_type": "AUDIT_REJECT",
          "is_read": false
        },
        {
          "title": "¡Misión completada!",
          "notification_type": "MISSION_COMPLETED",
          "is_read": false
        },
        {
          "title": "¡Nueva medalla desbloqueada!",
          "notification_type": "BADGE_EARNED",
          "is_read": false
        }
      ],
      "posts": 3
    },
    "executedAt": "2026-10-02T05:13:22.685Z",
    "evidence": "evidence/QA09B.json"
  },
  {
    "id": "QA09C",
    "title": "Autor edita publicación por API",
    "layer": "API + PostgreSQL",
    "role": "student",
    "status": "PASS",
    "expected": "HTTP 200",
    "actual": "HTTP 200",
    "method": "PATCH",
    "path": "/api/v1/feed/3/",
    "request": {
      "content": "Actualización QA: termo reutilizable. Datos sintéticos."
    },
    "response": {
      "id": 3,
      "author": {
        "id": "a9282d7c-96ed-49dd-ad56-4923c5b3d2e0",
        "first_name": "Ana",
        "last_name": "QA"
      },
      "author_id": "a9282d7c-96ed-49dd-ad56-4923c5b3d2e0",
      "post_type": "SHARED_EVIDENCE",
      "content": "Actualización QA: termo reutilizable. Datos sintéticos.",
      "image_url": "",
      "badge_info": null,
      "relative_time": "hace un momento",
      "created_at": "2026-10-01T23:13:22.221581-06:00",
      "updated_at": "2026-10-01T23:13:24.383999-06:00"
    },
    "before": {
      "profiles": [
        {
          "user__first_name": "Ana",
          "total_points": 10,
          "available_points": 10,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Laura",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Diego",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        }
      ],
      "clans": [
        {
          "name": "Ingeniería QA",
          "total_points": 10,
          "deleted_at": null
        },
        {
          "name": "Ecoequipo QA",
          "total_points": 10,
          "deleted_at": null
        }
      ],
      "logs": [
        {
          "id": "74f38290-7805-443a-9110-aafef9d88232",
          "status": "APPROVED",
          "points_awarded": 10,
          "co2_kg_factor_snapshot": "1.250",
          "idempotency_key": "class-qa-bike-1"
        },
        {
          "id": "67970d97-5bb4-4804-9b93-8df76040ac4e",
          "status": "REJECTED",
          "points_awarded": 20,
          "co2_kg_factor_snapshot": "0.100",
          "idempotency_key": "class-qa-photo-1"
        }
      ],
      "missions": [
        {
          "mission__action__name": "Llegué en bicicleta",
          "current_count": 1,
          "is_completed": false
        },
        {
          "mission__action__name": "Participé en limpieza",
          "current_count": 0,
          "is_completed": false
        }
      ],
      "participants": 2,
      "badges": [
        {
          "user__first_name": "Ana",
          "badge__name": "Primer paso QA"
        }
      ],
      "notifications": [
        {
          "title": "Evidencia Rechazada",
          "notification_type": "AUDIT_REJECT",
          "is_read": false
        },
        {
          "title": "¡Misión completada!",
          "notification_type": "MISSION_COMPLETED",
          "is_read": false
        },
        {
          "title": "¡Nueva medalla desbloqueada!",
          "notification_type": "BADGE_EARNED",
          "is_read": false
        }
      ],
      "posts": 3
    },
    "after": {
      "profiles": [
        {
          "user__first_name": "Ana",
          "total_points": 10,
          "available_points": 10,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Laura",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Diego",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        }
      ],
      "clans": [
        {
          "name": "Ingeniería QA",
          "total_points": 10,
          "deleted_at": null
        },
        {
          "name": "Ecoequipo QA",
          "total_points": 10,
          "deleted_at": null
        }
      ],
      "logs": [
        {
          "id": "74f38290-7805-443a-9110-aafef9d88232",
          "status": "APPROVED",
          "points_awarded": 10,
          "co2_kg_factor_snapshot": "1.250",
          "idempotency_key": "class-qa-bike-1"
        },
        {
          "id": "67970d97-5bb4-4804-9b93-8df76040ac4e",
          "status": "REJECTED",
          "points_awarded": 20,
          "co2_kg_factor_snapshot": "0.100",
          "idempotency_key": "class-qa-photo-1"
        }
      ],
      "missions": [
        {
          "mission__action__name": "Llegué en bicicleta",
          "current_count": 1,
          "is_completed": false
        },
        {
          "mission__action__name": "Participé en limpieza",
          "current_count": 0,
          "is_completed": false
        }
      ],
      "participants": 2,
      "badges": [
        {
          "user__first_name": "Ana",
          "badge__name": "Primer paso QA"
        }
      ],
      "notifications": [
        {
          "title": "Evidencia Rechazada",
          "notification_type": "AUDIT_REJECT",
          "is_read": false
        },
        {
          "title": "¡Misión completada!",
          "notification_type": "MISSION_COMPLETED",
          "is_read": false
        },
        {
          "title": "¡Nueva medalla desbloqueada!",
          "notification_type": "BADGE_EARNED",
          "is_read": false
        }
      ],
      "posts": 3
    },
    "executedAt": "2026-10-02T05:13:23.825Z",
    "evidence": "evidence/QA09C.json"
  },
  {
    "id": "QA09D",
    "title": "Autor dispone de controles de edición en UI",
    "layer": "UI ownership",
    "role": "STUDENT",
    "status": "FAIL",
    "expected": "Controles editar/eliminar para su propia publicación",
    "actual": "Identificador fijo en UI no coincide con Ana; publicación propia sin controles",
    "evidence": "evidence/06-feed.png"
  },
  {
    "id": "QA10A",
    "title": "Evento de insignia persistido y consultable",
    "layer": "API + PostgreSQL",
    "role": "student",
    "status": "PASS",
    "expected": "HTTP 200",
    "actual": "HTTP 200",
    "method": "GET",
    "path": "/api/v1/notifications/",
    "request": null,
    "response": {
      "count": 3,
      "next": null,
      "previous": null,
      "results": [
        {
          "id": "034be737-544f-4ab4-8278-c454e67ad6e9",
          "user_id": "a9282d7c-96ed-49dd-ad56-4923c5b3d2e0",
          "title": "Evidencia Rechazada",
          "message": "Tu evidencia fue rechazada. Motivo: Prueba QA: referencia sintética; no se cargó fotografía real.",
          "notification_type": "AUDIT_REJECT",
          "notification_type_display": "Photo audit rejected",
          "is_read": false,
          "created_at": "2026-10-01T23:12:58.270769-06:00",
          "time_since_created": "0 minutes ago"
        },
        {
          "id": "0a6891ca-4ae5-468b-9b0b-dc64f2e0650b",
          "user_id": "a9282d7c-96ed-49dd-ad56-4923c5b3d2e0",
          "title": "¡Misión completada!",
          "message": "Completaste la misión 'Participé en limpieza' (1/1) de la campaña 'Semana sustentable QA'.",
          "notification_type": "MISSION_COMPLETED",
          "notification_type_display": "Mission completed",
          "is_read": false,
          "created_at": "2026-10-01T23:12:57.245146-06:00",
          "time_since_created": "0 minutes ago"
        },
        {
          "id": "f5d8e12b-0bae-42e4-8e11-7317125102eb",
          "user_id": "a9282d7c-96ed-49dd-ad56-4923c5b3d2e0",
          "title": "¡Nueva medalla desbloqueada!",
          "message": "Has obtenido el logro: Primer paso QA. ¡Sigue así!",
          "notification_type": "BADGE_EARNED",
          "notification_type_display": "Badge earned",
          "is_read": false,
          "created_at": "2026-10-01T23:12:45.633249-06:00",
          "time_since_created": "0 minutes ago"
        }
      ],
      "unread_count": 3
    },
    "before": {
      "profiles": [
        {
          "user__first_name": "Ana",
          "total_points": 10,
          "available_points": 10,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Laura",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Diego",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        }
      ],
      "clans": [
        {
          "name": "Ingeniería QA",
          "total_points": 10,
          "deleted_at": null
        },
        {
          "name": "Ecoequipo QA",
          "total_points": 10,
          "deleted_at": null
        }
      ],
      "logs": [
        {
          "id": "74f38290-7805-443a-9110-aafef9d88232",
          "status": "APPROVED",
          "points_awarded": 10,
          "co2_kg_factor_snapshot": "1.250",
          "idempotency_key": "class-qa-bike-1"
        },
        {
          "id": "67970d97-5bb4-4804-9b93-8df76040ac4e",
          "status": "REJECTED",
          "points_awarded": 20,
          "co2_kg_factor_snapshot": "0.100",
          "idempotency_key": "class-qa-photo-1"
        }
      ],
      "missions": [
        {
          "mission__action__name": "Llegué en bicicleta",
          "current_count": 1,
          "is_completed": false
        },
        {
          "mission__action__name": "Participé en limpieza",
          "current_count": 0,
          "is_completed": false
        }
      ],
      "participants": 2,
      "badges": [
        {
          "user__first_name": "Ana",
          "badge__name": "Primer paso QA"
        }
      ],
      "notifications": [
        {
          "title": "Evidencia Rechazada",
          "notification_type": "AUDIT_REJECT",
          "is_read": false
        },
        {
          "title": "¡Misión completada!",
          "notification_type": "MISSION_COMPLETED",
          "is_read": false
        },
        {
          "title": "¡Nueva medalla desbloqueada!",
          "notification_type": "BADGE_EARNED",
          "is_read": false
        }
      ],
      "posts": 3
    },
    "after": {
      "profiles": [
        {
          "user__first_name": "Ana",
          "total_points": 10,
          "available_points": 10,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Laura",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Diego",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        }
      ],
      "clans": [
        {
          "name": "Ingeniería QA",
          "total_points": 10,
          "deleted_at": null
        },
        {
          "name": "Ecoequipo QA",
          "total_points": 10,
          "deleted_at": null
        }
      ],
      "logs": [
        {
          "id": "74f38290-7805-443a-9110-aafef9d88232",
          "status": "APPROVED",
          "points_awarded": 10,
          "co2_kg_factor_snapshot": "1.250",
          "idempotency_key": "class-qa-bike-1"
        },
        {
          "id": "67970d97-5bb4-4804-9b93-8df76040ac4e",
          "status": "REJECTED",
          "points_awarded": 20,
          "co2_kg_factor_snapshot": "0.100",
          "idempotency_key": "class-qa-photo-1"
        }
      ],
      "missions": [
        {
          "mission__action__name": "Llegué en bicicleta",
          "current_count": 1,
          "is_completed": false
        },
        {
          "mission__action__name": "Participé en limpieza",
          "current_count": 0,
          "is_completed": false
        }
      ],
      "participants": 2,
      "badges": [
        {
          "user__first_name": "Ana",
          "badge__name": "Primer paso QA"
        }
      ],
      "notifications": [
        {
          "title": "Evidencia Rechazada",
          "notification_type": "AUDIT_REJECT",
          "is_read": false
        },
        {
          "title": "¡Misión completada!",
          "notification_type": "MISSION_COMPLETED",
          "is_read": false
        },
        {
          "title": "¡Nueva medalla desbloqueada!",
          "notification_type": "BADGE_EARNED",
          "is_read": false
        }
      ],
      "posts": 3
    },
    "executedAt": "2026-10-02T05:13:30.491Z",
    "evidence": "evidence/QA10A.json"
  },
  {
    "id": "QA10B",
    "title": "UI refleja notificaciones reales",
    "layer": "UI → API",
    "role": "STUDENT",
    "status": "FAIL",
    "expected": "Muestra Primer paso QA y rechazo de la prueba",
    "actual": "Lista de ejemplo; 0 solicitudes a API de notificaciones",
    "evidence": "evidence/07-notificaciones.png"
  },
  {
    "id": "QA11A",
    "title": "Perfil editable por propietario",
    "layer": "API + PostgreSQL",
    "role": "student",
    "status": "PASS",
    "expected": "HTTP 200",
    "actual": "HTTP 200",
    "method": "PATCH",
    "path": "/api/v1/profile/me/",
    "request": {
      "bio": "Estudiante sintética para QA local",
      "visibility": "PRIVATE"
    },
    "response": {
      "user_id": "a9282d7c-96ed-49dd-ad56-4923c5b3d2e0",
      "email": "student@qa.example.test",
      "first_name": "Ana",
      "last_name": "QA",
      "role": "STUDENT",
      "visibility": "PRIVATE",
      "bio": "Estudiante sintética para QA local",
      "preferences": {},
      "avatar_url": "",
      "total_points": 10,
      "available_points": 10,
      "current_streak": 0,
      "level": null,
      "badges": [],
      "impact_metrics": {
        "co2_kg": "1.250",
        "water_liters": "0.000",
        "plastic_kg": "0.000"
      },
      "finished_campaigns": [],
      "institutional_clan": {
        "id": "9f0f7340-f5fa-4d58-9a9b-e6180dbead29",
        "name": "Ingeniería QA"
      },
      "active_private_clan": {
        "id": "5f4e25d1-1223-4982-be36-7f9739ddebea",
        "name": "Ecoequipo QA"
      }
    },
    "before": {
      "profiles": [
        {
          "user__first_name": "Ana",
          "total_points": 10,
          "available_points": 10,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Laura",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Diego",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        }
      ],
      "clans": [
        {
          "name": "Ingeniería QA",
          "total_points": 10,
          "deleted_at": null
        },
        {
          "name": "Ecoequipo QA",
          "total_points": 10,
          "deleted_at": null
        }
      ],
      "logs": [
        {
          "id": "74f38290-7805-443a-9110-aafef9d88232",
          "status": "APPROVED",
          "points_awarded": 10,
          "co2_kg_factor_snapshot": "1.250",
          "idempotency_key": "class-qa-bike-1"
        },
        {
          "id": "67970d97-5bb4-4804-9b93-8df76040ac4e",
          "status": "REJECTED",
          "points_awarded": 20,
          "co2_kg_factor_snapshot": "0.100",
          "idempotency_key": "class-qa-photo-1"
        }
      ],
      "missions": [
        {
          "mission__action__name": "Llegué en bicicleta",
          "current_count": 1,
          "is_completed": false
        },
        {
          "mission__action__name": "Participé en limpieza",
          "current_count": 0,
          "is_completed": false
        }
      ],
      "participants": 2,
      "badges": [
        {
          "user__first_name": "Ana",
          "badge__name": "Primer paso QA"
        }
      ],
      "notifications": [
        {
          "title": "Evidencia Rechazada",
          "notification_type": "AUDIT_REJECT",
          "is_read": false
        },
        {
          "title": "¡Misión completada!",
          "notification_type": "MISSION_COMPLETED",
          "is_read": false
        },
        {
          "title": "¡Nueva medalla desbloqueada!",
          "notification_type": "BADGE_EARNED",
          "is_read": false
        }
      ],
      "posts": 3
    },
    "after": {
      "profiles": [
        {
          "user__first_name": "Ana",
          "total_points": 10,
          "available_points": 10,
          "bio": "Estudiante sintética para QA local",
          "visibility": "PRIVATE"
        },
        {
          "user__first_name": "Laura",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Diego",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        }
      ],
      "clans": [
        {
          "name": "Ingeniería QA",
          "total_points": 10,
          "deleted_at": null
        },
        {
          "name": "Ecoequipo QA",
          "total_points": 10,
          "deleted_at": null
        }
      ],
      "logs": [
        {
          "id": "74f38290-7805-443a-9110-aafef9d88232",
          "status": "APPROVED",
          "points_awarded": 10,
          "co2_kg_factor_snapshot": "1.250",
          "idempotency_key": "class-qa-bike-1"
        },
        {
          "id": "67970d97-5bb4-4804-9b93-8df76040ac4e",
          "status": "REJECTED",
          "points_awarded": 20,
          "co2_kg_factor_snapshot": "0.100",
          "idempotency_key": "class-qa-photo-1"
        }
      ],
      "missions": [
        {
          "mission__action__name": "Llegué en bicicleta",
          "current_count": 1,
          "is_completed": false
        },
        {
          "mission__action__name": "Participé en limpieza",
          "current_count": 0,
          "is_completed": false
        }
      ],
      "participants": 2,
      "badges": [
        {
          "user__first_name": "Ana",
          "badge__name": "Primer paso QA"
        }
      ],
      "notifications": [
        {
          "title": "Evidencia Rechazada",
          "notification_type": "AUDIT_REJECT",
          "is_read": false
        },
        {
          "title": "¡Misión completada!",
          "notification_type": "MISSION_COMPLETED",
          "is_read": false
        },
        {
          "title": "¡Nueva medalla desbloqueada!",
          "notification_type": "BADGE_EARNED",
          "is_read": false
        }
      ],
      "posts": 3
    },
    "executedAt": "2026-10-02T05:13:38.263Z",
    "evidence": "evidence/QA11A.json"
  },
  {
    "id": "QA11B",
    "title": "Consulta del perfil e impacto aprobado",
    "layer": "API + PostgreSQL",
    "role": "student",
    "status": "PASS",
    "expected": "HTTP 200",
    "actual": "HTTP 200",
    "method": "GET",
    "path": "/api/v1/profile/me/",
    "request": null,
    "response": {
      "user_id": "a9282d7c-96ed-49dd-ad56-4923c5b3d2e0",
      "email": "student@qa.example.test",
      "first_name": "Ana",
      "last_name": "QA",
      "role": "STUDENT",
      "visibility": "PRIVATE",
      "bio": "Estudiante sintética para QA local",
      "preferences": {},
      "avatar_url": "",
      "total_points": 10,
      "available_points": 10,
      "current_streak": 0,
      "level": null,
      "badges": [],
      "impact_metrics": {
        "co2_kg": "1.250",
        "water_liters": "0.000",
        "plastic_kg": "0.000"
      },
      "finished_campaigns": [],
      "institutional_clan": {
        "id": "9f0f7340-f5fa-4d58-9a9b-e6180dbead29",
        "name": "Ingeniería QA"
      },
      "active_private_clan": {
        "id": "5f4e25d1-1223-4982-be36-7f9739ddebea",
        "name": "Ecoequipo QA"
      }
    },
    "before": {
      "profiles": [
        {
          "user__first_name": "Ana",
          "total_points": 10,
          "available_points": 10,
          "bio": "Estudiante sintética para QA local",
          "visibility": "PRIVATE"
        },
        {
          "user__first_name": "Laura",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Diego",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        }
      ],
      "clans": [
        {
          "name": "Ingeniería QA",
          "total_points": 10,
          "deleted_at": null
        },
        {
          "name": "Ecoequipo QA",
          "total_points": 10,
          "deleted_at": null
        }
      ],
      "logs": [
        {
          "id": "74f38290-7805-443a-9110-aafef9d88232",
          "status": "APPROVED",
          "points_awarded": 10,
          "co2_kg_factor_snapshot": "1.250",
          "idempotency_key": "class-qa-bike-1"
        },
        {
          "id": "67970d97-5bb4-4804-9b93-8df76040ac4e",
          "status": "REJECTED",
          "points_awarded": 20,
          "co2_kg_factor_snapshot": "0.100",
          "idempotency_key": "class-qa-photo-1"
        }
      ],
      "missions": [
        {
          "mission__action__name": "Llegué en bicicleta",
          "current_count": 1,
          "is_completed": false
        },
        {
          "mission__action__name": "Participé en limpieza",
          "current_count": 0,
          "is_completed": false
        }
      ],
      "participants": 2,
      "badges": [
        {
          "user__first_name": "Ana",
          "badge__name": "Primer paso QA"
        }
      ],
      "notifications": [
        {
          "title": "Evidencia Rechazada",
          "notification_type": "AUDIT_REJECT",
          "is_read": false
        },
        {
          "title": "¡Misión completada!",
          "notification_type": "MISSION_COMPLETED",
          "is_read": false
        },
        {
          "title": "¡Nueva medalla desbloqueada!",
          "notification_type": "BADGE_EARNED",
          "is_read": false
        }
      ],
      "posts": 3
    },
    "after": {
      "profiles": [
        {
          "user__first_name": "Ana",
          "total_points": 10,
          "available_points": 10,
          "bio": "Estudiante sintética para QA local",
          "visibility": "PRIVATE"
        },
        {
          "user__first_name": "Laura",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Diego",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        }
      ],
      "clans": [
        {
          "name": "Ingeniería QA",
          "total_points": 10,
          "deleted_at": null
        },
        {
          "name": "Ecoequipo QA",
          "total_points": 10,
          "deleted_at": null
        }
      ],
      "logs": [
        {
          "id": "74f38290-7805-443a-9110-aafef9d88232",
          "status": "APPROVED",
          "points_awarded": 10,
          "co2_kg_factor_snapshot": "1.250",
          "idempotency_key": "class-qa-bike-1"
        },
        {
          "id": "67970d97-5bb4-4804-9b93-8df76040ac4e",
          "status": "REJECTED",
          "points_awarded": 20,
          "co2_kg_factor_snapshot": "0.100",
          "idempotency_key": "class-qa-photo-1"
        }
      ],
      "missions": [
        {
          "mission__action__name": "Llegué en bicicleta",
          "current_count": 1,
          "is_completed": false
        },
        {
          "mission__action__name": "Participé en limpieza",
          "current_count": 0,
          "is_completed": false
        }
      ],
      "participants": 2,
      "badges": [
        {
          "user__first_name": "Ana",
          "badge__name": "Primer paso QA"
        }
      ],
      "notifications": [
        {
          "title": "Evidencia Rechazada",
          "notification_type": "AUDIT_REJECT",
          "is_read": false
        },
        {
          "title": "¡Misión completada!",
          "notification_type": "MISSION_COMPLETED",
          "is_read": false
        },
        {
          "title": "¡Nueva medalla desbloqueada!",
          "notification_type": "BADGE_EARNED",
          "is_read": false
        }
      ],
      "posts": 3
    },
    "executedAt": "2026-10-02T05:13:39.371Z",
    "evidence": "evidence/QA11B.json"
  },
  {
    "id": "QA11C",
    "title": "Límite de un liderazgo privado por usuario",
    "layer": "API + PostgreSQL",
    "role": "student",
    "status": "PASS",
    "expected": "HTTP 400: ya lidera Ecoequipo QA",
    "actual": "HTTP 400",
    "method": "POST",
    "path": "/api/v1/clans/",
    "request": {
      "name": "Clan temporal QA",
      "description": "Creado y eliminado en escenario QA"
    },
    "response": [
      "User already leads a clan; BR-04 allows a single leadership at a time."
    ],
    "before": {
      "profiles": [
        {
          "user__first_name": "Ana",
          "total_points": 10,
          "available_points": 10,
          "bio": "Estudiante sintética para QA local",
          "visibility": "PRIVATE"
        },
        {
          "user__first_name": "Laura",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Diego",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        }
      ],
      "clans": [
        {
          "name": "Ingeniería QA",
          "total_points": 10,
          "deleted_at": null
        },
        {
          "name": "Ecoequipo QA",
          "total_points": 10,
          "deleted_at": null
        }
      ],
      "logs": [
        {
          "id": "74f38290-7805-443a-9110-aafef9d88232",
          "status": "APPROVED",
          "points_awarded": 10,
          "co2_kg_factor_snapshot": "1.250",
          "idempotency_key": "class-qa-bike-1"
        },
        {
          "id": "67970d97-5bb4-4804-9b93-8df76040ac4e",
          "status": "REJECTED",
          "points_awarded": 20,
          "co2_kg_factor_snapshot": "0.100",
          "idempotency_key": "class-qa-photo-1"
        }
      ],
      "missions": [
        {
          "mission__action__name": "Llegué en bicicleta",
          "current_count": 1,
          "is_completed": false
        },
        {
          "mission__action__name": "Participé en limpieza",
          "current_count": 0,
          "is_completed": false
        }
      ],
      "participants": 2,
      "badges": [
        {
          "user__first_name": "Ana",
          "badge__name": "Primer paso QA"
        }
      ],
      "notifications": [
        {
          "title": "Evidencia Rechazada",
          "notification_type": "AUDIT_REJECT",
          "is_read": false
        },
        {
          "title": "¡Misión completada!",
          "notification_type": "MISSION_COMPLETED",
          "is_read": false
        },
        {
          "title": "¡Nueva medalla desbloqueada!",
          "notification_type": "BADGE_EARNED",
          "is_read": false
        }
      ],
      "posts": 3
    },
    "after": {
      "profiles": [
        {
          "user__first_name": "Ana",
          "total_points": 10,
          "available_points": 10,
          "bio": "Estudiante sintética para QA local",
          "visibility": "PRIVATE"
        },
        {
          "user__first_name": "Laura",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Diego",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        }
      ],
      "clans": [
        {
          "name": "Ingeniería QA",
          "total_points": 10,
          "deleted_at": null
        },
        {
          "name": "Ecoequipo QA",
          "total_points": 10,
          "deleted_at": null
        }
      ],
      "logs": [
        {
          "id": "74f38290-7805-443a-9110-aafef9d88232",
          "status": "APPROVED",
          "points_awarded": 10,
          "co2_kg_factor_snapshot": "1.250",
          "idempotency_key": "class-qa-bike-1"
        },
        {
          "id": "67970d97-5bb4-4804-9b93-8df76040ac4e",
          "status": "REJECTED",
          "points_awarded": 20,
          "co2_kg_factor_snapshot": "0.100",
          "idempotency_key": "class-qa-photo-1"
        }
      ],
      "missions": [
        {
          "mission__action__name": "Llegué en bicicleta",
          "current_count": 1,
          "is_completed": false
        },
        {
          "mission__action__name": "Participé en limpieza",
          "current_count": 0,
          "is_completed": false
        }
      ],
      "participants": 2,
      "badges": [
        {
          "user__first_name": "Ana",
          "badge__name": "Primer paso QA"
        }
      ],
      "notifications": [
        {
          "title": "Evidencia Rechazada",
          "notification_type": "AUDIT_REJECT",
          "is_read": false
        },
        {
          "title": "¡Misión completada!",
          "notification_type": "MISSION_COMPLETED",
          "is_read": false
        },
        {
          "title": "¡Nueva medalla desbloqueada!",
          "notification_type": "BADGE_EARNED",
          "is_read": false
        }
      ],
      "posts": 3
    },
    "executedAt": "2026-10-02T05:13:40.524Z",
    "evidence": "evidence/QA11C.json"
  },
  {
    "id": "QA12A",
    "title": "Administrador modifica catálogo y persiste",
    "layer": "API + PostgreSQL",
    "role": "admin",
    "status": "FAIL",
    "expected": "HTTP 200 y nombre persistido: Termo QA actualizado",
    "actual": "HTTP 200, pero el nombre sigue Rellené mi termo; no persiste el cambio solicitado",
    "method": "PATCH",
    "path": "/api/v1/actions/2469fd9c-c1cf-4445-8500-fcb1ec212d79/",
    "request": {
      "name": "Termo QA actualizado"
    },
    "response": {
      "id": "2469fd9c-c1cf-4445-8500-fcb1ec212d79",
      "code": "QA_REFILL",
      "category": {
        "id": "7cfdac99-4104-4ee5-b072-53fb67ec999c",
        "code": "QA_MOVILIDAD",
        "name": "Movilidad y consumo",
        "description": "Catálogo sintético",
        "icon": "bike"
      },
      "name": "Rellené mi termo",
      "description": "Escenario de prueba local, sin impacto ambiental real medido.",
      "points": 5,
      "daily_limit": 3,
      "validation_type": "NONE",
      "co2_kg_factor": "0.050",
      "water_liters_factor": "0.000",
      "plastic_kg_factor": "0.000",
      "is_active": true
    },
    "before": {
      "profiles": [
        {
          "user__first_name": "Ana",
          "total_points": 10,
          "available_points": 10,
          "bio": "Estudiante sintética para QA local",
          "visibility": "PRIVATE"
        },
        {
          "user__first_name": "Laura",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Diego",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        }
      ],
      "clans": [
        {
          "name": "Ingeniería QA",
          "total_points": 10,
          "deleted_at": null
        },
        {
          "name": "Ecoequipo QA",
          "total_points": 10,
          "deleted_at": null
        }
      ],
      "logs": [
        {
          "id": "74f38290-7805-443a-9110-aafef9d88232",
          "status": "APPROVED",
          "points_awarded": 10,
          "co2_kg_factor_snapshot": "1.250",
          "idempotency_key": "class-qa-bike-1"
        },
        {
          "id": "67970d97-5bb4-4804-9b93-8df76040ac4e",
          "status": "REJECTED",
          "points_awarded": 20,
          "co2_kg_factor_snapshot": "0.100",
          "idempotency_key": "class-qa-photo-1"
        }
      ],
      "missions": [
        {
          "mission__action__name": "Llegué en bicicleta",
          "current_count": 1,
          "is_completed": false
        },
        {
          "mission__action__name": "Participé en limpieza",
          "current_count": 0,
          "is_completed": false
        }
      ],
      "participants": 2,
      "badges": [
        {
          "user__first_name": "Ana",
          "badge__name": "Primer paso QA"
        }
      ],
      "notifications": [
        {
          "title": "Evidencia Rechazada",
          "notification_type": "AUDIT_REJECT",
          "is_read": false
        },
        {
          "title": "¡Misión completada!",
          "notification_type": "MISSION_COMPLETED",
          "is_read": false
        },
        {
          "title": "¡Nueva medalla desbloqueada!",
          "notification_type": "BADGE_EARNED",
          "is_read": false
        }
      ],
      "posts": 3
    },
    "after": {
      "profiles": [
        {
          "user__first_name": "Ana",
          "total_points": 10,
          "available_points": 10,
          "bio": "Estudiante sintética para QA local",
          "visibility": "PRIVATE"
        },
        {
          "user__first_name": "Laura",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Diego",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        }
      ],
      "clans": [
        {
          "name": "Ingeniería QA",
          "total_points": 10,
          "deleted_at": null
        },
        {
          "name": "Ecoequipo QA",
          "total_points": 10,
          "deleted_at": null
        }
      ],
      "logs": [
        {
          "id": "74f38290-7805-443a-9110-aafef9d88232",
          "status": "APPROVED",
          "points_awarded": 10,
          "co2_kg_factor_snapshot": "1.250",
          "idempotency_key": "class-qa-bike-1"
        },
        {
          "id": "67970d97-5bb4-4804-9b93-8df76040ac4e",
          "status": "REJECTED",
          "points_awarded": 20,
          "co2_kg_factor_snapshot": "0.100",
          "idempotency_key": "class-qa-photo-1"
        }
      ],
      "missions": [
        {
          "mission__action__name": "Llegué en bicicleta",
          "current_count": 1,
          "is_completed": false
        },
        {
          "mission__action__name": "Participé en limpieza",
          "current_count": 0,
          "is_completed": false
        }
      ],
      "participants": 2,
      "badges": [
        {
          "user__first_name": "Ana",
          "badge__name": "Primer paso QA"
        }
      ],
      "notifications": [
        {
          "title": "Evidencia Rechazada",
          "notification_type": "AUDIT_REJECT",
          "is_read": false
        },
        {
          "title": "¡Misión completada!",
          "notification_type": "MISSION_COMPLETED",
          "is_read": false
        },
        {
          "title": "¡Nueva medalla desbloqueada!",
          "notification_type": "BADGE_EARNED",
          "is_read": false
        }
      ],
      "posts": 3
    },
    "executedAt": "2026-10-02T05:13:41.632Z",
    "evidence": "evidence/QA12A.json"
  },
  {
    "id": "QA02B",
    "title": "Estudiante no accede a pantalla administrativa",
    "layer": "UI role guard",
    "role": "STUDENT",
    "status": "PASS",
    "expected": "Acceso Restringido",
    "actual": "Acceso Restringido; se mostró Error 403 · Prohibido",
    "evidence": "evidence/08-control-acceso.png"
  },
  {
    "id": "QA11D",
    "title": "Crear clan privado con usuario elegible",
    "role": "outsider",
    "layer": "API + PostgreSQL",
    "status": "PASS",
    "expected": "HTTP 201",
    "actual": "HTTP 201",
    "path": "/api/v1/clans/",
    "method": "POST",
    "request": {
      "name": "Clan temporal QA",
      "description": "Creado y eliminado en QA"
    },
    "response": {
      "id": "48c19d2f-161e-4360-ba3a-d4e69659b93c",
      "name": "Clan temporal QA",
      "description": "Creado y eliminado en QA",
      "avatar_object_key": "",
      "type": "PRIVATE",
      "privacy": "PUBLIC",
      "total_points": 0,
      "created_at": "2026-10-01T23:18:13.876970-06:00"
    },
    "before": {
      "profiles": [
        {
          "user__first_name": "Ana",
          "total_points": 10,
          "available_points": 10,
          "bio": "Estudiante sintética para QA local",
          "visibility": "PRIVATE"
        },
        {
          "user__first_name": "Laura",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Diego",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        }
      ],
      "clans": [
        {
          "name": "Ingeniería QA",
          "total_points": 10,
          "deleted_at": null
        },
        {
          "name": "Ecoequipo QA",
          "total_points": 10,
          "deleted_at": null
        }
      ],
      "logs": [
        {
          "id": "74f38290-7805-443a-9110-aafef9d88232",
          "status": "APPROVED",
          "points_awarded": 10,
          "co2_kg_factor_snapshot": "1.250",
          "idempotency_key": "class-qa-bike-1"
        },
        {
          "id": "67970d97-5bb4-4804-9b93-8df76040ac4e",
          "status": "REJECTED",
          "points_awarded": 20,
          "co2_kg_factor_snapshot": "0.100",
          "idempotency_key": "class-qa-photo-1"
        }
      ],
      "missions": [
        {
          "mission__action__name": "Llegué en bicicleta",
          "current_count": 1,
          "is_completed": false
        },
        {
          "mission__action__name": "Participé en limpieza",
          "current_count": 0,
          "is_completed": false
        }
      ],
      "participants": 2,
      "badges": [
        {
          "user__first_name": "Ana",
          "badge__name": "Primer paso QA"
        }
      ],
      "notifications": [
        {
          "title": "Evidencia Rechazada",
          "notification_type": "AUDIT_REJECT",
          "is_read": false
        },
        {
          "title": "¡Misión completada!",
          "notification_type": "MISSION_COMPLETED",
          "is_read": false
        },
        {
          "title": "¡Nueva medalla desbloqueada!",
          "notification_type": "BADGE_EARNED",
          "is_read": false
        }
      ],
      "posts": 3
    },
    "after": {
      "profiles": [
        {
          "user__first_name": "Ana",
          "total_points": 10,
          "available_points": 10,
          "bio": "Estudiante sintética para QA local",
          "visibility": "PRIVATE"
        },
        {
          "user__first_name": "Laura",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Diego",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        }
      ],
      "clans": [
        {
          "name": "Ingeniería QA",
          "total_points": 10,
          "deleted_at": null
        },
        {
          "name": "Ecoequipo QA",
          "total_points": 10,
          "deleted_at": null
        },
        {
          "name": "Clan temporal QA",
          "total_points": 0,
          "deleted_at": null
        }
      ],
      "logs": [
        {
          "id": "74f38290-7805-443a-9110-aafef9d88232",
          "status": "APPROVED",
          "points_awarded": 10,
          "co2_kg_factor_snapshot": "1.250",
          "idempotency_key": "class-qa-bike-1"
        },
        {
          "id": "67970d97-5bb4-4804-9b93-8df76040ac4e",
          "status": "REJECTED",
          "points_awarded": 20,
          "co2_kg_factor_snapshot": "0.100",
          "idempotency_key": "class-qa-photo-1"
        }
      ],
      "missions": [
        {
          "mission__action__name": "Llegué en bicicleta",
          "current_count": 1,
          "is_completed": false
        },
        {
          "mission__action__name": "Participé en limpieza",
          "current_count": 0,
          "is_completed": false
        }
      ],
      "participants": 2,
      "badges": [
        {
          "user__first_name": "Ana",
          "badge__name": "Primer paso QA"
        }
      ],
      "notifications": [
        {
          "title": "Evidencia Rechazada",
          "notification_type": "AUDIT_REJECT",
          "is_read": false
        },
        {
          "title": "¡Misión completada!",
          "notification_type": "MISSION_COMPLETED",
          "is_read": false
        },
        {
          "title": "¡Nueva medalla desbloqueada!",
          "notification_type": "BADGE_EARNED",
          "is_read": false
        }
      ],
      "posts": 3
    },
    "executedAt": "2026-10-02T05:18:15.394Z",
    "evidence": "evidence/QA11D.json"
  },
  {
    "id": "QA11E",
    "title": "No propietario no elimina clan privado",
    "role": "student",
    "layer": "API + PostgreSQL",
    "status": "PASS",
    "expected": "HTTP 403",
    "actual": "HTTP 403",
    "path": "/api/v1/clans/48c19d2f-161e-4360-ba3a-d4e69659b93c/",
    "method": "DELETE",
    "request": null,
    "response": {
      "detail": "Only the clan leader can dissolve the clan."
    },
    "before": {
      "profiles": [
        {
          "user__first_name": "Ana",
          "total_points": 10,
          "available_points": 10,
          "bio": "Estudiante sintética para QA local",
          "visibility": "PRIVATE"
        },
        {
          "user__first_name": "Laura",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Diego",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        }
      ],
      "clans": [
        {
          "name": "Ingeniería QA",
          "total_points": 10,
          "deleted_at": null
        },
        {
          "name": "Ecoequipo QA",
          "total_points": 10,
          "deleted_at": null
        },
        {
          "name": "Clan temporal QA",
          "total_points": 0,
          "deleted_at": null
        }
      ],
      "logs": [
        {
          "id": "74f38290-7805-443a-9110-aafef9d88232",
          "status": "APPROVED",
          "points_awarded": 10,
          "co2_kg_factor_snapshot": "1.250",
          "idempotency_key": "class-qa-bike-1"
        },
        {
          "id": "67970d97-5bb4-4804-9b93-8df76040ac4e",
          "status": "REJECTED",
          "points_awarded": 20,
          "co2_kg_factor_snapshot": "0.100",
          "idempotency_key": "class-qa-photo-1"
        }
      ],
      "missions": [
        {
          "mission__action__name": "Llegué en bicicleta",
          "current_count": 1,
          "is_completed": false
        },
        {
          "mission__action__name": "Participé en limpieza",
          "current_count": 0,
          "is_completed": false
        }
      ],
      "participants": 2,
      "badges": [
        {
          "user__first_name": "Ana",
          "badge__name": "Primer paso QA"
        }
      ],
      "notifications": [
        {
          "title": "Evidencia Rechazada",
          "notification_type": "AUDIT_REJECT",
          "is_read": false
        },
        {
          "title": "¡Misión completada!",
          "notification_type": "MISSION_COMPLETED",
          "is_read": false
        },
        {
          "title": "¡Nueva medalla desbloqueada!",
          "notification_type": "BADGE_EARNED",
          "is_read": false
        }
      ],
      "posts": 3
    },
    "after": {
      "profiles": [
        {
          "user__first_name": "Ana",
          "total_points": 10,
          "available_points": 10,
          "bio": "Estudiante sintética para QA local",
          "visibility": "PRIVATE"
        },
        {
          "user__first_name": "Laura",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Diego",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        }
      ],
      "clans": [
        {
          "name": "Ingeniería QA",
          "total_points": 10,
          "deleted_at": null
        },
        {
          "name": "Ecoequipo QA",
          "total_points": 10,
          "deleted_at": null
        },
        {
          "name": "Clan temporal QA",
          "total_points": 0,
          "deleted_at": null
        }
      ],
      "logs": [
        {
          "id": "74f38290-7805-443a-9110-aafef9d88232",
          "status": "APPROVED",
          "points_awarded": 10,
          "co2_kg_factor_snapshot": "1.250",
          "idempotency_key": "class-qa-bike-1"
        },
        {
          "id": "67970d97-5bb4-4804-9b93-8df76040ac4e",
          "status": "REJECTED",
          "points_awarded": 20,
          "co2_kg_factor_snapshot": "0.100",
          "idempotency_key": "class-qa-photo-1"
        }
      ],
      "missions": [
        {
          "mission__action__name": "Llegué en bicicleta",
          "current_count": 1,
          "is_completed": false
        },
        {
          "mission__action__name": "Participé en limpieza",
          "current_count": 0,
          "is_completed": false
        }
      ],
      "participants": 2,
      "badges": [
        {
          "user__first_name": "Ana",
          "badge__name": "Primer paso QA"
        }
      ],
      "notifications": [
        {
          "title": "Evidencia Rechazada",
          "notification_type": "AUDIT_REJECT",
          "is_read": false
        },
        {
          "title": "¡Misión completada!",
          "notification_type": "MISSION_COMPLETED",
          "is_read": false
        },
        {
          "title": "¡Nueva medalla desbloqueada!",
          "notification_type": "BADGE_EARNED",
          "is_read": false
        }
      ],
      "posts": 3
    },
    "executedAt": "2026-10-02T05:18:16.567Z",
    "evidence": "evidence/QA11E.json"
  },
  {
    "id": "QA11F",
    "title": "Propietario elimina clan mediante borrado lógico",
    "role": "outsider",
    "layer": "API + PostgreSQL",
    "status": "PASS",
    "expected": "HTTP 204",
    "actual": "HTTP 204",
    "path": "/api/v1/clans/48c19d2f-161e-4360-ba3a-d4e69659b93c/",
    "method": "DELETE",
    "request": null,
    "response": {
      "detail": "Respuesta sin JSON; HTTP 204"
    },
    "before": {
      "profiles": [
        {
          "user__first_name": "Ana",
          "total_points": 10,
          "available_points": 10,
          "bio": "Estudiante sintética para QA local",
          "visibility": "PRIVATE"
        },
        {
          "user__first_name": "Laura",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Diego",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        }
      ],
      "clans": [
        {
          "name": "Ingeniería QA",
          "total_points": 10,
          "deleted_at": null
        },
        {
          "name": "Ecoequipo QA",
          "total_points": 10,
          "deleted_at": null
        },
        {
          "name": "Clan temporal QA",
          "total_points": 0,
          "deleted_at": null
        }
      ],
      "logs": [
        {
          "id": "74f38290-7805-443a-9110-aafef9d88232",
          "status": "APPROVED",
          "points_awarded": 10,
          "co2_kg_factor_snapshot": "1.250",
          "idempotency_key": "class-qa-bike-1"
        },
        {
          "id": "67970d97-5bb4-4804-9b93-8df76040ac4e",
          "status": "REJECTED",
          "points_awarded": 20,
          "co2_kg_factor_snapshot": "0.100",
          "idempotency_key": "class-qa-photo-1"
        }
      ],
      "missions": [
        {
          "mission__action__name": "Llegué en bicicleta",
          "current_count": 1,
          "is_completed": false
        },
        {
          "mission__action__name": "Participé en limpieza",
          "current_count": 0,
          "is_completed": false
        }
      ],
      "participants": 2,
      "badges": [
        {
          "user__first_name": "Ana",
          "badge__name": "Primer paso QA"
        }
      ],
      "notifications": [
        {
          "title": "Evidencia Rechazada",
          "notification_type": "AUDIT_REJECT",
          "is_read": false
        },
        {
          "title": "¡Misión completada!",
          "notification_type": "MISSION_COMPLETED",
          "is_read": false
        },
        {
          "title": "¡Nueva medalla desbloqueada!",
          "notification_type": "BADGE_EARNED",
          "is_read": false
        }
      ],
      "posts": 3
    },
    "after": {
      "profiles": [
        {
          "user__first_name": "Ana",
          "total_points": 10,
          "available_points": 10,
          "bio": "Estudiante sintética para QA local",
          "visibility": "PRIVATE"
        },
        {
          "user__first_name": "Laura",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        },
        {
          "user__first_name": "Diego",
          "total_points": 0,
          "available_points": 0,
          "bio": "",
          "visibility": "PUBLIC"
        }
      ],
      "clans": [
        {
          "name": "Ingeniería QA",
          "total_points": 10,
          "deleted_at": null
        },
        {
          "name": "Ecoequipo QA",
          "total_points": 10,
          "deleted_at": null
        },
        {
          "name": "Clan temporal QA",
          "total_points": 0,
          "deleted_at": "2026-10-02 05:18:17.120989+00:00"
        }
      ],
      "logs": [
        {
          "id": "74f38290-7805-443a-9110-aafef9d88232",
          "status": "APPROVED",
          "points_awarded": 10,
          "co2_kg_factor_snapshot": "1.250",
          "idempotency_key": "class-qa-bike-1"
        },
        {
          "id": "67970d97-5bb4-4804-9b93-8df76040ac4e",
          "status": "REJECTED",
          "points_awarded": 20,
          "co2_kg_factor_snapshot": "0.100",
          "idempotency_key": "class-qa-photo-1"
        }
      ],
      "missions": [
        {
          "mission__action__name": "Llegué en bicicleta",
          "current_count": 1,
          "is_completed": false
        },
        {
          "mission__action__name": "Participé en limpieza",
          "current_count": 0,
          "is_completed": false
        }
      ],
      "participants": 2,
      "badges": [
        {
          "user__first_name": "Ana",
          "badge__name": "Primer paso QA"
        }
      ],
      "notifications": [
        {
          "title": "Evidencia Rechazada",
          "notification_type": "AUDIT_REJECT",
          "is_read": false
        },
        {
          "title": "¡Misión completada!",
          "notification_type": "MISSION_COMPLETED",
          "is_read": false
        },
        {
          "title": "¡Nueva medalla desbloqueada!",
          "notification_type": "BADGE_EARNED",
          "is_read": false
        }
      ],
      "posts": 3
    },
    "executedAt": "2026-10-02T05:18:17.693Z",
    "evidence": "evidence/QA11F.json"
  },
  {
    "id": "QA10C",
    "title": "Perfil muestra insignias ganadas",
    "layer": "Integración de dominios",
    "role": "STUDENT",
    "status": "NOT IMPLEMENTED",
    "expected": "Perfil incluye Primer paso QA",
    "actual": "UserBadge existe y la notificación se genera; profile/me devuelve badges: [] como placeholder",
    "evidence": "evidence/QA11B.json"
  },
  {
    "id": "QA13",
    "title": "Despliegue real / infraestructura compartida",
    "layer": "Cloud",
    "role": "N/A",
    "status": "NOT RUN",
    "expected": "Migraciones y conectividad del entorno desplegado verificadas",
    "actual": "La grabación es local; no se aplicó Terraform ni se modificó Neon",
    "evidence": "db-context.md"
  }
]