Elegir espacio

Dos espacios

¿Qué quieres consultar?

Elige el espacio al que quieres entrar.

Biblioteca FastAPIPráctica

Práctica · Bloque 1

HTTP, APIs y asincronía conceptual

Preguntas para aplicar las unidades 1.1, 1.2 y 1.3 directamente en la web. Las respuestas redactadas y las selecciones tipo test se guardan en este navegador para que puedas recuperarlas y revisarlas después con Codex.

Cómo trabajar este bloque

Abre un ejercicio, lee la pregunta y responde en su cuadro de texto o selecciona una opción. El guardado es automático y local: no se envía a ningún servidor.

Las descargas, criterios detallados y materiales largos quedan dentro de Profundización opcional. Las dos series y el caso profesional sí son prácticas extensas para cuando quieras trabajar con más proceso.

Ver y revisar las respuestas guardadas

11 actividades disponibles.

Ejercicios independientes

Son preguntas breves y autocontenidas. No requieren descargar archivos ni redactar un documento formal.

EX-B1-01

Corregir una actualización rechazada

  • Respuesta redactada
  • Diagnóstico HTTP
  • Inicial

Una aplicación dejó de actualizar expedientes después de que el endpoint adoptara JSON Merge Patch. El ticket incluye el requisito vigente, el comando `curl` usado para reproducir el fallo y la respuesta completa del servidor.

Pensar y responder en la web

Predice y guarda aquí tu razonamiento antes de abrir el material; después contrástalo en el workspace.

Pregunta central

¿Qué diferencia exacta existe entre el contrato y la petición enviada, y cómo quedaría el comando `curl` mínimo que corrige esa diferencia?

Información que necesitas

Endpoint requirement
PATCH /v1/records/{record_id}
Content-Type: application/merge-patch+json
Body fields: state (draft | in_review | closed), notify (boolean)

Reproduction
curl --include --request PATCH \
  'https://records.internal.example/v1/records/REC-204' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{"state":"in_review","notify":false}'

HTTP/1.1 415 Unsupported Media Type
Content-Type: application/problem+json
Content-Length: 108
X-Request-ID: req-8f21

{"title":"Unsupported Media Type","status":415,"detail":"Content-Type must be application/merge-patch+json"}

Para ordenar tu razonamiento

  1. Localiza el media type exigido por el contrato y el que envía el cliente.
  2. Relaciona esa divergencia con el status `415` y con el campo `detail` de la respuesta.
  3. Corrige solo el header necesario y explica por qué el intercambio no demuestra todavía que el payload será aceptado.

Trabajo en el workspace

  1. Compara el requisito del endpoint con el comando ejecutado y enumera solo las diferencias observables.
  2. Explica por qué `415` señala el formato declarado por la request y no un error de sintaxis del JSON ni un recurso inexistente.
  3. Escribe el comando `curl` corregido conservando método, URL, `Accept` y payload.
  4. Indica qué comprobarías en una segunda ejecución y qué valor usarías para correlacionarla con logs del servidor.

Entrega esperada

  • Diagnóstico de causa con citas del requisito y de la respuesta.
  • Comando `curl` corregido.
  • Dos comprobaciones para la siguiente ejecución: una de transporte y otra del resultado de negocio.

Escribe lo que piensas. Se guarda automáticamente en este navegador.

Sin respuesta guardada.

Pistas opcionales

Pista 1 · Compara contrato y request
  • Busca el mismo concepto —`Content-Type`— en el requisito y en el comando.
  • Método, ruta y campos del body ya coinciden; no los cambies sin evidencia.
Pista 2 · Usa la respuesta
  • `415` significa que el servidor rechaza el media type de la representación enviada.
  • El campo `detail` nombra además el valor que exige el endpoint.
Pista 3 · Limita la conclusión
  • Corregir este header elimina una causa demostrada, pero no ejecuta por sí solo las reglas de negocio.
  • Conserva `req-8f21` para investigar el intento original; una nueva ejecución normalmente recibirá otro identificador.
Profundización opcional

Demostrar por qué el servidor devuelve `415 Unsupported Media Type` y preparar la corrección mínima de la petición sin cambiar datos que no están relacionados con el fallo.

Contexto adicional

  • El endpoint exige `application/merge-patch+json` porque el body describe una actualización parcial, no la representación completa del recurso.
  • El comando de reproducción usa el método y la ruta correctos, pero declara otro `Content-Type`.
  • La respuesta incluye status, media type, un detalle legible y `X-Request-ID`; no necesitas reconstruir información ausente.

Cómo revisar tu respuesta

  • La causa se identifica como la divergencia entre `application/json` y `application/merge-patch+json`.
  • El comando corregido no cambia `PATCH`, la URL ni el JSON.
  • La explicación usa el `415` y el campo `detail` como evidencia, no como suposición.
  • No se afirma que la segunda petición vaya a responder `200`; aún pueden fallar autenticación, versión, validación o reglas de negocio.
  • `X-Request-ID: req-8f21` se reconoce como identificador útil para buscar la ejecución rechazada en logs.

Evidencia, revisión y reinicio

  • Respuesta razonada guardada localmente en el navegador.
  • Diagnóstico basado en evidencia y comando `curl` corregido.

Revisión: con Codex, utilizando la evidencia y los criterios anteriores; no se publica una solución oficial.

Reinicio: Borrar la respuesta desde la tarjeta y volver a descargar una copia limpia de los materiales opcionales.

Material descargable opcional

EX-B1-02

El código de estado del incidente

  • Tipo test
  • Clasificación razonada
  • Inicial

Una API documental responde siempre con `200`, incluso cuando el consumidor no puede continuar. El equipo ya acordó usar `422` para datos JSON bien formados que incumplen el schema y `503` para dependencias temporalmente no disponibles; debes aplicar esa política a seis resultados concretos.

Pensar y responder en la web

Predice y guarda aquí tu razonamiento antes de abrir el material; después contrástalo en el workspace.

Pregunta central

¿Qué status corresponde a cada resultado según la política declarada y qué acción permite tomar al consumidor?

Información que necesitas

Política de la API
- JSON bien formado que incumple el schema: 422.
- Dependencia temporalmente no disponible: 503.

Resultados observados
A. GET /documents devuelve 18 elementos.
B. POST /records crea REC-204 y emite Location: /records/REC-204.
C. PATCH /records/REC-204 recibe {"closed_at":"tomorrow"}; el schema exige date-time ISO 8601.
D. GET /records/REC-999 usa un id válido que no existe.
E. POST /records recibe external_reference=REF-77, ya asociada a otro registro.
F. Una petición válida no termina porque la base de datos está temporalmente fuera de servicio.

Para ordenar tu razonamiento

  1. Clasifica primero cada situación como éxito, problema del cliente o fallo del servidor.
  2. Elige un código concreto para A–F y justifícalo con una frase.
  3. Justifica cada elección con el hecho observable que la determina.

Trabajo en el workspace

  1. Asigna a cada situación una familia 2xx, 4xx o 5xx antes de escoger un código concreto.
  2. Selecciona un código de estado y justifícalo desde la perspectiva del consumidor.
  3. Indica qué acción razonable puede tomar el consumidor: continuar, corregir, dejar de buscar, resolver el conflicto o reintentar más tarde.

Entrega esperada

  • Seis selecciones con una justificación y una acción del consumidor por caso.

Selecciona tus respuestas

Cada elección se guarda automáticamente en este navegador.

1. A. `GET /documents` devuelve correctamente una colección con 18 elementos.
2. B. `POST /records` crea `REC-204` y la respuesta incluye `Location: /records/REC-204`.
3. C. `closed_at` contiene «tomorrow» y el contrato exige una fecha ISO 8601.
4. D. `GET /records/REC-999` busca un identificador válido que no existe.
5. E. `POST /records` recibe `external_reference=REF-77`, ya asociada a otro registro.
6. F. Una petición válida no puede completarse porque la base de datos está temporalmente fuera de servicio.

Sin respuesta guardada.

Pistas opcionales

Pista 1 · Decide primero la responsabilidad
  • Pregunta si una petición idéntica podría funcionar sin cambiar nada del servidor.
  • Después concreta el código dentro de la familia elegida.
Pista 2 · Conflicto no significa sintaxis inválida
  • Una representación puede estar bien formada y aun así chocar con el estado actual del sistema.
Profundización opcional

Seleccionar familias y códigos de estado adecuados, diferenciando éxito, error del cliente y error del servidor.

Contexto adicional

  • No basta con escribir un número: cada elección debe relacionarse con lo que ocurrió y con la acción que puede tomar el cliente.
  • No inventes supuestos alternativos: la política de `422` y `503` forma parte del enunciado.

Cómo revisar tu respuesta

  • No se utiliza 200 como respuesta universal.
  • Los errores provocados por datos del cliente no se clasifican como fallos internos.
  • La creación se distingue de una lectura satisfactoria cuando el servidor crea un recurso identificable.
  • La justificación describe comportamiento observable y no detalles de implementación.

Evidencia, revisión y reinicio

  • Selecciones razonadas guardadas localmente en el navegador.
  • Matriz de estados completada si se utiliza el material opcional.

Revisión: con Codex, utilizando la evidencia y los criterios anteriores; no se publica una solución oficial.

Reinicio: Borrar las selecciones desde la tarjeta y volver a descargar una matriz vacía cuando se necesite reiniciar.

Material descargable opcional

EX-B1-03

Contrato REST de una biblioteca de investigación

  • Respuesta redactada
  • Diseño
  • Básica

Una biblioteca interna necesita que otros sistemas consulten documentos y autores, y registren préstamos. El encargo describe capacidades, pero no rutas ni operaciones.

Pensar y responder en la web

Predice y guarda aquí tu razonamiento antes de abrir el material; después contrástalo en el workspace.

Pregunta central

¿Cómo representarías documentos, autores y préstamos como recursos sin convertir cada acción del enunciado en una ruta con un verbo?

Para ordenar tu razonamiento

  1. Propón una ruta de colección y una ruta individual para cada recurso imprescindible.
  2. Elige método y resultado esperado para abrir y finalizar un préstamo.
  3. Explica qué ocurriría si el cliente repite la petición después de perder la respuesta.

Trabajo en el workspace

  1. Lee el diccionario técnico y propón únicamente las operaciones necesarias para listar y consultar documentos, abrir un préstamo y registrar su devolución.
  2. Para cada operación indica método, ruta, entrada principal y resultado observable.
  3. Explica en dos o tres frases cómo manejas un reintento de creación y la devolución del préstamo.
  4. Declara los supuestos que el brief no resuelve; no diseñes autenticación, persistencia ni endpoints adicionales.

Entrega esperada

  • Propuesta compacta de operaciones y hasta tres supuestos de diseño.
  • Una nota breve sobre reintentos y devolución del préstamo.

Escribe lo que piensas. Se guarda automáticamente en este navegador.

Sin respuesta guardada.

Pistas opcionales

Pista 1 · Sustantivos antes que rutas
  • Empieza por qué entidades reconoce el negocio y cuáles poseen identidad.
  • No conviertas cada frase de los requisitos en un endpoint.
Pista 2 · Piensa en la repetición
  • Para cada operación de escritura, imagina que la respuesta se pierde y el cliente repite exactamente la petición.
Profundización opcional

Diseñar un contrato HTTP coherente mediante recursos, rutas, métodos y estados, separando sustantivos de acciones.

Contexto adicional

  • Existen documentos, autores y préstamos con identificadores estables.
  • Un documento puede tener varios autores y puede estar disponible o prestado.
  • Los consumidores deben listar y filtrar documentos, consultar un documento, abrir un préstamo y registrar su finalización.
  • La referencia del préstamo la asigna el servidor.
  • Un cliente puede repetir una petición después de perder la respuesta por un timeout.

Decisiones abiertas

  • Cómo expresar la devolución o cierre del préstamo.
  • Si la relación documento-autor necesita operaciones propias en el alcance mínimo.
  • Qué filtros pertenecen a la colección de documentos.

Cómo revisar tu respuesta

  • Las rutas expresan recursos y no una colección arbitraria de verbos remotos.
  • Colección y elemento individual se distinguen de forma consistente.
  • La apertura de un préstamo no se presenta como idempotente sin una condición adicional explícita.
  • El contrato contempla recurso inexistente y conflicto de disponibilidad.
  • La decisión abierta se documenta sin fingir que existe una única respuesta universal.

Evidencia, revisión y reinicio

  • Respuesta de diseño guardada localmente en el navegador.
  • Contrato de operaciones y decisiones justificadas en la plantilla opcional.

Revisión: con Codex, utilizando la evidencia y los criterios anteriores; no se publica una solución oficial.

Reinicio: Borrar la respuesta desde la tarjeta y volver a descargar las plantillas originales antes de un nuevo intento.

Material descargable opcional

EX-B1-04

JSON que parece válido

  • Tipo test
  • Debugging
  • Inicial

Un importador rechaza varios payloads por motivos distintos. Algunos ni siquiera son JSON; otros son JSON válido pero contradicen el contrato esperado.

Pensar y responder en la web

Predice y guarda aquí tu razonamiento antes de abrir el material; después contrástalo en el workspace.

Pregunta central

¿Qué fragmentos no son JSON, cuáles sí son JSON pero incumplen el contrato y cuál aceptarías tal como está?

Información que necesitas

Fragmento A
{'id': 'doc-7', 'title': 'Quarterly report', 'published': True,}

Fragmento B
{"id": 7, "title": "Quarterly report", "tags": "api,http", "published": "false",
 "summary": null, "owner": {"id": "u-3", "name": "Ada"}}

Fragmento C
{"id": "doc-8", "title": "Board minutes", "tags": ["archive", 2026],
 "published": false, "owner": null}

Fragmento D
{"id": "doc-9", "title": "Release notes", "tags": [],
 "published": true, "owner": {"id": "u-8", "name": "Lin"}}

Para ordenar tu razonamiento

  1. Clasifica A–D antes de intentar corregirlos.
  2. Nombra el primer problema concreto que encuentres en cada fragmento.
  3. Explica por qué null y un campo ausente no significan necesariamente lo mismo.

Trabajo en el workspace

  1. Determina para cada fragmento si puede analizarse como JSON.
  2. Solo para los fragmentos sintácticamente válidos, contrasta cada campo con el contrato.
  3. Distingue campo ausente, valor null, string vacío y valor predeterminado cuando aparezcan o sean relevantes.
  4. Propón el cambio mínimo que permitiría volver a evaluar cada fragmento, sin inventar datos de negocio.

Entrega esperada

  • Hoja de diagnóstico para los cuatro fragmentos.
  • Lista de correcciones separada en sintaxis y contrato.

Selecciona tus respuestas

Cada elección se guarda automáticamente en este navegador.

1. Fragmento A
2. Fragmento B
3. Fragmento C
4. Fragmento D

Sin respuesta guardada.

Pistas opcionales

Pista 1 · Dos preguntas distintas
  • Primero pregunta si un parser JSON podría leer el texto.
  • Después pregunta si el valor obtenido satisface el contrato.
Pista 2 · Revisa literales y comillas
  • JSON no utiliza exactamente los mismos literales ni las mismas reglas de comillas que Python.
Pista 3 · Recorre la estructura
  • No te detengas en los campos de primer nivel: revisa elementos de arrays y objetos anidados.
Profundización opcional

Distinguir errores de sintaxis JSON de desacuerdos semánticos con un contrato, atendiendo a tipos, arrays, ausencia y null.

Contexto adicional

  • Contrato de referencia: id es string requerido; title es string requerido; tags es array de strings; published es boolean; summary puede ser string o null; owner es un objeto con id y name.
  • La ausencia de summary está permitida. La ausencia de id, title u owner no lo está.
  • No corrijas automáticamente los datos: primero clasifica y explica cada fallo.

Cómo revisar tu respuesta

  • No se valida el contrato de un fragmento antes de resolver su sintaxis JSON.
  • String, número, boolean y array no se consideran intercambiables por su apariencia.
  • Null no se interpreta como ausencia.
  • Un fragmento válido y conforme se reconoce sin introducir cambios innecesarios.

Evidencia, revisión y reinicio

  • Clasificación de fragmentos guardada localmente en el navegador.
  • Diagnóstico por fragmento si se utiliza la plantilla opcional.

Revisión: con Codex, utilizando la evidencia y los criterios anteriores; no se publica una solución oficial.

Reinicio: Borrar las selecciones desde la tarjeta y descargar de nuevo los payloads y la plantilla sin modificar.

Material descargable opcional

EX-B1-05

Leer una API desde OpenAPI

  • Respuesta redactada
  • Interpretación
  • Básica

Debes preparar una integración con un catálogo cultural, pero solo dispones de un documento OpenAPI acotado. La interfaz gráfica no está disponible.

Pensar y responder en la web

Predice y guarda aquí tu razonamiento antes de abrir el material; después contrástalo en el workspace.

Pregunta central

Leyendo solo el documento OpenAPI, ¿qué petición válida harías para buscar obras y qué respuestas puede recibir un consumidor?

Documento OpenAPI

openapi: 3.1.0
info:
  title: Local culture catalog
  version: 1.0.0
servers:
  - url: https://catalog.example.test/v1
paths:
  /works:
    get:
      operationId: listWorks
      summary: Search catalog works
      parameters:
        - name: q
          in: query
          required: false
          schema:
            type: string
            minLength: 2
        - name: type
          in: query
          required: false
          schema:
            type: string
            enum: [painting, sculpture, photograph]
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 50
            default: 20
      responses:
        "200":
          description: Filtered collection
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/WorkCollection"
        "400":
          description: Invalid query parameter
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Problem"
  /works/{work_id}:
    get:
      operationId: getWork
      summary: Get a work
      parameters:
        - name: work_id
          in: path
          required: true
          schema:
            type: string
            pattern: "^wrk-[0-9]+$"
      responses:
        "200":
          description: Work found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Work"
        "404":
          description: Work not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Problem"
components:
  schemas:
    Work:
      type: object
      required: [id, title, type]
      properties:
        id:
          type: string
        title:
          type: string
        type:
          type: string
          enum: [painting, sculpture, photograph]
        author:
          type: [string, "null"]
        year:
          type: [integer, "null"]
    WorkCollection:
      type: object
      required: [items, total]
      properties:
        items:
          type: array
          items:
            $ref: "#/components/schemas/Work"
        total:
          type: integer
          minimum: 0
    Problem:
      type: object
      required: [code, message]
      properties:
        code:
          type: string
        message:
          type: string

Para ordenar tu razonamiento

  1. Localiza la URL base, la ruta, el método y los parámetros disponibles.
  2. Distingue qué parámetros son opcionales y qué límites tienen.
  3. Describe una respuesta satisfactoria y un error siguiendo los schemas referenciados.

Trabajo en el workspace

  1. Identifica servidor, rutas, métodos y finalidad de cada operationId.
  2. Enumera los parámetros, su ubicación, tipo, obligatoriedad y restricciones visibles.
  3. Construye una petición válida para cada operación sin ejecutarla.
  4. Describe la forma de una respuesta satisfactoria y de dos respuestas de error.
  5. Señala una decisión que el contrato deja sin aclarar y formula una pregunta para el proveedor.

Entrega esperada

  • Cuestionario respondido con referencias a rutas, parámetros, responses y components.
  • Dos peticiones HTTP completas que respeten el contrato.
  • Descripción de una respuesta satisfactoria y dos errores.

Escribe lo que piensas. Se guarda automáticamente en este navegador.

Sin respuesta guardada.

Pistas opcionales

Pista 1 · Recorre el contrato en capas
  • Empieza por servers y paths; después baja a cada método, parameters y responses.
  • Deja components para cuando encuentres una referencia.
Pista 2 · Separa descripción y restricción
  • Una descripción explica intención; type, enum, minimum y required restringen valores.
Profundización opcional

Deducir entradas, salidas, obligatoriedad y errores directamente desde un documento OpenAPI 3.1.

Contexto adicional

  • El contrato contiene una consulta de colección y una consulta individual.
  • No se pide implementar un cliente ni memorizar toda la especificación OpenAPI.
  • Cada afirmación debe señalar el elemento del contrato que la respalda.

Cómo revisar tu respuesta

  • Los parámetros de path y query no se intercambian.
  • La obligatoriedad se obtiene de required y no de la intuición.
  • Las referencias $ref se siguen hasta el schema correspondiente.
  • La lectura funciona sin depender de Swagger UI.

Evidencia, revisión y reinicio

  • Lectura razonada guardada localmente en el navegador.
  • Cuestionario de contrato completado si se usa el material opcional.

Revisión: con Codex, utilizando la evidencia y los criterios anteriores; no se publica una solución oficial.

Reinicio: Borrar la respuesta desde la tarjeta y descargar otra copia del contrato y cuestionario originales.

Material descargable opcional

EX-B1-06

Seguro, idempotente o ninguna de las dos

  • Tipo test
  • Clasificación
  • Básica

Tras varios timeouts, un cliente reintenta todas sus peticiones por igual. Debes revisar si la semántica declarada por cada operación permite hacerlo.

Pensar y responder en la web

Predice y guarda aquí tu razonamiento antes de abrir el material; después contrástalo en el workspace.

Pregunta central

Si la primera respuesta se pierde y el cliente repite exactamente la petición, ¿qué operaciones son seguras, idempotentes o arriesgadas de reintentar?

Información que necesitas

1. GET /reservations/{reservation_id} — consulta una reserva y registra métricas de lectura.
2. HEAD /rooms/{room_id}/availability — devuelve únicamente cabeceras.
3. POST /charges — crea un cargo nuevo por cada petición aceptada.
4. PUT /users/{user_id}/preferences — sustituye todas las preferencias por el body.
5. DELETE /subscriptions/{subscription_id} — elimina la suscripción si existe.
6. PATCH /orders/{order_id} — incrementa `delivery_attempts` en 1.
7. POST /webhooks/deliveries — registra la entrega; `delivery_key` evita duplicados.

Para ordenar tu razonamiento

  1. Clasifica las siete operaciones en segura/no segura e idempotente/no idempotente.
  2. Compara el estado tras una ejecución con el estado tras dos peticiones iguales.
  3. Elige el caso más engañoso y explica la confusión habitual.

Trabajo en el workspace

  1. Clasifica cada operación como segura o no segura.
  2. Clasifica cada operación como idempotente o no idempotente según la descripción.
  3. Predice el estado observable después de repetir dos veces una petición idéntica.
  4. Propón una decisión de reintento tras timeout: automático, condicionado o manual.
  5. Identifica el dato adicional que podría cambiar la clasificación de la operación de webhooks.

Entrega esperada

  • Tabla completa de las siete operaciones.
  • Justificación breve de los dos casos que consideres más propensos a confusión.

Selecciona tus respuestas

Cada elección se guarda automáticamente en este navegador.

1. 1. GET /reservations/{reservation_id} consulta y registra métricas de lectura.
2. 2. HEAD /rooms/{room_id}/availability devuelve únicamente cabeceras.
3. 3. POST /charges crea un cargo por cada petición aceptada.
4. 4. PUT /users/{user_id}/preferences sustituye todas las preferencias.
5. 5. DELETE /subscriptions/{subscription_id} elimina la suscripción si existe.
6. 6. PATCH /orders/{order_id} añade 1 al contador de intentos de entrega.
7. 7. POST /webhooks/deliveries registra `delivery_key` como clave única.

Sin respuesta guardada.

Pistas opcionales

Pista única · Compara el estado final
  • Para idempotencia, compara el estado relevante tras una ejecución con el estado tras varias peticiones idénticas.
Profundización opcional

Clasificar operaciones HTTP por seguridad e idempotencia y predecir el riesgo de repetirlas cuando la primera respuesta se pierde.

Contexto adicional

  • Clasifica la operación por su comportamiento prometido, no solo por el nombre del método.
  • Diferencia que una operación sea idempotente de que siempre tenga éxito o carezca de efectos secundarios.

Cómo revisar tu respuesta

  • Seguro e idempotente se evalúan como propiedades distintas.
  • Registrar métricas no invalida automáticamente la intención segura de una lectura.
  • La idempotencia no se confunde con obtener la misma representación o el mismo código en cada intento.
  • Los reintentos consideran el efecto de una primera ejecución cuya respuesta se perdió.

Evidencia, revisión y reinicio

  • Clasificaciones guardadas localmente en el navegador.
  • Justificación del efecto de repetición si se completa la tabla opcional.

Revisión: con Codex, utilizando la evidencia y los criterios anteriores; no se publica una solución oficial.

Reinicio: Borrar las selecciones desde la tarjeta y volver a descargar la tabla de operaciones original.

Material descargable opcional

EX-B1-07

Dónde se consume la latencia

  • Respuesta redactada
  • Diagnóstico de rendimiento
  • Inicial

Un `GET /v1/records/REC-204` tarda unos 306 ms. Soporte adjunta los tiempos acumulados de `curl`, el `X-Request-ID` de la respuesta y el log estructurado producido por la misma ejecución.

Pensar y responder en la web

Predice y guarda aquí tu razonamiento antes de abrir el material; después contrástalo en el workspace.

Pregunta central

¿Qué tramo explica la mayor parte de la latencia observada y qué evidencia permite atribuirlo al servidor o a la red?

Información que necesitas

$ curl --silent --output response.json --dump-header response.headers \
  --write-out 'dns=%{time_namelookup} connect=%{time_connect} first_byte=%{time_starttransfer} total=%{time_total} status=%{http_code}\n' \
  'https://records.internal.example/v1/records/REC-204'
dns=0.018 connect=0.061 first_byte=0.302 total=0.306 status=200

$ grep -i x-request-id response.headers
X-Request-ID: req-7ac2

{"event":"request.complete","request_id":"req-7ac2","method":"GET","route":"/v1/records/{record_id}","status":200,"duration_ms":217,"db_ms":182,"serialize_ms":4}

Para ordenar tu razonamiento

  1. Calcula cada tramo restando los tiempos acumulados de `curl`.
  2. Usa `req-7ac2` para demostrar que el log pertenece a la misma petición.
  3. Compara `duration_ms` con `db_ms` y decide qué investigar después.

Trabajo en el workspace

  1. Calcula DNS, establecimiento de conexión, intervalo desde conexión hasta primer byte y transferencia del body.
  2. Correlaciona la medición del cliente con el log mediante `X-Request-ID`.
  3. Compara la duración total del servidor con el tiempo hasta el primer byte.
  4. Redacta un hallazgo principal y una única comprobación siguiente que pueda confirmar la causa.

Entrega esperada

  • Cuatro tramos calculados en milisegundos.
  • Nota de incidente de hasta cinco frases con hallazgo, evidencia y siguiente comprobación.

Escribe lo que piensas. Se guarda automáticamente en este navegador.

Sin respuesta guardada.

Pistas opcionales

Pista 1 · Los hitos son acumulados
  • La conexión adicional es `time_connect - time_namelookup`, no 61 + 18.
Pista 2 · Une ambas fuentes
  • El mismo request ID aparece en la respuesta guardada y en el log estructurado.
Profundización opcional

Separar DNS, conexión, espera hasta el primer byte, transferencia y trabajo del servidor para elegir el siguiente punto de investigación.

Contexto adicional

  • Los tiempos de `curl` son acumulados desde el comienzo; calcula un tramo restando el hito anterior.
  • `time_starttransfer` incluye conexión, envío, trabajo del servidor y viaje del primer byte.
  • No atribuyas automáticamente todo el tiempo restante a la red: compáralo con `duration_ms`.

Cómo revisar tu respuesta

  • Los tiempos acumulados no se suman entre sí.
  • DNS se calcula como 18 ms, conexión adicional como 43 ms y transferencia como 4 ms.
  • El log se vincula por `req-7ac2`, no solo porque la ruta coincide.
  • Los 182 ms de base de datos se reconocen como el componente medido dominante dentro de los 217 ms del servidor.
  • La conclusión distingue medición de hipótesis y propone inspeccionar la consulta o su plan antes de optimizar otra capa.

Evidencia, revisión y reinicio

  • Diagnóstico de latencia guardado localmente en el navegador.
  • Cálculos de tramos y evidencia de correlación.

Revisión: con Codex, utilizando la evidencia y los criterios anteriores; no se publica una solución oficial.

Reinicio: Borrar la respuesta desde la tarjeta y volver a descargar la evidencia y la plantilla originales.

Material descargable opcional

EX-B1-08

Elegir async desde un perfil real

  • Respuesta redactada
  • Revisión técnica
  • Básica

Antes de cambiar tres endpoints a `async def`, el equipo ha medido cuánto tiempo consume cada uno en CPU y cuánto espera a sistemas externos. Solo hay un worker de proceso durante la prueba.

Pensar y responder en la web

Predice y guarda aquí tu razonamiento antes de abrir el material; después contrástalo en el workspace.

Pregunta central

¿Qué endpoints son candidatos razonables para I/O asíncrono y cuál no debe ejecutar su trabajo de CPU directamente en el event loop?

Información que necesitas

Profile window: 100 local requests, median per request, one process worker

GET /shipping-quotes
cpu_ms=7 upstream_wait_ms=418 file_wait_ms=0

POST /reports/monthly
cpu_ms=870 file_wait_ms=34 upstream_wait_ms=0

POST /imports
cpu_ms=312 upload_read_wait_ms=48 webhook_wait_ms=195

Constraints
- The shipping provider and webhook clients expose non-blocking APIs.
- PDF generation is a synchronous CPU-bound function.
- No extra process or background job system is active in this measurement.

Para ordenar tu razonamiento

  1. Identifica la fase dominante de cada endpoint.
  2. Recomienda `async`, mantener código síncrono o separar trabajo, citando la medición.
  3. Explica qué mejora esperas concurrentes y qué requeriría paralelismo u otro diseño.

Trabajo en el workspace

  1. Clasifica el cuello dominante de cada endpoint como espera externa, CPU o carga mixta.
  2. Escribe una recomendación de una o dos frases por endpoint vinculada a los milisegundos medidos.
  3. Señala qué llamada debe ser realmente no bloqueante para que `async` aporte concurrencia.
  4. Explica por qué convertir el generador de PDF a `async def` no reduce sus 870 ms de CPU.

Entrega esperada

  • Tres recomendaciones breves, una por endpoint.
  • Una conclusión que distinga concurrencia de paralelismo y proponga la siguiente medición.

Escribe lo que piensas. Se guarda automáticamente en este navegador.

Sin respuesta guardada.

Pistas opcionales

Pista 1 · Compara magnitudes
  • 418 frente a 7 describe un perfil muy distinto de 870 frente a 34.
Pista 2 · Async necesita I/O no bloqueante
  • Una función `async def` que llama a una librería bloqueante sigue bloqueando el event loop.
Pista 3 · Separa CPU
  • La concurrencia permite aprovechar esperas; acelerar cálculo activo exige paralelismo, optimización o sacar el trabajo de la request.
Profundización opcional

Usar mediciones para decidir dónde `async` puede mejorar concurrencia, dónde no acelera el trabajo y qué riesgo evitar en el event loop.

Contexto adicional

  • Las medidas son medianas de 100 peticiones locales y no demuestran por sí solas la capacidad máxima.
  • El cliente HTTP del proveedor y el cliente del webhook disponen de API no bloqueante.
  • El generador de PDF es una función síncrona que mantiene ocupada la CPU mientras trabaja.

Cómo revisar tu respuesta

  • `GET /shipping-quotes` se identifica como candidato claro a I/O asíncrono por sus 418 ms de espera frente a 7 ms de CPU.
  • `POST /reports/monthly` no se recomienda como conversión directa a `async def`; sus 870 ms de CPU bloquearían el event loop.
  • `POST /imports` se trata como carga mixta: el webhook puede ceder, pero los 312 ms de parseo siguen consumiendo CPU.
  • La conclusión no promete una mejora exacta sin una prueba de carga posterior.

Evidencia, revisión y reinicio

  • Revisión técnica guardada localmente en el navegador.
  • Recomendaciones vinculadas a mediciones del perfil.

Revisión: con Codex, utilizando la evidencia y los criterios anteriores; no se publica una solución oficial.

Reinicio: Borrar la respuesta desde la tarjeta y volver a descargar el perfil sin anotaciones.

Material descargable opcional

EX-B1-09

Cambio compatible o ruptura

  • Respuesta redactada
  • Revisión de contrato
  • Básica

Un proveedor propone una versión nueva de su contrato y afirma que ningún consumidor deberá cambiar. Debes revisar el diff antes de aprobarlo.

Pensar y responder en la web

Predice y guarda aquí tu razonamiento antes de abrir el material; después contrástalo en el workspace.

Pregunta central

¿Qué cambios puede aceptar un consumidor existente sin modificarse y cuáles rompen peticiones o respuestas que antes eran válidas?

Diff OpenAPI

--- ex-b1-09-openapi-v1.yaml
+++ ex-b1-09-openapi-v1.1.yaml
@@ -1,29 +1,30 @@
 openapi: 3.1.0
 info:
   title: Records API
-  version: 1.0.0
+  version: 1.1.0
 paths:
-  /records/{record_id}:
+  /record/{id}:
     get:
       summary: Get a record
-      description: Returns one record.
+      description: Returns one record. Rate limiting may apply.
       operationId: getRecord
       parameters:
-        - name: record_id
+        - name: id
           in: path
           required: true
           schema:
-            type: integer
-            minimum: 1
+            type: string
       responses:
         "200":
-          description: Record found
+          description: Record found or absent
           content:
             application/json:
               schema:
-                $ref: "#/components/schemas/Record"
-        "404":
-          description: Record not found
+                oneOf:
+                  - $ref: "#/components/schemas/Record"
+                  - type: "null"
+        "429":
+          description: Too many requests
           content:
             application/json:
               schema:
                 $ref: "#/components/schemas/Problem"
@@ -32,12 +33,17 @@ components:
   schemas:
     Record:
       type: object
-      required: [id, title]
+      required: [id, title, owner_id]
       properties:
         id:
-          type: integer
+          type: string
         title:
           type: string
+        owner_id:
+          type: string
+        archived_at:
+          type: [string, "null"]
+          format: date-time
     Problem:
       type: object
       required: [code, message]

Para ordenar tu razonamiento

  1. Clasifica cada cambio como compatible, dudoso o ruptura.
  2. Explica qué consumidor se vería afectado en los dos cambios de mayor impacto.
  3. Propón una transición breve para una ruptura confirmada.

Trabajo en el workspace

  1. Clasifica cada cambio como compatible, potencialmente incompatible o ruptura clara.
  2. Identifica qué tipo de consumidor puede resultar afectado y por qué.
  3. Separa cambios de documentación de cambios en comportamiento observable.
  4. Propón una transición proporcional para cada ruptura confirmada.
  5. Ordena los hallazgos por impacto y confianza.

Entrega esperada

  • Informe de compatibilidad línea por línea.
  • Resumen ejecutivo con riesgos y transición recomendada.

Escribe lo que piensas. Se guarda automáticamente en este navegador.

Sin respuesta guardada.

Pistas opcionales

Pista única · Piensa como un consumidor existente
  • Imagina una petición válida ayer y una respuesta que el cliente sabía interpretar ayer. Comprueba ambas contra el contrato propuesto.
Profundización opcional

Identificar cambios compatibles y rupturas en rutas, nombres, tipos, campos requeridos y respuestas.

Contexto adicional

  • Considera clientes que generan código desde OpenAPI y clientes que interpretan respuestas manualmente.
  • No todo cambio visible rompe necesariamente el contrato; explica quién podría verse afectado.

Cómo revisar tu respuesta

  • Se revisan rutas, parámetros, tipos, required y códigos de respuesta.
  • Añadir información opcional no se trata igual que exigir un campo nuevo.
  • El impacto se relaciona con consumidores concretos.
  • Las transiciones evitan mantener versiones paralelas sin necesidad demostrada.

Evidencia, revisión y reinicio

  • Revisión razonada guardada localmente en el navegador.
  • Informe de compatibilidad y transición si se utiliza la plantilla opcional.

Revisión: con Codex, utilizando la evidencia y los criterios anteriores; no se publica una solución oficial.

Reinicio: Borrar la respuesta desde la tarjeta y volver a descargar el diff y el informe vacíos.

Material descargable opcional

Series

Prácticas extendidas y opcionales. Cada serie conserva una base común y una parte utiliza el resultado de la anterior.

EX-B1-S01

Soporte de una API desconocida

  • Práctica extendida
  • Caso profesional
  • Básica
  • Apoyo de alto a ligero
  • M-HTTP

Una aplicación móvil dejó de crear expedientes tras una actualización del proveedor. El mismo ticket, tráfico capturado y documento OpenAPI acotado se conservan durante las tres partes.

Abrir práctica extendida: base común y 3 partes

Base común

  • El cliente informa de que la red funciona y otras operaciones contra el mismo host responden.
  • La captura contiene una petición completa y una respuesta HTTP.
  • El contrato declara un media type específico para la creación.
  • Cada conclusión debe enlazarse con una evidencia del paquete.

Paquete de trabajo

Entorno, evidencia y reinicio

Entorno: Paquete descargable trabajado en un directorio separado del repositorio.

  • Cuaderno de la serie con hechos, hipótesis y decisiones.
  • Comando de reproducción, diagnóstico y propuesta contractual.

Revisión: con Codex, utilizando los artefactos y criterios de cada parte; no se publica una solución oficial.

Reinicio: Crear un directorio de trabajo nuevo y volver a descargar el ticket, el contrato y el cuaderno originales.

Parte 1 · Apoyo alto

EX-B1-S01-01 · Preparar la reproducción mínima

Convertir el tráfico capturado en una reproducción mínima que otro equipo pueda ejecutar sin reinterpretar el ticket.

Qué debes hacer
  1. Escribe un comando `curl` con el método, URL, `Content-Type`, `Accept` y body observados.
  2. Mantén el media type defectuoso: esta parte reproduce el incidente, todavía no lo corrige.
  3. Resume en tres líneas el resultado esperado por el cliente, el status observado y el request ID.
  4. No incluyas el token redactado ni inventes credenciales.
Entrega esperada
  • Comando de reproducción.
  • Resumen esperado/observado con request ID.
Criterios de aceptación
  • El comando reproduce `POST /v2/cases` con `application/json` y el JSON capturado.
  • La salida esperada del comando sigue siendo `415`; no se adelanta la solución.
  • `mob-91c7` vincula request y response y no se inventan credenciales.
Evidencia para revisión
  • Comando `curl` que reproduce el fallo observado.
  • Resumen de esperado, observado y evidencia de correlación.

Reinicio de esta parte: Reiniciar desde una copia nueva del paquete y conservar el resultado como checkpoint independiente.

Pista 1 · Reproduce antes de corregir
  • El comando debe representar lo que hizo el cliente, aunque ya veas una posible corrección.
Pista 2 · Conserva lo necesario
  • Método, URL, media types y body bastan para esta reproducción; el token redactado no es reutilizable.

Parte 2 · Apoyo moderado

EX-B1-S01-02 · Clasificar el fallo

Determinar si el problema pertenece al transporte, HTTP, JSON o contrato y descartar causas plausibles.

Qué debes hacer
  1. Formula una hipótesis principal y al menos dos alternativas.
  2. Comprueba cada hipótesis contra ticket, tráfico y OpenAPI.
  3. Clasifica la capa en la que aparece la discrepancia.
  4. Explica por qué dos causas plausibles no encajan con la evidencia.
Entrega esperada
  • Diagnóstico principal con nivel de confianza.
  • Dos descartes razonados.
Criterios de aceptación
  • El diagnóstico diferencia que HTTP haya respondido de que la operación haya sido aceptada.
  • La validez sintáctica del JSON se evalúa aparte de su conformidad contractual.
  • Los descartes utilizan evidencia y no intuiciones sobre frameworks.
Evidencia para revisión
  • Diagnóstico principal con nivel de confianza.
  • Dos hipótesis descartadas mediante evidencia.

Reinicio de esta parte: Volver al checkpoint de la parte 1 o reconstruirlo desde una copia limpia del paquete.

Pista · Compara observado y prometido
  • Busca la primera diferencia verificable entre el mensaje capturado y la operación descrita en OpenAPI.

Parte 3 · Apoyo ligero

EX-B1-S01-03 · Proponer el contrato corregido

Rediseñar el comportamiento observable y explicar una transición compatible.

Qué debes hacer
  1. Decide si debe cambiar el cliente, el contrato, el servidor o una combinación.
  2. Describe el comportamiento corregido para éxito y error.
  3. Propón una transición que contemple consumidores existentes.
  4. Define criterios que permitirían verificar el cambio sin conocer la implementación.
Entrega esperada
  • Contrato corregido a nivel de diseño.
  • Nota de compatibilidad y transición.
  • Criterios observables de verificación.
Criterios de aceptación
  • La propuesta corrige la discrepancia diagnosticada.
  • La transición identifica al consumidor afectado.
  • Los criterios pueden comprobarse mediante mensajes HTTP.
Evidencia para revisión
  • Contrato corregido a nivel de diseño.
  • Nota de compatibilidad y criterios observables de verificación.

Reinicio de esta parte: Volver al checkpoint de la parte 2 y trabajar sobre una copia nueva del documento OpenAPI acotado.

Pista · Cambia lo mínimo necesario
  • No rediseñes toda la API si una frontera concreta explica el incidente.

EX-B1-S02

Contrato de consulta de datos públicos

  • Práctica extendida
  • Diseño
  • Básica
  • Apoyo de moderado a ligero
  • M-HTTP

Un equipo de análisis quiere consultar indicadores municipales desde una API interna. Solo existe una pequeña muestra tabular y varias restricciones de consumo.

Abrir práctica extendida: base común y 3 partes

Base común

  • La muestra contiene municipios, periodos e indicadores con unidades diferentes.
  • Los consumidores necesitan consultas filtradas y una exportación.
  • La colección debe paginarse y rechazar límites desproporcionados.
  • No se consumirá todavía una API pública ni se implementará FastAPI.

Paquete de trabajo

Entorno, evidencia y reinicio

Entorno: Dataset y plantillas descargables trabajados en un directorio separado del repositorio.

  • Inventario de recursos y representaciones.
  • Tabla de operaciones y documento OpenAPI acotado y autocontenido.

Revisión: con Codex, utilizando los artefactos y criterios de cada parte; no se publica una solución oficial.

Reinicio: Crear un directorio nuevo y volver a descargar la muestra, el brief y la plantilla OpenAPI originales.

Parte 1 · Apoyo moderado

EX-B1-S02-01 · Del dato al recurso

Identificar recursos, representaciones e identificadores a partir de la muestra.

Qué debes hacer
  1. Distingue entidades con identidad de valores observados y catálogos.
  2. Propón una representación JSON para una observación y otra para una colección.
  3. Registra cómo representarás un valor ausente sin inventarlo.
  4. Describe dos relaciones entre los recursos propuestos.
Entrega esperada
  • Inventario de recursos e identificadores.
  • Dos representaciones JSON conceptuales.
Criterios de aceptación
  • La interfaz no se modela como una lista de verbos.
  • Municipio, indicador, periodo, valor y unidad no se confunden.
  • El valor ausente conserva su significado.
Evidencia para revisión
  • Inventario de recursos e identificadores.
  • Dos representaciones JSON conceptuales.

Reinicio de esta parte: Reiniciar desde copias nuevas del dataset y del brief y conservar el resultado como checkpoint.

Pista · Busca identidad y estabilidad
  • Un nombre visible puede cambiar; revisa qué códigos de la muestra pueden funcionar como identificadores.

Parte 2 · Apoyo moderado

EX-B1-S02-02 · Rutas, filtros y errores

Diseñar operaciones de consulta y exportación sobre el modelo de recursos anterior.

Qué debes hacer
  1. Define rutas y métodos para consultar colecciones y elementos.
  2. Asigna filtros a path o query y justifica la elección.
  3. Diseña paginación y un límite máximo observable.
  4. Selecciona estados para recurso ausente, filtro inválido y solicitud demasiado amplia.
  5. Decide cómo expresar la exportación sin introducir procesamiento asíncrono implementado.
Entrega esperada
  • Tabla de operaciones y parámetros.
  • Matriz de estados y condiciones.
Criterios de aceptación
  • Los filtros opcionales no se convierten arbitrariamente en segmentos de ruta.
  • La paginación tiene comportamiento y límites explícitos.
  • Los errores permiten al consumidor corregir la petición.
Evidencia para revisión
  • Tabla de operaciones y parámetros.
  • Matriz de estados y condiciones.

Reinicio de esta parte: Volver al checkpoint de la parte 1 o reconstruirlo desde una copia limpia de los materiales.

Pista · La ruta identifica; la query modifica la consulta
  • Utiliza esta regla como punto de partida y registra cualquier excepción.

Parte 3 · Apoyo ligero

EX-B1-S02-03 · Esqueleto de contrato OpenAPI

Trasladar el diseño a un contrato que un consumidor pueda leer y convertir en casos de prueba.

Qué debes hacer
  1. Completa paths, parameters y responses del esqueleto proporcionado.
  2. Define schemas reutilizables para observación, colección paginada y error.
  3. Incluye ejemplos mínimos coherentes con la muestra.
  4. Revisa required, tipos, formatos y referencias.
Entrega esperada
  • Documento OpenAPI legible, autocontenido y estructuralmente válido.
  • Tres casos de prueba descritos en lenguaje natural a partir del contrato.
Criterios de aceptación
  • Un consumidor puede formular una petición válida sin información externa.
  • Las respuestas satisfactoria y de error tienen schemas identificables.
  • Los ejemplos no contradicen tipos ni campos requeridos.
Evidencia para revisión
  • Documento OpenAPI legible, autocontenido y estructuralmente válido.
  • Tres casos de prueba descritos a partir del contrato.

Reinicio de esta parte: Volver al checkpoint de la parte 2 y descargar una plantilla OpenAPI sin completar.

Pista · Contrato antes que decoración
  • Prioriza operaciones, parámetros, schemas y respuestas; no necesitas completar todos los campos opcionales de OpenAPI.

Caso profesional extenso

CASE-B1 · Práctica extendida

¿Está lista esta integración?

Una organización quiere intercambiar expedientes con un proveedor, pero requisitos, tráfico y OpenAPI no describen el mismo comportamiento. Debes identificar los bloqueos que impiden empezar y proponer el contrato mínimo que permitiría una prueba de integración.